ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCBlNmQ5ZWJmLi5kMDg5MGZlIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC00Nyw2ICs0NywxOSBAQAogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeW1ib2xzL3N5c3RlbS9saWIvbGlibWVkaWFfbmF0aXZlLnNvKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJtZWRpYV9uYXRpdmUuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb2ZsaW5nZXJfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9mbGluZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3kuc28pCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi9saWJhdWRpb3BvbGljeS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TSEFSRURfTElCUkFSSUVTL2xpYmF1ZGlvcG9saWN5c2VydmljZV9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5c2VydmljZS5zbykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3ltYW5hZ2VyLnNvKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGliYXVkaW9wb2xpY3lzZXJ2aWNlX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJtZWRpYXRlcykKKwogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQubWsgYi9jYW1lcmEvQW5kcm9pZC5tawppbmRleCA1Y2VkYWIwLi5kYTVhYzU5IDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5taworKysgYi9jYW1lcmEvQW5kcm9pZC5tawpAQCAtMSwzICsxLDE3IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKIENBTUVSQV9DTElFTlRfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOCw2ICsyMiw3IEBACiAJQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhTWV0YWRhdGEuY3BwIFwKIAlDYW1lcmFQYXJhbWV0ZXJzLmNwcCBcCisJQ2FwdHVyZVJlc3VsdC5jcHAgXAogCUNhbWVyYVBhcmFtZXRlcnMyLmNwcCBcCiAJSUNhbWVyYS5jcHAgXAogCUlDYW1lcmFDbGllbnQuY3BwIFwKQEAgLTIyLDYgKzM3LDggQEAKIAljYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCBcCiAJUHJvQ2FtZXJhLmNwcCBcCiAJQ2FtZXJhQmFzZS5jcHAgXAorCUNhbWVyYVV0aWxzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTM1LDYgKzUyLDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCiAKIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYV9jbGllbnQKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCAyMjE5OWZhLi44NWY0NGYwIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtNzcsNiArNzcsMzIgQEAKICAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQpOwogfQogCitzdGF0dXNfdCBDYW1lcmE6OmNvbm5lY3RMZWdhY3koaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBzcDxDYW1lcmE+JiBjYW1lcmEpCit7CisgICAgQUxPR1YoIiVzOiBjb25uZWN0IGxlZ2FjeSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKGNhbWVyYUlkKTsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjbCA9IGM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IENhbWVyYUJhc2VUOjpnZXRDYW1lcmFTZXJ2aWNlKCk7CisKKyAgICBpZiAoY3MgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqL2MtPm1DYW1lcmEpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LICYmIGMtPm1DYW1lcmEgIT0gMCkgeworICAgICAgICBjLT5tQ2FtZXJhLT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChjKTsKKyAgICAgICAgYy0+bVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICBjYW1lcmEgPSBjOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGNhbWVyYTogJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIGMuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdHVzX3QgQ2FtZXJhOjpyZWNvbm5lY3QoKQogewogICAgIEFMT0dWKCJyZWNvbm5lY3QiKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcCBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAppbmRleCA1NTM3NmIwLi4wNDY5NGNkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgICAgIGdDYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDYW0sIHR5cGVuYW1lIFRDYW1UcmFpdHM+Ci12b2lkIENhbWVyYUJhc2U8VENhbSwgVENhbVRyYWl0cz46OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBDYW1lcmFCYXNlPFRDYW0sIFRDYW1UcmFpdHM+OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CiAgICAgQUxPR1coIm1lZGlhc2VydmVyJ3MgcmVtb3RlIGJpbmRlciBDYW1lcmEgb2JqZWN0IGRpZWQiKTsKICAgICBub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsIC8qZXh0MiovMCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA3NzY1OTE0Li4wNDM0MzdmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI1LDYgKzI1LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisjZGVmaW5lIEFMSUdOX1RPKHZhbCwgYWxpZ25tZW50KSBcCisgICAgKCgodWludHB0cl90KSh2YWwpICsgKChhbGlnbm1lbnQpIC0gMSkpICYgfigoYWxpZ25tZW50KSAtIDEpKQorCiB0eXBlZGVmIFBhcmNlbDo6V3JpdGFibGVCbG9iIFdyaXRhYmxlQmxvYjsKIHR5cGVkZWYgUGFyY2VsOjpSZWFkYWJsZUJsb2IgUmVhZGFibGVCbG9iOwogCkBAIC0yNzAsNyArMjczLDggQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1R5cGUodGFnLCBUWVBFX0JZVEUpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KLSAgICByZXR1cm4gdXBkYXRlSW1wbCh0YWcsIChjb25zdCB2b2lkKilzdHJpbmcuc3RyaW5nKCksIHN0cmluZy5zaXplKCkpOworICAgIC8vIHN0cmluZy5zaXplKCkgZG9lc24ndCBjb3VudCB0aGUgbnVsbCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuCisgICAgcmV0dXJuIHVwZGF0ZUltcGwodGFnLCAoY29uc3Qgdm9pZCopc3RyaW5nLnN0cmluZygpLCBzdHJpbmcuc2l6ZSgpICsgMSk7CiB9CiAKIHN0YXR1c190IENhbWVyYU1ldGFkYXRhOjp1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTQzMSw0MCArNDM1LDcwIEBACiAgICAgICAgICpvdXQgPSBOVUxMOwogICAgIH0KIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQotICAgIGludDMyX3QgbWV0YWRhdGFTaXplVG1wID0gLTE7Ci0gICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmbWV0YWRhdGFTaXplVG1wKSkgIT0gT0spIHsKKyAgICAvLyBTZWUgQ2FtZXJhTWV0YWRhdGE6OndyaXRlVG9QYXJjZWwgZm9yIHBhcmNlbCBkYXRhIGxheW91dCBkaWFncmFtIGFuZCBleHBsYW5hdGlvbi4KKyAgICAvLyBhcmcwID0gYmxvYlNpemUgKGludDMyKQorICAgIGludDMyX3QgYmxvYlNpemVUbXAgPSAtMTsKKyAgICBpZiAoKGVyciA9IGRhdGEucmVhZEludDMyKCZibG9iU2l6ZVRtcCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgc2l6ZSAoZXJyb3IgJWQgJXMpIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IG1ldGFkYXRhU2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4obWV0YWRhdGFTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYmxvYlNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2JTaXplVG1wKTsKKyAgICBjb25zdCBzaXplX3QgYWxpZ25tZW50ID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9hbGlnbm1lbnQoKTsKIAotICAgIGlmIChtZXRhZGF0YVNpemUgPT0gMCkgeworICAgIC8vIFNwZWNpYWwgY2FzZTogemVybyBibG9iIHNpemUgbWVhbnMgemVybyBzaXplZCAoTlVMTCkgbWV0YWRhdGEuCisgICAgaWYgKGJsb2JTaXplID09IDApIHsKICAgICAgICAgQUxPR1YoIiVzOiBSZWFkIDAtc2l6ZWQgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gTk9URTogdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gbWUuIHNob3VsZG50IHRoZSBibG9iCisgICAgaWYgKGJsb2JTaXplIDw9IGFsaWdubWVudCkgeworICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIGJsb2IgaXMgbWFsZm9ybWVkLCBibG9iU2l6ZSglenUpIHNob3VsZCBiZSBsYXJnZXIgdGhhbiBhbGlnbm1lbnQoJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgYWxpZ25tZW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbWV0YWRhdGFTaXplID0gYmxvYlNpemUgLSBhbGlnbm1lbnQ7CisKKyAgICAvLyBOT1RFOiB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBtZS4gc2hvdWxkbid0IHRoZSBibG9iCiAgICAgLy8ga25vdyBob3cgYmlnIGl0IGlzPyB3aHkgZG8gd2UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBzaXplCiAgICAgLy8gdG8gUGFyY2VsOjpyZWFkQmxvYiA/Ci0KICAgICBSZWFkYWJsZUJsb2IgYmxvYjsKICAgICAvLyBhcmcxID0gbWV0YWRhdGEgKGJsb2IpCiAgICAgZG8gewotICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IobWV0YWRhdGFTaXplLCAmYmxvYikpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGJsb2IgKHNpemVkICVkKS4gUG9zc2libGUgIgorICAgICAgICBpZiAoKGVyciA9IGRhdGEucmVhZEJsb2IoYmxvYlNpemUsICZibG9iKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgYmxvYiAoc2l6ZWQgJXp1KS4gUG9zc2libGUgIgogICAgICAgICAgICAgICAgICAgIiBzZXJpYWxpemF0aW9uIGJ1Zy4gRXJyb3IgJWQgJXMiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZXRhZGF0YVNpemUsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iU2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KGJsb2IuZGF0YSgpKTsKIAorICAgICAgICAvLyBhcmcyID0gb2Zmc2V0IChibG9iKQorICAgICAgICAvLyBNdXN0IGJlIGFmdGVyIGJsb2Igc2luY2Ugd2UgZG9uJ3Qga25vdyBvZmZzZXQgdW50aWwgYWZ0ZXIgd3JpdGVCbG9iLgorICAgICAgICBpbnQzMl90IG9mZnNldFRtcDsKKyAgICAgICAgaWYgKChlcnIgPSBkYXRhLnJlYWRJbnQzMigmb2Zmc2V0VG1wKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgb2Zmc2V0VG1wIChlcnJvciAlZCAlcykiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldFRtcCk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gYWxpZ25tZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG1ldGFkYXRhIG9mZnNldCglenUpIHNob3VsZCBiZSBsZXNzIHRoYW4gYWxpZ25tZW50KCV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJsb2JTaXplLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihibG9iLmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4obWV0YWRhdGFTdGFydCk7CisgICAgICAgIEFMT0dWKCIlczogYWxpZ25tZW50IGlzOiAlenUsIG1ldGFkYXRhIHN0YXJ0OiAlcCwgb2Zmc2V0OiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYWxpZ25tZW50LCB0bXAsIG9mZnNldCk7CiAgICAgICAgIG1ldGFkYXRhID0gYWxsb2NhdGVfY29weV9jYW1lcmFfbWV0YWRhdGFfY2hlY2tlZCh0bXAsIG1ldGFkYXRhU2l6ZSk7CiAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSBjb25zaWRlciB0aGF0IGFsbG9jYXRpb24gb25seSBmYWlscyBpZiB0aGUgdmFsaWRhdGlvbgogICAgICAgICAgICAgLy8gYWxzbyBmYWlsZWQsIHRoZXJlZm9yZSB0aGUgcmVhZEZyb21QYXJjZWwgd2FzIGEgZmFpbHVyZS4KKyAgICAgICAgICAgIEFMT0dFKCIlczogbWV0YWRhdGEgYWxsb2NhdGlvbiBhbmQgY29weSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSB3aGlsZSgwKTsKQEAgLTQ4NSwzOCArNTE5LDgwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIC8vIGFyZzAgPSBtZXRhZGF0YVNpemUgKGludDMyKQorICAgIC8qKgorICAgICAqIEJlbG93IGlzIHRoZSBjYW1lcmEgbWV0YWRhdGEgcGFyY2VsIGxheW91dDoKKyAgICAgKgorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICAgIGFyZzA6IGJsb2JTaXplICAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAgICAgICAgKGxlbmd0aCA9IDQpICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS1Ta2lwIHRoZSByZXN0IGlmIGJsb2JTaXplID09IDAuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICBhcmcxOiBibG9iICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfCAobGVuZ3RoID0gdmFyaWFibGUsIHNlZSBhcmcxIGxheW91dCBiZWxvdykgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqIHwgICAgICAgICAgICAgIGFyZzI6IG9mZnNldCAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAobGVuZ3RoID0gNCkgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqLwogCisgICAgLy8gYXJnMCA9IGJsb2JTaXplIChpbnQzMikKICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAvLyBXcml0ZSB6ZXJvIGJsb2JTaXplIGZvciBudWxsIG1ldGFkYXRhLgogICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludDMyKDApOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFsd2F5cyBtYWtlIHRoZSBibG9iIHNpemUgc3VmZmljaWVudGx5IGxhcmdlciwgYXMgd2UgbmVlZCBwdXQgYWxpZ25tZW50CisgICAgICogcGFkZGluZyBhbmQgbWV0YWRhdGEgaW50byB0aGUgYmxvYi4gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYWxpZ25tZW50CisgICAgICogb2Zmc2V0IGJlZm9yZSB3cml0ZUJsb2IuIFRoZW4gd3JpdGUgdGhlIG1ldGFkYXRhIHRvIGFsaWduZWQgb2Zmc2V0LgorICAgICAqLwogICAgIGNvbnN0IHNpemVfdCBtZXRhZGF0YVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2NvbXBhY3Rfc2l6ZShtZXRhZGF0YSk7Ci0gICAgcmVzID0gZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1ldGFkYXRhU2l6ZSkpOworICAgIGNvbnN0IHNpemVfdCBhbGlnbm1lbnQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX2FsaWdubWVudCgpOworICAgIGNvbnN0IHNpemVfdCBibG9iU2l6ZSA9IG1ldGFkYXRhU2l6ZSArIGFsaWdubWVudDsKKyAgICByZXMgPSBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYmxvYlNpemUpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gYXJnMSA9IG1ldGFkYXRhIChibG9iKQorICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIC8qKgorICAgICAqIGFyZzEgPSBtZXRhZGF0YSAoYmxvYikuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBzaXplIGlzIHRoZSBzdW0gb2YgZnJvbnQgcGFkZGluZyBzaXplLCBtZXRhZGF0YSBzaXplIGFuZCBiYWNrIHBhZGRpbmcKKyAgICAgKiBzaXplLCB3aGljaCBpcyBlcXVhbCB0byBtZXRhZGF0YVNpemUgKyBhbGlnbm1lbnQuCisgICAgICoKKyAgICAgKiBUaGUgYmxvYiBsYXlvdXQgaXM6CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLVN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGJsb2IgKHVuYWxpZ25lZCkuCisgICAgICogfCAgICAgICAgICAgZnJvbnQgcGFkZGluZyAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgIChzaXplID0gb2Zmc2V0KSAgICAgICAgICAgfAorICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18PC0tLS1BbGlnbmVkIHN0YXJ0IGFkZHJlc3Mgb2YgbWV0YWRhdGEuCisgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICBtZXRhZGF0YSAgICAgICAgICAgICAgICB8CisgICAgICogfCAgICAgICAoc2l6ZSA9IG1ldGFkYXRhU2l6ZSkgICAgICAgIHwKKyAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiB8ICAgICAgICAgICBiYWNrIHBhZGRpbmcgICAgICAgICAgICAgfAorICAgICAqIHwgICAgIChzaXplID0gYWxpZ25tZW50IC0gb2Zmc2V0KSAgICB8CisgICAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw8LS0tLUVuZCBhZGRyZXNzIG9mIGJsb2IuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCbG9iIHN0YXJ0IGFkZHJlc3MgKyBibG9iIHNpemUpLgorICAgICAqLwogICAgIFdyaXRhYmxlQmxvYiBibG9iOwogICAgIGRvIHsKLSAgICAgICAgcmVzID0gZGF0YS53cml0ZUJsb2IobWV0YWRhdGFTaXplLCAmYmxvYik7CisgICAgICAgIHJlcyA9IGRhdGEud3JpdGVCbG9iKGJsb2JTaXplLCAmYmxvYik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNvcHlfY2FtZXJhX21ldGFkYXRhKGJsb2IuZGF0YSgpLCBtZXRhZGF0YVNpemUsIG1ldGFkYXRhKTsKLQotICAgICAgICBJRl9BTE9HVigpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KilibG9iLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZtZXRhZGF0YVNpemUpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBGYWlsZWQgdG8gdmFsaWRhdGUgbWV0YWRhdGEgJXAgYWZ0ZXIgd3JpdGluZyBibG9iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBibG9iLmRhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWV0YWRhdGEgd3JpdHRlbiB0byBibG9iLiBWYWxpZGF0aW9uIHN1Y2Nlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50cHRyX3QgbWV0YWRhdGFTdGFydCA9IEFMSUdOX1RPKGJsb2IuZGF0YSgpLCBhbGlnbm1lbnQpOworICAgICAgICBvZmZzZXQgPSBtZXRhZGF0YVN0YXJ0IC0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJsb2IuZGF0YSgpKTsKKyAgICAgICAgQUxPR1YoIiVzOiBhbGlnbm1lbnQgaXM6ICV6dSwgbWV0YWRhdGEgc3RhcnQ6ICVwLCBvZmZzZXQ6ICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkICo+KG1ldGFkYXRhU3RhcnQpLCBvZmZzZXQpOworICAgICAgICBjb3B5X2NhbWVyYV9tZXRhZGF0YShyZWludGVycHJldF9jYXN0PHZvaWQqPihtZXRhZGF0YVN0YXJ0KSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YSk7CiAKICAgICAgICAgLy8gTm90IHRvbyBiaWcgb2YgYSBwcm9ibGVtIHNpbmNlIHJlY2VpdmluZyBzaWRlIGRvZXMgaGFyZCB2YWxpZGF0aW9uCiAgICAgICAgIC8vIERvbid0IGNoZWNrIHRoZSBzaXplIHNpbmNlIHRoZSBjb21wYWN0IHNpemUgY291bGQgYmUgbGFyZ2VyCkBAIC01MjgsNiArNjA0LDkgQEAKICAgICB9IHdoaWxlKGZhbHNlKTsKICAgICBibG9iLnJlbGVhc2UoKTsKIAorICAgIC8vIGFyZzIgPSBvZmZzZXQgKGludDMyKQorICAgIHJlcyA9IGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihvZmZzZXQpKTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjNTFmMjY1Li4yNWQ2MzJkIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KQEAgLTQ1Niw3ICs0NTcsNyBAQAogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoKSBjb25zdAogewotICAgIEFMT0dEKCJkdW1wOiBtTWFwLnNpemUgPSAlZCIsIG1NYXAuc2l6ZSgpKTsKKyAgICBBTE9HRCgiZHVtcDogbU1hcC5zaXplID0gJXp1IiwgbU1hcC5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICBTdHJpbmc4IGssIHY7CiAgICAgICAgIGsgPSBtTWFwLmtleUF0KGkpOwpAQCAtNDY1LDEyICs0NjYsMTIgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IENhbWVyYVBhcmFtZXRlcnM6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiQ2FtZXJhUGFyYW1ldGVyczo6ZHVtcDogbU1hcC5zaXplID0gJWRcbiIsIG1NYXAuc2l6ZSgpKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIkNhbWVyYVBhcmFtZXRlcnM6OmR1bXA6IG1NYXAuc2l6ZSA9ICV6dVxuIiwgbU1hcC5zaXplKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBrLCB2OwpAQCAtNDgzLDQgKzQ4NCw0NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRTdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyhWZWN0b3I8aW50PiYgZm9ybWF0cykgY29uc3QgeworICAgIGNvbnN0IGNoYXIqIHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzID0KKyAgICAgICAgICBnZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZPUk1BVFMpOworCisgICAgU3RyaW5nOCBmbXRTdHIoc3VwcG9ydGVkUHJldmlld0Zvcm1hdHMpOworICAgIGNoYXIqIHByZXZGbXRzID0gZm10U3RyLmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7CisKKyAgICBjaGFyKiBzYXZlUHRyOworICAgIGNoYXIqIGZtdCA9IHN0cnRva19yKHByZXZGbXRzLCAiLCIsICZzYXZlUHRyKTsKKyAgICB3aGlsZSAoZm10KSB7CisgICAgICAgIGludCBhY3R1YWwgPSBwcmV2aWV3Rm9ybWF0VG9FbnVtKGZtdCk7CisgICAgICAgIGlmIChhY3R1YWwgIT0gLTEpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuYWRkKGFjdHVhbCk7CisgICAgICAgIH0KKyAgICAgICAgZm10ID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZVB0cik7CisgICAgfQorICAgIGZtdFN0ci51bmxvY2tCdWZmZXIoZm10U3RyLnNpemUoKSk7Cit9CisKKworaW50IENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KSB7CisgICAgcmV0dXJuCisgICAgICAgICFmb3JtYXQgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOgorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1lVVjQyMlNQKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUCA6IC8vIE5WMTYKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AgOiAvLyBOVjIxCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIySSkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSSA6ICAvLyBZVVkyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfWVVWNDIwUCkgPworICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyIDogICAgICAgICAvLyBZVjEyCisgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCNTY1KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgOiAgICAgIC8vIFJHQjU2NQorICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX1JHQkE4ODg4KSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCA6ICAgIC8vIFJHQjg4ODgKKyAgICAgICAgIXN0cmNtcChmb3JtYXQsIFBJWEVMX0ZPUk1BVF9CQVlFUl9SR0dCKSA/CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBV19TRU5TT1IgOiAgIC8vIFJhdyBzZW5zb3IgZGF0YQorICAgICAgICAtMTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGVhYzc5ZTEuLjM3OGFmZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMzYyLDYgKzM2Miw3IEBACiAKIHN0YXR1c190IENhbWVyYVBhcmFtZXRlcnMyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKIHsKKyAgICAodm9pZClhcmdzOwogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcCBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNDRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVV0aWxzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqIHRyYW5zZm9ybSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzOiBudWxsIHRyYW5zZm9ybSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnRyYW5zZm9ybSA9IDA7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTik7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlGYWNpbmcgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0ZBQ0lORyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBmaW5kIGFuZHJvaWQubGVucy5mYWNpbmcgaW4gc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07CisKKyAgICBib29sIG1pcnJvciA9IChlbnRyeUZhY2luZy5kYXRhLnU4WzBdID09IEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQpOworICAgIGludCBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIGlmICghbWlycm9yKSB7CisgICAgICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgSEFMIGFuZHJvaWQuc2Vuc29yLm9yaWVudGF0aW9uIHZhbHVlOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRnJvbnQgY2FtZXJhIG5lZWRzIHRvIGJlIGhvcml6b250YWxseSBmbGlwcGVkIGZvciBtaXJyb3ItbGlrZSBiZWhhdmlvci4KKyAgICAgICAgLy8gTm90ZTogRmxpcHMgYXJlIGFwcGxpZWQgYmVmb3JlIHJvdGF0ZXM7IHVzaW5nIFhPUiBoZXJlIGFzIHNvbWUgb2YgdGhlc2UgZmxhZ3MgYXJlCisgICAgICAgIC8vIGNvbXBvc2VkIGluIHRlcm1zIG9mIG90aGVyIGZsaXAvcm90YXRpb24gZmxhZ3MsIGFuZCBhcmUgbm90IGJpdHdpc2UtT1JhYmxlLgorICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgIGZsYWdzID0gTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0ZMSVBfSCBeCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9GTElQX0ggXgorICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKKyAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCisgICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCisgICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCisgICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgorICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5CisgICAgICogc3RyZXRjaGVkLgorICAgICAqLworICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKKworICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCisgICAgcmV0dXJuIE9LOworfQorCisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM2MTYwCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEtQ2FwdHVyZVJlc3VsdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgQ2FwdHVyZVJlc3VsdEV4dHJhczo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gcmVxdWVzdElkID49IDA7Cit9CisKK3N0YXR1c190IENhcHR1cmVSZXN1bHRFeHRyYXM6OnJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+cmVhZEludDMyKCZyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZidXJzdElkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQzMigmYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+cmVhZEludDMyKCZwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYXB0dXJlUmVzdWx0RXh0cmFzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZXF1ZXN0SWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihidXJzdElkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoYWZUcmlnZ2VySWQpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwcmVjYXB0dXJlVHJpZ2dlcklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgcmV0dXJuIE9LOworfQorCitDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgorICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKK30KKworQ2FwdHVyZVJlc3VsdDo6Q2FwdHVyZVJlc3VsdChjb25zdCBDYXB0dXJlUmVzdWx0ICZvdGhlclJlc3VsdCkgeworICAgIG1SZXN1bHRFeHRyYXMgPSBvdGhlclJlc3VsdC5tUmVzdWx0RXh0cmFzOworICAgIG1NZXRhZGF0YSA9IG90aGVyUmVzdWx0Lm1NZXRhZGF0YTsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpIHsKKworICAgIEFMT0dWKCIlczogcGFyY2VsID0gJXAiLCBfX0ZVTkNUSU9OX18sIHBhcmNlbCk7CisKKyAgICBpZiAocGFyY2VsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJjZWwgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJlcyA9IG1SZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVzdWx0IGV4dHJhcyBmcm9tIHBhcmNlbC4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogUmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworCisgICAgQUxPR1YoIiVzOiBwYXJjZWwgPSAlcCIsIF9fRlVOQ1RJT05fXywgcGFyY2VsKTsKKworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICByZXMgPSBtTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBXcm90ZSBtZXRhZGF0YSB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmVzID0gbVJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSByZXN1bHQgZXh0cmFzIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcmVzdWx0IGV4dHJhcyB0byBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA1ZmM4OWZiLi41NDg1MjA1IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJCcENhbWVyYVNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzQsNiArMzYsNyBAQAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTQzLDYgKzE0NiwyNCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIC8vIEdldCBlbnVtZXJhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdmVuZG9yIHRhZ3MgZm9yIGNhbWVyYQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGlmIChyZWFkRXhjZXB0aW9uQ29kZShyZXBseSkpIHJldHVybiAtRVBST1RPOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZDsKKyAgICAgICAgICAgIGlmIChWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZyZXBseSwgLypvdXQqL2QpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlIChhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCkBAIC0xNjUsNiArMTg2LDI5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAoYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEpCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPElDYW1lcmE+JiBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2FtZXJhSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFsVmVyc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbGllbnRVaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgLy8gY29ubmVjdCB0byBjYW1lcmEgc2VydmljZSAocHJvIGNsaWVudCkKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3RQcm8oY29uc3Qgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4mIGNhbWVyYUNiLCBpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKQEAgLTIzMyw2ICsyNzcsNDEgQEAKICAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExlZ2FjeVBhcmFtZXRlcnMoaW50IGNhbWVyYUlkLCBTdHJpbmcxNiogcGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHBhcmFtZXRlcnMgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9MRUdBQ1lfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJlYWRFeGNlcHRpb25Db2RlKHJlcGx5KSkgcmV0dXJuIC1FUFJPVE87CisKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50MzJfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOyAvLyAtMSBtZWFucyBudWxsCisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IFN0cmluZzE2KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNDYW1lcmFBcGkoaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNhbWVyYUlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaVZlcnNpb24pOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5DYW1lcmFTZXJ2aWNlOjpTVVBQT1JUU19DQU1FUkFfQVBJLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAocmVhZEV4Y2VwdGlvbkNvZGUocmVwbHkpKSByZXR1cm4gLUVQUk9UTzsKKworICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlLCAiYW5kcm9pZC5oYXJkd2FyZS5JQ2FtZXJhU2VydmljZSIpOwpAQCAtMjc1LDYgKzM1NCwyMiBAQAogICAgICAgICAgICAgaW5mby53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfQ0FNRVJBX1ZFTkRPUl9UQUdfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcihkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworCisgICAgICAgICAgICAvLyBvdXQtdmFyaWFibGVzIGFyZSBhZnRlciBleGNlcHRpb24gYW5kIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsgLy8gbWVhbnMgdGhlIHBhcmNlbGFibGUgaXMgaW5jbHVkZWQKKyAgICAgICAgICAgICAgICBkLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9CkBAIC0yODQsNyArMzc5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovIGNhbWVyYSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqL2NhbWVyYSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChjYW1lcmEgIT0gTlVMTCkgewpAQCAtMzA0LDcgKzM5OSw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJUHJvQ2FtZXJhVXNlcj4gY2FtZXJhOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdFBybyhjYW1lcmFDbGllbnQsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki8gY2FtZXJhKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CkBAIC0zMjQsNyArNDE5LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBjYW1lcmE7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RGV2aWNlKGNhbWVyYUNsaWVudCwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgLypvdXQqLyBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIC8qb3V0Ki9jYW1lcmEpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoY2FtZXJhICE9IE5VTEwpIHsKQEAgLTM1MSw2ICs0NDYsNTAgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0xFR0FDWV9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmcxNiBwYXJhbWV0ZXJzOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOworICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRMZWdhY3lQYXJhbWV0ZXJzKGNhbWVyYUlkLCAmcGFyYW1ldGVycykpOworICAgICAgICAgICAgLy8gb3V0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOyAvLyBwYXJhbWV0ZXJzIGlzIGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KHBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVUFBPUlRTX0NBTUVSQV9BUEk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBhcGlWZXJzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWQsIGFwaVZlcnNpb24pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDT05ORUNUX0xFR0FDWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjYW1lcmFDbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDMyX3QgaGFsVmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBjbGllbnROYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgICAgIGludDMyX3QgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RMZWdhY3koY2FtZXJhQ2xpZW50LCBjYW1lcmFJZCwgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCAvKm91dCovY2FtZXJhKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKGNhbWVyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9jYW1lcmEvUHJvQ2FtZXJhLmNwcCBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCmluZGV4IGJhNWE0OGMuLjQ4ZjhlOGUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9Qcm9DYW1lcmEuY3BwCkBAIC0yNDksMTEgKzI0OSwxNCBAQAogICAgIHNwIDxJUHJvQ2FtZXJhVXNlcj4gYyA9IG1DYW1lcmE7CiAgICAgaWYgKGMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGhlYXBDb3VudC8qLCBzeW5jaHJvbm91c01vZGUqLyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBzcDxDcHVDb25zdW1lcj4gY2MgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGhlYXBDb3VudAorICAgICAgICAgICAgLyosIHN5bmNocm9ub3VzTW9kZSovKTsKICAgICBjYy0+c2V0TmFtZShTdHJpbmc4KCJQcm9DYW1lcmE6Om1DcHVDb25zdW1lciIpKTsKIAotICAgIHNwPFN1cmZhY2U+IHN0YyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzID0gY3JlYXRlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Yy0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLApkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGE2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlZlbmRvclRhZ0Rlc2NyaXB0b3IiCisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhX21ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorCisjaW5jbHVkZSAiY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdik7CitzdGF0aWMgdm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90KiB0YWdBcnJheSk7CitzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHYsIHVpbnQzMl90IHRhZyk7CitzdGF0aWMgaW50IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdiwgdWludDMyX3QgdGFnKTsKKworfSAvKiBleHRlcm4gIkMiICovCisKKworc3RhdGljIE11dGV4IHNMb2NrOworc3RhdGljIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yOworCitWZW5kb3JUYWdEZXNjcmlwdG9yOjpWZW5kb3JUYWdEZXNjcmlwdG9yKCkge30KKworVmVuZG9yVGFnRGVzY3JpcHRvcjo6flZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgc2l6ZV90IGxlbiA9IG1SZXZlcnNlTWFwcGluZy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47ICsraSkgIHsKKyAgICAgICAgZGVsZXRlIG1SZXZlcnNlTWFwcGluZ1tpXTsKKyAgICB9Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIGlmICh2T3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3JfdGFnX29wcyBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0YWdDb3VudCA9IHZPcHMtPmdldF90YWdfY291bnQodk9wcyk7CisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciBvcHMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworCisgICAgdk9wcy0+Z2V0X2FsbF90YWdzKHZPcHMsIC8qb3V0Ki90YWdBcnJheS5lZGl0QXJyYXkoKSk7CisKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBkZXNjLT5tVGFnQ291bnQgPSB0YWdDb3VudDsKKworICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBzZWN0aW9uczsKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpOworICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHZPcHMtPmdldF9zZWN0aW9uX25hbWUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisKKyAgICAgICAgc2VjdGlvbnMuYWRkKHNlY3Rpb25TdHJpbmcpOworICAgICAgICB0YWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgaW50IHRhZ1R5cGUgPSB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKTsKKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tVGFnVG9UeXBlTWFwLmFkZCh0YWcsIHRhZ1R5cGUpOworICAgIH0KKworICAgIGRlc2MtPm1TZWN0aW9ucyA9IHNlY3Rpb25zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBzZWN0aW9ucy5pbmRleE9mKHNlY3Rpb25TdHJpbmcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgImluZGV4ICV6ZCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIsIGluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKworICAgICAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgdGFnQ291bnQgPSAwOworICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ0NvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3Igb3BzIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICB1aW50MzJfdCBtYXhTZWN0aW9uSW5kZXggPSAwOworICAgIGludDMyX3QgdGFnVHlwZTsKKyAgICBWZWN0b3I8dWludDMyX3Q+IGFsbFRhZ3M7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ0YWcpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgdGFnIGlkIGZyb20gcGFyY2VsIGZvciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodGFnIDwgQ0FNRVJBX01FVEFEQVRBX1ZFTkRPUl9UQUdfQk9VTkRBUlkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJlcyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnRhZ1R5cGUpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCB0YWcgdHlwZSBmcm9tIHBhcmNlbCBmb3IgdGFnICVkIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHRhZyB0eXBlICVkIGZyb20gdmVuZG9yIG9wcyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHRhZ1R5cGUpOworICAgICAgICAgICAgcmVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICBpZiAodGFnTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHRhZyBuYW1lIHdhcyBOVUxMIGZvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZEludDMyKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZzZWN0aW9uSW5kZXgpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHJlYWQgc2VjdGlvbiBpbmRleCBmb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWF4U2VjdGlvbkluZGV4ID0gKG1heFNlY3Rpb25JbmRleCA+PSBzZWN0aW9uSW5kZXgpID8gbWF4U2VjdGlvbkluZGV4IDogc2VjdGlvbkluZGV4OworCisgICAgICAgIGFsbFRhZ3MuYWRkKHRhZyk7CisgICAgICAgIGRlc2MtPm1UYWdUb05hbWVNYXAuYWRkKHRhZywgdGFnTmFtZSk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc2VjdGlvbkluZGV4KTsKKyAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5hZGQodGFnLCB0YWdUeXBlKTsKKyAgICB9CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNlY3Rpb25Db3VudDsKKyAgICBpZiAodGFnQ291bnQgPiAwKSB7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkSW50MzIocmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJnNlY3Rpb25Db3VudCkpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVhZCBzZWN0aW9uIGNvdW50IGZvci4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VjdGlvbkNvdW50IDwgKG1heFNlY3Rpb25JbmRleCArIDEpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEluY29ycmVjdCBudW1iZXIgb2Ygc2VjdGlvbnMgZGVmaW5lZCwgcmVjZWl2ZWQgJXp1LCBuZWVkcyAlZC4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlY3Rpb25Db3VudCwgKG1heFNlY3Rpb25JbmRleCArIDEpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXNjLT5tU2VjdGlvbnMuc2V0Q2FwYWNpdHkoc2VjdGlvbkNvdW50KSA8PSAwLAorICAgICAgICAgICAgICAgICJWZWN0b3IgY2FwYWNpdHkgbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHNlY3Rpb25OYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgaWYgKHNlY3Rpb25OYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGFyY2VsIHNlY3Rpb24gbmFtZSB3YXMgTlVMTCBmb3Igc2VjdGlvbiAlenUuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tU2VjdGlvbnMuYWRkKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8c2l6ZV90Pih0YWdDb3VudCkgIT0gYWxsVGFncy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ291bnQgbXVzdCBiZSB0aGUgc2FtZSBhcyBhbGxUYWdzIHNpemUiKTsKKyAgICAvLyBTZXQgdXAgcmV2ZXJzZSBtYXBwaW5nCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRhZ0NvdW50KTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IGFsbFRhZ3NbaV07CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IGRlc2MtPm1TZWN0aW9uc1tkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyldOworCisgICAgICAgIHNzaXplX3QgcmV2ZXJzZUluZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvblN0cmluZykpIDwgMCkgeworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KiBuYW1lTWFwcGVyID0gbmV3IEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PigpOworICAgICAgICAgICAgcmV2ZXJzZUluZGV4ID0gZGVzYy0+bVJldmVyc2VNYXBwaW5nLmFkZChzZWN0aW9uU3RyaW5nLCBuYW1lTWFwcGVyKTsKKyAgICAgICAgfQorICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKKyAgICB9CisKKyAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQ291bnQoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnQXJyYXkodWludDMyX3QqIHRhZ0FycmF5KSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB0YWdBcnJheVtpXSA9IG1UYWdUb05hbWVNYXAua2V5QXQoaSk7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtU2VjdGlvbnNbbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUF0KGluZGV4KV0uc3RyaW5nKCk7Cit9CisKK2NvbnN0IGNoYXIqIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFRhZ05hbWUodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1UYWdUb05hbWVNYXAuaW5kZXhPZktleSh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaW5kZXgpLnN0cmluZygpOworfQorCitpbnQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0VGFnVHlwZSh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRhZ1RvTmFtZU1hcC5pbmRleE9mS2V5KHRhZyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19UWVBFX0VSUjsKKyAgICB9CisgICAgcmV0dXJuIG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKK30KKworc3RhdHVzX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmNlbCBhcmd1bWVudCB3YXMgTlVMTC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKG1UYWdDb3VudCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKKyAgICB1aW50MzJfdCB0YWcsIHNlY3Rpb25JbmRleDsKKyAgICBpbnQzMl90IHRhZ1R5cGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdGFnID0gbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKyAgICAgICAgU3RyaW5nOCB0YWdOYW1lID0gbVRhZ1RvTmFtZU1hcFtpXTsKKyAgICAgICAgc2VjdGlvbkluZGV4ID0gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICB0YWdUeXBlID0gbVRhZ1RvVHlwZU1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMih0YWcpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZUludDMyKHRhZ1R5cGUpKSAhPSBPSykgYnJlYWs7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgodGFnTmFtZSkpICE9IE9LKSBicmVhazsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlSW50MzIoc2VjdGlvbkluZGV4KSkgIT0gT0spIGJyZWFrOworICAgIH0KKworICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IG1TZWN0aW9ucy5zaXplKCk7CisgICAgaWYgKG51bVNlY3Rpb25zID4gMCkgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVJbnQzMihudW1TZWN0aW9ucykpICE9IE9LKSByZXR1cm4gcmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlY3Rpb25zOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzgobVNlY3Rpb25zW2ldKSkgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0QWxsU2VjdGlvbk5hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtU2VjdGlvbnM7Cit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6Omxvb2t1cFRhZyhTdHJpbmc4IG5hbWUsIFN0cmluZzggc2VjdGlvbiwgLypvdXQqL3VpbnQzMl90KiB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVJldmVyc2VNYXBwaW5nLmluZGV4T2ZLZXkoc2VjdGlvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFNlY3Rpb24gJyVzJyBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHNlY3Rpb24uc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgbmFtZUluZGV4ID0gbVJldmVyc2VNYXBwaW5nW2luZGV4XS0+aW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAobmFtZUluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFRhZyBuYW1lICclcycgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodGFnICE9IE5VTEwpIHsKKyAgICAgICAgKnRhZyA9IG1SZXZlcnNlTWFwcGluZ1tpbmRleF0tPnZhbHVlQXQobmFtZUluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKKworICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6IE5vbmUgc2V0XG4iLAorICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLCAiIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcHJpbnRmKGZkLCAiJSpzRHVtcGluZyBjb25maWd1cmVkIHZlbmRvciB0YWcgZGVzY3JpcHRvcnM6ICV6dSBlbnRyaWVzXG4iLAorICAgICAgICAgICAgaW5kZW50YXRpb24sICIiLCBzaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSAgbVRhZ1RvTmFtZU1hcC5rZXlBdChpKTsKKworICAgICAgICBpZiAodmVyYm9zaXR5IDwgMSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXhcbiIsIGluZGVudGF0aW9uICsgMiwgIiIsIHRhZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IG5hbWUgPSBtVGFnVG9OYW1lTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIHVpbnQzMl90IHNlY3Rpb25JZCA9IG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uTmFtZSA9IG1TZWN0aW9uc1tzZWN0aW9uSWRdOworICAgICAgICBpbnQgdHlwZSA9IG1UYWdUb1R5cGVNYXAudmFsdWVGb3IodGFnKTsKKyAgICAgICAgY29uc3QgY2hhciogdHlwZU5hbWUgPSAodHlwZSA+PSAwICYmIHR5cGUgPCBOVU1fVFlQRVMpID8KKyAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdHlwZV9uYW1lc1t0eXBlXSA6ICJVTktOT1dOIjsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqczB4JXggKCVzKSB3aXRoIHR5cGUgJWQgKCVzKSBkZWZpbmVkIGluIHNlY3Rpb24gJXNcbiIsIGluZGVudGF0aW9uICsgMiwKKyAgICAgICAgICAgICIiLCB0YWcsIG5hbWUuc3RyaW5nKCksIHR5cGUsIHR5cGVOYW1lLCBzZWN0aW9uTmFtZS5zdHJpbmcoKSk7CisgICAgfQorCit9CisKK3N0YXR1c190IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihjb25zdCBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPSBkZXNjOworCisgICAgdmVuZG9yX3RhZ19vcHNfdCogb3BzUHRyID0gTlVMTDsKKyAgICBpZiAoZGVzYyAhPSBOVUxMKSB7CisgICAgICAgIG9wc1B0ciA9ICYoZGVzYy0+bVZlbmRvck9wcyk7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ19jb3VudCA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX2NvdW50OworICAgICAgICBvcHNQdHItPmdldF9hbGxfdGFncyA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfYWxsX3RhZ3M7CisgICAgICAgIG9wc1B0ci0+Z2V0X3NlY3Rpb25fbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lOworICAgICAgICBvcHNQdHItPmdldF90YWdfbmFtZSA9IHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfdGFnX25hbWU7CisgICAgICAgIG9wc1B0ci0+Z2V0X3RhZ190eXBlID0gdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZTsKKyAgICB9CisgICAgaWYoKHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcyhvcHNQdHIpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCByZWNlaXZlZCBlcnJvciAlcyAoJWQpLiIKKyAgICAgICAgICAgICAgICAsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChzTG9jayk7CisgICAgc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3Jfb3BzKE5VTEwpOworICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLmNsZWFyKCk7Cit9CisKK3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit9CisKK2V4dGVybiAiQyIgeworCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogLyp2Ki8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1RBR19DT1VOVF9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnQ291bnQoKTsKK30KKwordm9pZCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X2FsbF90YWdzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCogdGFnQXJyYXkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7Cit9CisKK2NvbnN0IGNoYXIqIHZlbmRvcl90YWdfZGVzY3JpcHRvcl9nZXRfc2VjdGlvbl9uYW1lKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIC8qdiovLCB1aW50MzJfdCB0YWcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc0xvY2spOworICAgIGlmIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogVmVuZG9yIHRhZyBkZXNjcmlwdG9yIG5vdCBpbml0aWFsaXplZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gVkVORE9SX1NFQ1RJT05fTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0U2VjdGlvbk5hbWUodGFnKTsKK30KKworY29uc3QgY2hhciogdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfbmFtZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnTmFtZSh0YWcpOworfQorCitpbnQgdmVuZG9yX3RhZ19kZXNjcmlwdG9yX2dldF90YWdfdHlwZShjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLywgdWludDMyX3QgdGFnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IFZlbmRvciB0YWcgZGVzY3JpcHRvciBub3QgaW5pdGlhbGl6ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7CisgICAgfQorICAgIHJldHVybiBzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvci0+Z2V0VGFnVHlwZSh0YWcpOworfQorCit9IC8qIGV4dGVybiAiQyIgKi8KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKaW5kZXggNjEzMzU4YS4uNGNjN2I1ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ2LDEyICs0NywxNCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSkKKyAgICB2b2lkIG9uRGV2aWNlRXJyb3IoQ2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKQogICAgIHsKICAgICAgICAgQUxPR1YoIm9uRGV2aWNlRXJyb3IiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVycm9yQ29kZSkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7IC8vIHRvIG1hcmsgcHJlc2VuY2Ugb2YgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QKKyAgICAgICAgcmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwoJmRhdGEpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0FNRVJBX0VSUk9SLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICAgICAgZGF0YS53cml0ZU5vRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtNjUsMjUgKzY4LDI4IEBACiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwgaW50NjRfdCB0aW1lc3RhbXApCisgICAgdm9pZCBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdCwgaW50NjRfdCB0aW1lc3RhbXApCiAgICAgewogICAgICAgICBBTE9HVigib25DYXB0dXJlU3RhcnRlZCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVxdWVzdElkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHRFeHRyYXMgb2JqZWN0CisgICAgICAgIHJlc3VsdC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDQVBUVVJFX1NUQVJURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgICAgICBkYXRhLndyaXRlTm9FeGNlcHRpb24oKTsKICAgICB9CiAKIAotICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgeworICAgIHZvaWQgb25SZXN1bHRSZWNlaXZlZChjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZUNhbGxiYWNrczo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcXVlc3RJZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsgLy8gdG8gbWFyayBwcmVzZW5jZSBvZiBtZXRhZGF0YSBvYmplY3QKLSAgICAgICAgcmVzdWx0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBtZXRhZGF0YS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOyAvLyB0byBtYXJrIHByZXNlbmNlIG9mIENhcHR1cmVSZXN1bHQgb2JqZWN0CisgICAgICAgIHJlc3VsdEV4dHJhcy53cml0ZVRvUGFyY2VsKCZkYXRhKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1VMVF9SRUNFSVZFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgICAgIGRhdGEud3JpdGVOb0V4Y2VwdGlvbigpOwogICAgIH0KQEAgLTEwNCw3ICsxMTAsMTMgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhRXJyb3JDb2RlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIG9uRGV2aWNlRXJyb3IoZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChjb25zdF9jYXN0PFBhcmNlbCo+KCZkYXRhKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJObyBDYXB0dXJlUmVzdWx0RXh0cmFzIG9iamVjdCBpcyBwcmVzZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICBkYXRhLnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xMTgsMjMgKzEzMCwzMyBAQAogICAgICAgICBjYXNlIENBUFRVUkVfU1RBUlRFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uQ2FwdHVyZVN0YXJ0ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdDsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTm8gQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QgaXMgcHJlc2VudCBpbiByZXN1bHQhIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgZGF0YS5yZWFkRXhjZXB0aW9uQ29kZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFU1VMVF9SRUNFSVZFRDogewogICAgICAgICAgICAgQUxPR1YoIm9uUmVzdWx0UmVjZWl2ZWQiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXN1bHQ7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgICAgIG1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKGNvbnN0X2Nhc3Q8UGFyY2VsKj4oJmRhdGEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5vIG1ldGFkYXRhIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIHJlc3VsdCk7CisgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMucmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTm8gY2FwdHVyZSByZXN1bHQgZXh0cmFzIG9iamVjdCBpcyBwcmVzZW50IGluIHJlc3VsdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChtZXRhZGF0YSwgcmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIGRhdGEucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcAppbmRleCAxZTU4MjJmLi5mZjRhMGMyIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuY3BwCkBAIC0zNSw3ICszNSwxMCBAQAogZW51bSB7CiAgICAgRElTQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1VCTUlUX1JFUVVFU1QsCisgICAgU1VCTUlUX1JFUVVFU1RfTElTVCwKICAgICBDQU5DRUxfUkVRVUVTVCwKKyAgICBCRUdJTl9DT05GSUdVUkUsCisgICAgRU5EX0NPTkZJR1VSRSwKICAgICBERUxFVEVfU1RSRUFNLAogICAgIENSRUFURV9TVFJFQU0sCiAgICAgQ1JFQVRFX0RFRkFVTFRfUkVRVUVTVCwKQEAgLTc1LDcgKzc4LDggQEAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LCBib29sIHN0cmVhbWluZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYURldmljZVVzZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC04OSwxNSArOTMsNjcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1pbmcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1QsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWlmICgocmVzICE9IE5PX0VSUk9SKSB8fCAocmVzRnJhbWVOdW1iZXIgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICByZXMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdExpc3QsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyZXF1ZXN0TGlzdC5zaXplKCkpOworCisgICAgICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0TGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IHJlcXVlc3RMaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9ICppdDsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPndyaXRlVG9QYXJjZWwoJmRhdGEpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50MzIocmVwZWF0aW5nKTsKKworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VCTUlUX1JFUVVFU1RfTElTVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICBzdGF0dXNfdCByZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBzdGF0dXNfdCByZXNGcmFtZU51bWJlciA9IEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc0ZyYW1lTnVtYmVyID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkLCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTEwNiw2ICsxNjIsMzcgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTF9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYmVnaW5Db25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImJlZ2luQ29uZmlndXJlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFEZXZpY2VVc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQkVHSU5fQ09ORklHVVJFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmRDb25maWd1cmUoKQorICAgIHsKKyAgICAgICAgQUxPR1YoImVuZENvbmZpZ3VyZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVORF9DT05GSUdVUkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTE5NywxNCArMjg0LDI1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikKICAgICB7CiAgICAgICAgIEFMT0dWKCJmbHVzaCIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZMVVNILCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXR1c190IHJlc0ZyYW1lTnVtYmVyID0gQkFEX1ZBTFVFOworICAgICAgICBpZiAocmVwbHkucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcmVwbHkucmVhZEludDY0KGxhc3RGcmFtZU51bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXMgIT0gTk9fRVJST1IpIHx8IChyZXNGcmFtZU51bWJlciAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIHJlcyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogcHJpdmF0ZToKQEAgLTIzOSwxMSArMzM3LDQzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFyZzEgPSBzdHJlYW1pbmcgKGJvb2wpCi0gICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBib29sIHJlcGVhdGluZyA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIC8vIHJldHVybiBjb2RlOiByZXF1ZXN0SWQgKGludDMyKQogICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgc3RyZWFtaW5nKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3VibWl0UmVxdWVzdChyZXF1ZXN0LCByZXBlYXRpbmcsICZsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNVQk1JVF9SRVFVRVNUX0xJU1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgICAgICAgICAgaW50IHJlcXVlc3RMaXN0U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RMaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC0+cmVhZEZyb21QYXJjZWwoY29uc3RfY2FzdDxQYXJjZWwqPigmZGF0YSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkEgcmVxdWVzdCBpcyBtaXNzaW5nLiBTZW5kaW5nIGluIG51bGwgcmVxdWVzdC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlTm9FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgcmVwZWF0aW5nLCAmbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGxhc3RGcmFtZU51bWJlcik7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTI1MSw3ICszODEsMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhRGV2aWNlVXNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2FuY2VsUmVxdWVzdChyZXF1ZXN0SWQpKTsKKyAgICAgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjYW5jZWxSZXF1ZXN0KHJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFTEVURV9TVFJFQU06IHsKQEAgLTMzOSw5ICs0NzIsMjQgQEAKICAgICAgICAgY2FzZSBGTFVTSDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFEZXZpY2VVc2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goKSk7CisgICAgICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmx1c2goJmxhc3RGcmFtZU51bWJlcikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChsYXN0RnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgQkVHSU5fQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihiZWdpbkNvbmZpZ3VyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFTkRfQ09ORklHVVJFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYURldmljZVVzZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmRDb25maWd1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZWMxMzkxMS4uNjEzODVlNSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTEsOSArMSwyNCBAQAorIyBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJbWFpbi5jcHAgXAogCVByb0NhbWVyYVRlc3RzLmNwcCBcCisJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJ1dGlscyBcCkBAIC0yNiw2ICs0MSw4IEBACiAJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCiAJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKIAlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL3Rlc3RzIFwKIAlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlIFwKIAlmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhIFwKIAlmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS90ZXN0cy9WZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzIgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX3Rlc3RzX2Zha2VfdmVuZG9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworZW51bSB7CisgICAgQkFEX1RBR19BUlJBWSA9IDB4REVBREJFRUZ1LAorICAgIEJBRF9UQUcgPSAweDhERUFEQkFEdSwKK307CisKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAgICAgIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKworc3RhdGljIGJvb2wgQ29udGFpbnNUYWcodWludDMyX3QqIHRhZ0FycmF5LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgdGFnKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKHRhZyA9PSB0YWdBcnJheVtpXSkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2RlZmluZSBFWFBFQ1RfQ09OVEFJTlNfVEFHKHQsIGEpIFwKKyAgICBFWFBFQ1RfVFJVRShDb250YWluc1RhZyhhLCBBUlJBWV9TSVpFKGEpLCB0KSkKKworI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAorICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBOVUxMKQorCitleHRlcm4gIkMiIHsKKworc3RhdGljIGludCBkZWZhdWx0X2dldF90YWdfY291bnQoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcykgeworICAgIHJldHVybiBWRU5ET1JfVEFHX0NPVU5UX0VSUjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9nZXRfYWxsX3RhZ3MoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QqIHRhZ0FycmF5KSB7CisgICAgLy9Ob29wCit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBkZWZhdWx0X2dldF9zZWN0aW9uX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9TRUNUSU9OX05BTUVfRVJSOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZGVmYXVsdF9nZXRfdGFnX25hbWUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfTkFNRV9FUlI7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9nZXRfdGFnX3R5cGUoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogdk9wcywgdWludDMyX3QgdGFnKSB7CisgICAgcmV0dXJuIFZFTkRPUl9UQUdfVFlQRV9FUlI7Cit9CisKK30gLypleHRlcm4gIkMiKi8KKworLy8gU2V0IGRlZmF1bHQgdmVuZG9yIG9wZXJhdGlvbnMgZm9yIGEgdmVuZG9yX3RhZ19vcHMgc3RydWN0CitzdGF0aWMgdm9pZCBGaWxsV2l0aERlZmF1bHRzKHZlbmRvcl90YWdfb3BzX3QqIHZPcHMpIHsKKyAgICBBU1NFUlRfTk9UX05VTEwodk9wcyk7CisgICAgdk9wcy0+Z2V0X3RhZ19jb3VudCA9IGRlZmF1bHRfZ2V0X3RhZ19jb3VudDsKKyAgICB2T3BzLT5nZXRfYWxsX3RhZ3MgPSBkZWZhdWx0X2dldF9hbGxfdGFnczsKKyAgICB2T3BzLT5nZXRfc2VjdGlvbl9uYW1lID0gZGVmYXVsdF9nZXRfc2VjdGlvbl9uYW1lOworICAgIHZPcHMtPmdldF90YWdfbmFtZSA9IGRlZmF1bHRfZ2V0X3RhZ19uYW1lOworICAgIHZPcHMtPmdldF90YWdfdHlwZSA9IGRlZmF1bHRfZ2V0X3RhZ190eXBlOworfQorCisvKioKKyAqIFRlc3QgaWYgdmFsdWVzIGZyb20gVmVuZG9yVGFnRGVzY3JpcHRvciBtZXRob2RzIG1hdGNoIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBmcm9tIHZlbmRvcl90YWdfb3BzIGZ1bmN0aW9ucy4KKyAqLworVEVTVChWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdCwgQ29uc2lzdGVudFdpdGhWZW5kb3JUYWdzKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdkRlc2M7CisgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqdk9wcyA9ICZmYWtldmVuZG9yX29wczsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKHZPcHMsIC8qb3V0Ki92RGVzYykpOworCisgICAgQVNTRVJUX05PVF9OVUxMKHZEZXNjKTsKKworICAgIC8vIEVuc3VyZSByZWFzb25hYmxlIHRhZyBjb3VudAorICAgIGludCB0YWdDb3VudCA9IHZEZXNjLT5nZXRUYWdDb3VudCgpOworICAgIEVYUEVDVF9FUSh0YWdDb3VudCwgdk9wcy0+Z2V0X3RhZ19jb3VudCh2T3BzKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IG9wc1RhZ0FycmF5W3RhZ0NvdW50XTsKKworICAgIC8vIEdldCBhbGwgdGFnIGlkcworICAgIHZEZXNjLT5nZXRUYWdBcnJheShkZXNjVGFnQXJyYXkpOworICAgIHZPcHMtPmdldF9hbGxfdGFncyh2T3BzLCBvcHNUYWdBcnJheSk7CisKKyAgICBBU1NFUlRfTk9UX05VTEwoZGVzY1RhZ0FycmF5KTsKKyAgICBBU1NFUlRfTk9UX05VTEwob3BzVGFnQXJyYXkpOworCisgICAgdWludDMyX3QgdGFnOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7ICsraSkgeworICAgICAgICAvLyBGb3IgZWFjaCB0YWcgaWQsIGNoZWNrIHdoZXRoZXIgdHlwZSwgc2VjdGlvbiBuYW1lLCB0YWcgbmFtZSBtYXRjaAorICAgICAgICB0YWcgPSBkZXNjVGFnQXJyYXlbaV07CisgICAgICAgIEVYUEVDVF9DT05UQUlOU19UQUcodGFnLCBvcHNUYWdBcnJheSk7CisgICAgICAgIEVYUEVDVF9FUSh2RGVzYy0+Z2V0VGFnVHlwZSh0YWcpLCB2T3BzLT5nZXRfdGFnX3R5cGUodk9wcywgdGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzYy0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdk9wcy0+Z2V0X3NlY3Rpb25fbmFtZSh2T3BzLCB0YWcpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHZEZXNjLT5nZXRUYWdOYW1lKHRhZyksIHZPcHMtPmdldF90YWdfbmFtZSh2T3BzLCB0YWcpKTsKKyAgICB9Cit9CisKKy8qKgorICogVGVzdCBpZiB2YWx1ZXMgZnJvbSBWZW5kb3JUYWdEZXNjcmlwdG9yIG1ldGhvZHMgc3RheSBjb25zaXN0ZW50IGFmdGVyIGJlaW5nCisgKiBwYXJjZWxsZWQvdW5wYXJjZWxsZWQuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIENvbnNpc3RlbnRBY3Jvc3NQYXJjZWwpIHsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiB2RGVzY09yaWdpbmFsLCB2RGVzY1BhcmNlbGVkOworICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKnZPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcyh2T3BzLCAvKm91dCovdkRlc2NPcmlnaW5hbCkpOworCisgICAgQVNTRVJUX1RSVUUodkRlc2NPcmlnaW5hbCAhPSBOVUxMKTsKKworICAgIFBhcmNlbCBwOworCisgICAgLy8gQ2hlY2sgd2hldGhlciBwYXJjZWwgcmVhZC93cml0ZSBzdWNjZWVkCisgICAgRVhQRUNUX0VRKE9LLCB2RGVzY09yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSk7CisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVGcm9tUGFyY2VsKCZwLCB2RGVzY1BhcmNlbGVkKSk7CisKKyAgICAvLyBFbnN1cmUgY29uc2lzdGVudCB0YWcgY291bnQKKyAgICBpbnQgdGFnQ291bnQgPSB2RGVzY09yaWdpbmFsLT5nZXRUYWdDb3VudCgpOworICAgIEFTU0VSVF9FUSh0YWdDb3VudCwgdkRlc2NQYXJjZWxlZC0+Z2V0VGFnQ291bnQoKSk7CisKKyAgICB1aW50MzJfdCBkZXNjVGFnQXJyYXlbdGFnQ291bnRdOworICAgIHVpbnQzMl90IGRlc2MyVGFnQXJyYXlbdGFnQ291bnRdOworCisgICAgLy8gR2V0IGFsbCB0YWcgaWRzCisgICAgdkRlc2NPcmlnaW5hbC0+Z2V0VGFnQXJyYXkoZGVzY1RhZ0FycmF5KTsKKyAgICB2RGVzY1BhcmNlbGVkLT5nZXRUYWdBcnJheShkZXNjMlRhZ0FycmF5KTsKKworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjVGFnQXJyYXkpOworICAgIEFTU0VSVF9OT1RfTlVMTChkZXNjMlRhZ0FycmF5KTsKKworICAgIHVpbnQzMl90IHRhZzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyArK2kpIHsKKyAgICAgICAgLy8gRm9yIGVhY2ggdGFnIGlkLCBjaGVjayBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSB0d28gdmVuZG9yIHRhZworICAgICAgICAvLyBkZXNjcmlwdG9ycyBmb3IgZWFjaCB0eXBlLCBzZWN0aW9uIG5hbWUsIHRhZyBuYW1lCisgICAgICAgIHRhZyA9IGRlc2NUYWdBcnJheVtpXTsKKyAgICAgICAgRVhQRUNUX0NPTlRBSU5TX1RBRyh0YWcsIGRlc2MyVGFnQXJyYXkpOworICAgICAgICBFWFBFQ1RfRVEodkRlc2NPcmlnaW5hbC0+Z2V0VGFnVHlwZSh0YWcpLCB2RGVzY1BhcmNlbGVkLT5nZXRUYWdUeXBlKHRhZykpOworICAgICAgICBFWFBFQ1RfU1RSRVEodkRlc2NPcmlnaW5hbC0+Z2V0U2VjdGlvbk5hbWUodGFnKSwgdkRlc2NQYXJjZWxlZC0+Z2V0U2VjdGlvbk5hbWUodGFnKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh2RGVzY09yaWdpbmFsLT5nZXRUYWdOYW1lKHRhZyksIHZEZXNjUGFyY2VsZWQtPmdldFRhZ05hbWUodGFnKSk7CisgICAgfQorfQorCisvKioKKyAqIFRlc3QgZGVmYXVsdHMgYW5kIGVycm9yIGNvbmRpdGlvbnMuCisgKi8KK1RFU1QoVmVuZG9yVGFnRGVzY3JpcHRvclRlc3QsIEVycm9yQ29uZGl0aW9ucykgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZEZXNjOworICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wczsKKyAgICBGaWxsV2l0aERlZmF1bHRzKCZ2T3BzKTsKKworICAgIC8vIEVuc3VyZSBjcmVhdGUgZmFpbHMgd2hlbiB1c2luZyBudWxsIHZPcHMKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygvKnZPcHMqL05VTEwsIHZEZXNjKSk7CisKKyAgICAvLyBFbnN1cmUgY3JlYXRlIHdvcmtzIHdoZW4gdGhlcmUgYXJlIG5vIHZ0YWdzIGRlZmluZWQgaW4gYSB3ZWxsLWZvcm1lZCB2T3BzCisgICAgQVNTRVJUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbU9wcygmdk9wcywgdkRlc2MpKTsKKworICAgIC8vIEVuc3VyZSBkZWZhdWx0cyBhcmUgcmV0dXJuZWQgd2hlbiBubyB2dGFncyBhcmUgZGVmaW5lZCwgb3IgdGFnIGlzIHVua25vd24KKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19DT1VOVF9FUlIsIHZEZXNjLT5nZXRUYWdDb3VudCgpKTsKKyAgICB1aW50MzJfdCogdGFnQXJyYXkgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oQkFEX1RBR19BUlJBWSk7CisgICAgdWludDMyX3QqIHRlc3RBcnJheSA9IHRhZ0FycmF5OworICAgIHZEZXNjLT5nZXRUYWdBcnJheSh0YWdBcnJheSk7CisgICAgRVhQRUNUX0VRKHRlc3RBcnJheSwgdGFnQXJyYXkpOworICAgIEVYUEVDVF9FUShWRU5ET1JfU0VDVElPTl9OQU1FX0VSUiwgdkRlc2MtPmdldFNlY3Rpb25OYW1lKEJBRF9UQUcpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1RBR19OQU1FX0VSUiwgdkRlc2MtPmdldFRhZ05hbWUoQkFEX1RBRykpOworICAgIEVYUEVDVF9FUShWRU5ET1JfVEFHX1RZUEVfRVJSLCB2RGVzYy0+Z2V0VGFnVHlwZShCQURfVEFHKSk7CisKKyAgICAvLyBNYWtlIHN1cmUgZ2xvYmFsIGNhbiBiZSBzZXQvY2xlYXJlZAorICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKmZha2VPcHMgPSAmZmFrZXZlbmRvcl9vcHM7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gcHJldkdsb2JhbCA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSA9PSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoT0ssIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcih2RGVzYykpOworICAgIEVYUEVDVF9UUlVFKFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1NFQ1RJT05fTkFNRV9FUlIsIHZEZXNjLT5nZXRTZWN0aW9uTmFtZShCQURfVEFHKSk7CisgICAgRVhQRUNUX0VRKE9LLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IocHJldkdsb2JhbCkpOworICAgIEVYUEVDVF9FUShwcmV2R2xvYmFsLCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCkpOworfQorCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5jcHAKaW5kZXggNmMzNzUwMS4uMDNlMDA2MiAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmNwcApAQCAtNjcsOSArNjcsMTEgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKC8qbmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKi8pOwotICAgIG1HbENvbnN1bWVyID0gbmV3IEdMQ29uc3VtZXIobUJ1ZmZlclF1ZXVlLCBtRXh0VGV4dHVyZU5hbWUsCi0gICAgICAgICAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtNzksNyArODEsNyBAQAogCiAgICAgbVBpeGVsQnVmID0gbmV3IHVpbnQ4X3Rbd2lkdGggKiBoZWlnaHQgKiBrR2xCeXRlc1BlclBpeGVsXTsKIAotICAgICpwQnVmZmVyUHJvZHVjZXIgPSBtQnVmZmVyUXVldWU7CisgICAgKnBCdWZmZXJQcm9kdWNlciA9IHByb2R1Y2VyOwogCiAgICAgQUxPR0QoIkZyYW1lT3V0cHV0OjpjcmVhdGVJbnB1dFN1cmZhY2UgT0siKTsKICAgICByZXR1cm4gTk9fRVJST1I7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oIGIvY21kcy9zY3JlZW5yZWNvcmQvRnJhbWVPdXRwdXQuaAppbmRleCA0YWMzZThhLi5jNDllYzNiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9GcmFtZU91dHB1dC5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0ZyYW1lT3V0cHV0LmgKQEAgLTM0LDkgKzM0LDYgQEAKICAgICAgICAgbUV4dFRleHR1cmVOYW1lKDApLAogICAgICAgICBtUGl4ZWxCdWYoTlVMTCkKICAgICAgICAge30KLSAgICB2aXJ0dWFsIH5GcmFtZU91dHB1dCgpIHsKLSAgICAgICAgZGVsZXRlW10gbVBpeGVsQnVmOwotICAgIH0KIAogICAgIC8vIENyZWF0ZSBhbiAiaW5wdXQgc3VyZmFjZSIsIHNpbWlsYXIgaW4gcHVycG9zZSB0byBhIE1lZGlhQ29kZWMgaW5wdXQKICAgICAvLyBzdXJmYWNlLCB0aGF0IHRoZSB2aXJ0dWFsIGRpc3BsYXkgY2FuIHNlbmQgYnVmZmVycyB0by4gIEFsc28gY29uZmlndXJlcwpAQCAtNTksNiArNTYsMTEgQEAKICAgICBGcmFtZU91dHB1dChjb25zdCBGcmFtZU91dHB1dCYpOwogICAgIEZyYW1lT3V0cHV0JiBvcGVyYXRvcj0oY29uc3QgRnJhbWVPdXRwdXQmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfkZyYW1lT3V0cHV0KCkgeworICAgICAgICBkZWxldGVbXSBtUGl4ZWxCdWY7CisgICAgfQorCiAgICAgLy8gKG92ZXJyaWRlcyBHTENvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIG1ldGhvZCkKICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOwogCkBAIC03NSwxMCArNzcsNiBAQAogICAgIC8vIFNldCBieSB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBjYWxsYmFjay4KICAgICBib29sIG1GcmFtZUF2YWlsYWJsZTsKIAotICAgIC8vIE91ciBxdWV1ZS4gIFRoZSBwcm9kdWNlciBzaWRlIGlzIHBhc3NlZCB0byB0aGUgdmlydHVhbCBkaXNwbGF5LCB0aGUKLSAgICAvLyBjb25zdW1lciBzaWRlIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCi0gICAgc3A8QnVmZmVyUXVldWU+IG1CdWZmZXJRdWV1ZTsKLQogICAgIC8vIFRoaXMgcmVjZWl2ZXMgZnJhbWVzIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUKICAgICAvLyBhcyBhbiBleHRlcm5hbCB0ZXh0dXJlLgogICAgIHNwPEdMQ29uc3VtZXI+IG1HbENvbnN1bWVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAppbmRleCA5NmUyNWI4Li43ZmVmNTNkIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjZGVmaW5lIExPR19UQUcgIlNjcmVlblJlY29yZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI3LDkgKzMxLDYgQEAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCiAjaW5jbHVkZSAiT3ZlcmxheS5oIgogI2luY2x1ZGUgIlRleHRSZW5kZXJlci5oIgpAQCAtNDcsNyArNDgsNyBAQAogICAgICAgICAicm8ucmV2aXNpb24iLAogICAgICAgICAiZGFsdmlrLnZtLmhlYXBncm93dGhsaW1pdCIsCiAgICAgICAgICJkYWx2aWsudm0uaGVhcHNpemUiLAotICAgICAgICAicGVyc2lzdC5zeXMuZGFsdmlrLnZtLmxpYiIsCisgICAgICAgICJwZXJzaXN0LnN5cy5kYWx2aWsudm0ubGliLjIiLAogICAgICAgICAvLyJyby5wcm9kdWN0LmNwdS5hYmkiLAogICAgICAgICAvLyJyby5ib290bG9hZGVyIiwKICAgICAgICAgLy8idGhpcy1uZXZlci1hcHBlYXJzISIsCkBAIC04NCw3ICs4NSw3IEBACiAgICAgYXNzZXJ0KG1TdGF0ZSA9PSBSVU5OSU5HKTsKIAogICAgIEFMT0dWKCJPdmVybGF5OjpzdGFydCBzdWNjZXNzZnVsIik7Ci0gICAgKnBCdWZmZXJQcm9kdWNlciA9IG1CdWZmZXJRdWV1ZTsKKyAgICAqcEJ1ZmZlclByb2R1Y2VyID0gbVByb2R1Y2VyOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTY5LDkgKzE3MCwxMCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtQnVmZmVyUXVldWUgPSBuZXcgQnVmZmVyUXVldWUoLypuZXcgR3JhcGhpY0J1ZmZlckFsbG9jKCkqLyk7Ci0gICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihtQnVmZmVyUXVldWUsIG1FeHRUZXh0dXJlTmFtZSwKLSAgICAgICAgICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUdsQ29uc3VtZXIgPSBuZXcgR0xDb25zdW1lcihjb25zdW1lciwgbUV4dFRleHR1cmVOYW1lLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB0cnVlLCBmYWxzZSk7CiAgICAgbUdsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgidmlydHVhbCBkaXNwbGF5IikpOwogICAgIG1HbENvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICBtR2xDb25zdW1lci0+c2V0RGVmYXVsdE1heEJ1ZmZlckNvdW50KDUpOwpAQCAtMTg3LDcgKzE4OSw3IEBACiAgICAgQUxPR1YoIk92ZXJsYXk6OnJlbGVhc2VfbCIpOwogICAgIG1PdXRwdXRTdXJmYWNlLmNsZWFyKCk7CiAgICAgbUdsQ29uc3VtZXIuY2xlYXIoKTsKLSAgICBtQnVmZmVyUXVldWUuY2xlYXIoKTsKKyAgICBtUHJvZHVjZXIuY2xlYXIoKTsKIAogICAgIG1UZXhQcm9ncmFtLnJlbGVhc2UoKTsKICAgICBtRXh0VGV4UHJvZ3JhbS5yZWxlYXNlKCk7CkBAIC0yMzQsNyArMjM2LDcgQEAKIAogICAgIGNoYXIgdGV4dEJ1Zls2NF07CiAgICAgZ2V0VGltZVN0cmluZ19sKG1vbm90b25pY05zZWMsIHRleHRCdWYsIHNpemVvZih0ZXh0QnVmKSk7Ci0gICAgU3RyaW5nOCB0aW1lU3RyKFN0cmluZzg6OmZvcm1hdCgiJXMgZj0lbGxkICglemQpIiwKKyAgICBTdHJpbmc4IHRpbWVTdHIoU3RyaW5nODo6Zm9ybWF0KCIlcyBmPSUiIFBSSWQ2NCAiICglemQpIiwKICAgICAgICAgICAgIHRleHRCdWYsIGZyYW1lTnVtYmVyLCBtVG90YWxEcm9wcGVkRnJhbWVzKSk7CiAgICAgbVRleHRSZW5kZXJlci5kcmF3U3RyaW5nKG1UZXhQcm9ncmFtLCBQcm9ncmFtOjprSWRlbnRpdHksIDAsIDAsIHRpbWVTdHIpOwogCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmggYi9jbWRzL3NjcmVlbnJlY29yZC9PdmVybGF5LmgKaW5kZXggYjg0NzNiNC4uYjFiNWMyOSAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvT3ZlcmxheS5oCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL092ZXJsYXkuaApAQCAtNDcsNyArNDcsNiBAQAogICAgICAgICBtTGFzdEZyYW1lTnVtYmVyKC0xKSwKICAgICAgICAgbVRvdGFsRHJvcHBlZEZyYW1lcygwKQogICAgICAgICB7fQotICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KIAogICAgIC8vIENyZWF0ZXMgYSB0aHJlYWQgdGhhdCBwZXJmb3JtcyB0aGUgb3ZlcmxheS4gIFBhc3MgaW4gdGhlIHN1cmZhY2UgdGhhdAogICAgIC8vIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8uCkBAIC03MSw2ICs3MCw5IEBACiAgICAgT3ZlcmxheShjb25zdCBPdmVybGF5Jik7CiAgICAgT3ZlcmxheSYgb3BlcmF0b3I9KGNvbnN0IE92ZXJsYXkmKTsKIAorICAgIC8vIERlc3RydWN0aW9uIHZpYSBSZWZCYXNlLgorICAgIHZpcnR1YWwgfk92ZXJsYXkoKSB7IGFzc2VydChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gU1RPUFBFRCk7IH0KKwogICAgIC8vIERyYXcgdGhlIGluaXRpYWwgaW5mbyBzY3JlZW4uCiAgICAgc3RhdGljIHZvaWQgZG9EcmF3SW5mb1BhZ2UoY29uc3QgRWdsV2luZG93JiB3aW5kb3csCiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtJiB0ZXhSZW5kZXIsIFRleHRSZW5kZXJlciYgdGV4dFJlbmRlcmVyKTsKQEAgLTEyMCw5ICsxMjIsOSBAQAogICAgIC8vIHN1cmZhY2UuCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbU91dHB1dFN1cmZhY2U7CiAKLSAgICAvLyBPdXIgcXVldWUuICBUaGUgcHJvZHVjZXIgc2lkZSBpcyBwYXNzZWQgdG8gdGhlIHZpcnR1YWwgZGlzcGxheSwgdGhlCi0gICAgLy8gY29uc3VtZXIgc2lkZSBmZWVkcyBpbnRvIG91ciBHTENvbnN1bWVyLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gUHJvZHVjZXIgc2lkZSBvZiBxdWV1ZSwgcGFzc2VkIGludG8gdGhlIHZpcnR1YWwgZGlzcGxheS4KKyAgICAvLyBUaGUgY29uc3VtZXIgZW5kIGZlZWRzIGludG8gb3VyIEdMQ29uc3VtZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgLy8gVGhpcyByZWNlaXZlcyBmcmFtZXMgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFuZCBtYWtlcyB0aGVtIGF2YWlsYWJsZQogICAgIC8vIGFzIGFuIGV4dGVybmFsIHRleHR1cmUuCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvVGV4dFJlbmRlcmVyLmNwcAppbmRleCA3ODQwNTVjLi42YTkxNzZiIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9UZXh0UmVuZGVyZXIuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL1RleHRSZW5kZXJlci5jcHAKQEAgLTM1Myw2ICszNTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoImdvb2RQb3M9JWQgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKKyAgICBBTE9HVigiZ29vZFBvcz0lenUgZm9yIHN0cj0nJXMnIiwgZ29vZFBvcywgc3RyKTsKICAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oc3RyICsgZ29vZFBvcyk7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCAwMmVkNTNhLi4wMmRmMWQyIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTE0LDYgKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogI2RlZmluZSBMT0dfVEFHICJTY3JlZW5SZWNvcmQiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwogLy8jZGVmaW5lIExPR19OREVCVUcgMApAQCAtMzYsMTggKzQ5LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KICNpbmNsdWRlICJzY3JlZW5yZWNvcmQuaCIKICNpbmNsdWRlICJPdmVybGF5LmgiCiAjaW5jbHVkZSAiRnJhbWVPdXRwdXQuaCIKQEAgLTM1NCw3ICszNTUsNyBAQAogICAgICAgICBjYXNlIE5PX0VSUk9SOgogICAgICAgICAgICAgLy8gZ290IGEgYnVmZmVyCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGNvZGVjIGNvbmZpZyBidWZmZXIgKCV1IGJ5dGVzKSIsIHNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3QgY29kZWMgY29uZmlnIGJ1ZmZlciAoJXp1IGJ5dGVzKSIsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChtdXhlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIC0tIHdlIHBhc3NlZCB0aGUgQ1NEIGludG8gTWVkaWFNdXhlciB3aGVuCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGdvdCB0aGUgZm9ybWF0IGNoYW5nZSBub3RpZmljYXRpb24KQEAgLTM2Miw3ICszNjMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiR290IGRhdGEgaW4gYnVmZmVyICVkLCBzaXplPSVkLCBwdHM9JWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBkYXRhIGluIGJ1ZmZlciAlenUsIHNpemU9JXp1LCBwdHM9JSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5kZXgsIHNpemUsIHB0c1VzZWMpOwogCiAgICAgICAgICAgICAgICAgeyAvLyBzY29wZQpAQCAtNDczLDcgKzQ3NCw3IEBACiAKICAgICBBTE9HVigiRW5jb2RlciBzdG9wcGluZyAocmVxPSVkKSIsIGdTdG9wUmVxdWVzdGVkKTsKICAgICBpZiAoZ1ZlcmJvc2UpIHsKLSAgICAgICAgcHJpbnRmKCJFbmNvZGVyIHN0b3BwaW5nOyByZWNvcmRlZCAldSBmcmFtZXMgaW4gJWxsZCBzZWNvbmRzXG4iLAorICAgICAgICBwcmludGYoIkVuY29kZXIgc3RvcHBpbmc7IHJlY29yZGVkICV1IGZyYW1lcyBpbiAlIiBQUklkNjQgIiBzZWNvbmRzXG4iLAogICAgICAgICAgICAgICAgIGRlYnVnTnVtRnJhbWVzLCBuYW5vc2Vjb25kc190b19zZWNvbmRzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRXaGVuTnNlYykpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAppbmRleCA1ZDJkNzIxLi4xYjJmNzkyIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0yNzUsNyArMjc2LDggQEAKIAogICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKIAotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobVBhdGguY19zdHIoKSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAppbmRleCAxNGI0MzA2Li41ODcwNzdhIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFNpbmVTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBzdGF0dXNfdCBTaW5lU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCBlZDdkNmNiLi45NjA3M2YxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xLDQgKzEsMTggQEAKLSNpbmNsdWRlICJTaW5lU291cmNlLmgiCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CkBAIC0xMCw0MSArMjQsNzkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1pbnQgbWFpbigpIHsKLSAgICAvLyBXZSBvbmx5IGhhdmUgYW4gQU1SLVdCIGVuY29kZXIgb24gc2hvbGVzLi4uCi0gICAgc3RhdGljIGJvb2wgb3V0cHV0V0JBTVIgPSBmYWxzZTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1DaGFubmVscyA9IDE7CitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdXJhdGlvbl0gWy1tXSBbLXddIFs8b3V0cHV0LWZpbGU+XVxuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVzIGVpdGhlciBhIHNpbmUgd2F2ZSBvciBtaWNyb3Bob25lIGlucHV0IHRvIEFNUiBmb3JtYXRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1kICAgIGR1cmF0aW9uIGluIHNlY29uZHMsIGRlZmF1bHQgNSBzZWNvbmRzXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtbSAgICB1c2UgbWljcm9waG9uZSBmb3IgaW5wdXQsIGRlZmF1bHQgc2luZSBzb3VyY2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC13ICAgIHVzZSBBTVIgd2lkZWJhbmQgKGRlZmF1bHQgbmFycm93YmFuZClcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIDxvdXRwdXQtZmlsZT4gb3V0cHV0IGZpbGUgZm9yIEFNUiBlbmNvZGluZywiCisgICAgICAgICAgICAiIGlmIHVuc3BlY2lmaWVkLCBkZWNvZGUgdG8gc3BlYWtlci5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgY2hhbm5lbHMgPSAxOyAvLyBub3QgcGVybWl0dGVkIHRvIGJlIHN0ZXJlbyBub3cKKyAgICB1bnNpZ25lZCBkdXJhdGlvbiA9IDU7CisgICAgYm9vbCB1c2VNaWMgPSBmYWxzZTsKKyAgICBib29sIG91dHB1dFdCQU1SID0gZmFsc2U7CisgICAgYm9vbCBwbGF5VG9TcGVha2VyID0gdHJ1ZTsKKyAgICBjb25zdCBjaGFyKiBmaWxlT3V0ID0gTlVMTDsKKyAgICBpbnQgY2g7CisgICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptdyIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB1c2VNaWMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgb3V0cHV0V0JBTVIgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKyAgICBpZiAoYXJnYyA9PSAxKSB7CisgICAgICAgIGZpbGVPdXQgPSBhcmd2WzBdOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7CisgICAgY29uc3QgaW50MzJfdCBrQml0UmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOwogCiAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgT01YQ2xpZW50IGNsaWVudDsKICAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CiAKLSNpZiAwCi0gICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKGtTYW1wbGVSYXRlLCBrTnVtQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsCi0gICAgICAgICAgICBrU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGtOdW1DaGFubmVscykpOwotI2VuZGlmCisgICAgaWYgKHVzZU1pYykgeworICAgICAgICAvLyB0YWxrIGludG8gdGhlIGFwcHJvcHJpYXRlIG1pY3JvcGhvbmUgZm9yIHRoZSBkdXJhdGlvbgorICAgICAgICBzb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCisgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdXNlIGEgc2luZSBzb3VyY2UgYXQgNTAwIGh6LgorICAgICAgICBzb3VyY2UgPSBuZXcgU2luZVNvdXJjZShrU2FtcGxlUmF0ZSwgY2hhbm5lbHMpOworICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCiAgICAgbWV0YS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKICAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKIAotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGtOdW1DaGFubmVscyk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbHMpOwogICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7Ci0KKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwga0JpdFJhdGUpOwogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIGlmIChzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKQEAgLTU1LDQ3ICsxMDcsNDEgQEAKICAgICAgICAgICAgIG1ldGEsIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywKICAgICAgICAgICAgIHNvdXJjZSk7CiAKLSNpZiAxCi0gICAgc3A8QU1SV3JpdGVyPiB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKCIvc2RjYXJkL291dC5hbXIiKTsKLSAgICB3cml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKLSAgICB3cml0ZXItPnN0YXJ0KCk7Ci0gICAgc2xlZXAoMTApOwotICAgIHdyaXRlci0+c3RvcCgpOwotI2Vsc2UKLSAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBtZXRhLCBmYWxzZSAvKiBjcmVhdGVFbmNvZGVyICovLAotICAgICAgICAgICAgZW5jb2Rlcik7CisgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgeworICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dAorICAgICAgICBzcDxBTVJXcml0ZXI+IHdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmlsZU91dCk7CisgICAgICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOworICAgICAgICB3cml0ZXItPnN0YXJ0KCk7CisgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVyLT5zdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3RoZXJ3aXNlIGRlY29kZSB0byBzcGVha2VyCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCisgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywKKyAgICAgICAgICAgICAgICBlbmNvZGVyKTsKIAotI2lmIDAKLSAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwotICAgIHBsYXllci0+c2V0U291cmNlKGRlY29kZXIpOwotCi0gICAgcGxheWVyLT5zdGFydCgpOwotCi0gICAgc2xlZXAoMTApOwotCi0gICAgcGxheWVyLT5zdG9wKCk7Ci0KLSAgICBkZWxldGUgcGxheWVyOwotICAgIHBsYXllciA9IE5VTEw7Ci0jZWxpZiAwCi0gICAgQ0hFQ0tfRVEoZGVjb2Rlci0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggYnVmZmVyCi0KLSAgICAgICAgcHV0Y2hhcignLicpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKHBsYXlUb1NwZWFrZXIpIHsKKyAgICAgICAgICAgIEF1ZGlvUGxheWVyICpwbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoTlVMTCk7CisgICAgICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShkZWNvZGVyKTsKKyAgICAgICAgICAgIHBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgICAgIHNsZWVwKGR1cmF0aW9uKTsKKyAgICAgICAgICAgIHNvdXJjZS0+c3RvcCgpOyAvLyBtdXN0IHN0b3Agc291cmNlIG90aGVyd2lzZSBkZWxldGUgcGxheWVyIHdpbGwgaGFuZworICAgICAgICAgICAgZGVsZXRlIHBsYXllcjsgLy8gdGhlcmUgaXMgbm8gcGxheWVyLT5zdG9wKCkuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCBidWZmZXIgKHNhdmUgaXQgZXZlbnR1YWxseT8pCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIGFmdGVyIHNvbWUgY291bnQgdGhvdWdoLi4uCisgICAgICAgICAgICAgICAgcHV0Y2hhcignLicpOworICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7Ci0jZW5kaWYKLSNlbmRpZgotCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IGZkZmVmZGYuLmZkMDJiY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiY29kZWMiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNpbXBsZVBsYXllci5oIgpAQCAtMjMsNiArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NSw3ICs3Nyw3IEBACiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0yOTEsMTMgKzI5MywxMyBAQAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2UoKSk7CiAKICAgICAgICAgaWYgKHN0YXRlLT5tSXNBdWRpbykgewotICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlZDogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICBwcmludGYoInRyYWNrICV6dTogJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAogICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKiAxRTYgLyAxMDI0IC8gZWxhcHNlZFRpbWVVcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoInRyYWNrICVkOiAlbGxkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJXp1OiAlIiBQUklkNjQgIiBmcmFtZXMgZGVjb2RlZCwgJS4yZiBmcHMuICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCAqIDFFNiAvIGVsYXBzZWRUaW1lVXMsCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L211eGVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCmluZGV4IGNjYTMzZTAuLmY0YTMzZTggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwCkBAIC0xNiw5ICsxNiwxMSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIm11eGVyIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtNTgsNyArNjAsNyBAQAogICAgICAgICBpbnQgdHJpbUVuZFRpbWVNcywKICAgICAgICAgaW50IHJvdGF0aW9uRGVncmVlcykgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKKyAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0xOTgsNyArMjAwLDcgQEAKICAgICB0cmFja0luZGV4TWFwLmNsZWFyKCk7CiAKICAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbXV4ZXJTdGFydFRpbWVVczsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlNVQ0NFU1M6IG11eGVyIGdlbmVyYXRlIHRoZSB2aWRlbyBpbiAlbGxkIG1zXG4iLAorICAgIGZwcmludGYoc3RkZXJyLCAiU1VDQ0VTUzogbXV4ZXIgZ2VuZXJhdGUgdGhlIHZpZGVvIGluICUiIFBSSWQ2NCAiIG1zXG4iLAogICAgICAgICAgICAgZWxhcHNlZFRpbWVVcyAvIDEwMDApOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggYjdhNDBjMi4uZmRjMzUyZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMjk2LDcgKzI5Niw3IEBACiB9CiAjZWxzZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyICoqIC8qIGFyZ3YgKi8pIHsKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAppbmRleCBjMzBjMTIyLi45ZjU0N2M3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgpAQCAtNzIsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgX191bnVzZWQpIHsKICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC04Miw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgewogCiAgICAgICAgIGlmIChtTnVtRnJhbWVzT3V0cHV0ICUgMTAgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIuIik7CkBAIC05OSw4ICsxMDAsMTIgQEAKICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMuIHdlIGp1c3QgdGVzdCB2aWRlbyBlbmNvZGVyCiAgICAgICAgIC8vIEFsc28sIGJ5IHNraXBwaW5nIHRoZSBjb250ZW50IGdlbmVyYXRpb24sIHdlIGNhbiByZXR1cm4gZnJvbQogICAgICAgICAvLyByZWFkKCkgbXVjaCBmYXN0ZXIuCi0gICAgICAgIC8vY2hhciB4ID0gKGNoYXIpKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggKiAyNTUpOwotICAgICAgICAvL21lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworI2lmIDAKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHNvbGlkIHBsYW5lcyBvZiBjb2xvci4KKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgeCA9IDB4NjA7CisgICAgICAgIG1lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworICAgICAgICB4ID0geCA+PSAweGEwID8gMHg2MCA6IHggKyAxOworI2VuZGlmCiAgICAgICAgICgqYnVmZmVyKS0+c2V0X3JhbmdlKDAsIG1TaXplKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCkBAIC0xNjIsNyArMTY3LDcgQEAKICAgICBpbnQgbGV2ZWwgPSAtMTsgICAgICAgIC8vIEVuY29kZXIgc3BlY2lmaWMgZGVmYXVsdAogICAgIGludCBwcm9maWxlID0gLTE7ICAgICAgLy8gRW5jb2RlciBzcGVjaWZpYyBkZWZhdWx0CiAgICAgaW50IGNvZGVjID0gMDsKLSAgICBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dC5tcDQiOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gIi9zZGNhcmQvb3V0cHV0Lm1wNCI7CiAgICAgYm9vbCBwcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CkBAIC0zMTIsNyArMzE3LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyZWNvcmQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICVsbGQgdXNcbiIsIG5GcmFtZXMsIChlbmQtc3RhcnQpLzEwMDApOworICAgIGZwcmludGYoc3RkZXJyLCAiZW5jb2RpbmcgJWQgZnJhbWVzIGluICUiIFBSSWQ2NCAiIHVzXG4iLCBuRnJhbWVzLCAoZW5kLXN0YXJ0KS8xMDAwKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgImVuY29kaW5nIHNwZWVkIGlzOiAlLjJmIGZwc1xuIiwgKG5GcmFtZXMgKiAxRTkpIC8gKGVuZC1zdGFydCkpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zZjIuY3BwCmluZGV4IGM4MTc0NDMuLjBmNzI5YTMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc2YyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3NmMi5jcHAKQEAgLTE2LDEwICsxNiwxNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgInNmMiIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTQyLDYgKzQ3LDE4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCit2b2xhdGlsZSBzdGF0aWMgYm9vbCBjdHJsYyA9IGZhbHNlOworCitzdGF0aWMgc2lnaGFuZGxlcl90IG9sZGhhbmRsZXIgPSBOVUxMOworCitzdGF0aWMgdm9pZCBteXNpZ2hhbmRsZXIoaW50IHNpZ251bSkgeworICAgIGlmIChzaWdudW0gPT0gU0lHSU5UKSB7CisgICAgICAgIGN0cmxjID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvbGRoYW5kbGVyKHNpZ251bSk7Cit9CisKIHN0cnVjdCBDb250cm9sbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBDb250cm9sbGVyKGNvbnN0IGNoYXIgKnVyaSwgYm9vbCBkZWNvZGVBdWRpbywKICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBib29sIHJlbmRlclRvU3VyZmFjZSkKQEAgLTYyLDcgKzc5LDMwIEBACiAgICAgdmlydHVhbCB+Q29udHJvbGxlcigpIHsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0aXN0aWNzKCkgeworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVN0YXJ0VGltZVVzOworCisgICAgICAgIGlmIChtRGVjb2RlQXVkaW8pIHsKKyAgICAgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICIgYnl0ZXMgcmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJSIgUFJJZDY0ICIgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgbU51bU91dHB1dEJ1ZmZlcnNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAorICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCwKKyAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaWYgKGN0cmxjKSB7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICBwcmludFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIGN0cmxjID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgogICAgICAgICAgICAgewpAQCAtNzUsNyArMTE1LDggQEAKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkobVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtVVJJLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9CiAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CkBAIC05OCw3ICsxMzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vICVzIHRyYWNrIGZvdW5kXG4iLCBtRGVjb2RlQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKQEAgLTE2Nyw0MiArMjExLDI4IEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKIAotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGaWxsVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAoKG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQrKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgb25EcmFpblRoaXNCdWZmZXIobXNnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdEVPUwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCh3aGF0ID09IEFDb2RlYzo6a1doYXRFT1MpID8gIiRcbiIgOiAiRVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRFT1MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdoYXQgPT0gQ29kZWNCYXNlOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50Zigod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0RU9TKSA/ICIkXG4iIDogIkVcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtU3RhcnRUaW1lVXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVBdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlbGxkIGJ5dGVzIHJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxCeXRlc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQgKiAxRTYgLyAxMDI0IC8gZGVsYXlVcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIGZyYW1lcyBkZWNvZGVkLCAlLjJmIGZwcy4gJWxsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY2VpdmVkLiAlLjJmIEtCL3NlY1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtT3V0cHV0QnVmZmVyc1JlY2VpdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1PdXRwdXRCdWZmZXJzUmVjZWl2ZWQgKiAxRTYgLyBkZWxheVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ5dGVzUmVjZWl2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnl0ZXNSZWNlaXZlZCAqIDFFNiAvIDEwMjQgLyBkZWxheVVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHByaW50U3RhdGlzdGljcygpOwogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtTdGF0ZSA9IFNFRUtfRkxVU0hfQ09NUExFVEVEOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKSktPnBvc3QoNTAwMDAwMGxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gQUNvZGVjOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgICAgICBtRGVjb2RlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVjb2RlTG9vcGVyICE9IGxvb3BlcigpKSB7CkBAIC0yMTAsMTIgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsb29wZXIoKS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNvbWV0aGluZyB3ZW50IHdyb25nLCBjb2RlYyByZXBvcnRlZCBhbiBlcnJvci4iKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBpZCgpKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MzgsNiArNjYyLDggQEAKIAogICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKGNvbnRyb2xsZXIpOwogCisgICAgc2lnbmFsKFNJR0lOVCwgbXlzaWdoYW5kbGVyKTsKKwogICAgIGNvbnRyb2xsZXItPnN0YXJ0QXN5bmMoKTsKIAogICAgIENIRUNLX0VRKGxvb3Blci0+c3RhcnQodHJ1ZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pLCAoc3RhdHVzX3QpT0spOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzBiZjFiLi44MWVkY2I0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMTQsMjAgKzE0LDIyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhZ2VmcmlnaHQiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQogI2luY2x1ZGUgImpwZWcuaCIKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCkBAIC00OSw4ICs1MSw2IEBACiAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgpAQCAtODksOCArODksOCBAQAogICAgIGludDY0X3QgbWluVXMgPSBkZWNvZGVUaW1lc1VzLT5pdGVtQXQoMCk7CiAgICAgaW50NjRfdCBtYXhVcyA9IGRlY29kZVRpbWVzVXMtPml0ZW1BdChuIC0gMSk7CiAKLSAgICBwcmludGYoIm1pbiBkZWNvZGUgdGltZSAlbGxkIHVzICglLjJmIHNlY3MpXG4iLCBtaW5VcywgbWluVXMgLyAxRTYpOwotICAgIHByaW50ZigibWF4IGRlY29kZSB0aW1lICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CisgICAgcHJpbnRmKCJtaW4gZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1pblVzLCBtaW5VcyAvIDFFNik7CisgICAgcHJpbnRmKCJtYXggZGVjb2RlIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsIG1heFVzLCBtYXhVcyAvIDFFNik7CiAKICAgICBzaXplX3QgY291bnRzWzEwMF07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGludDY0X3Qgc2xvdFVzID0gbWluVXMgKyAoaSAqIChtYXhVcyAtIG1pblVzKSAvIDEwMCk7CiAKICAgICAgICAgZG91YmxlIGZwcyA9IDFFNiAvIHNsb3RVczsKLSAgICAgICAgcHJpbnRmKCJbJS4yZiBmcHNdOiAlZFxuIiwgZnBzLCBjb3VudHNbaV0pOworICAgICAgICBwcmludGYoIlslLjJmIGZwc106ICV6dVxuIiwgZnBzLCBjb3VudHNbaV0pOwogICAgIH0KIH0KIApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwcmludGYoImJ1ZmZlciBoYXMgdGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcylcbiIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJidWZmZXIgaGFzIHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyA9IChyYW5kKCkgKiAoZmxvYXQpZHVyYXRpb25VcykgLyBSQU5EX01BWDsKICAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKIAotICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgIHByaW50Zigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgICAvLyBzaXplcyBtYXkgYmUgZGlmZmVyZW50IGFjcm9zcyBkZWNvZGVycy4KICAgICAgICAgcHJpbnRmKCJhdmcuICUuMmYgS0Ivc2VjXG4iLCB0b3RhbEJ5dGVzIC8gMTAyNCAqIDFFNiAvIGRlbGF5KTsKIAotICAgICAgICBwcmludGYoImRlY29kZWQgYSB0b3RhbCBvZiAlbGxkIGJ5dGVzXG4iLCB0b3RhbEJ5dGVzKTsKKyAgICAgICAgcHJpbnRmKCJkZWNvZGVkIGEgdG90YWwgb2YgJSIgUFJJZDY0ICIgYnl0ZXNcbiIsIHRvdGFsQnl0ZXMpOwogICAgIH0KIH0KIApAQCAtNTc0LDcgKzU3NCw4IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCi0gICAgICAgICAgICBwcmludGYoIiVsbGRcdCVsbGRcdCVsbGRcbiIsIHNlZWtUaW1lVXMsIHRpbWVVcywgc2Vla1RpbWVVcyAtIHRpbWVVcyk7CisgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlx0JSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9CiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwogCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyVsZC8lbGQiLCBqID4gMCA/ICIsICIgOiAiIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzJSIgUFJJdTMyICIvJSIgUFJJdTMyLCBqID4gMCA/ICIsICIgOiAiIiwKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKICAgICAgICAgICAgIH0KIApAQCAtOTM4LDkgKzkzOSwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ0hFQ0sodXNlU3VyZmFjZVRleEFsbG9jKTsKIAotICAgICAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoYnEsIDAgLyogdGV4ICovKTsKLSAgICAgICAgICAgIGdTdXJmYWNlID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgICAgICBzcDxHTENvbnN1bWVyPiB0ZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIDAgLyogdGV4ICovLAorICAgICAgICAgICAgICAgICAgICBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLCB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworICAgICAgICAgICAgZ1N1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgICAgIH0KIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCkBAIC05NTgsNyArOTYzLDggQEAKIAogICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGFyZ3Zba107CiAKLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoZmlsZW5hbWUpOworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKQEAgLTEwNzEsNyArMTA3Nyw3IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRodW1iVGltZVVzOwogICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYlRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0aHVtYm5haWxUaW1lOiAlbGxkIHVzICglLjJmIHNlY3MpXG4iLAorICAgICAgICAgICAgICAgICAgICBwcmludGYoInRodW1ibmFpbFRpbWU6ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJUaW1lVXMsIHRodW1iVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAppbmRleCBkYmE2N2E5Li4wNTY2ZDE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE1OSw3ICsxNjAsOSBAQAogTXlDb252ZXJ0aW5nU3RyZWFtU291cmNlOjpNeUNvbnZlcnRpbmdTdHJlYW1Tb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtQ3VycmVudEJ1ZmZlckluZGV4KC0xKSwKICAgICAgIG1DdXJyZW50QnVmZmVyT2Zmc2V0KDApIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShmaWxlbmFtZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOwpAQCAtMzcxLDcgKzM3NCw3IEBACiAgICAgfQogCiAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPQotICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoY2xpZW50LCAwKTsKKyAgICAgICAgc2VydmljZS0+Y3JlYXRlKGNsaWVudCwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSk7CiAKICAgICBpZiAocGxheWVyICE9IE5VTEwgJiYgcGxheWVyLT5zZXREYXRhU291cmNlKHNvdXJjZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCmluZGV4IDU0MDBiZGQuLjU4NGM2YTYgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCisrKyBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1NaW1lVHlwZVZlY3Rvci5zaXplKCk7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1pbWVUeXBlVmVjdG9yLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1NaW1lVHlwZVZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIG1pbWVUeXBlLnN0cmluZygpKSkgewpAQCAtNTgsNyArNTgsNyBAQAogfQogCiBib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsZVN1ZmZpeFZlY3Rvci5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBTdHJpbmc4IGl0ZW0gPSBtRmlsZVN1ZmZpeFZlY3Rvci5pdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKGl0ZW0uc3RyaW5nKCksIGZpbGVUeXBlLnN0cmluZygpKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGRjOTczZGEuLmFhMGFiOWIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5taworKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQubWsKQEAgLTM5LDQgKzM5LDYgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGRjY2QyM2QuLmQ4YWViMGMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpsb2FkUGx1Z0lucyhjb25zdCBTdHJpbmc4JiBwbHVnSW5EaXJQYXRoKSB7CiAgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbnMocGx1Z0luRGlyUGF0aCk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoID0gcGx1Z0luUGF0aExpc3RbaV07CiAgICAgICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOwogICAgICAgICBpZiAoTlVMTCAhPSBpbmZvKSB7CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmICghbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKICAgICAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgICAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOwogICAgICAgICAgICAgckRybUVuZ2luZS5zZXRPbkluZm9MaXN0ZW5lcih1bmlxdWVJZCwgdGhpcyk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIHZvaWQgRHJtTWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJEcm1FbmdpbmUudGVybWluYXRlKHVuaXF1ZUlkKTsKICAgICB9CkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBib29sIHJlc3VsdCA9IGZhbHNlOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnSW5QYXRoTGlzdC5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luUGF0aExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5QYXRoTGlzdFtpXSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKIApAQCAtMzE4LDcgKzMxOCw3IEBACiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CiAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlQWxsUmlnaHRzKHVuaXF1ZUlkKTsKICAgICAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKQEAgLTQxMiw3ICs0MTIsNyBAQAogICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CiAgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CiAgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CiAgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKICAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIHVyaSwgbWltZSk7CkBAIC01NjUsNyArNTY1LDcgQEAKICAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKIAogICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgewogICAgICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZE1pbWVUeXBlKG1pbWVUeXBlKSkgewpAQCAtNTgxLDcgKzU4MSw3IEBACiAgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CiAgICAgY29uc3QgU3RyaW5nOCBmaWxlU3VmZml4ID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CiAKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CiAKICAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkRmlsZVN1ZmZpeChmaWxlU3VmZml4KSkgewpAQCAtNTk5LDcgKzU5OSw3IEBACiAKIHZvaWQgRHJtTWFuYWdlcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxpc3RlbmVyTG9jayk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1TZXJ2aWNlTGlzdGVuZXJzLnNpemUoKTsgaW5kZXgrKykgeworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtU2VydmljZUxpc3RlbmVycy5zaXplKCk7IGluZGV4KyspIHsKICAgICAgICAgaW50IHVuaXF1ZUlkID0gbVNlcnZpY2VMaXN0ZW5lcnMua2V5QXQoaW5kZXgpOwogCiAgICAgICAgIGlmICh1bmlxdWVJZCA9PSBldmVudC5nZXRVbmlxdWVJZCgpKSB7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDJiNzE5MDQuLjYzMzQxZTAgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zNCw3ICszNCwxOCBAQAogc3RhdGljIFZlY3Rvcjx1aWRfdD4gdHJ1c3RlZFVpZHM7CiAKIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgLy8gVE9ETworICAgIC8vIEZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGZvciByZWZlcmVuY2UuCisgICAgLy8gRWFjaCBPRU0gbWFudWZhY3R1cmVyIHNob3VsZCBpbXBsZW1lbnQvcmVwbGFjZSB3aXRoIHRoZWlyIG93biBzb2x1dGlvbnMuCisgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKaW5kZXggN2JiMTQzZi4uYzFkMDE5YSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5GaWxlTGlzdCA9IGdldFBsdWdJblBhdGhMaXN0KHJzUGx1Z0luRGlyUGF0aCk7CiAKICAgICAgICAgaWYgKCFwbHVnSW5GaWxlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGx1Z0luRmlsZUxpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBsb2FkUGx1Z0luKHBsdWdJbkZpbGVMaXN0W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAqCiAgICAgICovCiAgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wbHVnSW5JZExpc3Quc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIHVubG9hZFBsdWdJbihtX3BsdWdJbklkTGlzdFtpXSk7CiAgICAgICAgIH0KICAgICAgICAgbV9wbHVnSW5JZExpc3QuY2xlYXIoKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDIzNGFlZjIuLmY0MDA3MzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICBpZiAoLTEgPCBmaWxlRGVzYykgewogICAgICAgICBpZiAoRndkTG9ja0ZpbGVfYXR0YWNoKGZpbGVEZXNjKSA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIHJldHVybiBtaW1lU3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZSA9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjhkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCbG9ja0JpdENvdW50ID0ga0Jsb2NrU2l6ZSAqIDg7CisKK2FuZHJvaWQ6OnN0YXR1c190IEFlc0N0ckRlY3J5cHRvcjo6ZGVjcnlwdChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGtleSwKKyAgICAgICAgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwKKyAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICB1aW50MzJfdCBibG9ja09mZnNldCA9IDA7CisgICAgdWludDhfdCBwcmV2aW91c0VuY3J5cHRlZENvdW50ZXJba0Jsb2NrU2l6ZV07CisgICAgbWVtc2V0KHByZXZpb3VzRW5jcnlwdGVkQ291bnRlciwgMCwga0Jsb2NrU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuYXJyYXkoKSwga0Jsb2NrQml0Q291bnQsICZvcGVuc3NsS2V5KTsKKyAgICBJdiBvcGVuc3NsSXY7CisgICAgbWVtY3B5KG9wZW5zc2xJdiwgaXYsIHNpemVvZihvcGVuc3NsSXYpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSYgc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKworICAgICAgICBpZiAoc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uICsgb2Zmc2V0LCBzb3VyY2UgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm1OdW1CeXRlc09mQ2xlYXJEYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CisgICAgICAgICAgICBBRVNfY3RyMTI4X2VuY3J5cHQoc291cmNlICsgb2Zmc2V0LCBkZXN0aW5hdGlvbiArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksCisgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xJdiwgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAmYmxvY2tPZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqYnl0ZXNEZWNyeXB0ZWRPdXQgPSBvZmZzZXQ7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBkZWNyeXB0KGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWVzQ3RyRGVjcnlwdG9yKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhODViNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgQWVzQ3RyRGVjcnlwdG9yLmNwcCBcCisgICAgQ2xlYXJLZXlVVUlELmNwcCBcCisgICAgQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBcCisgICAgQ3J5cHRvRmFjdG9yeS5jcHAgXAorICAgIENyeXB0b1BsdWdpbi5jcHAgXAorICAgIERybUZhY3RvcnkuY3BwIFwKKyAgICBEcm1QbHVnaW4uY3BwIFwKKyAgICBJbml0RGF0YVBhcnNlci5jcHAgXAorICAgIEpzb25XZWJLZXkuY3BwIFwKKyAgICBTZXNzaW9uLmNwcCBcCisgICAgU2Vzc2lvbkxpYnJhcnkuY3BwIFwKKyAgICBVdGlscy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleSBcCisgICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybWNsZWFya2V5cGx1Z2luCisKK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlidXRpbHMgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJqc21uIFwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIHVuaXQgdGVzdHMKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjg5NTlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlUeXBlcy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1RZUEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX1RZUEVTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NvbnN0IHVpbnQ4X3Qga0Jsb2NrU2l6ZSA9IEFFU19CTE9DS19TSVpFOwordHlwZWRlZiB1aW50OF90IEtleUlkW2tCbG9ja1NpemVdOwordHlwZWRlZiB1aW50OF90IEl2W2tCbG9ja1NpemVdOworCit0eXBlZGVmIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbjo6U3ViU2FtcGxlIFN1YlNhbXBsZTsKKwordHlwZWRlZiBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sCisgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiA+IEtleU1hcDsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA1MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0geworICAgICAgICAweDEwLDB4NzcsMHhFRiwweEVDLDB4QzAsMHhCMiwweDRELDB4MDIsCisgICAgICAgIDB4QUMsMHhFMywweDNDLDB4MUUsMHg1MiwweEUyLDB4RkIsMHg0QgorICAgIH07CisKKyAgICByZXR1cm4gIW1lbWNtcCh1dWlkLCBrQ2xlYXJLZXlVVUlELCBzaXplb2Yoa0NsZWFyS2V5VVVJRCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCmluZGV4IDEzY2FjNmQuLmFjOTk0MTgKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5VVVJRC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpZm5kZWYgQ0xFQVJLRVlfVVVJRF9IXworI2RlZmluZSBDTEVBUktFWV9VVUlEX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLS8qIC0tLS0tIEFkZC1vbnMgLS0tLS0gKi8KK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2Jvb2wgaXNDbGVhcktleVVVSUQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CiAKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9VVUlEX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2MSUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMTNjYWM2ZC4uZWMxNDIwZQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgiCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworZXh0ZXJuICJDIiB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK2FuZHJvaWQ6OkRybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKSB7CisgICAgcmV0dXJuIG5ldyBjbGVhcmtleWRybTo6RHJtRmFjdG9yeSgpOworfQogCithbmRyb2lkOjpDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgY2xlYXJrZXlkcm06OkNyeXB0b0ZhY3RvcnkoKTsKK30KKworfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCAxM2NhYzZkLi5kOWFjZWMxCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitleHRlcm4gIkMiIHsKKyAgICBhbmRyb2lkOjpEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCk7CisgICAgYW5kcm9pZDo6Q3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpOworfQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCi0KKyNlbmRpZiAvLyBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMxODliCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9GYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNwPFNlc3Npb24+IHNlc3Npb24gPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKAorICAgICAgICAgICAgZGF0YSwgc2l6ZSk7CisgICAgKnBsdWdpbiA9IG5ldyBDcnlwdG9QbHVnaW4oc2Vzc2lvbik7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGJjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvRmFjdG9yeSA6IHB1YmxpYyBhbmRyb2lkOjpDcnlwdG9GYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDcnlwdG9GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9GYWN0b3J5KCkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdDsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgYW5kcm9pZDo6Q3J5cHRvUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZDEzNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKKworLy8gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9yIGNvZGUgYW5kIHBvc2l0aXZlIHZhbHVlcyBmb3IgdGhlIHNpemUgb2YKKy8vIGRlY3J5cHRlZCBkYXRhLiAgSW4gdGhlb3J5LCB0aGUgb3V0cHV0IHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBpbnB1dAorLy8gc2l6ZSwgYnV0IGluIHByYWN0aWNlIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yIEFFUy1DVFIuCitzc2l6ZV90IENyeXB0b1BsdWdpbjo6ZGVjcnlwdChib29sIHNlY3VyZSwgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSBtb2RlLCBjb25zdCB2b2lkKiBzcmNQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0UHRyLCBBU3RyaW5nKiBlcnJvckRldGFpbE1zZykgeworICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKCJTZWN1cmUgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsZWFyS2V5LiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0ga01vZGVfVW5lbmNyeXB0ZWQpIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3ViU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBTdWJTYW1wbGUmIHN1YlNhbXBsZSA9IHN1YlNhbXBsZXNbaV07CisKKyAgICAgICAgICAgIGlmIChzdWJTYW1wbGUubU51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oCisgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fREVDUllQVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRzdFB0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyY1B0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5tTnVtQnl0ZXNPZkNsZWFyRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVfQUVTX0NUUikgeworICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLCBpdiwgc3JjUHRyLCBkc3RQdHIsIHN1YlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsICZieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8oIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3JEZXRhaWxNc2ctPnNldFRvKAorICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNICIKKyAgICAgICAgICAgICAgICAiUGx1Z2luLiIpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyZDllMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworY2xhc3MgQ3J5cHRvUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbiB7CitwdWJsaWM6CisgICAgQ3J5cHRvUGx1Z2luKGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBzZXNzaW9uKSA6IG1TZXNzaW9uKHNlc3Npb24pIHt9CisgICAgdmlydHVhbCB+Q3J5cHRvUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciogbWltZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobWltZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLCBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsCisgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQqIHNyY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICB2b2lkKiBkc3RQdHIsIGFuZHJvaWQ6OkFTdHJpbmcqIGVycm9yRGV0YWlsTXNnKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG9QbHVnaW4pOworCisgICAgYW5kcm9pZDo6c3A8U2Vzc2lvbj4gbVNlc3Npb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI3NWNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2Jvb2wgRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgeworICAgIHJldHVybiBpc0NsZWFyS2V5VVVJRCh1dWlkKTsKK30KKworYm9vbCBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGFuZHJvaWQ6OlN0cmluZzggJmluaXREYXRhVHlwZSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIGluaXREYXRhVHlwZSA9PSAiY2VuYyIgfHwKKyAgICAgICAgICAgaW5pdERhdGFUeXBlID09ICJ3ZWJtIjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgRHJtRmFjdG9yeTo6Y3JlYXRlRHJtUGx1Z2luKAorICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBhbmRyb2lkOjpEcm1QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGQzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBEcm1GYWN0b3J5IDogcHVibGljIGFuZHJvaWQ6OkRybUZhY3RvcnkgeworcHVibGljOgorICAgIERybUZhY3RvcnkoKSB7fQorICAgIHZpcnR1YWwgfkRybUZhY3RvcnkoKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOworCisgICAgdmlydHVhbCBib29sIGlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmaW5pdERhdGFUeXBlKTsKKworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgY3JlYXRlRHJtUGx1Z2luKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1GYWN0b3J5KTsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmY2E5NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpzcDsKKworc3RhdHVzX3QgRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisgICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgZGVmYXVsdFVybC5jbGVhcigpOworICAgIHJldHVybiBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtUGx1Z2luOjpwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7CisgICAgc3RhdHVzX3QgcmVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICBpZiAocmVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgaWYgKG5hbWUgPT0gInZlbmRvciIpIHsKKyAgICAgICAgdmFsdWUgPSAiR29vZ2xlIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gInZlcnNpb24iKSB7CisgICAgICAgIHZhbHVlID0gIjEuMCI7CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJkZXNjcmlwdGlvbiIpIHsKKyAgICAgICAgdmFsdWUgPSAiQ2xlYXJLZXkgQ0RNIjsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImFsZ29yaXRobXMiKSB7CisgICAgICAgIHZhbHVlID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmOWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvRHJtUGx1Z2luLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXworCisjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Cit1c2luZyBhbmRyb2lkOjpMaXN0OwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBEcm1QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6RHJtUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQorICAgICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5U2V0SWQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChpbmZvTWFwKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfYXV0aG9yaXR5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAorICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgeworICAgICAgICBVTlVTRUQoY2VydF90eXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRfYXV0aG9yaXR5KTsKKyAgICAgICAgVU5VU0VEKHJlcXVlc3QpOworICAgICAgICBVTlVTRUQoZGVmYXVsdFVybCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KSB7CisgICAgICAgIFVOVVNFRChyZXNwb25zZSk7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4mIHNlY3VyZVN0b3BzKSB7CisgICAgICAgIFVOVVNFRChzZWN1cmVTdG9wcyk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNzUmVsZWFzZSkgeworICAgICAgICBVTlVTRUQoc3NSZWxlYXNlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3QgeworICAgICAgICBVTlVTRUQobmFtZSk7CisgICAgICAgIFVOVVNFRCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIHsKKyAgICAgICAgVU5VU0VEKG5hbWUpOworICAgICAgICBVTlVTRUQodmFsdWUpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoYWxnb3JpdGhtKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGFsZ29yaXRobSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7CisgICAgICAgIFVOVVNFRChzZXNzaW9uSWQpOworICAgICAgICBVTlVTRUQoa2V5SWQpOworICAgICAgICBVTlVTRUQoaW5wdXQpOworICAgICAgICBVTlVTRUQoaXYpOworICAgICAgICBVTlVTRUQob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChpbnB1dCk7CisgICAgICAgIFVOVVNFRChpdik7CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChrZXlJZCk7CisgICAgICAgIFVOVVNFRChtZXNzYWdlKTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlLCBib29sJiBtYXRjaCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGtleUlkKTsKKyAgICAgICAgVU5VU0VEKG1lc3NhZ2UpOworICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgVU5VU0VEKG1hdGNoKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChhbGdvcml0aG0pOworICAgICAgICBVTlVTRUQobWVzc2FnZSk7CisgICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKKyAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKKworICAgIFNlc3Npb25MaWJyYXJ5KiBtU2Vzc2lvbkxpYnJhcnk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OkFTdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIFZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOworICAgIGlmIChpbml0RGF0YVR5cGUgPT0gImNlbmMiKSB7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluaXREYXRhVHlwZSA9PSAid2VibSIpIHsKKyAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAorICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQorICAgICAgICBrZXlJZHMucHVzaChpbml0RGF0YS5hcnJheSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QKKyAgICBTdHJpbmc4IHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleUlkcyk7CisgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CisgICAgbGljZW5zZVJlcXVlc3QtPmFwcGVuZEFycmF5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdEpzb24uc3RyaW5nKCkpLAorICAgICAgICAgICAgcmVxdWVzdEpzb24uc2l6ZSgpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEluaXREYXRhUGFyc2VyOjpwYXJzZVBzc2goY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgVmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKSB7CisgICAgc2l6ZV90IHJlYWRQb3NpdGlvbiA9IDA7CisKKyAgICAvLyBWYWxpZGF0ZSBzaXplIGZpZWxkCisgICAgdWludDMyX3QgZXhwZWN0ZWRTaXplID0gaW5pdERhdGEuc2l6ZSgpOworICAgIGV4cGVjdGVkU2l6ZSA9IGh0b25sKGV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgJmV4cGVjdGVkU2l6ZSwKKyAgICAgICAgICAgICAgIHNpemVvZihleHBlY3RlZFNpemUpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihleHBlY3RlZFNpemUpOworCisgICAgLy8gVmFsaWRhdGUgUFNTSCBib3ggaWRlbnRpZmllcgorICAgIGNvbnN0IGNoYXIgcHNzaElkZW50aWZpZXJbNF0gPSB7J3AnLCAncycsICdzJywgJ2gnfTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBwc3NoSWRlbnRpZmllciwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoSWRlbnRpZmllcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgcmVhZFBvc2l0aW9uICs9IHNpemVvZihwc3NoVmVyc2lvbjEpOworCisgICAgLy8gVmFsaWRhdGUgc3lzdGVtIElECisgICAgaWYgKCFpc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0ga1N5c3RlbUlkU2l6ZTsKKworICAgIC8vIFJlYWQga2V5IElEIGNvdW50CisgICAgdWludDMyX3Qga2V5SWRDb3VudDsKKyAgICBtZW1jcHkoJmtleUlkQ291bnQsICZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCBzaXplb2Yoa2V5SWRDb3VudCkpOworICAgIGtleUlkQ291bnQgPSBudG9obChrZXlJZENvdW50KTsKKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKGtleUlkQ291bnQpOworICAgIGlmIChyZWFkUG9zaXRpb24gKyAoa2V5SWRDb3VudCAqIGtLZXlJZFNpemUpICE9CisgICAgICAgICAgICBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGtleSBJRCBvZmZzZXRzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtleUlkQ291bnQ7ICsraSkgeworICAgICAgICBzaXplX3Qga2V5SWRQb3NpdGlvbiA9IHJlYWRQb3NpdGlvbiArIChpICoga0tleUlkU2l6ZSk7CisgICAgICAgIGtleUlkcy0+cHVzaCgmaW5pdERhdGFba2V5SWRQb3NpdGlvbl0pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK1N0cmluZzggSW5pdERhdGFQYXJzZXI6OmdlbmVyYXRlUmVxdWVzdChjb25zdCBWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOworICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CisKKyAgICBTdHJpbmc4IHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOworICAgIEFTdHJpbmcgZW5jb2RlZElkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRJZC5jbGVhcigpOworICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoa2V5SWRzW2ldLCBrS2V5SWRTaXplLCAmZW5jb2RlZElkKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmFwcGVuZEZvcm1hdCgiXCIlc1wiIiwgZW5jb2RlZElkLmNfc3RyKCkpOworICAgIH0KKyAgICByZXF1ZXN0LmFwcGVuZChrUmVxdWVzdFN1ZmZpeCk7CisKKyAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KKyAgICByZXF1ZXN0LnJlbW92ZUFsbChrQmFzZTY0UGFkZGluZyk7CisgICAgcmV0dXJuIHJlcXVlc3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9JTklUX0RBVEFfUEFSU0VSX0hfCisjZGVmaW5lIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK2NsYXNzIEluaXREYXRhUGFyc2VyIHsKK3B1YmxpYzoKKyAgICBJbml0RGF0YVBhcnNlcigpIHt9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZShjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5pdERhdGFQYXJzZXIpOworCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VQc3NoKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpOworCisgICAgYW5kcm9pZDo6U3RyaW5nOCBnZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmZmFlNAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiSnNvbldlYktleSIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlzVGFnKCJrZXlzIik7Citjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtLZXlUeXBlVGFnKCJrdHkiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1N5bW1ldHJpY0tleVZhbHVlKCJvY3QiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0tleVRhZygiayIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrS2V5SWRUYWcoImtpZCIpOworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQmFzZTY0UGFkZGluZygiPSIpOworfQorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBhbmRyb2lkOjpBQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6QVN0cmluZzsKKworSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKK30KKworSnNvbldlYktleTo6fkpzb25XZWJLZXkoKSB7Cit9CisKKy8qCisgKiBQYXJzZXMgYSBKU09OIFdlYiBLZXkgU2V0IHN0cmluZywgaW5pdGlhbGl6ZXMgYSBLZXlNYXAgd2l0aCBrZXkgaWQ6a2V5CisgKiBwYWlycyBmcm9tIHRoZSBKU09OIFdlYiBLZXkgU2V0LiBCb3RoIGtleSBpZHMgYW5kIGtleXMgYXJlIGJhc2U2NHVybAorICogZW5jb2RlZC4gVGhlIEtleU1hcCBjb250YWlucyBiYXNlNjR1cmwgZGVjb2RlZCBrZXkgaWQ6a2V5IHBhaXJzLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgS2V5TWFwKiBrZXlzKSB7CisKKyAgICBrZXlzLT5jbGVhcigpOworICAgIGlmICghcGFyc2VKc29uV2ViS2V5U2V0KGpzb25XZWJLZXlTZXQsICZtSnNvbk9iamVjdHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMF0gY29udGFpbnMgdGhlIGVudGlyZSBKU09OIFdlYiBLZXkgU2V0LCBpbmNsdWRpbmcKKyAgICAvLyBhbGwgdGhlIGJhc2U2NCBlbmNvZGVkIGtleXMuIEVhY2gga2V5IGlzIGFsc28gc3RvcmVkIHNlcGFyYXRlbHkgYXMKKyAgICAvLyBhIEpTT04gb2JqZWN0IGluIG1Kc29uT2JqZWN0c1sxLi5uXSB3aGVyZSBuIGlzIHRoZSB0b3RhbAorICAgIC8vIG51bWJlciBvZiBrZXlzIGluIHRoZSBzZXQuCisgICAgaWYgKCFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBlbmNvZGVkS2V5LCBlbmNvZGVkS2V5SWQ7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWRLZXksIGRlY29kZWRLZXlJZDsKKworICAgIC8vIG1Kc29uT2JqZWN0c1sxXSBjb250YWlucyB0aGUgZmlyc3QgSlNPTiBXZWIgS2V5IGluIHRoZSBzZXQKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1Kc29uT2JqZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBlbmNvZGVkS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RlZEtleS5jbGVhcigpOworCisgICAgICAgIGlmICghcGFyc2VKc29uT2JqZWN0KG1Kc29uT2JqZWN0c1tpXSwgJm1Ub2tlbnMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChmaW5kS2V5KG1Kc29uT2JqZWN0c1tpXSwgJmVuY29kZWRLZXlJZCwgJmVuY29kZWRLZXkpKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZEtleUlkLmlzRW1wdHkoKSB8fCBlbmNvZGVkS2V5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFkZWNvZGVCYXNlNjRTdHJpbmcoZW5jb2RlZEtleSwgJmRlY29kZWRLZXkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZWNvZGUga2V5KCVzKSIsIGVuY29kZWRLZXkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBrZXlzLT5hZGQoZGVjb2RlZEtleUlkLCBkZWNvZGVkS2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3QgU3RyaW5nOCYgZW5jb2RlZFRleHQsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IC0xKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBhbmRyb2lkOjpkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgU3RyaW5nOCBwYWRkZWRUZXh0KGVuY29kZWRUZXh0KTsKKyAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQgLSByZW1haW5kZXI7ICsraSkgeworICAgICAgICAgICAgcGFkZGVkVGV4dC5hcHBlbmQoa0Jhc2U2NFBhZGRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6c3A8QUJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmRlY29kZUJhc2U2NChBU3RyaW5nKHBhZGRlZFRleHQuc3RyaW5nKCkpKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBjb250ZW50IGZvdW5kLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVjb2RlZFRleHQtPmFwcGVuZEFycmF5KGJ1ZmZlci0+YmFzZSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnNvbldlYktleTo6ZmluZEtleShjb25zdCBTdHJpbmc4JiBqc29uT2JqZWN0LCBTdHJpbmc4KiBrZXlJZCwKKyAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSkgeworCisgICAgU3RyaW5nOCBrZXksIHZhbHVlOworCisgICAgLy8gT25seSBhbGxvdyBzeW1tZXRyaWMga2V5LCBpLmUuICJrdHkiOiJvY3QiIHBhaXIuCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VHlwZVRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlJZFRhZykgPj0gMCkgeworICAgICAgICBmaW5kVmFsdWUoa0tleUlkVGFnLCBrZXlJZCk7CisgICAgfQorCisgICAgaWYgKGpzb25PYmplY3QuZmluZChrS2V5VGFnKSA+PSAwKSB7CisgICAgICAgIGZpbmRWYWx1ZShrS2V5VGFnLCBlbmNvZGVkS2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSnNvbldlYktleTo6ZmluZFZhbHVlKGNvbnN0IFN0cmluZzggJmtleSwgU3RyaW5nOCogdmFsdWUpIHsKKyAgICB2YWx1ZS0+Y2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVRva2VuOworICAgIGZvciAoVmVjdG9yPFN0cmluZzg+Ojpjb25zdF9pdGVyYXRvciBuZXh0VG9rZW4gPSBtVG9rZW5zLmJlZ2luKCk7CisgICAgICAgIG5leHRUb2tlbiAhPSBtVG9rZW5zLmVuZCgpOyArK25leHRUb2tlbikgeworICAgICAgICBpZiAoMCA9PSAoKm5leHRUb2tlbikuY29tcGFyZShrZXkpKSB7CisgICAgICAgICAgICBpZiAobmV4dFRva2VuICsgMSA9PSBtVG9rZW5zLmVuZCgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWVUb2tlbiA9ICgqKG5leHRUb2tlbiArIDEpKS5zdHJpbmcoKTsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbyh2YWx1ZVRva2VuKTsKKyAgICAgICAgICAgIG5leHRUb2tlbisrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSnNvbldlYktleTo6aXNKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QpIGNvbnN0IHsKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlzVGFnKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiSlNPTiBXZWIgS2V5IGRvZXMgbm90IGNvbnRhaW4ga2V5cy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBhcnNlcyBhIEpTT04gb2JqZWN0cyBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIHRva2Vucy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAganNvbk9iamVjdC5zdHJpbmcoKSwganNvbk9iamVjdC5zaXplKCksIE5VTEwsIDApOworICAgIGlmIChudW1Ub2tlbnMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJQYXJzZXIgcmV0dXJucyBlcnJvciBjb2RlPSVkIiwgbnVtVG9rZW5zKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBqc21uVG9rZW5zU2l6ZSA9IG51bVRva2VucyAqIHNpemVvZihqc21udG9rX3QpOworICAgIG1Kc21uVG9rZW5zLmNsZWFyKCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3Quc3RyaW5nKCksCisgICAgICAgIGpzb25PYmplY3Quc2l6ZSgpLCBtSnNtblRva2Vucy5lZGl0QXJyYXkoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1Ub2tlbnM7ICsraikgeworICAgICAgICBwanMgPSBqc29uT2JqZWN0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uc2V0VG8ocGpzLCBtSnNtblRva2Vuc1tqXS5lbmQgLSBtSnNtblRva2Vuc1tqXS5zdGFydCk7CisgICAgICAgICAgICB0b2tlbnMtPmFkZCh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQYXJzZXMgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcgYW5kIGluaXRpYWxpemVzIGEgdmVjdG9yIG9mIEpTT04gb2JqZWN0cy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpwYXJzZUpzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbldlYktleVNldCwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+KiBqc29uT2JqZWN0cykgeworICAgIGlmIChqc29uV2ViS2V5U2V0LmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiRW1wdHkgSlNPTiBXZWIgS2V5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUganNtbiBwYXJzZXIgb25seSBzdXBwb3J0cyB1bmljb2RlIGVuY29kaW5nLgorICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIC8vIENvbXB1dGVzIG51bWJlciBvZiB0b2tlbnMuIEEgdG9rZW4gbWFya3MgdGhlIHR5cGUsIG9mZnNldCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnN0cmluZygpLCBqc29uV2ViS2V5U2V0LnNpemUoKSwgTlVMTCwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuc2V0Q2FwYWNpdHkoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuc3RyaW5nKCksCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LnNpemUoKSwgbUpzbW5Ub2tlbnMuZWRpdEFycmF5KCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCB0b2tlbjsKKyAgICBjb25zdCBjaGFyICpwanM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub2tlbnM7ICsraSkgeworICAgICAgICBwanMgPSBqc29uV2ViS2V5U2V0LnN0cmluZygpICsgbUpzbW5Ub2tlbnNbaV0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tpXS50eXBlID09IEpTTU5fT0JKRUNUKSB7CisgICAgICAgICAgICB0b2tlbi5zZXRUbyhwanMsIG1Kc21uVG9rZW5zW2ldLmVuZCAtIG1Kc21uVG9rZW5zW2ldLnN0YXJ0KTsKKyAgICAgICAgICAgIGpzb25PYmplY3RzLT5hZGQodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZTUwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworI2RlZmluZSBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJqc21uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitjbGFzcyBKc29uV2ViS2V5IHsKKyBwdWJsaWM6CisgICAgSnNvbldlYktleSgpOworICAgIHZpcnR1YWwgfkpzb25XZWJLZXkoKTsKKworICAgIGJvb2wgZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChjb25zdCBTdHJpbmc4JiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgS2V5TWFwKiBrZXlzKTsKKworIHByaXZhdGU6CisgICAgVmVjdG9yPGpzbW50b2tfdD4gbUpzbW5Ub2tlbnM7CisgICAgVmVjdG9yPFN0cmluZzg+IG1Kc29uT2JqZWN0czsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbVRva2VuczsKKworICAgIGJvb2wgZGVjb2RlQmFzZTY0U3RyaW5nKGNvbnN0IFN0cmluZzgmIGVuY29kZWRUZXh0LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBkZWNvZGVkVGV4dCk7CisgICAgYm9vbCBmaW5kS2V5KGNvbnN0IFN0cmluZzgmIGpzb25PYmplY3QsIFN0cmluZzgqIGtleUlkLAorICAgICAgICAgICAgU3RyaW5nOCogZW5jb2RlZEtleSk7CisgICAgdm9pZCBmaW5kVmFsdWUoY29uc3QgU3RyaW5nOCAma2V5LCBTdHJpbmc4KiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCkgY29uc3Q7CisgICAgYm9vbCBwYXJzZUpzb25PYmplY3QoY29uc3QgU3RyaW5nOCYganNvbk9iamVjdCwgVmVjdG9yPFN0cmluZzg+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IFN0cmluZzgmIGpzb25XZWJLZXlTZXQsIFZlY3RvcjxTdHJpbmc4PioganNvbk9iamVjdHMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSnNvbldlYktleSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmICAvLyBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMTZmNQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorI2luY2x1ZGUgIkpzb25XZWJLZXkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7CisKK3N0YXR1c190IFNlc3Npb246OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwga2V5UmVxdWVzdCk7Cit9CisKK3N0YXR1c190IFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CisgICAgU3RyaW5nOCByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmFycmF5KCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIEtleU1hcCBrZXlzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworICAgIEpzb25XZWJLZXkgcGFyc2VyOworICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjprZXlfdHlwZSYga2V5SWQgPSBrZXlzLmtleUF0KGkpOworICAgICAgICAgICAgY29uc3QgS2V5TWFwOjp2YWx1ZV90eXBlJiBrZXkgPSBrZXlzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBtS2V5TWFwLmFkZChrZXlJZCwga2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6ZGVjcnlwdCgKKyAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCisgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOworICAgIGtleUlkVmVjdG9yLmFwcGVuZEFycmF5KGtleUlkLCBrQmxvY2tTaXplKTsKKyAgICBpZiAobUtleU1hcC5pbmRleE9mS2V5KGtleUlkVmVjdG9yKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgIH0KKworICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5ID0gbUtleU1hcC52YWx1ZUZvcihrZXlJZFZlY3Rvcik7CisgICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKKyAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCisgICAgICAgICAgICBrZXksIGl2LAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RpbmF0aW9uKSwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWIwZGMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX1NFU1NJT05fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNlc3Npb24oY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CisKKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7CisKKyAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKworICAgIGFuZHJvaWQ6Ok11dGV4IG1NYXBMb2NrOworICAgIEtleU1hcCBtS2V5TWFwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ3YzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5Q3J5cHRvUGx1Z2luIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6TXV0ZXg7Cit1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Cit1c2luZyBhbmRyb2lkOjpWZWN0b3I7CisKK011dGV4IFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uTG9jazsKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbiA9IE5VTEw7CisKK1Nlc3Npb25MaWJyYXJ5KiBTZXNzaW9uTGlicmFyeTo6Z2V0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNTaW5nbGV0b25Mb2NrKTsKKworICAgIGlmIChzU2luZ2xldG9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgU2Vzc2lvbiBMaWJyYXJ5IFNpbmdsZXRvbi4iKTsKKyAgICAgICAgc1NpbmdsZXRvbiA9IG5ldyBTZXNzaW9uTGlicmFyeSgpOworICAgIH0KKworICAgIHJldHVybiBzU2luZ2xldG9uOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisgICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCisgICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKKworICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK2NvbnN0IHNwPFNlc3Npb24+JiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisgICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uSWQpOworfQorCitjb25zdCBzcDxTZXNzaW9uPiYgU2Vzc2lvbkxpYnJhcnk6OmZpbmRTZXNzaW9uKAorICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCBzaXplKTsKKyAgICByZXR1cm4gZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKK30KKwordm9pZCBTZXNzaW9uTGlicmFyeTo6ZGVzdHJveVNlc3Npb24oY29uc3Qgc3A8U2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTtcCisgICAgbVNlc3Npb25zLnJlbW92ZUl0ZW0oc2Vzc2lvbi0+c2Vzc2lvbklkKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjODgyOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisjZGVmaW5lIENMRUFSS0VZX1NFU1NJT05fTElCUkFSWV9IXworCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIlNlc3Npb24uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitjbGFzcyBTZXNzaW9uTGlicmFyeSB7CitwdWJsaWM6CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBnZXQoKTsKKworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPFNlc3Npb24+JiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgZmluZFNlc3Npb24oY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBhbmRyb2lkOjpzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbkxpYnJhcnkpOworCisgICAgU2Vzc2lvbkxpYnJhcnkoKSA6IG1OZXh0U2Vzc2lvbklkKDEpIHt9CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6TXV0ZXggc1NpbmdsZXRvbkxvY2s7CisgICAgc3RhdGljIFNlc3Npb25MaWJyYXJ5KiBzU2luZ2xldG9uOworCisgICAgYW5kcm9pZDo6TXV0ZXggbVNlc3Npb25zTG9jazsKKyAgICB1aW50MzJfdCBtTmV4dFNlc3Npb25JZDsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4sIGFuZHJvaWQ6OnNwPFNlc3Npb24+ID4KKyAgICAgICAgICAgIG1TZXNzaW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2M2NDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8dWludDhfdD4gJmxocywgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyaHMpIHsKKyAgICBpZiAobGhzLnNpemUoKSA8IHJocy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChsaHMuc2l6ZSgpID4gcmhzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtZW1jbXAoKHZvaWQgKilsaHMuYXJyYXkoKSwgKHZvaWQgKilyaHMuYXJyYXkoKSwgcmhzLnNpemUoKSkgPCAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTQzMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9VVElMU19IXworI2RlZmluZSBDTEVBUktFWV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKy8vIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHRoaXMgVmVjdG9yIHNwZWNpYWxpemF0aW9uIHNvIHRoYXQgaXQgY2FuIGJlCisvLyB1c2VkIGFzIGEga2V5IGluIGEgS2V5ZWRWZWN0b3IuCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbGhzLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnJocyk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpOworCisjZW5kaWYgLy8gQ0xFQVJLRVlfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzllNDAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJBZXNDdHJEZWNyeXB0b3IuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIEFlc0N0ckRlY3J5cHRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHR5cGVkZWYgdWludDhfdCBLZXlba0Jsb2NrU2l6ZV07CisKKyAgICBzdGF0dXNfdCBhdHRlbXB0RGVjcnlwdChjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LCBjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5VmVjdG9yOworICAgICAgICBrZXlWZWN0b3IuYXBwZW5kQXJyYXkoa2V5LCBrQmxvY2tTaXplKTsKKworICAgICAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgICAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoa2V5VmVjdG9yLCBpdiwgc291cmNlLCBkZXN0aW5hdGlvbiwgc3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IHRvdGFsU2l6ZT4KKyAgICB2b2lkIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBLZXkmIGtleSwgY29uc3QgSXYmIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGVuY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkZWNyeXB0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlKiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzKSB7CisgICAgICAgIHVpbnQ4X3Qgb3V0cHV0QnVmZmVyW3RvdGFsU2l6ZV0gPSB7fTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6Ok9LLCBhdHRlbXB0RGVjcnlwdChrZXksIGl2LCBlbmNyeXB0ZWQsIG91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0RlY3J5cHRlZCkpOworICAgICAgICBFWFBFQ1RfRVEodG90YWxTaXplLCBieXRlc0RlY3J5cHRlZCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAob3V0cHV0QnVmZmVyLCBkZWNyeXB0ZWQsIHRvdGFsU2l6ZSkpOworICAgIH0KK307CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c0NvbnRpZ3VvdXNFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkQmlmdXJjYXRlZEVuY3J5cHRlZEJsb2NrKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA2NDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHswLCAzMn0sCisgICAgICAgIHswLCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZEJpZnVyY2F0ZWRFbmNyeXB0ZWRCbG9jaykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNjQ7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7MCwgMjl9LAorICAgICAgICB7MCwgMzV9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNPbmVNaXhlZFN1YlNhbXBsZSkgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gNzI7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMTsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gNjQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsIDB4ZDMsIDB4NWUsCisgICAgICAgIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsIDB4M2UsIDB4YWIsCisgICAgICAgIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsIDB4MDMsIDB4ZDEsCisgICAgICAgIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgNjR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNBbGlnbmVkTWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA4MDsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSAyOworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LCAweDAwLCAweDY0LCAweDBiLCAweGJiLAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg4NywgMHg0ZCwgMHg2MSwgMHg5MSwgMHhiNiwgMHgyMCwgMHhlMywgMHgyNiwKKyAgICAgICAgMHgxYiwgMHhlZiwgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwgMHhmZCwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzMiBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg1YSwgMHhlNCwgMHhkZiwgMHgzZSwgMHhkYiwgMHhkNSwgMHhkMywgMHg1ZSwKKyAgICAgICAgMHg1YiwgMHg0ZiwgMHgwOSwgMHgwMiwgMHgwZCwgMHhiMCwgMHgzZSwgMHhhYiwKKyAgICAgICAgMHgxZSwgMHgwMywgMHgxZCwgMHhkYSwgMHgyZiwgMHhiZSwgMHgwMywgMHhkMSwKKyAgICAgICAgMHg3OSwgMHgyMSwgMHg3MCwgMHhhMCwgMHhmMywgMHgwMCwgMHg5YywgMHhlZQorICAgIH07CisKKyAgICB1aW50OF90IGRlY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgMHg2YiwgMHhjMSwgMHhiZSwgMHhlMiwgMHgyZSwgMHg0MCwgMHg5ZiwgMHg5NiwKKyAgICAgICAgMHhlOSwgMHgzZCwgMHg3ZSwgMHgxMSwgMHg3MywgMHg5MywgMHgxNywgMHgyYSwKKyAgICAgICAgMHhhZSwgMHgyZCwgMHg4YSwgMHg1NywgMHgxZSwgMHgwMywgMHhhYywgMHg5YywKKyAgICAgICAgMHg5ZSwgMHhiNywgMHg2ZiwgMHhhYywgMHg0NSwgMHhhZiwgMHg4ZSwgMHg1MSwKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgMHgzMCwgMHhjOCwgMHgxYywgMHg0NiwgMHhhMywgMHg1YywgMHhlNCwgMHgxMSwKKyAgICAgICAgMHhlNSwgMHhmYiwgMHhjMSwgMHgxOSwgMHgxYSwgMHgwYSwgMHg1MiwgMHhlZiwKKyAgICAgICAgMHhmNiwgMHg5ZiwgMHgyNCwgMHg0NSwgMHhkZiwgMHg0ZiwgMHg5YiwgMHgxNywKKyAgICAgICAgMHhhZCwgMHgyYiwgMHg0MSwgMHg3YiwgMHhlNiwgMHg2YywgMHgzNywgMHgxMAorICAgIH07CisKKyAgICBTdWJTYW1wbGUgc3ViU2FtcGxlc1trTnVtU3Vic2FtcGxlc10gPSB7CisgICAgICAgIHs4LCAzMn0sCisgICAgICAgIHs4LCAzMn0KKyAgICB9OworCisgICAgYXR0ZW1wdERlY3J5cHRFeHBlY3RpbmdTdWNjZXNzPGtUb3RhbFNpemU+KGtleSwgaXYsIGVuY3J5cHRlZCwgZGVjcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBrTnVtU3Vic2FtcGxlcyk7Cit9CisKK1RFU1RfRihBZXNDdHJEZWNyeXB0b3JUZXN0LCBEZWNyeXB0c1VuYWxpZ25lZE1peGVkU3ViU2FtcGxlcykgeworICAgIGNvbnN0IHNpemVfdCBrVG90YWxTaXplID0gODA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1TdWJzYW1wbGVzID0gMjsKKworICAgIC8vIEJhc2VkIG9uIHRlc3QgdmVjdG9ycyBmcm9tIE5JU1QtODAwLTM4QQorICAgIEtleSBrZXkgPSB7CisgICAgICAgIDB4MmIsIDB4N2UsIDB4MTUsIDB4MTYsIDB4MjgsIDB4YWUsIDB4ZDIsIDB4YTYsCisgICAgICAgIDB4YWIsIDB4ZjcsIDB4MTUsIDB4ODgsIDB4MDksIDB4Y2YsIDB4NGYsIDB4M2MKKyAgICB9OworCisgICAgSXYgaXYgPSB7CisgICAgICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCisgICAgICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYKKyAgICB9OworCisgICAgdWludDhfdCBlbmNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHhmMCwgMHgxMywgMHhjYSwgMHhjNywgMHgwMCwgMHg2NCwgMHgwYiwgMHhiYiwKKyAgICAgICAgLy8gMzAgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ODcsIDB4NGQsIDB4NjEsIDB4OTEsIDB4YjYsIDB4MjAsIDB4ZTMsIDB4MjYsCisgICAgICAgIDB4MWIsIDB4ZWYsIDB4NjgsIDB4NjQsIDB4OTksIDB4MGQsIDB4YjYsIDB4Y2UsCisgICAgICAgIDB4OTgsIDB4MDYsIDB4ZjYsIDB4NmIsIDB4NzksIDB4NzAsIDB4ZmQsIDB4ZmYsCisgICAgICAgIDB4ODYsIDB4MTcsIDB4MTgsIDB4N2IsIDB4YjksIDB4ZmYsCisgICAgICAgIC8vIDggY2xlYXIgYnl0ZXMKKyAgICAgICAgMHg5NCwgMHhiYSwgMHg4OCwgMHgyZSwgMHgwZSwgMHgxMiwgMHgxMSwgMHg1NSwKKyAgICAgICAgLy8gMzQgZW5jcnlwdGVkIGJ5dGVzCisgICAgICAgIDB4ZmQsIDB4ZmYsIDB4NWEsIDB4ZTQsIDB4ZGYsIDB4M2UsIDB4ZGIsIDB4ZDUsCisgICAgICAgIDB4ZDMsIDB4NWUsIDB4NWIsIDB4NGYsIDB4MDksIDB4MDIsIDB4MGQsIDB4YjAsCisgICAgICAgIDB4M2UsIDB4YWIsIDB4MWUsIDB4MDMsIDB4MWQsIDB4ZGEsIDB4MmYsIDB4YmUsCisgICAgICAgIDB4MDMsIDB4ZDEsIDB4NzksIDB4MjEsIDB4NzAsIDB4YTAsIDB4ZjMsIDB4MDAsCisgICAgICAgIDB4OWMsIDB4ZWUKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4MDAsIDB4NjQsIDB4MGIsIDB4YmIsCisgICAgICAgIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsCisgICAgICAgIDB4ZTksIDB4M2QsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsCisgICAgICAgIDB4YWUsIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsCisgICAgICAgIDB4OWUsIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsCisgICAgICAgIDB4ODgsIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4OGUsIDB4NTEsCisgICAgICAgIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsIDB4ZTQsIDB4MTEsCisgICAgICAgIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MWEsIDB4MGEsIDB4NTIsIDB4ZWYsCisgICAgICAgIDB4ZjYsIDB4OWYsIDB4MjQsIDB4NDUsIDB4ZGYsIDB4NGYsIDB4OWIsIDB4MTcsCisgICAgICAgIDB4YWQsIDB4MmIsIDB4NDEsIDB4N2IsIDB4ZTYsIDB4NmMsIDB4MzcsIDB4MTAKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7OCwgMzB9LAorICAgICAgICB7OCwgMzR9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCitURVNUX0YoQWVzQ3RyRGVjcnlwdG9yVGVzdCwgRGVjcnlwdHNDb21wbGV4TWl4ZWRTdWJTYW1wbGVzKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUb3RhbFNpemUgPSA3MjsKKyAgICBjb25zdCBzaXplX3Qga051bVN1YnNhbXBsZXMgPSA2OworCisgICAgLy8gQmFzZWQgb24gdGVzdCB2ZWN0b3JzIGZyb20gTklTVC04MDAtMzhBCisgICAgS2V5IGtleSA9IHsKKyAgICAgICAgMHgyYiwgMHg3ZSwgMHgxNSwgMHgxNiwgMHgyOCwgMHhhZSwgMHhkMiwgMHhhNiwKKyAgICAgICAgMHhhYiwgMHhmNywgMHgxNSwgMHg4OCwgMHgwOSwgMHhjZiwgMHg0ZiwgMHgzYworICAgIH07CisKKyAgICBJdiBpdiA9IHsKKyAgICAgICAgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywKKyAgICAgICAgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorICAgIH07CisKKyAgICB1aW50OF90IGVuY3J5cHRlZFtrVG90YWxTaXplXSA9IHsKKyAgICAgICAgLy8gNCBjbGVhciBieXRlcworICAgICAgICAweGYwLCAweDEzLCAweGNhLCAweGM3LAorICAgICAgICAvLyAxIGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDg3LAorICAgICAgICAvLyA5IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweDRkLCAweDYxLCAweDkxLCAweGI2LCAweDIwLCAweGUzLCAweDI2LCAweDFiLAorICAgICAgICAweGVmLAorICAgICAgICAvLyAxMSBjbGVhciBieXRlcworICAgICAgICAweDgxLCAweDRmLCAweDI0LCAweDg3LCAweDBlLCAweGRlLCAweGJhLCAweGFkLAorICAgICAgICAweDExLCAweDliLCAweDQ2LAorICAgICAgICAvLyAyMCBlbmNyeXB0ZWQgYnl0ZXMKKyAgICAgICAgMHg2OCwgMHg2NCwgMHg5OSwgMHgwZCwgMHhiNiwgMHhjZSwKKyAgICAgICAgMHg5OCwgMHgwNiwgMHhmNiwgMHg2YiwgMHg3OSwgMHg3MCwgMHhmZCwgMHhmZiwKKyAgICAgICAgMHg4NiwgMHgxNywgMHgxOCwgMHg3YiwgMHhiOSwgMHhmZiwKKyAgICAgICAgLy8gOCBjbGVhciBieXRlcworICAgICAgICAweDk0LCAweGJhLCAweDg4LCAweDJlLCAweDBlLCAweDEyLCAweDExLCAweDU1LAorICAgICAgICAvLyAzIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIC8vIDE0IGVuY3J5cHRlZCBieXRlcworICAgICAgICAweGZkLCAweGZmLCAweDVhLCAweGU0LCAweGRmLCAweDNlLCAweGRiLCAweGQ1LAorICAgICAgICAweGQzLCAweDVlLCAweDViLCAweDRmLCAweDA5LCAweDAyLAorICAgICAgICAvLyAyIGNsZWFyIGJ5dGVzCisgICAgICAgIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgdWludDhfdCBkZWNyeXB0ZWRba1RvdGFsU2l6ZV0gPSB7CisgICAgICAgIDB4ZjAsIDB4MTMsIDB4Y2EsIDB4YzcsIDB4NmIsIDB4YzEsIDB4YmUsIDB4ZTIsCisgICAgICAgIDB4MmUsIDB4NDAsIDB4OWYsIDB4OTYsIDB4ZTksIDB4M2QsIDB4ODEsIDB4NGYsCisgICAgICAgIDB4MjQsIDB4ODcsIDB4MGUsIDB4ZGUsIDB4YmEsIDB4YWQsIDB4MTEsIDB4OWIsCisgICAgICAgIDB4NDYsIDB4N2UsIDB4MTEsIDB4NzMsIDB4OTMsIDB4MTcsIDB4MmEsIDB4YWUsCisgICAgICAgIDB4MmQsIDB4OGEsIDB4NTcsIDB4MWUsIDB4MDMsIDB4YWMsIDB4OWMsIDB4OWUsCisgICAgICAgIDB4YjcsIDB4NmYsIDB4YWMsIDB4NDUsIDB4YWYsIDB4OTQsIDB4YmEsIDB4ODgsCisgICAgICAgIDB4MmUsIDB4MGUsIDB4MTIsIDB4MTEsIDB4NTUsIDB4MTAsIDB4ZjUsIDB4MjIsCisgICAgICAgIDB4OGUsIDB4NTEsIDB4MzAsIDB4YzgsIDB4MWMsIDB4NDYsIDB4YTMsIDB4NWMsCisgICAgICAgIDB4ZTQsIDB4MTEsIDB4ZTUsIDB4ZmIsIDB4YzEsIDB4MTksIDB4MDIsIDB4MDEKKyAgICB9OworCisgICAgU3ViU2FtcGxlIHN1YlNhbXBsZXNba051bVN1YnNhbXBsZXNdID0geworICAgICAgICB7NCwgMX0sCisgICAgICAgIHswLCA5fSwKKyAgICAgICAgezExLCAyMH0sCisgICAgICAgIHs4LCAwfSwKKyAgICAgICAgezMsIDE0fSwKKyAgICAgICAgezIsIDB9CisgICAgfTsKKworICAgIGF0dGVtcHREZWNyeXB0RXhwZWN0aW5nU3VjY2VzczxrVG90YWxTaXplPihrZXksIGl2LCBlbmNyeXB0ZWQsIGRlY3J5cHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywga051bVN1YnNhbXBsZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQnVpbGRzIENsZWFyS2V5IERybSBUZXN0cworIworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBDbGVhcktleURybVVuaXRUZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFlc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBcCisgICAgSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAgXAorICAgIEpzb25XZWJLZXlVbml0dGVzdC5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMgXAorICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2pzbW4gXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKyAgICBmcmFtZXdvcmtzL2F2L2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5IFwKKyAgICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJndGVzdCBcCisgICAgbGliZ3Rlc3RfbWFpbiBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmNyeXB0byBcCisgICAgbGliZHJtY2xlYXJrZXlwbHVnaW4gXAorICAgIGxpYmxvZyBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlic3RscG9ydCBcCisgICAgbGlidXRpbHMgXAorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTY1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJJbml0RGF0YVBhcnNlci5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGNvbnN0IFN0cmluZzgga0NlbmNUeXBlKCJjZW5jIik7CisgICAgY29uc3QgU3RyaW5nOCBrV2ViTVR5cGUoIndlYm0iKTsKKyAgICBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK2NsYXNzIEluaXREYXRhUGFyc2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgYXR0ZW1wdFBhcnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgICAgICBJbml0RGF0YVBhcnNlciBwYXJzZXI7CisgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIGluaXREYXRhVHlwZSwgbGljZW5zZVJlcXVlc3QpOworICAgIH0KKworICAgIHZvaWQgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nU3VjY2Vzcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZXhwZWN0ZWRLZXlzKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RQcmVmaXgoIntcImtpZHNcIjpbIik7CisgICAgICAgIGNvbnN0IFN0cmluZzgga1JlcXVlc3RTdWZmaXgoIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgICAgIEFTU0VSVF9FUShhbmRyb2lkOjpPSywgYXR0ZW1wdFBhcnNlKGluaXREYXRhLCBpbml0RGF0YVR5cGUsICZyZXF1ZXN0KSk7CisKKyAgICAgICAgU3RyaW5nOCByZXF1ZXN0U3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlcXVlc3QuYXJyYXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCByZXF1ZXN0U3RyaW5nLmZpbmQoa1JlcXVlc3RQcmVmaXgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlcXVlc3RTdHJpbmcuc2l6ZSgpIC0ga1JlcXVlc3RTdWZmaXguc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmluZy5maW5kKGtSZXF1ZXN0U3VmZml4KSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhwZWN0ZWRLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBU3RyaW5nIGVuY29kZWRJZEFTdHJpbmc7CisgICAgICAgICAgICBhbmRyb2lkOjplbmNvZGVCYXNlNjQoZXhwZWN0ZWRLZXlzW2ldLCBrS2V5SWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVkSWRBU3RyaW5nKTsKKyAgICAgICAgICAgIFN0cmluZzggZW5jb2RlZElkKGVuY29kZWRJZEFTdHJpbmcuY19zdHIoKSk7CisgICAgICAgICAgICBlbmNvZGVkSWQucmVtb3ZlQWxsKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RTdHJpbmcuY29udGFpbnMoZW5jb2RlZElkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlKSB7CisgICAgICAgIFZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgICAgICBBU1NFUlRfTkUoYW5kcm9pZDo6T0ssIGF0dGVtcHRQYXJzZShpbml0RGF0YSwgaW5pdERhdGFUeXBlLCAmcmVxdWVzdCkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgcmVxdWVzdC5zaXplKCkpOworICAgIH0KK307CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1NpbmdsZUtleVBzc2gpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtDZW5jVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgUGFyc2VzTXVsdGlwbGVLZXlQc3NoKSB7CisgICAgdWludDhfdCBwc3NoWzg0XSA9IHsKKyAgICAgICAgMCwgMCwgMCwgODQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG90YWwgU2l6ZQorICAgICAgICAncCcsICdzJywgJ3MnLCAnaCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQU1NICisgICAgICAgIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnNpb24KKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwgLy8gU3lzdGVtIElECisgICAgICAgIDB4YWMsIDB4ZTMsIDB4M2MsIDB4MWUsIDB4NTIsIDB4ZTIsIDB4ZmIsIDB4NGIsCisgICAgICAgIDAsIDAsIDAsIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBDb3VudAorICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvLyBLZXkgSUQgIzEKKyAgICAgICAgMHgzOCwgMHgzOSwgMHgzMCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgLy8gICAiMDEyMzQ1Njc4OTBBQkNERSIKKyAgICAgICAgMHg0MywgMHg2YywgMHg2NSwgMHg2MSwgMHg3MiwgMHg0YiwgMHg2NSwgMHg3OSwgLy8gS2V5IElEICMyCisgICAgICAgIDB4NDMsIDB4NmMsIDB4NjUsIDB4NjEsIDB4NzIsIDB4NGIsIDB4NjUsIDB4NzksIC8vICAgIkNsZWFyS2V5Q2xlYXJLZXkiCisgICAgICAgIDB4MjAsIDB4NDcsIDB4NGYsIDB4NGYsIDB4NDcsIDB4NGMsIDB4NDUsIDB4MjAsIC8vIEtleSBJRCAjMworICAgICAgICAweDIwLCAweDQ3LCAweDRmLCAweDRmLCAweDQ3LCAweDRjLCAweDQ1LCAweDIwLCAvLyAgICIgR09PR0xFICBHT09HTEUgIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDg0KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBleHBlY3RlZEtleXMucHVzaChTdHJpbmc4KCJDbGVhcktleUNsZWFyS2V5IikpOworICAgIGV4cGVjdGVkS2V5cy5wdXNoKFN0cmluZzgoIiBHT09HTEUgIEdPT0dMRSAiKSk7CisKKyAgICBhdHRlbXB0UGFyc2VFeHBlY3RpbmdTdWNjZXNzKGluaXREYXRhLCBrQ2VuY1R5cGUsIGV4cGVjdGVkS2V5cyk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIFBhcnNlc1dlYk0pIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzE2XSA9IHsKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElECisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDE2KTsKKworICAgIFZlY3RvcjxTdHJpbmc4PiBleHBlY3RlZEtleXM7CisgICAgZXhwZWN0ZWRLZXlzLnB1c2goU3RyaW5nOCgiMDEyMzQ1Njc4OTBBQkNERSIpKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ1N1Y2Nlc3MoaW5pdERhdGEsIGtXZWJNVHlwZSwgZXhwZWN0ZWRLZXlzKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoVG9vU21hbGwpIHsKKyAgICB1aW50OF90IHBzc2hbMTZdID0geworICAgICAgICAwLCAwLCAwLCA1MiwKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLAorICAgICAgICAxLCAwLCAwLCAwLAorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgMTYpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JXZWJNVG9vU21hbGwpIHsKKyAgICB1aW50OF90IGluaXREYXRhUmF3WzhdID0geworICAgICAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3CisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoaW5pdERhdGFSYXcsIDgpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga1dlYk1UeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkU3lzdGVtSWQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHgxMCwgMHg3NywgMHhlZiwgMHhlYywgMHhjMCwgMHhiMiwgMHg0ZCwgMHgwMiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaEJhZFNpemUpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCA3MCwgMjAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK1RFU1RfRihJbml0RGF0YVBhcnNlclRlc3QsIEZhaWxzRm9yUHNzaFdyb25nVmVyc2lvbikgeworICAgIHVpbnQ4X3QgcHNzaFs1Ml0gPSB7CisgICAgICAgIDAsIDAsIDAsIDUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvdGFsIFNpemUKKyAgICAgICAgJ3AnLCAncycsICdzJywgJ2gnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUFNTSAorICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uCisgICAgICAgIDB4MTAsIDB4NzcsIDB4ZWYsIDB4ZWMsIDB4YzAsIDB4YjIsIDB4NGQsIDB4MDIsIC8vIFN5c3RlbSBJRAorICAgICAgICAweGFjLCAweGUzLCAweDNjLCAweDFlLCAweDUyLCAweGUyLCAweGZiLCAweDRiLAorICAgICAgICAwLCAwLCAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgQ291bnQKKyAgICAgICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLy8gS2V5IElEICMxCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIC8vICAgIjAxMjM0NTY3ODkwQUJDREUiCisgICAgICAgIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgU2l6ZSAoYWx3YXlzIDApCisgICAgfTsKKyAgICBWZWN0b3I8dWludDhfdD4gaW5pdERhdGE7CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkocHNzaCwgNTIpOworCisgICAgYXR0ZW1wdFBhcnNlRXhwZWN0aW5nRmFpbHVyZShpbml0RGF0YSwga0NlbmNUeXBlKTsKK30KKworVEVTVF9GKEluaXREYXRhUGFyc2VyVGVzdCwgRmFpbHNGb3JQc3NoQmFkS2V5Q291bnQpIHsKKyAgICB1aW50OF90IHBzc2hbNTJdID0geworICAgICAgICAwLCAwLCAwLCA1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBTaXplCisgICAgICAgICdwJywgJ3MnLCAncycsICdoJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBTU0gKKyAgICAgICAgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbgorICAgICAgICAweDEwLCAweDc3LCAweGVmLCAweGVjLCAweGMwLCAweGIyLCAweDRkLCAweDAyLCAvLyBTeXN0ZW0gSUQKKyAgICAgICAgMHhhYywgMHhlMywgMHgzYywgMHgxZSwgMHg1MiwgMHhlMiwgMHhmYiwgMHg0YiwKKyAgICAgICAgMCwgMCwgMCwgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IENvdW50CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8vIEtleSBJRCAjMQorICAgICAgICAweDM4LCAweDM5LCAweDMwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAvLyAgICIwMTIzNDU2Nzg5MEFCQ0RFIgorICAgICAgICAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIFNpemUgKGFsd2F5cyAwKQorICAgIH07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhOworICAgIGluaXREYXRhLmFwcGVuZEFycmF5KHBzc2gsIDUyKTsKKworICAgIGF0dGVtcHRQYXJzZUV4cGVjdGluZ0ZhaWx1cmUoaW5pdERhdGEsIGtDZW5jVHlwZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvSnNvbldlYktleVVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMGQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0gewordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgSnNvbldlYktleVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgICAgSnNvbldlYktleSogandrOworCisgICAgSnNvbldlYktleVRlc3QoKSB7CisgICAgICAgIGp3ayA9IG5ldyBKc29uV2ViS2V5OworICAgIH0KKworICAgIHZpcnR1YWwgfkpzb25XZWJLZXlUZXN0KCkgeworICAgICAgICBpZiAoandrKQorICAgICAgICAgICAgZGVsZXRlIGp3azsKKyAgICB9Cit9OworCit2b2lkIHN0cmluZ0Zyb21WZWN0b3IoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgU3RyaW5nOCogY29udmVydGVkKSB7CisgICAgY29udmVydGVkLT5jbGVhcigpOworICAgIGlmIChpbnB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29udmVydGVkLT5hcHBlbmRGb3JtYXQoIiVjIiwgaW5wdXQuaXRlbUF0KGkpKTsKKyAgICB9Cit9CisKK3ZvaWQgdmVyaWZ5S2V5cyhjb25zdCBLZXlNYXAmIGtleXMsIGNvbnN0IFN0cmluZzgqIGNsZWFyS2V5cykgeworICAgIGlmIChrZXlzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nOCBrZXlTdHJpbmc7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0cmluZ0Zyb21WZWN0b3Ioa2V5cy52YWx1ZUF0KGkpLCAma2V5U3RyaW5nKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleVN0cmluZywgY2xlYXJLZXlzW2ldKTsKKyAgICB9Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgTm9TeW1tZXRyaWNLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcInJzYVwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCIxLUdhd2dndUZ5R3JXS2F2N0FYNFZLVWdcIiIKKyAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5c1RhZykgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIjEtR2F3Z2d1RnlHcldLYXY3QVg0VktVZ1wiIgorICAgICAgICAgICAgICAgICJ9LCIKKyAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiwiCisgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIsIgorICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgIn1dIgorICAgICAgICAgICAgIn0iKTsKKworICAgIEtleU1hcCBrZXlzOworICAgIEVYUEVDVF9GQUxTRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5pc0VtcHR5KCkpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIE5vS2V5SWQpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lTRT1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBOb0tleSkgeworICAgIGNvbnN0IFN0cmluZzgganMoCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAiXCJrZXlzXCI6IgorICAgICAgICAgICAgICAgICAgICAiW3siCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcImBcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfVFJVRShqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKSk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5cygiR29vZCBkYXkhIik7CisgICAgdmVyaWZ5S2V5cyhrZXlzLCAmY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRLZXkpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiR2F3Z2d1RnlHcldLYXY3QVg0Vj8/P1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCI2N2VmMGdkOHB2ZmQwPVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjoiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWPz8/XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX1RSVUUoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuc2l6ZSgpID09IDEpOworCisgICAgY29uc3QgU3RyaW5nOCBjbGVhcktleXMoIkdvb2QgZGF5ISIpOworICAgIHZlcmlmeUtleXMoa2V5cywgJmNsZWFyS2V5cyk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgRW1wdHlKc29uV2ViS2V5KSB7CisgICAgY29uc3QgU3RyaW5nOCBqczsKKyAgICBLZXlNYXAga2V5czsKKyAgICBFWFBFQ1RfRkFMU0UoandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cykpOworICAgIEVYUEVDVF9UUlVFKGtleXMuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBNYWxmb3JtZWRKc29uV2ViS2V5KSB7CisgICAgLy8gTWlzc2luZyBiZWdpbiBhcnJheSAnWycKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cxXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJHYXdnZ3VGeUdyV0thdjdBWDRWS1VnXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIjY3ZWYwZ2Q4cHZmZDA9XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgIl0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgRVhQRUNUX0ZBTFNFKGp3ay0+ZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChqcywgJmtleXMpKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLmlzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihKc29uV2ViS2V5VGVzdCwgU2FtZUtleUlkKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF4XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzNcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXpcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAifV0iCisgICAgICAgICAgICAifSIpOworCisgICAgS2V5TWFwIGtleXM7CisgICAgandrLT5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGpzLCAma2V5cyk7CisgICAgRVhQRUNUX1RSVUUoa2V5cy5zaXplKCkgPT0gMik7CisKKyAgICBjb25zdCBTdHJpbmc4IGNsZWFyS2V5c1tdID0KKyAgICAgICAgICAgIHsgU3RyaW5nOCgiSGVsbG8gRnJpZW5kISIpLCBTdHJpbmc4KCJHb29kIGRheSEiKSB9OworICAgIHZlcmlmeUtleXMoa2V5cywgY2xlYXJLZXlzKTsKK30KKworVEVTVF9GKEpzb25XZWJLZXlUZXN0LCBFeHRyYWN0V2VsbEZvcm1lZEtleXMpIHsKKyAgICBjb25zdCBTdHJpbmc4IGpzKAorICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgIlwia2V5c1wiOiIKKyAgICAgICAgICAgICAgICAgICAgIlt7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMVwiIgorICAgICAgICAgICAgICAgICAgICAifSIKKyAgICAgICAgICAgICAgICAgICAgInsiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrdHlcIjpcIm9jdFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1cyXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJTR1ZzYkc4Z1JuSnBaVzVrSVFcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXlcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXM1wiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJZMnhsWVhKclpYbHJaWGxwWkRBelwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiUjI5dlpDQmtZWGtoXCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAyKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCitURVNUX0YoSnNvbldlYktleVRlc3QsIEV4dHJhY3RLZXlzKSB7CisgICAgY29uc3QgU3RyaW5nOCBqcygKKyAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICJcImtleXNcIjoiCisgICAgICAgICAgICAgICAgICAgICJbeyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtpZFwiOlwiWTJ4bFlYSnJaWGxyWlhscFpEQXhcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlNHVnNiRzhnUm5KcFpXNWtJU0VcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVzFcIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia3R5XCI6XCJvY3RcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImFsZ1wiOlwiQTEyOEtXMlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia1wiOlwiU0dWc2JHOGdSbkpwWlc1a0lRXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF5XCIiCisgICAgICAgICAgICAgICAgICAgICJ9IgorICAgICAgICAgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwicnNhXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJhbGdcIjpcIkExMjhLVy1yc2FcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImtcIjpcIlIyOXZaQ0JrWVhraFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIlwia2lkXCI6XCJyc2EtNjdlZjBnZDhwdmZkMD1cIiIKKyAgICAgICAgICAgICAgICAgICAgIn0iCisgICAgICAgICAgICAgICAgICAgICJ7IgorICAgICAgICAgICAgICAgICAgICAgICAgIlwiYWxnXCI6XCJBMTI4S1czXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJraWRcIjpcIlkyeGxZWEpyWlhsclpYbHBaREF6XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiXCJrXCI6XCJSMjl2WkNCa1lYa2hcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcImt0eVwiOlwib2N0XCIiCisgICAgICAgICAgICAgICAgICAgICJ9XSIKKyAgICAgICAgICAgICJ9Iik7CisKKyAgICBLZXlNYXAga2V5czsKKyAgICBqd2stPmV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoanMsICZrZXlzKTsKKyAgICBFWFBFQ1RfVFJVRShrZXlzLnNpemUoKSA9PSAzKTsKKworICAgIGNvbnN0IFN0cmluZzggY2xlYXJLZXlzW10gPQorICAgICAgICAgICAgeyBTdHJpbmc4KCJIZWxsbyBGcmllbmQhISIpLCBTdHJpbmc4KCJIZWxsbyBGcmllbmQhIiksCisgICAgICAgICAgICAgIFN0cmluZzgoIkdvb2QgZGF5ISIpIH07CisgICAgdmVyaWZ5S2V5cyhrZXlzLCBjbGVhcktleXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tayBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5tawppbmRleCBhZGEyM2EyLi4yNmMyNDViIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQubWsKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCkBAIC0yMSw3ICsyMSw4IEBACiAKIExPQ0FMX01PRFVMRSA6PSBsaWJtb2NrZHJtY3J5cHRvcGx1Z2luCiAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfU0hBUkVEX0xJQlJBUklFUykvbWVkaWFkcm0KK0xPQ0FMX1BST1BSSUVUQVJZX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBtZWRpYWRybQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJ1dGlscyBsaWJsb2cKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL01vY2tEcm1DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGRmMGJjYTMuLjJlYTU1NGIgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjk5LDYgKzI5OSwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgc3RhdHVzX3QgTW9ja0RybVBsdWdpbjo6dW5wcm92aXNpb25EZXZpY2UoKQorICAgIHsKKyAgICAgICAgQUxPR0QoIk1vY2tEcm1QbHVnaW46OnVucHJvdmlzaW9uRGV2aWNlKCkiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXR1c190IE1vY2tEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtNzI2LDcgKzczMiw3IEBACiAgICAgewogICAgICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlslZF0ge2NsZWFyOiVkLCBlbmNyeXB0ZWQ6JWR9ICIsIGksCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJbJXp1XSB7Y2xlYXI6JXp1LCBlbmNyeXB0ZWQ6JXp1fSAiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKaW5kZXggOTdkNzA1Mi4uNGI2MzI5OSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKQEAgLTg1LDYgKzg1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpOwogCisgICAgICAgIHN0YXR1c190IHVucHJvdmlzaW9uRGV2aWNlKCk7CisKICAgICAgICAgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpOwogICAgICAgICBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDc5NjgyYjguLjJiNjA4NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC03NCw2ICs3NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQpOwogCisgICAgc3RhdGljICBzdGF0dXNfdCAgY29ubmVjdExlZ2FjeShpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBzcDxDYW1lcmE+JiBjYW1lcmEpOworCiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+Q2FtZXJhKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHJlY29ubmVjdCgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGQ1MjE1NDMuLmM2MDc0ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTEwMiw2ICsxMDIsMTIgQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgVmVjdG9yIGNvbnRhaW5pbmcgdGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMKKyAgICAgKiBhcyBlbnVtcyBnaXZlbiBpbiBncmFwaGljcy5oLgorICAgICAqLworICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoVmVjdG9yPGludD4mIGZvcm1hdHMpIGNvbnN0OworCiAgICAgLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KICAgICAvLyBUaGUgYWNjZXNzIChyZWFkL3dyaXRlLCByZWFkIG9ubHksIG9yIHdyaXRlIG9ubHkpIGlzIHZpZXdlZCBmcm9tIHRoZQogICAgIC8vIHBlcnNwZWN0aXZlIG9mIGFwcGxpY2F0aW9ucywgbm90IGRyaXZlci4KQEAgLTY3NCw2ICs2ODAsMTMgQEAKICAgICAvLyBIaWdoLWR5bmFtaWMgcmFuZ2UgbW9kZQogICAgIHN0YXRpYyBjb25zdCBjaGFyIExJR0hURlhfSERSW107CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aGUgc3VwcG9ydGVkIHByZXZpZXcgZm9ybWF0cyBhcyBhbiBlbnVtIGdpdmVuIGluIGdyYXBoaWNzLmgKKyAgICAgKiBjb3Jyc3BvbmRpbmcgdG8gdGhlIGZvcm1hdCBnaXZlbiBpbiB0aGUgaW5wdXQgc3RyaW5nIG9yIC0xIGlmIG5vIHN1Y2gKKyAgICAgKiBjb252ZXJzaW9uIGV4aXN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHByZXZpZXdGb3JtYXRUb0VudW0oY29uc3QgY2hhciogZm9ybWF0KTsKKwogcHJpdmF0ZToKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVV0aWxzLmggYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNmYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0NMSUVOVF9DQU1FUkFVVElMU19ICisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FtZXJhVXRpbHMgY29udGFpbnMgdXRpbGl0eSBtZXRob2RzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBuYXRpdmUKKyAqIGNhbWVyYSBjbGllbnQsIGFuZCB0aGUgY2FtZXJhIHNlcnZpY2UuCisgKi8KK2NsYXNzIENhbWVyYVV0aWxzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIEFOYXRpdmVXaW5kb3cgdHJhbnNmb3JtIGZyb20gdGhlIHN0YXRpYyBjYW1lcmEKKyAgICAgICAgICogbWV0YWRhdGEuICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gYW5kIGxlbnMgZmFjaW5nCisgICAgICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGdldFJvdGF0aW9uVHJhbnNmb3JtKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiB0cmFuc2Zvcm0pOworICAgIHByaXZhdGU6CisgICAgICAgIENhbWVyYVV0aWxzKCk7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisKKyNlbmRpZiAvKiBBTkRST0lEX0NBTUVSQV9DTElFTlRfQ0FNRVJBVVRJTFNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlN2Q2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBUFRVUkVSRVNVTFRfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ2FwdHVyZVJlc3VsdEV4dHJhcyBpcyBhIHN0cnVjdHVyZSB0byBlbmNhcHN1bGF0ZSB2YXJpb3VzIGluZGljZXMgZm9yIGEgY2FwdHVyZSByZXN1bHQuCisgKiBUaGVzZSBpbmRpY2VzIGFyZSBmcmFtZXdvcmstaW50ZXJuYWwgYW5kIG5vdCBzZW50IHRvIHRoZSBIQUwuCisgKi8KK3N0cnVjdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHsKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHRvIGluZGV4IHRoZSByZXF1ZXN0IHNlcXVlbmNlIHRoYXQgdGhpcyByZXN1bHQgYmVsb25ncyB0by4KKyAgICAgKi8KKyAgICBpbnQzMl90IHJlcXVlc3RJZDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVnZXIgdG8gaW5kZXggdGhpcyByZXN1bHQgaW5zaWRlIGEgcmVxdWVzdCBzZXF1ZW5jZSwgc3RhcnRpbmcgZnJvbSAwLgorICAgICAqLworICAgIGludDMyX3QgYnVyc3RJZDsKKworICAgIC8qKgorICAgICAqIFRPRE86IEFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludDMyX3QgYWZUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IHByZWNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAvKioKKyAgICAgKiBBIDY0Yml0IGludGVnZXIgdG8gaW5kZXggdGhlIGZyYW1lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXN1bHQuCisgICAgICovCisgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJ0aWFsIHJlc3VsdCBjb3VudCAoaW5kZXgpIGZvciB0aGlzIGNhcHR1cmUgcmVzdWx0LgorICAgICAqLworICAgIGludDMyX3QgcGFydGlhbFJlc3VsdENvdW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgb2JqZWN0IGFzIGludmFsaWQgYnkgc2V0dGluZyByZXF1ZXN0SWQgdG8gYmUgLTEuCisgICAgICovCisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpCisgICAgICAgIDogcmVxdWVzdElkKC0xKSwKKyAgICAgICAgICBidXJzdElkKDApLAorICAgICAgICAgIGFmVHJpZ2dlcklkKDApLAorICAgICAgICAgIHByZWNhcHR1cmVUcmlnZ2VySWQoMCksCisgICAgICAgICAgZnJhbWVOdW1iZXIoMCksCisgICAgICAgICAgcGFydGlhbFJlc3VsdENvdW50KDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBpdCdzIGEgdmFsaWQgQ2FwdHVyZVJlc3VsdEV4dHJhcyBvYmplY3QuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLiBJdCBpcyB2YWxpZCBvbmx5IHdoZW4gcmVxdWVzdElkIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKFBhcmNlbCogcGFyY2VsKTsKKyAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKK307CisKK3N0cnVjdCBDYXB0dXJlUmVzdWx0IDogcHVibGljIHZpcnR1YWwgTGlnaHRSZWZCYXNlPENhcHR1cmVSZXN1bHQ+IHsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKKworICAgIENhcHR1cmVSZXN1bHQoKTsKKworICAgIENhcHR1cmVSZXN1bHQoY29uc3QgQ2FwdHVyZVJlc3VsdCYgb3RoZXJSZXN1bHQpOworCisgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoUGFyY2VsKiBwYXJjZWwpOworICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworfTsKKworfQorCisjZW5kaWYgLyogQU5EUk9JRF9IQVJEV0FSRV9DQVBUVVJFUkVTVUxUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmggYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCmluZGV4IGYzNDIxMjIuLmY3ZjA2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaApAQCAtMzEsNiArMzEsOCBAQAogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBWZW5kb3JUYWdEZXNjcmlwdG9yOworY2xhc3MgU3RyaW5nMTY7CiAKIGNsYXNzIElDYW1lcmFTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKIHsKQEAgLTQ3LDIxICs0OSw0MCBAQAogICAgICAgICBBRERfTElTVEVORVIsCiAgICAgICAgIFJFTU9WRV9MSVNURU5FUiwKICAgICAgICAgR0VUX0NBTUVSQV9DSEFSQUNURVJJU1RJQ1MsCisgICAgICAgIEdFVF9DQU1FUkFfVkVORE9SX1RBR19ERVNDUklQVE9SLAorICAgICAgICBHRVRfTEVHQUNZX1BBUkFNRVRFUlMsCisgICAgICAgIFNVUFBPUlRTX0NBTUVSQV9BUEksCisgICAgICAgIENPTk5FQ1RfTEVHQUNZLAogICAgIH07CiAKICAgICBlbnVtIHsKICAgICAgICAgVVNFX0NBTExJTkdfVUlEID0gLTEKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIEFQSV9WRVJTSU9OXzEgPSAxLAorICAgICAgICBBUElfVkVSU0lPTl8yID0gMiwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQgPSAtMQorICAgICAgfTsKKwogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgIGdldE51bWJlck9mQ2FtZXJhcygpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pID0gMDsKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzYykgPSAwOwogCiAgICAgLy8gUmV0dXJucyAnT0snIGlmIG9wZXJhdGlvbiBzdWNjZWVkZWQKICAgICAvLyAtIEVycm9yczogQUxSRUFEWV9FWElTVFMgaWYgdGhlIGxpc3RlbmVyIHdhcyBhbHJlYWR5IGFkZGVkCkBAIC05Nyw2ICsxMTgsMzAgQEAKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4mIGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgT0sgaWYgZGV2aWNlIHN1cHBvcnRzIGNhbWVyYTIgYXBpLAorICAgICAqIHJldHVybnMgLUVPUE5PVFNVUFAgaWYgaXQgZG9lc24ndC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQ2FtZXJhQXBpKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbikgPSAwOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgZGV2aWNlIGFzIGEgbGVnYWN5IGRldmljZSBmb3IgYSBnaXZlbiBIQUwgdmVyc2lvbi4KKyAgICAgKiBGb3IgaGFsVmVyc2lvbiwgdXNlIENBTUVSQV9BUElfREVWSUNFX1ZFUlNJT05fKiBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICogdmVyc2lvbiwgb3IgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCBmb3IgYSBzZXJ2aWNlLXNlbGVjdGVkIHZlcnNpb24uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCBiL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzU4YWNmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfdmVuZG9yX3RhZ3MuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhcmNlbDsKKworLyoqCisgKiBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdHMgYXJlIHBhcmNlbGFibGUgY29udGFpbmVycyBmb3IgdGhlIHZlbmRvciB0YWcKKyAqIGRlZmluaXRpb25zIHByb3ZpZGVkLCBhbmQgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBhc3MgdGhlIHZlbmRvciB0YWcKKyAqIGluZm9ybWF0aW9uIGVudW1lcmF0ZWQgYnkgdGhlIEhBTCB0byBjbGllbnRzIG9mIHRoZSBjYW1lcmEgc2VydmljZS4KKyAqLworY2xhc3MgVmVuZG9yVGFnRGVzY3JpcHRvcgorICAgICAgICA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VmVuZG9yVGFnRGVzY3JpcHRvcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VmVuZG9yVGFnRGVzY3JpcHRvcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nICdnZXQqJyBtZXRob2RzIGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgKiBmdW5jdGlvbnMgZGVmaW5lZCBpbgorICAgICAgICAgKiBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUvc3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oCisgICAgICAgICAqLworCisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB2ZW5kb3IgdGFncyBkZWZpbmVkLgorICAgICAgICBpbnQgZ2V0VGFnQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGlkJ3Mgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KKyAgICAgICAgdm9pZCBnZXRUYWdBcnJheSh1aW50MzJfdCogdGFnQXJyYXkpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNlY3Rpb24gbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0U2VjdGlvbk5hbWUodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB0YWcgbmFtZSBzdHJpbmcgZm9yIGEgZ2l2ZW4gdmVuZG9yIHRhZyBpZC4KKyAgICAgICAgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8vIFJldHVybnMgdGhlIHRhZyB0eXBlIGZvciBhIGdpdmVuIHZlbmRvciB0YWcgaWQuCisgICAgICAgIGludCBnZXRUYWdUeXBlKHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBpbnRvIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbCgKKyAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgUGFyY2VsKiBwYXJjZWwpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIHZlbmRvciB0YWcKKyAgICAgICAgICogc2VjdGlvbnMsIG9yIGFuIGVtcHR5IHZlY3RvciBpZiBub25lIGFyZSBkZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IGdldEFsbFNlY3Rpb25OYW1lcygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rdXAgdGhlIHRhZyBpZCBmb3IgYSBnaXZlbiB0YWcgbmFtZSBhbmQgc2VjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBsb29rdXBUYWcoU3RyaW5nOCBuYW1lLCBTdHJpbmc4IHNlY3Rpb24sIC8qb3V0Ki91aW50MzJfdCogdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogRHVtcCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgdmVuZG9yIHRhZ3MgdG8gYSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OworCisgICAgICAgIC8vIFN0YXRpYyBtZXRob2RzOgorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBwYXJjZWwuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gdmVuZG9yX3RhZ19vcHNfdAorICAgICAgICAgKiBzdHJ1Y3QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKGNvbnN0IHZlbmRvcl90YWdfb3BzX3QqIHZPcHMsCisgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB0byB1c2UgZm9yIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogQ2FtZXJhIG1ldGFkYXRhIG9wZXJhdGlvbnMgdGhhdCBhY2Nlc3MgdmVuZG9yIHRhZ3Mgd2lsbCB1c2UgdGhlCisgICAgICAgICAqIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgc2V0IHRoaXMgd2F5LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoY29uc3Qgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhcnMgdGhlIGdsb2JhbCB2ZW5kb3IgdGFnIGRlc2NyaXB0b3IgdXNlZCBieSB0aGlzIHByb2Nlc3MuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgdm9pZCBjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZ2xvYmFsIHZlbmRvciB0YWcgZGVzY3JpcHRvciB1c2VkIGJ5IHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICogVGhpcyB3aWxsIGNvbnRhaW4gTlVMTCBpZiBubyB2ZW5kb3IgdGFncyBhcmUgZGVmaW5lZC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90Pio+IG1SZXZlcnNlTWFwcGluZzsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFN0cmluZzg+IG1UYWdUb05hbWVNYXA7CisgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbVRhZ1RvU2VjdGlvbk1hcDsgLy8gVmFsdWUgaXMgb2Zmc2V0IGluIG1TZWN0aW9ucworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgaW50MzJfdD4gbVRhZ1RvVHlwZU1hcDsKKyAgICAgICAgU29ydGVkVmVjdG9yPFN0cmluZzg+IG1TZWN0aW9uczsKKyAgICAgICAgLy8gbXVzdCBiZSBpbnQzMl90IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBQYXJjZWw6OndyaXRlSW50MzIKKyAgICAgICAgaW50MzJfdCBtVGFnQ291bnQ7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmVuZG9yX3RhZ19vcHMgbVZlbmRvck9wczsKK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKworI2RlZmluZSBWRU5ET1JfVEFHX0RFU0NSSVBUT1JfSAorI2VuZGlmIC8qIFZFTkRPUl9UQUdfREVTQ1JJUFRPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCmluZGV4IDhkYWM0ZjIuLjY3MDQ4MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oCkBAIC0yNCw5ICsyNCwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGNsYXNzIENhbWVyYU1ldGFkYXRhOwogCisKIGNsYXNzIElDYW1lcmFEZXZpY2VDYWxsYmFja3MgOiBwdWJsaWMgSUludGVyZmFjZQogewogICAgIC8qKgpAQCAtMzksMjQgKzQyLDI5IEBACiAgICAgICogRXJyb3IgY29kZXMgZm9yIENBTUVSQV9NU0dfRVJST1IKICAgICAgKi8KICAgICBlbnVtIENhbWVyYUVycm9yQ29kZSB7CisgICAgICAgIEVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SID0gLTEsIC8vIFRvIGluZGljYXRlIGFsbCBpbnZhbGlkIGVycm9yIGNvZGVzCiAgICAgICAgIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgPSAwLAogICAgICAgICBFUlJPUl9DQU1FUkFfREVWSUNFID0gMSwKLSAgICAgICAgRVJST1JfQ0FNRVJBX1NFUlZJQ0UgPSAyCisgICAgICAgIEVSUk9SX0NBTUVSQV9TRVJWSUNFID0gMiwKKyAgICAgICAgRVJST1JfQ0FNRVJBX1JFUVVFU1QgPSAzLAorICAgICAgICBFUlJPUl9DQU1FUkFfUkVTVUxUID0gNCwKKyAgICAgICAgRVJST1JfQ0FNRVJBX0JVRkZFUiA9IDUsCiAgICAgfTsKIAogICAgIC8vIE9uZSB3YXkKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUVycm9yKENhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKIAogICAgIC8vIE9uZSB3YXkKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkRldmljZUlkbGUoKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25DYXB0dXJlU3RhcnRlZChpbnQzMl90IHJlcXVlc3RJZCwKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSA9IDA7CiAKICAgICAvLyBPbmUgd2F5Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25SZXN1bHRSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCmluZGV4IGY3MWYzMDIuLjM1NDg4YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAogc3RydWN0IGNhbWVyYV9tZXRhZGF0YTsKIApAQCAtMzAsNiArMzEsMTAgQEAKIGNsYXNzIENhcHR1cmVSZXF1ZXN0OwogY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CiAKK2VudW0geworICAgIE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTID0gLTEsCit9OworCiBjbGFzcyBJQ2FtZXJhRGV2aWNlVXNlciA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiAgICAgLyoqCkBAIC00NCw5ICs0OSw1NSBAQAogICAgICAqIFJlcXVlc3QgSGFuZGxpbmcKICAgICAgKiovCiAKKyAgICAvKioKKyAgICAgKiBGb3Igc3RyZWFtaW5nIHJlcXVlc3RzLCBvdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICAgICAqIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKiBGb3Igbm9uLXN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgZXhwZWN0ZWQgbGFzdAorICAgICAqIGZyYW1lIG51bWJlciBvZiB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqLwogICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogRm9yIHN0cmVhbWluZyByZXF1ZXN0cywgb3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAgICAgKiBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICogRm9yIG5vbi1zdHJlYW1pbmcgcmVxdWVzdHMsIG91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGV4cGVjdGVkIGxhc3QKKyAgICAgKiBmcmFtZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyByZXBlYXRpbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBiZWdpbkNvbmZpZ3VyZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGNhbGwgdG8gZGVsZXRlU3RyZWFtLCBjcmVhdGVTdHJlYW0sCisgICAgICogb3IgZW5kQ29uZmlndXJlLiAgSXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGlkbGUuCisgICAgICogPHA+CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgYmVnaW5Db25maWd1cmUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFbmQgdGhlIGRldmljZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogPHA+CisgICAgICogZW5kQ29uZmlndXJlIG11c3QgYmUgY2FsbGVkIGFmdGVyIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlIChpLmUuIGFmdGVyCisgICAgICogYSBjYWxsIHRvIGJlZ2luQ29uZmlndXJlIGFuZCBzdWJzZXF1ZW50IGNyZWF0ZVN0cmVhbS9kZWxldGVTdHJlYW0gY2FsbHMpLiAgVGhpcworICAgICAqIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcmVxdWVzdHMgY2FuIGJlIHN1Ym1pdHRlZC4KKyAgICAgKiA8cD4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmRDb25maWd1cmUoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY3JlYXRlU3RyZWFtKApAQCAtNjQsOCArMTE1LDEyIEBACiAgICAgLy8gV2FpdCB1bnRpbCBhbGwgdGhlIHN1Ym1pdHRlZCByZXF1ZXN0cyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB3YWl0VW50aWxJZGxlKCkgPSAgMDsKIAotICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyB3b3JrIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goKSA9IDA7CisgICAgLyoqCisgICAgICogRmx1c2ggYWxsIHBlbmRpbmcgYW5kIGluLXByb2dyZXNzIHdvcmsgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgcHJldmlvdXMgcmVwZWF0aW5nIHJlcXVlc3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZmx1c2goLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKaW5kZXggZWYzOTJmMC4uN2JlNDQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmgKQEAgLTYxLDYgKzYxLDE3IEBACiAgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgMAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMgPSBrSW52YWxpZFBUUykgPSAwOwogCisgICAgLy8gUmVsZWFzZSAoYSBwb3J0aW9uIG9mKSB0aGUgYnVmZmVyIHByZXZpb3VzbHkgb2J0YWluZWQgYnkgZ2V0TmV4dEJ1ZmZlcigpLgorICAgIC8vIEl0IGlzIHBlcm1pc3NpYmxlIHRvIGNhbGwgcmVsZWFzZUJ1ZmZlcigpIG11bHRpcGxlIHRpbWVzIHBlciBnZXROZXh0QnVmZmVyKCkuCisgICAgLy8gT24gZW50cnk6CisgICAgLy8gIGJ1ZmZlci0+ZnJhbWVDb3VudCAgbnVtYmVyIG9mIGZyYW1lcyB0byByZWxlYXNlLCBtdXN0IGJlIDw9IG51bWJlciBvZiBmcmFtZXMKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZCBidXQgbm90IHlldCByZWxlYXNlZAorICAgIC8vICBidWZmZXItPnJhdyAgICAgICAgIHVudXNlZAorICAgIC8vIE9uIHJldHVybjoKKyAgICAvLyAgYnVmZmVyLT5mcmFtZUNvdW50ICAwOyBpbXBsZW1lbnRhdGlvbiBNVVNUIHNldCB0byB6ZXJvCisgICAgLy8gIGJ1ZmZlci0+cmF3ICAgICAgICAgdW5kZWZpbmVkOyBpbXBsZW1lbnRhdGlvbiBpcyBQRVJNSVRURUQgdG8gc2V0IHRvIGFueSB2YWx1ZSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBzbyBpZiBjYWxsZXIgbmVlZHMgdG8gY29udGludWUgdXNpbmcgdGhpcyBidWZmZXIgaXQgbXVzdAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGtlZXAgdHJhY2sgb2YgdGhlIHBvaW50ZXIgaXRzZWxmCiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBlZWYxYjQxLi41ODM2OTVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0zNiw3ICszNiw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKK3N0cnVjdCBlZmZlY3RfcGFyYW1fY2Jsa190OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIxOCw4ICsyMTgsOSBAQAogICAgICAqICAgICAgaGlnaGVyIHByaW9yaXRpZXMsIDAgYmVpbmcgdGhlIG5vcm1hbCBwcmlvcml0eS4KICAgICAgKiBjYmY6ICAgICAgICAgb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gKHNlZSBlZmZlY3RfY2FsbGJhY2tfdCkKICAgICAgKiB1c2VyOiAgICAgICAgcG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgotICAgICAqIHNlc3Npb25JRDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uIElmIDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KLSAgICAgKiAgICAgIHRoZSBvdXRwdXQgbWl4LiBJZiBub3QgMCwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKKyAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqICAgICAgSWYgZXF1YWwgdG8gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCisgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gIE90aGVyd2lzZSwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KICAgICAgKiBpbzogIEhBTCBhdWRpbyBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRvIHdoaWNoIHRoaXMgZWZmZWN0IG11c3QgYmUgYXR0YWNoZWQuIExlYXZlIGF0IDAgZm9yCiAgICAgICogICAgICBhdXRvbWF0aWMgb3V0cHV0IHNlbGVjdGlvbiBieSBBdWRpb0ZsaW5nZXIuCkBAIC0yMzAsOCArMjMxLDggQEAKICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IDAKKyAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICApOwogCiAgICAgLyogQ29uc3RydWN0b3IuCkBAIC0yNDIsOCArMjQzLDggQEAKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUKICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvRWZmZWN0IGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTI2NCw4ICsyNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtNDUzLDYgKzQ1NCw3IEBACiAgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwogICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKKyAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhZmQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXworI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKK3sKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggMDUyMDY0ZC4uNGVkYzFiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMjYsNyArMjYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1JlY29yZENsaWVudFByb3h5OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOSw4ICszOSwxMiBAQAogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YSBOQVRJVkVfRVZFTlRfKi4KICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewotICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byByZWFkIG1vcmUgZGF0YSBmcm9tIFBDTSBidWZmZXIuCi0gICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBQQ00gYnVmZmVyIG92ZXJydW4gb2NjdXJyZWQuCisgICAgICAgIEVWRU5UX01PUkVfREFUQSA9IDAsICAgICAgICAvLyBSZXF1ZXN0IHRvIHJlYWQgYXZhaWxhYmxlIGRhdGEgZnJvbSBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGV2ZW50IGlzIGRlbGl2ZXJlZCBidXQgdGhlIGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHdhbnQgdG8gcmVhZCB0aGUgYXZhaWxhYmxlIGRhdGEsIHRoZSBoYW5kbGVyIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgYnkgc2V0dGluZyBmcmFtZUNvdW50IHRvIHplcm8uCisgICAgICAgIEVWRU5UX09WRVJSVU4gPSAxLCAgICAgICAgICAvLyBCdWZmZXIgb3ZlcnJ1biBvY2N1cnJlZC4KICAgICAgICAgRVZFTlRfTUFSS0VSID0gMiwgICAgICAgICAgIC8vIFJlY29yZCBoZWFkIGlzIGF0IHRoZSBzcGVjaWZpZWQgbWFya2VyIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoU2VlIHNldE1hcmtlclBvc2l0aW9uKCkpLgogICAgICAgICBFVkVOVF9ORVdfUE9TID0gMywgICAgICAgICAgLy8gUmVjb3JkIGhlYWQgaXMgYXQgYSBuZXcgcG9zaXRpb24KQEAgLTYwLDkgKzY0LDEwIEBACiAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQ7ICAgICAvLyBudW1iZXIgb2Ygc2FtcGxlIGZyYW1lcyBjb3JyZXNwb25kaW5nIHRvIHNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbnB1dCBpdCBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBhdmFpbGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBvdXRwdXQgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgZHJhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGN1cnJlbnRseSBpZ25vcmVkLCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCBidXQgd2lsbCBtYWtlIHRoZSBwcmltYXJ5IGZpZWxkIGluIGZ1dHVyZSkKIAogICAgICAgICBzaXplX3QgICAgICBzaXplOyAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzID09IGZyYW1lQ291bnQgKiBmcmFtZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGRyYWluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIFRSQU5TRkVSX09CVEFJTiBtb2RlIGlzIGJyb2tlbiBmb3IgOC1iaXQgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgZGVmaW5lIHRoZSBmcmFtZSBmb3JtYXQKQEAgLTc2LDcgKzgxLDcgQEAKIAogICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKICAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJpb3JpdHkuIFRoaXMgdGhyZWFkCi0gICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyByZWFkeSBvciB2YXJpb3VzIGNvbmRpdGlvbnMgb2NjdXIuCisgICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKICAgICAgKiBldmVudDogICB0eXBlIG9mIGV2ZW50IG5vdGlmaWVkIChzZWUgZW51bSBBdWRpb1JlY29yZDo6ZXZlbnRfdHlwZSkuCkBAIC05OSw2ICsxMDQsOCBAQAogICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbgogICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIHNlcnZlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKICAgICAgKiAgLSBCQURfVkFMVUU6IHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBmcmFtZUNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzIGlzIE5PX0VSUk9SLAorICAgICAqIGFuZCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLgogICAgICAqLwogCiAgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTEwOSw3ICsxMTYsNyBAQAogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gQXVkaW9SZWNvcmQKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewotICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gb3RoZXIgcGFyYW1ldGVycworICAgICAgICBUUkFOU0ZFUl9ERUZBVUxULCAgIC8vIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseTsgZGV0ZXJtaW5lIGZyb20gdGhlIG90aGVyIHBhcmFtZXRlcnMKICAgICAgICAgVFJBTlNGRVJfQ0FMTEJBQ0ssICAvLyBjYWxsYmFjayBFVkVOVF9NT1JFX0RBVEEKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBGSVhNRSBkZXByZWNhdGVkOiBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyByZWFkKCkKQEAgLTEzNyw3ICsxNDQsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgYmUgbGFyZ2VyIGlmIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgYXVkaW8gSEFMCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LiAgWmVybyBtZWFucyB0byB1c2UgYSBkZWZhdWx0IHZhbHVlLgogICAgICAqIGNiZjogICAgICAgICAgICAgICAgQ2FsbGJhY2sgZnVuY3Rpb24uIElmIG5vdCBudWxsLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnN1bWUgbmV3IFBDTSBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBjb25zdW1lIG5ldyBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCiAgICAgICogdXNlcjogICAgICAgICAgICAgICBDb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgogICAgICAqIG5vdGlmaWNhdGlvbkZyYW1lczogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgbm90aWZpY2F0aW9uRnJhbWVzIFBDTQogICAgICAqICAgICAgICAgICAgICAgICAgICAgZnJhbWVzIGFyZSByZWFkeSBpbiByZWNvcmQgdHJhY2sgb3V0cHV0IGJ1ZmZlci4KQEAgLTE1MSwxMSArMTU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkUpOwogCkBAIC0xNzEsOSArMTc4LDEwIEBACiAgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgaW50aWFsaXphdGlvbgogICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb1JlY29yZCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIG9yIHJlY29yZCBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UKLSAgICAgKiAgLSBCQURfVkFMVUU6IGludmFsaWQgcGFyYW1ldGVyIChjaGFubmVscywgZm9ybWF0LCBzYW1wbGVSYXRlLi4uKQorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUuLi4pCiAgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqICAtIFBFUk1JU1NJT05fREVOSUVEOiByZWNvcmRpbmcgaXMgbm90IGFsbG93ZWQgZm9yIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MKKyAgICAgKiBJZiBzdGF0dXMgaXMgbm90IGVxdWFsIHRvIE5PX0VSUk9SLCBkb24ndCBjYWxsIGFueSBvdGhlciBBUElzIG9uIHRoaXMgQXVkaW9SZWNvcmQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvUmVjb3JkIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgpAQCAtMTgzLDE2ICsxOTEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FKTsKIAotICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZAorICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwogICAgICAqIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9SZWNvcmQgcHJvZHVjZXMgdW5kZWZpbmVkIHJlc3VsdHMuCiAgICAgICogU2VlIHNldCgpIG1ldGhvZCBhYm92ZSBmb3IgcG9zc2libGUgcmV0dXJuIGNvZGVzLgpAQCAtMjIxLDcgKzIyOSw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbiA9IDApOwogCi0gICAgLyogU3RvcCBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAorICAgIC8qIFN0b3AgYSB0cmFjay4gIFRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZC4gIE5vdGUgdGhhdCBvYnRhaW5CdWZmZXIoKSBzdGlsbAogICAgICAqIHdvcmtzIGFuZCB3aWxsIGRyYWluIGJ1ZmZlcnMgdW50aWwgdGhlIHBvb2wgaXMgZXhoYXVzdGVkLCBhbmQgdGhlbiB3aWxsIHJldHVybiBXT1VMRF9CTE9DSy4KICAgICAgKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3AoKTsKQEAgLTIzMiwxMSArMjQwLDE2IEBACiAgICAgICovCiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgICB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQogCisgICAgLyogUmV0dXJuIHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQuCisgICAgICogVGhpcyBpcyBhcHByb3hpbWF0ZWx5IGhvdyBvZnRlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCwgZm9yIHRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0suCisgICAgICovCisgICAgICAgICAgICBzaXplX3QgICAgICBub3RpZmljYXRpb25GcmFtZXMoKSBjb25zdCAgeyByZXR1cm4gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgfQorCiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcmVjb3JkIHJlYWNoZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgc3BlY2lmaWVkLAogICAgICAqIGEgY2FsbGJhY2sgd2l0aCBldmVudCB0eXBlIEVWRU5UX01BUktFUiBpcyBjYWxsZWQuIENhbGxpbmcgc2V0TWFya2VyUG9zaXRpb24KICAgICAgKiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyIG5vdGlmaWNhdGlvbiBjYWxsYmFjay4KICAgICAgKiBUbyBzZXQgYSBtYXJrZXIgYXQgYSBwb3NpdGlvbiB3aGljaCB3b3VsZCBjb21wdXRlIGFzIDAsCi0gICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHRoZSBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCisgICAgICogYSB3b3JrYXJvdW5kIGlzIHRvIHNldCB0aGUgbWFya2VyIGF0IGEgbmVhcmJ5IHBvc2l0aW9uIHN1Y2ggYXMgfjAgb3IgMS4KICAgICAgKiBJZiB0aGUgQXVkaW9SZWNvcmQgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwKICAgICAgKiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbC4KICAgICAgKgpAQCAtMzc4LDggKzM5MSwxMCBAQAogICAgICAqIHJldHVybmluZyB0aGUgY3VycmVudCB2YWx1ZSBieSB0aGlzIGZ1bmN0aW9uIGNhbGwuICBTdWNoIGxvc3MgdHlwaWNhbGx5IG9jY3VycyB3aGVuIHRoZQogICAgICAqIHVzZXIgc3BhY2UgcHJvY2VzcyBpcyBibG9ja2VkIGxvbmdlciB0aGFuIHRoZSBjYXBhY2l0eSBvZiBhdWRpbyBkcml2ZXIgYnVmZmVycy4KICAgICAgKiBVbml0czogdGhlIG51bWJlciBvZiBpbnB1dCBhdWRpbyBmcmFtZXMuCisgICAgICogRklYTUUgVGhlIHNpZGUtZWZmZWN0IG9mIHJlc2V0dGluZyB0aGUgY291bnRlciBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggbXVsdGktY2xpZW50LgorICAgICAqIENvbnNpZGVyIG1ha2luZyBpdCBtb3JlIGxpa2UgQXVkaW9UcmFjazo6Z2V0VW5kZXJydW5GcmFtZXMgd2hpY2ggZG9lc24ndCBoYXZlIHNpZGUgZWZmZWN0cy4KICAgICAgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3Q7CisgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRJbnB1dEZyYW1lc0xvc3QoKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHJlY29yZCBvYmplY3RzIGlzIG5vdCBhbGxvd2VkICovCkBAIC00MTIsNiArNDI3LDcgQEAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VkOyAgICAvLyB3aGV0aGVyIHRocmVhZCBpcyByZXF1ZXN0ZWQgdG8gcGF1c2UgYXQgbmV4dCBsb29wIGVudHJ5CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZEludDsgLy8gd2hldGhlciB0aHJlYWQgaW50ZXJuYWxseSByZXF1ZXN0cyBwYXVzZQogICAgICAgICBuc2Vjc190ICAgICAgICAgICAgIG1QYXVzZWROczsgIC8vIGlmIG1QYXVzZWRJbnQgdGhlbiBhc3NvY2lhdGVkIHRpbWVvdXQsIG90aGVyd2lzZSBpZ25vcmVkCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQ7ICAgLy8gd2hldGhlciB0byBpZ25vcmUgbmV4dCBtUGF1c2VkSW50IHJlcXVlc3QKICAgICB9OwogCiAgICAgICAgICAgICAvLyBib2R5IG9mIEF1ZGlvUmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKQEAgLTQyMiw5ICs0MzgsMTAgQEAKICAgICAgICAgICAgIC8vICAgICAgTlNfSU5BQ1RJVkUgaW5hY3RpdmUgc28gZG9uJ3QgcnVuIGFnYWluIHVudGlsIHJlLXN0YXJ0ZWQKICAgICAgICAgICAgIC8vICAgICAgTlNfTkVWRVIgICAgbmV2ZXIgYWdhaW4KICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IE5TX1dIRU5FVkVSID0gLTEsIE5TX0lOQUNUSVZFID0gLTIsIE5TX05FVkVSID0gLTM7Ci0gICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1JlY29yZFRocmVhZD4mIHRocmVhZCk7CisgICAgICAgICAgICBuc2Vjc190IHByb2Nlc3NBdWRpb0J1ZmZlcigpOwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCisKICAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbChzaXplX3QgZXBvY2gpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCkBAIC00NDQsMTQgKzQ2MSwxNiBAQAogICAgIC8vIGZvciBub3RpZmljYXRpb24gQVBJcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7IC8vIHJlcXVlc3RlZCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiBjYWxsYmFjawotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nOyAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1PYnNlcnZlZFNlcXVlbmNlOyAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgdmFsdWUgb2YgbVNlcXVlbmNlCiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTWFya2VyUG9zaXRpb247ICAgIC8vIGluIHdyYXBwaW5nIChvdmVyZmxvdykgZnJhbWUgdW5pdHMKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtTWFya2VyUmVhY2hlZDsKQEAgLTQ2MCw5ICs0NzksMTMgQEAKIAogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBjdXJyZW50IElBdWRpb1JlY29yZCwgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBiYWNrIGJ5IEF1ZGlvRmxpbmdlciB0byB0aGUgY2xpZW50CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQ7ICAgICAgICAgLy8gZnJhbWUgY291bnQgdG8gcmVxdWVzdCB0aGUgZmlyc3Qgb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBuZXcgSUF1ZGlvUmVjb3JkIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKKwogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7ICAgICAgICAgLy8gYXBwLWxldmVsIGZyYW1lIHNpemUgPT0gQXVkaW9GbGluZ2VyIGZyYW1lIHNpemUKQEAgLTQ3MywxMiArNDk2LDEzIEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CiAKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQ7ICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dCgpCi0KLSAgICAvLyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgb2JqZWN0IGlzIHJlLWNyZWF0ZWQKKyAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKKyAgICAvLyBwcm92aWRlZCB0aGUgaW5pdGlhbCBzZXQoKSB3YXMgc3VjY2Vzc2Z1bAogICAgIHNwPElBdWRpb1JlY29yZD4gICAgICAgIG1BdWRpb1JlY29yZDsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OworICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9QVUJMSUNfSAorCisvLyBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggaXMgdGhlIG1heGltdW0gcmF0aW8gYmV0d2VlbiB0aGUgb3JpZ2luYWwKKy8vIGF1ZGlvIHNhbXBsZSByYXRlIGFuZCB0aGUgdGFyZ2V0IHJhdGUgd2hlbiBkb3duc2FtcGxpbmcsCisvLyBhcyBwZXJtaXR0ZWQgaW4gdGhlIGF1ZGlvIGZyYW1ld29yaywgZS5nLiBBdWRpb1RyYWNrIGFuZCBBdWRpb0ZsaW5nZXIuCisvLyBJbiBwcmFjdGljZSwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGRvd25zYW1wbGUgbW9yZSB0aGFuIDY6MQorLy8gZm9yIGJlc3QgYXVkaW8gcXVhbGl0eSwgZXZlbiB0aG91Z2ggdGhlIGF1ZGlvIGZyYW1ld29yayBwZXJtaXRzIGEgbGFyZ2VyCisvLyBkb3duc2FtcGxpbmcgcmF0aW8uCisvLyBUT0RPOiByZXBsYWNlIHdpdGggYW4gQVBJCisjZGVmaW5lIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCAyNTYKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX1BVQkxJQ19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMjI1ZWY3Ni4uZjhjMDE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NywyMCArNjgsMjQgQEAKIAogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0gb3IgaGF2ZSBiZWVuIGFjdGl2ZQogICAgIC8vIGluIHRoZSBwYXN0IGluUGFzdE1zIG1pbGxpc2Vjb25kcwotICAgIHN0YXRpYyBzdGF0dXNfdCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zID0gMCk7CisgICAgc3RhdGljIHN0YXR1c190IGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sICpzdGF0ZSwgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgdHJhY2tzIGFyZSBhY3RpdmUgZm9yIHdoYXQgcXVhbGlmaWVzIGFzIHJlbW90ZSBwbGF5YmFjawogICAgIC8vIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtIG9yIGhhdmUgYmVlbiBhY3RpdmUgaW4gdGhlIHBhc3QgaW5QYXN0TXMgbWlsbGlzZWNvbmRzLiBSZW1vdGUKICAgICAvLyBwbGF5YmFjayBpc24ndCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBsb2NhbCBwbGF5YmFjay4KICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCAqc3RhdGUsCi0gICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDApOworICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpOwogICAgIC8vIHJldHVybnMgdHJ1ZSBpbiAqc3RhdGUgaWYgYSByZWNvcmRlciBpcyBjdXJyZW50bHkgcmVjb3JkaW5nIHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKICAgICBzdGF0aWMgc3RhdHVzX3QgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlLCBib29sICpzdGF0ZSk7CiAKICAgICAvLyBzZXQvZ2V0IGF1ZGlvIGhhcmR3YXJlIHBhcmFtZXRlcnMuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgbGlzdCBvZiBwYXJhbWV0ZXJzCiAgICAgLy8ga2V5IHZhbHVlIHBhaXJzIGluIHRoZSBmb3JtOiBrZXkxPXZhbHVlMTtrZXkyPXZhbHVlMjsuLi4KICAgICAvLyBTb21lIGtleXMgYXJlIHJlc2VydmVkIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzIChTZWUgQXVkaW9QYXJhbWV0ZXIgY2xhc3MpLgorICAgIC8vIFRoZSB2ZXJzaW9ucyB3aXRoIGF1ZGlvX2lvX2hhbmRsZV90IGFyZSBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgbWVkaWEgZnJhbWV3b3JrIHVzZSBvbmx5LgogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICBzdGF0aWMgU3RyaW5nOCAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CisgICAgLy8gVGhlIHZlcnNpb25zIHdpdGhvdXQgYXVkaW9faW9faGFuZGxlX3QgYXJlIGludGVuZGVkIGZvciBKTkkuCisgICAgc3RhdGljIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgc3RhdGljIFN0cmluZzggIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKICAgICBzdGF0aWMgdm9pZCBzZXRFcnJvckNhbGxiYWNrKGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiKTsKIApAQCAtOTAsMzYgKzk1LDM3IEBACiAgICAgc3RhdGljIGZsb2F0IGxpbmVhclRvTG9nKGludCB2b2x1bWUpOwogICAgIHN0YXRpYyBpbnQgbG9nVG9MaW5lYXIoZmxvYXQgdm9sdW1lKTsKIAorICAgIC8vIFJldHVybmVkIHNhbXBsaW5nUmF0ZSBhbmQgZnJhbWVDb3VudCBvdXRwdXQgdmFsdWVzIGFyZSBndWFyYW50ZWVkCisgICAgLy8gdG8gYmUgbm9uLXplcm8gaWYgc3RhdHVzID09IE5PX0VSUk9SCiAgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZSh1aW50MzJfdCogc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LAotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKTsKICAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgd3JpdGUgYnVmZmVyLiBDb3JyZXNwb25kcyB0bwotICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoKQorICAgIC8vIGF1ZGlvX3N0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKCkvYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKCkKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KTsKICAgICAvLyByZXR1cm5zIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtIGxhdGVuY3kgaW4gbXMuIENvcnJlc3BvbmRzIHRvCiAgICAgLy8gYXVkaW9fc3RyZWFtX291dC0+Z2V0X2xhdGVuY3koKQogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRMYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSk7CiAKICAgICBzdGF0aWMgYm9vbCByb3V0ZWRUb0EyZHBPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKIAorICAgIC8vIHJldHVybiBzdGF0dXMgTk9fRVJST1IgaW1wbGllcyAqYnVmZlNpemUgPiAwCiAgICAgc3RhdGljIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCiAgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgQXVkaW9GbGluZ2VyIHRvIGF1ZGlvIEhBTCBhbmQKLSAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBvdXRwdXQgb24gd2hpY2ggdGhlIHNwZWNpZmllZCBzdHJlYW0gaXMgcGxheWluZwotICAgIC8vIGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICAvLyBhdWRpbyBkc3AgdG8gREFDIHNpbmNlIHRoZSBzcGVjaWZpZWQgb3V0cHV0IEkvTyBoYW5kbGUgaGFzIGV4aXRlZCBzdGFuZGJ5LgogICAgIC8vIHJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgogICAgIC8vIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLCBoYWxGcmFtZXMgYW5kIGRzcEZyYW1lcyBwb2ludCB0byB2YWxpZCBkYXRhCiAgICAgLy8gLSBJTlZBTElEX09QRVJBVElPTjogTm90IHN1cHBvcnRlZCBvbiBjdXJyZW50IGhhcmR3YXJlIHBsYXRmb3JtCkBAIC0xMjcsMTYgKzEzMywyNiBAQAogICAgIC8vIE5PVEU6IHRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBoYXJkd2FyZSBwbGF0Zm9ybXMgYW5kIGl0IGlzCiAgICAgLy8gbmVjZXNzYXJ5IHRvIGNoZWNrIHJldHVybmVkIHN0YXR1cyBiZWZvcmUgdXNpbmcgdGhlIHJldHVybmVkIHZhbHVlcy4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpkc3BGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaGFsRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzKTsKIAogICAgIC8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGlucHV0IGZyYW1lcyBsb3N0IGJ5IEhBTCBpbXBsZW1lbnRhdGlvbiwgb3IgMCBpZiB0aGUgaGFuZGxlIGlzIGludmFsaWQKLSAgICBzdGF0aWMgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgc3RhdGljIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CiAKLSAgICBzdGF0aWMgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgc3RhdGljIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyB1bmlxdWUgSUQgZm9yIHVzZSBhcyBhbiBhdWRpbyBzZXNzaW9uIElEIG9yIEkvTyBoYW5kbGUuCisgICAgLy8gSWYgdW5hYmxlIHRvIGNvbnRhY3QgQXVkaW9GbGluZ2VyLCByZXR1cm5zIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSBpbnN0ZWFkLgorICAgIC8vIEZJWE1FIElmIEF1ZGlvRmxpbmdlciB3ZXJlIHRvIGV2ZXIgZXhoYXVzdCB0aGUgdW5pcXVlIElEIG5hbWVzcGFjZSwKKyAgICAvLyAgICAgICB0aGlzIG1ldGhvZCBjb3VsZCBmYWlsIGJ5IHJldHVybmluZyBlaXRoZXIgQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFCisgICAgLy8gICAgICAgb3IgYW4gdW5zcGVjaWZpZWQgZXhpc3RpbmcgdW5pcXVlIElELgorICAgIHN0YXRpYyBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CisKKyAgICBzdGF0aWMgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKKworICAgIC8vIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uLgorICAgIC8vIFJldHVybiBhIHZhbGlkIHNvdXJjZSBvciBBVURJT19IV19TWU5DX0lOVkFMSUQgaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgLy8gb3Igbm8gSFcgc3luYyBzb3VyY2UgaXMgdXNlZC4KKyAgICBzdGF0aWMgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIC8vIHR5cGVzIG9mIGlvIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGV2ZW50cyByZWNlaXZlZCB3aXRoIGlvQ29uZmlnQ2hhbmdlZCgpCiAgICAgZW51bSBpb19jb25maWdfZXZlbnQgewpAQCAtMTU1LDcgKzE3MSw4IEBACiAgICAgY2xhc3MgT3V0cHV0RGVzY3JpcHRvciB7CiAgICAgcHVibGljOgogICAgICAgICBPdXRwdXREZXNjcmlwdG9yKCkKLSAgICAgICAgOiBzYW1wbGluZ1JhdGUoMCksIGZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIGNoYW5uZWxNYXNrKDApLCBmcmFtZUNvdW50KDApLCBsYXRlbmN5KDApICB7fQorICAgICAgICA6IHNhbXBsaW5nUmF0ZSgwKSwgZm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKSwgY2hhbm5lbE1hc2soMCksIGZyYW1lQ291bnQoMCksIGxhdGVuY3koMCkKKyAgICAgICAgICAgIHt9CiAKICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CkBAIC0xOTMsMjcgKzIxMCw0NCBAQAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisKKyAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbik7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgb3BlblJlY29yZCgpLAorICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QpOworCisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKQEAgLTI1NSw4ICsyODksNTYgQEAKICAgICAvLyBjaGVjayBwcmVzZW5jZSBvZiBhdWRpbyBmbGluZ2VyIHNlcnZpY2UuCiAgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiBiaW5kaW5nIHRvIHNlcnZpY2Ugc3VjY2VlZHMsIERFQURfT0JKRUNUIG90aGVyd2lzZQogICAgIHN0YXRpYyBzdGF0dXNfdCBjaGVja0F1ZGlvRmxpbmdlcigpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCisgICAgc3RhdGljIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworCisgICAgc3RhdGljIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICBzdGF0aWMgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvUG9ydENhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgICAgICAgQXVkaW9Qb3J0Q2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDYWxsYmFjaygpIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrKHNwPEF1ZGlvUG9ydENhbGxiYWNrPiBjYWxsQmFjayk7CisKIHByaXZhdGU6CiAKICAgICBjbGFzcyBBdWRpb0ZsaW5nZXJDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwgcHVibGljIEJuQXVkaW9GbGluZ2VyQ2xpZW50CkBAIC0yNzUsNyArMzU3LDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpOwogICAgIH07CiAKLSAgICBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewpAQCAtMjgzLDYgKzM2NiwxMCBAQAogCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH07CiAKICAgICBzdGF0aWMgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBnQXVkaW9GbGluZ2VyQ2xpZW50OwpAQCAtMzAyLDExICszODksMTEgQEAKIAogICAgIHN0YXRpYyBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogCi0gICAgLy8gbWFwcGluZyBiZXR3ZWVuIHN0cmVhbSB0eXBlcyBhbmQgb3V0cHV0cwotICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9faW9faGFuZGxlX3Q+IGdTdHJlYW1PdXRwdXRNYXA7CiAgICAgLy8gbGlzdCBvZiBvdXRwdXQgZGVzY3JpcHRvcnMgY29udGFpbmluZyBjYWNoZWQgcGFyYW1ldGVycwogICAgIC8vIChzYW1wbGluZyByYXRlLCBmcmFtZWNvdW50LCBjaGFubmVsIGNvdW50Li4uKQogICAgIHN0YXRpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIE91dHB1dERlc2NyaXB0b3IgKj4gZ091dHB1dHM7CisKKyAgICBzdGF0aWMgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGdBdWRpb1BvcnRDYWxsYmFjazsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IGMyOWM3ZTUuLjk5ZTljM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgPHRpbWUuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCiBjbGFzcyBBdWRpb1RpbWVzdGFtcCB7CiBwdWJsaWM6CiAgICAgQXVkaW9UaW1lc3RhbXAoKSA6IG1Qb3NpdGlvbigwKSB7CkBAIC0zMCw0ICszMiw2IEBACiAgICAgc3RydWN0IHRpbWVzcGVjIG1UaW1lOyAgICAgLy8gY29ycmVzcG9uZGluZyBDTE9DS19NT05PVE9OSUMgd2hlbiBmcmFtZSBpcyBleHBlY3RlZCB0byBwcmVzZW50CiB9OwogCit9ICAgLy8gbmFtZXNwYWNlCisKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19USU1FU1RBTVBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA0NzM2MzY5Li5iNTI1NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjcsNyArMjcsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK3N0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CiBjbGFzcyBBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiBjbGFzcyBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk7CiAKQEAgLTM2LDExICszNiw2IEBACiBjbGFzcyBBdWRpb1RyYWNrIDogcHVibGljIFJlZkJhc2UKIHsKIHB1YmxpYzoKLSAgICBlbnVtIGNoYW5uZWxfaW5kZXggewotICAgICAgICBNT05PICAgPSAwLAotICAgICAgICBMRUZUICAgPSAwLAotICAgICAgICBSSUdIVCAgPSAxCi0gICAgfTsKIAogICAgIC8qIEV2ZW50cyB1c2VkIGJ5IEF1ZGlvVHJhY2sgY2FsbGJhY2sgZnVuY3Rpb24gKGNhbGxiYWNrX3QpLgogICAgICAqIEtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhIE5BVElWRV9FVkVOVF8qLgpAQCAtODIsNiArNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjdXJyZW50bHkgaWdub3JlZCwgYnV0IHdpbGwgbWFrZSB0aGUgcHJpbWFyeSBmaWVsZCBpbiBmdXR1cmUpCiAKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsgICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMgPT0gZnJhbWVDb3VudCAqIGZyYW1lU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGlucHV0IGl0IGlzIHVudXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG91dHB1dCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGZpbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgcmVkdW5kYW50IHdpdGggcmVzcGVjdCB0byBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBUUkFOU0ZFUl9PQlRBSU4gbW9kZSBpcyBicm9rZW4gZm9yIDgtYml0IGRhdGEKQEAgLTkxLDcgKzg3LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIHJhdzsKICAgICAgICAgICAgIHNob3J0KiAgICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCi0gICAgICAgIH07CisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xMjMsNiArMTE5LDggQEAKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KICAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICogZnJhbWVDb3VudCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGlmIHN0YXR1cyBpcyBOT19FUlJPUiwKKyAgICAgKiBhbmQgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4KICAgICAgKi8KIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwKQEAgLTE1Niw5ICsxNTQsMTAgQEAKICAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KICAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouCi0gICAgICogZm9ybWF0OiAgICAgICAgICAgICBBdWRpbyBmb3JtYXQgKGUuZyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBmb3Igc2lnbmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAxNiBiaXRzIHBlciBzYW1wbGUpLgotICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLgorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0LiAgRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSworICAgICAqICAgICAgICAgICAgICAgICAgICAgb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCB3aGljaCBpcyBoYW5kbGVkIG9uIGNsaWVudCBzaWRlLiAgRm9yIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IHNpbmsuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2ssIHN1Y2ggdGhhdCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgaXMgdHJ1ZS4KICAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlCiAgICAgICogICAgICAgICAgICAgICAgICAgICBsYXRlbmN5IG9mIHRoZSB0cmFjay4gVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBBdWRpb1RyYWNrIGNvdWxkIGJlCkBAIC0xODAsMTUgKzE3OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0yMDksMTEgKzIxMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyICAgICAgICAgID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCAgICAgICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9UcmFjayBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9UcmFjay4KQEAgLTI0MSwxNyArMjQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgICAgICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQgPSAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvVHJhY2suIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1RyYWNrIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTI3OSw3ICsyODQsNyBAQAogICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVTaXplKCkgY29uc3QgICB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKICAgICAgICAgICAgIHVpbnQzMl90ICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KLSAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICAgICAgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCAgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KIAogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CkBAIC0zMzYsNyArMzQxLDcgQEAKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKLSAgICAvKiBSZXR1cm4gY3VycmVudCBzb3VyY2Ugc2FtcGxlIHJhdGUgaW4gSHosIG9yIDAgaWYgdW5rbm93biAqLworICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogCiAgICAgLyogRW5hYmxlcyBsb29waW5nIGFuZCBzZXRzIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBvZiBsb29waW5nLgpAQCAtMzYxLDcgKzM2Niw3IEBACiAgICAgLyogU2V0cyBtYXJrZXIgcG9zaXRpb24uIFdoZW4gcGxheWJhY2sgcmVhY2hlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzcGVjaWZpZWQsIGEgY2FsbGJhY2sgd2l0aAogICAgICAqIGV2ZW50IHR5cGUgRVZFTlRfTUFSS0VSIGlzIGNhbGxlZC4gQ2FsbGluZyBzZXRNYXJrZXJQb3NpdGlvbiB3aXRoIG1hcmtlciA9PSAwIGNhbmNlbHMgbWFya2VyCiAgICAgICogbm90aWZpY2F0aW9uIGNhbGxiYWNrLiAgVG8gc2V0IGEgbWFya2VyIGF0IGEgcG9zaXRpb24gd2hpY2ggd291bGQgY29tcHV0ZSBhcyAwLAotICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byB0aGUgc2V0IHRoZSBtYXJrZXIgYXQgYSBuZWFyYnkgcG9zaXRpb24gc3VjaCBhcyB+MCBvciAxLgorICAgICAqIGEgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIG1hcmtlciBhdCBhIG5lYXJieSBwb3NpdGlvbiBzdWNoIGFzIH4wIG9yIDEuCiAgICAgICogSWYgdGhlIEF1ZGlvVHJhY2sgaGFzIGJlZW4gb3BlbmVkIHdpdGggbm8gY2FsbGJhY2sgZnVuY3Rpb24gYXNzb2NpYXRlZCwgdGhlIG9wZXJhdGlvbiB3aWxsCiAgICAgICogZmFpbC4KICAgICAgKgpAQCAtNDI1LDcgKzQzMCw3IEBACiAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCiAgICAgICogIC0gQkFEX1ZBTFVFOiAgcG9zaXRpb24gaXMgTlVMTAogICAgICAqLwotICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbik7CiAKICAgICAvKiBGb3Igc3RhdGljIGJ1ZmZlciBtb2RlIG9ubHksIHRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpbiBmcmFtZXMKICAgICAgKiByZWxhdGl2ZSB0byBzdGFydCBvZiBidWZmZXIuICBJdCBpcyBhbmFsb2dvdXMgdG8gdGhlIHBvc2l0aW9uIHVuaXRzIHVzZWQgYnkKQEAgLTQ1MCw5ICs0NTUsMTAgQEAKICAgICAgKiAgbm9uZS4KICAgICAgKgogICAgICAqIFJldHVybmVkIHZhbHVlOgotICAgICAqICBoYW5kbGUgb24gYXVkaW8gaGFyZHdhcmUgb3V0cHV0CisgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQorICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgIGdldE91dHB1dCgpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKiBSZXR1cm5zIHRoZSB1bmlxdWUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFjay4KICAgICAgKgpAQCAtNTI4LDE1ICs1MzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqZWxhcHNlZCA9IE5VTEwsIHNpemVfdCAqbm9uQ29udGlnID0gTlVMTCk7CiBwdWJsaWM6CiAKLS8vRUxfRklYTUUgdG8gYmUgcmVjb25jaWxlZCB3aXRoIG5ldyBvYnRhaW5CdWZmZXIoKSByZXR1cm4gY29kZXMgYW5kIGNvbnRyb2wgYmxvY2sgcHJveHkKLS8vICAgICAgICAgICAgZW51bSB7Ci0vLyAgICAgICAgICAgIE5PX01PUkVfQlVGRkVSUyA9IDB4ODAwMDAwMDEsICAgLy8gc2FtZSBuYW1lIGluIEF1ZGlvRmxpbmdlci5oLCBvayB0byBiZSBkaWZmZXJlbnQgdmFsdWUKLS8vICAgICAgICAgICAgVEVBUl9ET1dOICAgICAgID0gMHg4MDAwMDAwMiwKLS8vICAgICAgICAgICAgU1RPUFBFRCA9IDEsCi0vLyAgICAgICAgICAgIFNUUkVBTV9FTkRfV0FJVCwKLS8vICAgICAgICAgICAgU1RSRUFNX0VORAotLy8gICAgICAgIH07Ci0KICAgICAvKiBSZWxlYXNlIGEgZmlsbGVkIGJ1ZmZlciBvZiAiYXVkaW9CdWZmZXItPmZyYW1lQ291bnQiIGZyYW1lcyBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb2Nlc3MuICovCiAgICAgLy8gRklYTUUgbWFrZSBwcml2YXRlIHdoZW4gb2J0YWluQnVmZmVyKCkgZm9yIFRSQU5TRkVSX09CVEFJTiBpcyByZW1vdmVkCiAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpOwpAQCAtNTUxLDggKzU0OCwxMSBAQAogICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCiAgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCisgICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKKyAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCiAgICAgICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKIAogICAgIC8qCiAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCAgICBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0OwogCiAgICAgLyogR2V0IHRoZSBmbGFncyAqLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICAvKiBTZXQgcGFyYW1ldGVycyAtIG9ubHkgcG9zc2libGUgd2hlbiB1c2luZyBkaXJlY3Qgb3V0cHV0ICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwpAQCAtNTgwLDcgKzU4MCwxNSBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLIGlmIGNhbGxlZCBpbiBTVE9QUEVEIG9yIEZMVVNIRUQgc3RhdGUsIG9yIGlmIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgc3RhcnQvQUNUSVZFLCB3aGVuIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvbnN1bWVkIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgaGFyZHdhcmUgbGF0ZW5jeSB0byBwaHlzaWNhbCBvdXRwdXQuIEluIFdPVUxEX0JMT0NLIGNhc2VzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IHBvbGwgYWdhaW4sIG9yIHVzZSBnZXRQb3NpdGlvbigpLCBvciB1c2UgMCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZSBmb3IgdGhlIHRpbWVzdGFtcC4KKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBGYXN0VHJhY2ssIHdyb25nIHN0YXRlLCBvciBzb21lIG90aGVyIGVycm9yLgorICAgICAqCisgICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgc3RhdHVzIGlzIG5vdCBOT19FUlJPUi4KICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIApAQCAtNTg5LDYgKzU5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpOworICAgIC8qIHBhYSBpcyBndWFyYW50ZWVkIG5vbi1OVUxMICovCisgICAgICAgICAgICBib29sICAgICAgICBpc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSk7CisKICAgICAvKiBhIHNtYWxsIGludGVybmFsIGNsYXNzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2sgKi8KICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKQEAgLTYyNiw1MyArNjM5LDYzIEBACiAgICAgICAgICAgICAvLyAgICAgIE5TX0lOQUNUSVZFIGluYWN0aXZlIHNvIGRvbid0IHJ1biBhZ2FpbiB1bnRpbCByZS1zdGFydGVkCiAgICAgICAgICAgICAvLyAgICAgIE5TX05FVkVSICAgIG5ldmVyIGFnYWluCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBOU19XSEVORVZFUiA9IC0xLCBOU19JTkFDVElWRSA9IC0yLCBOU19ORVZFUiA9IC0zOwotICAgICAgICAgICAgbnNlY3NfdCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4mIHRocmVhZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBwcm9jZXNzU3RyZWFtRW5kKGludDMyX3Qgd2FpdENvdW50KTsKKyAgICAgICAgICAgIG5zZWNzX3QgcHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAKKyAgICAgICAgICAgIGJvb2wgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CisgICAgICAgICAgICBib29sICAgICBpc0RpcmVjdCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVwb2NoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgICAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gbVN0YXRlICE9IFNUQVRFX0FDVElWRQogICAgICAgICAgICAgdm9pZCBmbHVzaF9sKCk7CiAKICAgICAgICAgICAgIHZvaWQgc2V0TG9vcF9sKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRfbCgpOwogCiAgICAgICAgICAgICAvLyBGSVhNRSBlbnVtIGlzIGZhc3RlciB0aGFuIHN0cmNtcCgpIGZvciBwYXJhbWV0ZXIgJ2Zyb20nCiAgICAgICAgICAgICBzdGF0dXNfdCByZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKTsKIAotICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWQoKSBjb25zdAorICAgICAgICAgICAgYm9vbCAgICAgaXNPZmZsb2FkZWRfbCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KIAotICAgIC8vIE5leHQgMyBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCisgICAgICAgICAgICBib29sICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSBjb25zdAorICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKworICAgICAgICAgICAgYm9vbCAgICAgaXNEaXJlY3RfbCgpIGNvbnN0CisgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorCisgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVBvc2l0aW9uIGJ5IHRoZSBkZWx0YSBvZiBtU2VydmVyLCBhbmQgcmV0dXJuIG5ldyB2YWx1ZSBvZiBtUG9zaXRpb24KKyAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKKworICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CisKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtVm9sdW1lWzJdOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgbXV0YWJsZSB1aW50MzJfdCAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAgICAgICAgLy8gbXV0YWJsZSBiZWNhdXNlIGdldFNhbXBsZVJhdGUoKSBjYW4gdXBkYXRlIGl0LgotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2sKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudDsgICAgICAgICAvLyBmcmFtZSBjb3VudCB0byByZXF1ZXN0IHRoZSBuZXh0IHRpbWUgYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJQXVkaW9UcmFjayBpcyBuZWVkZWQKLQorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvVHJhY2ssIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBieSBBdWRpb0ZsaW5nZXIgdG8gdGhlIGNsaWVudAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50OyAgICAgICAgIC8vIGZyYW1lIGNvdW50IHRvIHJlcXVlc3QgdGhlIGZpcnN0IG9yIG5leHQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbmV3IElBdWRpb1RyYWNrIGlzIG5lZWRlZCwgbm9uLWRlY3JlYXNpbmcKIAogICAgIC8vIGNvbnN0YW50IGFmdGVyIGNvbnN0cnVjdG9yIG9yIHNldCgpCiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgICAgICAgLy8gYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCwgbm90IGZvcmNlZCB0byAxNi1iaXQKICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsKKyAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIHRyYW5zZmVyX3R5cGUgICAgICAgICAgIG1UcmFuc2ZlcjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCAgICBtT2ZmbG9hZEluZm9Db3B5OworICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190KiBtT2ZmbG9hZEluZm87CisgICAgYXVkaW9fYXR0cmlidXRlc190ICAgICAgbUF0dHJpYnV0ZXM7CiAKICAgICAvLyBtRnJhbWVTaXplIGlzIGVxdWFsIHRvIG1GcmFtZVNpemVBRiBmb3Igbm9uLVBDTSBvciAxNi1iaXQgUENNIGRhdGEuICBGb3IgOC1iaXQgUENNIGRhdGEsIGl0J3MKICAgICAvLyB0d2ljZSBhcyBsYXJnZSBhcyBtRnJhbWVTaXplIGJlY2F1c2UgZGF0YSBpcyBleHBhbmRlZCB0byAxNi1iaXQgYmVmb3JlIGl0J3Mgc3RvcmVkIGluIGJ1ZmZlci4KQEAgLTcwNSwyMSArNzI4LDM5IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgLy8gYWN0dWFsIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IGluaXRpYWwgc291cmNlIHNhbXBsZSByYXRlCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2ggbmV4dCAyCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmc7ICAgICAgLy8gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgc2hvdWxkIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUmVtYWluaW5nRnJhbWVzIGFuZCBtUmV0cnlPblBhcnRpYWxCdWZmZXIKIAogICAgIC8vIFRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpLCBhbmQgYXJlIG5vdCBwcm90ZWN0ZWQgYnkgYSBsb2NrCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyB0byByZXF1ZXN0IGluIG9idGFpbkJ1ZmZlcigpCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVJldHJ5T25QYXJ0aWFsQnVmZmVyOyAgLy8gc2xlZXAgYW5kIHJldHJ5IGFmdGVyIHBhcnRpYWwgb2J0YWluQnVmZmVyKCkKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZTsgICAgICAvLyBsYXN0IG9ic2VydmVkIHZhbHVlIG9mIG1TZXF1ZW5jZQogCi0gICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTG9vcFBlcmlvZDsgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIHplcm8gbWVhbnMgbG9vcGluZyBpcyBkaXNhYmxlZAorCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU1hcmtlclBvc2l0aW9uOyAgICAgICAgLy8gaW4gd3JhcHBpbmcgKG92ZXJmbG93KSBmcmFtZSB1bml0cwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1NYXJrZXJSZWFjaGVkOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsgICAgICAgICAgIC8vIGluIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1VcGRhdGVQZXJpb2Q7ICAgICAgICAgIC8vIGluIGZyYW1lcywgemVybyBtZWFucyBubyBFVkVOVF9ORVdfUE9TCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcnZlcjsgICAgICAgICAgICAgICAgLy8gaW4gZnJhbWVzLCBsYXN0IGtub3duIG1Qcm94eS0+Z2V0UG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGNvdW50IG9mIGZyYW1lcyBjb25zdW1lZCBieSBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgYnkgbmV3IElBdWRpb1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgaXQgaXMgcmVzZXQgYnkgc3RvcCgpIGlzIFRCRAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Qb3NpdGlvbjsgICAgICAgICAgICAgIC8vIGluIGZyYW1lcywgbGlrZSBtU2VydmVyIGV4Y2VwdCBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb25vdG9uaWNhbGx5IGFmdGVyIG5ldyBJQXVkaW9UcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY291bGQgYmUgZWFzaWx5IHdpZGVuZWQgdG8gdWludDY0X3QKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtUmVsZWFzZWQ7ICAgICAgICAgICAgICAvLyBpbiBmcmFtZXMsIGNvdW50IG9mIGZyYW1lcyByZWxlYXNlZCB0byBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm90IG5lY2Vzc2FyaWx5IGNvbnN1bWVkIGJ5IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBieSBzdG9wKCkgYnV0IGNvbnRpbnVlcyBtb25vdG9uaWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbmV3IElBdWRpb1RyYWNrIHRvIHJlc3RvcmUgbVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb3VsZCBiZSBlYXNpbHkgd2lkZW5lZCB0byB1aW50NjRfdAorICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1TdGFydFVzOyAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCB0aW1lIGFmdGVyIGZsdXNoIG9yIHN0b3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2VkIGZvciBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MuCiAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgICAgIC8vIGNvbnN0IGFmdGVyIHNldCgpLCBleGNlcHQgZm9yIGJpdHMgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBhbmQgQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRC4KKyAgICAgICAgLy8gbUxvY2sgbXVzdCBiZSBoZWxkIHRvIHJlYWQgb3Igd3JpdGUgdGhvc2UgYml0cyByZWxpYWJseS4KKwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogCkBAIC03MzksNyArNzgwLDYgQEAKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsgICAgICAgICAvLyBwcmltYXJ5IG93bmVyIG9mIHRoZSBtZW1vcnkKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1JblVuZGVycnVuOyAgICAgICAgICAgIC8vIHdoZXRoZXIgdHJhY2sgaXMgY3VycmVudGx5IGluIHVuZGVycnVuIHN0YXRlCi0gICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgbU5hbWU7ICAgICAgICAgICAgICAgICAgLy8gc2VydmVyJ3MgbmFtZSBmb3IgdGhpcyBJQXVkaW9UcmFjawogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1QYXVzZWRQb3NpdGlvbjsKIAogcHJpdmF0ZToKQEAgLTc1NCw4ICs3OTQsOCBAQAogCiAgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgbURlYXRoTm90aWZpZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNlcXVlbmNlOyAgICAgICAgICAgICAgLy8gaW5jcmVtZW50ZWQgZm9yIGVhY2ggbmV3IElBdWRpb1RyYWNrIGF0dGVtcHQKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyBjYWNoZWQgb3V0cHV0IGlvIGhhbmRsZQogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKIH07CiAKIGNsYXNzIFRpbWVkQXVkaW9UcmFjayA6IHB1YmxpYyBBdWRpb1RyYWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWEzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ0hBUkFDVEVSX0VOQ09ESU5HX0RFVEVDVE9SX0gKKyNkZWZpbmUgX0NIQVJBQ1RFUl9FTkNPRElOR19ERVRFQ1RPUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KKworI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgeworCisgICAgcHVibGljOgorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKyAgICAgICAgfkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKKworICAgICAgICB2b2lkIGFkZFRhZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIHNpemVfdCBzaXplKCk7CisKKyAgICAgICAgdm9pZCBkZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgICAgIHN0YXR1c190IGdldFRhZyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyKip2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoICpnZXRQcmVmZXJyZWQoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5wdXQsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEsIHNpemVfdCBtYXRjaGVzLAorICAgICAgICAgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpOworCisgICAgICAgIGJvb2wgaXNGcmVxdWVudChjb25zdCB1aW50MTZfdCAqdmFsdWVzLCB1aW50MzJfdCBjKTsKKworICAgICAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgorICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYnl0ZSBibG9iIGFycmF5cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUKKyAgICAgICAgLy8gc2luZ2xlbnVsbGJ5dGUtdGVybWluYXRlZAorICAgICAgICBTdHJpbmdBcnJheSAgICAgbU5hbWVzOworICAgICAgICBTdHJpbmdBcnJheSAgICAgbVZhbHVlczsKKworICAgICAgICBVQ29udmVydGVyKiAgICAgbVV0ZjhDb252OworfTsKKworCisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggODk5ZDc5Zi4uMzFhMTRmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTUwLDYgKzUwLDcgQEAKICAgICAgICAgVFJBQ0tfVElNRUQgICA9IDEsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBUaW1lZEF1ZGlvVHJhY2sKICAgICAgICAgVFJBQ0tfRkFTVCAgICA9IDIsICAvLyBjbGllbnQgcmVxdWVzdHMgYSBmYXN0IEF1ZGlvVHJhY2sgb3IgQXVkaW9SZWNvcmQKICAgICAgICAgVFJBQ0tfT0ZGTE9BRCA9IDQsICAvLyBjbGllbnQgcmVxdWVzdHMgb2ZmbG9hZCB0byBodyBjb2RlYworICAgICAgICBUUkFDS19ESVJFQ1QgPSA4LCAgIC8vIGNsaWVudCByZXF1ZXN0cyBhIGRpcmVjdCBvdXRwdXQKICAgICB9OwogICAgIHR5cGVkZWYgdWludDMyX3QgdHJhY2tfZmxhZ3NfdDsKIApAQCAtNjQsMzcgKzY1LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLCAgLy8gLTEgbWVhbnMgdW51c2VkLCBvdGhlcndpc2UgbXVzdCBiZSB2YWxpZCBub24tMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQ6IGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0OiBzZXJ2ZXIncyBkZXNjcmlwdGlvbiBvZiBJQXVkaW9UcmFjayBmb3IgZGlzcGxheSBpbiBsb2dzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhdHRlbXB0IHRvIHBhcnNlLCBhcyB0aGUgZm9ybWF0IGNvdWxkIGNoYW5nZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBBdWRpb0ZsaW5nZXIgdGFrZXMgb3ZlciB0aGUgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciBvbiBmYWlsdXJlLCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsICAvLyAtMSBtZWFucyB1bnVzZWQsIG90aGVyd2lzZSBtdXN0IGJlIHZhbGlkIG5vbi0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLCAgIC8vIHJldHVybiB2YWx1ZSAwIG1lYW5zIGl0IGZvbGxvd3MgY2JsawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKICAgICAvKiBxdWVyeSB0aGUgYXVkaW8gaGFyZHdhcmUgc3RhdGUuIFRoaXMgc3RhdGUgbmV2ZXIgY2hhbmdlcywKICAgICAgKiBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCiAgICAgICovCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0ID0gMDsKLSNpZiAwCi0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwotI2VuZGlmCiAgICAgdmlydHVhbCAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKQEAgLTE0Miw0MCArMTQ1LDQxIEBACiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpIGNvbnN0ID0gMDsKIApAQCAtMTg4LDYgKzE5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIGRvZXNuJ3QgdGFrZSBvdmVyIGhhbmRsZSByZWZlcmVuY2UgZnJvbSBjbGllbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApAQCAtMjA5LDYgKzIxNCwyOSBAQAogICAgIC8vIGFuZCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4gIEZvciBhIGRlZmluaXRpb24gb2Ygd2hhdCAibG93IFJBTSIgbWVhbnMsIHNlZQogICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpID0gMDsKKworICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSA9IDA7CisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKKyAgICAvKiBHZXQgdGhlIEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgdXNlZCBmb3IgYW4gYXVkaW8gc2Vzc2lvbiAqLworICAgIHZpcnR1YWwgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMDliOWVhNi4uMTZmZTljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCkBAIC01NSw2ICs1NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKQEAgLTYzLDEzICs3MCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiA9IDApID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KSA9IDA7CkBAIC05OSw2ICsxMTAsNDAgQEAKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CisKKyAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworCisgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICisKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOworCisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKK307CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCmluZGV4IGVjY2MyY2EuLjIwMDM5ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaApAQCAtMzQsOSArMzQsNiBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQpOwogCi0gICAgLyogZ2V0IHRoaXMgdHJhY2tzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KICAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwogICAgICAqIG1ha2UgaXQgYWN0aXZlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmluZGV4IDVjOGE0ODQuLjYxOWFjNzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAvKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpID0gMDsKIAotICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQgKi8KKyAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwogCiAgICAgLyogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggMzJhZTI4ZS4uNjhkZTg3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTcwLDYgKzcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNlYThiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNRURJQUNPREVDTElTVF9ICisjZGVmaW5lIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAgLy8gZm9yIHN0YXR1c190CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBJTWVkaWFDb2RlY0xpc3Q6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYUNvZGVjTGlzdCk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbk1lZGlhQ29kZWNMaXN0OiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhQ29kZWNMaXN0PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSU1FRElBQ09ERUNMSVNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTYzZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCisKKyNkZWZpbmUgSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCisvKiogTVVTVCBzdGF5IGluIHN5bmMgd2l0aCBJTWVkaWFIVFRQQ29ubmVjdGlvbi5haWRsICovCisKK3N0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhSFRUUENvbm5lY3Rpb24pOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpID0gMDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TUlNRVR5cGUoU3RyaW5nOCAqbWltZVR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVyaShTdHJpbmc4ICp1cmkpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJTWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElfTUVESUFfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2ZDZjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJX01FRElBX0hUVFBfU0VSVklDRV9IXworCisjZGVmaW5lIElfTUVESUFfSFRUUF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CisKKy8qKiBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIElNZWRpYUhUVFBTZXJ2aWNlLmFpZGwgKi8KKworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UgeworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQU2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJX01FRElBX0hUVFBfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDZkYmIyZDcuLjI1Mjk4MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIGNsYXNzIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtMzMsNiArMzUsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNyY1VybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCAwY2JkMjY5Li5kYjYyY2Q1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJU3RyZWFtU291cmNlOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNDEsOCArNDIsMTEgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+KiBoZWFkZXJzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiogaGVhZGVycykgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDI5OThiMzcuLmQ3ZTU4NGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oCkBAIC0zNCw2ICszNCw4IEBACiBzdHJ1Y3QgSUNyeXB0bzsKIHN0cnVjdCBJRHJtOwogc3RydWN0IElIRENQOworc3RydWN0IElNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwogY2xhc3MgSU9NWDsKIGNsYXNzIElSZW1vdGVEaXNwbGF5OwpAQCAtNDksOSArNTEsMTQgQEAKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcigpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKSA9IDA7CkBAIC01OSw2ICs2Niw3IEBACiAgICAgdmlydHVhbCBzcDxJQ3J5cHRvPiAgICAgICAgIG1ha2VDcnlwdG8oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJSERDUD4gICAgICAgICAgIG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCA9IDA7CiAKICAgICAvLyBDb25uZWN0cyB0byBhIHJlbW90ZSBkaXNwbGF5LgogICAgIC8vICdpZmFjZScgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhbCBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gbGlzdGVuIGZvcgpAQCAtOTMsOSArMTAxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1bGxCYXR0ZXJ5RGF0YShQYXJjZWwqIHJlcGx5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IDg2YTQ0YTkuLjZlNGE0YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC0zOCw4ICszOCw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVgpOwogCi0gICAgdHlwZWRlZiB2b2lkICpidWZmZXJfaWQ7Ci0gICAgdHlwZWRlZiB2b2lkICpub2RlX2lkOworICAgIHR5cGVkZWYgdWludDMyX3QgYnVmZmVyX2lkOworICAgIHR5cGVkZWYgdWludDMyX3Qgbm9kZV9pZDsKIAogICAgIC8vIEdpdmVuIGEgbm9kZV9pZCBhbmQgdGhlIGNhbGxpbmcgcHJvY2VzcycgcGlkLCByZXR1cm5zIHRydWUgaWZmCiAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPTVggaW50ZXJmYWNlIGxpdmVzIGluIHRoZSBzYW1lCkBAIC04Nyw2ICs4NywxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSA9IDA7CiAKKyAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpID0gMDsKIApAQCAtMTQzLDYgKzE0Nyw4IEBACiAgICAgICAgIElOVEVSTkFMX09QVElPTl9TVVNQRU5ELCAgLy8gZGF0YSBpcyBhIGJvb2wKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9ERUxBWSwgIC8vIGRhdGEgaXMgYW4gaW50NjRfdAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fTUFYX1RJTUVTVEFNUF9HQVAsIC8vIGRhdGEgaXMgaW50NjRfdAorICAgICAgICBJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRSwgLy8gZGF0YSBpcyBhbiBpbnQ2NF90CisgICAgICAgIElOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFLCAvLyBkYXRhIGlzIGFuIGludDY0X3RbMl0KICAgICB9OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW50ZXJuYWxPcHRpb24oCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0xODIsOCArMTg4LDYgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoOwogICAgICAgICAgICAgT01YX1UzMiBmbGFnczsKICAgICAgICAgICAgIE9NWF9USUNLUyB0aW1lc3RhbXA7Ci0gICAgICAgICAgICBPTVhfUFRSIHBsYXRmb3JtX3ByaXZhdGU7Ci0gICAgICAgICAgICBPTVhfUFRSIGRhdGFfcHRyOwogICAgICAgICB9IGV4dGVuZGVkX2J1ZmZlcl9kYXRhOwogCiAgICAgfSB1OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTZhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQ09ERUNfSU5GT19IXworCisjZGVmaW5lIE1FRElBX0NPREVDX0lORk9fSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFBhcmNlbDsKK3N0cnVjdCBDb2RlY0NhcGFiaWxpdGllczsKKworc3RydWN0IE1lZGlhQ29kZWNJbmZvIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0cnVjdCBQcm9maWxlTGV2ZWwgeworICAgICAgICB1aW50MzJfdCBtUHJvZmlsZTsKKyAgICAgICAgdWludDMyX3QgbUxldmVsOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0OworICAgICAgICB2b2lkIGdldFN1cHBvcnRlZENvbG9yRm9ybWF0cyhWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0RGV0YWlscygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHM7CisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0czsKKyAgICAgICAgdWludDMyX3QgbUZsYWdzOworICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CisKKyAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAgICAgLy8gcmVhZCBvYmplY3QgZnJvbSBwYXJjZWwgZXZlbiBpZiBvYmplY3QgY3JlYXRpb24gZmFpbHMKKyAgICAgICAgc3RhdGljIHNwPENhcGFiaWxpdGllcz4gRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhcGFiaWxpdGllcyk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhQ29kZWNJbmZvOworICAgIH07CisKKyAgICBib29sIGlzRW5jb2RlcigpIGNvbnN0OworICAgIGJvb2wgaGFzUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpnZXRDb2RlY05hbWUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6YXRpb24gb3ZlciBCaW5kZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TWVkaWFDb2RlY0luZm8+IEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHZhcmlhYmxlIHNldCBvbmx5IGluIGNvbnN0cnVjdG9yIC0gdGhlc2UgYXJlIGFjY2Vzc2VkIGJ5IE1lZGlhQ29kZWNMaXN0CisgICAgLy8gdG8gYXZvaWQgZHVwbGljYXRpb24gb2Ygc2FtZSB2YXJpYWJsZXMKKyAgICBBU3RyaW5nIG1OYW1lOworICAgIGJvb2wgbUlzRW5jb2RlcjsKKyAgICBib29sIG1IYXNTb2xlTWltZTsgLy8gd2FzIGluaXRpYWxpemVkIHdpdGggbWltZQorCisgICAgVmVjdG9yPEFTdHJpbmc+IG1RdWlya3M7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8Q2FwYWJpbGl0aWVzPiA+IG1DYXBzOworCisgICAgc3A8Q2FwYWJpbGl0aWVzPiBtQ3VycmVudENhcHM7IC8vIGN1cnJlbnRseSBpbml0YWxpemVkIGNhcGFiaWxpdGllcworCisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisKKyAgICAvKiBNZXRob2RzIHVzZWQgYnkgTWVkaWFDb2RlY0xpc3QgdG8gY29uc3RydWN0IHRoZSBpbmZvCisgICAgICogb2JqZWN0IGZyb20gWE1MLgorICAgICAqCisgICAgICogQWZ0ZXIgaW5mbyBvYmplY3QgaXMgY3JlYXRlZDoKKyAgICAgKiAtIGFkZGl0aW9uYWwgcXVpcmtzIGNhbiBiZSBhZGRlZAorICAgICAqIC0gYWRkaXRpb25hbCBtaW1lcyBjYW4gYmUgYWRkZWQKKyAgICAgKiAgIC0gT01YIGNvZGVjIGNhcGFiaWxpdGllcyBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBjYXBhYmlsaXR5IGRldGFpbCBjYW4gYmUgc2V0IGZvciB0aGUgY3VycmVudCBtaW1lLXR5cGUKKyAgICAgKiAgIC0gYSBmZWF0dXJlIGNhbiBiZSBzZXQgZm9yIHRoZSBjdXJyZW50IG1pbWUtdHlwZQorICAgICAqICAgLSBpbmZvIG9iamVjdCBjYW4gYmUgY29tcGxldGVkIHdoZW4gcGFyc2luZyBvZiBhIG1pbWUtdHlwZSBpcyBkb25lCisgICAgICovCisgICAgTWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgYWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSk7CisgICAgc3RhdHVzX3QgYWRkTWltZShjb25zdCBjaGFyICptaW1lKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplQ2FwYWJpbGl0aWVzKGNvbnN0IENvZGVjQ2FwYWJpbGl0aWVzICZjYXBzKTsKKyAgICB2b2lkIGFkZERldGFpbChjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IEFTdHJpbmcgJnZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkIGFkZEZlYXR1cmUoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgdm9pZCByZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHZvaWQgY29tcGxldGUoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWNJbmZvKTsKKworICAgIGZyaWVuZCBjbGFzcyBNZWRpYUNvZGVjTGlzdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQ09ERUNfSU5GT19IXworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggZWNjM2I2NS4uMzhkYmIyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTIwLDEwICsyMCwxMyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CisKIC8vIEFic3RyYWN0IGJhc2UgY2xhc3MKIGNsYXNzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlIDogcHVibGljIFJlZkJhc2UKIHsKQEAgLTMyLDYgKzM1LDcgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSgpIHt9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAyNmQ4NzI5Li5jZjE4YTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwpAQCAtOTcsNiArOTgsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGxhdGVuY3koKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgbXNlY3NQZXJGcmFtZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGdldFNlc3Npb25JZCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpID0gMDsKIApAQCAtMjEzLDExICsyMTYsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggOWZjOTYyYy4uZjA2MWQyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTMzLDcgKzMzLDggQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV83MjBQID0gNSwKICAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQSA9IDcsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSA3LAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQID0gOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDgsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC00NCw3ICs0NSwxNyBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUCA9IDEwMDUsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RVkdBID0gMTAwNywKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQID0gMTAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwOCwKKworICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0hJR0ggPSAyMDAxLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNDgwUCA9IDIwMDIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQID0gMjAwMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQID0gMjAwNCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzIxNjBQID0gMjAwNSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwNSwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaCBiL2luY2x1ZGUvbWVkaWEvU291bmRQb29sLmgKaW5kZXggMWIyMWEzNi4uZjU3MzEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9Tb3VuZFBvb2wuaAorKysgYi9pbmNsdWRlL21lZGlhL1NvdW5kUG9vbC5oCkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICBmcmllbmQgY2xhc3MgU291bmRQb29sVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBTb3VuZENoYW5uZWw7CiBwdWJsaWM6Ci0gICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBpbnQgc3JjUXVhbGl0eSk7CisgICAgU291bmRQb29sKGludCBtYXhDaGFubmVscywgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyk7CiAgICAgflNvdW5kUG9vbCgpOwogICAgIGludCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgaW50IHByaW9yaXR5KTsKICAgICBpbnQgbG9hZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IHByaW9yaXR5KTsKQEAgLTE4Myw4ICsxODMsNyBAQAogICAgIHZvaWQgc2V0UHJpb3JpdHkoaW50IGNoYW5uZWxJRCwgaW50IHByaW9yaXR5KTsKICAgICB2b2lkIHNldExvb3AoaW50IGNoYW5uZWxJRCwgaW50IGxvb3ApOwogICAgIHZvaWQgc2V0UmF0ZShpbnQgY2hhbm5lbElELCBmbG9hdCByYXRlKTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgIGludCBzcmNRdWFsaXR5KCkgY29uc3QgeyByZXR1cm4gbVNyY1F1YWxpdHk7IH0KKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHJpYnV0ZXMoKSB7IHJldHVybiAmbUF0dHJpYnV0ZXM7IH0KIAogICAgIC8vIGNhbGxlZCBmcm9tIFNvdW5kUG9vbFRocmVhZAogICAgIHZvaWQgc2FtcGxlTG9hZGVkKGludCBzYW1wbGVJRCk7CkBAIC0yMjUsOCArMjI0LDcgQEAKICAgICBMaXN0PFNvdW5kQ2hhbm5lbCo+ICAgICBtU3RvcDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludCwgc3A8U2FtcGxlPiA+ICAgbVNhbXBsZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU1heENoYW5uZWxzOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TcmNRdWFsaXR5OworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyaWJ1dGVzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0ZWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbU5leHRTYW1wbGVJRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtTmV4dENoYW5uZWxJRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmggYi9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL1N0cmluZ0FycmF5LmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCAxYWNmYWMzLi44NGI5ODQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKIApAQCAtNjgsNiArNjksNyBAQAogICAgIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhU291cmNlVXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDRjMDVmYzMuLjljYzIwOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTE2MCw2ICsxNjAsOSBAQAogICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKICAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCiAgICAgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCisgICAgS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTID0gMTQwMCAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKIH07CiAKIC8vIEtlZXAgSU5WT0tFX0lEXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xNzAsNiArMTczLDcgQEAKICAgICBJTlZPS0VfSURfU0VMRUNUX1RSQUNLID0gNCwKICAgICBJTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAogICAgIElOVk9LRV9JRF9TRVRfVklERU9fU0NBTElOR19NT0RFID0gNiwKKyAgICBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNwogfTsKIAogLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCkBAIC0xODksNiArMTkzLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKIH07CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKwogY2xhc3MgTWVkaWFQbGF5ZXIgOiBwdWJsaWMgQm5NZWRpYVBsYXllckNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewpAQCAtMTk5LDYgKzIwNSw3IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTIyMCwxMyArMjI3LDE5IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgc3RhdGljICBzdGF0dXNfdCAgICAgICAgZGVjb2RlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCogcE51bUNoYW5uZWxzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICBzaXplX3QgKnBTaXplKTsKICAgICBzdGF0aWMgIHN0YXR1c190ICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOwpAQCAtMjQyLDkgKzI1NSw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKLSAgICAgICAgICAgIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiBwcml2YXRlOgogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyX2woKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG9fbChpbnQgbXNlYyk7CkBAIC0yNTMsNiArMjYzLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hOZXdQbGF5ZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldF9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgcGxheWVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSk7CiAKICAgICBzcDxJTWVkaWFQbGF5ZXI+ICAgICAgICAgICAgbVBsYXllcjsKICAgICB0aHJlYWRfaWRfdCAgICAgICAgICAgICAgICAgbUxvY2tUaHJlYWRJZDsKQEAgLTI2Nyw2ICsyNzgsNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZVN5bmM7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJlU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKKyAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IDg4YTQyYTAuLmIwYTYyYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zOSw3ICszOSw3IEBACiBlbnVtIHZpZGVvX3NvdXJjZSB7CiAgICAgVklERU9fU09VUkNFX0RFRkFVTFQgPSAwLAogICAgIFZJREVPX1NPVVJDRV9DQU1FUkEgPSAxLAotICAgIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiA9IDIsCisgICAgVklERU9fU09VUkNFX1NVUkZBQ0UgPSAyLAogCiAgICAgVklERU9fU09VUkNFX0xJU1RfRU5EICAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGF1ZGlvIHNvdXJjZSB0eXBlCiB9OwpAQCAtNjEsMTIgKzYxLDE4IEBACiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRiA9IDUsCiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyA9IDYsCiAKKyAgICBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfRU5EID0gNywgLy8gVXNlZCBpbiB2YWxpZGF0aW5nIHRoZSBvdXRwdXQgZm9ybWF0LiAgU2hvdWxkIGJlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgYXQgdGhlIGVuZCBvZiB0aGUgYXVkaW8gb25seSBvdXRwdXQgZm9ybWF0cy4KKwogICAgIC8qIFN0cmVhbSBvdmVyIGEgc29ja2V0LCBsaW1pdGVkIHRvIGEgc2luZ2xlIHN0cmVhbSAqLwogICAgIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCA9IDcsCiAKICAgICAvKiBILjI2NC9BQUMgZGF0YSBlbmNhcHN1bGF0ZWQgaW4gTVBFRzIvVFMgKi8KICAgICBPVVRQVVRfRk9STUFUX01QRUcyVFMgPSA4LAogCisgICAgLyogVlA4L1ZPUkJJUyBkYXRhIGluIGEgV0VCTSBjb250YWluZXIgKi8KKyAgICBPVVRQVVRfRk9STUFUX1dFQk0gPSA5LAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC03Nyw2ICs4Myw3IEBACiAgICAgQVVESU9fRU5DT0RFUl9BQUMgPSAzLAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAorICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKIAogICAgIEFVRElPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGF1ZGlvIGVuY29kZXIgdHlwZQogfTsKQEAgLTg2LDYgKzkzLDcgQEAKICAgICBWSURFT19FTkNPREVSX0gyNjMgPSAxLAogICAgIFZJREVPX0VOQ09ERVJfSDI2NCA9IDIsCiAgICAgVklERU9fRU5DT0RFUl9NUEVHXzRfU1AgPSAzLAorICAgIFZJREVPX0VOQ09ERVJfVlA4ID0gNCwKIAogICAgIFZJREVPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHZpZGVvIGVuY29kZXIgdHlwZQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhc2Nhbm5lci5oCmluZGV4IGE3MzQwM2IuLmQ1NTUyNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogc3RydWN0IGRpcmVudDsKQEAgLTI5LDYgKzMwLDcgQEAKIAogY2xhc3MgTWVkaWFTY2FubmVyQ2xpZW50OwogY2xhc3MgU3RyaW5nQXJyYXk7CitjbGFzcyBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOwogCiBlbnVtIE1lZGlhU2NhblJlc3VsdCB7CiAgICAgLy8gVGhpcyBmaWxlIG9yIGRpcmVjdG9yeSB3YXMgc2Nhbm5lZCBzdWNjZXNzZnVsbHkuCkBAIC00MSw2ICs0MywzMSBAQAogICAgIE1FRElBX1NDQU5fUkVTVUxUX0VSUk9SLAogfTsKIAorc3RydWN0IE1lZGlhQWxidW1BcnQgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYUFsYnVtQXJ0ICpmcm9tRGF0YShpbnQzMl90IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpOworCisgICAgc3RhdGljIHZvaWQgaW5pdChNZWRpYUFsYnVtQXJ0KiBpbnN0YW5jZSwgaW50MzJfdCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKTsKKworICAgIE1lZGlhQWxidW1BcnQgKmNsb25lKCk7CisKKyAgICBjb25zdCBjaGFyICpkYXRhKCkgeworICAgICAgICByZXR1cm4gJm1EYXRhWzBdOworICAgIH0KKworICAgIGludDMyX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1TaXplOworICAgIGNoYXIgbURhdGFbXTsKKworICAgIC8vIFlvdSBjYW4ndCBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHkgYmVjYXVzZSB0aGlzIGlzIGEKKyAgICAvLyB2YXJpYWJsZS1zaXplZCBvYmplY3QgcGFzc2VkIHRocm91Z2ggdGhlIGJpbmRlci4KKyAgICBNZWRpYUFsYnVtQXJ0KCk7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgTWVkaWFTY2FubmVyIHsKICAgICBNZWRpYVNjYW5uZXIoKTsKICAgICB2aXJ0dWFsIH5NZWRpYVNjYW5uZXIoKTsKQEAgLTUzLDggKzgwLDcgQEAKIAogICAgIHZvaWQgc2V0TG9jYWxlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CiAKLSAgICAvLyBleHRyYWN0cyBhbGJ1bSBhcnQgYXMgYSBibG9jayBvZiBkYXRhCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0ICpleHRyYWN0QWxidW1BcnQoaW50IGZkKSA9IDA7CiAKIHByb3RlY3RlZDoKICAgICBjb25zdCBjaGFyICpsb2NhbGUoKSBjb25zdDsKQEAgLTk0LDE1ICsxMjAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWltZVR5cGUoY29uc3QgY2hhciogbWltZVR5cGUpID0gMDsKIAogcHJvdGVjdGVkOgotICAgIHZvaWQgY29udmVydFZhbHVlcyh1aW50MzJfdCBlbmNvZGluZyk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBjYWNoZWQgbmFtZSBhbmQgdmFsdWUgc3RyaW5ncywgZm9yIG5hdGl2ZSBlbmNvZGluZyBzdXBwb3J0LgotICAgIFN0cmluZ0FycmF5KiAgICBtTmFtZXM7Ci0gICAgU3RyaW5nQXJyYXkqICAgIG1WYWx1ZXM7Ci0KLSAgICAvLyBkZWZhdWx0IGVuY29kaW5nIGJhc2VkIG9uIE1lZGlhU2Nhbm5lcjo6bUxvY2FsZSBzdHJpbmcKLSAgICB1aW50MzJfdCAgICAgICAgbUxvY2FsZUVuY29kaW5nOworICAgIC8vIGRlZmF1bHQgZW5jb2RpbmcgZnJvbSBNZWRpYVNjYW5uZXI6Om1Mb2NhbGUKKyAgICBTdHJpbmc4IG1Mb2NhbGU7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAppbmRleCAyYzRhYWZmLi5iMTZlMjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaApAQCAtMjcsNyArMjcsNyBAQAogY2xhc3MgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZSA6IHB1YmxpYyBOQkFJT19Tb3VyY2UgewogCiBwdWJsaWM6Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgTkJBSU9fRm9ybWF0IGZvcm1hdCk7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZShBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpOwogICAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKTsKIAogICAgIC8vIE5CQUlPX1BvcnQgaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmluZGV4IDA3ZDhjODkuLjUxNjlmMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCkBAIC00Myw5ICs0Myw5IEBACiAKICAgICAvLyBUaGlzIGlzIGFuIG92ZXItZXN0aW1hdGUsIGFuZCBjb3VsZCBkdXBlIHRoZSBjYWxsZXIgaW50byBtYWtpbmcgYSBibG9ja2luZyByZWFkKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGZpbGxpbmcgc3RhdHVzIHdoZW4gaXQncyBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgPj4gbUJpdFNoaWZ0OyB9CisgICAgdmlydHVhbCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUyk7CiAKICAgICAvLyBOQkFJT19TaW5rIGVuZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaAppbmRleCA3OTQ4ZDQwLi45OTQ5Yjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmgKQEAgLTQzLDcgKzQzLDcgQEAKIAogICAgIC8vIFRoaXMgaXMgYW4gb3Zlci1lc3RpbWF0ZSwgYW5kIGNvdWxkIGR1cGUgdGhlIGNhbGxlciBpbnRvIG1ha2luZyBhIGJsb2NraW5nIHdyaXRlKCkKICAgICAvLyBGSVhNRSBVc2UgYW4gYXVkaW8gSEFMIEFQSSB0byBxdWVyeSB0aGUgYnVmZmVyIGVtcHR5aW5nIHN0YXR1cyB3aGVuIGl0J3MgYXZhaWxhYmxlLgotICAgIHZpcnR1YWwgc3NpemVfdCBhdmFpbGFibGVUb1dyaXRlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA+PiBtQml0U2hpZnQ7IH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1CdWZmZXJTaXplQnl0ZXMgLyBtRnJhbWVTaXplOyB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL01vbm9QaXBlLmgKaW5kZXggZDM4MDJmZS4uYjA5YjM1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtNDEsNyArNDEsNyBAQAogICAgIC8vIE5vdGU6IHdoYXRldmVyIHNoYXJlcyB0aGlzIG9iamVjdCB3aXRoIGFub3RoZXIgdGhyZWFkIG5lZWRzIHRvIGRvIHNvIGluIGFuIFNNUC1zYWZlIHdheSAobGlrZQogICAgIC8vIGNyZWF0aW5nIGl0IHRoZSBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIHRoZSBvdGhlciB0aHJlYWQsIG9yIHN0b3JpbmcgdGhlIG9iamVjdCB3aXRoIGEKICAgICAvLyByZWxlYXNlX3N0b3JlKS4gT3RoZXJ3aXNlIHRoZSBvdGhlciB0aHJlYWQgY291bGQgc2VlIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkIG9iamVjdC4KLSAgICBNb25vUGlwZShzaXplX3QgcmVxRnJhbWVzLCBOQkFJT19Gb3JtYXQgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2sgPSBmYWxzZSk7CisgICAgTW9ub1BpcGUoc2l6ZV90IHJlcUZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jayA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5Nb25vUGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaAppbmRleCAxZGEwYzczLi5kNDIyNTc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTIsMzEgKzUzLDQxIEBACiAvLyB0aGUgY29tYmluYXRpb25zIHRoYXQgYXJlIGFjdHVhbGx5IG5lZWRlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLiAgSWYgdGhlIGxpc3Qgb2YgY29tYmluYXRpb25zIGdyb3dzCiAvLyB0b28gbGFyZ2UsIHRoZW4gdGhpcyBkZWNpc2lvbiBzaG91bGQgYmUgcmUtdmlzaXRlZC4KIC8vIFNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGFyZSBleHBsaWNpdCwgUENNIGludGVybGVhdmVkIDE2LWJpdCBpcyBhc3N1bWVkLgotdHlwZWRlZiB1bnNpZ25lZCBOQkFJT19Gb3JtYXQ7Ci1lbnVtIHsKLSAgICBGb3JtYXRfSW52YWxpZAorc3RydWN0IE5CQUlPX0Zvcm1hdCB7CisvLyBGSVhNRSBtYWtlIHRoaXMgYSBjbGFzcywgYW5kIGNoYW5nZSBGb3JtYXRfLi4uIGdsb2JhbCBtZXRob2RzIHRvIGNsYXNzIG1ldGhvZHMKKy8vcHJpdmF0ZToKKyAgICB1bnNpZ25lZCAgICBtU2FtcGxlUmF0ZTsKKyAgICB1bnNpZ25lZCAgICBtQ2hhbm5lbENvdW50OworICAgIGF1ZGlvX2Zvcm1hdF90ICBtRm9ybWF0OworICAgIHNpemVfdCAgICAgIG1GcmFtZVNpemU7CiB9OwogCi0vLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgb2YgYW4gTkJBSU9fRm9ybWF0IGluIGJ5dGVzCi1zaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShOQkFJT19Gb3JtYXQgZm9ybWF0KTsKK2V4dGVybiBjb25zdCBOQkFJT19Gb3JtYXQgRm9ybWF0X0ludmFsaWQ7CiAKLS8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgYXMgYSBiaXQgc2hpZnQKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KTsKKy8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSBvZiBhbiBOQkFJT19Gb3JtYXQgaW4gYnl0ZXMKK3NpemVfdCBGb3JtYXRfZnJhbWVTaXplKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ29udmVydCBhIHNhbXBsZSByYXRlIGluIEh6IGFuZCBjaGFubmVsIGNvdW50IHRvIGFuIE5CQUlPX0Zvcm1hdAotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KTsKKy8vIEZJWE1FIHJlbmFtZQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAvLyBSZXR1cm4gdGhlIHNhbXBsZSByYXRlIGluIEh6IG9mIGFuIE5CQUlPX0Zvcm1hdAotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CiAKIC8vIFJldHVybiB0aGUgY2hhbm5lbCBjb3VudCBvZiBhbiBOQkFJT19Gb3JtYXQKLXVuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoTkJBSU9fRm9ybWF0IGZvcm1hdCk7Cit1bnNpZ25lZCBGb3JtYXRfY2hhbm5lbENvdW50KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KTsKIAogLy8gQ2FsbGJhY2tzIHVzZWQgYnkgTkJBSU9fU2luazo6d3JpdGVWaWEoKSBhbmQgTkJBSU9fU291cmNlOjpyZWFkVmlhKCkgYmVsb3cuCiB0eXBlZGVmIHNzaXplX3QgKCp3cml0ZVZpYV90KSh2b2lkICp1c2VyLCB2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCk7CiB0eXBlZGVmIHNzaXplX3QgKCpyZWFkVmlhX3QpKHZvaWQgKnVzZXIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LCBpbnQ2NF90IHJlYWRQVFMpOwogCisvLyBDaGVjayB3aGV0aGVyIGFuIE5CQUlPX0Zvcm1hdCBpcyB2YWxpZAorYm9vbCBGb3JtYXRfaXNWYWxpZChjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCk7CisKKy8vIENvbXBhcmUgdHdvIE5CQUlPX0Zvcm1hdCB2YWx1ZXMKK2Jvb2wgRm9ybWF0X2lzRXF1YWwoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQxLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdDIpOworCiAvLyBBYnN0cmFjdCBjbGFzcyAoaW50ZXJmYWNlKSByZXByZXNlbnRpbmcgYSBkYXRhIHBvcnQuCiBjbGFzcyBOQkFJT19Qb3J0IDogcHVibGljIFJlZkJhc2UgewogCkBAIC0xMTUsMTUgKzEyNiwxNSBAQAogICAgIHZpcnR1YWwgTkJBSU9fRm9ybWF0IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1OZWdvdGlhdGVkID8gbUZvcm1hdCA6IEZvcm1hdF9JbnZhbGlkOyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Qb3J0KE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDogbU5lZ290aWF0ZWQoZmFsc2UpLCBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRTaGlmdChGb3JtYXRfZnJhbWVCaXRTaGlmdChmb3JtYXQpKSB7IH0KKyAgICBOQkFJT19Qb3J0KGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KSA6IG1OZWdvdGlhdGVkKGZhbHNlKSwgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZShGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCkpIHsgfQogICAgIHZpcnR1YWwgfk5CQUlPX1BvcnQoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KIAogICAgIGJvb2wgICAgICAgICAgICBtTmVnb3RpYXRlZDsgICAgLy8gbU5lZ290aWF0ZWQgaW1wbGllcyAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkKICAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsgICAgICAgIC8vIChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKSBkb2VzIG5vdCBpbXBseSBtTmVnb3RpYXRlZAotICAgIHNpemVfdCAgICAgICAgICBtQml0U2hpZnQ7ICAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVTaXplOyAgICAgLy8gYXNzaWduIGluIHBhcmFsbGVsIHdpdGggYW55IGFzc2lnbm1lbnQgdG8gbUZvcm1hdAogfTsKIAogLy8gQWJzdHJhY3QgY2xhc3MgKGludGVyZmFjZSkgcmVwcmVzZW50aW5nIGEgbm9uLWJsb2NraW5nIGRhdGEgc2luaywgZm9yIHVzZSBieSBhIGRhdGEgcHJvdmlkZXIuCkBAIC0yMTYsMTEgKzIyNywxMSBAQAogCiAgICAgLy8gUmV0dXJucyBOT19FUlJPUiBpZiBhIHRpbWVzdGFtcCBpcyBhdmFpbGFibGUuICBUaGUgdGltZXN0YW1wIGluY2x1ZGVzIHRoZSB0b3RhbCBudW1iZXIKICAgICAvLyBvZiBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLCB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZSBvZiBDTE9DS19NT05PVE9OSUMKLSAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4KKyAgICAvLyBhcyBvZiB0aGlzIHByZXNlbnRhdGlvbiBjb3VudC4gIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBpZiBlcnJvciBpcyByZXR1cm5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgTkJBSU9fU2luayhOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KKyAgICBOQkFJT19TaW5rKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzV3JpdHRlbigwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19TaW5rKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCkBAIC0zMTEsNyArMzIyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgb25UaW1lc3RhbXAoY29uc3QgQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Tb3VyY2UoTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkgeyB9CisgICAgTkJBSU9fU291cmNlKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQpIDogTkJBSU9fUG9ydChmb3JtYXQpLCBtRnJhbWVzUmVhZCgwKSB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19Tb3VyY2UoKSB7IH0KIAogICAgIC8vIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlc2UgaWYgdGhleSBkb24ndCBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAppbmRleCA2ZDU5ZWE3Li5iY2JiYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCkBAIC0yNSw2ICsyNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogY2xhc3MgTkJMb2cgewogCiBwdWJsaWM6CkBAIC0xODcsNiArMTg5LDEwIEBACiAgICAgY29uc3QgU2hhcmVkKiBjb25zdCBtU2hhcmVkOyAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CiAgICAgY29uc3Qgc3A8SU1lbW9yeT4gbUlNZW1vcnk7IC8vIHJlZi1jb3VudGVkIHZlcnNpb24KICAgICBpbnQzMl90ICAgICBtRnJvbnQ7ICAgICAgICAgLy8gaW5kZXggb2Ygb2xkZXN0IGFja25vd2xlZGdlZCBFbnRyeQorICAgIGludCAgICAgbUZkOyAgICAgICAgICAgICAgICAvLyBmaWxlIGRlc2NyaXB0b3IKKyAgICBpbnQgICAgIG1JbmRlbnQ7ICAgICAgICAgICAgLy8gaW5kZW50YXRpb24gbGV2ZWwKKworICAgIHZvaWQgICAgZHVtcExpbmUoY29uc3QgU3RyaW5nOCYgdGltZXN0YW1wLCBTdHJpbmc4JiBib2R5KTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAppbmRleCA3OWE0ZWVlLi5lYmEzN2JjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApAQCAtMzAsNyArMzAsMTEgQEAKIAogcHVibGljOgogICAgIC8vIG1heEZyYW1lcyB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gYSBwb3dlciBvZiAyLCBhbmQgYWxsIHNsb3RzIGFyZSBhdmFpbGFibGUuIE11c3QgYmUgPj0gMi4KLSAgICBQaXBlKHNpemVfdCBtYXhGcmFtZXMsIE5CQUlPX0Zvcm1hdCBmb3JtYXQpOworICAgIC8vIGJ1ZmZlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwaXBlIGJ1ZmZlciwKKyAgICAvLyB3aGljaCBtdXN0IGJlIG9mIHNpemUgcm91bmR1cChtYXhGcmFtZXMpICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpIGJ5dGVzLgorICAgIFBpcGUoc2l6ZV90IG1heEZyYW1lcywgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQsIHZvaWQgKmJ1ZmZlciA9IE5VTEwpOworCisgICAgLy8gSWYgYSBidWZmZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IsIGl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IGZyZWVkIGJ5IGRlc3RydWN0b3IuCiAgICAgdmlydHVhbCB+UGlwZSgpOwogCiAgICAgLy8gTkJBSU9fUG9ydCBpbnRlcmZhY2UKQEAgLTU3LDYgKzYxLDcgQEAKICAgICB2b2lkICogY29uc3QgICAgbUJ1ZmZlcjsKICAgICB2b2xhdGlsZSBpbnQzMl90IG1SZWFyOyAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZQogICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYWRlcnM7ICAgICAgLy8gbnVtYmVyIG9mIFBpcGVSZWFkZXIgY2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQgdG8gdGhpcyBQaXBlCisgICAgY29uc3QgYm9vbCAgICAgIG1GcmVlQnVmZmVySW5EZXN0cnVjdG9yOwogfTsKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCmluZGV4IGNkZmI2ZmUuLmRhZjZiYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oCkBAIC00MSw3ICs0MSw3IEBACiAKIHByaXZhdGU6CiAgICAgY29uc3Qgc3A8TkJBSU9fU291cmNlPiBtU291cmNlOyAgICAgLy8gdGhlIHdyYXBwZWQgc291cmNlCi0gICAgLypjb25zdCovIHNpemVfdCAgICBtRnJhbWVCaXRTaGlmdDsgLy8gbG9nMihmcmFtZSBzaXplIGluIGJ5dGVzKQorICAgIC8qY29uc3QqLyBzaXplX3QgICAgbUZyYW1lU2l6ZTsgLy8gZnJhbWUgc2l6ZSBpbiBieXRlcwogICAgIHZvaWQqICAgICAgICAgICAgICAgbUFsbG9jYXRlZDsgLy8gcG9pbnRlciB0byBiYXNlIG9mIGFsbG9jYXRlZCBtZW1vcnkKICAgICBzaXplX3QgICAgICAgICAgICAgIG1TaXplOyAgICAgIC8vIHNpemUgb2YgbUFsbG9jYXRlZCBpbiBmcmFtZXMKICAgICBzaXplX3QgICAgICAgICAgICAgIG1PZmZzZXQ7ICAgIC8vIGZyYW1lIG9mZnNldCB3aXRoaW4gbUFsbG9jYXRlZCBvZiB2YWxpZCBkYXRhCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5YjUzNGU3Li5hMGU1ZDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgogI2luY2x1ZGUgPE9NWF9BdWRpby5oPgogCkBAIC0zMSw0NSArMzIsMzQgQEAKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgTWVtb3J5RGVhbGVyOworc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXRQYXJhbXM7CiAKLXN0cnVjdCBBQ29kZWMgOiBwdWJsaWMgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKLSAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAotICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCi0gICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKLSAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAotICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCi0gICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKLSAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAotICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCi0gICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKLSAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAotICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCi0gICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICA9ICdPTVhkJywKLSAgICB9OwotCitzdHJ1Y3QgQUNvZGVjIDogcHVibGljIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUsIHB1YmxpYyBDb2RlY0Jhc2UgewogICAgIEFDb2RlYygpOwogCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICB2b2lkIGluaXRpYXRlU2V0dXAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CiAKLSAgICB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpOwogCi0gICAgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCk7Ci0gICAgdm9pZCBpbml0aWF0ZVN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOwogCi0gICAgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCk7CiAKLSAgICBib29sIGlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKSB7IHJldHVybiBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjazsgfQorICAgIC8vIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgaW1wbGVtZW50cyB0aGUgbWVzc2FnZSBoYW5kbGluZworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBoYW5kbGVNZXNzYWdlKG1zZyk7CisgICAgfQogCi0gICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdHJ1Y3QgUG9ydERlc2NyaXB0aW9uIDogcHVibGljIENvZGVjQmFzZTo6UG9ydERlc2NyaXB0aW9uIHsKICAgICAgICAgc2l6ZV90IGNvdW50QnVmZmVycygpOwogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXJBdChzaXplX3QgaW5kZXgpIGNvbnN0OwpAQCAtODYsNiArNzYsMTYgQEAKICAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9ydERlc2NyaXB0aW9uKTsKICAgICB9OwogCisgICAgc3RhdGljIGJvb2wgaXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICAgICAgdWludDMyX3QgY29sb3JGb3JtYXQsIE9NWF9VMzIgKmZsZXhpYmxlRXF1aXZhbGVudCk7CisKKyAgICAvLyBSZXR1cm5zIDAgaWYgY29uZmlndXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgTk9URTogdGhpcyBpcyB0cmVhdGVkIGJ5CisgICAgLy8gc29tZSBPTVggY29tcG9uZW50cyBhcyBhdXRvIGxldmVsLCBhbmQgYnkgb3RoZXJzIGFzIGludmFsaWQgbGV2ZWwuCisgICAgc3RhdGljIGludCAvKiBPTVhfVklERU9fQVZDTEVWRUxUWVBFICovIGdldEFWQ0xldmVsRm9yKAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmF0ZSwgaW50IGJpdHJhdGUsCisgICAgICAgICAgICBPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgcHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUNvZGVjKCk7CiAKQEAgLTExOSw2ICsxMTksOCBAQAogICAgICAgICBrV2hhdFJlcXVlc3RJRFJGcmFtZSAgICAgICAgID0gJ3JpZHInLAogICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1MgPSAnc3VibScsCisgICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICAgICAgPSAnT01YZCcsCisgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTc4LDYgKzE4MCw4IEBACiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyWzJdOwogCiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwogCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJzWzJdOwogICAgIGJvb2wgbVBvcnRFT1NbMl07CkBAIC0xOTAsNyArMTk0LDcgQEAKICAgICBib29sIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dDsKICAgICBib29sIG1GYXRhbEVycm9yOwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKLSAgICBib29sIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrOworICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtMTk4LDE2ICsyMDIsMjUgQEAKIAogICAgIGludDMyX3QgbUVuY29kZXJEZWxheTsKICAgICBpbnQzMl90IG1FbmNvZGVyUGFkZGluZzsKKyAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CiAKICAgICBib29sIG1DaGFubmVsTWFza1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtQ2hhbm5lbE1hc2s7CiAgICAgdW5zaWduZWQgbURlcXVldWVDb3VudGVyOwogICAgIGJvb2wgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnM7CiAgICAgaW50MzJfdCBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ7CisgICAgc2l6ZV90IG1OdW1VbmRlcXVldWVkQnVmZmVyczsKIAogICAgIGludDY0X3QgbVJlcGVhdEZyYW1lRGVsYXlVczsKICAgICBpbnQ2NF90IG1NYXhQdHNHYXBVczsKIAorICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CisKKyAgICBib29sIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQ7CisKKyAgICBib29sIG1UdW5uZWxlZDsKKwogICAgIHN0YXR1c190IHNldEN5Y2xpY0ludHJhTWFjcm9ibG9ja1JlZnJlc2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCk7CkBAIC0yMzEsNiArMjQ0LDkgQEAKICAgICBzdGF0dXNfdCBzZXRDb21wb25lbnRSb2xlKGJvb2wgaXNFbmNvZGVyLCBjb25zdCBjaGFyICptaW1lKTsKICAgICBzdGF0dXNfdCBjb25maWd1cmVDb2RlYyhjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soaW50MzJfdCBhdWRpb0h3U3luYywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpOworCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LAogICAgICAgICAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQsCkBAIC0yMzksNyArMjU1LDcgQEAKICAgICBzdGF0dXNfdCBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKIAogICAgIHN0YXR1c190IHNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0yNDksMTAgKzI2NSwyMCBAQAogICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBjb21wcmVzc2lvbkZvcm1hdCk7CiAKKyAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgeworICAgICAgICBpbnQzMl90IGRyY0N1dDsKKyAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKKyAgICAgICAgaW50MzJfdCBoZWF2eUNvbXByZXNzaW9uOworICAgICAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsOworICAgICAgICBpbnQzMl90IGVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICB9IGRyY1BhcmFtc190OworCiAgICAgc3RhdHVzX3Qgc2V0dXBBQUNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBiaXRSYXRlLAotICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUyk7CisgICAgICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTLCBpbnQzMl90IHNick1vZGUsCisgICAgICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudCwgY29uc3QgZHJjUGFyYW1zX3QmIGRyYywKKyAgICAgICAgICAgIGludDMyX3QgcGNtTGltaXRlckVuYWJsZSk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIApAQCAtMjczLDYgKzI5OSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOwpAQCAtMzAxLDExICszMjgsMTcgQEAKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCiAgICAgdm9pZCBzaWduYWxFcnJvcigKICAgICAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyb3IgPSBPTVhfRXJyb3JVbmRlZmluZWQsCiAgICAgICAgICAgICBzdGF0dXNfdCBpbnRlcm5hbEVycm9yID0gVU5LTk9XTl9FUlJPUik7CiAKKyAgICBzdGF0aWMgYm9vbCBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisgICAgc3RhdGljIGJvb2wgZGVzY3JpYmVDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLAorICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zICZkZXNjcmliZVBhcmFtcyk7CisKICAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggMzJmNDY4Yi4uY2M0NjgwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzdGFydENhbWVyYVJlY29yZGluZygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGZyYW1lLgpAQCAtMTg1LDYgKzE4NSw4IEBACiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CiAKKyAgICB2b2lkIHJlbGVhc2VDYW1lcmEoKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQ2FtZXJhU291cmNlTGlzdGVuZXI7CiAKQEAgLTIzNiw3ICsyMzgsNiBAQAogICAgIHN0YXRpYyB2b2lkIGFkanVzdE91dGdvaW5nQU5XQnVmZmVyKElNZW1vcnkqIGRhdGEpOwogCiAgICAgdm9pZCBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7Ci0gICAgdm9pZCByZWxlYXNlQ2FtZXJhKCk7CiAgICAgc3RhdHVzX3QgcmVzZXQoKTsKIAogICAgIENhbWVyYVNvdXJjZShjb25zdCBDYW1lcmFTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkNmU3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xvY2tFc3RpbWF0b3IuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBDTE9DS19FU1RJTUFUT1JfSF8KKworI2RlZmluZSBDTE9DS19FU1RJTUFUT1JfSF8KKworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IENsb2NrRXN0aW1hdG9yIDogUmVmQmFzZSB7CisgICAgdmlydHVhbCBkb3VibGUgZXN0aW1hdGUoZG91YmxlIHgsIGRvdWJsZSB5KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworfTsKKworc3RydWN0IFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yIDogQ2xvY2tFc3RpbWF0b3IgeworICAgIHN0cnVjdCBMaW5lYXJGaXQgeworICAgICAgICAvKioKKyAgICAgICAgICogRml0IHkgPSBhICogeCArIGIsIHdoZXJlIGVhY2ggaW5wdXQgaGFzIGEgd2VpZ2h0CisgICAgICAgICAqLworICAgICAgICBkb3VibGUgbVg7ICAvLyBzdW0od19pICogeF9pKQorICAgICAgICBkb3VibGUgbVhYOyAvLyBzdW0od19pICogeF9pXjIpCisgICAgICAgIGRvdWJsZSBtWTsgIC8vIHN1bSh3X2kgKiB5X2kpCisgICAgICAgIGRvdWJsZSBtWVk7IC8vIHN1bSh3X2kgKiB5X2leMikKKyAgICAgICAgZG91YmxlIG1YWTsgLy8gc3VtKHdfaSAqIHhfaSAqIHlfaSkKKyAgICAgICAgZG91YmxlIG1XOyAgLy8gc3VtKHdfaSkKKworICAgICAgICBMaW5lYXJGaXQoKTsKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgICAgICB2b2lkIGNvbWJpbmUoY29uc3QgTGluZWFyRml0ICZsZik7CisgICAgICAgIHZvaWQgYWRkKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcpOworICAgICAgICB2b2lkIHNjYWxlKGRvdWJsZSB3KTsKKyAgICAgICAgZG91YmxlIGludGVycG9sYXRlKGRvdWJsZSB4KTsKKyAgICAgICAgZG91YmxlIHNpemUoKSBjb25zdDsKKworICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5lYXJGaXQpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBFc3RpbWF0b3IgZm9yIGYoeCkgPSB5JyB3aGVyZSBpbnB1dCB5JyBpcyBub2lzeSwgYnV0CisgICAgICogdGhlb3JldGljYWxseSBsaW5lYXI6CisgICAgICoKKyAgICAgKiAgICAgIHknID1+IHkgPSBhICogeCArIGIKKyAgICAgKgorICAgICAqIEl0IHVzZXMgbGluZWFyIGZpdCByZWdyZXNzaW9uIG92ZXIgYSB0YXBlcmluZyByb2xsaW5nIHdpbmRvdworICAgICAqIHRvIGdldCBhbiBlc3RpbWF0ZSBmb3IgeSAoZnJvbSB0aGUgY3VycmVudCBhbmQgcGFzdCBpbnB1dHMKKyAgICAgKiAoeCwgeScpKS4KKyAgICAgKgorICAgICAqICAgICBfX19fX19fX19fX18KKyAgICAgKiAgICAvfCAgICAgICAgICB8XAorICAgICAqICAgLyB8ICAgICAgICAgIHwgXAorICAgICAqICAvICB8ICAgICAgICAgIHwgIFwgICA8LS0tIG5ldyBkYXRhICh4LCB5JykKKyAgICAgKiAvICAgfCAgIG1haW4gICB8ICAgXAorICAgICAqIDwtLT48LS0tLS0tLS0tLT48LS0+CisgICAgICogdGFpbCAgICAgICAgICAgIGhlYWQKKyAgICAgKgorICAgICAqIHdlaWdodCBpcyAxIHVuZGVyIHRoZSBtYWluIHdpbmRvdywgdGFwZXJzIGV4cG9uZW50aWFsbHkgYnkKKyAgICAgKiB0aGUgZmFjdG9ycyBnaXZlbiBpbiB0aGUgaGVhZCBhbmQgdGhlIHRhaWwuCisgICAgICoKKyAgICAgKiBBc3N1bWluZyB0aGF0IHggYW5kIHknIGFyZSBtb25vdG9uaWMsIHRoYXQgeCBpcyBzb21ld2hhdAorICAgICAqIGV2ZW5seSBzYW1wbGVkLCBhbmQgdGhhdCBhID1+IDEsIHRoZSBlc3RpbWF0ZWQgeSBpcyBhbHNvCisgICAgICogZ29pbmcgdG8gYmUgbW9ub3RvbmljLgorICAgICAqLworICAgIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKAorICAgICAgICAgICAgc2l6ZV90IGhlYWRMZW5ndGggPSA1LCBkb3VibGUgaGVhZEZhY3RvciA9IDAuNSwKKyAgICAgICAgICAgIHNpemVfdCBtYWluTGVuZ3RoID0gMCwgZG91YmxlIHRhaWxGYWN0b3IgPSAwLjk5KTsKKworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gYWRkIGEgbmV3IHNhbXBsZSAoeCAtPiB5JykgYW5kIHJldHVybiBhbiBlc3RpbWF0ZWQgdmFsdWUgZm9yIHRoZSB0cnVlIHkKKyAgICB2aXJ0dWFsIGRvdWJsZSBlc3RpbWF0ZShkb3VibGUgeCwgZG91YmxlIHkpOworCitwcml2YXRlOgorICAgIFZlY3Rvcjxkb3VibGU+IG1YSGlzdG9yeTsgLy8gY2lyY3VsYXIgYnVmZmVyCisgICAgVmVjdG9yPGRvdWJsZT4gbVlIaXN0b3J5OyAvLyBjaXJjdWxhciBidWZmZXIKKyAgICBMaW5lYXJGaXQgbUhlYWQ7CisgICAgTGluZWFyRml0IG1NYWluOworICAgIExpbmVhckZpdCBtVGFpbDsKKyAgICBkb3VibGUgbUhlYWRGYWN0b3JJbnY7CisgICAgZG91YmxlIG1UYWlsRmFjdG9yOworICAgIGRvdWJsZSBtRmlyc3RXZWlnaHQ7CisgICAgc2l6ZV90IG1IaXN0b3J5TGVuZ3RoOworICAgIHNpemVfdCBtSGVhZExlbmd0aDsKKyAgICBzaXplX3QgbU51bVNhbXBsZXM7CisgICAgc2l6ZV90IG1TYW1wbGVJeDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmMjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUNfQkFTRV9IXworCisjZGVmaW5lIENPREVDX0JBU0VfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKKworc3RydWN0IENvZGVjQmFzZSA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0RmlsbFRoaXNCdWZmZXIgICAgICA9ICdmaWxsJywKKyAgICAgICAga1doYXREcmFpblRoaXNCdWZmZXIgICAgID0gJ2RyYWknLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzY29tJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zjb20nLAorICAgICAgICBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQgPSAnb3V0QycsCisgICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnJvJywKKyAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAorICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCisgICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKKyAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAorICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgPSAwOworCisgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOworCisgICAgc3RydWN0IFBvcnREZXNjcmlwdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgdmlydHVhbCBzaXplX3QgY291bnRCdWZmZXJzKCkgPSAwOworICAgICAgICB2aXJ0dWFsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJREF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHNwPEFCdWZmZXI+IGJ1ZmZlckF0KHNpemVfdCBpbmRleCkgY29uc3QgPSAwOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBQb3J0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgdmlydHVhbCB+UG9ydERlc2NyaXB0aW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQb3J0RGVzY3JpcHRpb24pOworICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICBDb2RlY0Jhc2UoKTsKKyAgICB2aXJ0dWFsIH5Db2RlY0Jhc2UoKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlY0Jhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQ19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNmM2NGEyYy4uNzY2YTgxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTMxLDcgKzMxLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBU3RyaW5nOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBIVFRQQmFzZTsKIAogY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKQEAgLTQzLDggKzQ2LDEzIEBACiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCisgICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCisgICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOworCisgICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIERhdGFTb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBEYXRhVVJJU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIHN0YXRpYyBzcDxEYXRhVVJJU291cmNlPiBDcmVhdGUoY29uc3QgY2hhciAqdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFVUklTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworCisgICAgRGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERhdGFVUklTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1VSSV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCBkOTk0Y2IzLi5hOTgxZDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMzAsNiArMzAsNyBAQAogY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CkBAIC01NSw3ICs1Niw3IEBACiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAgICAgaW50NjRfdCBtRHJtQnVmT2Zmc2V0OwotICAgIGludDY0X3QgbURybUJ1ZlNpemU7CisgICAgc2l6ZV90IG1Ecm1CdWZTaXplOwogICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CiAKICAgICBzc2l6ZV90IHJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDNlZjZiOWEuLjI2Y2U1ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTYzLDggKzYzLDggQEAKICAgICBpbnQzMl90IGdldFRpbWVTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lU2NhbGU7IH0KIAogICAgIHN0YXR1c190IHNldEdlb0RhdGEoaW50IGxhdGl0dWRleDEwMDAwLCBpbnQgbG9uZ2l0dWRleDEwMDAwKTsKLSAgICB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykgeyBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtczsgfQotICAgIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RhcnRUaW1lT2Zmc2V0TXMoaW50IG1zKSB7IG1TdGFydFRpbWVPZmZzZXRNcyA9IG1zOyB9CisgICAgdmlydHVhbCBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldE1zKCkgY29uc3QgeyByZXR1cm4gbVN0YXJ0VGltZU9mZnNldE1zOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmluZGV4IDNkNzk1OTYuLmM4YTUwZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTE4LDYgKzE4LDggQEAKIAogI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmg+CisKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKIH07CiAKLWNsYXNzIE1lZGlhQnVmZmVyIHsKK2NsYXNzIE1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVyQmFzZSB7CiBwdWJsaWM6CiAgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQogICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKQEAgLTU2LDEwICs1OCwxMCBAQAogCiAgICAgLy8gRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm5zIHRoZSBidWZmZXIgdG8gaXRzCiAgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwIGlmIHRoZSByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMC4KLSAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwogCiAgICAgLy8gSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50LgotICAgIHZvaWQgYWRkX3JlZigpOworICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7CiAKICAgICB2b2lkICpkYXRhKCkgY29uc3Q7CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKaW5kZXggMDQ4ODI5Mi4uYTAwNmY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTM0LDkgKzM0LDEyIEBACiAKICAgICB2b2lkIGFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAKLSAgICAvLyBCbG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZCByZXR1cm5zIGl0IHRvIHRoZSBjYWxsZXIsCi0gICAgLy8gdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgZmFsc2UsIGl0IGJsb2NrcyB1bnRpbCBhIGJ1ZmZlciBpcyBhdmFpbGFibGUgYW5kCisgICAgLy8gcGFzc2VzIGl0IHRvIHRoZSBjYWxsZXIgaW4gKmJ1ZmZlciwgd2hpbGUgcmV0dXJuaW5nIE9LLgorICAgIC8vIFRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCisgICAgLy8gSWYgbm9uQmxvY2tpbmcgaXMgdHJ1ZSBhbmQgYSBidWZmZXIgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAgICAvLyBidWZmZXIgaXMgc2V0IHRvIE5VTEwgYW5kIGl0IHJldHVybnMgV09VTERfQkxPQ0suCisgICAgc3RhdHVzX3QgYWNxdWlyZV9idWZmZXIoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDc2YWE1MDMuLjU0YTRlOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNiwxMCArMjYsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQUNvZGVjOwogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgQ29kZWNCYXNlOwogc3RydWN0IElDcnlwdG87CitzdHJ1Y3QgSUJhdHRlcnlTdGF0czsKIHN0cnVjdCBTb2Z0d2FyZVJlbmRlcmVyOwogc3RydWN0IFN1cmZhY2U7CiAKQEAgLTQ0LDExICs0NSwyMCBAQAogICAgICAgICBCVUZGRVJfRkxBR19FT1MgICAgICAgICA9IDQsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBDQl9JTlBVVF9BVkFJTEFCTEUgPSAxLAorICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKKyAgICAgICAgQ0JfRVJST1IgPSAzLAorICAgICAgICBDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgQmF0dGVyeU5vdGlmaWVyOworCiAgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlcik7CisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIgPSBOVUxMKTsKIAogICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LApAQCAtNTYsNiArNjYsOCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgIHN0YXR1c190IHNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spOworCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KiBidWZmZXJQcm9kdWNlcik7CiAKICAgICBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNjQsNiArNzYsMTAgQEAKICAgICAvLyB1bmNvbmZpZ3VyZWQuCiAgICAgc3RhdHVzX3Qgc3RvcCgpOwogCisgICAgLy8gUmVzZXRzIHRoZSBjb2RlYyB0byB0aGUgSU5JVElBTElaRUQgc3RhdGUuICBDYW4gYmUgY2FsbGVkIGFmdGVyIGFuIGVycm9yCisgICAgLy8gaGFzIG9jY3VyZWQgdG8gbWFrZSB0aGUgY29kZWMgdXNhYmxlLgorICAgIHN0YXR1c190IHJlc2V0KCk7CisKICAgICAvLyBDbGllbnQgTVVTVCBjYWxsIHJlbGVhc2UgYmVmb3JlIHJlbGVhc2luZyBmaW5hbCByZWZlcmVuY2UgdG8gdGhpcwogICAgIC8vIG9iamVjdC4KICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CkBAIC0xMDAsMTYgKzExNiwyMiBAQAogICAgICAgICAgICAgdWludDMyX3QgKmZsYWdzLAogICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMgPSAwbGwpOwogCisgICAgc3RhdHVzX3QgcmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpOwogICAgIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlckFuZFJlbGVhc2Uoc2l6ZV90IGluZGV4KTsKICAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCk7CiAKICAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAKICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0OworICAgIHN0YXR1c190IGdldElucHV0Rm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqYnVmZmVycykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CisgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKwogICAgIHN0YXR1c190IHJlcXVlc3RJRFJGcmFtZSgpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHdpbGwgYmUgcG9zdGVkIG9uY2UgdGhlcmUgImlzIHNvbWV0aGluZyB0byBkbyIsIGkuZS4KQEAgLTEzNSw2ICsxNTcsNyBAQAogICAgICAgICBTVEFSVElORywKICAgICAgICAgU1RBUlRFRCwKICAgICAgICAgRkxVU0hJTkcsCisgICAgICAgIEZMVVNIRUQsCiAgICAgICAgIFNUT1BQSU5HLAogICAgICAgICBSRUxFQVNJTkcsCiAgICAgfTsKQEAgLTE1OSw2ICsxODIsNyBAQAogICAgICAgICBrV2hhdEdldEJ1ZmZlcnMgICAgICAgICAgICAgICAgICAgICA9ICdnZXRCJywKICAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnZmx1cycsCiAgICAgICAgIGtXaGF0R2V0T3V0cHV0Rm9ybWF0ICAgICAgICAgICAgICAgID0gJ2dldE8nLAorICAgICAgICBrV2hhdEdldElucHV0Rm9ybWF0ICAgICAgICAgICAgICAgICA9ICdnZXRJJywKICAgICAgICAga1doYXREZXF1ZXVlSW5wdXRUaW1lZE91dCAgICAgICAgICAgPSAnZElUTycsCiAgICAgICAgIGtXaGF0RGVxdWV1ZU91dHB1dFRpbWVkT3V0ICAgICAgICAgID0gJ2RPVE8nLAogICAgICAgICBrV2hhdENvZGVjTm90aWZ5ICAgICAgICAgICAgICAgICAgICA9ICdjb2RjJywKQEAgLTE2Niw2ICsxOTAsNyBAQAogICAgICAgICBrV2hhdFJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbiAgICA9ICdyYWNOJywKICAgICAgICAga1doYXRHZXROYW1lICAgICAgICAgICAgICAgICAgICAgICAgPSAnZ2V0TicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgID0gJ3NldFAnLAorICAgICAgICBrV2hhdFNldENhbGxiYWNrICAgICAgICAgICAgICAgICAgICA9ICdzZXRDJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0xNzksMjYgKzIwNCw0NiBAQAogICAgICAgICBrRmxhZ1Nhd01lZGlhU2VydmVyRGllICAgICAgICAgID0gMTI4LAogICAgICAgICBrRmxhZ0lzRW5jb2RlciAgICAgICAgICAgICAgICAgID0gMjU2LAogICAgICAgICBrRmxhZ0dhdGhlckNvZGVjU3BlY2lmaWNEYXRhICAgID0gNTEyLAorICAgICAgICBrRmxhZ0lzQXN5bmMgICAgICAgICAgICAgICAgICAgID0gMTAyNCwKKyAgICAgICAga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZCAgICAgICA9IDIwNDgsCiAgICAgfTsKIAogICAgIHN0cnVjdCBCdWZmZXJJbmZvIHsKLSAgICAgICAgdm9pZCAqbUJ1ZmZlcklEOworICAgICAgICB1aW50MzJfdCBtQnVmZmVySUQ7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1EYXRhOwogICAgICAgICBzcDxBQnVmZmVyPiBtRW5jcnlwdGVkRGF0YTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgICAgICBib29sIG1Pd25lZEJ5Q2xpZW50OwogICAgIH07CiAKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7Ci0gICAgc3A8QUNvZGVjPiBtQ29kZWM7CisgICAgc3A8Q29kZWNCYXNlPiBtQ29kZWM7CiAgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKICAgICB1aW50MzJfdCBtUmVwbHlJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwogICAgIHNwPFN1cmZhY2U+IG1OYXRpdmVXaW5kb3c7CiAgICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBtQ2FsbGJhY2s7CisKKyAgICBib29sIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkOworICAgIGJvb2wgbUlzVmlkZW87CisKKyAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCisgICAgQVN0cmluZyBtSW5pdE5hbWU7CisgICAgYm9vbCBtSW5pdE5hbWVJc1R5cGU7CisgICAgYm9vbCBtSW5pdElzRW5jb2RlcjsKKworICAgIC8vIFVzZWQgb25seSB0byBzeW5jaHJvbml6ZSBhc3luY2hyb25vdXMgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgLy8gYWNyb3NzIGFsbCB0aGUgb3RoZXIgKHN5bmNocm9ub3VzKSBidWZmZXIgc3RhdGUgY2hhbmdlCisgICAgLy8gb3BlcmF0aW9ucywgc3VjaCBhcyBkZS9xdWV1ZUluL091dHB1dEJ1ZmZlciwgc3RhcnQgYW5kCisgICAgLy8gc3RvcC9mbHVzaC9yZXNldC9yZWxlYXNlLgorICAgIE11dGV4IG1CdWZmZXJMb2NrOwogCiAgICAgTGlzdDxzaXplX3Q+IG1BdmFpbFBvcnRCdWZmZXJzWzJdOwogICAgIFZlY3RvcjxCdWZmZXJJbmZvPiBtUG9ydEJ1ZmZlcnNbMl07CkBAIC0yMjIsNyArMjY3LDkgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKKyAgICBzdGF0aWMgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoaW50MzJfdCByZXBseUlELCBpbnQzMl90IGVycik7CisKKyAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKTsKIAogICAgIHZvaWQgc2V0U3RhdGUoU3RhdGUgbmV3U3RhdGUpOwogICAgIHZvaWQgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKQEAgLTIzMiw2ICsyNzksMTAgQEAKICAgICBzdGF0dXNfdCBvblJlbGVhc2VPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHNzaXplX3QgZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpOwogCisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyQW5kRm9ybWF0KAorICAgICAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmJ1ZmZlciwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworCiAgICAgYm9vbCBoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0ID0gZmFsc2UpOwogICAgIGJvb2wgaGFuZGxlRGVxdWV1ZU91dHB1dEJ1ZmZlcih1aW50MzJfdCByZXBseUlELCBib29sIG5ld1JlcXVlc3QgPSBmYWxzZSk7CiAgICAgdm9pZCBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKQEAgLTI0NCw5ICsyOTUsMjggQEAKIAogICAgIHZvaWQgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCisgICAgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciAqZGV0YWlsID0gTlVMTCk7CisgICAgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKwogICAgIHN0YXR1c190IG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKICAgICBzdGF0dXNfdCBhbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHVwZGF0ZUJhdHRlcnlTdGF0KCk7CisgICAgYm9vbCBpc0V4ZWN1dGluZygpIGNvbnN0OworCisgICAgLyogY2FsbGVkIHRvIGdldCB0aGUgbGFzdCBjb2RlYyBlcnJvciB3aGVuIHRoZSBzdGlja3kgZmxhZyBpcyBzZXQuCisgICAgICogaWYgbm8gc3VjaCBjb2RlYyBlcnJvciBpcyBmb3VuZCwgcmV0dXJucyBVTktOT1dOX0VSUk9SLgorICAgICAqLworICAgIGlubGluZSBzdGF0dXNfdCBnZXRTdGlja3lFcnJvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGlja3lFcnJvciAhPSAwID8gbVN0aWNreUVycm9yIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBzZXRTdGlja3lFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICAgICAgbUZsYWdzIHw9IGtGbGFnU3RpY2t5RXJyb3I7CisgICAgICAgIG1TdGlja3lFcnJvciA9IGVycjsKKyAgICB9CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggNTkwNjIzYi4uNjc3NTRmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMjAsNzAgKzIwLDcyIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFDb2RlY0xpc3QgewotICAgIHN0YXRpYyBjb25zdCBNZWRpYUNvZGVjTGlzdCAqZ2V0SW5zdGFuY2UoKTsKK3N0cnVjdCBBTWVzc2FnZTsKIAotICAgIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAorc3RydWN0IE1lZGlhQ29kZWNMaXN0IDogcHVibGljIEJuTWVkaWFDb2RlY0xpc3QgeworICAgIHN0YXRpYyBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldEluc3RhbmNlKCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZmluZENvZGVjQnlUeXBlKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgYm9vbCBlbmNvZGVyLCBzaXplX3Qgc3RhcnRJbmRleCA9IDApIGNvbnN0OwogCi0gICAgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAotICAgIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwotICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZShzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIGJvb2wgaXNFbmNvZGVyKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgYm9vbCBjb2RlY0hhc1F1aXJrKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqcXVpcmtOYW1lKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudENvZGVjcygpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkVHlwZXMoc2l6ZV90IGluZGV4LCBWZWN0b3I8QVN0cmluZz4gKnR5cGVzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhQ29kZWNJbmZvPiBnZXRDb2RlY0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleCA+PSBtQ29kZWNJbmZvcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQ1MTI3Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNvZGVjSW5mb3MuaXRlbUF0KGluZGV4KTsKKyAgICB9CiAKLSAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKLSAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7Ci0gICAgICAgIHVpbnQzMl90IG1MZXZlbDsKLSAgICB9OwotICAgIHN0YXR1c190IGdldENvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICp0eXBlLAotICAgICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMsCi0gICAgICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMsCi0gICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MpIGNvbnN0OworICAgIC8vIHRvIGJlIHVzZWQgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlIGFsb25lCisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0TG9jYWxJbnN0YW5jZSgpOwogCiBwcml2YXRlOgogICAgIGVudW0gU2VjdGlvbiB7CiAgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKKyAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCiAgICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKICAgICB9OwogCi0gICAgc3RydWN0IENvZGVjSW5mbyB7Ci0gICAgICAgIEFTdHJpbmcgbU5hbWU7Ci0gICAgICAgIGJvb2wgbUlzRW5jb2RlcjsKLSAgICAgICAgdWludDMyX3QgbVR5cGVzOwotICAgICAgICB1aW50MzJfdCBtUXVpcmtzOwotICAgIH07Ci0KLSAgICBzdGF0aWMgTWVkaWFDb2RlY0xpc3QgKnNDb2RlY0xpc3Q7CisgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKKyAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgU2VjdGlvbiBtQ3VycmVudFNlY3Rpb247CisgICAgVmVjdG9yPFNlY3Rpb24+IG1QYXN0U2VjdGlvbnM7CiAgICAgaW50MzJfdCBtRGVwdGg7CisgICAgQVN0cmluZyBtSHJlZkJhc2U7CiAKLSAgICBWZWN0b3I8Q29kZWNJbmZvPiBtQ29kZWNJbmZvczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1Db2RlY1F1aXJrczsKLSAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzaXplX3Q+IG1UeXBlczsKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CisgICAgc3A8TWVkaWFDb2RlY0luZm8+IG1DdXJyZW50SW5mbzsKKyAgICBzcDxJT01YPiBtT01YOwogCiAgICAgTWVkaWFDb2RlY0xpc3QoKTsKICAgICB+TWVkaWFDb2RlY0xpc3QoKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZvaWQgcGFyc2VYTUxGaWxlKEZJTEUgKmZpbGUpOworICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIHZvaWQgcGFyc2VUb3BMZXZlbFhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAKICAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKICAgICAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOwpAQCAtOTMsMTMgKzk1LDE4IEBACiAgICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlID0gTlVMTCk7CiAKICAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHN0YXR1c190IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwogICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKIAorICAgIHN0YXR1c190IGluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjTGlzdCk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjljOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTWVkaWFDb2RlY1NvdXJjZV9IXworI2RlZmluZSBNZWRpYUNvZGVjU291cmNlX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQUxvb3BlcjsKK2NsYXNzIEFNZXNzYWdlOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK2NsYXNzIE1lZGlhQ29kZWM7CitjbGFzcyBNZXRhRGF0YTsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBlbnVtIEZsYWdCaXRzIHsKKyAgICAgICAgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCAgICAgID0gMSwKKyAgICAgICAgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQgICAgID0gMiwKKyAgICB9OworCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWNTb3VyY2U+IENyZWF0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIGJvb2wgaXNWaWRlbygpIGNvbnN0IHsgcmV0dXJuIG1Jc1ZpZGVvOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisKKyAgICAvLyBNZWRpYVNvdXJjZQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSB7IHJldHVybiBtTWV0YTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIC8vIE1lZGlhQnVmZmVyT2JzZXJ2ZXIKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHVsbGVyOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UHVsbGVyTm90aWZ5LAorICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFBhdXNlLAorICAgIH07CisKKyAgICBNZWRpYUNvZGVjU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworCisgICAgc3RhdHVzX3Qgb25TdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIHJlbGVhc2VFbmNvZGVyKCk7CisgICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB2b2lkIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIHN0YXR1c190IGRvTW9yZVdvcmsoaW50MzJfdCBudW1JbnB1dCwgaW50MzJfdCBudW1PdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZCgpOworICAgIHZvaWQgcmVzdW1lKGludDY0X3Qgc2tpcEZyYW1lc0JlZm9yZVVzID0gLTFsbCk7CisgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgc3RhdHVzX3QgcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPiA+IG1SZWZsZWN0b3I7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIHNwPFB1bGxlcj4gbVB1bGxlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBtRW5jb2RlcjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgTGlzdDx1aW50MzJfdD4gbVN0b3BSZXBseUlEUXVldWU7CisgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVN0b3BwaW5nOworICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOworICAgIHNwPEFNZXNzYWdlPiBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOworICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbUlucHV0QnVmZmVyUXVldWU7CisgICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7CisgICAgTGlzdDxpbnQ2NF90PiBtRGVjb2RpbmdUaW1lUXVldWU7IC8vIGRlY29kaW5nIHRpbWUgKHVzKSBmb3IgdmlkZW8KKworICAgIC8vIGF1ZGlvIGRyaWZ0IHRpbWUKKyAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICBMaXN0PGludDY0X3Q+IG1EcmlmdFRpbWVRdWV1ZTsKKworICAgIC8vIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByb3RlY3RlZCBieSBtT3V0cHV0QnVmZmVyTG9jaworICAgIE11dGV4IG1PdXRwdXRCdWZmZXJMb2NrOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyQ29uZDsKKyAgICBMaXN0PE1lZGlhQnVmZmVyKj4gbU91dHB1dEJ1ZmZlclF1ZXVlOworICAgIGJvb2wgbUVuY29kZXJSZWFjaGVkRU9TOworICAgIHN0YXR1c190IG1FcnJvckNvZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjU291cmNlKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIE1lZGlhQ29kZWNTb3VyY2VfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCmluZGV4IGNmNWJlZGEuLmU2N2Q0ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaApAQCAtMjUsNiArMjUsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKQEAgLTM4LDYgKzM5LDcgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CkBAIC01OCw2ICs2MCw4IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUXzNHUFA7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggNjg2ZjI4Ni4uMmU2NjNlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtMjMsNiArMjMsMTggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CisgICAgLy8gc3RhdHVzX3QgbWFwIGZvciBlcnJvcnMgaW4gdGhlIG1lZGlhIGZyYW1ld29yaworICAgIC8vIE9LIG9yIE5PX0VSUk9SIG9yIDAgcmVwcmVzZW50cyBubyBlcnJvci4KKworICAgIC8vIFNlZSBzeXN0ZW0vY29yZS9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCisgICAgLy8gU3lzdGVtIHN0YW5kYXJkIGVycm9ycyBmcm9tIC0xIHRocm91Z2ggKHBvc3NpYmx5KSAtMTMzCisgICAgLy8KKyAgICAvLyBFcnJvcnMgd2l0aCBzcGVjaWFsIG1lYW5pbmdzIGFuZCBzaWRlIGVmZmVjdHMuCisgICAgLy8gSU5WQUxJRF9PUEVSQVRJT046ICBPcGVyYXRpb24gYXR0ZW1wdGVkIGluIGFuIGlsbGVnYWwgc3RhdGUgKHdpbGwgdHJ5IHRvIHNpZ25hbCB0byBhcHApLgorICAgIC8vIERFQURfT0JKRUNUOiAgICAgICAgU2lnbmFsIGZyb20gQ29kZWNCYXNlIHRvIE1lZGlhQ29kZWMgdGhhdCBNZWRpYVNlcnZlciBoYXMgZGllZC4KKyAgICAvLyBOQU1FX05PVF9GT1VORDogICAgIFNpZ25hbCBmcm9tIENvZGVjQmFzZSB0byBNZWRpYUNvZGVjIHRoYXQgdGhlIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kLgorCisgICAgLy8gTWVkaWEgZXJyb3JzCiAgICAgTUVESUFfRVJST1JfQkFTRSAgICAgICAgPSAtMTAwMCwKIAogICAgIEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEID0gTUVESUFfRVJST1JfQkFTRSwKQEAgLTQ2LDI2ICs1OCw1NCBAQAogICAgIC8vIGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCiAgICAgRFJNX0VSUk9SX0JBU0UgPSAtMjAwMCwKIAotICAgIEVSUk9SX0RSTV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAotICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMSwKLSAgICBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDIsCi0gICAgRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAotICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICA9IERSTV9FUlJPUl9CQVNFIC0gNCwKLSAgICBFUlJPUl9EUk1fREVDUllQVCAgICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUsCi0gICAgRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAotICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNywKLSAgICBFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDgsCi0gICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAotICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTAsCisgICAgRVJST1JfRFJNX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFLAorICAgIEVSUk9SX0RSTV9OT19MSUNFTlNFICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEICAgPSBEUk1fRVJST1JfQkFTRSAtIDQsCisgICAgRVJST1JfRFJNX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKKyAgICBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDcsCisgICAgRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOCwKKyAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAorICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEwLAorICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBEUk1fRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDExLAogCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCi0gICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCisgICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNTAwLAorICAgIEVSUk9SX0RSTV9WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKIAogICAgIC8vIEhlYXJ0YmVhdCBFcnJvciBDb2RlcwogICAgIEhFQVJUQkVBVF9FUlJPUl9CQVNFID0gLTMwMDAsCiAgICAgRVJST1JfSEVBUlRCRUFUX1RFUk1JTkFURV9SRVFVRVNURUQgICAgICAgICAgICAgICAgICAgICA9IEhFQVJUQkVBVF9FUlJPUl9CQVNFLAorCisgICAgLy8gTkRLIEVycm9yIGNvZGVzCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKKyAgICAvLyBmcm9tIC0xMDAwMCAoMHhGRkZGRDhGMCAtIDB4RkZGRkQ4RUMpCisgICAgLy8gZnJvbSAtMjAwMDAgKDB4RkZGRkIxRTAgLSAweEZGRkZCMUQ3KQorCisgICAgLy8gQ29kZWMgZXJyb3JzIGFyZSBwZXJtaXR0ZWQgZnJvbSAweDgwMDAxMDAwIHRocm91Z2ggMHg5MDAwRkZGRgorICAgIEVSUk9SX0NPREVDX01BWCAgICA9IChzaWduZWQpMHg5MDAwRkZGRiwKKyAgICBFUlJPUl9DT0RFQ19NSU4gICAgPSAoc2lnbmVkKTB4ODAwMDEwMDAsCisKKyAgICAvLyBTeXN0ZW0gdW5rbm93biBlcnJvcnMgZnJvbSAweDgwMDAwMDAwIC0gMHg4MDAwMDAwNyAoSU5UMzJfTUlOICsgNykKKyAgICAvLyBTZWUgc3lzdGVtL2NvcmUvaW5jbHVkZS91dGlscy9FcnJvcnMuaAogfTsKIAorLy8gYWN0aW9uIGNvZGVzIGZvciBNZWRpYUNvZGVjcyB0aGF0IHRlbGwgdGhlIHVwcGVyIGxheWVyIGFuZCBhcHBsaWNhdGlvbgorLy8gdGhlIHNldmVyaXR5IG9mIGFueSBlcnJvci4KK2VudW0gQWN0aW9uQ29kZSB7CisgICAgQUNUSU9OX0NPREVfRkFUQUwsCisgICAgQUNUSU9OX0NPREVfVFJBTlNJRU5ULAorICAgIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFLAorfTsKKworLy8gcmV0dXJucyB0cnVlIGlmIGVyciBpcyBhIHJlY29nbml6ZWQgRFJNIGVycm9yIGNvZGUKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0NyeXB0b0Vycm9yKHN0YXR1c190IGVycikgeworICAgIHJldHVybiAoRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgPD0gZXJyICYmIGVyciA8PSBFUlJPUl9EUk1fVU5LTk9XTikKKyAgICAgICAgICAgIHx8IChFUlJPUl9EUk1fVkVORE9SX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0RSTV9WRU5ET1JfTUFYKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRURJQV9FUlJPUlNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAzMDc2YTk2Li4xODM5MzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC02NSw2ICs2NSw4IEBACiAgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCkgeworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkgOiBtSXNEcm0oZmFsc2UpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIEhUVFBCYXNlIHsKKyAgICBNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworCisgICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggZmY2YTY2ZS4uYmJlNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZXRhRGF0YTsKLXN0cnVjdCBNUEVHNFdyaXRlcjsKK3N0cnVjdCBNZWRpYVdyaXRlcjsKIAogLy8gTWVkaWFNdXhlciBpcyB1c2VkIHRvIG11eCBtdWx0aXBsZSB0cmFja3MgaW50byBhIHZpZGVvLiBDdXJyZW50bHksIHdlIG9ubHkKIC8vIHN1cHBvcnQgYSBtcDQgZmlsZSBhcyB0aGUgb3V0cHV0LgpAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgogICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgdWludDMyX3QgZmxhZ3MpIDsKIAogcHJpdmF0ZToKLSAgICBzcDxNUEVHNFdyaXRlcj4gbVdyaXRlcjsKKyAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggMzgxOGU2My4uYTY1M2RiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtODIsNiArODIsMTAgQEAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCiAgICAgcHJpdmF0ZToKICAgICAgICAgZW51bSBPcHRpb25zIHsKICAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLApAQCAtOTEsNiArOTUsNyBAQAogICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwogICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgICAgIGludDY0X3QgbUxhdGVuZXNzVXM7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwogICAgIH07CiAKICAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCiAgICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCiAgICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICYgLyogYnVmZmVycyAqLykgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKaW5kZXggNWNjOGRjZi4uZTI3ZWExZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaApAQCAtNDgsNiArNDgsOSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldFN0YXJ0VGltZU9mZnNldE1zKGludCBtcykge30KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NZWRpYVdyaXRlcigpIHt9CiAgICAgaW50NjRfdCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmluZGV4IGY1MWMxMmQuLjNmNDI3OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKQEAgLTUzLDkgKzUzLDEzIEBACiAgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCiAgICAga0tleVdhbnRzTkFMRnJhZ21lbnRzID0gJ05BTGYnLAogICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCiAgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKQEAgLTE2MiwxMSArMTY2LDE5IEBACiAgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CiAKICAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KKyAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KKyAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCisgICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KKyAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCiB9OwogCiBlbnVtIHsKICAgICBrVHlwZUVTRFMgICAgICAgID0gJ2VzZHMnLAogICAgIGtUeXBlQVZDQyAgICAgICAgPSAnYXZjYycsCisgICAga1R5cGVIVkNDICAgICAgICA9ICdodmNjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1YWU2ZjZiLi40MDJlN2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKQEAgLTQ1LDYgKzQ2LDcgQEAKICAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggNTEyMWMxNy4uZTM0MTE2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjgsNyArMjgsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYUNvZGVjTGlzdDsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKIGNsYXNzIE1lbW9yeURlYWxlcjsKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyOwogc3RydWN0IENvZGVjUHJvZmlsZUxldmVsOwpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICBWZWN0b3I8Q29kZWNOYW1lQW5kUXVpcmtzPiAqbWF0Y2hpbmdDb2RlY05hbWVzQW5kUXVpcmtzKTsKIAogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRDb21wb25lbnRRdWlya3MoCi0gICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmbGlzdCk7CiAKICAgICBzdGF0aWMgYm9vbCBmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcyk7CiAKQEAgLTM1Miw2ICszNTIsOSBAQAogCiAgICAgaW50NjRfdCBnZXREZWNvZGluZ1RpbWVVcygpOwogCisgICAgc3RhdHVzX3QgcGFyc2VIRVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwogICAgIHN0YXR1c190IHBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgIHVuc2lnbmVkICpwcm9maWxlLCB1bnNpZ25lZCAqbGV2ZWwpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAppbmRleCAyNjUzYjUzLi4wOThhYTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaApAQCAtNDcsNiArNDcsNyBAQAogIHByaXZhdGU6CiAgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOwogICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgaW50MzJfdCBtU2tpcDsKICAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CiAgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CiAgICAgaW50MzJfdCBtV3JpdGVIZWFkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5oCmluZGV4IDY1MTBhNTkuLmViM2FjY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpOwogCi0gICAgdmlydHVhbCBjaGFyICpleHRyYWN0QWxidW1BcnQoaW50IGZkKTsKKyAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpOwogCiBwcml2YXRlOgogICAgIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKGNvbnN0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmgKaW5kZXggZGI1Zjk0Ny4uNDNiNzVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAvLyBwYXNzIG1ldGFkYXRhIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIEN1cnJlbnRseSwgaXQgaXMgZm9yY2Ugc2V0IHRvIHRydWUKICAgICBib29sIGlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgc3A8QnVmZmVyUXVldWU+IGdldEJ1ZmZlclF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlOyB9CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KIAogICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKQEAgLTEzOSwxMiArMTM5LDE3IEBACiAgICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAKKyAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCisgICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKwogICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogcHJpdmF0ZToKLSAgICAvLyBtQnVmZmVyUXVldWUgaXMgdGhlIGV4Y2hhbmdlIHBvaW50IGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZAotICAgIC8vIHRoaXMgY29uc3VtZXIKLSAgICBzcDxCdWZmZXJRdWV1ZT4gbUJ1ZmZlclF1ZXVlOworICAgIC8vIEEgQnVmZmVyUXVldWUsIHJlcHJlc2VudGVkIGJ5IHRoZXNlIGludGVyZmFjZXMsIGlzIHRoZSBleGNoYW5nZSBwb2ludAorICAgIC8vIGJldHdlZW4gdGhlIHByb2R1Y2VyIGFuZCB0aGlzIGNvbnN1bWVyCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIHN0cnVjdCBTbG90RGF0YSB7CiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IGJiYWQyNzEuLmE3OTVjODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTUzLDYgKzUzLDkgQEAKIC8vIENvbnZlcnQgYSBNSU1FIHR5cGUgdG8gYSBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0CiBzdGF0dXNfdCBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCBjb25zdCBjaGFyKiBtaW1lKTsKIAorLy8gQ29udmVydCBhIGFhYyBwcm9maWxlIHRvIGEgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdAordm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb19mb3JtYXRfdCYgZm9ybWF0LCB1aW50NjRfdCBlQWFjUHJvZmlsZSk7CisKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIApAQCAtNjAsNiArNjMsOCBAQAogYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOwogCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8gPSBmYWxzZSk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKaW5kZXggOWVjZWVhMy4uNzJlM2Q4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKQEAgLTE4LDggKzE4LDM3IEBACiAKICNkZWZpbmUgQV9CQVNFX0hfCiAKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKCooYSkpKQorCiAjZGVmaW5lIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKG5hbWUpIFwKICAgICBuYW1lKGNvbnN0IG5hbWUgJik7IFwKICAgICBuYW1lICZvcGVyYXRvcj0oY29uc3QgbmFtZSAmKQogCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgcGFyYW1ldGVyIGlzIHNhZmUgZm9yIG5ldyBhcnJheSBhbGxvY2F0aW9uICgzMi1iaXQpCisgKgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiBpZiAoIWlzU2FmZUFycmF5U2l6ZTx1aW50MzJfdD4oYXJyYXlTaXplKSkgeworICogICAgIHJldHVybiBCQURfVkFMVUU7CisgKiB9CisgKiAuLi4KKyAqIHVpbnQzMl90ICpteUFycmF5ID0gbmV3IHVpbnQzMl90W2FycmF5U2l6ZV07CisgKgorICogVGhlcmUgaXMgYSBidWcgaW4gZ2NjIHZlcnNpb25zIGVhcmxpZXIgdGhhbiA0Ljggd2hlcmUgdGhlIG5ld1tdIGFycmF5IGFsbG9jYXRpb24KKyAqIHdpbGwgb3ZlcmZsb3cgaW4gdGhlIGludGVybmFsIDMyIGJpdCBoZWFwIGFsbG9jYXRpb24sIHJlc3VsdGluZyBpbiBhbgorICogdW5kZXJhbGxvY2F0ZWQgYXJyYXkuIFRoaXMgaXMgYSBzZWN1cml0eSBpc3N1ZSB0aGF0IGFsbG93cyBwb3RlbnRpYWwgb3ZlcndyaXRpbmcKKyAqIG9mIG90aGVyIGhlYXAgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB0byBjaGVja2luZyBpcyB0byBjcmVhdGUgYSBzYWZlIG5ldyBhcnJheSB0ZW1wbGF0ZSBmdW5jdGlvbiB3aGljaAorICogZWl0aGVyIHRocm93cyBhIHN0ZDo6YmFkX2FsbG9jIGV4Y2VwdGlvbiBvciByZXR1cm5zIE5VTEwvbnVsbHB0cl90OyBOVUxMIGNvbnNpZGVyZWQKKyAqIHNhZmUgc2luY2Ugbm9ybWFsIGFjY2VzcyBvZiBOVUxMIHRocm93cyBhbiBleGNlcHRpb24uCisgKgorICogaHR0cHM6Ly9zZWN1cml0eWJsb2cucmVkaGF0LmNvbS8yMDEyLzEwLzMxL2FycmF5LWFsbG9jYXRpb24taW4tY3h4LworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2Jvb2wgaXNTYWZlQXJyYXlTaXplKFMgc2l6ZSkgeworICAgIHJldHVybiBzaXplID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBTIGlzIHNpZ25lZCwgaWdub3JlZCBpZiBub3QuCisgICAgICAgICAgICAmJiBzaXplIDw9IDB4ZmZmZmZmZmYgLyBzaXplb2YoVCk7ICAvLyBtYXgtdW5zaWduZWQtMzItYml0LWludCAvIGVsZW1lbnQtc2l6ZS4KK30KKwogI2VuZGlmICAvLyBBX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oCmluZGV4IDU1MTBiMTIuLmMzYmYwZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaApAQCAtMjUsOCArMjUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQUJpdFJlYWRlciB7CitjbGFzcyBBQml0UmVhZGVyIHsKK3B1YmxpYzoKICAgICBBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5BQml0UmVhZGVyKCk7CiAKICAgICB1aW50MzJfdCBnZXRCaXRzKHNpemVfdCBuKTsKICAgICB2b2lkIHNraXBCaXRzKHNpemVfdCBuKTsKQEAgLTM3LDE4ICszOSwzMiBAQAogCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OwogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZTsKIAogICAgIHVpbnQzMl90IG1SZXNlcnZvaXI7ICAvLyBsZWZ0LWFsaWduZWQgYml0cwogICAgIHNpemVfdCBtTnVtQml0c0xlZnQ7CiAKLSAgICB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmlsbFJlc2Vydm9pcigpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJpdFJlYWRlcik7CiB9OwogCitjbGFzcyBOQUxCaXRSZWFkZXIgOiBwdWJsaWMgQUJpdFJlYWRlciB7CitwdWJsaWM6CisgICAgTkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgYXRMZWFzdE51bUJpdHNMZWZ0KHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1OdW1aZXJvczsKKworICAgIHZpcnR1YWwgdm9pZCBmaWxsUmVzZXJ2b2lyKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOQUxCaXRSZWFkZXIpOworfTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBX0JJVF9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCmluZGV4IDI4ZjBhZWQuLjYyOTRlZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaApAQCAtMjcsNiArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CiAKIHN0cnVjdCBBQnVmZmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKQEAgLTQyLDExICs0MywxNyBAQAogCiAgICAgdm9pZCBzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZyb20gZHVwIG9mIHNvbWUgbWVtb3J5IGJsb2NrCisgICAgc3RhdGljIHNwPEFCdWZmZXI+IENyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpOworCiAgICAgdm9pZCBzZXRJbnQzMkRhdGEoaW50MzJfdCBkYXRhKSB7IG1JbnQzMkRhdGEgPSBkYXRhOyB9CiAgICAgaW50MzJfdCBpbnQzMkRhdGEoKSBjb25zdCB7IHJldHVybiBtSW50MzJEYXRhOyB9CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKKyAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKIApAQCAtNTQsNiArNjEsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtRmFyZXdlbGw7CiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogCisgICAgTWVkaWFCdWZmZXJCYXNlICptTWVkaWFCdWZmZXJCYXNlOworCiAgICAgdm9pZCAqbURhdGE7CiAgICAgc2l6ZV90IG1DYXBhY2l0eTsKICAgICBzaXplX3QgbVJhbmdlT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKaW5kZXggZDJlNmIyOC4uM2JiN2Q3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCkBAIC00MywxMyArNDMsMTMgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBU3RhdGUpOwogfTsKIAotc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgQUhhbmRsZXIgeworc3RydWN0IEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUgewogICAgIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgLy8gT25seSB0byBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gYSBtZXNzYWdlLgogICAgIHZvaWQgY2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKaW5kZXggOTQwZmM1NS4uNGQ3NmI2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oCkBAIC01Niw4ICs1Niw2IEBACiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgc3A8QU1lc3NhZ2U+ID4gbVJlcGxpZXM7CiAKLSAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZV9sKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQ2NF90IGRlbGF5VXMpOwotCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUxvb3BlclJvc3Rlcik7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDdlODIzZWIuLmE5ZTIzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCkBAIC01MCw2ICs1MCw3IEBACiAgICAgdm9pZCBzZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIHZhbHVlKTsKICAgICB2b2lkIHNldFBvaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUpOwogICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnMsIHNzaXplX3QgbGVuID0gLTEpOworICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFTdHJpbmcgJnMpOwogICAgIHZvaWQgc2V0T2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPFJlZkJhc2U+ICZvYmopOwogICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2V0TWVzc2FnZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm9iaik7CkBAIC01OCw2ICs1OSw4IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOwogCisgICAgYm9vbCBjb250YWlucyhjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKKwogICAgIGJvb2wgZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdDsKICAgICBib29sIGZpbmRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CiAgICAgYm9vbCBmaW5kU2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKnZhbHVlKSBjb25zdDsKQEAgLTEzNCw3ICsxMzcsOSBAQAogICAgICAgICAgICAgUmVjdCByZWN0VmFsdWU7CiAgICAgICAgIH0gdTsKICAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgICAgIHNpemVfdCAgICAgIG1OYW1lTGVuZ3RoOwogICAgICAgICBUeXBlIG1UeXBlOworICAgICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMTQ0LDEyICsxNDksMTQgQEAKICAgICBzaXplX3QgbU51bUl0ZW1zOwogCiAgICAgSXRlbSAqYWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpOwotICAgIHZvaWQgZnJlZUl0ZW0oSXRlbSAqaXRlbSk7CisgICAgdm9pZCBmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pOwogICAgIGNvbnN0IEl0ZW0gKmZpbmRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIFR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICB2b2lkIHNldE9iamVjdEludGVybmFsKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKTsKIAorICAgIHNpemVfdCBmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lc3NhZ2UpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggMGY4ZjFlMS4uN2M5ODY5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCkBAIC0xOCwxNCArMTgsMTkgQEAKIAogI2RlZmluZSBBX1NUUklOR19IXwogCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IFN0cmluZzg7CitzdHJ1Y3QgUGFyY2VsOworCiBzdHJ1Y3QgQVN0cmluZyB7CiAgICAgQVN0cmluZygpOwogICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CiAgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBTdHJpbmc4ICZmcm9tKTsKICAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pOwogICAgIEFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pOwogICAgIH5BU3RyaW5nKCk7CkBAIC02NywxNiArNzIsMjYgQEAKICAgICBzaXplX3QgaGFzaCgpIGNvbnN0OwogCiAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKIAogICAgIGludCBjb21wYXJlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgY29tcGFyZUlnbm9yZUNhc2UoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBlcXVhbHNJZ25vcmVDYXNlKGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKICAgICBib29sIHN0YXJ0c1dpdGgoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdDsKICAgICBib29sIGVuZHNXaXRoKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CisgICAgYm9vbCBzdGFydHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpwcmVmaXgpIGNvbnN0OworICAgIGJvb2wgZW5kc1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnN1ZmZpeCkgY29uc3Q7CiAKICAgICB2b2lkIHRvbG93ZXIoKTsKIAorICAgIHN0YXRpYyBBU3RyaW5nIEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaAppbmRleCA2MGNiNDFkLi4yNTViY2JlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oCkBAIC0yMCw5ICsyMCw0NCBAQAogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1hdGggdGVtcGxhdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAorLyogVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KK3RlbXBsYXRlPGNsYXNzIFQ+CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2Um91bmQoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKKyAgICBpZiAoKG5vbSA+PSAwKSBeIChkZW4gPj0gMCkpIHsKKyAgICAgICAgcmV0dXJuIChub20gLSBkZW4gLyAyKSAvIGRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKG5vbSArIGRlbiAvIDIpIC8gZGVuOworICAgIH0KK30KKworLyogPT0gY2VpbChub20gLyBkZW4pLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZVcChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgeworICAgIGlmIChkZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSArIGRlbiArIDEgOiBub20pIC8gZGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSA6IG5vbSArIGRlbiAtIDEpIC8gZGVuOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBhYnMoY29uc3QgVCAmYSkgeworICAgIHJldHVybiBhIDwgMCA/IC1hIDogYTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWluKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgY29uc3QgVCAmbWF4KGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKK30KKwogdGVtcGxhdGU8Y2xhc3MgVD4KIHZvaWQgRU5TVVJFX1VOU0lHTkVEX1RZUEUoKSB7Ci0gICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXTsKKyAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fdW51c2VkOwogfQogCiAvLyBuZWVkbGUgaXMgaW4gcmFuZ2UgW2hheVN0YXJ0LCBoYXlTdGFydCArIGhheVNpemUpCkBAIC00Miw0ICs3NywxMSBAQAogICAgICAgICAgICAgJiYgKFUpKG5lZWRsZVN0YXJ0ICsgbmVlZGxlU2l6ZSAtIGhheVN0YXJ0KSA8PSBoYXlTaXplOwogfQogCisvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBwZXJpb2QgbXVzdCBiZSBwb3NpdGl2ZSAqLwordGVtcGxhdGU8Y2xhc3MgVD4KK2lubGluZSBzdGF0aWMgVCBwZXJpb2RpY0Vycm9yKGNvbnN0IFQgJnZhbCwgY29uc3QgVCAmcGVyaW9kKSB7CisgICAgVCBlcnIgPSBhYnModmFsKSAlIHBlcmlvZDsKKyAgICByZXR1cm4gKGVyciA8IChwZXJpb2QgLyAyKSkgPyBlcnIgOiAocGVyaW9kIC0gZXJyKTsKK30KKwogI2VuZGlmICAvLyBBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MThmYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJCYXNlKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHREcml2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCmluZGV4IGYyM2MzMzcuLjM3ZWY2NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEFMb29wZXI7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBNZWRpYVBsYXllckJhc2U7CiBjbGFzcyBNZWRpYVNvdXJjZTsKIGNsYXNzIFBhcmNlbDsKQEAgLTM0LDcgKzM1LDkgQEAKIAogY2xhc3MgVGltZWRUZXh0RHJpdmVyIHsKIHB1YmxpYzoKLSAgICBUaW1lZFRleHREcml2ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOworICAgIFRpbWVkVGV4dERyaXZlcigKKyAgICAgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB+VGltZWRUZXh0RHJpdmVyKCk7CiAKQEAgLTc3LDYgKzgwLDcgQEAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPFRpbWVkVGV4dFBsYXllcj4gbVBsYXllcjsKICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgLy8gVmFyaWFibGVzIHRvIGJlIGd1YXJkZWQgYnkgbUxvY2suCiAgICAgU3RhdGUgbVN0YXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFDb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwN2Y0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUNvZGVjLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19ICisjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgorI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworc3RydWN0IEFNZWRpYUNvZGVjOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWMgQU1lZGlhQ29kZWM7CisKK3N0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8geworICAgIGludDMyX3Qgb2Zmc2V0OworICAgIGludDMyX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICB1aW50MzJfdCBmbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gQU1lZGlhQ29kZWNCdWZmZXJJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKKworZW51bSB7CisgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgQU1FRElBQ09ERUNfQ09ORklHVVJFX0ZMQUdfRU5DT0RFID0gMSwKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgPSAtMywKKyAgICBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9IC0yLAorICAgIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSID0gLTEKK307CisKKy8qKgorICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCisgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCisgKiBlbmNvZGVyIG9yIGRlY29kZXIuCisgKi8KK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBDcmVhdGUgY29kZWMgYnkgbWltZSB0eXBlLiBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSB0aGlzLCBzcGVjaWZ5aW5nIGEKKyAqIG1pbWUgdHlwZSBvYnRhaW5lZCBmcm9tIG1lZGlhIGV4dHJhY3Rvci4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKTsKKworLyoqCisgKiBDcmVhdGUgZW5jb2RlciBieSBuYW1lLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCisvKioKKyAqIGRlbGV0ZSB0aGUgY29kZWMgYW5kIGZyZWUgaXRzIHJlc291cmNlcworICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBDb25maWd1cmUgdGhlIGNvZGVjLiBGb3IgZGVjb2RpbmcgeW91IHdvdWxkIHR5cGljYWxseSBnZXQgdGhlIGZvcm1hdCBmcm9tIGFuIGV4dHJhY3Rvci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICBBTWVkaWFDb2RlYyosCisgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LAorICAgICAgICBBTmF0aXZlV2luZG93KiBzdXJmYWNlLAorICAgICAgICBBTWVkaWFDcnlwdG8gKmNyeXB0bywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIFN0YXJ0IHRoZSBjb2RlYy4gQSBjb2RlYyBtdXN0IGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGNhbiBiZSBzdGFydGVkLCBhbmQgbXVzdCBiZSBzdGFydGVkCisgKiBiZWZvcmUgYnVmZmVycyBjYW4gYmUgc2VudCB0byBpdC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBTdG9wIHRoZSBjb2RlYy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyopOworCisvKgorICogRmx1c2ggdGhlIGNvZGVjJ3MgaW5wdXQgYW5kIG91dHB1dC4gQWxsIGluZGljZXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGNhbGxzIHRvCisgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgYW5kIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgYmVjb21lIGludmFsaWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogR2V0IGFuIGlucHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlSW5wdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqLwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKKworLyoqCisgKiBHZXQgYW4gb3V0cHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLCBhbmQgbm90IHlldCBxdWV1ZWQuCisgKi8KK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlci4gQW4gYXBwIHdpbGwgdHlwaWNhbGx5IHVzZSB0aGlzIHdpdGgKKyAqIGdldElucHV0QnVmZmVyKCkgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLCB0aGVuIGNvcHkgdGhlIGRhdGEgdG8gYmUgZW5jb2RlZCBvciBkZWNvZGVkCisgKiBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjLgorICovCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIGludDY0X3QgdGltZW91dFVzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKworLyoqCisgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KKyAqLworc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLCBpbnQ2NF90IHRpbWVvdXRVcyk7CitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOworCisvKioKKyAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHJldHVybiB0aGUgYnVmZmVyIHRvCisgKiB0aGUgY29kZWMuIElmIHlvdSBwcmV2aW91c2x5IHNwZWNpZmllZCBhIHN1cmZhY2Ugd2hlbiBjb25maWd1cmluZyB0aGlzCisgKiB2aWRlbyBkZWNvZGVyIHlvdSBjYW4gb3B0aW9uYWxseSByZW5kZXIgdGhlIGJ1ZmZlci4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKKworLyoqCisgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byB1cGRhdGUgaXRzIHN1cmZhY2UgdGltZXN0YW1wCisgKiBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjb2RlYyB0byByZW5kZXIgaXQgb24gdGhlIG91dHB1dCBzdXJmYWNlLiBJZiB5b3UKKyAqIGhhdmUgbm90IHNwZWNpZmllZCBhbiBvdXRwdXQgc3VyZmFjZSB3aGVuIGNvbmZpZ3VyaW5nIHRoaXMgdmlkZW8gY29kZWMsCisgKiB0aGlzIGNhbGwgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIGNvZGVjLgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSID0gMCwKKyAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIgPSAxCit9IGNyeXB0b2luZm9fbW9kZV90OworCisvKioKKyAqIENyZWF0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gZnJvbSBzY3JhdGNoLiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byB1c2UgY3VzdG9tCisgKiBjcnlwdG8gaW5mbywgcmF0aGVyIHRoYW4gb25lIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yLgorICoKKyAqIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhbiAoYXQgbGVhc3QKKyAqIHBhcnRpYWxseSkgZW5jcnlwdGVkIGlucHV0IHNhbXBsZS4KKyAqIEEgYnVmZmVyJ3MgZGF0YSBpcyBjb25zaWRlcmVkIHRvIGJlIHBhcnRpdGlvbmVkIGludG8gInN1YnNhbXBsZXMiLAorICogZWFjaCBzdWJzYW1wbGUgc3RhcnRzIHdpdGggYSAocG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZiBwbGFpbiwKKyAqIHVuZW5jcnlwdGVkIGJ5dGVzIGZvbGxvd2VkIGJ5IGEgKGFsc28gcG90ZW50aWFsbHkgZW1wdHkpIHJ1biBvZgorICogZW5jcnlwdGVkIGJ5dGVzLgorICogbnVtQnl0ZXNPZkNsZWFyRGF0YSBjYW4gYmUgbnVsbCB0byBpbmRpY2F0ZSB0aGF0IGFsbCBkYXRhIGlzIGVuY3J5cHRlZC4KKyAqIFRoaXMgaW5mb3JtYXRpb24gZW5jYXBzdWxhdGVzIHBlci1zYW1wbGUgbWV0YWRhdGEgYXMgb3V0bGluZWQgaW4KKyAqIElTTy9JRUMgRkRJUyAyMzAwMS03OjIwMTEgIkNvbW1vbiBlbmNyeXB0aW9uIGluIElTTyBiYXNlIG1lZGlhIGZpbGUgZm9ybWF0IGZpbGVzIi4KKyAqLworQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgY3J5cHRvaW5mb19tb2RlX3QgbW9kZSwKKyAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKTsKKworLyoqCisgKiBkZWxldGUgYW4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvIGNyZWF0ZWQgcHJldmlvdXNseSB3aXRoIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcsIG9yCisgKiBvYnRhaW5lZCBmcm9tIEFNZWRpYUV4dHJhY3RvcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2Ygc3Vic2FtcGxlcyB0aGF0IG1ha2UgdXAgdGhlIGJ1ZmZlcidzIGNvbnRlbnRzLgorICovCitzaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CisKKy8qKgorICogQSAxNi1ieXRlIG9wYXF1ZSBrZXkKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEtleShBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCB1aW50OF90ICpkc3QpOworCisvKioKKyAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CisKKy8qKgorICogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbiB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsCisgKiBvbmUgb2YgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUiBvciBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFIuCisgKi8KK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgbGVhZGluZyB1bmVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldENsZWFyQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisvKioKKyAqIFRoZSBudW1iZXIgb2YgdHJhaWxpbmcgZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFDcnlwdG8uaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNzRjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhQ3J5cHRvLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfQ1JZUFRPX0gKKyNkZWZpbmUgX05ES19NRURJQV9DUllQVE9fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFDcnlwdG87Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDcnlwdG8gQU1lZGlhQ3J5cHRvOworCit0eXBlZGVmIHVpbnQ4X3QgQU1lZGlhVVVJRFsxNl07CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCk7CisKK2Jvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKKworQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpOworCit2b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRHJtLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWZkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYURybS5oCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRFJNX0gKKyNkZWZpbmUgX05ES19NRURJQV9EUk1fSAorCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK3N0cnVjdCBBTWVkaWFEcm07Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEcm0gQU1lZGlhRHJtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgdWludDhfdCAqcHRyOworICAgIHNpemVfdCBsZW5ndGg7Cit9IEFNZWRpYURybUJ5dGVBcnJheTsKKwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2Vzc2lvbklkOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtU2NvcGU7Cit0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKK3R5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7CisKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CisgICAgLyoqCisgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgbmVlZHMgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KKyAgICAgKiB0aGUgcHJvdmlzaW9uaW5nIHNlcnZlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UgZGF0YSBpcyBvYnRhaW5lZCB1c2luZworICAgICAqIEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0LgorICAgICAqLworICAgIEVWRU5UX1BST1ZJU0lPTl9SRVFVSVJFRCA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IHR5cGUgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcCBuZWVkcyB0byByZXF1ZXN0IGtleXMgZnJvbSBhIGxpY2Vuc2UKKyAgICAgKiBzZXJ2ZXIuICBUaGUgcmVxdWVzdCBtZXNzYWdlIGRhdGEgaXMgb2J0YWluZWQgdXNpbmcgQU1lZGlhRHJtX2dldEtleVJlcXVlc3QuCisgICAgICovCisgICAgRVZFTlRfS0VZX1JFUVVJUkVEID0gMiwKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgbGljZW5zZWQgdXNhZ2UgZHVyYXRpb24gZm9yIGtleXMgaW4gYSBzZXNzaW9uCisgICAgICogaGFzIGV4cGlyZWQuICBUaGUga2V5cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAqLworICAgIEVWRU5UX0tFWV9FWFBJUkVEID0gMywKKworICAgIC8qKgorICAgICAqIFRoaXMgZXZlbnQgbWF5IGluZGljYXRlIHNvbWUgc3BlY2lmaWMgdmVuZG9yLWRlZmluZWQgY29uZGl0aW9uLCBzZWUgeW91cgorICAgICAqIERSTSBwcm92aWRlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzCisgICAgICovCisgICAgRVZFTlRfVkVORE9SX0RFRklORUQgPSA0Cit9IEFNZWRpYURybUV2ZW50VHlwZTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CisKKworLyoqCisgKiBRdWVyeSBpZiB0aGUgZ2l2ZW4gc2NoZW1lIGlkZW50aWZpZWQgYnkgaXRzIFVVSUQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBhbmQKKyAqIHdoZXRoZXIgdGhlIGRybSBwbHVnaW4gaXMgYWJsZSB0byBoYW5kbGUgdGhlIG1lZGlhIGNvbnRhaW5lciBmb3JtYXQgc3BlY2lmaWVkIGJ5IG1pbWVUeXBlLgorICoKKyAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgorICogbWltZVR5cGUgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLCBlLmcuICJ2aWRlby9tcDQiLiAgSWYgbWltZVR5cGUKKyAqIGlzIG5vdCBrbm93biBvciByZXF1aXJlZCwgaXQgY2FuIGJlIHByb3ZpZGVkIGFzIE5VTEwuCisgKi8KK2Jvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKKworLyoqCisgKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRAorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKi8KK0FNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKTsKKworLyoqCisgKiBSZWxlYXNlIGEgTWVkaWFEcm0gb2JqZWN0CisgKi8KK3ZvaWQgQU1lZGlhRHJtX3JlbGVhc2UoQU1lZGlhRHJtICopOworCisvKioKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3VycworICoKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKKworLyoqCisgKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgorICoKKyAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKKyAqIHJldHVybnMgTUVESUFEUk1fUkVTT1VSQ0VfQlVTWV9FUlJPUiBpZiByZXF1aXJlZCByZXNvdXJjZXMgYXJlIGluIHVzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICosIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKworLyoqCisgKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAorICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKKwordHlwZWRlZiBlbnVtIEFNZWRpYURybUtleVR5cGUgeworICAgIC8qKgorICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCisgICAgICogbm90IGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHN1YnNlcXVlbnQgdXNlIHdoZW4gdGhlIGRldmljZSBpcyBub3QgY29ubmVjdGVkCisgICAgICogdG8gYSBuZXR3b3JrLgorICAgICAqLworICAgIEtFWV9UWVBFX1NUUkVBTUlORyA9IDEsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb2ZmbGluZSB1c2UsIHRoZXkKKyAgICAgKiB3aWxsIGJlIHNhdmVkIHRvIHRoZSBkZXZpY2UgZm9yIHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZCB0byBhIG5ldHdvcmsuCisgICAgICovCisgICAgS0VZX1RZUEVfT0ZGTElORSA9IDIsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGtleSByZXF1ZXN0IHR5cGUgc3BlY2lmaWVzIHRoYXQgcHJldmlvdXNseSBzYXZlZCBvZmZsaW5lIGtleXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIEtFWV9UWVBFX1JFTEVBU0UgPSAzCit9IEFNZWRpYURybUtleVR5cGU7CisKKy8qKgorICogIERhdGEgdHlwZSBjb250YWluaW5nIHtrZXksIHZhbHVlfSBwYWlyCisgKi8KK3R5cGVkZWYgc3RydWN0IEFNZWRpYURybUtleVZhbHVlUGFpciB7CisgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICBjb25zdCBjaGFyICptVmFsdWU7Cit9IEFNZWRpYURybUtleVZhbHVlOworCisvKioKKyAqIEEga2V5IHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2Ugb2NjdXJzIGJldHdlZW4gdGhlIGFwcCBhbmQgYSBsaWNlbnNlIHNlcnZlcgorICogdG8gb2J0YWluIG9yIHJlbGVhc2Uga2V5cyB1c2VkIHRvIGRlY3J5cHQgZW5jcnlwdGVkIGNvbnRlbnQuCisgKiBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBpcyB1c2VkIHRvIG9idGFpbiBhbiBvcGFxdWUga2V5IHJlcXVlc3QgYnl0ZSBhcnJheSB0aGF0CisgKiBpcyBkZWxpdmVyZWQgdG8gdGhlIGxpY2Vuc2Ugc2VydmVyLiAgVGhlIG9wYXF1ZSBrZXkgcmVxdWVzdCBieXRlIGFycmF5IGlzCisgKiByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRhdGEuICBUaGUgcmVjb21tZW5kZWQgVVJMIHRvIGRlbGl2ZXIgdGhlIGtleSByZXF1ZXN0IHRvCisgKiBpcyByZXR1cm5lZCBpbiBLZXlSZXF1ZXN0LmRlZmF1bHRVcmwuCisgKgorICogQWZ0ZXIgdGhlIGFwcCBoYXMgcmVjZWl2ZWQgdGhlIGtleSByZXF1ZXN0IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwKKyAqIGl0IHNob3VsZCBkZWxpdmVyIHRvIHRoZSByZXNwb25zZSB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgdGhlIG1ldGhvZAorICogQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZS4KKyAqCisgKiBzY29wZSBtYXkgYmUgYSBzZXNzaW9uSWQgb3IgYSBrZXlTZXRJZCwgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQga2V5VHlwZS4KKyAqIFdoZW4gdGhlIGtleVR5cGUgaXMgS0VZX1RZUEVfU1RSRUFNSU5HIG9yIEtFWV9UWVBFX09GRkxJTkUsIHNjb3BlIHNob3VsZCBiZSBzZXQKKyAqIHRvIHRoZSBzZXNzaW9uSWQgdGhlIGtleXMgd2lsbCBiZSBwcm92aWRlZCB0by4gIFdoZW4gdGhlIGtleVR5cGUgaXMKKyAqIEtFWV9UWVBFX1JFTEVBU0UsIHNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIG9mIHRoZSBrZXlzIGJlaW5nIHJlbGVhc2VkLgorICogUmVsZWFzaW5nIGtleXMgZnJvbSBhIGRldmljZSBpbnZhbGlkYXRlcyB0aGVtIGZvciBhbGwgc2Vzc2lvbnMuCisgKgorICogaW5pdCBjb250YWluZXItc3BlY2lmaWMgZGF0YSwgaXRzIG1lYW5pbmcgaXMgaW50ZXJwcmV0ZWQgYmFzZWQgb24gdGhlIG1pbWUgdHlwZQorICogcHJvdmlkZWQgaW4gdGhlIG1pbWVUeXBlIHBhcmFtZXRlci4gIEl0IGNvdWxkIGNvbnRhaW4sIGZvciBleGFtcGxlLCB0aGUgY29udGVudAorICogSUQsIGtleSBJRCBvciBvdGhlciBkYXRhIG9idGFpbmVkIGZyb20gdGhlIGNvbnRlbnQgbWV0YWRhdGEgdGhhdCBpcyByZXF1aXJlZCBpbgorICogZ2VuZXJhdGluZyB0aGUga2V5IHJlcXVlc3QuIGluaXQgbWF5IGJlIG51bGwgd2hlbiBrZXlUeXBlIGlzIEtFWV9UWVBFX1JFTEVBU0UuCisgKgorICogaW5pdFNpemUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBpbml0RGF0YQorICoKKyAqIG1pbWVUeXBlIGlkZW50aWZpZXMgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudC4KKyAqCisgKiBrZXlUeXBlIHNwZWNpZmVzIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0LiBUaGUgcmVxdWVzdCBtYXkgYmUgdG8gYWNxdWlyZSBrZXlzIGZvcgorICogICBzdHJlYW1pbmcgb3Igb2ZmbGluZSBjb250ZW50LCBvciB0byByZWxlYXNlIHByZXZpb3VzbHkgYWNxdWlyZWQga2V5cywgd2hpY2ggYXJlCisgKiAgIGlkZW50aWZpZWQgYnkgYSBrZXlTZXRJZC4KKyAqCisgKiBvcHRpb25hbFBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGluIHRoZSBrZXkgcmVxdWVzdCBtZXNzYWdlIHRvIGFsbG93IGEgY2xpZW50CisgKiAgIGFwcGxpY2F0aW9uIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBtZXNzYWdlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlci4KKyAqCisgKiBudW1PcHRpb25hbFBhcmFtZXRlcnMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycyBwcm92aWRlZAorICogICBieSB0aGUgY2FsbGVyCisgKgorICogT24gZXhpdDoKKyAqICAgMS4gVGhlIGtleVJlcXVlc3QgcG9pbnRlciB3aWxsIHJlZmVyZW5jZSB0aGUgb3BhcXVlIGtleSByZXF1ZXN0IGRhdGEuICBJdAorICogICAgICAgd2lsbCByZXNpZGUgaW4gbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LCBhbmQgd2lsbCByZW1haW4KKyAqICAgICAgIGFjY2Vzc2libGUgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdCBvciB1bnRpbCB0aGUKKyAqICAgICAgIE1lZGlhRHJtIG9iamVjdCBpcyByZWxlYXNlZC4KKyAqICAgMi4ga2V5UmVxdWVzdFNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QKKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiByZXByb3Zpc2lvbmluZyBpcyBuZWVkZWQsIGR1ZSB0byBhCisgKiBwcm9ibGVtIHdpdGggdGhlIGRldmljZSBjZXJ0aWZpY2F0ZS4KKyovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0S2V5UmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLAorICAgICAgICBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKTsKKworLyoqCisgKiBBIGtleSByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBsaWNlbnNlIHNlcnZlciBieSB0aGUgYXBwLCB0aGVuIGl0IGlzCisgKiBwcm92aWRlZCB0byB0aGUgRFJNIGVuZ2luZSBwbHVnaW4gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLiAgV2hlbiB0aGUKKyAqIHJlc3BvbnNlIGlzIGZvciBhbiBvZmZsaW5lIGtleSByZXF1ZXN0LCBhIGtleVNldElkIGlzIHJldHVybmVkIHRoYXQgY2FuIGJlCisgKiB1c2VkIHRvIGxhdGVyIHJlc3RvcmUgdGhlIGtleXMgdG8gYSBuZXcgc2Vzc2lvbiB3aXRoIEFNZWRpYURybV9yZXN0b3JlS2V5cy4KKyAqIFdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBhIHN0cmVhbWluZyBvciByZWxlYXNlIHJlcXVlc3QsIGEgbnVsbCBrZXlTZXRJZCBpcworICogcmV0dXJuZWQuCisgKgorICogc2NvcGUgbWF5IGJlIGEgc2Vzc2lvbklkIG9yIGtleVNldElkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUKKyAqIHJlc3BvbnNlLiAgU2NvcGUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2Vzc2lvbklkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIGZvciBlaXRoZXIKKyAqIHN0cmVhbWluZyBvciBvZmZsaW5lIGtleSByZXF1ZXN0cy4gIFNjb3BlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleVNldElkIHdoZW4KKyAqIHRoZSByZXNwb25zZSBpcyBmb3IgYSByZWxlYXNlIHJlcXVlc3QuCisgKgorICogcmVzcG9uc2UgcG9pbnRzIHRvIHRoZSBvcGFxdWUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCisgKiByZXNwb25zZVNpemUgc2hvdWxkIGJlIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgaW4gYnl0ZXMKKyAqLworCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworCisvKioKKyAqIFJlc3RvcmUgcGVyc2lzdGVkIG9mZmxpbmUga2V5cyBpbnRvIGEgbmV3IHNlc3Npb24uICBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZQorICoga2V5cyB0byBsb2FkLCBvYnRhaW5lZCBmcm9tIGEgcHJpb3IgY2FsbCB0byBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIHNlc3Npb25JZCBpcyB0aGUgc2Vzc2lvbiBJRCBmb3IgdGhlIERSTSBzZXNzaW9uCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZSBzYXZlZCBrZXkgc2V0IHRvIHJlc3RvcmUKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Jlc3RvcmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZW1vdmUgdGhlIGN1cnJlbnQga2V5cyBmcm9tIGEgc2Vzc2lvbi4KKyAqCisgKiBrZXlTZXRJZCBpZGVudGlmaWVzIGtleXMgdG8gcmVtb3ZlCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZW1vdmVLZXlzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKmtleVNldElkKTsKKworLyoqCisgKiBSZXF1ZXN0IGFuIGluZm9ybWF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXkgc3RhdHVzIGZvciB0aGUgc2Vzc2lvbi4gIFRoZSBzdGF0dXMgaXMKKyAqIGluIHRoZSBmb3JtIG9mIHtrZXksIHZhbHVlfSBwYWlycy4gIFNpbmNlIERSTSBsaWNlbnNlIHBvbGljaWVzIHZhcnkgYnkgdmVuZG9yLAorICogdGhlIHNwZWNpZmljIHN0YXR1cyBmaWVsZCBuYW1lcyBhcmUgZGV0ZXJtaW5lZCBieSBlYWNoIERSTSB2ZW5kb3IuICBSZWZlciB0byB5b3VyCisgKiBEUk0gcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGVmaW5pdGlvbnMgb2YgdGhlIGZpZWxkIG5hbWVzIGZvciBhIHBhcnRpY3VsYXIKKyAqIERSTSBlbmdpbmUgcGx1Z2luLgorICoKKyAqIE9uIGVudHJ5LCBudW1QYWlycyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhaXJzCisgKiB0aGF0IGNhbiBiZSByZXR1cm5lZCAodGhlIHNpemUgb2YgdGhlIGFycmF5KS4gIE9uIGV4aXQsIG51bVBhaXJzIHdpbGwgYmUgc2V0CisgKiB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd3JpdHRlbiB0byB0aGUgYXJyYXkuICBJZiB0aGUgbnVtYmVyIG9mIHtrZXksIHZhbHVlfSBwYWlycworICogdG8gYmUgcmV0dXJuZWQgaXMgZ3JlYXRlciB0aGFuICpudW1QYWlycywgTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQKKyAqIGFuZCBudW1QYWlycyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIHBhaXJzIGF2YWlsYWJsZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpOworCisKKy8qKgorICogQSBwcm92aXNpb24gcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBvY2N1cnMgYmV0d2VlbiB0aGUgYXBwIGFuZCBhIHByb3Zpc2lvbmluZworICogc2VydmVyIHRvIHJldHJpZXZlIGEgZGV2aWNlIGNlcnRpZmljYXRlLiAgSWYgcHJvdmlzaW9uaW5pbmcgaXMgcmVxdWlyZWQsIHRoZQorICogRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEIGV2ZW50IHdpbGwgYmUgc2VudCB0byB0aGUgZXZlbnQgaGFuZGxlci4KKyAqIGdldFByb3Zpc2lvblJlcXVlc3QgaXMgdXNlZCB0byBvYnRhaW4gdGhlIG9wYXF1ZSBwcm92aXNpb24gcmVxdWVzdCBieXRlIGFycmF5IHRoYXQKKyAqIHNob3VsZCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb3Zpc2lvbmluZyBzZXJ2ZXIuCisgKiBPbiBleGl0OgorICogICAgMS4gVGhlIHByb3Zpc2lvbiByZXF1ZXN0IGRhdGEgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHByb3Zpc2lvblJlcXVlc3QsIGluCisgKiAgICAgICAgbWVtb3J5IG93bmVkIGJ5IHRoZSBBTWVkaWFEcm0gb2JqZWN0LiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB0aGUKKyAqICAgICAgICBuZXh0IGNhbGwgdG8gZ2V0UHJvdmlzaW9uUmVxdWVzdC4KKyAqICAgIDIuIHByb3Zpc2lvblJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0IGRhdGEuCisgKiAgICAzLiBzZXJ2ZXJVcmwgd2lsbCByZWZlcmVuY2UgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTAorICogICAgICAgdGhlIHByb3Zpc2lvbmluZyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHRvLiAgSXQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbAorICogICAgICAgdGhlIG5leHQgY2FsbCB0byBnZXRQcm92aXNpb25SZXF1ZXN0LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvdmlzaW9uUmVxdWVzdChBTWVkaWFEcm0gKiwgY29uc3QgdWludDhfdCAqKnByb3Zpc2lvblJlcXVlc3QsCisgICAgICAgIHNpemVfdCAqcHJvdmlzaW9uUmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipzZXJ2ZXJVcmwpOworCisKKy8qKgorICogQWZ0ZXIgYSBwcm92aXNpb24gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgYnkgdGhlIGFwcCwgaXQgaXMgcHJvdmlkZWQgdG8gdGhlIERSTQorICogZW5naW5lIHBsdWdpbiB1c2luZyB0aGlzIG1ldGhvZC4KKyAqCisgKiByZXNwb25zZSBpcyB0aGUgb3BhcXVlIHByb3Zpc2lvbmluZyByZXNwb25zZSBieXRlIGFycmF5IHRvIHByb3ZpZGUgdG8gdGhlCisgKiAgIERSTSBlbmdpbmUgcGx1Z2luLgorICogcmVzcG9uc2VTaXplIGlzIHRoZSBsZW5ndGggb2YgdGhlIHByb3Zpc2lvbmluZyByZXNwb25zZSBpbiBieXRlcy4KKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX0RFVklDRV9SRVZPS0VEX0VSUk9SIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHNlcnZlciByZWplY3RlZCB0aGUgcmVxdWVzdAorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSk7CisKKworLyoqCisgKiBBIG1lYW5zIG9mIGVuZm9yY2luZyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHN0cmVhbXMgcGVyIHN1YnNjcmliZXIKKyAqIGFjcm9zcyBkZXZpY2VzIGlzIHByb3ZpZGVkIHZpYSBTZWN1cmVTdG9wLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNlY3VyZWx5CisgKiBtb25pdG9yaW5nIHRoZSBsaWZldGltZSBvZiBzZXNzaW9ucy4KKyAqCisgKiBJbmZvcm1hdGlvbiBmcm9tIHRoZSBzZXJ2ZXIgcmVsYXRlZCB0byB0aGUgY3VycmVudCBwbGF5YmFjayBzZXNzaW9uIGlzIHdyaXR0ZW4KKyAqIHRvIHBlcnNpc3RlbnQgc3RvcmFnZSBvbiB0aGUgZGV2aWNlIHdoZW4gZWFjaCBNZWRpYUNyeXB0byBvYmplY3QgaXMgY3JlYXRlZC4KKyAqCisgKiBJbiB0aGUgbm9ybWFsIGNhc2UsIHBsYXliYWNrIHdpbGwgYmUgY29tcGxldGVkLCB0aGUgc2Vzc2lvbiBkZXN0cm95ZWQgYW5kIHRoZQorICogU2VjdXJlIFN0b3BzIHdpbGwgYmUgcXVlcmllZC4gVGhlIGFwcCBxdWVyaWVzIHNlY3VyZSBzdG9wcyBhbmQgZm9yd2FyZHMgdGhlCisgKiBzZWN1cmUgc3RvcCBtZXNzYWdlIHRvIHRoZSBzZXJ2ZXIgd2hpY2ggdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBhbmQgbm90aWZpZXMgdGhlCisgKiBzZXJ2ZXIgc2lkZSBkYXRhYmFzZSB0aGF0IHRoZSBzZXNzaW9uIGRlc3RydWN0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gVGhlIHBlcnNpc3RlZAorICogcmVjb3JkIG9uIHRoZSBjbGllbnQgaXMgb25seSByZW1vdmVkIGFmdGVyIHBvc2l0aXZlIGNvbmZpcm1hdGlvbiB0aGF0IHRoZSBzZXJ2ZXIKKyAqIHJlY2VpdmVkIHRoZSBtZXNzYWdlIHVzaW5nIHJlbGVhc2VTZWN1cmVTdG9wcygpLgorICoKKyAqIG51bVNlY3VyZVN0b3BzIGlzIHNldCBieSB0aGUgY2FsbGVyIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgdG8KKyAqIHJldHVybi4gIE9uIGV4aXQsICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUgbnVtYmVyIGFjdHVhbGx5IHJldHVybmVkLgorICogSWYgKm51bVNlY3VyZVN0b3BzIGlzIHRvbyBzbWFsbCBmb3IgdGhlIG51bWJlciBvZiBzZWN1cmUgc3RvcHMgYXZhaWxhYmxlLAorICogTUVESUFEUk1fU0hPUlRfQlVGRkVSIHdpbGwgYmUgcmV0dXJuZWQgYW5kICpudW1TZWN1cmVTdG9wcyB3aWxsIGJlIHNldCB0byB0aGUKKyAqIG51bWJlciByZXF1aXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcyk7CisKKy8qKgorICogUHJvY2VzcyB0aGUgU2VjdXJlU3RvcCBzZXJ2ZXIgcmVzcG9uc2UgbWVzc2FnZSBzc1JlbGVhc2UuICBBZnRlciBhdXRoZW50aWNhdGluZworICogdGhlIG1lc3NhZ2UsIHJlbW92ZSB0aGUgU2VjdXJlU3RvcHMgaWRlbnRpZmllZCBpbiB0aGUgcmVzcG9uc2UuCisgKgorICogc3NSZWxlYXNlIGlzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW5kaWNhdGluZyB3aGljaCBzZWN1cmUgc3RvcHMgdG8gcmVsZWFzZQorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBpZGVudGlmaWVzIHRoZSBtYWtlciBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfVkVORE9SID0gInZlbmRvciI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGlkZW50aWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIERSTSBlbmdpbmUgcGx1Z2luCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX1ZFUlNJT04gPSAidmVyc2lvbiI7CisKKy8qKgorICogU3RyaW5nIHByb3BlcnR5IG5hbWU6IGRlc2NyaWJlcyB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KKyAqLworY29uc3QgY2hhciAqUFJPUEVSVFlfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOworCisvKioKKyAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNpcGhlciBhbmQgbWFjIGFsZ29yaXRobXMKKyAqIHN1cHBvcnRlZCBieSBDcnlwdG9TZXNzaW9uLiAgVGhlIGxpc3QgbWF5IGJlIGVtcHR5IGlmIHRoZSBEUk0gZW5naW5lCisgKiBwbHVnaW4gZG9lcyBub3Qgc3VwcG9ydCBDcnlwdG9TZXNzaW9uIG9wZXJhdGlvbnMuCisgKi8KK2NvbnN0IGNoYXIgKlBST1BFUlRZX0FMR09SSVRITVMgPSAiYWxnb3JpdGhtcyI7CisKKy8qKgorICogUmVhZCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICoKKyAqIHByb3BlcnR5TmFtZSBpZGVudGlmaWVzIHRoZSBwcm9wZXJ0eSB0byBxdWVyeQorICogT24gcmV0dXJuLCBwcm9wZXJ0eVZhbHVlIHdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoZQorICogbWVtb3J5IHRoYXQgdGhlIHZhbHVlIHJlc2lkZXMgaW4gaXMgb3duZWQgYnkgdGhlIE5ESyBNZWRpYURybSBBUEkgYW5kCisgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKTsKKworLyoqCisgKiBCeXRlIGFycmF5IHByb3BlcnR5IG5hbWU6IHRoZSBkZXZpY2UgdW5pcXVlIGlkZW50aWZpZXIgaXMgZXN0YWJsaXNoZWQgZHVyaW5nCisgKiBkZXZpY2UgcHJvdmlzaW9uaW5nIGFuZCBwcm92aWRlcyBhIG1lYW5zIG9mIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGVhY2ggZGV2aWNlLgorICovCitjb25zdCBjaGFyICpQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEID0gImRldmljZVVuaXF1ZUlkIjsKKworLyoqCisgKiBSZWFkIGEgRFJNIGVuZ2luZSBwbHVnaW4gYnl0ZSBhcnJheSBwcm9wZXJ0eSB2YWx1ZSwgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUgc3RyaW5nLgorICogT24gcmV0dXJuLCAqcHJvcGVydHlWYWx1ZSB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgcHJvcGVydHkgdmFsdWUuICBUaGUKKyAqIG1lbW9yeSB0aGF0IHRoZSB2YWx1ZSByZXNpZGVzIGluIGlzIG93bmVkIGJ5IHRoZSBOREsgTWVkaWFEcm0gQVBJIGFuZAorICogd2lsbCByZW1haW4gdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0UHJvcGVydHlCeXRlQXJyYXkuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAorICAgICAgICBBTWVkaWFEcm1CeXRlQXJyYXkgKnByb3BlcnR5VmFsdWUpOworCisvKioKKyAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIFN0cmluZyBwcm9wZXJ0eSB2YWx1ZS4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworLyoqCisgKiBTZXQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0UHJvcGVydHlCeXRlQXJyYXkoQU1lZGlhRHJtICosIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpOworCisvKioKKyAqIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgZGVjcnlwdGlvbiBvZiBEQVNIIENvbW1vbiBFbmNyeXB0ZWQgTWVkaWEsIHRoZQorICogTWVkaWFEcm0gQVBJcyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHNlY3VyZWx5IGRlbGl2ZXIgc2Vzc2lvbiBrZXlzIGZyb20KKyAqIGFuIG9wZXJhdG9yJ3Mgc2Vzc2lvbiBrZXkgc2VydmVyIHRvIGEgY2xpZW50IGRldmljZSwgYmFzZWQgb24gdGhlIGZhY3RvcnktaW5zdGFsbGVkCisgKiByb290IG9mIHRydXN0LCBhbmQgdGhlbiBwZXJmb3JtIGVuY3J5cHQsIGRlY3J5cHQsIHNpZ24gYW5kIHZlcmlmeSBvcGVyYXRpb25zCisgKiB3aXRoIHRoZSBzZXNzaW9uIGtleSBvbiBhcmJpdHJhcnkgdXNlciBkYXRhLgorICoKKyAqIE9wZXJhdG9ycyBjcmVhdGUgc2Vzc2lvbiBrZXkgc2VydmVycyB0aGF0IHJlY2VpdmUgc2Vzc2lvbiBrZXkgcmVxdWVzdHMgYW5kIHByb3ZpZGUKKyAqIGVuY3J5cHRlZCBzZXNzaW9uIGtleXMgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGdlbmVyYWwgcHVycG9zZSBjcnlwdG8gb3BlcmF0aW9ucy4KKyAqCisgKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdC9zaWduL3ZlcmlmeSBtZXRob2RzIGFyZSBiYXNlZCBvbiB0aGUgZXN0YWJsaXNoZWQgc2Vzc2lvbgorICoga2V5cy4gIFRoZXNlIGtleXMgYXJlIGV4Y2hhbmdlZCB1c2luZyB0aGUgZ2V0S2V5UmVxdWVzdC9wcm92aWRlS2V5UmVzcG9uc2UgbWV0aG9kcy4KKyAqCisgKiBBcHBsaWNhdGlvbnMgb2YgdGhpcyBjYXBhYmlsaXR5IGluY2x1ZGUgc2VjdXJpbmcgdmFyaW91cyB0eXBlcyBvZiBwdXJjaGFzZWQgb3IKKyAqIHByaXZhdGUgY29udGVudCwgc3VjaCBhcyBhcHBsaWNhdGlvbnMsIGJvb2tzIGFuZCBvdGhlciBtZWRpYSwgcGhvdG9zIG9yIG1lZGlhCisgKiBkZWxpdmVyeSBwcm90b2NvbHMuCisgKi8KKworLyoKKyAqIEVuY3J5cHQgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSBpbnB1dCBvZiBsZW5ndGggZGF0YVNpemUgdXNpbmcgYWxnb3JpdGhtIHNwZWNpZmllZAorICogYnkgY2lwaGVyQWxnb3JpdGhtLCBhbmQgd3JpdGUgdGhlIGVuY3J5cHRlZCByZXN1bHQgaW50byBvdXRwdXQuICBUaGUgY2FsbGVyIG11c3QKKyAqIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBhY2NlcHQgZGF0YVNpemUgYnl0ZXMuIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZW5jcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogRGVjcnlwdCB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IGlucHV0IG9mIGxlbmd0aCBkYXRhU2l6ZSB1c2luZyBhbGdvcml0aG0gc3BlY2lmaWVkCisgKiBieSBjaXBoZXJBbGdvcml0aG0sIGFuZCB3cml0ZSB0aGUgZGVjcnlwdGVkIHJlc3VsdCBpbnRvIG91dHB1dC4gIFRoZSBjYWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gIFRoZSBrZXkKKyAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bworICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZGVjcnlwdChBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpOworCisvKgorICogR2VuZXJhdGUgYSBzaWduYXR1cmUgdXNpbmcgdGhlIHNwZWNpZmllZCBtYWNBbGdvcml0aG0gb3ZlciB0aGUgbWVzc2FnZSBkYXRhCisgKiByZWZlcmVuY2VkIGJ5IG1lc3NhZ2Ugb2Ygc2l6ZSBtZXNzYWdlU2l6ZSBhbmQgc3RvcmUgdGhlIHNpZ25hdHVyZSBpbiB0aGUKKyAqIGJ1ZmZlciByZWZlcmVuY2VkIHNpZ25hdHVyZSBvZiBtYXggc2l6ZSAqc2lnbmF0dXJlU2l6ZS4gIElmIHRoZSBidWZmZXIgaXMgbm90CisgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc2lnbmF0dXJlLCBNRURJQURSTV9TSE9SVF9CVUZGRVIgaXMgcmV0dXJuZWQgYW5kCisgKiAqc2lnbmF0dXJlU2l6ZSBpcyBzZXQgdG8gdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLiAgVGhlIGtleSB0byB1c2UgaXMgaWRlbnRpZmllZAorICogYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZSBzZXNzaW9uIHVzaW5nCisgKiBwcm92aWRlS2V5UmVzcG9uc2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zaWduKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCAqc2lnbmF0dXJlU2l6ZSk7CisKKy8qCisgKiBQZXJmb3JtIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIG1hY0FsZ29yaXRobSBvdmVyIHRoZSBtZXNzYWdlCisgKiBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIG1lc3NhZ2UgcGFyYW1ldGVyIG9mIHNpemUgbWVzc2FnZVNpemUuIFJldHVybnMgTUVESUFEUk1fT0sKKyAqIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgb3RoZXJ3aXNlIE1FREFJRFJNX1ZFUklGWV9GQUlMRUQgaXMgcmV0dXJuZWQuIFRoZSBrZXkgdG8KKyAqIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGUKKyAqIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fdmVyaWZ5KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgY29uc3QgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCBzaWduYXR1cmVTaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MTNlYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXJyb3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVJST1JfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBX09LID0gMCwKKworICAgIEFNRURJQV9FUlJPUl9CQVNFICAgICAgICAgICAgICAgICAgPSAtMTAwMDAsCisgICAgQU1FRElBX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFLAorICAgIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDEsCisgICAgQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gMiwKKyAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1QgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDQsCisKKyAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAorICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLAorICAgIEFNRURJQV9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAyLAorICAgIEFNRURJQV9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAzLAorICAgIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA0LAorICAgIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA1LAorICAgIEFNRURJQV9EUk1fVEFNUEVSX0RFVEVDVEVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA2LAorICAgIEFNRURJQV9EUk1fVkVSSUZZX0ZBSUxFRCAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA3LAorICAgIEFNRURJQV9EUk1fTkVFRF9LRVkgICAgICAgICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA4LAorICAgIEFNRURJQV9EUk1fTElDRU5TRV9FWFBJUkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSA5LAorCit9IG1lZGlhX3N0YXR1c190OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVJST1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0ZTcwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmRrL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICisjZGVmaW5lIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDcnlwdG8uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIEFNZWRpYUV4dHJhY3RvcjsKKworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yCisgKi8KK0FNZWRpYUV4dHJhY3RvciogQU1lZGlhRXh0cmFjdG9yX25ldygpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiAgU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IqLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CisKKy8qKgorICogU2V0IHRoZSBVUkkgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwgY29uc3QgY2hhciAqbG9jYXRpb24pOyAvLyBUT0RPIHN1cHBvcnQgaGVhZGVycworCisvKioKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgbWVkaWEgZmlsZQorICovCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogUmV0dXJuIHRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCB0cmFjay4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0cmFjay4gU3Vic2VxdWVudCBjYWxscyB0byByZWFkU2FtcGxlRGF0YSwgZ2V0U2FtcGxlVHJhY2tJbmRleCBhbmQKKyAqIGdldFNhbXBsZVRpbWUgb25seSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnNldCBvZiB0cmFja3Mgc2VsZWN0ZWQuCisgKiBTZWxlY3RpbmcgdGhlIHNhbWUgdHJhY2sgbXVsdGlwbGUgdGltZXMgaGFzIG5vIGVmZmVjdCwgdGhlIHRyYWNrIGlzCisgKiBvbmx5IHNlbGVjdGVkIG9uY2UuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBVbnNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAorICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworCisvKioKKyAqIFJlYWQgdGhlIGN1cnJlbnQgc2FtcGxlLgorICovCitzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSk7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBmbGFncy4KKyAqLwordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciopOyAvLyBzZWUgZGVmaW5pdGlvbnMgYmVsb3cKKworLyoqCisgKiBSZXR1cm5zIHRoZSB0cmFjayBpbmRleCB0aGUgY3VycmVudCBzYW1wbGUgb3JpZ2luYXRlcyBmcm9tIChvciAtMQorICogaWYgbm8gbW9yZSBzYW1wbGVzIGFyZSBhdmFpbGFibGUpCisgKi8KK2ludCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChBTWVkaWFFeHRyYWN0b3IqKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNhbXBsZSdzIHByZXNlbnRhdGlvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKyAqIG9yIC0xIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgorICovCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKEFNZWRpYUV4dHJhY3RvciopOworCisvKioKKyAqIEFkdmFuY2UgdG8gdGhlIG5leHQgc2FtcGxlLiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgc2FtcGxlIGRhdGEKKyAqIGlzIGF2YWlsYWJsZSAoZW5kIG9mIHN0cmVhbSkuCisgKi8KK2Jvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKik7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQywKKyAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19ORVhUX1NZTkMsCisgICAgQU1FRElBRVhUUkFDVE9SX1NFRUtfQ0xPU0VTVF9TWU5DCit9IFNlZWtNb2RlOworCisvKioKKyAqCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8oQU1lZGlhRXh0cmFjdG9yKiwgaW50NjRfdCBzZWVrUG9zVXMsIFNlZWtNb2RlIG1vZGUpOworCisvKioKKyAqIG1hcHBpbmcgb2YgY3J5cHRvIHNjaGVtZSB1dWlkIHRvIHRoZSBzY2hlbWUgc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBzY2hlbWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEVudHJ5IHsKKyAgICBBTWVkaWFVVUlEIHV1aWQ7CisgICAgc2l6ZV90IGRhdGFsZW47CisgICAgdm9pZCAqZGF0YTsKK30gUHNzaEVudHJ5OworCisvKioKKyAqIGxpc3Qgb2YgY3J5cHRvIHNjaGVtZXMgYW5kIHRoZWlyIGRhdGEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUHNzaEluZm8geworICAgIHNpemVfdCBudW1lbnRyaWVzOworICAgIFBzc2hFbnRyeSBlbnRyaWVzWzBdOworfSBQc3NoSW5mbzsKKworLyoqCisgKiBHZXQgdGhlIFBTU0ggaW5mbyBpZiBwcmVzZW50LgorICovCitQc3NoSW5mbyogQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKEFNZWRpYUV4dHJhY3RvciopOworCisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopOworCisKK2VudW0geworICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19TWU5DID0gMSwKKyAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhRm9ybWF0LmggYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMjk3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25kay9OZGtNZWRpYUZvcm1hdC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYUZvcm1hdDsKK3R5cGVkZWYgc3RydWN0IEFNZWRpYUZvcm1hdCBBTWVkaWFGb3JtYXQ7CisKK0FNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKTsKKworLyoqCisgKiBIdW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybWF0LiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQsCisgKiBhbmQgcmVtYWlucyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIHRvU3RyaW5nLCBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2NvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQqKTsKKworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KTsKKy8qKgorICogVGhlIHJldHVybmVkIGRhdGEgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCBhbmQgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIHRoZSBuYW1lZCBlbnRyeQorICogaXMgcGFydCBvZiB0aGUgZm9ybWF0LgorICovCitib29sIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqc2l6ZSk7CisvKioKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwgYW5kIHJlbWFpbnMgdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBnZXRTdHJpbmcsCisgKiBvciB1bnRpbCB0aGUgZm9ybWF0IGlzIGRlbGV0ZWQuCisgKi8KK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KTsKKworCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpOworLyoqCisgKiBUaGUgcHJvdmlkZWQgc3RyaW5nIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CisvKioKKyAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKworCisvKioKKyAqIFhYWCBzaG91bGQgdGhlc2UgYmUgaW50cy9lbnVtcyB0aGF0IHdlIGxvb2sgdXAgaW4gYSB0YWJsZSBhcyBuZWVkZWQ/CisgKi8KK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaCBiL2luY2x1ZGUvbmRrL05ka01lZGlhTXV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ5NDZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZGsvTmRrTWVkaWFNdXhlci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9NVVhFUl9ICisjZGVmaW5lIF9OREtfTUVESUFfTVVYRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IEFNZWRpYU11eGVyOwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhTXV4ZXIgQU1lZGlhTXV4ZXI7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQgPSAwLAorICAgIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfV0VCTSAgID0gMSwKK30gT3V0cHV0Rm9ybWF0OworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKKyAqLworQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBtdXhlcgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9kZWxldGUoQU1lZGlhTXV4ZXIqKTsKKworLyoqCisgKiBTZXQgYW5kIHN0b3JlIHRoZSBnZW9kYXRhIChsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlKSBpbiB0aGUgb3V0cHV0IGZpbGUuCisgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBBTWVkaWFNdXhlcl9zdGFydC4gVGhlIGdlb2RhdGEgaXMgc3RvcmVkCisgKiBpbiB1ZHRhIGJveCBpZiB0aGUgb3V0cHV0IGZvcm1hdCBpcyBBTUVESUFNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCwgYW5kIGlzCisgKiBpZ25vcmVkIGZvciBvdGhlciBvdXRwdXQgZm9ybWF0cy4KKyAqIFRoZSBnZW9kYXRhIGlzIHN0b3JlZCBhY2NvcmRpbmcgdG8gSVNPLTY3MDkgc3RhbmRhcmQuCisgKgorICogQm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzLgorICogTGF0aXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy05MCwgOTBdLgorICogTG9uZ2l0dWRlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstMTgwLCAxODBdLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciosIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25naXR1ZGUpOworCisvKioKKyAqIFNldHMgdGhlIG9yaWVudGF0aW9uIGhpbnQgZm9yIG91dHB1dCB2aWRlbyBwbGF5YmFjay4KKyAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIEFNZWRpYU11eGVyX3N0YXJ0LiBDYWxsaW5nIHRoaXMKKyAqIG1ldGhvZCB3aWxsIG5vdCByb3RhdGUgdGhlIHZpZGVvIGZyYW1lIHdoZW4gbXV4ZXIgaXMgZ2VuZXJhdGluZyB0aGUgZmlsZSwKKyAqIGJ1dCBhZGQgYSBjb21wb3NpdGlvbiBtYXRyaXggY29udGFpbmluZyB0aGUgcm90YXRpb24gYW5nbGUgaW4gdGhlIG91dHB1dAorICogdmlkZW8gaWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIHNvIHRoYXQgYQorICogdmlkZW8gcGxheWVyIGNhbiBjaG9vc2UgdGhlIHByb3BlciBvcmllbnRhdGlvbiBmb3IgcGxheWJhY2suCisgKiBOb3RlIHRoYXQgc29tZSB2aWRlbyBwbGF5ZXJzIG1heSBjaG9vc2UgdG8gaWdub3JlIHRoZSBjb21wb3NpdGlvbiBtYXRyaXgKKyAqIGR1cmluZyBwbGF5YmFjay4KKyAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcywgY2xvY2t3aXNlLgorICogVGhlIHN1cHBvcnRlZCBhbmdsZXMgYXJlIDAsIDkwLCAxODAsIGFuZCAyNzAgZGVncmVlcy4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0T3JpZW50YXRpb25IaW50KEFNZWRpYU11eGVyKiwgaW50IGRlZ3JlZXMpOworCisvKioKKyAqIEFkZHMgYSB0cmFjayB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0LgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ldyB0cmFjayBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YgZmFpbHVyZSwKKyAqIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG1lZGlhX3N0YXR1c190LgorICovCitzc2l6ZV90IEFNZWRpYU11eGVyX2FkZFRyYWNrKEFNZWRpYU11eGVyKiwgY29uc3QgQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworCisvKioKKyAqIFN0YXJ0IHRoZSBtdXhlci4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBBTWVkaWFNdXhlcl9hZGRUcmFjayBhbmQKKyAqIGJlZm9yZSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0YXJ0KEFNZWRpYU11eGVyKik7CisKKy8qKgorICogU3RvcHMgdGhlIG11eGVyLgorICogT25jZSB0aGUgbXV4ZXIgc3RvcHMsIGl0IGNhbiBub3QgYmUgcmVzdGFydGVkLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKik7CisKKy8qKgorICogV3JpdGVzIGFuIGVuY29kZWQgc2FtcGxlIGludG8gdGhlIG11eGVyLgorICogVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1wbGVzIGFyZSB3cml0dGVuIGludG8KKyAqIHRoZSByaWdodCB0cmFja3MuIEFsc28sIGl0IG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgc2FtcGxlcyBmb3IgZWFjaCB0cmFjaworICogYXJlIHdyaXR0ZW4gaW4gY2hyb25vbG9naWNhbCBvcmRlciAoZS5nLiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJvdmlkZWQKKyAqIGJ5IHRoZSBlbmNvZGVyLikKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKKyAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX01VWEVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IDdmZDkzNzkuLmZhMWIyMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTQ4LDcgKzQ5LDcgQEAKICNkZWZpbmUgQ0JMS19TVFJFQU1fRU5EX0RPTkUgMHg0MDAgLy8gc2V0IGJ5IHNlcnZlciBvbiByZW5kZXIgY29tcGxldGlvbiwgY2xlYXJlZCBieSBjbGllbnQKIAogLy9FTF9GSVhNRSAyMCBzZWNvbmRzIG1heSBub3QgYmUgZW5vdWdoIGFuZCBtdXN0IGJlIHJlY29uY2lsZWQgd2l0aCBuZXcgb2J0YWluQnVmZmVyIGltcGxlbWVudGF0aW9uCi0jZGVmaW5lIE1BWF9SVU5fT0ZGTE9BREVEX1RJTUVPVVRfTVMgMjAwMDAgLy9hc3N1bWluZyB1cHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAorI2RlZmluZSBNQVhfUlVOX09GRkxPQURFRF9USU1FT1VUX01TIDIwMDAwIC8vIGFzc3VtaW5nIHVwIHRvIGEgbWF4aW11bSBvZiAyMCBzZWNvbmRzIG9mIG9mZmxvYWRlZAogCiBzdHJ1Y3QgQXVkaW9UcmFja1NoYXJlZFN0cmVhbWluZyB7CiAgICAgLy8gc2ltaWxhciB0byBOQkFJTyBNb25vUGlwZQpAQCAtNjUsNyArNjYsOSBAQAogc3RydWN0IEF1ZGlvVHJhY2tTaGFyZWRTdGF0aWMgewogICAgIFN0YXRpY0F1ZGlvVHJhY2tTaW5nbGVTdGF0ZVF1ZXVlOjpTaGFyZWQKICAgICAgICAgICAgICAgICAgICAgbVNpbmdsZVN0YXRlUXVldWU7Ci0gICAgc2l6ZV90ICAgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCisgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgdWludDMyX3QgICAgICAgIG1CdWZmZXJQb3NpdGlvbjsgICAgLy8gdXBkYXRlZCBhc3luY2hyb25vdXNseSBieSBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvciBlbnRlcnRhaW5tZW50IHB1cnBvc2VzIG9ubHkiCiB9OwogCkBAIC05NiwxMSArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgdXNlZCAiZm9yIGVudGVydGFpbm1lbnQgcHVycG9zZXMgb25seSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgZG9uJ3QgbWFrZSBpbXBvcnRhbnQgZGVjaXNpb25zIGJhc2VkIG9uIGl0LgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudF87ICAgIC8vIHVzZWQgZHVyaW5nIGNyZWF0aW9uIHRvIHBhc3MgYWN0dWFsIHRyYWNrIGJ1ZmZlciBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gQXVkaW9GbGluZ2VyIHRvIGNsaWVudCwgYW5kIG5vdCByZWZlcmVuY2VkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbW92ZSBoZXJlIGFuZCByZXBsYWNlIGJ5IGNyZWF0ZVRyYWNrKCkgaW4vb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5hbWVkIHRvICJfIiB0byBkZXRlY3QgaW5jb3JyZWN0IHVzZQorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1QYWQxOyAgICAgIC8vIHVudXNlZAogCiAgICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgbUZ1dGV4OyAgICAgLy8gZXZlbnQgZmxhZzogZG93biAoUCkgYnkgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIChWKSBieSBzZXJ2ZXIgb3IgYmluZGVyRGllZCgpIG9yIGludGVycnVwdCgpCkBAIC0xMDgsMTMgKzEwNywxMiBAQAogCiBwcml2YXRlOgogCi0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCisgICAgICAgICAgICAgICAgLy8gVGhpcyBmaWVsZCBzaG91bGQgYmUgYSBzaXplX3QsIGJ1dCBzaW5jZSBpdCBpcyBsb2NhdGVkIGluIHNoYXJlZCBtZW1vcnkgd2UKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSB0byAzMi1iaXQuICBUaGUgY2xpZW50IGFuZCBzZXJ2ZXIgbWF5IGhhdmUgZGlmZmVyZW50IHR5cGVkZWZzIGZvciBzaXplX3QuCisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbU1pbmltdW07ICAgICAgIC8vIHNlcnZlciB3YWtlcyB1cCBjbGllbnQgaWYgYXZhaWxhYmxlID49IG1NaW5pbXVtCiAKLSAgICAgICAgICAgICAgICAvLyBDaGFubmVsIHZvbHVtZXMgYXJlIGZpeGVkIHBvaW50IFU0LjEyLCBzbyAweDEwMDAgbWVhbnMgMS4wLgotICAgICAgICAgICAgICAgIC8vIExlZnQgY2hhbm5lbCBpcyBpbiBbMDoxNV0sIHJpZ2h0IGNoYW5uZWwgaXMgaW4gWzE2OjMxXS4KLSAgICAgICAgICAgICAgICAvLyBBbHdheXMgcmVhZCBhbmQgd3JpdGUgdGhlIGNvbWJpbmVkIHBhaXIgYXRvbWljYWxseS4KLSAgICAgICAgICAgICAgICAvLyBGb3IgQXVkaW9UcmFjayBvbmx5LCBub3QgdXNlZCBieSBBdWRpb1JlY29yZC4KLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBtVm9sdW1lTFI7CisgICAgICAgICAgICAgICAgLy8gU3RlcmVvIGdhaW5zIGZvciBBdWRpb1RyYWNrIG9ubHksIG5vdCB1c2VkIGJ5IEF1ZGlvUmVjb3JkLgorICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IG1Wb2x1bWVMUjsKIAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIG1TYW1wbGVSYXRlOyAgICAvLyBBdWRpb1RyYWNrIG9ubHk6IGNsaWVudCdzIHJlcXVlc3RlZCBzYW1wbGUgcmF0ZSBpbiBIegogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAwID09IGRlZmF1bHQuIFdyaXRlLW9ubHkgY2xpZW50LCByZWFkLW9ubHkgc2VydmVyLgpAQCAtMTc3LDEyICsxNzUsMTEgQEAKIAogLy8gUHJveHkgc2VlbiBieSBBdWRpb1RyYWNrIGNsaWVudCBhbmQgQXVkaW9SZWNvcmQgY2xpZW50CiBjbGFzcyBDbGllbnRQcm94eSA6IHB1YmxpYyBQcm94eSB7Ci1wcm90ZWN0ZWQ6CitwdWJsaWM6CiAgICAgQ2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lU2l6ZSwKICAgICAgICAgICAgIGJvb2wgaXNPdXQsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpOwogICAgIHZpcnR1YWwgfkNsaWVudFByb3h5KCkgeyB9CiAKLXB1YmxpYzoKICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWVzcGVjIGtGb3JldmVyOwogICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXNwZWMga05vbkJsb2NraW5nOwogCkBAIC0yNDUsNyArMjQyLDExIEBACiAgICAgfQogCiAgICAgdm9pZCAgICAgICAgc2V0TWluaW11bShzaXplX3QgbWluaW11bSkgewotICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSBtaW5pbXVtOworICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKKyAgICAgICAgaWYgKG1pbmltdW0gPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBtaW5pbXVtID0gVUlOVDMyX01BWDsKKyAgICAgICAgfQorICAgICAgICBtQ2Jsay0+bU1pbmltdW0gPSAodWludDMyX3QpIG1pbmltdW07CiAgICAgfQogCiAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQKQEAgLTI4MSw4ICsyODIsOCBAQAogICAgICAgICBtQ2Jsay0+bVNlbmRMZXZlbCA9IHVpbnQxNl90KHNlbmRMZXZlbCAqIDB4MTAwMCk7CiAgICAgfQogCi0gICAgLy8gY2FsbGVyIG11c3QgbGltaXQgdG8gMCA8PSB2b2x1bWVMUiA8PSAweDEwMDAxMDAwCi0gICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIodWludDMyX3Qgdm9sdW1lTFIpIHsKKyAgICAvLyBzZXQgc3RlcmVvIGdhaW5zCisgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lTFIoZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3Qgdm9sdW1lTFIpIHsKICAgICAgICAgbUNibGstPm1Wb2x1bWVMUiA9IHZvbHVtZUxSOwogICAgIH0KIApAQCAtMzkyLDggKzM5MywxMCBAQAogY2xhc3MgQXVkaW9UcmFja1NlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIgPSBmYWxzZSkKLSAgICAgICAgOiBTZXJ2ZXJQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUsIHRydWUgLyppc091dCovLCBjbGllbnRJblNlcnZlcikgeyB9CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplLCBib29sIGNsaWVudEluU2VydmVyID0gZmFsc2UsIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwKQorICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgdHJ1ZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7CisgICAgICAgIG1DYmxrLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSgpIHsgfQogCkBAIC00MDEsNyArNDA0LDcgQEAKICAgICAvLyByZXR1cm4gdmFsdWUgb2YgdGhlc2UgbWV0aG9kcyBtdXN0IGJlIHZhbGlkYXRlZCBieSB0aGUgY2FsbGVyCiAgICAgdWludDMyX3QgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2FtcGxlUmF0ZTsgfQogICAgIHVpbnQxNl90ICAgIGdldFNlbmRMZXZlbF9VNF8xMigpIGNvbnN0IHsgcmV0dXJuIG1DYmxrLT5tU2VuZExldmVsOyB9Ci0gICAgdWludDMyX3QgICAgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKSBjb25zdCB7IHJldHVybiBtQ2Jsay0+bVZvbHVtZUxSOyB9CiAKICAgICAvLyBlc3RpbWF0ZWQgdG90YWwgbnVtYmVyIG9mIGZpbGxlZCBmcmFtZXMgYXZhaWxhYmxlIHRvIHNlcnZlciB0byByZWFkLAogICAgIC8vIHdoaWNoIG1heSBpbmNsdWRlIG5vbi1jb250aWd1b3VzIGZyYW1lcwpAQCAtNDU2LDkgKzQ1OSw4IEBACiBjbGFzcyBBdWRpb1JlY29yZFNlcnZlclByb3h5IDogcHVibGljIFNlcnZlclByb3h5IHsKIHB1YmxpYzoKICAgICBBdWRpb1JlY29yZFNlcnZlclByb3h5KGF1ZGlvX3RyYWNrX2NibGtfdCogY2Jsaywgdm9pZCAqYnVmZmVycywgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplKQotICAgICAgICA6IFNlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSwgZmFsc2UgLyppc091dCovLAotICAgICAgICAgICAgZmFsc2UgLypjbGllbnRJblNlcnZlciovKSB7IH0KKyAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpCisgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1N0YXRpY0F1ZGlvVHJhY2tTdGF0ZS5oCmluZGV4IDQ2YTU5NDYuLmQ0ODMwNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9TdGF0aWNBdWRpb1RyYWNrU3RhdGUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvU3RhdGljQXVkaW9UcmFja1N0YXRlLmgKQEAgLTI1LDkgKzI1LDEzIEBACiAvLyBzdGF0ZSBpcyB3cmFwcGVkIGJ5IGEgU2luZ2xlU3RhdGVRdWV1ZS4KIHN0cnVjdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgewogICAgIC8vIGRvIG5vdCBkZWZpbmUgY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgb3IgdmlydHVhbCBtZXRob2RzCi0gICAgc2l6ZV90ICBtTG9vcFN0YXJ0OwotICAgIHNpemVfdCAgbUxvb3BFbmQ7Ci0gICAgaW50ICAgICBtTG9vcENvdW50OworCisgICAgLy8gVGhlc2UgZmllbGRzIHNob3VsZCBib3RoIGJlIHNpemVfdCwgYnV0IHNpbmNlIHRoZXkgYXJlIGxvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSB3ZQorICAgIC8vIGZvcmNlIHRvIDMyLWJpdC4gIFRoZSBjbGllbnQgYW5kIHNlcnZlciBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZWRlZnMgZm9yIHNpemVfdC4KKyAgICB1aW50MzJfdCAgICBtTG9vcFN0YXJ0OworICAgIHVpbnQzMl90ICAgIG1Mb29wRW5kOworCisgICAgaW50ICAgICAgICAgbUxvb3BDb3VudDsKIH07CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKaW5kZXggYTIxMWVkOS4uNTE5M2QwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCkBAIC0yNSw2NCArMjUsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIEEgc2ltcGxlIGJ1ZmZlciB0byBob2xkIGJpbmFyeSBkYXRhCi1jbGFzcyBNZWRpYUFsYnVtQXJ0Ci17Ci1wdWJsaWM6Ci0gICAgTWVkaWFBbGJ1bUFydCgpOiBtU2l6ZSgwKSwgbURhdGEoMCkge30KLQotICAgIGV4cGxpY2l0IE1lZGlhQWxidW1BcnQoY29uc3QgY2hhciogdXJsKSB7Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICBGSUxFICppbiA9IGZvcGVuKHVybCwgInIiKTsKLSAgICAgICAgaWYgKCFpbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZzZWVrKGluLCAwLCBTRUVLX0VORCk7Ci0gICAgICAgIG1TaXplID0gZnRlbGwoaW4pOyAgLy8gQWxsb2NhdGluZyBidWZmZXIgb2Ygc2l6ZSBlcXVhbHMgdG8gdGhlIGV4dGVybmFsIGZpbGUgc2l6ZS4KLSAgICAgICAgaWYgKG1TaXplID09IDAgfHwgKG1EYXRhID0gbmV3IHVpbnQ4X3RbbVNpemVdKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmY2xvc2UoaW4pOwotICAgICAgICAgICAgaWYgKG1TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcmV3aW5kKGluKTsKLSAgICAgICAgaWYgKGZyZWFkKG1EYXRhLCAxLCBtU2l6ZSwgaW4pICE9IG1TaXplKSB7ICAvLyBSZWFkIGZhaWxlZC4KLSAgICAgICAgICAgIGRlbGV0ZVtdIG1EYXRhOwotICAgICAgICAgICAgbURhdGEgPSBOVUxMOwotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShpbik7Ci0gICAgfQotCi0gICAgTWVkaWFBbGJ1bUFydChjb25zdCBNZWRpYUFsYnVtQXJ0JiBjb3B5KSB7Ci0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKLSAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAotICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICBtRGF0YSA9IG5ldyB1aW50OF90W2NvcHkubVNpemVdOwotICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgbWVtY3B5KG1EYXRhLCBjb3B5Lm1EYXRhLCBtU2l6ZSk7Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIH5NZWRpYUFsYnVtQXJ0KCkgewotICAgICAgICBpZiAobURhdGEgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlW10gbURhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbnRlbnRpb25hbCBwdWJsaWMgYWNjZXNzIG1vZGlmaWVyOgotICAgIC8vIFdlIGhhdmUgdG8ga25vdyB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGluIG9yZGVyIHRvIHNoYXJlIGl0IGJldHdlZW4KLSAgICAvLyBwcm9jZXNzZXM/Ci0gICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi19OwotCiAvLyBSZXByZXNlbnRzIGEgY29sb3IgY29udmVydGVkIChSR0ItYmFzZWQpIHZpZGVvIGZyYW1lCiAvLyB3aXRoIGJpdG1hcCBwaXhlbHMgc3RvcmVkIGluIEZyYW1lQnVmZmVyCiBjbGFzcyBWaWRlb0ZyYW1lCkBAIC0xMjEsOCArNjMsMTEgQEAKICAgICB1aW50MzJfdCBtRGlzcGxheVdpZHRoOwogICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwogICAgIHVpbnQzMl90IG1TaXplOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtRGF0YQorICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAorICAgIC8vIG1EYXRhIHNob3VsZCBiZSA2NCBiaXQgYWxpZ25lZCB0byBwcmV2ZW50IGFkZGl0aW9uYWwgcGFkZGluZwogICAgIHVpbnQ4X3QqIG1EYXRhOyAgICAgICAgICAgIC8vIEFjdHVhbCBiaW5hcnkgZGF0YQotICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgIC8vIHJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UKKyAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NCBiaXQgYW5kIDMyIGJpdAorICAgIGNoYXIgICAgIG1QYWRkaW5nWzggLSBzaXplb2YobURhdGEpXTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkOGViMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU291bmRUcmlnZ2VyIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmggYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX0NMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlckNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZVN0YXRlQ2hhbmdlKGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkgPSAwOworCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VyQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX0lTT1VORFRSSUdHRVJfQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9JU09VTkRUUklHR0VSX1NFUlZJQ0VfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVNvdW5kVHJpZ2dlcjsKK2NsYXNzIElTb3VuZFRyaWdnZXJDbGllbnQ7CisKK2NsYXNzIElTb3VuZFRyaWdnZXJId1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorCisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfSEFSRFdBUkVfSVNPVU5EVFJJR0dFUl9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwNWNhYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSAorCisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlEZWFsZXI7CisKK2NsYXNzIFNvdW5kVHJpZ2dlciA6IHB1YmxpYyBCblNvdW5kVHJpZ2dlckNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworcHVibGljOgorCisgICAgdmlydHVhbCB+U291bmRUcmlnZ2VyKCk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworICAgIHN0YXRpYyAgc3A8U291bmRUcmlnZ2VyPiBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKKyAgICBzdGF0aWMgIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CisKKyAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiBtb2RlbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KTsKKworICAgICAgICAgICAgLy9JQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBzb3VuZF90cmlnZ2VyX3V1aWRfdCAqZ3VpZCk7CisgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3QgZ3VpZFRvU3RyaW5nKGNvbnN0IHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOworCitwcml2YXRlOgorICAgICAgICAgICAgU291bmRUcmlnZ2VyKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mKTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKworICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiAgICAgICAgICAgICAgICAgICBtSVNvdW5kVHJpZ2dlcjsKKyAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1Nb2R1bGU7CisgICAgICAgICAgICBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4gICAgICAgICAgICBtQ2FsbGJhY2s7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJDYWxsYmFjay5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI3N2YyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0NBTExCQUNLX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vc291bmRfdHJpZ2dlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNvdW5kVHJpZ2dlckNhbGxiYWNrIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKworICAgICAgICAgICAgU291bmRUcmlnZ2VyQ2FsbGJhY2soKSB7fQorICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlckNhbGxiYWNrKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBvblJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Tb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2Uoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9DQUxMQkFDS19ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyODY4MjcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZWRpdG9ycGxheWVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcnBsYXllcgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgVmlkZW9FZGl0b3JUb29scy5jcHAgXAotICAgIFZpZGVvRWRpdG9yUGxheWVyLmNwcCBcCi0gICAgUHJldmlld1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JTUkMuY3BwIFwKLSAgICBEdW1teUF1ZGlvU291cmNlLmNwcCBcCi0gICAgRHVtbXlWaWRlb1NvdXJjZS5jcHAgXAotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIFwKLSAgICBQcmV2aWV3UmVuZGVyZXIuY3BwIFwKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIFwKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgXAotICAgIGxpYmF1ZGlvZmxpbmdlciAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkVHTCAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYkdMRVN2MiAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgXAotICAgIGxpYnN5bmMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnVpICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgXAotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGNvcmVjZyBncmFwaGljcykgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL2x2cHAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgIC1ETTRfRU5BQkxFX1JFTkRFUklOR01PREUgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmNhYjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15QXVkaW9Tb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vc3RhdGljCi1zcDxEdW1teUF1ZGlvU291cmNlPiBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKSB7Ci0KLSAgICBBTE9HVigiQ3JlYXRlICIpOwotICAgIHJldHVybiBuZXcgRHVtbXlBdWRpb1NvdXJjZShzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0R1cmF0aW9uVXMpOwotCi19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6OkR1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKQotICAgIDogbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLAotICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAotICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZUR1cmF0aW9uVXMpLAotICAgICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCi0gICAgICBtQXVkaW9EdXJhdGlvblVzKGF1ZGlvRHVyYXRpb25VcyksCi0gICAgICBtVGltZVN0YW1wVXMoMCksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgewotCi0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSAoaW50MzJfdCkKLSAgICAgICAgICAgICgoMUwgKiBtU2FtcGxpbmdSYXRlICogbUZyYW1lRHVyYXRpb25VcykvMTAwMDAwMCk7Ci0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSAgKiBtQ2hhbm5lbENvdW50OwotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0gICAgQUxPR1YoInNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKLSAgICBBTE9HVigiY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOwotICAgIEFMT0dWKCJmcmFtZUR1cmF0aW9uVXMgPSAlbGxkIiwgZnJhbWVEdXJhdGlvblVzKTsKLSAgICBBTE9HVigiYXVkaW9EdXJhdGlvblVzID0gJWxsZCIsIGF1ZGlvRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoIm1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gJWQiLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSk7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBYIik7Ci19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6On5EdW1teUF1ZGlvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15QXVkaW9Tb3VyY2UiKTsKLX0KLQotdm9pZCBEdW1teUF1ZGlvU291cmNlOjpzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotICAgIEFMT0dWKCJzZXREdXJhdGlvbjogJWxsZCB1cyBhZGRlZCB0byAlbGxkIHVzIiwKLSAgICAgICAgYXVkaW9EdXJhdGlvblVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUF1ZGlvRHVyYXRpb25VcyArPSBhdWRpb0R1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIG1UaW1lU3RhbXBVcyA9IDA7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoCi0gICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXIobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIEFMT0dWKCJzdGFydDogWCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teUF1ZGlvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGluZ1JhdGUpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15QXVkaW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotCi0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLSAgICAgICAgbVRpbWVTdGFtcFVzID0gc2Vla1RpbWVVczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtVGltZVN0YW1wVXMgPj0gbUF1ZGlvRHVyYXRpb25VcykgewotICAgICAgICAgICAgQUxPR0koInJlYWQ6IEVPUyByZWFjaGVkICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtVGltZVN0YW1wVXMsIG1BdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIG1CdWZmZXJHcm91cDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAwLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSkpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtVGltZVN0YW1wVXMpOwotCi0gICAgQUxPR1YoInJlYWQ6IG9mZnNldCAgPSAlZCwgc2l6ZSA9ICVkLCBtVGltZVN0YW1wVXMgPSAlbGxkIiwKLSAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpLCBidWZmZXItPnNpemUoKSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIG1UaW1lU3RhbXBVcyA9IG1UaW1lU3RhbXBVcyArIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjI1YThjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLSNkZWZpbmUgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YTsKLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOwotCi1zdHJ1Y3QgRHVtbXlBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlBdWRpb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15QXVkaW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgaW50MzJfdCBtQ2hhbm5lbENvdW50OwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLSAgICBpbnQzMl90IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lOwotICAgIGludDY0X3QgbUF1ZGlvRHVyYXRpb25VczsKLSAgICBpbnQ2NF90IG1UaW1lU3RhbXBVczsKLSAgICBNdXRleCBtTG9jazsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLQotICAgIER1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15QXVkaW9Tb3VyY2UoY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLSAgICBEdW1teUF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLQotfTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9EVU1NWV9BVURJT1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA2ZjkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15VmlkZW9Tb3VyY2UiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIkR1bW15VmlkZW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXNwPER1bW15VmlkZW9Tb3VyY2U+IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSkgewotCi0gICAgQUxPR1YoIkNyZWF0ZSIpOwotICAgIHJldHVybiBuZXcgRHVtbXlWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xpcER1cmF0aW9uLCBpbWFnZVVyaSk7Ci0KLX0KLQotCi1EdW1teVZpZGVvU291cmNlOjpEdW1teVZpZGVvU291cmNlKAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKSB7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3I6IEUiKTsKLQotICAgIG1GcmFtZVdpZHRoID0gd2lkdGg7Ci0gICAgbUZyYW1lSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1JbWFnZUNsaXBEdXJhdGlvbiA9IGNsaXBEdXJhdGlvbjsKLSAgICBtVXJpID0gaW1hZ2VVcmk7Ci0gICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCIlcyIsIG1VcmkpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogWCIpOwotfQotCi0KLUR1bW15VmlkZW9Tb3VyY2U6On5EdW1teVZpZGVvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15VmlkZW9Tb3VyY2UiKTsKLX0KLQotCi0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLQotICAgIC8vIEdldCB0aGUgZnJhbWUgYnVmZmVyIGZyb20gdGhlIHJnYiBmaWxlLCBtVXJpLAotICAgIC8vIGFuZCBzdG9yZSBpdHMgY29udGVudCBpbnRvIGEgTWVkaWFCdWZmZXIKLSAgICBzdGF0dXNfdCBlcnIgPSBMdkdldEltYWdlVGh1bWJOYWlsKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW1VcmksCi0gICAgICAgICAgICAgICAgICAgIG1GcmFtZUhlaWdodCwgbUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICoqKSAmbUltYWdlQnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJMdkdldEltYWdlVGh1bWJOYWlsIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IHRydWU7Ci0gICAgbUltYWdlU2Vla1RpbWUgPSAwOwotICAgIG1JbWFnZVBsYXlTdGFydFRpbWUgPSAwOwotICAgIG1GcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBBTE9HVigic3RhcnQ6IFgiKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgaWYgKG1JbWFnZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUltYWdlQnVmZmVyKTsKLSAgICAgICAgbUltYWdlQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teVZpZGVvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIG1GcmFtZVdpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtRnJhbWVIZWlnaHQpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUltYWdlQ2xpcER1cmF0aW9uKTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiRHVtbXlWaWRlb1NvdXJjZSIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IER1bW15VmlkZW9Tb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LAotICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIEFMT0dWKCJyZWFkOiBFIik7Ci0KLSAgICBjb25zdCBpbnQzMl90IGtUaW1lU2NhbGUgPSAxMDAwOyAgLyogdGltZSBzY2FsZSBpbiBtcyAqLwotICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIHNlZWtpbmcgPSB0cnVlOwotICAgICAgICBtSW1hZ2VTZWVrVGltZSA9IHNlZWtUaW1lVXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgfQotCi0gICAgaWYgKChtSW1hZ2VTZWVrVGltZSA9PSBtSW1hZ2VDbGlwRHVyYXRpb24pIHx8Ci0gICAgICAgIChtRnJhbWVUaW1lVXMgPT0gKGludDY0X3QpbUltYWdlQ2xpcER1cmF0aW9uKSkgewotICAgICAgICBBTE9HVigicmVhZDogRU9TIHJlYWNoZWQiKTsKLSAgICAgICAgKm91dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoCi0gICAgICAgICAgICBtSW1hZ2VCdWZmZXIsIChtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSkpOwotCi0gICAgLy8gU2V0IHRpbWVzdGFtcCBvZiBidWZmZXIKLSAgICBpZiAobUlzRmlyc3RJbWFnZUZyYW1lKSB7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmbUltYWdlUGxheVN0YXJ0VGltZSwga1RpbWVTY2FsZSk7Ci0gICAgICAgIG1GcmFtZVRpbWVVcyA9ICAobUltYWdlU2Vla1RpbWUgKyAxKTsKLSAgICAgICAgQUxPR1YoInJlYWQ6IGpwZyAxc3QgZnJhbWUgdGltZVVzID0gJWxsZCwgYmVnaW4gY3V0IHRpbWUgPSAlbGQiLAotICAgICAgICAgICAgbUZyYW1lVGltZVVzLCBtSW1hZ2VTZWVrVGltZSk7Ci0KLSAgICAgICAgbUlzRmlyc3RJbWFnZUZyYW1lID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTTRPU0FfVGltZSAgY3VycmVudFRpbWVNczsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZjdXJyZW50VGltZU1zLCBrVGltZVNjYWxlKTsKLQotICAgICAgICBtRnJhbWVUaW1lVXMgPSBtSW1hZ2VTZWVrVGltZSArCi0gICAgICAgICAgICAoY3VycmVudFRpbWVNcyAtIG1JbWFnZVBsYXlTdGFydFRpbWUpICogMTAwMExMOwotCi0gICAgICAgIEFMT0dWKCJyZWFkOiBqcGcgZnJhbWUgdGltZVVzID0gJWxsZCIsIG1GcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1GcmFtZVRpbWVVcyk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICBtRnJhbWVXaWR0aCAqIG1GcmFtZUhlaWdodCAqIDEuNSk7Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTY1MTRmMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0jZGVmaW5lIERVTU1ZX1ZJREVPU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgIE1lZGlhQnVmZmVyOwotY2xhc3MgIE1ldGFEYXRhOwotCi1zdHJ1Y3QgRHVtbXlWaWRlb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlWaWRlb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15VmlkZW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtRnJhbWVXaWR0aDsKLSAgICB1aW50MzJfdCBtRnJhbWVIZWlnaHQ7Ci0gICAgdWludDY0X3QgbUltYWdlQ2xpcER1cmF0aW9uOwotICAgIGNvbnN0IGNoYXIgKm1Vcmk7Ci0gICAgaW50NjRfdCBtRnJhbWVUaW1lVXM7Ci0gICAgYm9vbCBtSXNGaXJzdEltYWdlRnJhbWU7Ci0gICAgdm9pZCAqbUltYWdlQnVmZmVyOwotICAgIE00T1NBX1RpbWUgbUltYWdlUGxheVN0YXJ0VGltZTsKLSAgICB1aW50MzJfdCBtSW1hZ2VTZWVrVGltZTsKLQotICAgIER1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgdWludDY0X3QgY2xpcER1cmF0aW9uLCBjb25zdCBjaGFyICppbWFnZVVyaSk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgRHVtbXlWaWRlb1NvdXJjZShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotICAgIER1bW15VmlkZW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEdW1teVZpZGVvU291cmNlICYpOwotCi19OwotCi0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vRFVNTVlfVklERU9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjFkM2ZlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLUk0MjBDb2xvckNvbnZlcnRlcjo6STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIC8vIE9wZW4gdGhlIHNoYXJlZCBsaWJyYXJ5Ci0gICAgbUhhbmRsZSA9IGRsb3BlbigibGliSTQyMGNvbG9yY29udmVydC5zbyIsIFJUTERfTk9XKTsKLQotICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkk0MjBDb2xvckNvbnZlcnRlcjogY2Fubm90IGxvYWQgbGliSTQyMGNvbG9yY29udmVydC5zbyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmluZCB0aGUgZW50cnkgcG9pbnQKLSAgICB2b2lkICgqZ2V0STQyMENvbG9yQ29udmVydGVyKShJNDIwQ29sb3JDb252ZXJ0ZXIgKmNvbnZlcnRlcikgPQotICAgICAgICAodm9pZCAoKikoSTQyMENvbG9yQ29udmVydGVyKikpIGRsc3ltKG1IYW5kbGUsICJnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLQotICAgIGlmIChnZXRJNDIwQ29sb3JDb252ZXJ0ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiSTQyMENvbG9yQ29udmVydGVyOiBjYW5ub3QgbG9hZCBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIiKTsKLSAgICAgICAgZGxjbG9zZShtSGFuZGxlKTsKLSAgICAgICAgbUhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGaWxsIHRoZSBmdW5jdGlvbiBwb2ludGVycy4KLSAgICBnZXRJNDIwQ29sb3JDb252ZXJ0ZXIodGhpcyk7Ci0KLSAgICBBTE9HSSgiSTQyMENvbG9yQ29udmVydGVyOiBsaWJJNDIwY29sb3Jjb252ZXJ0LnNvIGxvYWRlZCIpOwotfQotCi1ib29sIEk0MjBDb2xvckNvbnZlcnRlcjo6aXNMb2FkZWQoKSB7Ci0gICAgcmV0dXJuIG1IYW5kbGUgIT0gTlVMTDsKLX0KLQotSTQyMENvbG9yQ29udmVydGVyOjp+STQyMENvbG9yQ29udmVydGVyKCkgewotICAgIGlmIChtSGFuZGxlKSB7Ci0gICAgICAgIGRsY2xvc2UobUhhbmRsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNDhlNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9JNDIwQ29sb3JDb252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0gKLSNkZWZpbmUgSTQyMF9DT0xPUl9DT05WRVJURVJfSAotCi0jaW5jbHVkZSA8SUk0MjBDb2xvckNvbnZlcnRlci5oPgotCi0vLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIEk0MjAgY29sb3IgY29udmVydGVyIGZ1bmN0aW9ucyBpbgotLy8gSUk0MjBDb2xvckNvbnZlcnRlciwgd2hpY2ggaXMgbG9hZGVkIGZyb20gYSBzaGFyZWQgbGlicmFyeS4KLWNsYXNzIEk0MjBDb2xvckNvbnZlcnRlcjogcHVibGljIElJNDIwQ29sb3JDb252ZXJ0ZXIgewotcHVibGljOgotICAgIEk0MjBDb2xvckNvbnZlcnRlcigpOwotICAgIH5JNDIwQ29sb3JDb252ZXJ0ZXIoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGZ1bmN0aW9ucyBhcmUgc3VjY2Vzc2Z1bGx5IGxvYWRlZC4KLSAgICBib29sIGlzTG9hZGVkKCk7Ci1wcml2YXRlOgotICAgIHZvaWQqIG1IYW5kbGU7Ci19OwotCi0jZW5kaWYgLyogSTQyMF9DT0xPUl9DT05WRVJURVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4YjM2MmVmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyIgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLQotI2RlZmluZSBDSEVDS19FR0xfRVJST1IgQ0hFQ0soRUdMX1NVQ0NFU1MgPT0gZWdsR2V0RXJyb3IoKSkKLSNkZWZpbmUgQ0hFQ0tfR0xfRVJST1IgQ0hFQ0soR0xlbnVtKEdMX05PX0VSUk9SKSA9PSBnbEdldEVycm9yKCkpCi0KLS8vCi0vLyBWZXJ0ZXggYW5kIGZyYWdtZW50IHByb2dyYW1zCi0vLwotCi0vLyBUaGUgbWF0cml4IGlzIGRlcml2ZWQgZnJvbQotLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKLS8vCi0vLyBSICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSArIDEuNTk2ICogKFYgLSAxMjgpCi0vLyBHICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSAtIDAuODEzICogKFYgLSAxMjgpIC0gMC4zOTEgKiAoVSAtIDEyOCkKLS8vIEIgKiAyNTUgPSAxLjE2NCAqIChZIC0gMTYpICsgMi4wMTggKiAoVSAtIDEyOCkKLS8vCi0vLyBIZXJlIHdlIGFzc3VtZSBZVVYgYXJlIGluIHRoZSByYW5nZSBvZiBbMCwyNTVdLCBSR0IgYXJlIGluIHRoZSByYW5nZSBvZgotLy8gWzAsIDFdCi0jZGVmaW5lIFJHQjJZVVZfTUFUUklYIFwKLSJjb25zdCBtYXQ0IHJnYjJ5dXYgPSBtYXQ0KCJcCi0iICAgIDY1LjUyMjU1LCAgIC0zNy43OTM5OCwgICAxMTEuOTg3MzIsICAgICAwLjAwMDAwLCJcCi0iICAgMTI4LjYyNzI5LCAgIC03NC4xOTMzNCwgICAtOTMuODEwODgsICAgICAwLjAwMDAwLCJcCi0iICAgIDI0LjkyMjMzLCAgIDExMS45ODczMiwgICAtMTguMTc2NDQsICAgICAwLjAwMDAwLCJcCi0iICAgIDE2LjAwMDAwLCAgIDEyOC4wMDAwMCwgICAxMjguMDAwMDAsICAgICAxLjAwMDAwKTtcbiIKLQotI2RlZmluZSBZVVYyUkdCX01BVFJJWCBcCi0iY29uc3QgbWF0NCB5dXYycmdiID0gbWF0NCgiXAotIiAgIDAuMDA0NTYsICAgMC4wMDQ1NiwgICAwLjAwNDU2LCAgIDAuMDAwMDAsIlwKLSIgICAwLjAwMDAwLCAgLTAuMDAxNTMsICAgMC4wMDc5MSwgICAwLjAwMDAwLCJcCi0iICAgMC4wMDYyNiwgIC0wLjAwMzE5LCAgIDAuMDAwMDAsICAgMC4wMDAwMCwiXAotIiAgLTAuODc0MTYsICAgMC41MzEzMywgIC0xLjA4NTk5LCAgIDEuMDAwMDApO1xuIgotCi1zdGF0aWMgY29uc3QgY2hhciB2U3JjTm9ybWFsW10gPQotICAgICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWMyIHZUZXhQb3M7XG4iCi0gICAgInVuaWZvcm0gbWF0NCB0ZXhNYXRyaXg7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICIgIHRleENvb3JkcyA9ICh0ZXhNYXRyaXggKiB2ZWM0KHZUZXhQb3MsIDAuMCwgMS4wKSkueHk7XG4iCi0gICAgIiAgdG9wRG93biA9IHZUZXhQb3MueTtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY05vcm1hbFtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjU2VwaWFbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgMTE3LjAsIDEzOS4wLCAxLjApO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNOZWdhdGl2ZVtdID0KLSAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkcztcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB5dXYgPSB2ZWM0KDI1NS4wIC0geXV2LngsIHl1di55LCB5dXYueiwgMS4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjR3JhZGllbnRbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgZmxvYXQgdG9wRG93bjtcbiIKLSAgICBSR0IyWVVWX01BVFJJWAotICAgIFlVVjJSR0JfTUFUUklYCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHJnYiA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICIgIHZlYzQgeXV2ID0gcmdiMnl1diAqIHJnYjtcbiIKLSAgICAiICB2ZWM0IG1peGluID0gdmVjNCgxNS4wLzMxLjAsIDU5LjAvNjMuMCwgMzEuMC8zMS4wLCAxLjApO1xuIgotICAgICIgIHZlYzQgeXV2MiA9IHJnYjJ5dXYgKiB2ZWM0KChtaXhpbi54eXogKiB0b3BEb3duKSwgMSk7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCh5dXYueCwgeXV2Mi55LCB5dXYyLnosIDEpO1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHl1djJyZ2IgKiB5dXY7XG4iCi0gICAgIn1cbiI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTmF0aXZlV2luZG93UmVuZGVyZXI6Ok5hdGl2ZVdpbmRvd1JlbmRlcmVyKHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdywKLSAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgIDogbU5hdGl2ZVdpbmRvdyhuYXRpdmVXaW5kb3cpCi0gICAgLCBtRHN0V2lkdGgod2lkdGgpCi0gICAgLCBtRHN0SGVpZ2h0KGhlaWdodCkKLSAgICAsIG1MYXN0VmlkZW9FZmZlY3QoLTEpCi0gICAgLCBtTmV4dFRleHR1cmVJZCgxMDApCi0gICAgLCBtQWN0aXZlSW5wdXRzKDApCi0gICAgLCBtVGhyZWFkQ21kKENNRF9JRExFKSB7Ci0gICAgY3JlYXRlVGhyZWFkKHRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyBydW4gaW4gdGhlIEdMIHRocmVhZC4KLS8vCi0vLyBBbGwgR0wtcmVsYXRlZCB3b3JrIGlzIGRvbmUgaW4gdGhpcyB0aHJlYWQsIGFuZCBvdGhlciB0aHJlYWRzIHNlbmQKLS8vIHJlcXVlc3RzIHRvIHRoaXMgdGhyZWFkIHVzaW5nIGEgY29tbWFuZCBjb2RlLiBXZSBleHBlY3QgbW9zdCBvZiB0aGUKLS8vIHRpbWUgdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSB0aHJlYWQgc2VuZGluZyBpbiByZXF1ZXN0cywgc28gd2UgbGV0Ci0vLyBvdGhlciB0aHJlYWRzIHdhaXQgdW50aWwgdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQgYnkgR0wgdGhyZWFkLgotCi1pbnQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnRocmVhZFN0YXJ0KHZvaWQqIHNlbGYpIHsKLSAgICBBTE9HRCgiY3JlYXRlIHRocmVhZCIpOwotICAgICgoTmF0aXZlV2luZG93UmVuZGVyZXIqKXNlbGYpLT5nbFRocmVhZCgpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpnbFRocmVhZCgpIHsKLSAgICBpbml0aWFsaXplRUdMKCk7Ci0gICAgY3JlYXRlUHJvZ3JhbXMoKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgYm9vbCBxdWl0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFxdWl0KSB7Ci0gICAgICAgIHN3aXRjaCAobVRocmVhZENtZCkgewotICAgICAgICAgICAgY2FzZSBDTURfSURMRToKLSAgICAgICAgICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFTkRFUl9JTlBVVDoKLSAgICAgICAgICAgICAgICByZW5kZXIobVRocmVhZFJlbmRlcklucHV0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX1JFU0VSVkVfVEVYVFVSRToKLSAgICAgICAgICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBtVGhyZWFkVGV4dHVyZUlkKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HTF9FUlJPUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX0RFTEVURV9URVhUVVJFOgotICAgICAgICAgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UaHJlYWRUZXh0dXJlSWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDTURfUVVJVDoKLSAgICAgICAgICAgICAgICB0ZXJtaW5hdGVFR0woKTsKLSAgICAgICAgICAgICAgICBxdWl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBUZWxsIHRoZSByZXF1ZXN0ZXIgdGhhdCB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4KLSAgICAgICAgbVRocmVhZENtZCA9IENNRF9JRExFOwotICAgICAgICBtQ29uZC5icm9hZGNhc3QoKTsKLSAgICB9Ci0gICAgQUxPR0QoInF1aXQiKTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6aW5pdGlhbGl6ZUVHTCgpIHsKLSAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0gICAgZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBjb25maWcsCi0gICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5VTEwpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTGludCBjb250ZXh0QXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgIGNvbnRleHRBdHRyaWJzKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLCBtRWdsQ29udGV4dCk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp0ZXJtaW5hdGVFR0woKSB7Ci0gICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVQcm9ncmFtcygpIHsKLSAgICBHTHVpbnQgdlNoYWRlcjsKLSAgICBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHZTcmNOb3JtYWwsICZ2U2hhZGVyKTsKLQotICAgIGNvbnN0IGNoYXIqIGZTcmNbTlVNQkVSX09GX0VGRkVDVFNdID0gewotICAgICAgICBmU3JjTm9ybWFsLCBmU3JjU2VwaWEsIGZTcmNOZWdhdGl2ZSwgZlNyY0dyYWRpZW50Ci0gICAgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNQkVSX09GX0VGRkVDVFM7IGkrKykgewotICAgICAgICBHTHVpbnQgZlNoYWRlcjsKLSAgICAgICAgbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIGZTcmNbaV0sICZmU2hhZGVyKTsKLSAgICAgICAgY3JlYXRlUHJvZ3JhbSh2U2hhZGVyLCBmU2hhZGVyLCAmbVByb2dyYW1baV0pOwotICAgICAgICBnbERlbGV0ZVNoYWRlcihmU2hhZGVyKTsKLSAgICAgICAgQ0hFQ0tfR0xfRVJST1I7Ci0gICAgfQotCi0gICAgZ2xEZWxldGVTaGFkZXIodlNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVByb2dyYW0oCi0gICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSkgewotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlByb2dyYW0gbGluayBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBwcm9ncmFtID0gMDsKLSAgICB9Ci0KLSAgICAqb3V0UGdtID0gcHJvZ3JhbTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6bG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwKLSAgICAgICAgR0x1aW50KiBvdXRTaGFkZXIpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgQUxPR0UoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIHNoYWRlciA9IDA7Ci0gICAgfQotICAgICpvdXRTaGFkZXIgPSBzaGFkZXI7Ci19Ci0KLU5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp+TmF0aXZlV2luZG93UmVuZGVyZXIoKSB7Ci0gICAgQ0hFQ0sobUFjdGl2ZUlucHV0cyA9PSAwKTsKLSAgICBzdGFydFJlcXVlc3QoQ01EX1FVSVQpOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnJlbmRlcihSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBzcDxHTENvbnN1bWVyPiBTVCA9IGlucHV0LT5tU1Q7Ci0gICAgc3A8U3VyZmFjZT4gU1RDID0gaW5wdXQtPm1TVEM7Ci0KLSAgICBpZiAoaW5wdXQtPm1Jc0V4dGVybmFsQnVmZmVyKSB7Ci0gICAgICAgIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoU1RDLmdldCgpLCBpbnB1dC0+bUJ1ZmZlciwKLSAgICAgICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBxdWV1ZUludGVybmFsQnVmZmVyKFNUQy5nZXQoKSwgaW5wdXQtPm1CdWZmZXIpOwotICAgIH0KLQotICAgIFNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgIGdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgY2FsY3VsYXRlUG9zaXRpb25Db29yZGluYXRlcyhpbnB1dC0+bVJlbmRlcmluZ01vZGUsCi0gICAgICAgIGlucHV0LT5tV2lkdGgsIGlucHV0LT5tSGVpZ2h0KTsKLQotICAgIGNvbnN0IEdMZmxvYXQgdGV4dHVyZUNvb3JkaW5hdGVzW10gPSB7Ci0gICAgICAgICAwLjBmLCAgMS4wZiwKLSAgICAgICAgIDAuMGYsICAwLjBmLAotICAgICAgICAgMS4wZiwgIDAuMGYsCi0gICAgICAgICAxLjBmLCAgMS4wZiwKLSAgICB9OwotCi0gICAgdXBkYXRlUHJvZ3JhbUFuZEhhbmRsZShpbnB1dC0+bVZpZGVvRWZmZWN0KTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtUG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXMpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtUG9zaXRpb25IYW5kbGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1UZXhQb3NIYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgdGV4dHVyZUNvb3JkaW5hdGVzKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVRleFBvc0hhbmRsZSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBHTGZsb2F0IHRleE1hdHJpeFsxNl07Ci0gICAgU1QtPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXhNYXRyaXgpOwotICAgIGdsVW5pZm9ybU1hdHJpeDRmdihtVGV4TWF0cml4SGFuZGxlLCAxLCBHTF9GQUxTRSwgdGV4TWF0cml4KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIGlucHV0LT5tVGV4dHVyZUlkKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaSgKLSAgICAgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyAqYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChhbncsIHRpbWVVcyAqIDEwMDApOwotICAgIHN0YXR1c190IGVyciA9IGFudy0+cXVldWVCdWZmZXIoYW53LCBidWZmZXItPmdyYXBoaWNCdWZmZXIoKS5nZXQoKSwgLTEpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgicXVldWVCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgbWV0YURhdGEtPnNldEludDMyKGtLZXlSZW5kZXJlZCwgMSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LAotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKLSAgICBuYXRpdmVfd2luZG93X3NldF91c2FnZShhbncsIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIENIRUNLKE5PX0VSUk9SID09IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQoYW53LCAmYW5iKSk7Ci0gICAgQ0hFQ0soYW5iICE9IE5VTEwpOwotCi0gICAgLy8gQ29weSB0aGUgYnVmZmVyCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgY29weUk0MjBCdWZmZXIoYnVmZmVyLCBpbWcsIHdpZHRoLCBoZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQ0hFQ0soTk9fRVJST1IgPT0gYW53LT5xdWV1ZUJ1ZmZlcihhbncsIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKSk7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LCBpbnQgc3RyaWRlKSB7Ci0gICAgaW50IHN0cmlkZVVWID0gKHN0cmlkZSAvIDIgKyAweGYpICYgfjB4ZjsKLSAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXNyYy0+ZGF0YSgpICsgc3JjLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAvLyBZCi0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodDsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCk7Ci0gICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGg7Ci0gICAgfQotICAgIC8vIFRoZSBzcmMgaXMgSTQyMCwgdGhlIGRzdCBpcyBZVjEyLgotICAgIC8vIFUKLSAgICBwICs9IHNyY1dpZHRoICogc3JjSGVpZ2h0IC8gNDsKLSAgICBmb3IgKGludCBpID0gc3JjSGVpZ2h0IC8gMjsgaSA+IDA7IGktLSkgewotICAgICAgICBtZW1jcHkoZHN0LCBwLCBzcmNXaWR0aCAvIDIpOwotICAgICAgICBkc3QgKz0gc3RyaWRlVVY7Ci0gICAgICAgIHAgKz0gc3JjV2lkdGggLyAyOwotICAgIH0KLSAgICAvLyBWCi0gICAgcCAtPSBzcmNXaWR0aCAqIHNyY0hlaWdodCAvIDI7Ci0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodCAvIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGggLyAyKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZVVWOwotICAgICAgICBwICs9IHNyY1dpZHRoIC8gMjsKLSAgICB9Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnVwZGF0ZVByb2dyYW1BbmRIYW5kbGUodWludDMyX3QgdmlkZW9FZmZlY3QpIHsKLSAgICBpZiAobUxhc3RWaWRlb0VmZmVjdCA9PSB2aWRlb0VmZmVjdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUxhc3RWaWRlb0VmZmVjdCA9IHZpZGVvRWZmZWN0OwotICAgIGludCBpOwotICAgIHN3aXRjaCAobUxhc3RWaWRlb0VmZmVjdCkgewotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9OT05FOgotICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfU0VQSUE6Ci0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9ORUdBVElWRToKLSAgICAgICAgICAgIGkgPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX0dSQURJRU5UOgotICAgICAgICAgICAgaSA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGdsVXNlUHJvZ3JhbShtUHJvZ3JhbVtpXSk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBtUG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidlBvc2l0aW9uIik7Ci0gICAgbVRleFBvc0hhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW1baV0sICJ2VGV4UG9zIik7Ci0gICAgbVRleE1hdHJpeEhhbmRsZSA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidGV4TWF0cml4Iik7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpIHsKLSAgICBmbG9hdCB4LCB5OwotICAgIHN3aXRjaCAocmVuZGVyaW5nTW9kZSkgewotICAgICAgICBjYXNlIE00eFZTU19rUmVzaXppbmc6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB4ID0gMTsKLSAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBzbWFsbGVyIHNpZGUgMQotICAgICAgICAgICAgaWYgKHggPiB5KSB7Ci0gICAgICAgICAgICAgICAgeCAvPSB5OwotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa0JsYWNrQm9yZGVyczoKLSAgICAgICAgICAgIHggPSBmbG9hdChzcmNXaWR0aCkgLyBtRHN0V2lkdGg7Ci0gICAgICAgICAgICB5ID0gZmxvYXQoc3JjSGVpZ2h0KSAvIG1Ec3RIZWlnaHQ7Ci0gICAgICAgICAgICAvLyBNYWtlIHRoZSBsYXJnZXIgc2lkZSAxCi0gICAgICAgICAgICBpZiAoeCA+IHkpIHsKLSAgICAgICAgICAgICAgICB5IC89IHg7Ci0gICAgICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHggLz0geTsKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzBdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbMV0gPSB5OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzJdID0gLXg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbM10gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s0XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNV0gPSAteTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1s2XSA9IHg7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbN10gPSB5OwotfQotCi0vLwotLy8gIFRoZSBmdW5jdGlvbnMgYmVsb3cgcnVuIGluIG90aGVyIHRocmVhZHMuCi0vLwotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpzdGFydFJlcXVlc3QoaW50IGNtZCkgewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAobVRocmVhZENtZCAhPSBDTURfSURMRSkgewotICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgbVRocmVhZENtZCA9IGNtZDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6c2VuZFJlcXVlc3QoKSB7Ci0gICAgbUNvbmQuYnJvYWRjYXN0KCk7Ci0gICAgd2hpbGUgKG1UaHJlYWRDbWQgIT0gQ01EX0lETEUpIHsKLSAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi1SZW5kZXJJbnB1dCogTmF0aXZlV2luZG93UmVuZGVyZXI6OmNyZWF0ZVJlbmRlcklucHV0KCkgewotICAgIEFMT0dEKCJuZXcgcmVuZGVyIGlucHV0ICVkIiwgbU5leHRUZXh0dXJlSWQpOwotICAgIFJlbmRlcklucHV0KiBpbnB1dCA9IG5ldyBSZW5kZXJJbnB1dCh0aGlzLCBtTmV4dFRleHR1cmVJZCk7Ci0KLSAgICBzdGFydFJlcXVlc3QoQ01EX1JFU0VSVkVfVEVYVFVSRSk7Ci0gICAgbVRocmVhZFRleHR1cmVJZCA9IG1OZXh0VGV4dHVyZUlkOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBtTmV4dFRleHR1cmVJZCsrOwotICAgIG1BY3RpdmVJbnB1dHMrKzsKLSAgICByZXR1cm4gaW5wdXQ7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmRlc3Ryb3lSZW5kZXJJbnB1dChSZW5kZXJJbnB1dCogaW5wdXQpIHsKLSAgICBBTE9HRCgiZGVzdHJveSByZW5kZXIgaW5wdXQgJWQiLCBpbnB1dC0+bVRleHR1cmVJZCk7Ci0gICAgR0x1aW50IHRleHR1cmVJZCA9IGlucHV0LT5tVGV4dHVyZUlkOwotICAgIGRlbGV0ZSBpbnB1dDsKLQotICAgIHN0YXJ0UmVxdWVzdChDTURfREVMRVRFX1RFWFRVUkUpOwotICAgIG1UaHJlYWRUZXh0dXJlSWQgPSB0ZXh0dXJlSWQ7Ci0gICAgc2VuZFJlcXVlc3QoKTsKLQotICAgIG1BY3RpdmVJbnB1dHMtLTsKLX0KLQotLy8KLS8vICBSZW5kZXJJbnB1dAotLy8KLQotUmVuZGVySW5wdXQ6OlJlbmRlcklucHV0KE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlciwgR0x1aW50IHRleHR1cmVJZCkKLSAgICA6IG1SZW5kZXJlcihyZW5kZXJlcikKLSAgICAsIG1UZXh0dXJlSWQodGV4dHVyZUlkKSB7Ci0gICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbVNUID0gbmV3IEdMQ29uc3VtZXIoYnEsIG1UZXh0dXJlSWQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShicSk7Ci0gICAgbmF0aXZlX3dpbmRvd19jb25uZWN0KG1TVEMuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLX0KLQotUmVuZGVySW5wdXQ6On5SZW5kZXJJbnB1dCgpIHsKLX0KLQotQU5hdGl2ZVdpbmRvdyogUmVuZGVySW5wdXQ6OmdldFRhcmdldFdpbmRvdygpIHsKLSAgICByZXR1cm4gbVNUQy5nZXQoKTsKLX0KLQotdm9pZCBSZW5kZXJJbnB1dDo6dXBkYXRlVmlkZW9TaXplKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOwotCi0gICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgewotICAgICAgICBtV2lkdGggPSByaWdodCAtIGxlZnQgKyAxOwotICAgICAgICBtSGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKLSAgICB9Ci0KLSAgICAvLyBJZiByb3RhdGlvbiBkZWdyZWVzIGlzIDkwIG9yIDI3MCwgc3dhcCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgLy8gKG1XaWR0aCBhbmQgbUhlaWdodCBhcmUgdGhlIF9yb3RhdGVkXyBzb3VyY2UgcmVjdGFuZ2xlKS4KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7Ci0gICAgICAgIGludCB0bXAgPSBtV2lkdGg7Ci0gICAgICAgIG1XaWR0aCA9IG1IZWlnaHQ7Ci0gICAgICAgIG1IZWlnaHQgPSB0bXA7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklucHV0OjpyZW5kZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlciwgdWludDMyX3QgdmlkZW9FZmZlY3QsCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBib29sIGlzRXh0ZXJuYWxCdWZmZXIpIHsKLSAgICBtVmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7Ci0gICAgbUlzRXh0ZXJuYWxCdWZmZXIgPSBpc0V4dGVybmFsQnVmZmVyOwotICAgIG1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtUmVuZGVyZXItPnN0YXJ0UmVxdWVzdChOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Q01EX1JFTkRFUl9JTlBVVCk7Ci0gICAgbVJlbmRlcmVyLT5tVGhyZWFkUmVuZGVySW5wdXQgPSB0aGlzOwotICAgIG1SZW5kZXJlci0+c2VuZFJlcXVlc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZiNGNiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwotI2RlZmluZSBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0KLS8vIFRoZSBOYXRpdmVXaW5kb3dSZW5kZXJlciBkcmF3cyB2aWRlbyBmcmFtZXMgc3RvcmVkIGluIE1lZGlhQnVmZmVycyB0bwotLy8gYW4gQU5hdGl2ZVdpbmRvdy4gIEl0IGNhbiBhcHBseSAicmVuZGVyaW5nIG1vZGUiIGFuZCBjb2xvciBlZmZlY3RzIHRvCi0vLyB0aGUgZnJhbWVzLiAiUmVuZGVyaW5nIG1vZGUiIGlzIHRoZSBvcHRpb24gdG8gZG8gcmVzaXppbmcsIGNyb3BwaW5nLAotLy8gb3IgYmxhY2stYm9yZGVyaW5nIHdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvIGFyZQotLy8gZGlmZmVyZW50LiBDb2xvciBlZmZlY3RzIGluY2x1ZGUgc2VwaWEsIG5lZ2F0aXZlLCBhbmQgZ3JhZGllbnQuCi0vLwotLy8gVGhlIGlucHV0IHRvIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBSZW5kZXJJbnB1dCBjbGFzcywKLS8vIGFuZCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgYWN0aXZlIFJlbmRlcklucHV0IGF0IHRoZSBzYW1lIHRpbWUuIEFsdGhvdWdoCi0vLyB3ZSBvbmx5IGV4cGVjdCB0aGF0IGhhcHBlbnMgYnJpZWZseSB3aGVuIG9uZSBjbGlwIGlzIGFib3V0IHRvIGZpbmlzaAotLy8gYW5kIHRoZSBuZXh0IGNsaXAgaXMgYWJvdXQgdG8gc3RhcnQuCi0vLwotLy8gV2UgYWxsb2NhdGUgYSBTdXJmYWNlIGZvciBlYWNoIFJlbmRlcklucHV0IGFuZCB0aGUgdXNlciBjYW4gdXNlCi0vLyB0aGUgZ2V0VGFyZ2V0V2luZG93KCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIEFOYXRpdmVXaW5kb3cKLS8vIGZvciB0aGF0IFN1cmZhY2UuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGUgdXNlciBjYW4gcGFzcyB0aGF0Ci0vLyBBTmF0aXZlV2luZG93IHRvIE9NWENvZGVjOjpDcmVhdGUoKSBzbyB0aGUgY29kZWMgY2FuIGRlY29kZSBkaXJlY3RseQotLy8gdG8gYnVmZmVycyBwcm92aWRlZCBieSB0aGUgdGV4dHVyZS4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTENvbnN1bWVyOwotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIFJlbmRlcklucHV0OwotCi1jbGFzcyBOYXRpdmVXaW5kb3dSZW5kZXJlciB7Ci1wdWJsaWM6Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIH5OYXRpdmVXaW5kb3dSZW5kZXJlcigpOwotCi0gICAgUmVuZGVySW5wdXQqIGNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgdm9pZCBkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KTsKLQotcHJpdmF0ZToKLSAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoY29uc3QgTmF0aXZlV2luZG93UmVuZGVyZXIgJik7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKLQotICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCBmaW5pYWxpemF0aW9uCi0gICAgdm9pZCBpbml0aWFsaXplRUdMKCk7Ci0gICAgdm9pZCB0ZXJtaW5hdGVFR0woKTsKLSAgICB2b2lkIGNyZWF0ZVByb2dyYW1zKCk7Ci0gICAgdm9pZCBjcmVhdGVQcm9ncmFtKAotICAgICAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSk7Ci0gICAgdm9pZCBsb2FkU2hhZGVyKAotICAgICAgICAgICAgR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsIEdMdWludCogb3V0U2hhZGVyKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgZXZlcnkgZnJhbWUuCi0gICAgdm9pZCByZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KTsKLSAgICB2b2lkIHF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLSAgICB2b2lkIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIGNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSk7Ci0gICAgdm9pZCB1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KTsKLSAgICB2b2lkIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsCi0gICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBvbmNlIGFuZCBkb2Vzbid0IGNoYW5nZSBhZnRlcndhcmRzLgotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50IG1Ec3RXaWR0aCwgbURzdEhlaWdodDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBlbnVtIHsKLSAgICAgICAgRUZGRUNUX05PUk1BTCwKLSAgICAgICAgRUZGRUNUX1NFUElBLAotICAgICAgICBFRkZFQ1RfTkVHQVRJVkUsCi0gICAgICAgIEVGRkVDVF9HUkFESUVOVCwKLSAgICAgICAgTlVNQkVSX09GX0VGRkVDVFMKLSAgICB9OwotICAgIEdMdWludCBtUHJvZ3JhbVtOVU1CRVJfT0ZfRUZGRUNUU107Ci0KLSAgICAvLyBXZSB1c2Ugb25lIHNoYWRlciBwcm9ncmFtIGZvciBlYWNoIGVmZmVjdC4gbUxhc3RWaWRlb0VmZmVjdCByZW1lbWJlcnMKLSAgICAvLyB0aGUgcHJvZ3JhbSB1c2VkIGZvciB0aGUgbGFzdCBmcmFtZS4gd2hlbiB0aGUgZWZmZWN0IHVzZWQgY2hhbmdlcywKLSAgICAvLyB3ZSBjaGFuZ2UgdGhlIHByb2dyYW0gdXNlZCBhbmQgdXBkYXRlIHRoZSBoYW5kbGVzLgotICAgIHVpbnQzMl90IG1MYXN0VmlkZW9FZmZlY3Q7Ci0gICAgR0xpbnQgbVBvc2l0aW9uSGFuZGxlOwotICAgIEdMaW50IG1UZXhQb3NIYW5kbGU7Ci0gICAgR0xpbnQgbVRleE1hdHJpeEhhbmRsZTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIHZlcnRleCBjb29yZGluYXRlcyB1c2VkIGZvciB0aGUgZnJhbWUgdGV4dHVyZS4KLSAgICAvLyBJdCdzIGNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRoZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHRoZSBzb3VyY2UgYW5kCi0gICAgLy8gZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvLgotICAgIEdMZmxvYXQgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbOF07Ci0KLSAgICAvLyBXZSB1c2UgYSBkaWZmZXJlbnQgR0wgaWQgZm9yIGVhY2ggU3VyZmFjZS4KLSAgICBHTHVpbnQgbU5leHRUZXh0dXJlSWQ7Ci0KLSAgICAvLyBOdW1iZXIgb2YgZXhpc3RpbmcgUmVuZGVySW5wdXRzLCBqdXN0IGZvciBkZWJ1Z2dpbmcuCi0gICAgaW50IG1BY3RpdmVJbnB1dHM7Ci0KLSAgICAvLyBUaGUgR0wgdGhyZWFkIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBpbnQgdGhyZWFkU3RhcnQodm9pZCogc2VsZik7Ci0gICAgdm9pZCBnbFRocmVhZCgpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIEdMIHRocmVhZCBhbmQKLSAgICAvLyBvdGhlciB0aHJlYWRzLgotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZDsKLSAgICBlbnVtIHsKLSAgICAgICAgQ01EX0lETEUsCi0gICAgICAgIENNRF9SRU5ERVJfSU5QVVQsCi0gICAgICAgIENNRF9SRVNFUlZFX1RFWFRVUkUsCi0gICAgICAgIENNRF9ERUxFVEVfVEVYVFVSRSwKLSAgICAgICAgQ01EX1FVSVQsCi0gICAgfTsKLSAgICBpbnQgbVRocmVhZENtZDsKLSAgICBSZW5kZXJJbnB1dCogbVRocmVhZFJlbmRlcklucHV0OwotICAgIEdMdWludCBtVGhyZWFkVGV4dHVyZUlkOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIEdMIHRocmVhZC4KLSAgICAvLyBzZW5kUmVxdWVzdCgpIGFsc28gd2FpdHMgZm9yIHRoZSBHTCB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZQotICAgIC8vIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgdm9pZCBzdGFydFJlcXVlc3QoaW50IGNtZCk7Ci0gICAgdm9pZCBzZW5kUmVxdWVzdCgpOwotCi0gICAgZnJpZW5kIGNsYXNzIFJlbmRlcklucHV0OwotfTsKLQotY2xhc3MgUmVuZGVySW5wdXQgewotcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIEFOYXRpdmVXaW5kb3cgY29ycmVzcG9uZHMgdG8gdGhlIFN1cmZhY2UuCi0gICAgQU5hdGl2ZVdpbmRvdyogZ2V0VGFyZ2V0V2luZG93KCk7Ci0KLSAgICAvLyBVcGRhdGVzIHZpZGVvIGZyYW1lIHNpemUgZnJvbSB0aGUgTWVkaWFTb3VyY2UncyBtZXRhZGF0YS4gU3BlY2lmaWNhbGx5Ci0gICAgLy8gd2UgbG9vayBmb3Iga0tleVdpZHRoLCBrS2V5SGVpZ2h0LCBhbmQgKG9wdGlvbmFsbHkpIGtLZXlDcm9wUmVjdC4KLSAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZShzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICAvLyBSZW5kZXJzIHRoZSBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gdmlkZW8gZWZmZWN0IGFuZCByZW5kaW5nIG1vZGUuCi0gICAgLy8gVGhlIHZpZGVvIGVmZmV0cyBhcmUgZGVmaW5lZCBpbiBWaWRlb0VkaXRvclRvb2xzLmgKLSAgICAvLyBTZXQgaXNFeHRlcm5hbEJ1ZmZlciB0byB0cnVlIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGdpdmVuIGlzIG5vdAotICAgIC8vIHByb3ZpZGVkIGJ5IHRoZSBTdXJmYWNlLgotICAgIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQzMl90IHZpZGVvRWZmZWN0LAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgYm9vbCBpc0V4dGVybmFsQnVmZmVyKTsKLXByaXZhdGU6Ci0gICAgUmVuZGVySW5wdXQoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyLCBHTHVpbnQgdGV4dHVyZUlkKTsKLSAgICB+UmVuZGVySW5wdXQoKTsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciogbVJlbmRlcmVyOwotICAgIEdMdWludCBtVGV4dHVyZUlkOwotICAgIHNwPEdMQ29uc3VtZXI+IG1TVDsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7Ci0KLSAgICAvLyBUaGVzZSBhcmUgb25seSB2YWxpZCBkdXJpbmcgcmVuZGVyKCkgY2FsbHMKLSAgICB1aW50MzJfdCBtVmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIGJvb2wgbUlzRXh0ZXJuYWxCdWZmZXI7Ci0gICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0KLSAgICBmcmllbmQgY2xhc3MgTmF0aXZlV2luZG93UmVuZGVyZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYmQ5Zjg0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJEdW1teUF1ZGlvU291cmNlLmgiCi0jaW5jbHVkZSAiRHVtbXlWaWRlb1NvdXJjZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yU1JDLmgiCi0jaW5jbHVkZSAiUHJldmlld1BsYXllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpIHsKLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOwotICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOwotICAgIENIRUNLKHNlcnZpY2UuZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgICBzZXJ2aWNlLT5hZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi1zdHJ1Y3QgUHJldmlld1BsYXllckV2ZW50IDogcHVibGljIFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQgewotICAgIFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIFByZXZpZXdQbGF5ZXIgKnBsYXllciwKLSAgICAgICAgICAgIHZvaWQgKFByZXZpZXdQbGF5ZXI6OiptZXRob2QpKCkpCi0gICAgICAgIDogbVBsYXllcihwbGF5ZXIpLAotICAgICAgICAgIG1NZXRob2QobWV0aG9kKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UHJldmlld1BsYXllckV2ZW50KCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7Ci0gICAgICAgIChtUGxheWVyLT4qbU1ldGhvZCkoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgUHJldmlld1BsYXllciAqbVBsYXllcjsKLSAgICB2b2lkIChQcmV2aWV3UGxheWVyOjoqbU1ldGhvZCkoKTsKLQotICAgIFByZXZpZXdQbGF5ZXJFdmVudChjb25zdCBQcmV2aWV3UGxheWVyRXZlbnQgJik7Ci0gICAgUHJldmlld1BsYXllckV2ZW50ICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1BsYXllckV2ZW50ICYpOwotfTsKLQotUHJldmlld1BsYXllcjo6UHJldmlld1BsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpCi0gICAgOiBtUXVldWVTdGFydGVkKGZhbHNlKSwKLSAgICAgIG1UaW1lU291cmNlKE5VTEwpLAotICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcoZmFsc2UpLAotICAgICAgbUF1ZGlvUGxheWVyKE5VTEwpLAotICAgICAgbURpc3BsYXlXaWR0aCgwKSwKLSAgICAgIG1EaXNwbGF5SGVpZ2h0KDApLAotICAgICAgbUZsYWdzKDApLAotICAgICAgbUV4dHJhY3RvckZsYWdzKDApLAotICAgICAgbVZpZGVvQnVmZmVyKE5VTEwpLAotICAgICAgbUxhc3RWaWRlb1RpbWVVcygtMSksCi0gICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIocmVuZGVyZXIpLAotICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgoMCksCi0gICAgICBtRnJhbWVSR0JCdWZmZXIoTlVMTCksCi0gICAgICBtRnJhbWVZVVZCdWZmZXIoTlVMTCkgewotCi0gICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7Ci0gICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotCi0gICAgbVZpZGVvUmVuZGVyZXIgPSBOVUxMOwotICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gMDsKLSAgICBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lID0gMDsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSAwOwotICAgIG1OdW1iZXJFZmZlY3RzID0gMDsKLSAgICBtRGVjb2RlZFZpZGVvVHMgPSAwOwotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IDA7Ci0gICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSAwOwotICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCA9IGZhbHNlOwotICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKLQotICAgIG1WaWRlb0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLCAmUHJldmlld1BsYXllcjo6b25WaWRlb0V2ZW50KTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtVmlkZW9MYWdFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgdGhpcywgJlByZXZpZXdQbGF5ZXI6Om9uQ2hlY2tBdWRpb1N0YXR1cyk7Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVN0cmVhbURvbmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25TdHJlYW1Eb25lKTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1Qcm9ncmVzc0NiRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsCi0gICAgICAgICAmUHJldmlld1BsYXllcjo6b25Qcm9ncmVzc0NiRXZlbnQpOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgJlByZXZpZXdQbGF5ZXI6Om9uVXBkYXRlT3ZlcmxheUV2ZW50KTsKLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IChNNHhWU1NfTWVkaWFSZW5kZXJpbmcpTUVESUFfUkVOREVSSU5HX0lOVkFMSUQ7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXNldCgpOwotfQotCi1QcmV2aWV3UGxheWVyOjp+UHJldmlld1BsYXllcigpIHsKLQotICAgIGlmIChtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdG9wKCk7Ci0gICAgfQotCi0gICAgcmVzZXQoKTsKLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcikgewotICAgICAgICBtTmF0aXZlV2luZG93UmVuZGVyZXItPmRlc3Ryb3lSZW5kZXJJbnB1dChtVmlkZW9SZW5kZXJlcik7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyX2woKTsKLSAgICBtQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpjYW5jZWxQbGF5ZXJFdmVudHNfbChib29sIHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1TdHJlYW1Eb25lRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobUNoZWNrQXVkaW9TdGF0dXNFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVZpZGVvTGFnRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgaWYgKHVwZGF0ZVByb2dyZXNzQ2IpIHsKLSAgICAgICAgbVF1ZXVlLmNhbmNlbEV2ZW50KG1Qcm9ncmVzc0NiRXZlbnQtPmV2ZW50SUQoKSk7Ci0gICAgICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzZXREYXRhU291cmNlX2wocGF0aCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKSB7Ci0gICAgcmVzZXRfbCgpOwotCi0gICAgbVVyaSA9IHBhdGg7Ci0KLSAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwotICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgotICAgIC8vIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKSB7Ci0gICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKLSAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZVZpZGVvICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldFZpZGVvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKLSAgICAgICAgICAgICAgICAvLyBPbmx5IGRvIHRoaXMgZm9yIHZvcmJpcyBhdWRpbywgbm9uZSBvZiB0aGUgb3RoZXIgYXVkaW8KLSAgICAgICAgICAgICAgICAvLyBmb3JtYXRzIGV2ZW4gc3VwcG9ydCB0aGlzIHJpbmd0b25lIHNwZWNpZmljIGhhY2sgYW5kCi0gICAgICAgICAgICAgICAgLy8gcmV0cmlldmluZyB0aGUgbWV0YWRhdGEgb24gc29tZSBleHRyYWN0b3JzIG1heSB0dXJuIG91dAotICAgICAgICAgICAgICAgIC8vIHRvIGJlIHZlcnkgZXhwZW5zaXZlLgotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3A7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVNZXRhLT5maW5kSW50MzIoa0tleUF1dG9Mb29wLCAmbG9vcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsb29wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVVE9fTE9PUElORzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBZGQgdGhlIHN1cHBvcnQgZm9yIER1bW15IGF1ZGlvKi8KLSAgICBpZiggIWhhdmVBdWRpbyApewotICAgICAgICBtQXVkaW9UcmFjayA9IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgzMjAwMCwgMiwgMjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICAgICAgaWYobUF1ZGlvVHJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghaGF2ZUF1ZGlvICYmICFoYXZlVmlkZW8pIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUV4dHJhY3RvckZsYWdzID0gZXh0cmFjdG9yLT5mbGFncygpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sX2pwZygpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZV9sX2pwZyIpOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBtQXVkaW9Tb3VyY2UgPSBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoMzIwMDAsIDIsIDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLSAgICBpZihtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzZXRBdWRpb1NvdXJjZShtQXVkaW9Tb3VyY2UpOwotICAgIH0KLSAgICBzdGF0dXNfdCBlcnJvciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkVycm9yIHN0YXJ0aW5nIGR1bW15IGF1ZGlvIHNvdXJjZSIpOwotICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IChtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSoxMDAwTEw7Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBEdW1teVZpZGVvU291cmNlOjpDcmVhdGUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1cmF0aW9uVXMsIG1VcmkpOwotCi0gICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgIHNldFZpZGVvU291cmNlKG1WaWRlb1NvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZXJyMSA9IG1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLSAgICBpZiAoZXJyMSAhPSBPSykgewotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtSXNWaWRlb1NvdXJjZUpwZyA9IHRydWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0X2woKSB7Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKLQotICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0Ci0gICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKLSAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQotICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KLSAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCi0gICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKLSAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KLSAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgIH0KLSAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLQotICAgIG1UaW1lU291cmNlID0gTlVMTDsKLQotICAgIC8vU2luZ2xlIGF1ZGlvIHBsYXllciBpbnN0YW5jZSB1c2VkCi0gICAgLy9TbyBkb25vdCBkZWxldGUgaXQgaGVyZQotICAgIC8vSXQgaXMgZGVsZXRlZCBmcm9tIFByZXZpZXdDb250cm9sbGVyIGNsYXNzCi0gICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICBpZiAobVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAgICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQotICAgICAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICAgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKLSAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOwotICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7Ci0gICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAtMTsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgbUlzVmlkZW9Tb3VyY2VKcGcgPSBmYWxzZTsKLSAgICBtRnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIGlmKG1GcmFtZVlVVkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUZyYW1lWVVWQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lWVVWQnVmZmVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXkoKSB7Ci0gICAgQUxPR1YoInBsYXkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLSAgICBtRmxhZ3MgJj0gfklORk9STUVEX0FWX0VPUzsKLSAgICByZXR1cm4gcGxheV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnN0YXJ0QXVkaW9QbGF5ZXJfbCgpIHsKLSAgICBBTE9HVigic3RhcnRBdWRpb1BsYXllcl9sIik7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSk7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKSB7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotCi0gICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgc3RhcnRlZCB0aGUgTWVkaWFTb3VyY2UgaW4gb3JkZXIgdG8gZW5hYmxlCi0gICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotCi0gICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllciIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQ0hFQ0soIShtRmxhZ3MgJiBQTEFZSU5HKSk7Ci0gICAgbUF1ZGlvUGxheWVyID0gYXVkaW9QbGF5ZXI7Ci0KLSAgICBBTE9HVigiU2V0QXVkaW9QbGF5ZXIiKTsKLSAgICBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgbmV3IGFuZCBvbGQgc291cmNlIGFyZSBkdW1teQotICAgIHNwPE1lZGlhU291cmNlPiBhbkF1ZGlvU291cmNlID0gbUF1ZGlvUGxheWVyLT5nZXRTb3VyY2UoKTsKLSAgICBpZiAoYW5BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0LgotICAgICAgICBBTE9HVigic2V0QXVkaW9QbGF5ZXI6IEF1ZGlvIHBsYXllciBkb2VzIG5vdCBoYXZlIGFueSBzb3VyY2Ugc2V0Iik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBJZiBuZXcgdmlkZW8gc291cmNlIGlzIG5vdCBkdW1teSwgdGhlbiBhbHdheXMgY2hhbmdlIHNvdXJjZQotICAgIC8vIEVsc2UgYXVkaW8gcGxheWVyIGNvbnRpbnVlcyB1c2luZyBvbGQgYXVkaW8gc291cmNlIGFuZCB0aGVyZSBhcmUKLSAgICAvLyBmcmFtZSBkcm9wcyB0byBtYWludGFpbiBBViBzeW5jCi0gICAgc3A8TWV0YURhdGE+IG1ldGE7Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICBjb25zdCBjaGFyICpwVmlkU3JjVHlwZTsKLSAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFZpZFNyY1R5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKHBWaWRTcmNUeXBlLCAiRHVtbXlWaWRlb1NvdXJjZSIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIFZpZGVvIGNsaXAgd2l0aCBzaWxlbnQgYXVkaW87IG5lZWQgdG8gY2hhbmdlIHNvdXJjZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKnBTcmNUeXBlMTsKLSAgICBjb25zdCBjaGFyICpwU3JjVHlwZTI7Ci0gICAgbWV0YSA9IGFuQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFNyY1R5cGUxKSkgewotICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMSwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICBtZXRhID0gbUF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJnBTcmNUeXBlMikpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHBTcmNUeXBlMiwgIkR1bW15QXVkaW9Tb3VyY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qgc2V0IHRoZSBuZXcgcGxheSBkdXJhdGlvbiBmb3IgdGhlIGV4aXN0aW5nIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZSAqcE1lZGlhU3JjID0gYW5BdWRpb1NvdXJjZS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgRHVtbXlBdWRpb1NvdXJjZSAqcER1bW15QXVkaW9Tb3VyY2UgPSAoRHVtbXlBdWRpb1NvdXJjZSopcE1lZGlhU3JjOwotICAgICAgICAgICAgICAgICAgICAvL0luY3JlbWVudCB0aGUgZHVyYXRpb24gb2YgYXVkaW8gc291cmNlCi0gICAgICAgICAgICAgICAgICAgIHBEdW1teUF1ZGlvU291cmNlLT5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSgobVBsYXlFbmRUaW1lTXNlYykqMTAwMExMKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgbmV3IGF1ZGlvIHNvdXJjZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBjb250aW51ZSB1c2luZyBvbGQgc291cmNlCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllcjogc3RvcCBuZXcgYXVkaW8gc291cmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUoKSB7Ci0gICAgQUxPR1YoIm9uU3RyZWFtRG9uZSIpOwotICAgIC8vIFBvc3RlZCB3aGVuZXZlciBhbnkgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcuCi0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVN0cmVhbURvbmVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR1YoIk1FRElBX0VSUk9SICVkIiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKLQotICAgICAgICBwYXVzZV9sKHRydWUgLyogYXQgZW9zICovKTsKLQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgYm9vbCBhbGxEb25lID0KLSAgICAgICAgKG1WaWRlb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKQotICAgICAgICAgICAgJiYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpKTsKLQotICAgIGlmICghYWxsRG9uZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIChMT09QSU5HIHwgQVVUT19MT09QSU5HKSkgewotICAgICAgICBzZWVrVG9fbCgwKTsKLQotICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAvL3BhdXNlIGJlZm9yZSBzZW5kaW5nIGV2ZW50Ci0gICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwotCi0gICAgICAgIC8vVGhpcyBsb2NrIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrQ29udHJvbCk7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSBQcmV2aWV3UGxheWVyIG9ubHkgbm90aWZpZXMgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgb25jZSBmb3IgZWFjaCBjbGlwIQotICAgICAgICAgKiBJdCBoYXBwZW5zIHR3aWNlIGluIGZvbGxvd2luZyBzY2VuYXJpby4KLSAgICAgICAgICogVG8gbWFrZSB0aGUgY2xpcHMgaW4gcHJldmlldyBzdG9yeWJvYXJkIGFyZSBwbGF5ZWQgYW5kIHN3aXRjaGVkIHNtb290aGx5LAotICAgICAgICAgKiBQcmV2aWV3Q29udHJvbGxlciB1c2VzIHR3byBQcmV2aWV3UGxheWVyIGluc3RhbmNlcyBhbmQgb25lIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBUaGUgdHdvIFByZXZpZXdQbGF5ZXIgdXNlIHRoZSBzYW1lIEF1ZGlvUGxheWVyIHRvIHBsYXkgdGhlIGF1ZGlvLAotICAgICAgICAgKiBhbmQgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2Ugb2YgdGhlIEF1ZGlvUGxheWVyLgotICAgICAgICAgKiBJZiB0aGUgYXVkaW8gc291cmNlIG9mIGN1cnJlbnQgcGxheWluZyBjbGlwIGFuZCBuZXh0IGNsaXAgYXJlIGR1bW15Ci0gICAgICAgICAqIGF1ZGlvIHNvdXJjZShpbWFnZSBvciB2aWRlbyB3aXRob3V0IGF1ZGlvKSwgaXQgd2lsbCBub3QgY2hhbmdlIHRoZSBhdWRpbyBzb3VyY2UKLSAgICAgICAgICogdG8gYXZvaWQgdGhlICJhdWRpbyBnbGl0Y2giLCBhbmQga2VlcCB1c2luZyB0aGUgY3VycmVudCBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAqIFdoZW4gdGhlIHZpZGVvIG9mIGN1cnJlbnQgY2xpcCByZWFjaGVkIHRoZSBFT1MsIFByZXZpZXdQbGF5ZXIgd2lsbCBzZXQgRU9TIGZsYWcKLSAgICAgICAgICogZm9yIHZpZGVvIGFuZCBhdWRpbywgYW5kIGl0IHdpbGwgbm90aWZ5IE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLgotICAgICAgICAgKiBCdXQgdGhlIGF1ZGlvKGR1bW15IGF1ZGlvIHNvdXJjZSkgaXMgc3RpbGwgcGxheWluZyhmb3IgbmV4dCBjbGlwKSwKLSAgICAgICAgICogYW5kIHdoZW4gaXQgcmVhY2hlZCB0aGUgRU9TLCBhbmQgdmlkZW8gcmVhY2hlZCBFT1MsCi0gICAgICAgICAqIFByZXZpZXdQbGF5ZXIgd2lsbCBub3RpZnkgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUgYWdhaW4uICovCi0gICAgICAgIGlmICghKG1GbGFncyAmIElORk9STUVEX0FWX0VPUykpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOwotICAgICAgICAgICAgbUZsYWdzIHw9IElORk9STUVEX0FWX0VPUzsKLSAgICAgICAgfQotICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOwotICAgICAgICBBTE9HVigib25TdHJlYW1Eb25lIGVuZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBsYXlfbCgpIHsKLSAgICBBTE9HVigicGxheV9sIik7Ci0KLSAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLQotICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgbVN0YXJ0TmV4dFBsYXllciA9IGZhbHNlOwotCi0gICAgaWYgKCEobUZsYWdzICYgUFJFUEFSRUQpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHByZXBhcmVfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUExBWUlORzsKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0KLSAgICBib29sIGRlZmVycmVkQXVkaW9TZWVrID0gZmFsc2U7Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtQXVkaW9TaW5rLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldFNvdXJjZShtQXVkaW9Tb3VyY2UpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0gICAgICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcHJlZmV0Y2hlciB0byByZWFkIGl0cyBkYXRhLgotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1BsYXllci0+c3RhcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgLy9kZWxldGUgbUF1ZGlvUGxheWVyOwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICAgICAgZGVmZXJyZWRBdWRpb1NlZWsgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbCBpc0F1ZGlvUGxheWVyU3RhcnRlZCA9IG1BdWRpb1BsYXllci0+aXNTdGFydGVkKCk7Ci0KLSAgICAgICAgICAgIGlmIChtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZCA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBsYXlfbDogQ2hhbmdlIGF1ZGlvIHNvdXJjZSByZXF1aXJlZCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTLCBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzQXVkaW9QbGF5ZXJTdGFydGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGxheV9sOiBObyBTb3VyY2UgY2hhbmdlIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19SVU5OSU5HOwotICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7Ci0gICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1UaW1lU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgbVRpbWVTb3VyY2UgPSAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBzZWVrIG9wdGlvbiBmb3IgSW1hZ2Ugc291cmNlIGZpbGVzIGFuZCByZWFkLgotICAgIC8vIFRoaXMgcmVzZXRzIHRoZSB0aW1lc3RhbXBpbmcgZm9yIGltYWdlIHBsYXkKLSAgICBpZiAobUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIE1lZGlhQnVmZmVyICphTG9jYWxCdWZmZXI7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLSAgICAgICAgbVZpZGVvU291cmNlLT5yZWFkKCZhTG9jYWxCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgYUxvY2FsQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIEtpY2sgb2ZmIHZpZGVvIHBsYXliYWNrCi0gICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVmZXJyZWRBdWRpb1NlZWspIHsKLSAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgc2VlayByZXF1ZXN0IHdoaWxlIHdlIHdlcmUgcGF1c2VkCi0gICAgICAgIC8vIGFuZCB3ZSdyZSBqdXN0IHN0YXJ0aW5nIHVwIGFnYWluLCBob25vciB0aGUgcmVxdWVzdCBub3cuCi0gICAgICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgQVRfRU9TKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBiZWhhdmlvdXIsIGlmIGEgc3RyZWFtIGZpbmlzaGVzIHBsYXlpbmcgYW5kIHRoZW4KLSAgICAgICAgLy8gaXMgc3RhcnRlZCBhZ2Fpbiwgd2UgcGxheSBmcm9tIHRoZSBzdGFydC4uLgotICAgICAgICBzZWVrVG9fbCgwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFJlbmRlcmVyX2woKSB7Ci0gICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXIgPSBtTmF0aXZlV2luZG93UmVuZGVyZXItPmNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKChtRXh0cmFjdG9yRmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspIHx8IChtSXNWaWRlb1NvdXJjZUpwZykpIHsKLSAgICAgICAgcmV0dXJuIHNlZWtUb19sKHRpbWVVcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldFZpZGVvRGltZW5zaW9ucygKLSAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgKndpZHRoID0gbVZpZGVvV2lkdGg7Ci0gICAgKmhlaWdodCA9IG1WaWRlb0hlaWdodDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0QXVkaW9EZWNvZGVyX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewotICAgICAgICBtQXVkaW9Tb3VyY2UgPSBtQXVkaW9UcmFjazsKLSAgICB9IGVsc2UgewotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gYVJhd1NvdXJjZTsKLSAgICAgICAgYVJhd1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBjcmVhdGVFbmNvZGVyCi0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2spOwotCi0gICAgICAgIGlmKGFSYXdTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gbmV3IFZpZGVvRWRpdG9yU1JDKGFSYXdTb3VyY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKSkgewotICAgICAgICAvLyBGb3IgbGVnYWN5IHJlYXNvbnMgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGlnbm9yZSB0aGUgYWJzZW5jZQotICAgICAgICAvLyBvZiBhbiBhdWRpbyBkZWNvZGVyIGZvciBRQ0VMUCBpbnN0ZWFkIG9mIGFib3J0aW5nIHBsYXliYWNrCi0gICAgICAgIC8vIGFsdG9nZXRoZXIuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUF1ZGlvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRWaWRlb0RlY29kZXJfbCh1aW50MzJfdCBmbGFncykgewotICAgIGluaXRSZW5kZXJlcl9sKCk7Ci0KLSAgICBpZiAobVZpZGVvUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZW5kZXJlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLAotICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICBtVmlkZW9UcmFjaywKLSAgICAgICAgICAgIE5VTEwsIGZsYWdzLCBtVmlkZW9SZW5kZXJlci0+Z2V0VGFyZ2V0V2luZG93KCkpOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICBzZXREdXJhdGlvbl9sKGR1cmF0aW9uVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9FdmVudCgpIHsKLSAgICB1aW50MzJfdCBpPTA7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIGludDY0X3QgaW1hZ2VGcmFtZVRpbWVVcyA9IDA7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIC8vIFRoZSBldmVudCBoYXMgYmVlbiBjYW5jZWxsZWQgaW4gcmVzZXRfbCgpIGJ1dCBoYWQgYWxyZWFkeQotICAgICAgICAvLyBiZWVuIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGF0IHRoYXQgdGltZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpIHsKLSAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUaW1lU291cmNlICp0c19zdCA9ICAmbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgaW50NjRfdCB0aW1lU3RhcnRVcyA9IHRzX3N0LT5nZXRSZWFsVGltZVVzKCk7Ci0KLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotCi0gICAgICAgIGlmKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlZWsgdGhlIHZpZGVvIHNvdXJjZSBmaXJzdCwgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzb3VyY2UuCi0gICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBqdW1wcyBpbiB0aGUgRGF0YVNvdXJjZSBvZmZzZXQgY2F1c2VkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gY29kZWMgcHJlZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBvbGQgbG9jYXRpb25zCi0gICAgICAgICAgICAvLyB3aGlsZSB0aGUgdmlkZW8gY29kZWMgaXMgYWxyZWFkeSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV3Ci0gICAgICAgICAgICAvLyBsb2NhdGlvbnMsIHdlJ2xsICJwYXVzZSIgdGhlIGF1ZGlvIHNvdXJjZSwgY2F1c2luZyBpdCB0bwotICAgICAgICAgICAgLy8gc3RvcCByZWFkaW5nIGlucHV0IGRhdGEgdW50aWwgYSBzdWJzZXF1ZW50IHNlZWsuCi0KLSAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5BVURJT19SVU5OSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIHNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1WaWRlb0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiBWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2l6ZVRvUmVuZGVyKG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU28gdmlkZW8gcGxheWJhY2sgaXMgY29tcGxldGUsIGJ1dCB3ZSBtYXkgc3RpbGwgaGF2ZQotICAgICAgICAgICAgICAgIC8vIGEgc2VlayByZXF1ZXN0IHBlbmRpbmcgdGhhdCBuZWVkcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBzdHJlYW0gZW5kZWQgd2hpbGUgc2Vla2luZyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KC0xKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IEVPUyByZWFjaGVkLiIpOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbURlY29kZWRWaWRlb1RzID0gKG1QbGF5RW5kVGltZU1zZWMqMTAwMExMKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVmlkZW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTb21lIGRlY29kZXJzLCBub3RhYmx5IHRoZSBQViBBVkMgc29mdHdhcmUgZGVjb2RlcgotICAgICAgICAgICAgICAgIC8vIHJldHVybiBzcHVyaW91cyBlbXB0eSBidWZmZXJzIHRoYXQgd2UganVzdCB3YW50IHRvIGlnbm9yZS4KLQotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgdmlkZW9UaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ2aWRlb1RpbWVVcykpOwotCi0gICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgIGlmICh2aWRlb1RpbWVVcyA8IG1TZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBzZWVrIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZyYW1lcyBhcmUgYmVmb3JlIGJlZ2luIGN1dCB0aW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIERvbm90IHJlbmRlcgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtTnVtYmVyRGVjVmlkZW9GcmFtZXMrKzsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIHNldFBvc2l0aW9uX2wodGltZVVzKTsKLQotICAgIGlmICghbVN0YXJ0TmV4dFBsYXllcikgewotICAgICAgICBpbnQ2NF90IHBsYXliYWNrVGltZVJlbWFpbmluZyA9IChtUGxheUVuZFRpbWVNc2VjICogMTAwMExMKSAtIHRpbWVVczsKLSAgICAgICAgaWYgKHBsYXliYWNrVGltZVJlbWFpbmluZyA8PSAxNTAwMDAwKSB7Ci0gICAgICAgICAgICAvL1doZW4gbGVzcyB0aGFuIDEuNSBzZWMgb2YgcGxheWJhY2sgbGVmdAotICAgICAgICAgICAgLy8gc2VuZCBub3RpZmljYXRpb24gdG8gc3RhcnQgbmV4dCBwbGF5ZXIKLQotICAgICAgICAgICAgbVN0YXJ0TmV4dFBsYXllciA9IHRydWU7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QUFBQUFBQUEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2Vla1R5cGUgd2FzU2Vla2luZyA9IG1TZWVraW5nOwotICAgIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeSh0aW1lVXMpOwotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAhKG1GbGFncyAmIChBVURJT19SVU5OSU5HKSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJTdGFydGluZyB0aGUgYXVkaW8gcGxheWVyIGZhaWxlZCB3LyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwotCi0gICAgaWYodHMgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmKCFtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7Ci0KLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwotICAgICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT19BVF9FT1MpICYmIG1BdWRpb1BsYXllciAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwotCi0gICAgICAgIGludDY0X3QgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwotCi0gICAgICAgIGlmICh3YXNTZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KLSAgICAgICAgICAgIGxhdGVuZXNzVXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBdWRpbyB0aW1lIHN0YW1wID0gJWxsZCBhbmQgdmlkZW8gdGltZSBzdGFtcCA9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy0+Z2V0UmVhbFRpbWVVcygpLHRpbWVVcyk7Ci0gICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0KLSAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgd2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2KTsKLQotICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXRlbmVzc1VzIDwgLTI1MDAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseS4KLSAgICAgICAgICAgIEFMT0dWKCJXZSdyZSBtb3JlIHRoYW4gMjVtcyBlYXJseSwgbGF0ZW5lc3MgJWxsZCIsIGxhdGVuZXNzVXMpOwotCi0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDI1MDAwKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlcklzUHJldmlldyB8fCBtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aW1lc3RhbXAgZXhjZWVkcyBlbmRDdXRUaW1lIG9mIGNsaXAsIGRvbm90IHJlbmRlcgotICAgIGlmKCh0aW1lVXMvMTAwMCkgPiBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBBTE9HVigiUHJldmlld1BsYXllcjogb25WaWRlb0V2ZW50IHRpbWVVcyA+IG1QbGF5RW5kVGltZTsgc2VuZCBFT1MuLiIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gQ2FwdHVyZSB0aGUgZnJhbWUgdGltZXN0YW1wIHRvIGJlIHJlbmRlcmVkCi0gICAgbURlY29kZWRWaWRlb1RzID0gdGltZVVzOwotCi0gICAgLy8gUG9zdCBwcm9jZXNzaW5nIHRvIGFwcGx5IHZpZGVvIGVmZmVjdHMKLSAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGVmZmVjdCBzdGFydHRpbWUgbWF0Y2hlcyB0aGUgY2xpcCBiZWluZyBwcmV2aWV3ZWQKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCAobURlY1ZpZGVvVHNTdG9yeUJvYXJkLzEwMDApKSB8fAotICAgICAgICAobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PQotICAgICAgICAgKChtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCkgKyBtUGxheUVuZFRpbWVNc2VjIC0gbVBsYXlCZWdpblRpbWVNc2VjKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGlmIGVmZmVjdCBhcHBsaWVzIHRvIHRoaXMgcGFydGljdWxhciBmcmFtZSB0aW1lc3RhbXAKLSAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0KLSAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpICYmCi0gICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgICgoKHRpbWVVcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpCi0gICAgICAgICAgICAgICYmIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24gIT0gMCkpIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1Byb3ZpZGUgdGhlIG92ZXJsYXkgVXBkYXRlIGluZGljYXRpb24gd2hlbiB0aGVyZSBpcyBhbiBvdmVybGF5IGVmZmVjdAotICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+VklERU9fRUZGRUNUX0ZSQU1JTkc7IC8vbmV2ZXIgYXBwbHkgZnJhbWluZyBoZXJlLgotICAgICAgICBpZiAoIW1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4OwotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbU51bWJlckVmZmVjdHM7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU1zID0gbURlY29kZWRWaWRlb1RzLzEwMDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQgPSBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMDsKLSAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2luZGV4XS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUpTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSArIDEpIDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lTXMgKyB0aW1lT2Zmc2V0IC0gbVBsYXlCZWdpblRpbWVNc2VjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSAtIDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyArIHRpbWVPZmZzZXQgLSBtUGxheUJlZ2luVGltZU1zZWMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleCA8IG1OdW1iZXJFZmZlY3RzKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiRnJhbWluZyBpbmRleCA9ICVsZCIsIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5vIGZyYW1pbmcgZWZmZWN0cyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQpIHsKLSAgICAgICAgLy9Qb3N0IHRoZSBldmVudCB3aGVuIHRoZSBvdmVybGF5IGlzIG5vIG1vcmUgdmFsaWQKLSAgICAgICAgQUxPR1YoIk92ZXJsYXkgaXMgRG9uZSIpOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT5yZW5kZXIobVZpZGVvQnVmZmVyLCBtQ3VycmVudFZpZGVvRWZmZWN0LAotICAgICAgICAgICAgICAgIG1SZW5kZXJpbmdNb2RlLCBtSXNWaWRlb1NvdXJjZUpwZyk7Ci0gICAgfQotCi0gICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLQotICAgIC8vIFBvc3QgcHJvZ3Jlc3MgY2FsbGJhY2sgYmFzZWQgb24gY2FsbGJhY2sgaW50ZXJ2YWwgc2V0Ci0gICAgaWYobU51bWJlckRlY1ZpZGVvRnJhbWVzID49IG1Qcm9ncmVzc0NiSW50ZXJ2YWwpIHsKLSAgICAgICAgcG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCk7Ci0gICAgICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcyA9IDA7ICAvLyByZXNldCBjb3VudGVyCi0gICAgfQotCi0gICAgLy8gaWYgcmVhY2hlZCBFbmRDdXRUaW1lIG9mIGNsaXAsIHBvc3QgRU9TIGV2ZW50Ci0gICAgaWYoKHRpbWVVcy8xMDAwKSA+PSBtUGxheUVuZFRpbWVNc2VjKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TLiIpOwotICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIFNldCB0aGUgbGFzdCBkZWNvZGVkIHRpbWVzdGFtcCB0byBkdXJhdGlvbgotICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgJiYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIW1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgzMzAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmUoKSB7Ci0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwcmVwYXJlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZV9sKCkgewotICAgIEFMT0dWKCJwcmVwYXJlX2wiKTsKLSAgICBpZiAobUZsYWdzICYgUFJFUEFSRUQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbUlzQXN5bmNQcmVwYXJlID0gZmFsc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gcHJlcGFyZUFzeW5jX2woKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVByZXBhcmVSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcHJlcGFyZUFzeW5jX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZUFzeW5jX2woKSB7Ci0gICAgQUxPR1YoInByZXBhcmVBc3luY19sIik7Ci0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIGFzeW5jIHByZXBhcmUgYWxyZWFkeSBwZW5kaW5nCi0gICAgfQotCi0gICAgaWYgKCFtUXVldWVTdGFydGVkKSB7Ci0gICAgICAgIG1RdWV1ZS5zdGFydCgpOwotICAgICAgICBtUXVldWVTdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCk7Ci0KLSAgICBtUXVldWUucG9zdEV2ZW50KG1Bc3luY1ByZXBhcmVFdmVudCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmZpbmlzaFNldERhdGFTb3VyY2VfbCgpIHsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7Ci0KLSAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCBOVUxMKTsKLQotICAgIGlmIChkYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgLy9JZiBmaWxlIHR5cGUgaXMgLnJnYiwgdGhlbiBubyBuZWVkIHRvIGNoZWNrIGZvciBFeHRyYWN0b3IKLSAgICBpbnQgdXJpTGVuID0gc3RybGVuKG1VcmkpOwotICAgIGludCBzdGFydE9mZnNldCA9IHVyaUxlbiAtIDQ7Ci0gICAgaWYoIXN0cm5jYXNlY21wKG1Vcmkrc3RhcnRPZmZzZXQsICIucmdiIiwgNCkpIHsKLSAgICAgICAgZXh0cmFjdG9yID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOwotICAgIH0KLQotICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZmluaXNoU2V0RGF0YVNvdXJjZV9sOiBmYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciIpOwotICAgICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIH0KLQotICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZUFzeW5jRXZlbnQiKTsKLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgewotICAgICAgICBBTE9HVigicHJlcGFyZSB3YXMgY2FuY2VsbGVkIGJlZm9yZSBkb2luZyBhbnl0aGluZyIpOwotICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVVyaS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFZpZGVvRGVjb2Rlcl9sKE9NWENvZGVjOjprSGFyZHdhcmVDb2RlY3NPbmx5KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMICYmIG1BdWRpb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRBdWRpb0RlY29kZXJfbCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hBc3luY1ByZXBhcmVfbCgpIHsKLSAgICBBTE9HVigiZmluaXNoQXN5bmNQcmVwYXJlX2wiKTsKLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUFJFUEFSRUQpOwotICAgIH0KLQotICAgIG1QcmVwYXJlUmVzdWx0ID0gT0s7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEKTsKLSAgICBtRmxhZ3MgfD0gUFJFUEFSRUQ7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gTlVMTDsKLSAgICBtUHJlcGFyZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbUxvY2tDb250cm9sLmxvY2soKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZWxlYXNlTG9jaygpIHsKLSAgICBBTE9HVigicmVsZWFzZUxvY2siKTsKLSAgICBtTG9ja0NvbnRyb2wudW5sb2NrKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpIHsKLQotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgbU51bWJlckVmZmVjdHMgPSBuRWZmZWN0czsKLSAgICBtRWZmZWN0c1NldHRpbmdzID0gcEVmZmVjdFNldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6bG9hZEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotCi0gICAgQUxPR1YoImxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSIpOwotICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgIE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlICkgewotCi0gICAgQUxPR1YoInNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtIik7Ci0gICAgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTID0gYXVkaW9NaXhTdG9yeUJvYXJkVFM7Ci0gICAgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSA9IGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZTsKLSAgICBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWUgPSBwcmltYXJ5VHJhY2tWb2xWYWx1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1QbGF5QmVnaW5UaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotCi0gICAgbVBsYXlFbmRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyA9IG1zZWM7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gbVN0b3J5Ym9hcmRTdGFydFRpbWVNc2VjICogMTAwMExMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpIHsKLQotICAgIG1Qcm9ncmVzc0NiSW50ZXJ2YWwgPSBjYkludGVydmFsOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgcmV0dXJuIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICZtT3V0cHV0VmlkZW9XaWR0aCwgJm1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLQotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyAqIDEwMDBMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFByb2dyZXNzQ2FsbGJhY2tFdmVudF9sKCkgewotICAgIGlmIChtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIG1RdWV1ZS5wb3N0RXZlbnQobVByb2dyZXNzQ2JFdmVudCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblByb2dyZXNzQ2JFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmICghbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIC8vIElmIHBsYXliYWNrIHN0YXJ0cyBmcm9tIHByZXZpb3VzIEktZnJhbWUsCi0gICAgLy8gdGhlbiBzZW5kIGZyYW1lIHN0b3J5Ym9hcmQgZHVyYXRpb24KLSAgICBpZiAoKG1EZWNvZGVkVmlkZW9Ucy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsIG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIDAsCi0gICAgICAgICgoKG1EZWNvZGVkVmlkZW9UcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYykpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0T3ZlcmxheVVwZGF0ZUV2ZW50X2woKSB7Ci0gICAgaWYgKG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobU92ZXJsYXlVcGRhdGVFdmVudCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25VcGRhdGVPdmVybGF5RXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50IHVwZGF0ZVN0YXRlID0gbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZD8gMTogMDsKLSAgICBub3RpZnlMaXN0ZW5lcl9sKDB4QkJCQkJCQkIsIHVwZGF0ZVN0YXRlLCBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCk7Ci19Ci0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgdWludDMyX3QgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICAvL01hcCBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHRvIGxvY2FsIGVudW0KLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9QSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfU0VQSUE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05FR0FUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZSQU1JTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXM6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRklGVElFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JBRElFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgLy9JZiBhbHJlYWR5IHNldCwgdGhlbiBubyBuZWVkIHRvIHNldCBhZ2FpbgotICAgICAgICBpZiAoIShtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KSkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCB8PSBlZmZlY3Q7Ci0gICAgICAgICAgICBpZiAoZWZmZWN0ID09IFZJREVPX0VGRkVDVF9GSUZUSUVTKSB7Ci0gICAgICAgICAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlICB7Ci0gICAgICAgIC8vUmVzZXQgb25seSBpZiBhbHJlYWR5IHNldAotICAgICAgICBpZiAobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkgewotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+ZWZmZWN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLHVpbnQzMl90IGhlaWdodCkgewotICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7Ci0gICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cmVhZEZpcnN0VmlkZW9GcmFtZSgpIHsKLSAgICBBTE9HVigicmVhZEZpcnN0VmlkZW9GcmFtZSIpOwotCi0gICAgaWYgKCFtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICBBTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzIC8gMUU2KTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCi0gICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVZpZGVvU291cmNlLT5yZWFkKCZtVmlkZW9CdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENIRUNLKCFtVmlkZW9CdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb1NvdXJjZSBzaWduYWxsZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVfbCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gaW5pdFJlbmRlcmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVZpZGVvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZSBkZWNvZGVycywgbm90YWJseSB0aGUgUFYgQVZDIHNvZnR3YXJlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gc3B1cmlvdXMgZW1wdHkgYnVmZmVycyB0aGF0IHdlIGp1c3Qgd2FudCB0byBpZ25vcmUuCi0KLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHZpZGVvVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdmlkZW9UaW1lVXMpKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKHZpZGVvVGltZVVzLzEwMDApIDwgbVBsYXlCZWdpblRpbWVNc2VjKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBiZWdpbiBjdXQgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKLSAgICBzZXRQb3NpdGlvbl9sKHRpbWVVcyk7Ci0KLSAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7Ci0KLSAgICByZXR1cm4gT0s7Ci0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpIHsKLSAgICAqbGFzdFJlbmRlcmVkVGltZU1zID0gKCgobURlY29kZWRWaWRlb1RzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6dXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgaWYgKG1WaWRlb1JlbmRlcmVyKSB7Ci0gICAgICAgIG1WaWRlb1JlbmRlcmVyLT51cGRhdGVWaWRlb1NpemUobWV0YSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldExpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnJlc2V0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmVzZXRfbCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmNsZWFyX2woKSB7Ci0gICAgbURpc3BsYXlXaWR0aCA9IDA7Ci0gICAgbURpc3BsYXlIZWlnaHQgPSAwOwotCi0gICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKLSAgICAgICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKLQotICAgICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HX0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZywgd2UncmUganVzdCBidWZmZXJpbmcKLSAgICAgICAgICAgIC8vIGVub3VnaCBkYXRhIHRvIHN0YXJ0IHBsYXliYWNrLCB3ZSBjYW4gc2FmZWx5IGludGVycnVwdCB0aGF0LgotICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKHRydWUpOwotCi0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICBtVmlkZW9UcmFjay5jbGVhcigpOwotCi0gICAgLy8gU2h1dGRvd24gYXVkaW8gZmlyc3QsIHNvIHRoYXQgdGhlIHJlc3BvbmUgdG8gdGhlIHJlc2V0IHJlcXVlc3QKLSAgICAvLyBhcHBlYXJzIHRvIGhhcHBlbiBpbnN0YW50YW5lb3VzbHkgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAotICAgIC8vIElmIHdlIGRpZCB0aGlzIGxhdGVyLCBhdWRpbyB3b3VsZCBjb250aW51ZSBwbGF5aW5nIHdoaWxlIHdlCi0gICAgLy8gc2h1dGRvd24gdGhlIHZpZGVvLXJlbGF0ZWQgcmVzb3VyY2VzIGFuZCB0aGUgcGxheWVyIGFwcGVhciB0bwotICAgIC8vIG5vdCBiZSBhcyByZXNwb25zaXZlIHRvIGEgcmVzZXQgcmVxdWVzdC4KLSAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gSWYgd2UgaGFkIGFuIGF1ZGlvIHBsYXllciwgaXQgd291bGQgaGF2ZSBlZmZlY3RpdmVseQotICAgICAgICAvLyB0YWtlbiBwb3NzZXNzaW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHN0b3BwZWQgaXQgd2hlbgotICAgICAgICAvLyBfaXRfIGlzIHN0b3BwZWQuIE90aGVyd2lzZSB0aGlzIGlzIHN0aWxsIG91ciByZXNwb25zaWJpbGl0eS4KLSAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgfQotICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotCi0gICAgbVRpbWVTb3VyY2UgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1BdWRpb1BsYXllcjsKLSAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IC0xOwotICAgIG1GbGFncyA9IDA7Ci0gICAgbUV4dHJhY3RvckZsYWdzID0gMDsKLSAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwotICAgIG1WaWRlb1RpbWVVcyA9IDA7Ci0KLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotCi0gICAgbVVyaS5zZXRUbygiIik7Ci0KLSAgICBtQml0cmF0ZSA9IC0xOwotICAgIG1MYXN0VmlkZW9UaW1lVXMgPSAtMTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewotICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLQotICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChtc2csIGV4dDEsIGV4dDIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVmlkZW9MYWdVcGRhdGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1WaWRlb0xhZ0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0xhZ0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaW50NjRfdCBhdWRpb1RpbWVVcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICBpbnQ2NF90IHZpZGVvTGF0ZUJ5VXMgPSBhdWRpb1RpbWVVcyAtIG1WaWRlb1RpbWVVczsKLQotICAgIGlmICghKG1GbGFncyAmIFZJREVPX0FUX0VPUykgJiYgdmlkZW9MYXRlQnlVcyA+IDMwMDAwMGxsKSB7Ci0gICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgbXMuIiwgdmlkZW9MYXRlQnlVcyAvIDEwMDBsbCk7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9JTkZPLAotICAgICAgICAgICAgICAgIE1FRElBX0lORk9fVklERU9fVFJBQ0tfTEFHR0lORywKLSAgICAgICAgICAgICAgICB2aWRlb0xhdGVCeVVzIC8gMTAwMGxsKTsKLSAgICB9Ci0KLSAgICBwb3N0VmlkZW9MYWdFdmVudF9sKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6bm90aWZ5VmlkZW9TaXplX2woKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotCi0gICAgaW50MzJfdCB2V2lkdGgsIHZIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJnZXaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdkhlaWdodCkpOwotCi0gICAgbUdpdmVuV2lkdGggPSB2V2lkdGg7Ci0gICAgbUdpdmVuSGVpZ2h0ID0gdkhlaWdodDsKLQotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LCAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpIHsKLQotICAgICAgICBjcm9wTGVmdCA9IGNyb3BUb3AgPSAwOwotICAgICAgICBjcm9wUmlnaHQgPSB2V2lkdGggLSAxOwotICAgICAgICBjcm9wQm90dG9tID0gdkhlaWdodCAtIDE7Ci0KLSAgICAgICAgQUxPR0QoImdvdCBkaW1lbnNpb25zIG9ubHkgJWQgeCAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIG1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgbUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIG1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIG1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgaW50MzJfdCBkaXNwbGF5V2lkdGg7Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSB3aWR0aCBjaGFuZ2VkICglZD0+JWQpIiwgbURpc3BsYXlXaWR0aCwgZGlzcGxheVdpZHRoKTsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGRpc3BsYXlXaWR0aDsKLSAgICB9Ci0gICAgaW50MzJfdCBkaXNwbGF5SGVpZ2h0OwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KSkgewotICAgICAgICBBTE9HVigiRGlzcGxheSBoZWlnaHQgY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5SGVpZ2h0LCBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3QgdXNhYmxlV2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaW50MzJfdCB1c2FibGVIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7Ci0gICAgaWYgKG1EaXNwbGF5V2lkdGggIT0gMCkgewotICAgICAgICB1c2FibGVXaWR0aCA9IG1EaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGlmIChtRGlzcGxheUhlaWdodCAhPSAwKSB7Ci0gICAgICAgIHVzYWJsZUhlaWdodCA9IG1EaXNwbGF5SGVpZ2h0OwotICAgIH0KLQotICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmICghbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAga0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVIZWlnaHQsIHVzYWJsZVdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCB1c2FibGVXaWR0aCwgdXNhYmxlSGVpZ2h0KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBhdXNlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotCi0gICAgcmV0dXJuIHBhdXNlX2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGF1c2VfbChib29sIGF0X2VvcykgewotICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCgpOwotCi0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgewotICAgICAgICBpZiAoYXRfZW9zKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBwbGF5ZWQgdGhlIGF1ZGlvIHN0cmVhbSB0byBjb21wbGV0aW9uIHdlCi0gICAgICAgICAgICAvLyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBzYW1wbGVzIHJlbWFpbmluZyBpbiB0aGUgYXVkaW8KLSAgICAgICAgICAgIC8vIHRyYWNrJ3MgcXVldWUgYXJlIHBsYXllZCBvdXQuCi0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKHRydWUgLyogcGxheVBlbmRpbmdTYW1wbGVzICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKLSAgICB9Ci0KLSAgICBtRmxhZ3MgJj0gflBMQVlJTkc7Ci0gICAgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBQcmV2aWV3UGxheWVyOjppc1BsYXlpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChtRmxhZ3MgJiBQTEFZSU5HKSB8fCAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHNldE5hdGl2ZVdpbmRvd19sKHN1cmZhY2UpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNldE5hdGl2ZVdpbmRvd19sKG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKSk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNodXRkb3duVmlkZW9EZWNvZGVyX2woKSB7Ci0gICAgaWYgKG1WaWRlb0J1ZmZlcikgewotICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtVmlkZW9Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgIHdoaWxlICh0bXAucHJvbW90ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgdXNsZWVwKDEwMDApOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0TmF0aXZlV2luZG93X2woY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZSkgewotICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmU7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dJKCJhdHRlbXB0aW5nIHRvIHJlY29uZmlndXJlIHRvIHVzZSBuZXcgc3VyZmFjZSIpOwotCi0gICAgYm9vbCB3YXNQbGF5aW5nID0gKG1GbGFncyAmIFBMQVlJTkcpICE9IDA7Ci0KLSAgICBwYXVzZV9sKCk7Ci0KLSAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0KLSAgICBDSEVDS19FUShpbml0VmlkZW9EZWNvZGVyX2woKSwgKHN0YXR1c190KU9LKTsKLQotICAgIGlmIChtTGFzdFZpZGVvVGltZVVzID49IDApIHsKLSAgICAgICAgbVNlZWtpbmcgPSBTRUVLOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgICAgICBtU2Vla1RpbWVVcyA9IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0gICAgfQotCi0gICAgaWYgKHdhc1BsYXlpbmcpIHsKLSAgICAgICAgcGxheV9sKCk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvU2luaygKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUF1ZGlvU2luayA9IGF1ZGlvU2luazsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzID0gbUZsYWdzICYgfkxPT1BJTkc7Ci0KLSAgICBpZiAoc2hvdWxkTG9vcCkgewotICAgICAgICBtRmxhZ3MgfD0gTE9PUElORzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpIHsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgewotICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTAotICAgICAgICAgICAgJiYgKG1BdWRpb1BsYXllciA9PSBOVUxMIHx8ICEobUZsYWdzICYgVklERU9fQVRfRU9TKSkpIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtVmlkZW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lVXMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcG9zaXRpb25VcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldFBvc2l0aW9uX2woaW50NjRfdCB0aW1lVXMpIHsKLSAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNlZWtUb19sKGludDY0X3QgdGltZVVzKSB7Ci0gICAgQUxPR1YoInNlZWtUb19sIik7Ci0gICAgaWYgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47Ci0gICAgICAgIHBsYXlfbCgpOwotICAgIH0KLQotICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgbVZpZGVvU291cmNlICE9IE5VTEwgJiYgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpIHsKLSAgICAgICAgLy8gVmlkZW8gcGxheWJhY2sgY29tcGxldGVkIGJlZm9yZSwgdGhlcmUncyBubyBwZW5kaW5nCi0gICAgICAgIC8vIHZpZGVvIGV2ZW50IHJpZ2h0IG5vdy4gSW4gb3JkZXIgZm9yIHRoaXMgbmV3IHNlZWsKLSAgICAgICAgLy8gdG8gYmUgaG9ub3JlZCwgd2UgbmVlZCB0byBwb3N0IG9uZS4KLQotICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7Ci0gICAgfQotCi0gICAgbVNlZWtpbmcgPSBTRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7Ci0KLSAgICBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewotICAgICAgICBBTE9HVigic2Vla2luZyB3aGlsZSBwYXVzZWQsIHNlbmRpbmcgU0VFS19DT01QTEVURSBub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgIiBpbW1lZGlhdGVseS4iKTsKLQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotCi0gICAgICAgIGlmICgobUZsYWdzICYgUFJFUEFSRUQpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gU0VFS19QUkVWSUVXOwotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKSB7Ci0gICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUsgJiYgbVZpZGVvU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUGxheWVyLT5zZWVrVG8obVNlZWtUaW1lVXMpOwotCi0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtQXVkaW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgewotICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKLSAgICBtVmlkZW9UcmFjayA9IHNvdXJjZTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcykgewotICAgIGlmIChtU2Vla2luZyA9PSBTRUVLX1ZJREVPX09OTFkpIHsKLSAgICAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TZWVraW5nID09IE5PX1NFRUsgfHwgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHRpbWUsIHNlZWsgYXVkaW8gdG8gdGhlIG9yaWdpbmFsbHkKLSAgICAgICAgLy8gcmVxdWVzdGVkIHNlZWsgdGltZSBpbnN0ZWFkLgotCi0gICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKHZpZGVvVGltZVVzIDwgMCA/IG1TZWVrVGltZVVzIDogdmlkZW9UaW1lVXMpOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgLy8gSWYgd2UncmUgcGxheWluZyB2aWRlbyBvbmx5LCByZXBvcnQgc2VlayBjb21wbGV0ZSBub3csCi0gICAgICAgIC8vIG90aGVyd2lzZSBhdWRpbyBwbGF5ZXIgd2lsbCBub3RpZnkgdXMgbGF0ZXIuCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvbkNoZWNrQXVkaW9TdGF0dXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZykgewotICAgICAgICAvLyBFdmVudCB3YXMgZGlzcGF0Y2hlZCBhbmQgd2hpbGUgd2Ugd2VyZSBibG9ja2luZyBvbiB0aGUgbXV0ZXgsCi0gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgJiYgIW1BdWRpb1BsYXllci0+aXNTZWVraW5nKCkpIHsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1TZWVrTm90aWZpY2F0aW9uU2VudCkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgaWYgKG1XYXRjaEZvckF1ZGlvRU9TICYmIG1BdWRpb1BsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gZmFsc2U7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLSAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGZpbmFsU3RhdHVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobVZpZGVvRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvRXZlbnQsIGRlbGF5VXMgPCAwID8gMTAwMDAgOiBkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0U3RyZWFtRG9uZUV2ZW50X2woc3RhdHVzX3Qgc3RhdHVzKSB7Ci0gICAgaWYgKG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbURvbmVFdmVudFBlbmRpbmcgPSB0cnVlOwotCi0gICAgbVN0cmVhbURvbmVTdGF0dXMgPSBzdGF0dXM7Ci0gICAgbVF1ZXVlLnBvc3RFdmVudChtU3RyZWFtRG9uZUV2ZW50KTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0VmlkZW9MYWdFdmVudF9sKCkgewotICAgIGlmIChtVmlkZW9MYWdFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobVZpZGVvTGFnRXZlbnQsIDEwMDAwMDBsbCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSB0cnVlOwotICAgIG1RdWV1ZS5wb3N0RXZlbnRXaXRoRGVsYXkobUNoZWNrQXVkaW9TdGF0dXNFdmVudCwgZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6YWJvcnRQcmVwYXJlKHN0YXR1c190IGVycikgewotICAgIENIRUNLKGVyciAhPSBPSyk7Ci0KLSAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgfQotCi0gICAgbVByZXBhcmVSZXN1bHQgPSBlcnI7Ci0gICAgbUZsYWdzICY9IH4oUFJFUEFSSU5HfFBSRVBBUkVfQ0FOQ0VMTEVEfFBSRVBBUklOR19DT05ORUNURUQpOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7Ci0gICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi11aW50MzJfdCBQcmV2aWV3UGxheWVyOjpnZXRTb3VyY2VTZWVrRmxhZ3MoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHJldHVybiBtRXh0cmFjdG9yRmxhZ3M7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdEF1ZGlvRU9TKGludDY0X3QgZGVsYXlVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcG9zdENoZWNrQXVkaW9TdGF0dXNFdmVudF9sKGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbCgwIC8qIGRlbGF5VXMgKi8pOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnVwZGF0ZUJhdHRlcnlVc2FnZV9sKCkgewotICAgIHVpbnQzMl90IHBhcmFtcyA9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrRGVjb2RlcjsKLSAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSAmJiAobUF1ZGlvU291cmNlICE9IG1BdWRpb1RyYWNrKSkgewotICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tBdWRpbzsKLSAgICB9Ci0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja1ZpZGVvOwotICAgIH0KLSAgICBhZGRCYXR0ZXJ5RGF0YShwYXJhbXMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWExM2I1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQUkVWSUVXX1BMQVlFUl9IXwotCi0jZGVmaW5lIFBSRVZJRVdfUExBWUVSX0hfCi0KLSNpbmNsdWRlICJUaW1lZEV2ZW50UXVldWUuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjsKLXN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKLQotc3RydWN0IFByZXZpZXdQbGF5ZXIgewotICAgIFByZXZpZXdQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB+UHJldmlld1BsYXllcigpOwotCi0gICAgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcik7Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgc3RhdHVzX3QgcGxheSgpOwotICAgIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICBib29sIGlzUGxheWluZygpIGNvbnN0OwotICAgIHZvaWQgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdm9pZCBzZXRTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpOwotICAgIHN0YXR1c190IHNlZWtUbyhpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBzdGF0dXNfdCBnZXRWaWRlb0RpbWVuc2lvbnMoaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3Q7Ci0KLQotICAgIC8vIEZJWE1FOiBTeW5jIGJldHdlZW4gLi4uCi0gICAgdm9pZCBhY3F1aXJlTG9jaygpOwotICAgIHZvaWQgcmVsZWFzZUxvY2soKTsKLQotICAgIHN0YXR1c190IHByZXBhcmUoKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKnBhdGgpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgc3RhdHVzX3Qgc2V0TG9vcGluZyhib29sIHNob3VsZExvb3ApOwotICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHN0YXR1c190IGdldFBvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uVXMpOwotCi0gICAgdWludDMyX3QgZ2V0U291cmNlU2Vla0ZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMgPSAwbGwpOwotICAgIHZvaWQgcG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0KLSAgICBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5FZmZlY3RzKTsKLSAgICBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZShNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgIHN0YXR1c190IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKE00T1NBX1VJbnQzMiBhdWRpb01peFN0b3J5Qm9hcmRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFWb2x1bWVWb2wpOwotCi0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFN0b3J5Ym9hcmRTdGFydFRpbWUodWludDMyX3QgbXNlYyk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpOwotICAgIHN0YXR1c190IHNldE1lZGlhUmVuZGVyaW5nTW9kZShNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgc3RhdHVzX3QgcmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgIHN0YXR1c190IHNldEltYWdlQ2xpcFByb3BlcnRpZXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0gICAgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHN0YXR1c190IGdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcik7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBMQVlJTkcgICAgICAgICAgICAgPSAxLAotICAgICAgICBMT09QSU5HICAgICAgICAgICAgID0gMiwKLSAgICAgICAgRklSU1RfRlJBTUUgICAgICAgICA9IDQsCi0gICAgICAgIFBSRVBBUklORyAgICAgICAgICAgPSA4LAotICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCi0gICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKLSAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAotICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAotICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAotICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAotICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKLSAgICAgICAgSU5GT1JNRURfQVZfRU9TICAgICA9IDIwNDgsCi0KLSAgICAgICAgLy8gV2UgYXJlIGJhc2ljYWxseSBkb25lIHByZXBhcmluZyBidXQgYXJlIGN1cnJlbnRseSBidWZmZXJpbmcKLSAgICAgICAgLy8gc3VmZmljaWVudCBkYXRhIHRvIGJlZ2luIHBsYXliYWNrIGFuZCBmaW5pc2ggdGhlIHByZXBhcmF0aW9uIHBoYXNlCi0gICAgICAgIC8vIGZvciBnb29kLgotICAgICAgICBQUkVQQVJJTkdfQ09OTkVDVEVEID0gMjA0OCwKLQotICAgICAgICAvLyBXZSdyZSB0cmlnZ2VyaW5nIGEgc2luZ2xlIHZpZGVvIGV2ZW50IHRvIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lCi0gICAgICAgIC8vIGFmdGVyIHRoZSBzZWVrcG9pbnQuCi0gICAgICAgIFNFRUtfUFJFVklFVyAgICAgICAgPSA0MDk2LAotCi0gICAgICAgIEFVRElPX1JVTk5JTkcgICAgICAgPSA4MTkyLAotICAgICAgICBBVURJT1BMQVlFUl9TVEFSVEVEID0gMTYzODQsCi0KLSAgICAgICAgSU5DT0dOSVRPICAgICAgICAgICA9IDMyNzY4LAotICAgIH07Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotCi0gICAgT01YQ2xpZW50IG1DbGllbnQ7Ci0gICAgVGltZWRFdmVudFF1ZXVlIG1RdWV1ZTsKLSAgICBib29sIG1RdWV1ZVN0YXJ0ZWQ7Ci0gICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotCi0gICAgU3lzdGVtVGltZVNvdXJjZSBtU3lzdGVtVGltZVNvdXJjZTsKLSAgICBUaW1lU291cmNlICptVGltZVNvdXJjZTsKLQotICAgIFN0cmluZzggbVVyaTsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtVmlkZW9UcmFjazsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvU291cmNlOwotICAgIGJvb2wgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXc7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbUF1ZGlvVHJhY2s7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1NvdXJjZTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICptQXVkaW9QbGF5ZXI7Ci0gICAgaW50NjRfdCBtRHVyYXRpb25VczsKLQotICAgIGludDMyX3QgbURpc3BsYXlXaWR0aDsKLSAgICBpbnQzMl90IG1EaXNwbGF5SGVpZ2h0OwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIHVpbnQzMl90IG1FeHRyYWN0b3JGbGFnczsKLQotICAgIGludDY0X3QgbVRpbWVTb3VyY2VEZWx0YVVzOwotICAgIGludDY0X3QgbVZpZGVvVGltZVVzOwotCi0gICAgZW51bSBTZWVrVHlwZSB7Ci0gICAgICAgIE5PX1NFRUssCi0gICAgICAgIFNFRUssCi0gICAgICAgIFNFRUtfVklERU9fT05MWQotICAgIH07Ci0gICAgU2Vla1R5cGUgbVNlZWtpbmc7Ci0KLSAgICBib29sIG1TZWVrTm90aWZpY2F0aW9uU2VudDsKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotCi0gICAgaW50NjRfdCBtQml0cmF0ZTsgIC8vIHRvdGFsIGJpdHJhdGUgb2YgdGhlIGZpbGUgKGluIGJwcykgb3IgLTEgaWYgdW5rbm93bi4KLQotICAgIGJvb2wgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGU7Ci0gICAgYm9vbCBtV2F0Y2hGb3JBdWRpb0VPUzsKLQotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0V2ZW50OwotICAgIGJvb2wgbVZpZGVvRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1TdHJlYW1Eb25lRXZlbnQ7Ci0gICAgYm9vbCBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50OwotICAgIGJvb2wgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nOwotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1WaWRlb0xhZ0V2ZW50OwotICAgIGJvb2wgbVZpZGVvTGFnRXZlbnRQZW5kaW5nOwotCi0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUFzeW5jUHJlcGFyZUV2ZW50OwotICAgIENvbmRpdGlvbiBtUHJlcGFyZWRDb25kaXRpb247Ci0gICAgYm9vbCBtSXNBc3luY1ByZXBhcmU7Ci0gICAgc3RhdHVzX3QgbVByZXBhcmVSZXN1bHQ7Ci0gICAgc3RhdHVzX3QgbVN0cmVhbURvbmVTdGF0dXM7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbVZpZGVvQnVmZmVyOwotICAgIGludDY0X3QgbUxhc3RWaWRlb1RpbWVVczsKLSAgICBBUmVjdCBtQ3JvcFJlY3Q7Ci0gICAgaW50MzJfdCBtR2l2ZW5XaWR0aCwgbUdpdmVuSGVpZ2h0OwotCi0KLSAgICBib29sIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkOwotCi0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgKm1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBSZW5kZXJJbnB1dCAqbVZpZGVvUmVuZGVyZXI7Ci0KLSAgICBpbnQzMl90IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7Ci0KLSAgICAvL0RhdGEgc3RydWN0dXJlcyB1c2VkIGZvciBhdWRpbyBhbmQgdmlkZW8gZWZmZWN0cwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogbVByZXZpZXdQbGF5ZXJBdWRpb01peFNldHRpbmdzOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBNNE9TQV9VSW50MzIgbUF1ZGlvTWl4U3RvcnlCb2FyZFRTOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhQmVnaW5DdXRUaW1lOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudE1lZGlhVm9sdW1lVmFsdWU7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyRnJhbWluZ0VmZmVjdEluZGV4OwotCi0gICAgdWludDMyX3QgbU51bWJlckVmZmVjdHM7Ci0gICAgdWludDMyX3QgbVBsYXlCZWdpblRpbWVNc2VjOwotICAgIHVpbnQzMl90IG1QbGF5RW5kVGltZU1zZWM7Ci0gICAgdWludDY0X3QgbURlY29kZWRWaWRlb1RzOyAvLyB0aW1lc3RhbXAgb2YgY3VycmVudCBkZWNvZGVkIHZpZGVvIGZyYW1lIGJ1ZmZlcgotICAgIHVpbnQ2NF90IG1EZWNWaWRlb1RzU3RvcnlCb2FyZDsgLy8gdGltZXN0YW1wIG9mIGZyYW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQKLSAgICB1aW50MzJfdCBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIHVpbnQzMl90IG1Qcm9ncmVzc0NiSW50ZXJ2YWw7Ci0gICAgdWludDMyX3QgbU51bWJlckRlY1ZpZGVvRnJhbWVzOyAvLyBDb3VudGVyIG9mIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgZGVjb2RlZAotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Qcm9ncmVzc0NiRXZlbnQ7Ci0gICAgYm9vbCBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtT3ZlcmxheVVwZGF0ZUV2ZW50OwotICAgIGJvb2wgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmc7Ci0gICAgYm9vbCBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkOwotCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIHVpbnQzMl90IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYzsKLQotICAgIGJvb2wgbUlzVmlkZW9Tb3VyY2VKcGc7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLSAgICBpbnQ2NF90IG1JbWFnZUZyYW1lVGltZVVzOwotICAgIGJvb2wgbVN0YXJ0TmV4dFBsYXllcjsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrQ29udHJvbDsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0KLSAgICB2b2lkIGNhbmNlbFBsYXllckV2ZW50c19sKGJvb2wgdXBkYXRlUHJvZ3Jlc3NDYiA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpOwotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbChjb25zdCBjaGFyICpwYXRoKTsKLSAgICB2b2lkIHNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpOwotICAgIHZvaWQgcmVzZXRfbCgpOwotICAgIHZvaWQgY2xlYXJfbCgpOwotICAgIHN0YXR1c190IHBsYXlfbCgpOwotICAgIHN0YXR1c190IHBhdXNlX2woYm9vbCBhdF9lb3MgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgaW5pdFJlbmRlcmVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0QXVkaW9EZWNvZGVyX2woKTsKLSAgICBzdGF0dXNfdCBpbml0VmlkZW9EZWNvZGVyX2wodWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwKTsKLSAgICB2b2lkIG9uVmlkZW9FdmVudCgpOwotICAgIHZvaWQgb25WaWRlb0xhZ1VwZGF0ZSgpOwotICAgIHZvaWQgb25TdHJlYW1Eb25lKCk7Ci0gICAgdm9pZCBvbkNoZWNrQXVkaW9TdGF0dXMoKTsKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jRXZlbnQoKTsKLQotICAgIHZvaWQgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKLSAgICB2b2lkIGFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnRBdWRpb1BsYXllcl9sKCk7Ci0gICAgdm9pZCBzZXRWaWRlb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgc3RhdHVzX3QgZmluaXNoU2V0RGF0YVNvdXJjZV9sKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0KLSAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IHRpbWVVcyk7Ci0gICAgdm9pZCBzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCk7Ci0gICAgdm9pZCBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoaW50NjRfdCB2aWRlb1RpbWVVcyk7Ci0KLSAgICB2b2lkIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpOwotICAgIHZvaWQgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOwotICAgIHZvaWQgcG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgdm9pZCBwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcyA9IC0xKTsKLSAgICB2b2lkIHNldFZpZGVvUG9zdFByb2Nlc3NpbmdOb2RlKAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHR5cGUsIE00T1NBX0Jvb2wgZW5hYmxlKTsKLSAgICB2b2lkIHBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpOwotICAgIHZvaWQgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotICAgIHZvaWQgb25Qcm9ncmVzc0NiRXZlbnQoKTsKLQotICAgIHZvaWQgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgdm9pZCBvblVwZGF0ZU92ZXJsYXlFdmVudCgpOwotCi0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sX2pwZygpOwotICAgIHN0YXR1c190IHByZXBhcmVfbCgpOwotICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7Ci0gICAgdm9pZCB1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpOwotICAgIHZvaWQgdXBkYXRlU2l6ZVRvUmVuZGVyKHNwPE1ldGFEYXRhPiBtZXRhKTsKLQotICAgIHZvaWQgc2V0RHVyYXRpb25fbChpbnQ2NF90IGR1cmF0aW9uVXMpOwotICAgIHZvaWQgc2V0UG9zaXRpb25fbChpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICBQcmV2aWV3UGxheWVyKGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci0gICAgUHJldmlld1BsYXllciAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBSRVZJRVdfUExBWUVSX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjFjZmM4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiUHJldmlld1JlbmRlcmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUHJldmlld1JlbmRlcmVyKiBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlciAoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIFByZXZpZXdSZW5kZXJlciogcmVuZGVyZXIgPSBuZXcgUHJldmlld1JlbmRlcmVyKHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgaWYgKHJlbmRlcmVyLT5pbml0KCkgIT0gMCkgewotICAgICAgICBkZWxldGUgcmVuZGVyZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByZW5kZXJlcjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjpQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCi0gICAgOiBtU3VyZmFjZShzdXJmYWNlKSwKLSAgICAgIG1XaWR0aCh3aWR0aCksCi0gICAgICBtSGVpZ2h0KGhlaWdodCkgewotfQotCi1pbnQgUHJldmlld1JlbmRlcmVyOjppbml0KCkgewotICAgIGludCBlcnIgPSAwOwotICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IG1TdXJmYWNlLmdldCgpOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCi0gICAgICAgICAgICBhbncsIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhbncsIDMpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgIGFudywgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KAotICAgICAgICAgICAgYW53LCBtV2lkdGgsIG1IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oYW53LCAwKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLWZhaWw6Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotUHJldmlld1JlbmRlcmVyOjp+UHJldmlld1JlbmRlcmVyKCkgewotICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci19Ci0KLQotLy8KLS8vIFByb3ZpZGVzIGEgYnVmZmVyIGFuZCBhc3NvY2lhdGVkIHN0cmlkZQotLy8gVGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoZSBTdXJmYWNlRmxpbmdlcgotLy8KLS8vIEZvciBvcHRpbWFsIGRpc3BsYXkgcGVyZm9ybWFuY2VzLCB5b3Ugc2hvdWxkIDoKLS8vIDEpIGNhbGwgZ2V0QnVmZmVyWVYxMigpCi0vLyAyKSBmaWxsIHRoZSBidWZmZXIgd2l0aCB5b3VyIGRhdGEKLS8vIDMpIGNhbGwgcmVuZGVyWVYxMigpIHRvIHRha2UgdGhlc2UgY2hhbmdlcyBpbnRvIGFjY291bnQKLS8vCi0vLyBGb3IgZWFjaCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKSwgeW91IG11c3QgYWxzbyBjYWxsIHJlbmRlcllWMTIoKQotLy8gRXhwZWN0ZWQgZm9ybWF0IGluIHRoZSBidWZmZXIgaXMgWVYxMiBmb3JtYXRzIChzaW1pbGFyIHRvIFlVVjQyMCBwbGFuYXIgZnJvbWF0KQotLy8gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIFlWMTIgY2YgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZS9oYXJkd2FyZS9oYXJkd2FyZS5oCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OmdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgaWYgKChlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1TdXJmYWNlLmdldCgpLAotICAgICAgICAgICAgJm1CdWYpKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0IHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwotCi0gICAgUmVjdCBib3VuZHMobVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgIHZvaWQgKmRzdDsKLSAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jayhtQnVmLT5oYW5kbGUsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgYm91bmRzLCAmZHN0KSk7Ci0KLSAgICAqZGF0YSAgID0gKHVpbnQ4X3QqKWRzdDsKLSAgICAqc3RyaWRlID0gbUJ1Zi0+c3RyaWRlOwotfQotCi0KLS8vCi0vLyBEaXNwbGF5IHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkgbGFzdCBjYWxsIHRvIGdldEJ1ZmZlcllWMTIoKQotLy8KLS8vIFNlZSBnZXRCdWZmZXJZVjEyKCkgZm9yIGRldGFpbHMuCi0vLwotdm9pZCBQcmV2aWV3UmVuZGVyZXI6OnJlbmRlcllWMTIoKSB7Ci0gICAgaW50IGVyciA9IE9LOwotCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciAmbWFwcGVyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCk7Ci0KLSAgICBpZiAobUJ1ZiE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLnVubG9jayhtQnVmLT5oYW5kbGUpKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1TdXJmYWNlLT5BTmF0aXZlV2luZG93OjpxdWV1ZUJ1ZmZlcihtU3VyZmFjZS5nZXQoKSwgbUJ1ZiwgLTEpKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1CdWYgPSBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlMjgyNzYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBSRVZJRVdfUkVOREVSRVJfSF8KLQotI2RlZmluZSBQUkVWSUVXX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZTsKLQotY2xhc3MgUHJldmlld1JlbmRlcmVyIHsKLXB1YmxpYzoKLQotc3RhdGljIFByZXZpZXdSZW5kZXJlciogQ3JlYXRlUHJldmlld1JlbmRlcmVyICgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7Ci0KLSAgICB+UHJldmlld1JlbmRlcmVyKCk7Ci0KLSAgICB2b2lkIGdldEJ1ZmZlcllWMTIodWludDhfdCAqKmRhdGEsIHNpemVfdCAqc3RyaWRlKTsKLQotICAgIHZvaWQgcmVuZGVyWVYxMigpOwotCi0gICAgc3RhdGljIHNpemVfdCBBTElHTihzaXplX3QgeCwgc2l6ZV90IGFsaWdubWVudCkgewotICAgICAgICByZXR1cm4gKHggKyBhbGlnbm1lbnQgLSAxKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKLQotICAgIGludCBpbml0KCk7Ci0KLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLSAgICBzaXplX3QgbVdpZHRoLCBtSGVpZ2h0OwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqbUJ1ZjsKLQotICAgIFByZXZpZXdSZW5kZXJlcihjb25zdCBQcmV2aWV3UmVuZGVyZXIgJik7Ci0gICAgUHJldmlld1JlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc2ZjhlOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICpvYnNlcnZlcikKLSAgICA6IG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbUxhdGVuY3lVcygwKSwKLSAgICAgIG1GcmFtZVNpemUoMCksCi0gICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAotICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMoLTEpLAotICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcygtMSksCi0gICAgICBtU2Vla2luZyhmYWxzZSksCi0gICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCi0gICAgICBtRmluYWxTdGF0dXMoT0spLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAotICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKLSAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKLSAgICAgIG1PYnNlcnZlcihvYnNlcnZlcikgewotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gTlVMTDsKLSAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gMDsKLSAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFCZWdpbkN1dFRTID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU291cmNlID0gTlVMTDsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6flZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoKSB7Ci0KLSAgICBBTE9HVigiRGVzdHJ1Y3RvciIpOwotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBpZiAobUF1ZGlvUHJvY2VzcyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9Qcm9jZXNzOwotICAgICAgICBtQXVkaW9Qcm9jZXNzID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICBBTE9HVigicGF1c2U6IHBsYXlQZW5kaW5nU2FtcGxlcz0lZCIsIHBsYXlQZW5kaW5nU2FtcGxlcyk7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKHBsYXlQZW5kaW5nU2FtcGxlcykgewotICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmNsZWFyKCkgewotICAgIEFMT0dWKCJjbGVhciIpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkF1ZGlvUGxheWVyQmFzZSByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKLSAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KLSAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKLSAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgfQotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLQotICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOwotICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IC0xOwotICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICBtRmluYWxTdGF0dXMgPSBPSzsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZXN1bWUoKSB7Ci0gICAgQUxPR1YoInJlc3VtZSIpOwotCi0gICAgQXVkaW9NaXhTZXR0aW5ncyBhdWRpb01peFNldHRpbmdzOwotCi0gICAgLy8gU2luZ2xlIGF1ZGlvIHBsYXllciBpcyB1c2VkOwotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIC8vIHdoaWNoIG1pZ2h0IGhhdmUgY2hhbmdlZCB3aXRoIG5ldyBhdWRpbyBzb3VyY2UKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX3RocmVzaG9sZCA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUluRHVja2luZ19sb3dWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ19lbmFibGUgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YkluRHVja2luZ19lbmFibGU7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkVm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aUJUQ2hhbm5lbENvdW50OwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVENoYW5uZWxDb3VudCA9IG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvLyBDYWxsIHRvIEF1ZGlvIG1peCBwYXJhbSBzZXR0aW5nCi0gICAgbUF1ZGlvUHJvY2Vzcy0+c2V0TWl4UGFyYW1zKGF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKLSAgICBBTE9HVigic2Vla1RvOiAlbGxkIiwgdGltZV91cyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TZWVraW5nID0gdHJ1ZTsKLSAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTZWVraW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBBTE9HVigiaXNTZWVraW5nOiBtU2Vla2luZz0lZCIsIG1TZWVraW5nKTsKLSAgICByZXR1cm4gbVNlZWtpbmc7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIHsKLSAgICBBTE9HVigicmVhY2hlZEVPUzogc3RhdHVzPSVkIiwgbUZpbmFsU3RhdHVzKTsKLSAgICAqZmluYWxTdGF0dXMgPSBPSzsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOwotICAgIHJldHVybiBtUmVhY2hlZEVPUzsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRSZWFsVGltZVVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIGdldFJlYWxUaW1lVXNfbCgpOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFJlYWxUaW1lVXNfbCgpIHsKLSAgICByZXR1cm4gLW1MYXRlbmN5VXMgKyAobU51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDApIC8gbVNhbXBsZVJhdGU7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0TWVkaWFUaW1lVXMoKSB7Ci0gICAgQUxPR1YoImdldE1lZGlhVGltZVVzIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtUG9zaXRpb25UaW1lTWVkaWFVcyA8IDAgfHwgbVBvc2l0aW9uVGltZVJlYWxVcyA8IDApIHsKLSAgICAgICAgaWYgKG1TZWVraW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0ID0gZ2V0UmVhbFRpbWVVc19sKCkgLSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgIGlmIChyZWFsVGltZU9mZnNldCA8IDApIHsKLSAgICAgICAgcmVhbFRpbWVPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lTWVkaWFVcyArIHJlYWxUaW1lT2Zmc2V0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldE1lZGlhVGltZU1hcHBpbmcoCi0gICAgICAgIGludDY0X3QgKnJlYWx0aW1lX3VzLCBpbnQ2NF90ICptZWRpYXRpbWVfdXMpIHsKLSAgICBBTE9HVigiZ2V0TWVkaWFUaW1lTWFwcGluZyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqcmVhbHRpbWVfdXMgPSBtUG9zaXRpb25UaW1lUmVhbFVzOwotICAgICptZWRpYXRpbWVfdXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKLQotICAgIHJldHVybiBtUG9zaXRpb25UaW1lUmVhbFVzICE9IC0xICYmIG1Qb3NpdGlvblRpbWVNZWRpYVVzICE9IC0xOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBCZWZvcmUgc2V0dGluZyBzb3VyY2UsIHN0b3AgYW55IGV4aXN0aW5nIHNvdXJjZS4KLSAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQotICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KLQotICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KLQotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLX0KLQotc3A8TWVkaWFTb3VyY2U+IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFNvdXJjZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBtU291cmNlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKSB7Ci0gICAgQUxPR1YoInNldE9ic2VydmVyIik7Ci0gICAgLy9DSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1ib29sIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmlzU3RhcnRlZCgpIHsKLSAgICByZXR1cm4gbVN0YXJ0ZWQ7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgewotICAgIHN0YXRpY19jYXN0PFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKj4odXNlciktPkF1ZGlvQ2FsbGJhY2soZXZlbnQsIGluZm8pOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOwotICAgIHNpemVfdCBudW1CeXRlc1dyaXR0ZW4gPSBmaWxsQnVmZmVyKGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUpOwotCi0gICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7Ci0gICAgQUxPR1YoIlN0YXJ0Iik7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIE00T1NBX0VSUiByZXN1bHQgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzdGFydFRpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzZWVrVGltZVN0YW1wID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTdG9yeUJvYXJkVFNCZXlvbmRCVEVuZEN1dFRpbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgQkcgQXVkaW8gaGFuZGxlcgotICAgIG1BdWRpb1Byb2Nlc3MgPSBuZXcgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIEF1ZGlvTWl4U2V0dGluZ3MgYXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8vIFBhc3Mgb24gdGhlIGF1ZGlvIGR1Y2tpbmcgcGFyYW1ldGVycwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2xvd1ZvbHVtZSA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX2xvd1ZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2VuYWJsZSA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iSW5EdWNraW5nX2VuYWJsZTsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQlRDaGFubmVsQ291bnQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVsczsKLQotICAgIC8vIENhbGwgdG8gQXVkaW8gbWl4IHBhcmFtIHNldHRpbmcKLSAgICBtQXVkaW9Qcm9jZXNzLT5zZXRNaXhQYXJhbXMoYXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAvLyBHZXQgdGhlIEJHIEF1ZGlvIFBDTSBmaWxlIGRldGFpbHMKLSAgICBpZiAoIG1CR0F1ZGlvUENNRmlsZUhhbmRsZSApIHsKLQotICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMLCB0byBiZSB1cGRhdGVkIG9uY2UgT1NBTCBpcyB1cGRhdGVkCi0gICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9IDA7Ci0gICAgICAgIHJlc3VsdCA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCoqKSZ0bXAzMik7Ci0gICAgICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IHRtcDMyOwotICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotCi0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0IE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGR1cmF0aW9uIGluIHRpbWUgb2YgdGhlIGF1ZGlvIEJUCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICBBTE9HVigiVkVBUDogY2hhbm5lbHMgPSAlZCBmcmVxID0gJWQiLAotICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscywgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgICAgICAgICAgLy8gTm8gdHJpbQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlTGVuZ3RoL3NpemVvZihNNE9TQV9VSW50MTYpLwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSkqMTAwMCApIC8KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjogYmVnaW5DdXRNcyAlZCAsIGVuZEN1dE1zICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJpbSBwYXJ0Ci0gICAgICAgICAgICBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zID09IDApICYmCi0gICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAhPSAwKSkgewotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1lIGl0c2VsZiB0aGUgZmlsZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uID0gbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgPT0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9VSW50MTYpKSAvIDEwMDA7IC8qbWFrZSB0byBzZWMgZnJvbSBtcyovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOiBmaWxlIGR1cmF0aW9uIHJlY29yZGVkIDogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExhc3QgcGxheWVkIGxvY2F0aW9uIHRvIGJlIHNlZWtlZCBhdCBmb3IgbmV4dCBtZWRpYSBpdGVtCi0gICAgICAgIGlmICggcmVzdWx0ID09IE00Tk9fRVJST1IgKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6bUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6dWlBZGRDdHMgJWQiLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgaWYgKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPj0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgLQotICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnRUaW1lICVkIiwgc3RhcnRUaW1lKTsKLSAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPj0gbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJHIHRyYWNrIHNob3VsZCBiZSBsb29wZWQgYW5kIHN0YXJ0ZWQgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGJlZ2luIGN1dCB0aW1lIHRvIHRoZSBtb2QgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAoKHN0YXJ0VGltZSVtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29waW5nIGRpc2FibGVkLCBkb25vdCBkbyBCVCBNaXggLCBzZXQgdG8gZmlsZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSAobUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBCVCBzdGlsbCBwcmVzZW50ICwganVzdCBzZWVrIHRvIHN0b3J5IGJvYXJkIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IHN0YXJ0VGltZSArIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNlZWtUaW1lU3RhbXAgPSBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2Vla1RpbWVTdGFtcCB0byBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQxNikpLyAxMDAwIDsgLyptYWtlIHRvIHNlYyBmcm9tIG1zKi8KLQotICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gKChpbnQ2NF90KShzZWVrVGltZVN0YW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MTYpKS8gMTAwMCA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBhbiBvcHRpb25hbCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgIC8vIG9mIHBsYXliYWNrLCBpZiB0aGVyZSBpcyBvbmUsIGdldEZvcm1hdCBiZWxvdyB3aWxsIHJldHJpZXZlIHRoZQotICAgIC8vIHVwZGF0ZWQgZm9ybWF0LCBpZiB0aGVyZSBpc24ndCwgd2UnbGwgc3Rhc2ggYXdheSB0aGUgdmFsaWQgYnVmZmVyCi0gICAgLy8gb2YgZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBmaXJzdCBhdWRpbyBjYWxsYmFjay4KLQotICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLQotICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IG1Tb3VyY2UtPnJlYWQoJm1GaXJzdEJ1ZmZlcik7Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlclJlc3VsdCA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7Ci0KLSAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5ULAotICAgICAgICAgICAgICAgICZWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywgdGhpcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwotCi0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fTVVTSUMsIG1TYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgICAgIDAsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLCAwKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzZXQoKSB7Ci0KLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM9MDsKLX0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbWUgPSAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqKWNvb2tpZTsKLQotICAgIGlmIChldmVudCA9PSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIgKSB7Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi1zaXplX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwotICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKLSAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7Ci0gICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7Ci0gICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQotICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE9TlVMTDsKLSAgICBNNE9TQV9VSW50MzIgICAgIHVpUENNc2l6ZSA9IDA7Ci0KLSAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKLQotICAgIHdoaWxlICgoc2l6ZV9yZW1haW5pbmcgPiAwKSYmKGVycj09TTROT19FUlJPUikpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICBwb3N0U2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotCi0gICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawotICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBNaXggb25seSB3aGVuIHNraW0gcG9pbnQgaXMgYWZ0ZXIgc3RhcnRUaW1lIG9mIEJUCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIC0gbVNlZWtUaW1lVXMpKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzICogMTAwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyAlbGxkIDw9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludC1tQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAoTTRPU0FfVm9pZCopKCh1bnNpZ25lZCBpbnQpbUlucHV0QnVmZmVyLT5kYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4gPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBmcCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSA9IChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKS8yOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBUTWRhdGEgPSAoTTRPU0FfSW50MTYqKSAoKHVpbnQ4X3QqKSBtSW5wdXRCdWZmZXItPmRhdGEoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmFja2dyb3VuZCBtYWxsb2MgdG8gZG8gbGVuICVkIiwgbGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJiZ0ZyYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZ0ZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW4sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJtaXhGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibWl4IHdpdGggYmdtIHdpdGggc2l6ZSAlbGxkIiwgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50IDw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCAtIGxlbikpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KW1CR0F1ZGlvUENNRmlsZUhhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJHQXVkaW9QQ01GaWxlSGFuZGxlICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgc2Vla2luZyBmaWxlIHRvICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiAzMmJpdHMgcmVxdWlyZWQgZm9yIE9TQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRtcDMyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZFNlZWsobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiopJnRtcDMyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSB0bXAzMjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk00T1NBX2ZpbGVSZWFkU2VlayBlcnIgJWQiLChpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkRGF0YShtQkdBdWRpb1BDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopYmdGcmFtZS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQgKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIEVuZCBvZiBmaWxlIHJlYWNoZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIExvb3BpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKHBQVE1kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBNNE5PX0VSUk9SICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxlUmVhZERhdGEgZm9yIGF1ZGlvIGVyciAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXIgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgcHRyIGRhdGEgdG8gcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2RhdGFBZGRyZXNzID0gKE00T1NBX1VJbnQxNiopcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdG8gbWl4IGFuZCBkdWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qcm9jZXNzLT5taXhBbmREdWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRGcmFtZSwgJmJnRnJhbWUsICZtaXhGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIGRlY29kZWQgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbWl4RnJhbWUubV9kYXRhQWRkcmVzcywgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIGJlZ2luIGN1dCB0aW1lIGVxdWFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIGNhcmUgb2Ygdm9sdW1lIGxldmVsIG9mIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhLCB1aVBDTXNpemUsIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShiZ0ZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1peEZyYW1lLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gbWl4aW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihmUFRWb2xMZXZlbCA8IDEuMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0soKHN0YXR1cyA9PSBPSyAmJiBtSW5wdXRCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICB8fCAoc3RhdHVzICE9IE9LICYmIG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSk7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlcjogbVNvdXJjZS0+cmVhZCByZXR1cm5lZCBlcnIgJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgJiYgIW1SZWFjaGVkRU9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLQotICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9Ci0gICAgICAgICAgICAgICAgKChtTnVtRnJhbWVzUGxheWVkICsgc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZSkgKiAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotCi0gICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5zaXplKCkgPSAlZCwgIgotICAgICAgICAgICAgICAgICAgICAgIm1Qb3NpdGlvblRpbWVNZWRpYVVzPSUuMmYgbVBvc2l0aW9uVGltZVJlYWxVcz0lLjJmIiwKLSAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgLyAxRTYsIG1Qb3NpdGlvblRpbWVSZWFsVXMgLyAxRTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZV9yZW1haW5pbmc7Ci0gICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKGNoYXIgKilkYXRhICsgc2l6ZV9kb25lLAotICAgICAgICAgICAoY29uc3QgY2hhciAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIGNvcHkpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBzaXplX2RvbmUgKz0gY29weTsKLSAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gY29weTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdEVPUykgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb0VPUygpOwotICAgIH0KLQotICAgIGlmIChwb3N0U2Vla0NvbXBsZXRlKSB7Ci0gICAgICAgIG1PYnNlcnZlci0+cG9zdEF1ZGlvU2Vla0NvbXBsZXRlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemVfZG9uZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotICAgIG1BdWRpb01peFNldHRpbmdzID0gcEF1ZGlvTWl4U2V0dGluZ3M7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKXsKLSAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgPSBwQkdBdWRpb1BDTUZpbGVIYW5kbGU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCkgewotCi0gICAgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA9IHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXA7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUyA9IHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgTTRPU0FfSW50MTYgKmRhdGEsIE00T1NBX1VJbnQzMiBzaXplLCBNNE9TQV9GbG9hdCB2b2xMZXZlbCkgewotCi0gICAgd2hpbGUoc2l6ZS0tID4gMCkgewotICAgICAgICAqZGF0YSA9IChNNE9TQV9JbnQxNikoKCpkYXRhKSp2b2xMZXZlbCk7Ci0gICAgICAgIGRhdGErKzsKLSAgICB9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjYWY1ZTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQVVESU9fUExBWUVSX0hfCi0jZGVmaW5lIFZFX0FVRElPX1BMQVlFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1RpbWVTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhU291cmNlOwotY2xhc3MgQXVkaW9UcmFjazsKLWNsYXNzIFByZXZpZXdQbGF5ZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgOiBwdWJsaWMgVGltZVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFJFQUNIRURfRU9TLAotICAgICAgICBTRUVLX0NPTVBMRVRFCi0gICAgfTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmssCi0gICAgICAgIFByZXZpZXdQbGF5ZXIgKmF1ZGlvT2JzZXJ2ZXIgPSBOVUxMKTsKLQotICAgIH5WaWRlb0VkaXRvckF1ZGlvUGxheWVyKCk7Ci0KLSAgICAvLyBSZXR1cm4gdGltZSBpbiB1cy4KLSAgICBpbnQ2NF90IGdldFJlYWxUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBidWZmZXIgcGxheWVkIChpbiB1cykuCi0gICAgaW50NjRfdCBnZXRNZWRpYVRpbWVVcygpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmZiBhIG1hcHBpbmcgaXMgZXN0YWJsaXNoZWQsIGkuZS4gdGhlIEF1ZGlvUGxheWVyQmFzZQotICAgIC8vIGhhcyBwbGF5ZWQgYXQgbGVhc3Qgb25lIGZyYW1lIG9mIGF1ZGlvLgotICAgIGJvb2wgZ2V0TWVkaWFUaW1lTWFwcGluZyhpbnQ2NF90ICpyZWFsdGltZV91cywgaW50NjRfdCAqbWVkaWF0aW1lX3VzKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQgPSBmYWxzZSk7Ci0gICAgdm9pZCBwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcyA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCByZXN1bWUoKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKLSAgICBib29sIGlzU2Vla2luZygpOwotICAgIGJvb2wgcmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpOwotCi0gICAgdm9pZCBzZXRBdWRpb01peFNldHRpbmdzKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncyk7Ci0gICAgdm9pZCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoTTRPU0FfQ29udGV4dCBwQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCgKLSAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFMsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb0N1cnJlbnRNZWRpYVZvbHVtZVZhbCk7Ci0KLSAgICB2b2lkIHNldE9ic2VydmVyKFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKTsKLSAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZSgpOwotCi0gICAgYm9vbCBpc1N0YXJ0ZWQoKTsKLXByaXZhdGU6Ci0KLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyAqbUF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyAqbUF1ZGlvUHJvY2VzczsKLQotICAgIE00T1NBX0NvbnRleHQgbUJHQXVkaW9QQ01GaWxlSGFuZGxlOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uOwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQ7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhQmVnaW5DdXRUUzsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbDsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIHNwPEF1ZGlvVHJhY2s+IG1BdWRpb1RyYWNrOwotCi0gICAgTWVkaWFCdWZmZXIgKm1JbnB1dEJ1ZmZlcjsKLQotICAgIGludCBtU2FtcGxlUmF0ZTsKLSAgICBpbnQ2NF90IG1MYXRlbmN5VXM7Ci0gICAgc2l6ZV90IG1GcmFtZVNpemU7Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNQbGF5ZWQ7Ci0KLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVNZWRpYVVzOwotICAgIGludDY0X3QgbVBvc2l0aW9uVGltZVJlYWxVczsKLQotICAgIGJvb2wgbVNlZWtpbmc7Ci0gICAgYm9vbCBtUmVhY2hlZEVPUzsKLSAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLQotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0KLSAgICBib29sIG1Jc0ZpcnN0QnVmZmVyOwotICAgIHN0YXR1c190IG1GaXJzdEJ1ZmZlclJlc3VsdDsKLSAgICBNZWRpYUJ1ZmZlciAqbUZpcnN0QnVmZmVyOwotCi0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0gICAgUHJldmlld1BsYXllciAqbU9ic2VydmVyOwotCi0gICAgc3RhdGljIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pOwotICAgIHZvaWQgQXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pOwotICAgIHNpemVfdCBmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0aWMgc2l6ZV90IEF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKLSAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICptZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KTsKLQotICAgIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzX2woKTsKLSAgICB2b2lkIHNldFByaW1hcnlUcmFja1ZvbHVtZSgKLSAgICAgICAgICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBWRV9BVURJT19QTEFZRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjRmY2Y0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHsKLSAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKLQotICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgbURvRHVja2luZyA9IDA7Ci0gICAgbUR1Y2tpbmdfZW5hYmxlID0gMDsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgPSAwOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgPSAwOwotCi0gICAgbUJUVm9sTGV2ZWwgPSAwOwotICAgIG1QVFZvbExldmVsID0gMDsKLQotICAgIG1Jc1NTUkNuZWVkZWQgPSAwOwotICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0KLSAgICBtQlRGb3JtYXQgPSBNT05PXzE2X0JJVDsKLQotICAgIG1JblNhbXBsZVJhdGUgPSA4MDAwOwotICAgIG1PdXRTYW1wbGVSYXRlID0gMTYwMDA7Ci0gICAgbVBUQ2hhbm5lbENvdW50ID0gMjsKLSAgICBtQlRDaGFubmVsQ291bnQgPSAxOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjptaXhBbmREdWNrKAotICAgICAgICB2b2lkICpwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgIHZvaWQgKmJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqb3V0QnVmZmVyKSB7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogdHJhY2sgYnVmZmVycyAocHJpbWFyeTogMHgleCBhbmQgYmFja2dyb3VuZDogMHgleCkgIgotICAgICAgICAgICAgImFuZCBvdXQgYnVmZmVyIDB4JXgiLAotICAgICAgICAgICAgcHJpbWFyeVRyYWNrQnVmZmVyLCBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsIG91dEJ1ZmZlcik7Ci0KLSAgICBNNEFNX0J1ZmZlcjE2KiBwUHJpbWFyeVRyYWNrICAgPSAoTTRBTV9CdWZmZXIxNiopcHJpbWFyeVRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBCYWNrZ3JvdW5kVHJhY2sgPSAoTTRBTV9CdWZmZXIxNiopYmFja2dyb3VuZFRyYWNrQnVmZmVyOwotICAgIE00QU1fQnVmZmVyMTYqIHBNaXhlZE91dEJ1ZmZlciAgPSAoTTRBTV9CdWZmZXIxNiopb3V0QnVmZmVyOwotCi0gICAgLy8gT3V0cHV0IHNpemUgaWYgc2FtZSBhcyBQVCBzaXplCi0gICAgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSBwUHJpbWFyeVRyYWNrLT5tX2J1ZmZlclNpemU7Ci0KLSAgICAvLyBCZWZvcmUgbWl4aW5nLCB3ZSBuZWVkIHRvIGhhdmUgb25seSBQVCBhcyBvdXQgYnVmZmVyCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3MsIHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplKTsKLQotICAgIC8vIEluaXRpYWxpemUgZHVja2luZyB2YXJpYWJsZXMKLSAgICAvLyBJbml0aWFsbHkgY29udGFpbnMgdGhlIGlucHV0IHByaW1hcnkgdHJhY2sKLSAgICBNNE9TQV9JbnQxNiAqcFBUTWRhdGEyID0gKE00T1NBX0ludDE2KilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBDb250YWlucyBCRyB0cmFjayBwcm9jZXNzZWQgZGF0YShsaWtlIGNoYW5uZWwgY29udmVyc2lvbiBldGMuLgotICAgIE00T1NBX0ludDE2ICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYqKSBwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzOwotCi0gICAgLy8gU2luY2Ugd2UgbmVlZCB0byBnaXZlIHNhbXBsZSBjb3VudCBhbmQgbm90IGJ1ZmZlciBzaXplCi0gICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSA9IHBNaXhlZE91dEJ1ZmZlci0+bV9idWZmZXJTaXplIC8gMiA7Ci0KLSAgICBpZiAoKG1EdWNraW5nX2VuYWJsZSkgJiYgKG1QVFZvbExldmVsICE9IDAuMCkpIHsKLSAgICAgICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0RiVmFsdWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTTE2U2FtcGxlID0gKE00T1NBX0ludDE2KilwUHJpbWFyeVRyYWNrLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBjb25zdCBzaXplX3QgbiA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZSAvIHNpemVvZihNNE9TQV9JbnQxNik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgbG9vcEluZGV4ID0gMDsgbG9vcEluZGV4IDwgbjsgKytsb29wSW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgOiBwUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGVha0RiVmFsdWUgPSBwcmV2aW91c0RiVmFsdWUgPiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0gPwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheVttQXVkVm9sQXJySW5kZXhdID0gZ2V0RGVjaWJlbFNvdW5kKHBlYWtEYlZhbHVlKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgdGhyZXNob2xkIGlzIGRvbmUgYWZ0ZXIga1Byb2Nlc3NpbmdXaW5kb3dTaXplIGN5Y2xlcwotICAgICAgICBpZiAobUF1ZFZvbEFyckluZGV4ID49IGtQcm9jZXNzaW5nV2luZG93U2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcgPSBpc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVBcnJheSwgbUF1ZFZvbEFyckluZGV4LCBtRHVja2luZ190aHJlc2hvbGQpOwotCi0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZFZvbEFyckluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBCZWxvdyBsb2dpYyBjb250cm9scyB0aGUgbWl4aW5nIHdlaWdodGFnZQotICAgICAgICAvLyBmb3IgQmFja2dyb3VuZCBhbmQgUHJpbWFyeSBUcmFja3MKLSAgICAgICAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB3aW5kb3cgdW5kZXIgYW5hbHlzaXMsCi0gICAgICAgIC8vIHRvIGdpdmUgZmFkZS1vdXQgZm9yIEJhY2tncm91bmQgYW5kIGZhZGUtaW4gZm9yIHByaW1hcnkKLSAgICAgICAgLy8gQ3VycmVudCBmYWRpbmcgZmFjdG9yIGlzIGRpc3RyaWJ1dGVkIGluIGVxdWFsIHJhbmdlIG92ZXIKLSAgICAgICAgLy8gdGhlIGRlZmluZWQgd2luZG93IHNpemUuCi0gICAgICAgIC8vIEZvciBhIHdpbmRvdyBzaXplID0gMjUKLSAgICAgICAgLy8gKDUwMCBtcyAod2luZG93IHVuZGVyIGFuYWx5c2lzKSAvIDIwIG1zIChzYW1wbGUgZHVyYXRpb24pKQotICAgICAgICAvLwotCi0gICAgICAgIGlmIChtRG9EdWNraW5nKSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPiBtRHVja2luZ19sb3dWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvLyBGQURFIE9VVCBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBpbiBmYWN0b3IKLSAgICAgICAgICAgICAgICAvLyBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciAtPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yID0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1EdWNraW5nRmFjdG9yIDwgMS4wICkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgSU4gQkcgVHJhY2sKLSAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZHVja2luZyBmYWN0b3IgaW4gdG90YWwgc3RlcHMgb2YKLSAgICAgICAgICAgICAgICAvLyBsb3cgdm9sdW1lIGZhY3RvciB0byByZWFjaCBvcmlnLnZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yICs9IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAtIG1EdWNraW5nX2VuYWJsZQotCi0KLSAgICAvLyBNaXhpbmcgbG9naWMKLSAgICBBTE9HVigiT3V0IG9mIER1Y2tpbmcgYW5hbHlzaXMgdWlQQ01zaXplICVkICVmICVmIiwKLSAgICAgICAgICAgIG1Eb0R1Y2tpbmcsIG1EdWNraW5nRmFjdG9yLCBtQlRWb2xMZXZlbCk7Ci0gICAgd2hpbGUgKHVpUENNc2l6ZS0tID4gMCkgewotCi0gICAgICAgIC8vIFNldCB2b2wgZmFjdG9yIGZvciBCVCBhbmQgUFQKLSAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSptQlRWb2xMZXZlbCk7Ci0gICAgICAgICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCpwUFRNZGF0YTIqbVBUVm9sTGV2ZWwpOwotCi0gICAgICAgIC8vIE1peCB0aGUgdHdvIHNhbXBsZXMKLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLQotICAgICAgICAgICAgLy8gRHVjayB0aGUgQkcgdHJhY2sgdG8gZHVja2luZyBmYWN0b3IgdmFsdWUgYmVmb3JlIG1peGluZwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotCi0gICAgICAgICAgICAvLyBtaXggYXMgbm9ybWFsIGNhc2UKLSAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwQlRNZGF0YTEgLzIgKyAqcFBUTWRhdGEyIC8yKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKCpwQlRNZGF0YTEpKihtRHVja2luZ0ZhY3RvcikpOwotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfSW50MzIgdGVtcDsKLSAgICAgICAgaWYgKCpwQlRNZGF0YTEgPCAwKSB7Ci0gICAgICAgICAgICB0ZW1wID0gLSgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotCi0gICAgICAgICAgICBpZiAodGVtcCA+IDMyNzY3KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IC0zMjc2NjsgLy8gbGVzcyB0aGVuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwQlRNZGF0YTEgPSAoTTRPU0FfSW50MTYpKC10ZW1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSAoKnBCVE1kYXRhMSkgKiAyOyAvLyBicmluZyB0byBvcmlnaW5hbCBBbXBsaXR1ZGUgbGV2ZWwKLSAgICAgICAgICAgIGlmICggdGVtcCA+IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IDMyNzY3OyAvLyBsZXNzIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEJUTWRhdGExKys7Ci0gICAgICAgIHBQVE1kYXRhMisrOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKilwQmFja2dyb3VuZFRyYWNrLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQmFja2dyb3VuZFRyYWNrLT5tX2J1ZmZlclNpemUpOwotCi0gICAgQUxPR1YoIm1peEFuZER1Y2s6IFgiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Y2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCkgewotCi0gICAgLy8gVGhpcyBhbHJlYWR5IHRha2VzIGNhcmUgb2YgY2hhbm5lbCBjb3VudCBpbiBtQlRCdWZmZXIubV9idWZmZXJTaXplCi0gICAgcmV0dXJuIChtT3V0U2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGUpICogbUJUQnVmZmVyLm1fYnVmZmVyU2l6ZTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpzZXRNaXhQYXJhbXMoCi0gICAgICAgIGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHNldHRpbmcpIHsKLSAgICBBTE9HVigic2V0TWl4UGFyYW1zIik7Ci0KLSAgICBtRHVja2luZ19lbmFibGUgICAgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2VuYWJsZTsKLSAgICBtRHVja2luZ19sb3dWb2x1bWUgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBtRHVja2luZ190aHJlc2hvbGQgICAgPSBzZXR0aW5nLmx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBtUFRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2UFRWb2xMZXZlbDsKLSAgICBtQlRWb2xMZXZlbCAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRWb2xMZXZlbCA7Ci0gICAgbUJUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50OwotICAgIG1QVENoYW5uZWxDb3VudCAgICAgICA9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudDsKLSAgICBtQlRGb3JtYXQgICAgICAgICAgICAgPSBzZXR0aW5nLmx2QlRGb3JtYXQ7Ci0gICAgbUluU2FtcGxlUmF0ZSAgICAgICAgID0gc2V0dGluZy5sdkluU2FtcGxlUmF0ZTsKLSAgICBtT3V0U2FtcGxlUmF0ZSAgICAgICAgPSBzZXR0aW5nLmx2T3V0U2FtcGxlUmF0ZTsKLQotICAgIC8vIFJlc2V0IHRoZSBmb2xsb3dpbmcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzCi0gICAgbUF1ZFZvbEFyckluZGV4ICAgICAgID0gMDsKLSAgICBtRG9EdWNraW5nICAgICAgICAgICAgPSAwOwotICAgIG1EdWNraW5nRmFjdG9yICAgICAgICA9IDEuMDsKLQotICAgIEFMT0dWKCJkdWNraW5nIGVuYWJsZSAweCV4IGxvd1ZvbHVtZSAlZiB0aHJlc2hvbGQgJWQgIgotICAgICAgICAgICAgImZQVFZvbExldmVsICVmIEJUVm9sTGV2ZWwgJWYiLAotICAgICAgICAgICAgbUR1Y2tpbmdfZW5hYmxlLCBtRHVja2luZ19sb3dWb2x1bWUsIG1EdWNraW5nX3RocmVzaG9sZCwKLSAgICAgICAgICAgIG1QVFZvbExldmVsLCBtUFRWb2xMZXZlbCk7Ci0KLSAgICAvLyBEZWNpZGVzIGlmIFNTUkMgc3VwcG9ydCBpcyBuZWVkZWQgZm9yIHRoaXMgbWl4aW5nCi0gICAgbUlzU1NSQ25lZWRlZCA9IChzZXR0aW5nLmx2SW5TYW1wbGVSYXRlICE9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlKTsKLSAgICBpZiAoc2V0dGluZy5sdkJUQ2hhbm5lbENvdW50ICE9IHNldHRpbmcubHZQVENoYW5uZWxDb3VudCl7Ci0gICAgICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgPT0gMil7Ci0gICAgICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAxOyAvLyBjb252ZXJ0IHRvIE1PTk8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDI7IC8vIENvbnZlcnQgdG8gU1RFUkVPCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgIH0KLX0KLQotLy8gRmFzdCB3YXkgdG8gY29tcHV0ZSAxMCAqIGxvZyh2YWx1ZSkKLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmdldERlY2liZWxTb3VuZChNNE9TQV9VSW50MzIgdmFsdWUpIHsKLSAgICBBTE9HVigiZ2V0RGVjaWJlbFNvdW5kOiAlbGQiLCB2YWx1ZSk7Ci0KLSAgICBpZiAodmFsdWUgPD0gMCB8fCB2YWx1ZSA+IDB4ODAwMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHg0MDAwKSB7IC8vIDMyNzY4Ci0gICAgICAgIHJldHVybiA5MDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgyMDAwKSB7IC8vIDE2Mzg0Ci0gICAgICAgIHJldHVybiA4NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgxMDAwKSB7IC8vIDgxOTIKLSAgICAgICAgcmV0dXJuIDc4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDA4MDApIHsgLy8gNDAyOAotICAgICAgICByZXR1cm4gNzI7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDQwMCkgeyAvLyAyMDQ4Ci0gICAgICAgIHJldHVybiA2NjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMjAwKSB7IC8vIDEwMjQKLSAgICAgICAgcmV0dXJuIDYwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAxMDApIHsgLy8gNTEyCi0gICAgICAgIHJldHVybiA1NDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDgwKSB7IC8vIDI1NgotICAgICAgICByZXR1cm4gNDg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDA0MCkgeyAvLyAxMjgKLSAgICAgICAgcmV0dXJuIDQyOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMjApIHsgLy8gNjQKLSAgICAgICAgcmV0dXJuIDM2OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMTApIHsgLy8gMzIKLSAgICAgICAgcmV0dXJuIDMwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDgpIHsgLy8gMTYKLSAgICAgICAgcmV0dXJuIDI0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDcpIHsgLy8gOAotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwMykgeyAvLyA0Ci0gICAgICAgIHJldHVybiAxODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDAxKSB7IC8vIDIKLSAgICAgICAgcmV0dXJuIDEyOwotICAgIH0gZWxzZSAgeyAvLyAxCi0gICAgICAgIHJldHVybiA2OwotICAgIH0KLX0KLQotTTRPU0FfQm9vbCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjppc1RocmVzaG9sZEJyZWFjaGVkKAotICAgICAgICBNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LAotICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSkgewotCi0gICAgQUxPR1YoImlzVGhyZXNob2xkQnJlYWNoZWQiKTsKLQotICAgIGludCB0b3RhbFZhbHVlID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7ICsraSkgewotICAgICAgICB0b3RhbFZhbHVlICs9IGF2ZXJhZ2VWYWx1ZVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuICh0b3RhbFZhbHVlIC8gc3RvcmVDb3VudCA+IHRocmVzaG9sZFZhbHVlKTsKLX0KLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiN2E2OWYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLSNkZWZpbmUgVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKLQotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MTYqICAgbV9kYXRhQWRkcmVzczsgLy8gQW5kcm9pZCBTUkMgbmVlZHMgYSBJbnQxNiBwb2ludGVyCi0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLX0gTTRBTV9CdWZmZXIxNjsgICAgLy8gU3RydWN0dXJlIGNvbnRhaW5zIEludDE2X3QgcG9pbnRlcgotCi1lbnVtIEF1ZGlvRm9ybWF0IHsKLSAgICBNT05PXzE2X0JJVCwKLSAgICBTVEVSRU9fMTZfQklUCi19OwotCi0vLyBGb2xsb3dpbmcgc3RydWN0IHdpbGwgYmUgdXNlZCBieSBhcHAgdG8gc3VwcGx5IHRoZSBQVCBhbmQgQlQgcHJvcGVydGllcwotLy8gYWxvbmcgd2l0aCBkdWNraW5nIHZhbHVlcwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX0ludDMyIGx2SW5TYW1wbGVSYXRlOyAvLyBTYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIE00T1NBX0ludDMyIGx2T3V0U2FtcGxlUmF0ZTsgLy9TYW1wbGluZyBhdWRpbyBmcmVxICg4MDAwLDE2MDAwIG9yIG1vcmUgKQotICAgIEF1ZGlvRm9ybWF0IGx2QlRGb3JtYXQ7Ci0KLSAgICBNNE9TQV9JbnQzMiBsdkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgTTRPU0FfRmxvYXQgbHZJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgbHZJbkR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0Zsb2F0IGx2UFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBsdkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfSW50MzIgbHZCVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBsdlBUQ2hhbm5lbENvdW50OwotfSBBdWRpb01peFNldHRpbmdzOwotCi0vLyBUaGlzIGNsYXNzIGlzIGRlZmluZWQgdG8gZ2V0IFNGIFNSQyBhY2Nlc3MKLWNsYXNzIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgewotcHVibGljOgotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoKTsKLSAgICB+VmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpIHt9Ci0KLSAgICB2b2lkIHNldE1peFBhcmFtcyhjb25zdCBBdWRpb01peFNldHRpbmdzJiBwYXJhbXMpOwotCi0gICAgTTRPU0FfSW50MzIgbWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogcHJpbWFyeVRyYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBiYWNrZ3JvdW5kVHJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIG1peGVkT3V0cHV0QnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1Byb2Nlc3NpbmdXaW5kb3dTaXplID0gMTAsCi0gICAgfTsKLQotICAgIE00T1NBX0ludDMyIG1JblNhbXBsZVJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbU91dFNhbXBsZVJhdGU7Ci0gICAgQXVkaW9Gb3JtYXQgbUJURm9ybWF0OwotCi0gICAgTTRPU0FfQm9vbCBtSXNTU1JDbmVlZGVkOwotICAgIE00T1NBX0ludDMyIG1CVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9JbnQzMiBtUFRDaGFubmVsQ291bnQ7Ci0gICAgTTRPU0FfVUludDggbUNoYW5uZWxDb252ZXJzaW9uOwotCi0gICAgTTRPU0FfVUludDMyIG1EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfRmxvYXQgbUR1Y2tpbmdGYWN0b3IgOwotICAgIE00T1NBX0Jvb2wgbUR1Y2tpbmdfZW5hYmxlOwotICAgIE00T1NBX0ludDMyIG1BdWRpb1ZvbHVtZUFycmF5W2tQcm9jZXNzaW5nV2luZG93U2l6ZV07Ci0gICAgTTRPU0FfSW50MzIgbUF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Jvb2wgbURvRHVja2luZzsKLSAgICBNNE9TQV9GbG9hdCBtUFRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCBtQlRWb2xMZXZlbDsKLQotICAgIE00QU1fQnVmZmVyMTYgbUJUQnVmZmVyOwotCi0gICAgTTRPU0FfSW50MzIgZ2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSk7Ci0gICAgTTRPU0FfQm9vbCAgaXNUaHJlc2hvbGRCcmVhY2hlZChNNE9TQV9JbnQzMiogYXZlcmFnZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzdG9yZUNvdW50LCBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSk7Ci0KLSAgICAvLyBUaGlzIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIHdoaWNoIG5lZWRzIHRvIGFsbG9jYXRlZAotICAgIC8vIGJlZm9yZSByZXNhbXBsaW5nIGlzIGNhbGxlZAotICAgIE00T1NBX0ludDMyIGNhbGN1bGF0ZU91dFJlc2FtcGxlQnVmU2l6ZSgpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKGNvbnN0IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmKTsKLSAgICBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJiBvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVkVfQkFDS0dST1VORF9BVURJT19QUk9DX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkNjU2YzQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQbGF5ZXIuaCIKLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvclBsYXllcjo6VmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKQotICAgIDogbVBsYXllcihuZXcgUHJldmlld1BsYXllcihyZW5kZXJlcikpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllciIpOwotICAgIG1QbGF5ZXItPnNldExpc3RlbmVyKHRoaXMpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6flZpZGVvRWRpdG9yUGxheWVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQbGF5ZXIiKTsKLQotICAgIHJlc2V0KCk7Ci0gICAgbVZlQXVkaW9TaW5rLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgbVBsYXllcjsKLSAgICBtUGxheWVyID0gTlVMTDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmluaXRDaGVjaygpIHsKLSAgICBBTE9HVigiaW5pdENoZWNrIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb1BsYXllcihWaWRlb0VkaXRvckF1ZGlvUGxheWVyICphdWRpb1BsYXllcikgewotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb1BsYXllcihhdWRpb1BsYXllcik7Ci19Ci0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBBTE9HSSgic2V0RGF0YVNvdXJjZSgnJXMnKSIsIHVybCk7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiSGVhZGVycyBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKTsKLX0KLQotLy9XZSBkb25vdCB1c2UgdGhpcyBpbiBwcmV2aWV3LCBkdW1teSBpbXBsaW1lbnRhdGlvbiBhcyB0aGlzIGlzIHB1cmUgdmlydHVhbAotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwKLSAgICBpbnQ2NF90IGxlbmd0aCkgewotICAgIEFMT0dFKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSBOb3Qgc3VwcG9ydGVkIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gKCFPSyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlIik7Ci0KLSAgICBtUGxheWVyLT5zZXRTdXJmYWNlKHN1cmZhY2UpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgQUxPR1YoInNldFZpZGVvU3VyZmFjZVRleHR1cmUiKTsKLQotICAgIG1QbGF5ZXItPnNldFN1cmZhY2VUZXh0dXJlKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwcmVwYXJlKCkgewotICAgIEFMT0dWKCJwcmVwYXJlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnByZXBhcmVBc3luYygpIHsKLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZUFzeW5jKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzdGFydCgpIHsKLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cGxheSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIHJldHVybiBwYXVzZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cGF1c2UoKSB7Ci0gICAgQUxPR1YoInBhdXNlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnBhdXNlKCk7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JQbGF5ZXI6OmlzUGxheWluZygpIHsKLSAgICBBTE9HVigiaXNQbGF5aW5nIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmlzUGxheWluZygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2Vla1RvKGludCBtc2VjKSB7Ci0gICAgQUxPR1YoInNlZWtUbyIpOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNlZWtUbygoaW50NjRfdCltc2VjICogMTAwMCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpIHsKLSAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uIik7Ci0gICAgaW50NjRfdCBwb3NpdGlvblVzOwotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPmdldFBvc2l0aW9uKCZwb3NpdGlvblVzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChwb3NpdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0RHVyYXRpb24oaW50ICptc2VjKSB7Ci0gICAgQUxPR1YoImdldER1cmF0aW9uIik7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAqbXNlYyA9IDA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChkdXJhdGlvblVzICsgNTAwKSAvIDEwMDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXQoKSB7Ci0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgbVBsYXllci0+cmVzZXQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgQUxPR1YoInNldExvb3BpbmciKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0TG9vcGluZyhsb29wKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKLSAgICBBTE9HRSgic2V0UGFyYW1ldGVyIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0UoImdldFBhcmFtZXRlciBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXBsYXllcl90eXBlIFZpZGVvRWRpdG9yUGxheWVyOjpwbGF5ZXJUeXBlKCkgewotICAgIEFMT0dWKCJwbGF5ZXJUeXBlIik7Ci0gICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6YWNxdWlyZUxvY2soKSB7Ci0gICAgQUxPR1YoImFjcXVpcmVMb2NrIik7Ci0gICAgbVBsYXllci0+YWNxdWlyZUxvY2soKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6cmVsZWFzZUxvY2soKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VMb2NrIik7Ci0gICAgbVBsYXllci0+cmVsZWFzZUxvY2soKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKLSAgICBNZWRpYVBsYXllckludGVyZmFjZTo6c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7Ci0KLSAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IG1QbGF5ZXItPmdldFNvdXJjZVNlZWtGbGFncygpOwotCi0gICAgTWV0YWRhdGEgbWV0YWRhdGEocmVjb3Jkcyk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9QQVVTRSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBmbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrRm9yd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLX0ZPUldBUkQpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmxvYWRFZmZlY3RzU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0U2V0dGluZ3MsIGludCBuRWZmZWN0cykgewotICAgIEFMT0dWKCJsb2FkRWZmZWN0c1NldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRFZmZlY3RzU2V0dGluZ3MocEVmZmVjdFNldHRpbmdzLCBuRWZmZWN0cyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmxvYWRBdWRpb01peFNldHRpbmdzKHBBdWRpb01peFNldHRpbmdzKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKHBBdWRpb01peFBDTUZpbGVIYW5kbGUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgTTRPU0FfVUludDMyIGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgTTRPU0FfVUludDMyIHByaW1hcnlUcmFja1ZvbFZhbHVlKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQbGF5ZXI6IGxvYWRBdWRpb01peFNldHRpbmdzIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKGF1ZGlvTWl4U3RvcnlCb2FyZFRTLAotICAgICBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsIHByaW1hcnlUcmFja1ZvbFZhbHVlKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tCZWdpblRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tCZWdpblRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRQbGF5YmFja0VuZFRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja0VuZFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tFbmRUaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFN0b3J5Ym9hcmRTdGFydFRpbWUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0U3Rvcnlib2FyZFN0YXJ0VGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKSB7Ci0gICAgQUxPR1YoInNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoY2JJbnRlcnZhbCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBBTE9HVigic2V0TWVkaWFSZW5kZXJpbmdNb2RlIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldE1lZGlhUmVuZGVyaW5nTW9kZShtb2RlLCBvdXRwdXRWaWRlb1NpemUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpIHsKLSAgICBBTE9HVigicmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCIpOwotICAgIHJldHVybiBtUGxheWVyLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKAotICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcyh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnJlYWRGaXJzdFZpZGVvRnJhbWUoKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKSB7Ci0gICAgbVBsYXllci0+Z2V0TGFzdFJlbmRlcmVkVGltZU1zKGxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1NpbmsgaW50ZXJmYWNlICovCi0jdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJWZUF1ZGlvU2luayIKLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjptTWluQnVmZmVyQ291bnQgPSA0OwotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bUlzT25FbXVsYXRvciA9IGZhbHNlOwotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6VmVBdWRpb091dHB1dCgpCi0gICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCkgewotICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwotICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKLSAgICBtTGF0ZW5jeSA9IDA7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotfQotCi1WaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6flZlQXVkaW9PdXRwdXQoKSB7Ci0gICAgY2xvc2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKSB7Ci0KLSAgICBtSXNPbkVtdWxhdG9yID0gZmFsc2U7Ci0gICAgbU1pbkJ1ZmZlckNvdW50ID0gNDsKLX0KLQotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkgewotCi0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICByZXR1cm4gbUlzT25FbXVsYXRvcjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpIHsKLQotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgcmV0dXJuIG1NaW5CdWZmZXJDb3VudDsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2hhbm5lbENvdW50KCkgY29uc3QKLXsKLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmcmFtZVNpemUoKSBjb25zdAotewotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVTaXplKCk7Ci19Ci0KLXVpbnQzMl90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1MYXRlbmN5OwotfQotCi1mbG9hdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Nc2Vjc1BlckZyYW1lOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdCB7Ci0KLSAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpvcGVuKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgewotCi0gICAgbUNhbGxiYWNrID0gY2I7Ci0gICAgbUNhbGxiYWNrQ29va2llID0gY29va2llOwotCi0gICAgLy8gQ2hlY2sgYXJndW1lbnQgImJ1ZmZlckNvdW50IiBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgIGlmIChidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpcyB0b28gc21hbGwgYW5kIGluY3JlYXNlZCB0byAlZCIsCi0gICAgICAgICAgICBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0KLSAgICB9Ci0gICAgQUxPR1YoIm9wZW4oJXUsICVkLCAlZCwgJWQpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobVRyYWNrICE9IDApIGNsb3NlKCk7Ci0gICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgaW50IGZyYW1lQ291bnQ7Ci0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9Ci0gICAgIE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0KLSAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlKmFmRnJhbWVDb3VudCpidWZmZXJDb3VudCkvYWZTYW1wbGVSYXRlOwotCi0gICAgaWYgKGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewotICAgICAgICBzd2l0Y2goY2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1RyYWNrPiB0OwotICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIsCi0gICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIH0KLQotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAxLmUzIC8gKGZsb2F0KSBzYW1wbGVSYXRlOwotICAgIG1MYXRlbmN5ID0gdC0+bGF0ZW5jeSgpOwotICAgIG1UcmFjayA9IHQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RhcnQoKSB7Ci0KLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5nZXRQb3NpdGlvbigmbU51bUZyYW1lc1dyaXR0ZW4pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojpzbm9vcFdyaXRlKAotICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBWaXN1YWxpemF0aW9uIGJ1ZmZlcnMgbm90IHN1cHBvcnRlZAotICAgIHJldHVybjsKLQotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojp3cml0ZSgKLSAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgTE9HX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKLQotICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBzbm9vcFdyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSByZXQgLyA0OyAvLyBhc3N1bWUgMTYgYml0IHN0ZXJlbwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c3RvcCgpIHsKLQotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPnN0b3AoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Zmx1c2goKSB7Ci0KLSAgICBBTE9HVigiZmx1c2giKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+Zmx1c2goKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6cGF1c2UoKSB7Ci0KLSAgICBBTE9HVigiVmVBdWRpb091dHB1dDo6cGF1c2UiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2UoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Y2xvc2UoKSB7Ci0KLSAgICBBTE9HVigiY2xvc2UiKTsKLSAgICBtVHJhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0KLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0OwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0OwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKLSAgICAvL0FMT0dWKCJWZUF1ZGlvT3V0cHV0OjpjYWxsYmFja3dyYXBwZXIiKTsKLSAgICBpZiAoZXZlbnQgIT0gQXVkaW9UcmFjazo6RVZFTlRfTU9SRV9EQVRBKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWZUF1ZGlvT3V0cHV0ICptZSA9IChWZUF1ZGlvT3V0cHV0ICopY29va2llOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0KLSAgICBzaXplX3QgYWN0dWFsU2l6ZSA9ICgqbWUtPm1DYWxsYmFjaykoCi0gICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUik7Ci0KLSAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwotCi0gICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7Ci0gICAgICAgIG1lLT5zbm9vcFdyaXRlKGJ1ZmZlci0+cmF3LCBhY3R1YWxTaXplKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHJlc3VsdC5hcHBlbmQoIiBWZUF1ZGlvT3V0cHV0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUtMSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCi0gICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRS0xLCAiICBtc2VjIHBlciBmcmFtZSglZiksIGxhdGVuY3kgKCVkKVxuIiwKLSAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7Ci0KLSAgICByZXR1cm4gbVNlc3Npb25JZDsKLX0KLQotdWludDMyX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdCB7Ci0gICAgaWYgKG1Nc2Vjc1BlckZyYW1lID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAodWludDMyX3QpKDEuZTMgLyBtTXNlY3NQZXJGcmFtZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4YzEyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiTmF0aXZlV2luZG93UmVuZGVyZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgUHJldmlld1BsYXllcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JQbGF5ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXJJbnRlcmZhY2UgewotICAgIHB1YmxpYzoKLSAgICBjbGFzcyBWZUF1ZGlvT3V0cHV0OiBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5WZUF1ZGlvT3V0cHV0KCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gTlVMTDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFsdGltZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGNoYW5uZWxDb3VudCgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgbGF0ZW5jeSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGZsb2F0ICAgICAgICAgICBtc2Vjc1BlckZyYW1lKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QqKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGdldFNhbXBsZVJhdGUoKSBjb25zdDsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBvcGVuKAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBmbHVzaCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOyB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCxjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKLQotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBpc09uRW11bGF0b3IoKTsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgZ2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBDYWxsYmFja1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7Ci0KLSAgICAgICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOwotICAgICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7Ci0gICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwotICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKLSAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKLSAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0Ci0KLSAgICAgICAgcHVibGljOgotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc25vb3BXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KTsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQbGF5ZXIoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyKTsKLSAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclBsYXllcigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVMb2NrKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHgsIE00T1NBX1VJbnQzMiB5LCBNNE9TQV9VSW50MzIgeik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFSZW5kZXJpbmdNb2RlKE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpOwotCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICAgICAgICptUGxheWVyOwotICAgIHNwPFZlQXVkaW9PdXRwdXQ+ICAgIG1WZUF1ZGlvU2luazsKLQotICAgIFZpZGVvRWRpdG9yUGxheWVyKGNvbnN0IFZpZGVvRWRpdG9yUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2NkM2QwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3Q29udHJvbGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvUGxheWVyLmgiCi0jaW5jbHVkZSAiUHJldmlld1JlbmRlcmVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfVGhyZWFkLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpCi0gICAgOiBtQ3VycmVudFBsYXllcigwKSwKLSAgICAgIG1UaHJlYWRDb250ZXh0KE5VTEwpLAotICAgICAgbVBsYXllclN0YXRlKFZlUGxheWVySWRsZSksCi0gICAgICBtUHJlcGFyZVJlcWVzdChNNE9TQV9GQUxTRSksCi0gICAgICBtQ2xpcExpc3QoTlVMTCksCi0gICAgICBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQoMCksCi0gICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcoMCksCi0gICAgICBtU3RhcnRpbmdDbGlwSW5kZXgoMCksCi0gICAgICBtUHJldmlld0xvb3BpbmcoTTRPU0FfRkFMU0UpLAotICAgICAgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudCgwKSwKLSAgICAgIG1FZmZlY3RzU2V0dGluZ3MoTlVMTCksCi0gICAgICBtTnVtYmVyRWZmZWN0cygwKSwKLSAgICAgIG1DdXJyZW50Q2xpcE51bWJlcigtMSksCi0gICAgICBtQ2xpcFRvdGFsRHVyYXRpb24oMCksCi0gICAgICBtQ3VycmVudFZpZGVvRWZmZWN0KFZJREVPX0VGRkVDVF9OT05FKSwKLSAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKE5VTEwpLAotICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZShOVUxMKSwKLSAgICAgIG1UYXJnZXQoTlVMTCksCi0gICAgICBtSm5pQ29va2llKE5VTEwpLAotICAgICAgbUpuaUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUN1cnJlbnRQbGF5ZWREdXJhdGlvbigwKSwKLSAgICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uKDApLAotICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwKDApLAotICAgICAgbU92ZXJsYXlTdGF0ZShPVkVSTEFZX0NMRUFSKSwKLSAgICAgIG1BY3RpdmVQbGF5ZXJJbmRleCgwKSwKLSAgICAgIG1PdXRwdXRWaWRlb1dpZHRoKDApLAotICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0KDApLAotICAgICAgYlN0b3BUaHJlYWRJblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1TZW1UaHJlYWRXYWl0KE5VTEwpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gTTR4VlNTX2tCbGFja0JvcmRlcnM7Ci0gICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyArK2kpIHsKLSAgICAgICAgbVZlUGxheWVyW2ldID0gTlVMTDsKLSAgICB9Ci19Ci0KLVZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6On5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciIpOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIFN0b3AgdGhlIHRocmVhZCBpZiBpdHMgc3RpbGwgcnVubmluZwotICAgIGlmKG1UaHJlYWRDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0b3AobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBzdG9wIHRocmVhZCIsIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiBlcnJvciAweCV4IFwKLSAgICAgICAgICAgIGluIHRyeWluZyB0byBjbG9zZSB0aHJlYWQiLCAodW5zaWduZWQgaW50KSBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJjbGVhcmluZyBtVmVQbGF5ZXIgJWQiLCBwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgbU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7Ci0KLSAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgcmV0dXJucyIpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6bG9hZEVkaXRTZXR0aW5ncygKLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIGJnbVNldHRpbmdzKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDAsIGlDbGlwRHVyYXRpb24gPSAwLCByZ2JTaXplID0gMDsKLSAgICBNNFZJRklfVUludDggKnRtcCA9IE5VTEw7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyIpOwotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIENoYW5uZWxzID0gJWQsIHNhbXBsaW5nIEZyZXEgJWQiLAotICAgICAgICAgIGJnbVNldHRpbmdzLT51aU5iQ2hhbm5lbHMsIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICApOwotICAgICAgICAgIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0KLSAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5ncyBDaGFubmVscyA9ICVkLCBzYW1wbGluZyBGcmVxICVkIiwKLSAgICAgICAgICBiZ21TZXR0aW5ncy0+dWlOYkNoYW5uZWxzLCBiZ21TZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSAgKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIEVkaXQgc2V0dGluZ3MgYmVmb3JlIGxvYWRpbmcgbmV3IG9uZXMKLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0KLSAgICBpZihtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKSB7Ci0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkQ2xvc2UgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAKLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXS0+cEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUobUNsaXBMaXN0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKG1DbGlwTGlzdCk7Ci0gICAgICAgIG1DbGlwTGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUVmZmVjdHNTZXR0aW5ncykgewotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1DbGlwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCA9IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOwotICAgICAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5nczogIyBvZiBDbGlwcyA9ICVkIiwgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkKTsKLQotICAgICAgICBtQ2xpcExpc3QgPSAoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyoqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIsIE00VlMsCi0gICAgICAgICAoTTRPU0FfQ2hhciopIkx2UFAsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoTlVMTCA9PSBtQ2xpcExpc3QpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBNYWxsb2MgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQ2xpcExpc3QsMCwKLSAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKikqcFNldHRpbmdzLT51aUNsaXBOdW1iZXIpOwotCi0gICAgICAgIGZvcihpPTA7aTxwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjtpKyspIHsKLQotICAgICAgICAgICAgLy8gQWxsb2NhdGUgY3VycmVudCBjbGlwCi0gICAgICAgICAgICBtQ2xpcExpc3RbaV0gPQotICAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSxNNFZTLChNNE9TQV9DaGFyKikiY2xpcCBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZihtQ2xpcExpc3RbaV0gPT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IgZm9yIG1DbGlwTGlzdFslZF0iLCAoaW50KWkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENvcHkgcGxhaW4gc3RydWN0dXJlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBpZihOVUxMICE9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSkgewotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gbUNsaXBMaXN0W2ldLT5wRmlsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbUNsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk5VTEwgZmlsZSBwYXRoIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGR1cmF0aW9uIG9mIGFsbCBjbGlwcwotICAgICAgICAgICAgaUNsaXBEdXJhdGlvbiA9IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgbUNsaXBUb3RhbER1cmF0aW9uID0gbUNsaXBUb3RhbER1cmF0aW9uK2lDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzID09IE5VTEwpIHsKLSAgICAgICAgbU51bWJlckVmZmVjdHMgPSBwU2V0dGluZ3MtPm5iRWZmZWN0czsKLSAgICAgICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3M6IG1OdW1iZXJFZmZlY3RzID0gJWQiLCBtTnVtYmVyRWZmZWN0cyk7Ci0KLSAgICAgICAgaWYobU51bWJlckVmZmVjdHMgIT0gMCkgewotICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5ncyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6IEFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKW1FZmZlY3RzU2V0dGluZ3MsMCwKLSAgICAgICAgICAgICBtTnVtYmVyRWZmZWN0cypzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTlVMTDsKLSAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikmKG1FZmZlY3RzU2V0dGluZ3NbaV0pLAotICAgICAgICAgICAgICAgICAodm9pZCAqKSYocFNldHRpbmdzLT5FZmZlY3RzW2ldKSwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBwRnJhbWluZyBSR0IgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLAotICAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJsdnBwIGZyYW1pbmcgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIGZvciBwRnJhbWluZ0J1ZiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBhY19kYXRhIChSR0IpCi0gICAgICAgICAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I1NjUpewotICAgICAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCoyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoCi0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlID09IE00VlNTM0dQUF9rUkdCODg4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZ2JTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0KjM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczogd3JvbmcgUkdCIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHJnYlNpemUsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopImZyYW1pbmcgYnVmZmVyIHBhY19kYXRhIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYodG1wID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOkFsbG9jIGVycm9yIHBGcmFtaW5nQnVmIHBhYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBGcmFtaW5nQnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfc3RyaWRlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3RvcGxlZnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBwRnJhbWluZyBkYXRhCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgcmdiU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnJnYlR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUJhY2tncm91bmRBdWRpb1NldHRpbmcgPT0gTlVMTCkgewotCi0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyksIE00VlMsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBiZ21TZXR0aW5ncyIpOwotCi0gICAgICAgIGlmKE5VTEwgPT0gbUJhY2tncm91bmRBdWRpb1NldHRpbmcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyBNYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1zZXQoKHZvaWQgKiltQmFja2dyb3VuZEF1ZGlvU2V0dGluZywgMCxzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKW1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLCAodm9pZCAqKWJnbVNldHRpbmdzLCBzaXplb2YoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MpKTsKLQotICAgICAgICBpZiAoIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgPSAoTTRPU0FfVm9pZCopIGJnbVNldHRpbmdzLT5wUENNRmlsZVBhdGg7Ci0gICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+dWlOYkNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMzIwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPcGVuIHRoZSBCRyBmaWxlCi0gICAgICAgIGlmICggbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZE9wZW4oJm1BdWRpb01peFBDTUZpbGVIYW5kbGUsCi0gICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogbUJhY2tncm91bmRBdWRpbyBQQ00gRmlsZSBvcGVuIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT3V0cHV0VmlkZW9TaXplID0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICBtRnJhbWVTdHIucEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgQUxPR1YoInNldFN1cmZhY2UiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UgPSBzdXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RhcnRQcmV2aWV3KAotICAgIE00T1NBX1VJbnQzMiBmcm9tTVMsIE00T1NBX0ludDMyIHRvTXMsIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICBNNE9TQV9Cb29sIGxvb3ApIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotICAgIEFMT0dWKCJzdGFydFByZXZpZXciKTsKLQotICAgIGlmKGZyb21NUyA+IChNNE9TQV9VSW50MzIpdG9NcykgewotICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPiB0b01zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYodG9NcyA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IHRvTXMgaXMgMCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIElmIGFscmVhZHkgc3RhcnRlZCwgdGhlbiBzdG9wIHByZXZpZXcgZmlyc3QKLSAgICBmb3IoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc3RvcHBpbmcgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcgcGxheWJhY2siKTsKLSAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHJlbmRlclByZXZpZXcgd2FzIGNhbGxlZCBwcmV2aW91c2x5LCB0aGVuIGRlbGV0ZSBSZW5kZXJlciBvYmplY3QgZmlyc3QKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogZGVsZXRlIHByZXZpb3VzIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIEF1ZGlvIHBsYXllciB0byBiZSB1c2VkIGZvciBlbnRpcmUKLSAgICAvLyBzdG9yeWJvYXJkIGR1cmF0aW9uCi0gICAgbVZFQXVkaW9TaW5rID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0KCk7Ci0gICAgbVZFQXVkaW9QbGF5ZXIgPSBuZXcgVmlkZW9FZGl0b3JBdWRpb1BsYXllcihtVkVBdWRpb1NpbmspOwotICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nKTsKLSAgICBtVkVBdWRpb1BsYXllci0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotCi0gICAgLy8gQ3JlYXRlIFZpZGVvIFJlbmRlcmVyIHRvIGJlIHVzZWQgZm9yIHRoZSBlbnRpcmUgc3Rvcnlib2FyZCBkdXJhdGlvbi4KLSAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihtT3V0cHV0VmlkZW9TaXplLCAmd2lkdGgsICZoZWlnaHQpOwotICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlciA9IG5ldyBOYXRpdmVXaW5kb3dSZW5kZXJlcihtU3VyZmFjZSwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBsb29wID0gJWQiLCBsb29wKTsKLSAgICBtUHJldmlld0xvb3BpbmcgPSBsb29wOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogY2FsbEJhY2tBZnRlckZyYW1lQ291bnQgPSAlZCIsIGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50KTsKLSAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250ID0gY2FsbEJhY2tBZnRlckZyYW1lQ291bnQ7Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdID0gbmV3IFZpZGVvRWRpdG9yUGxheWVyKG1OYXRpdmVXaW5kb3dSZW5kZXJlcik7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OkVycm9yIGNyZWF0aW5nIFZpZGVvRWRpdG9yUGxheWVyICVkIixwbGF5ZXJJbnN0KTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBvYmplY3QgY3JlYXRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0Tm90aWZ5Q2FsbGJhY2sodGhpcywobm90aWZ5X2NhbGxiYWNrX2Ypbm90aWZ5KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogbm90aWZ5IGNhbGxiYWNrIHNldCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEVmZmVjdHNTZXR0aW5ncyhtRWZmZWN0c1NldHRpbmdzLAotICAgICAgICAgbU51bWJlckVmZmVjdHMpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBlZmZlY3RzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+bG9hZEF1ZGlvTWl4U2V0dGluZ3MobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFNldHRpbmdzIHNldHRpbmdzIGxvYWRlZCIpOwotCi0gICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBBdWRpb01peFBDTUZpbGVIYW5kbGUgc2V0Iik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRQcm9ncmVzc0NhbGxiYWNrSW50ZXJ2YWwoCi0gICAgICAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250KTsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogc2V0UHJvZ3Jlc3NDYWxsQmFja0ludGVydmFsIik7Ci0gICAgfQotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZihmcm9tTVMgPT0gMCkgewotICAgICAgICBtQ3VycmVudENsaXBOdW1iZXIgPSAtMTsKLSAgICAgICAgLy8gU2F2ZSBvcmlnaW5hbCB2YWx1ZQotICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSA9IG1DbGlwTGlzdFswXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBmcm9tTVM9JWQiLCBmcm9tTVMpOwotICAgICAgICBpZihmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiBmcm9tTVMgPj0gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZihmcm9tTVMgPCAoaUluY3JlbWVudGVkRHVyYXRpb24gKyAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSkgewotICAgICAgICAgICAgICAgIC8vIFNldCB0byAxIGluZGV4IGJlbG93LAotICAgICAgICAgICAgICAgIC8vIGFzIHRocmVhZFByb2Nlc3MgZmlyc3QgaW5jcmVtZW50cyB0aGUgY2xpcCBpbmRleAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHByb2Nlc3NlcyBjbGlwIGluIHRocmVhZCBsb29wCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyID0gaS0xOwotICAgICAgICAgICAgICAgIEFMT0dEKCJzdGFydFByZXZpZXc6bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQgZnJvbU1TPSVkIixpLGZyb21NUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgLy8gU2V0IGNvcnJlY3QgYmVnaW4gdGltZSB0byBzdGFydCBwbGF5YmFjawotICAgICAgICAgICAgICAgIGlmKChmcm9tTVMrbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkgPgotICAgICAgICAgICAgICAgIChpSW5jcmVtZW50ZWREdXJhdGlvbittQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSArCi0gICAgICAgICAgICAgICAgICAgICAoZnJvbU1TIC0gaUluY3JlbWVudGVkRHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAgPSBpSW5jcmVtZW50ZWREdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShmcm9tTVMsCi0gICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSwKLSAgICAgICAgIG1DbGlwTGlzdFtpXS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLQotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgc2V0ICVkIGN1dHRpbWUgXAotICAgICAgICAgJWQiLCBmcm9tTVMsIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0KLSAgICBtU3RhcnRpbmdDbGlwSW5kZXggPSBtQ3VycmVudENsaXBOdW1iZXIrMTsKLQotICAgIC8vIFN0YXJ0IHBsYXlpbmcgd2l0aCBwbGF5ZXIgaW5zdGFuY2UgMAotICAgIG1DdXJyZW50UGxheWVyID0gMDsKLSAgICBtQWN0aXZlUGxheWVySW5kZXggPSAwOwotCi0gICAgaWYodG9NcyA9PSAtMSkgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBQcmV2aWV3IHRpbGwgZW5kIG9mIHN0b3J5Ym9hcmQiKTsKLSAgICAgICAgbU51bWJlckNsaXBzVG9QcmV2aWV3ID0gbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkOwotICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIG1MYXN0UHJldmlld0NsaXBFbmRUaW1lID0KLSAgICAgICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IHRvTXM9JWQiLCB0b01zKTsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMil0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhcnRQcmV2aWV3OiB0b01zID4gbUNsaXBUb3RhbER1cmF0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwOwotCi0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7aSsrKSB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXRvTXMgPD0gKGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWUgPSBtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGVuZCBjdXQgdGltZSBvZiBjbGlwIGluZGV4IGkgdG8gdG9NcwotICAgICAgICAgICAgICAgIG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID0gdG9NczsKLQotICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjbGlwcyB0byBiZSBwcmV2aWV3ZWQgaXMgZnJvbSBpbmRleCAwIHRvIGkKLSAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnkgMSBhcyBpIHN0YXJ0cyBmcm9tIDAKLSAgICAgICAgICAgICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcgPSBpKzE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IGlJbmNyZW1lbnRlZER1cmF0aW9uICsKLSAgICAgICAgICAgICAgICAgKG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIC0gbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPcGVuIHRoZSB0aHJlYWQgc2VtYXBob3JlCi0gICAgTTRPU0Ffc2VtYXBob3JlT3BlbigmbVNlbVRocmVhZFdhaXQsIDEpOwotCi0gICAgLy8gT3BlbiB0aGUgcHJldmlldyBwcm9jZXNzIHRocmVhZAotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNPcGVuKCZtVGhyZWFkQ29udGV4dCwgKE00T1NBX1RocmVhZERvSXQpdGhyZWFkUHJvYyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOk00T1NBX3RocmVhZFN5bmNPcGVuIGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHN0YWNrc2l6ZQotICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24obVRocmVhZENvbnRleHQsIE00T1NBX1RocmVhZFN0YWNrU2l6ZSwKLSAgICAgKE00T1NBX0RhdGFPcHRpb24pIGtQcmV2aWV3VGhyZWFkU3RhY2tTaXplKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjogdGhyZWFkU3luY1NldE9wdGlvbiBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgLy8gU3RhcnQgdGhlIHRocmVhZAotICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RhcnQobVRocmVhZENvbnRleHQsIChNNE9TQV9Wb2lkKil0aGlzKTsKLSAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU3RhcnQgZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgQUxPR1YoInN0YXJ0UHJldmlldzogcHJvY2VzcyB0aHJlYWQgc3RhcnRlZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c3RvcFByZXZpZXcoKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdWludDMyX3QgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgPSAwOwotICAgIEFMT0dWKCJzdG9wUHJldmlldyIpOwotCi0gICAgLy8gU3RvcCB0aGUgdGhyZWFkCi0gICAgaWYobVRocmVhZENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tTZW0pOwotICAgICAgICAgICAgaWYgKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVQb3N0KG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdG9wKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gc3RvcCB0aHJlYWQiLCBlcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdG9wUHJldmlldzogZXJyb3IgMHgleCBpbiB0cnlpbmcgdG8gY2xvc2UgdGhyZWFkIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgLy8gQ29udGludWUgZXZlbiBpZiBlcnJvcgotICAgICAgICB9Ci0KLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsb3NlIHRoZSBzZW1hcGhvcmUgZmlyc3QKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja1NlbSk7Ci0gICAgICAgIGlmKG1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKG1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xvc2Ugc2VtYXBob3JlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBtU2VtVGhyZWFkV2FpdCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOyBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XS0+aXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcCB0aGUgcGxheWVyIGZpcnN0Iik7Ci0gICAgICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGxheWVySW5zdCA9PSBtQWN0aXZlUGxheWVySW5kZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGxhc3QgcmVuZGVyZWQgZnJhbWUgdGltZSBzdGFtcAotICAgICAgICAgICAgICAgIG1WZVBsYXllclttQWN0aXZlUGxheWVySW5kZXhdLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMoJmxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UaGlzIGlzIHVzZWQgdG8gc3luY3Jvbml6ZSBvblN0cmVhbURvbmUoKSBpbiBQcmV2aWV3UGxheWVyIGFuZAotICAgICAgICAgICAgLy9zdG9wUHJldmlldygpIGluIFByZXZpZXdDb250cm9sbGVyCi0gICAgICAgICAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gdGVtcCA9IG1WZVBsYXllcltwbGF5ZXJJbnN0XTsKLSAgICAgICAgICAgIHRlbXAtPmFjcXVpcmVMb2NrKCk7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyaW5nIG1WZVBsYXllciIpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBOVUxMOwotICAgICAgICAgICAgdGVtcC0+cmVsZWFzZUxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigic3RvcFByZXZpZXc6IGNsZWFyIGF1ZGlvU2luayBhbmQgYXVkaW9QbGF5ZXIiKTsKLSAgICBtVkVBdWRpb1NpbmsuY2xlYXIoKTsKLSAgICBpZiAobVZFQXVkaW9QbGF5ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1WRUF1ZGlvUGxheWVyOwotICAgICAgICBtVkVBdWRpb1BsYXllciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLSAgICBtTmF0aXZlV2luZG93UmVuZGVyZXIgPSBOVUxMOwotCi0gICAgLy8gSWYgaW1hZ2UgZmlsZSBwbGF5aW5nLCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBwb2ludGVyCi0gICAgaWYobUZyYW1lU3RyLnBCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKG1GcmFtZVN0ci5wQnVmZmVyKTsKLSAgICAgICAgbUZyYW1lU3RyLnBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGJlZ2luIGN1dHRpbWUgb2YgZmlyc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttU3RhcnRpbmdDbGlwSW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9IG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAqLwotICAgIG1DbGlwTGlzdFttTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9IG1MYXN0UHJldmlld0NsaXBFbmRUaW1lOwotCi0gICAgbVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotICAgIG1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uID0gMDsKLSAgICBtQ3VycmVudENsaXBEdXJhdGlvbiA9IDA7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBNNHhWU1Nfa0JsYWNrQm9yZGVyczsKLSAgICBtT3V0cHV0VmlkZW9XaWR0aCA9IDA7Ci0gICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gMDsKLQotICAgIEFMT0dWKCJzdG9wUHJldmlldygpIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zICVsZCIsIGxhc3RSZW5kZXJlZEZyYW1lVGltZU1zKTsKLSAgICByZXR1cm4gbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXM7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpjbGVhclN1cmZhY2UoCi0gICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRCdWZmZXJXaWR0aCA9MCwgb3V0cHV0QnVmZmVySGVpZ2h0PTA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVPdXRbM107Ci0gICAgQUxPR1YoIkluc2lkZSBwcmV2aWV3IGNsZWFyIGZyYW1lIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbVRhcmdldCA9IFByZXZpZXdSZW5kZXJlcjo6Q3JlYXRlUHJldmlld1JlbmRlcmVyKAotICAgICAgICAgICAgc3VyZmFjZSwKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcldpZHRoLCBvdXRwdXRCdWZmZXJIZWlnaHQpOwotCi0gICAgICAgIGlmKG1UYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogY2Fubm90IGNyZWF0ZSBQcmV2aWV3UmVuZGVyZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgob3V0cHV0QnVmZmVyV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChvdXRwdXRCdWZmZXJIZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdXJmYWNlIHdpdGggYmxhY2sgZnJhbWUgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFswXS5wYWNfZGF0YSwweDAwLHBsYW5lT3V0WzBdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogMS41KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwbGFuZU91dFsxXS5wYWNfZGF0YSwxMjgscGxhbmVPdXRbMV0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzJdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsyXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgbVRhcmdldC0+cmVuZGVyWVYxMigpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpyZW5kZXJQcmV2aWV3RnJhbWUoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbywKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBDdXJyRWRpdEluZm8pIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUluY3JlbWVudGVkRHVyYXRpb24gPSAwLCB0blRpbWVNcz0wLCBmcmFtZXNpemUgPTA7Ci0gICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVTdHIgPSBwRnJhbWVJbmZvOwotICAgIE00VklGSV9VSW50OCAqcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChwQ3VyckVkaXRJbmZvICE9IE5VTEwpIHsKLSAgICAgICAgcEN1cnJFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSAtMTsKLSAgICB9Ci0gICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlbmRlcmVyIGluc3RhbmNlCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtT3V0cHV0VmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgfQotCi0gICAgaWYobU91dHB1dFZpZGVvSGVpZ2h0ID09IDApIHsKLSAgICAgICAgbU91dHB1dFZpZGVvSGVpZ2h0ID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHJlbmRlcmVyCi0gICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICBtVGFyZ2V0ID0gUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBzdXJmYWNlLAotICAgICAgICAgICAgbU91dHB1dFZpZGVvV2lkdGgsIG1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLSAgICAgICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3QgY3JlYXRlIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0KLSAgICAvLyBBcHBseSByb3RhdGlvbiBpZiByZXF1aXJlZAotICAgIGlmIChwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUgIT0gMCkgewotICAgICAgICBlcnIgPSBhcHBseVZpZGVvUm90YXRpb24oKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgcEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3Qgcm90YXRlIHZpZGVvLCBlcnIgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAvLyBWaWRlbyByb3RhdGlvbiBkb25lLgotICAgICAgICAgICAvLyBTd2FwIHdpZHRoIGFuZCBoZWlnaHQgaWYgOTAgb3IgMjcwIGRlZ3JlZXMKLSAgICAgICAgICAgaWYgKHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgICAgICAgIGludDMyX3QgdGVtcCA9IHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQgPSB0ZW1wOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gUG9zdHByb2Nlc3NpbmcgKGFwcGx5IHZpZGVvIGVmZmVjdCkKLSAgICBpZihwRnJhbWVTdHItPmJBcHBseUVmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgZWZmZWN0IHN0YXJ0dGltZSBtYXRjaGVzIHRoZSBjbGlwIGJlaW5nIHByZXZpZXdlZAotICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPCBwRnJhbWVTdHItPmNsaXBCZWdpbkN1dFRpbWUpCi0gICAgICAgICAgICAgfHwobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA+PSBwRnJhbWVTdHItPmNsaXBFbmRDdXRUaW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgY2xpcCwgY2hlY2sgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBGcmFtZVN0ci0+dGltZU1zKSAmJgotICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lK21FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbikgPj0KLSAgICAgICAgICAgICBwRnJhbWVTdHItPnRpbWVNcykgJiYgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgICAgIHNldFZpZGVvRWZmZWN0VHlwZShtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRWaWRlb0VmZmVjdFR5cGUobUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUHJvdmlkZSB0aGUgb3ZlcmxheSBVcGRhdGUgaW5kaWNhdGlvbiB3aGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgZWZmZWN0Ci0gICAgICAgIGlmIChtQ3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZSQU1JTkcpIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gflZJREVPX0VGRkVDVF9GUkFNSU5HOyAvL25ldmVyIGFwcGx5IGZyYW1pbmcgaGVyZS4KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lIDw9IHBGcmFtZUluZm8tPnRpbWVNcykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uKSA+PSBwRnJhbWVJbmZvLT50aW1lTXMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaW5kZXggPCBtTnVtYmVyRWZmZWN0cykgJiYgKHBDdXJyRWRpdEluZm8gIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIEFMT0dWKCJGcmFtaW5nIGluZGV4ID0gJWQiLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJObyBmcmFtaW5nIGVmZmVjdHMgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgIT0gVklERU9fRUZGRUNUX05PTkUpIHsKLSAgICAgICAgICAgIGVyciA9IGFwcGx5VmlkZW9FZmZlY3QoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0LCBwRnJhbWVTdHItPnRpbWVNcywKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBpeGVsQXJyYXkpOwotCi0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGFwcGx5VmlkZW9FZmZlY3QgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgICAgICBlcnIgPSBkb0ltYWdlUmVuZGVyaW5nTW9kZSgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTpkb0ltYWdlUmVuZGVyaW5nTW9kZSBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gQXBwbHkgdGhlIHJlbmRlcmluZyBtb2RlCi0gICAgICAgIGVyciA9IGRvSW1hZ2VSZW5kZXJpbmdNb2RlKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciwgcEZyYW1lU3RyLT51aUZyYW1lV2lkdGgsCi0gICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICBkZWxldGUgbVRhcmdldDsKLSAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgIHBpeGVsQXJyYXkgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1UYXJnZXQtPnJlbmRlcllWMTIoKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9Wb2lkIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldEpuaUNhbGxiYWNrKHZvaWQqIGNvb2tpZSwKLSAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IGNhbGxiYWNrRmN0KSB7Ci0gICAgLy9BTE9HVigic2V0Sm5pQ2FsbGJhY2siKTsKLSAgICBtSm5pQ29va2llID0gY29va2llOwotICAgIG1KbmlDYWxsYmFjayA9IGNhbGxiYWNrRmN0OwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6cHJlcGFyZVBsYXllcigKLSAgICB2b2lkKiBwYXJhbSwgaW50IHBsYXllckluc3RhbmNlLCBpbnQgaW5kZXgpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKilwYXJhbTsKLQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBpbnN0YW5jZSAlZCBmaWxlICVkIiwgcGxheWVySW5zdGFuY2UsIGluZGV4KTsKLQotICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gKGNvbnN0IGNoYXIqKSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+cEZpbGU7Ci0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldERhdGFTb3VyY2UoZmlsZU5hbWUsIE5VTEwpOwotCi0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldERhdGFTb3VyY2UgaW5zdGFuY2UgJXMiLAotICAgICAoY29uc3QgY2hhciAqKXBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0VmlkZW9TdXJmYWNlKAotICAgICBwQ29udHJvbGxlci0+bVN1cmZhY2UpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRWaWRlb1N1cmZhY2UiKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRNZWRpYVJlbmRlcmluZ01vZGUoCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICBwQ29udHJvbGxlci0+bU91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldE1lZGlhUmVuZGVyaW5nTW9kZSIpOwotCi0gICAgaWYoKE00T1NBX1VJbnQzMilpbmRleCA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZXRQbGF5YmFja0JlZ2luVGltZSgKLSAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFBsYXliYWNrQmVnaW5UaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tFbmRUaW1lKAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0UGxheWJhY2tFbmRUaW1lKCVkKSIsCi0gICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUpOwotCi0gICAgaWYocENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0SW1hZ2VDbGlwUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0SW1hZ2VDbGlwUHJvcGVydGllcyIpOwotICAgIH0KLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5wcmVwYXJlKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHByZXBhcmVkIik7Ci0KLSAgICBpZihwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUgPiAwKSB7Ci0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5zZWVrVG8oCi0gICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZWVrVG8oJWQpIiwKLSAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgfQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9QbGF5ZXIocENvbnRyb2xsZXItPm1WRUF1ZGlvUGxheWVyKTsKLQotICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcGxheWVySW5zdGFuY2VdLT5yZWFkRmlyc3RWaWRlb0ZyYW1lKCk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHJlYWRGaXJzdFZpZGVvRnJhbWUgb2YgY2xpcCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnRocmVhZFByb2MoTTRPU0FfVm9pZCogcGFyYW0pIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9JbnQzMiBpbmRleCA9IDA7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKXBhcmFtOwotCi0gICAgQUxPR1YoImluc2lkZSB0aHJlYWRQcm9jIik7Ci0gICAgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllcklkbGUpIHsKLSAgICAgICAgKHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpKys7Ci0KLSAgICAgICAgQUxPR0QoInRocmVhZFByb2M6IHBsYXlpbmcgZmlsZSBpbmRleCAlZCB0b3RhbCBjbGlwcyAlZCIsCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyLCBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KTsKLQotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPj0KLSAgICAgICAgIHBDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXcpIHsKLQotICAgICAgICAgICAgQUxPR0QoIkFsbCBjbGlwcyBwcmV2aWV3ZWQiKTsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gPSAwOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA9IDA7Ci0KLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tUHJldmlld0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4OwotCi0gICAgICAgICAgICAgICAgQUxPR0QoIlByZXZpZXcgbG9vcGluZyBUUlVFLCByZXN0YXJ0aW5nIGZyb20gY2xpcCBpbmRleCAlZCIsCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHN0b3J5IGJvYXJkIHRpbWVzdGFtcCBpbnNpZGUgdGhlIHBsYXllcgotICAgICAgICAgICAgICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7Ci0gICAgICAgICAgICAgICAgIHBsYXllckluc3QrKykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RdLT5yZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGVuZEFyZ3MgPSAwOwotICAgICAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BSRVZJRVdfRU5ELCAmZW5kQXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckF1dG9TdG9wOwotCi0gICAgICAgICAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgYmVnaW4gY3V0dGltZSBvZiBmaXJzdCBwcmV2aWV3ZWQgY2xpcAotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleF0tPnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIGVuZCBjdXR0aW1lIG9mIGxhc3QgcHJldmlld2VkIGNsaXAKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tTnVtYmVyQ2xpcHNUb1ByZXZpZXctMV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIHdhcm5pbmcgdG8gTTRPU0EgdGhyZWFkIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRocmVhZCBpcyBtb3ZlZCBmcm9tIGV4ZWN1dGluZyBzdGF0ZSB0byBvcGVuIHN0YXRlCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXg9cENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09IHBDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXgpIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcDsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0KLSAgICAgICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsIGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uOwotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldFN0b3J5Ym9hcmRTdGFydFRpbWUoCi0gICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbik7Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lIik7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBuZXh0IGNsaXAgZHVyYXRpb24gZm9yIEF1ZGlvIG1peCBoZXJlCi0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24sCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotCi0gICAgICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0gZnJvbU1TICVkIFwKLSAgICAgICAgICAgICBDbGlwQmVnaW5UaW1lICVkIiwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24gKwotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvVm9sdW1lUGVyY2VudGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FwdHVyZSB0aGUgYWN0aXZlIHBsYXllciBiZWluZyB1c2VkCi0gICAgICAgIHBDb250cm9sbGVyLT5tQWN0aXZlUGxheWVySW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXI7Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zdGFydCgpOwotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc3RhcnRlZCIpOwotCi0gICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllckJ1c3k7Ci0KLSAgICB9IGVsc2UgaWYocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllckF1dG9TdG9wKSB7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3IGNvbXBsZXRlZC4uYXV0byBzdG9wIHRoZSBwbGF5ZXIiKTsKLSAgICB9IGVsc2UgaWYgKChwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID09IFZlUGxheWVyQnVzeSkgJiYgKHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCkpIHsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcGxheWVyIGhlcmUKLSAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHByZXBhcmVQbGF5ZXIoKHZvaWQqKXBDb250cm9sbGVyLCBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIsCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpOwotICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVdhaXQocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0LAotICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXBDb250cm9sbGVyLT5iU3RvcFRocmVhZEluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzdGF0ZSBidXN5Li4ud2FpdCBmb3Igc2VtIik7Ci0gICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwKLSAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNlbSB3YWl0IHJldHVybmVkIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8vQWx3YXlzIHJldHVybiBNNE5PX0VSUk9SIHRvIGVuc3VyZSB0aGUgdGhyZWFkIGtlZXBzIHJ1bm5pbmcKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpub3RpZnkoCi0gICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCi17Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKWNvb2tpZTsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHVpbnQzMl90IGNsaXBEdXJhdGlvbiA9IDA7Ci0gICAgc3dpdGNoIChtc2cpIHsKLSAgICAgICAgY2FzZSBNRURJQV9OT1A6IC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9OT1AiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX1BSRVBBUkVEOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1BSRVBBUkVEIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0QoIm5vdGlmeTpNRURJQV9QTEFZQkFDS19DT01QTEVURSwgbUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0KLSAgICAgICAgICAgIC8vc2VuZCBwcm9ncmVzcyBjYWxsYmFjayB3aXRoIGxhc3QgZnJhbWUgdGltZXN0YW1wCi0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgPT0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAtIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTTRPU0FfVUludDMyIHBsYXllZER1cmF0aW9uID0gY2xpcER1cmF0aW9uK3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uOwotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDb29raWUsIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sCi0gICAgICAgICAgICAgICAgICZwbGF5ZWREdXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmICgocENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPT0gT1ZFUkxBWV9VUERBVEUpICYmCi0gICAgICAgICAgICAgICAgKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciAhPQotICAgICAgICAgICAgICAgIChwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3LTEpKSkgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8gKnBFZGl0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8pLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkN1cnJlbnQgRWRpdCBpbmZvIik7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICAgICAgcEVkaXRJbmZvLT5jbGlwSW5kZXggPSBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyOwotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID09IE9WRVJMQVlfQ0xFQVI7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmVlKHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9FUlJPUjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGVycl92YWwgPSBleHQxOwotICAgICAgICAgIC8vIEFsd2F5cyBsb2cgZXJyb3JzLgotICAgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgotICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgQUxPR0UoIk1FRElBX0VSUk9SOyBlcnJvciAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAmZXJyX3ZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FRElBX0lORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmZvX3ZhbCA9IGV4dDI7Ci0gICAgICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIC8vIGV4dDI6IEltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlLgotICAgICAgICAgICAgLy9BTE9HVygiTUVESUFfSU5GTzsgaW5mby93YXJuaW5nICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrKHBDb250cm9sbGVyLT5tSm5pQ29va2llLAotICAgICAgICAgICAgICAgICBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLCAmaW5mb192YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9TRUVLX0NPTVBMRVRFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX1NFRUtfQ09NUExFVEU7IFJlY2VpdmVkIHNlZWsgY29tcGxldGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1FRElBX0JVRkZFUklOR19VUERBVEU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfQlVGRkVSSU5HX1VQREFURTsgYnVmZmVyaW5nICVkIiwgZXh0MSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9TRVRfVklERU9fU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9TRVRfVklERU9fU0laRTsgTmV3IHZpZGVvIHNpemUgJWQgeCAlZCIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEFBQUFBQUFBKToKLSAgICAgICAgICAgIEFMT0dWKCJWSURFTyBQTEFZQkFDSyBBTE1PU1Qgb3ZlciwgcHJlcGFyZSBuZXh0IHBsYXllciIpOwotICAgICAgICAgICAgLy8gU2VsZWN0IG5leHQgcGxheWVyIGFuZCBwcmVwYXJlIGl0Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNsaXAgYWZ0ZXIgdGhpcyBvbmUKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKShwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKzEpIDwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1QcmVwYXJlUmVxZXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIrKzsKLSAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID49IGtUb3RhbE51bVBsYXllckluc3RhbmNlcykgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBmaXJzdCBjbGlwIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKHBDb250cm9sbGVyLT5tTG9ja1NlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8aW50PigweEJCQkJCQkJCKToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIlZJREVPIFBMQVlCQUNLLCBVcGRhdGUgT3ZlcmxheSIpOwotICAgICAgICAgICAgaW50IG92ZXJsYXlJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwRWRpdEluZm8gPQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOwotICAgICAgICAgICAgLy9leHQxID0gMTsgc3RhcnQgdGhlIG92ZXJsYXkgZGlzcGxheQotICAgICAgICAgICAgLy8gICAgID0gMjsgQ2xlYXIgdGhlIG92ZXJsYXkuCi0gICAgICAgICAgICBwRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gZXh0MjsKLSAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgICAgIEFMT0dWKCJwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0gJWQiLHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIpOwotICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChleHQxID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1PdmVybGF5U3RhdGUgPSBPVkVSTEFZX1VQREFURTsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfVVBEQVRFLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9DTEVBUjsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1TR19UWVBFX09WRVJMQVlfQ0xFQVIsIHBFZGl0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJ1bnJlY29nbml6ZWQgbWVzc2FnZTogKCVkLCAlZCwgJWQpIiwgbXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRWaWRlb0VmZmVjdFR5cGUoCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSkgewotCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgLy8gbWFwIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdG8gbG9jYWwgZW51bQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GQURFVE9CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1BJTks7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSRUVOOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9TRVBJQTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTkVHQVRJVkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmc6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRlJBTUlORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllczoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GSUZUSUVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkFESUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKGVuYWJsZSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIC8vIElmIGFscmVhZHkgc2V0LCB0aGVuIG5vIG5lZWQgdG8gc2V0IGFnYWluCi0gICAgICAgIGlmKCEobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0IHw9IGVmZmVjdDsKLSAgICAgICAgICAgIGlmKGVmZmVjdCA9PSBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAgICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgewotICAgICAgICAvLyBSZXNldCBvbmx5IGlmIGFscmVhZHkgc2V0Ci0gICAgICAgIGlmKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpCi0gICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5lZmZlY3Q7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjphcHBseVZpZGVvRWZmZWN0KAotICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsIE00T1NBX1VJbnQzMiB2aWRlb1dpZHRoLAotICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB2ZVBvc3RQcm9jZXNzUGFyYW1zIHBvc3RQcm9jZXNzUGFyYW1zOwotCi0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkQnVmZmVyID0gKE00VklGSV9VSW50OCopZGF0YVB0cjsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnRpbWVNcyA9IHRpbWVNczsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy50aW1lT2Zmc2V0ID0gMDsgLy9TaW5jZSB0aW1lTVMgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIG9mZnNldCBpbiB0aGlzIGNhc2UKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5lZmZlY3RzU2V0dGluZ3MgPSBtRWZmZWN0c1NldHRpbmdzOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm51bWJlckVmZmVjdHMgPSBtTnVtYmVyRWZmZWN0czsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdXRWaWRlb1dpZHRoID0gbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3V0VmlkZW9IZWlnaHQgPSBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMuY3VycmVudFZpZGVvRWZmZWN0ID0gbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5yZW5kZXJpbmdNb2RlID0gbVJlbmRlcmluZ01vZGU7Ci0gICAgaWYobUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICBwb3N0UHJvY2Vzc1BhcmFtcy5pc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgcG9zdFByb2Nlc3NQYXJhbXMuaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvL3Bvc3RQcm9jZXNzUGFyYW1zLnJlbmRlcmVyID0gbVRhcmdldDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdmVybGF5RnJhbWVSR0JCdWZmZXIgPSBOVUxMOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm92ZXJsYXlGcmFtZVlVVkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCYocG9zdFByb2Nlc3NQYXJhbXMucE91dEJ1ZmZlciksICYocG9zdFByb2Nlc3NQYXJhbXMub3V0QnVmZmVyU3RyaWRlKSk7Ci0KLSAgICBlcnIgPSBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKCZwb3N0UHJvY2Vzc1BhcmFtcywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFByZXZpZXdGcmFtZVJlbmRlcmluZ01vZGUoCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG91dHB1dFZpZGVvU2l6ZSkgewotCi0gICAgQUxPR1YoInNldE1lZGlhUmVuZGVyaW5nTW9kZTogb3V0cHV0VmlkZW9TaXplID0gJWQiLCBvdXRwdXRWaWRlb1NpemUpOwotICAgIG1SZW5kZXJpbmdNb2RlID0gbW9kZTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIC8qIGdldCB0aGUgdmlkZW8gd2lkdGggYW5kIGhlaWdodCBieSByZXNvbHV0aW9uICovCi0gICAgZXJyID0gZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKG91dHB1dFZpZGVvU2l6ZSwKLSAgICAgICAgICAgICAgJm1PdXRwdXRWaWRlb1dpZHRoLCAmbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1ZvaWQqIG91dFB0cikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0gICAgTTRWSUZJX1VJbnQ4ICppbkJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEJ1ZmZlcldpZHRoID0wLCBvdXRwdXRCdWZmZXJIZWlnaHQ9MDsKLQotICAgIC8vZnJhbWVTaXplID0gKHZpZGVvV2lkdGgqdmlkZW9IZWlnaHQqMykgPj4gMTsKLSAgICBpbkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWRhdGFQdHI7Ci0KLSAgICAvLyBJbiBwbGFuZQotICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lSW4sIHZpZGVvV2lkdGgsCi0gICAgICB2aWRlb0hlaWdodCwgKE00VklGSV9VSW50OCAqKWluQnVmZmVyLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7Ci0KLSAgICBvdXRwdXRCdWZmZXJXaWR0aCA9IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIG91dHB1dEJ1ZmZlckhlaWdodCA9IG1PdXRwdXRWaWRlb0hlaWdodDsKLQotICAgIC8vIE91dCBwbGFuZQotICAgIHVpbnQ4X3QqIG91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlID0gMDsKLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICBtVGFyZ2V0LT5nZXRCdWZmZXJZVjEyKCZvdXRCdWZmZXIsICZvdXRCdWZmZXJTdHJpZGUpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgWVVWNDIwIHBsYW5lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBZVjEyIGZvcm1hdAotICAgIC8vSW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgobU91dHB1dFZpZGVvV2lkdGggKzEpPj4xKTw8MTsKLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lSGVpZ2h0ID0gKChtT3V0cHV0VmlkZW9IZWlnaHQrMSk+PjEpPDwxOwotCi0gICAgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKHBsYW5lT3V0LCB5djEyUGxhbmVXaWR0aCwgeXYxMlBsYW5lSGVpZ2h0LAotICAgICAoTTRPU0FfVUludDMyKW91dEJ1ZmZlclN0cmlkZSwgKE00VklGSV9VSW50OCAqKW91dEJ1ZmZlcik7Ci0KLSAgICBlcnIgPSBhcHBseVJlbmRlcmluZ01vZGUocGxhbmVJbiwgcGxhbmVPdXQsIG1SZW5kZXJpbmdNb2RlKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZG9JbWFnZVJlbmRlcmluZ01vZGU6IGFwcGx5UmVuZGVyaW5nTW9kZSByZXR1cm5lZCBlcnI9MHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzU2ZjMyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVkVfUFJFVklFV0NPTlRST0xMRVJfSAotI2RlZmluZSBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUGxheWVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIENhbGxiYWNrIG1lY2hhbmlzbSBmcm9tIFByZXZpZXdDb250cm9sbGVyIHRvIEpuaSAgKi8KLXR5cGVkZWYgdm9pZCAoKmpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QpKHZvaWQqIGNvb2tpZSwgTTRPU0FfVUludDMyIG1zZ1R5cGUsIHZvaWQgKmFyZ2MpOwotCi1zdHJ1Y3QgU3VyZmFjZTsKLXN0cnVjdCBQcmV2aWV3UmVuZGVyZXI7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgewotCi1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotICAgIH5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCk7Ci0KLSAgICBNNE9TQV9FUlIgbG9hZEVkaXRTZXR0aW5ncygKLSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBiZ21TZXR0aW5ncyk7Ci0KLSAgICBNNE9TQV9FUlIgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSk7Ci0KLSAgICBNNE9TQV9FUlIgc3RhcnRQcmV2aWV3KAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCwKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgbG9vcCkgOwotCi0gICAgTTRPU0FfVUludDMyIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICBNNE9TQV9FUlIgcmVuZGVyUHJldmlld0ZyYW1lKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8sCi0gICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwQ3VyckVkaXRJbmZvKTsKLQotICAgIE00T1NBX0VSUiBjbGVhclN1cmZhY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciogcEZyYW1lSW5mbyk7Ci0KLSAgICBNNE9TQV9Wb2lkIHNldEpuaUNhbGxiYWNrKAotICAgICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICAgICAgam5pX3Byb2dyZXNzX2NhbGxiYWNrX2ZjdCBjYWxsYmFja0ZjdCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgICAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMgPSAyLAotICAgICAgICBrUHJldmlld1RocmVhZFN0YWNrU2l6ZSA9IDY1NTM2LAotICAgIH07Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBWZVBsYXllcklkbGUgPSAwLAotICAgICAgICBWZVBsYXllckJ1c3ksCi0gICAgICAgIFZlUGxheWVyQXV0b1N0b3AKLSAgICB9IFBsYXllclN0YXRlOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgT1ZFUkxBWV9VUERBVEUgPSAwLAotICAgICAgICBPVkVSTEFZX0NMRUFSCi0gICAgfSBPdmVybGF5U3RhdGU7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcj4gbVZlUGxheWVyW2tUb3RhbE51bVBsYXllckluc3RhbmNlc107Ci0gICAgaW50IG1DdXJyZW50UGxheWVyOyAgLy8gcGxheWVyIGluc3RhbmNlIGN1cnJlbnRseSBiZWluZyB1c2VkCi0gICAgc3A8U3VyZmFjZT4gIG1TdXJmYWNlOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgTTRPU0FfQ29udGV4dCBtVGhyZWFkQ29udGV4dDsKLSAgICBQbGF5ZXJTdGF0ZSBtUGxheWVyU3RhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICBtUHJlcGFyZVJlcWVzdDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICoqbUNsaXBMaXN0OwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJDbGlwc1RvUHJldmlldzsKLSAgICBNNE9TQV9VSW50MzIgbVN0YXJ0aW5nQ2xpcEluZGV4OwotICAgIE00T1NBX0Jvb2wgbVByZXZpZXdMb29waW5nOwotICAgIE00T1NBX1VJbnQzMiBtQ2FsbEJhY2tBZnRlckZyYW1lQ250OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogbUVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckVmZmVjdHM7Ci0gICAgTTRPU0FfSW50MzIgbUN1cnJlbnRDbGlwTnVtYmVyOwotICAgIE00T1NBX1VJbnQzMiBtQ2xpcFRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nOwotICAgIE00T1NBX0NvbnRleHQgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICBQcmV2aWV3UmVuZGVyZXIgKm1UYXJnZXQ7Ci0gICAgTTRPU0FfQ29udGV4dCBtSm5pQ29va2llOwotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgbUpuaUNhbGxiYWNrOwotICAgIFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0ciBtRnJhbWVTdHI7Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50UGxheWVkRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG1DdXJyZW50Q2xpcER1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIG1PdXRwdXRWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotICAgIE00T1NBX1VJbnQzMiBtTGFzdFByZXZpZXdDbGlwRW5kVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwOwotICAgIE92ZXJsYXlTdGF0ZSBtT3ZlcmxheVN0YXRlOwotICAgIGludCBtQWN0aXZlUGxheWVySW5kZXg7Ci0KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbVJlbmRlcmluZ01vZGU7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvV2lkdGg7Ci0gICAgdWludDMyX3QgbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIGJvb2wgYlN0b3BUaHJlYWRJblByb2dyZXNzOwotICAgIE00T1NBX0NvbnRleHQgbVNlbVRocmVhZFdhaXQ7Ci0gICAgYm9vbCBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZDsKLQotICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0PiBtVkVBdWRpb1Npbms7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbVZFQXVkaW9QbGF5ZXI7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIqIG1OYXRpdmVXaW5kb3dSZW5kZXJlcjsKLQotICAgIE00VklGSV9VSW50OCogIG1GcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVZVVZCdWZmZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja1NlbTsKLQotCi0gICAgc3RhdGljIE00T1NBX0VSUiBwcmVwYXJlUGxheWVyKHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIE00T1NBX0VSUiB0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKTsKLSAgICBzdGF0aWMgdm9pZCBub3RpZnkodm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwotCi0gICAgdm9pZCBzZXRWaWRlb0VmZmVjdFR5cGUoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0KLSAgICBNNE9TQV9FUlIgYXBwbHlWaWRlb0VmZmVjdCgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLCBNNE9TQV9VSW50MzIgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHRpbWVNcywgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIE00T1NBX0VSUiBkb0ltYWdlUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00T1NBX1ZvaWQgKiBkYXRhUHRyLAotICAgICAgICAgICAgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwgTTRPU0FfVm9pZCogb3V0UHRyKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUhCi0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcihjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgJik7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2ZDA4MTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JTUkMiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yU1JDOjpWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclNSQyAlcCglcCkiLCB0aGlzLCBzb3VyY2UuZ2V0KCkpOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6ID0ga0ZyZXEzMjAwMEh6OwotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgbUNoYW5uZWxDbnQgPSAwOwotICAgIG1TYW1wbGVSYXRlID0gMDsKLSAgICBtT3V0cHV0U2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6OwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUluaXRpYWxUaW1lU3RhbXBVcyA9IC0xOwotICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSAgPSAwOwotICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgbUxlZnRvdmVyID0gMDsKLSAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgIG1TdG9wUGVuZGluZyA9IGZhbHNlOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0KLSAgICAvLyBJbnB1dCBTb3VyY2UgdmFsaWRhdGlvbgotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgLy8gU2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgb3V0cHV0IGFmdGVyIHJlc2FtcGxpbmcuCi0gICAgbU91dHB1dEZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0RlZmF1bHRTYW1wbGluZ0ZyZXFlbmN5SHopOwotICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOyAgLy8gYWx3YXlzIHN0ZXJlbwotfQotCi1WaWRlb0VkaXRvclNSQzo6flZpZGVvRWRpdG9yU1JDKCkgewotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgc3RvcCgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgLy8gU2V0IHJlc2FtcGxlciBpZiByZXF1aXJlZAotICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0KLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBpZiAobVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgICAgICBtUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclNSQzo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbU91dHB1dEZvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyX291dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBBTE9HVigicmVhZCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0KLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmIChtUmVzYW1wbGVyKSB7Ci0gICAgICAgIC8vIFN0b3JlIHRoZSBzZWVrIHBhcmFtZXRlcnMKLSAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCBTZWVrICVsbGQiLCBzZWVrVGltZVVzKTsKLSAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBhc2sgZm9yIDEwMjQgZnJhbWVzIGluIG91dHB1dAotICAgICAgICAvLyByZXNhbXBsZXIgb3V0cHV0IGlzIGFsd2F5cyAyIGNoYW5uZWxzIGFuZCAzMiBiaXRzCi0gICAgICAgIGNvbnN0IHNpemVfdCBrT3V0cHV0RnJhbWVDb3VudCA9IDEwMjQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrQnl0ZXMgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgICAgIGludDMyX3QgKnBUbXBCdWZmZXIgPSAoaW50MzJfdCAqKWNhbGxvYygxLCBrQnl0ZXMpOwotICAgICAgICBpZiAoIXBUbXBCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWxsb2MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeTogJWQgYnl0ZXMiLCBrQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2FtcGxlIHRvIHRhcmdldCBxdWFsaXR5Ci0gICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50LCB0aGlzKTsKLQotICAgICAgICBpZiAobVN0b3BQZW5kaW5nKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoYW5nZSByZXNhbXBsZXIgYW5kIHJldHJ5IGlmIGZvcm1hdCBjaGFuZ2UgaGFwcGVuZWQKLSAgICAgICAgaWYgKG1Gb3JtYXRDaGFuZ2VkKSB7Ci0gICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUJ1ZmZlcgotICAgICAgICBpbnQzMl90IG91dEJ1ZmZlclNpemUgPSBrT3V0cHV0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBvdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIob3V0QnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgLy8gQ29udmVydCBiYWNrIHRvIDIgY2hhbm5lbHMgYW5kIDE2IGJpdHMKLSAgICAgICAgZGl0aGVyQW5kQ2xhbXAoCi0gICAgICAgICAgICAgICAgKGludDMyX3QgKikoKHVpbnQ4X3QqKW91dEJ1ZmZlci0+ZGF0YSgpICsgb3V0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZlciwga091dHB1dEZyYW1lQ291bnQpOwotICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotCi0gICAgICAgIC8vIENvbXB1dGUgYW5kIHNldCB0aGUgbmV3IHRpbWVzdGFtcAotICAgICAgICBzcDxNZXRhRGF0YT4gdG8gPSBvdXRCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsT3V0RHVyYXRpb25VcyA9IChtQWNjdU91dEJ1ZmZlclNpemUgKiAxMDAwMDAwKSAvIChtT3V0cHV0U2FtcGxlUmF0ZSAqIDIgKiAyKTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBtSW5pdGlhbFRpbWVTdGFtcFVzICsgdG90YWxPdXREdXJhdGlvblVzOwotICAgICAgICB0by0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBhY2N1bXVsYXRlIHNpemUKLSAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplICs9IG91dEJ1ZmZlclNpemU7Ci0gICAgICAgICpidWZmZXJfb3V0ID0gb3V0QnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlc2FtcGxpbmcgbm90IHJlcXVpcmVkLiBSZWFkIGFuZCBwYXNzLXRocm91Z2guCi0gICAgICAgIE1lZGlhQnVmZmVyICphQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZhQnVmZmVyLCBvcHRpb25zKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgcmV0dXJucyBlcnIgPSAlZCIsIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZChidWZmZXJfb3V0LCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgIGlmKGVyciAhPSBPSykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAqYnVmZmVyX291dCA9IGFCdWZmZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsIGludDY0X3QgcHRzKSB7Ci0gICAgQUxPR1YoImdldE5leHRCdWZmZXIgJWQsIGNoYW4gPSAlZCIsIHBCdWZmZXItPmZyYW1lQ291bnQsIG1DaGFubmVsQ250KTsKLSAgICB1aW50MzJfdCBkb25lID0gMDsKLSAgICB1aW50MzJfdCB3YW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1DaGFubmVsQ250ICogMjsKLSAgICBwQnVmZmVyLT5yYXcgPSBtYWxsb2Mod2FudCk7Ci0KLSAgICB3aGlsZSAobVN0YXJ0ZWQgJiYgd2FudCA+IDApIHsKLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBsZWZ0LCByZWFkIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgaWYgKCFtQnVmZmVyKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBzZWVrLCByZXNldCB0aGUgaW5pdGlhbCB0aW1lIHN0YW1wIGFuZCBhY2N1bXVsYXRlZCB0aW1lCi0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXAgY2FjaGVNb3JlX2wgU2VlayByZXF1ZXN0ZWQgPSAlbGxkIiwgdGhpcywgbVNlZWtUaW1lVXMpOwotICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0gbVNlZWtNb2RlOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtQWNjdU91dEJ1ZmZlclNpemUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBCdWZmZXItPnJhdyk7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImdldE5leHRCdWZmZXI6IHNvdXJjZSByZWFkIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGNhbm5vdCBzd2l0Y2ggdG8gYSBuZXcgQXVkaW9SZXNhbXBsZXIgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBpbiBhIGNhbGxiYWNrIGNhbGxlZCBieSB0aGUgQXVkaW9SZXNhbXBsZXIgaXRzZWxmLiBTbwotICAgICAgICAgICAgICAgIC8vIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgdGhhdCB0aGUgZm9ybWF0IGhhcyBjaGFuZ2VkLCBhbmQgbGV0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZCgpIGhhbmRsZXMgdGhpcy4KLSAgICAgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRU9TIG9yIHNvbWUgb3RoZXIgZXJyb3IKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIG9yIHNvbWUgZXJyOiAlZCIsIGVycik7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGNhbGwgc3RvcCgpIGhlcmUgYmVjYXVzZSBzdG9wKCkgd2lsbCByZWxlYXNlIHRoZQotICAgICAgICAgICAgICAgIC8vIEF1ZGlvUmVzYW1wbGVyLCBhbmQgd2UgYXJlIGluIGEgY2FsbGJhY2sgb2YgdGhlIEF1ZGlvUmVzYW1wbGVyLgotICAgICAgICAgICAgICAgIC8vIFNvIGp1c3QgcmVtZW1iZXIgdGhlIGZhY3QgYW5kIGxldCByZWFkKCkgY2FsbCBzdG9wKCkuCi0gICAgICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyKTsKLSAgICAgICAgICAgIG1MZWZ0b3ZlciA9IG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgaWYgKG1Jbml0aWFsVGltZVN0YW1wVXMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGN1clRTOwotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmcm9tID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgICAgICAgICAgICAgZnJvbS0+ZmluZEludDY0KGtLZXlUaW1lLCAmY3VyVFMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXR0aW5nIG1Jbml0aWFsVGltZVN0YW1wVXMgdG8gJWxsZCIsIG1Jbml0aWFsVGltZVN0YW1wVXMpOwotICAgICAgICAgICAgICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSBjdXJUUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBjb3B5IGRhdGEgdG8gdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIHVpbnQzMl90IHRvZG8gPSBtTGVmdG92ZXI7Ci0gICAgICAgIGlmICh0b2RvID4gd2FudCkgewotICAgICAgICAgICAgdG9kbyA9IHdhbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBlbmQgPSAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkKLSAgICAgICAgICAgICAgICArIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXBCdWZmZXItPnJhdyArIGRvbmUsIGVuZCAtIG1MZWZ0b3ZlciwgdG9kbyk7Ci0gICAgICAgIGRvbmUgKz0gdG9kbzsKLSAgICAgICAgd2FudCAtPSB0b2RvOwotICAgICAgICBtTGVmdG92ZXIgLT0gdG9kbzsKLQotICAgICAgICAvLyBSZWxlYXNlIE1lZGlhQnVmZmVyIGFzIHNvb24gYXMgcG9zc2libGUuCi0gICAgICAgIGlmIChtTGVmdG92ZXIgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gZG9uZSAvIChtQ2hhbm5lbENudCAqIDIpOwotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyIGRvbmUgJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotdm9pZCBWaWRlb0VkaXRvclNSQzo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLSAgICBBTE9HVigicmVsZWFzZUJ1ZmZlcjogJXAiLCBwQnVmZmVycyk7Ci0gICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OmNoZWNrQW5kU2V0UmVzYW1wbGVyKCkgewotICAgIEFMT0dWKCJjaGVja0FuZFNldFJlc2FtcGxlciIpOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtVbml0eUdhaW4gPSAweDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ250KSk7Ci0KLSAgICAvLyBJZiBhIHJlc2FtcGxlciBleGlzdHMsIGRlbGV0ZSBpdCBmaXJzdAotICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRwdXRTYW1wbGVSYXRlIHx8IG1DaGFubmVsQ250ICE9IDIpIHsKLSAgICAgICAgQUxPR1YoIlJlc2FtcGxpbmcgcmVxdWlyZWQgKCVkID0+ICVkIEh6LCAjIGNoYW5uZWxzID0gJWQpIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtT3V0cHV0U2FtcGxlUmF0ZSwgbUNoYW5uZWxDbnQpOwotCi0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgMTYgLyogYml0IGRlcHRoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U2FtcGxlUmF0ZSk7Ci0gICAgICAgIENIRUNLKG1SZXNhbXBsZXIpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKGtVbml0eUdhaW4sIGtVbml0eUdhaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJSZXNhbXBsaW5nIG5vdCByZXF1aXJlZCAoJWQgPT4gJWQgSHosICMgY2hhbm5lbHMgPSAlZCkiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlLCBtQ2hhbm5lbENudCk7Ci0gICAgfQotfQotCi19IC8vbmFtZXNwY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzA3ZDRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JTUkMgOiBwdWJsaWMgTWVkaWFTb3VyY2UgLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0IChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkICgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgIC8vIFNhbXBsaW5nIGZyZXFlbmNpZXMKLSAgICBlbnVtIHsKLSAgICAgICAga0ZyZXE4MDAwSHogID0gODAwMCwKLSAgICAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAgICAga0ZyZXE0NDEwMEh6ID0gNDQxMDAsCi0gICAgICAgIGtGcmVxNDgwMDBIeiA9IDQ4MDAwLAotICAgIH07Ci0KLXByb3RlY3RlZCA6Ci0gICAgdmlydHVhbCB+VmlkZW9FZGl0b3JTUkMoKTsKLQotcHJpdmF0ZToKLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQgbUNoYW5uZWxDbnQ7Ci0gICAgaW50IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBzcDxNZXRhRGF0YT4gbU91dHB1dEZvcm1hdDsKLQotICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotICAgIGludDMyX3QgbUxlZnRvdmVyOwotICAgIGJvb2wgbUZvcm1hdENoYW5nZWQ7Ci0gICAgYm9vbCBtU3RvcFBlbmRpbmc7Ci0KLSAgICBpbnQ2NF90IG1Jbml0aWFsVGltZVN0YW1wVXM7Ci0gICAgaW50NjRfdCBtQWNjdU91dEJ1ZmZlclNpemU7Ci0KLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7Ci0KLSAgICBWaWRlb0VkaXRvclNSQygpOwotICAgIHZvaWQgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBWaWRlb0VkaXRvclNSQyYpOwotICAgIFZpZGVvRWRpdG9yU1JDICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JTUkMgJik7Ci0KLX07Ci0KLX0gLy9uYW1lc3BjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjlmZDYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotLyotIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi1jb25zdCBNNFZJRklfVUludDggICBNNFZJRklfQ2xpcFRhYmxlWzEyNTZdCi09IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLTB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0weDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLTB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCi0weDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKLTB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCi0weDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLAotMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKLTB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCi0weDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLAotMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKLTB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCi0weDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLAotMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwKLTB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCi0weDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLAotMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKLTB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCi0weDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLAotMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKLTB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsCi0weGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAotMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKLTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsCi0weGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLAotMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKLTB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsCi0weGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLAotMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKLTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCi0weGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoIDY1NTM1L3ggKTsgeCA9IDAgdG8gNTEyICovCi1jb25zdCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlMVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLDB4MDAwMDA2NDksMHgwMDAwMGQwZiwgMHgwMDAwRDg2QywgMHgwMDAwRDgzQiwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsIDB4MUJGODAwLCAweDAwMDAwNjQ5LCAweDAwMDAwZDBmLCAweDExMDE4MCwgMHg0MGNmLCAweDIyQkUwMAotfTsKLQotCi1jb25zdCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLWNvbnN0IE00VklGSV9VSW50OCAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm8KLSA9ICZNNFZJRklfQ2xpcFRhYmxlWzUwMF07Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotCi0gICAgLyogdGhlIGZpbHRlciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHdpZHRoIGlzIGVxdWFsIHRvIHN0cmlkZSAqLwotICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8KLSAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bMF0ucGFjX2RhdGFbUGxhbmVJblswXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCh2b2lkICopcF9idWZfc3JjICwKLSAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgIHBfYnVmX3NyY191ID0gJihQbGFuZUluWzFdLnBhY19kYXRhW1BsYW5lSW5bMV0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfc3JjX3YgPSAmKFBsYW5lSW5bMl0ucGFjX2RhdGFbUGxhbmVJblsyXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBQbGFuZU91dFsxXS51X3dpZHRoKlBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICAqcF9idWZfZGVzdCsrID0gKnBfYnVmX3NyY191Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0KysgPSAqcF9idWZfc3JjX3YrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLQotICAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfZGVzdF91LCpwX2J1Zl9kZXN0X3YsKnBfYnVmX3NyY191djsKLSAgICAgTTRWSUZJX1VJbnQ4ICAgICByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLQotICAgICAvKiB0aGUgZmlsdGVyIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gc3RyaWRlICovCi0gICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgLyogVGhlIGlucHV0IFkgUGxhbmUgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBZIFBsYW5lICovCi0gICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJblswXS5wYWNfZGF0YVtQbGFuZUluWzBdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwodm9pZCAqKXBfYnVmX3NyYyAsCi0gICAgICAgICBQbGFuZU91dFswXS51X3dpZHRoICogUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgICBwX2J1Zl9zcmNfdXYgPSAmKFBsYW5lSW5bMV0ucGFjX2RhdGFbUGxhbmVJblsxXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdF91ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3RfdiAgPSAmKFBsYW5lT3V0WzJdLnBhY19kYXRhW1BsYW5lT3V0WzJdLnVfdG9wbGVmdF0pOwotCi0gICAgIGZvcihpID0gMDsgaSA8IFBsYW5lT3V0WzFdLnVfd2lkdGgqUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgewotICAgICAgICAqcF9idWZfZGVzdF91KysgPSAqcF9idWZfc3JjX3V2Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0X3YrKyA9ICpwX2J1Zl9zcmNfdXYrKzsKLSAgICAgfQotICAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkgLy8gY29tbWVudGVkIGJlY2F1c2UgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBlZmZlY3RzIGNvbnRleHQgZXhpc3QKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKENvbG9yQ29udGV4dC0+Y29sb3JFZmZlY3RUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMjU1LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyprZWVwIHksIGJ1dCByZXBsYWNlIHUgYW5kIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoTTRPU0FfVUludDE2KShnIC0gKChnKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KS8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9Ci0gICAgIChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPQotICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBpZihGcmFtaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzogXAotICAgICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEZyYW1pbmcgPQotICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgIC8qIEluaXRpYWxpemVzIGZpcnN0IEdJRiB0aW1lICovCi0gICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgPQotICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIGlmKCgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmJfYW5pbWF0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHdoaWxlKCgoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICsgY3VycmVudEZyYW1pbmctPmR1cmF0aW9uKSA8IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9Ci0gICAgICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbERlY29kZUdJRih1c2VyRGF0YSk7Ci0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nOiBFcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihjdXJyZW50RnJhbWluZy0+ZHVyYXRpb24gIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9IGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9Ci0gICAgICAgICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lIC0gRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBGcmFtaW5nLT5wQ3VycmVudCA9IGN1cnJlbnRGcmFtaW5nLT5wTmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0KilGcmFtaW5nLT5wQ3VycmVudDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgIE00T1NBX0Zsb2F0IGFscGhhQmxlbmRpbmcgPSAxOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKikoKE00eFZTU19GcmFtaW5nU3RydWN0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZW5kaWYgLy8jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQpKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApICYmIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IDEwMDAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdCkoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKS8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pKyh4LXRvcGxlZnRbMV0pKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSkrPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKSsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpKygoeC10b3BsZWZ0WzFdKT4+MSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPSgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0qKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0qKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBpZihwUHJvZ3Jlc3MtPmJJc0xhc3QgPT0gTTRPU0FfVFJVRQotICAgICAgICAmJiAoTTRPU0FfQm9vbCkoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX0lzRmlsZUdpZiA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKTsKLSAgICB9Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gbWFrZSBhIHZpZGVvIGxvb2sgYXMgaWYgaXQgd2FzIHRha2VuIGluIHRoZSBmaWZ0aWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKSA+IHBfRmlmdGllc0RhdGEtPmZpZnRpZXNFZmZlY3REdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyAqLwotICAgICAgICBwX291dFl0bXAgPSBwT3V0WSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeVNoaWZ0IG9mIDEgcGl4ZWwgKi8KLSAgICAgICAgcF9pbll0bXAgID0gcEluWWJlZ2luICsgKHhTaGlmdCAqIHBQbGFuZUluWzBdLnVfc3RyaWRlKTsgIC8qIEFwcGx5IHRoZSB4U2hpZnQgKi8KLQotICAgICAgICBmb3IoIHkgPSAwIDsgeSA8IHBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNldCBZIHZhbHVlICovCi0gICAgICAgICAgICBpZiAoeFNoaWZ0ID4gKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gNCkpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDQwOyAgICAgICAgLyogQWRkIHNvbWUgaG9yaXpvbnRhbCBibGFjayBsaW5lcyBiZXR3ZWVuIHRoZSB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2NzcmMsICpwX2NkZXN0LCAqcF9jc3JjX2xpbmUsICpwX2NkZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgLyogY29weSBvciBmaWx0ZXIgY2hyb21hICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzFdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblsxXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IHBsYW5lX2luWzFdLnVfc3RyaWRlOwotICAgIHVfc3RyaWRlX291dCA9IHBsYW5lX291dFsxXS51X3N0cmlkZTsKLSAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzFdLnBhY19kYXRhW3BsYW5lX291dFsxXS51X3RvcGxlZnRdOwotICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzFdLnBhY19kYXRhW3BsYW5lX2luWzFdLnVfdG9wbGVmdF07Ci0KLSAgICBpZiAobHVtX2ZhY3RvciA+IDI1NikKLSAgICB7Ci0gICAgICAgIHBfY2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmMgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgLyogY29weSBjaHJvbWEgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0X2xpbmUsICh2b2lkICopcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsICh2b2lkICopcF9jc3JjLCB1X3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICAgICAgcF9jc3JjICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZpbHRlciBjaHJvbWEgKi8KLSAgICAgICAgcGl4ID0gKDEwMjQgLSBsdW1fZmFjdG9yKSA8PCA3OwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjKysgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZyBlZmZlY3QgKi8KLSAgICBlcnIgPSBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjg4OCBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCODg4IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCODg4IHRvIFlVViA0MjAgdG8gYmUgYWJsZSB0byBtZXJnZSBpdCB3aXRoIG91dHB1dCB2aWRlbyBpbiBmcmFtaW5nIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBQYXRyaWNlIE1hcnRpbmV6IC8gUGhpbGlwcyBEaWdpdGFsIE5ldHdvcmtzIC0gTVA0TmV0Ci0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0gICAgTTRWSUZJX1VJbnQ4IGNvdW50X251bGw9MDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibiA9IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIFJHQiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X3JnYm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLQotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMCxpMzJfZzEwLGkzMl9yMTAsdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSx1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMSxpMzJfZzExLGkzMl9yMTEsdTE2X3BpeDQpOwotICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCi0gICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTAgPT0gMCAmJiBpMzJfZzEwID09IDYzICYmIGkzMl9yMTAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjEwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjExID09IDAgJiYgaTMyX2cxMSA9PSA2MyAmJiBpMzJfcjExID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvdG86Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLUF1dGhvcjogICAgIFBhdHJpY2UgTWFydGluZXogLyBQaGlsaXBzIERpZ2l0YWwgTmV0d29ya3MgLSBNUDROZXQKLVB1cnBvc2U6ICAgIGZpbGxpbmcgb2YgdGhlIFlVVjQyMCBwbGFuZSBmcm9tIGEgQkdSMjQgcGxhbmUKLUFic3RyYWN0OiAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAgICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICAgICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcyBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICAgICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICAgICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0KLUluOiAgICAgICAgIFJHQjI0IHBsYW5lCi1Jbk91dDogICAgICBub25lCi1PdXQ6ICAgICAgICBhcnJheSBvZiAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLU1vZGlmaWVkOiAgIE1MOiBSR0IgZnVuY3Rpb24gbW9kaWZpZWQgdG8gQkdSLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0KLSAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICA9IFBsYW5lT3V0WzJdLnBhY19kYXRhICsgUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgYnVmZmVyICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgPSBwdThfeV9kYXRhOwotICAgICAgICBwdThfeXMgID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotCi0gICAgICAgIHB1OF91ICAgPSBwdThfdV9kYXRhOwotICAgICAgICBwdThfdiAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgIC8qIG1hdHJpeCBsdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIHB1OF95blswXT0gKE00VklGSV9VSW50OClpMzJfeTAwOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl95MTAgPSBZMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBwdThfeW5bMV09IChNNFZJRklfVUludDgpaTMyX3kxMDsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfeTAxID0gWTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgcHU4X3lzWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3kxMSA9IFkyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgKnB1OF91ICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgcHU4X3JnYm4gICAgKz0gIChDU1RfUkdCXzI0X1NJWkU8PDEpOwotICAgICAgICAgICAgcHU4X3luICAgICAgKz0gMjsKLSAgICAgICAgICAgIHB1OF95cyAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKiBZVVY0MjAgdG8gWVVWNDIwICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgVHJhbnNmb3JtIFlVVjQyMCBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEgKFVudXNlZCAtIGNvdWxkIGJlIE5VTEwpCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVYgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gcGxhbmUgaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHBsYW5lIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0gUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBEYXZpZCBEYW5hIChQSElMSVBTIFNvZnR3YXJlKQotICogQGJyaWVmICAgUmVzaXplcyBZVVY0MjAgUGxhbmFyIHBsYW5lLgotICogQG5vdGUgICAgQmFzaWMgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIFUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBZVVYgaW4gdGhlIG91cHV0IHBsYW5lCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9vdXQsICpwdThkdW07Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLQotICAgIE00VklGSV9VSW50OCAgICB1OFdmbGFnID0gMDsKLSAgICBNNFZJRklfVUludDggICAgdThIZmxhZyA9IDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGxvb3AgPSAwOwotCi0KLSAgICAvKgotICAgICBJZiBpbnB1dCB3aWR0aCBpcyBlcXVhbCB0byBvdXRwdXQgd2lkdGggYW5kIGlucHV0IGhlaWdodCBlcXVhbCB0bwotICAgICBvdXRwdXQgaGVpZ2h0IHRoZW4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwIGlzIGNhbGxlZC4KLSAgICAqLwotICAgIGlmICgocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJgotICAgICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCA9PSBwUGxhbmVPdXRbMF0udV93aWR0aCkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHBVc2VyRGF0YSwgcFBsYW5lSW4sIHBQbGFuZU91dCk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X3dpZHRoKSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogTG9vcCBvbiBwbGFuZXMgKi8KLSAgICBmb3IodTMyX3BsYW5lID0gMDt1MzJfcGxhbmUgPCBQTEFORVM7dTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotICAgICAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICAvKgotICAgICAgICBGb3IgdGhlIGNhc2UgLCB3aWR0aF9vdXQgPSB3aWR0aF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZAotICAgICAgICBhY2Nlc3Npbmcgb25lIGNvbHVtbiBiZXlvbmQgdGhlIGlucHV0IHdpZHRoLkluIHRoaXMgY2FzZSB0aGUgbGFzdAotICAgICAgICBjb2x1bW4gaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA9PSB1MzJfd2lkdGhfaW4pIHsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSB1MzJfd2lkdGhfb3V0LTE7Ci0gICAgICAgICAgICB1OFdmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIEZvciB0aGUgY2FzZSAsIGhlaWdodF9vdXQgPSBoZWlnaHRfaW4gLCBzZXQgdGhlIGZsYWcgdG8gYXZvaWQKLSAgICAgICAgYWNjZXNzaW5nIG9uZSByb3cgYmV5b25kIHRoZSBpbnB1dCBoZWlnaHQuSW4gdGhpcyBjYXNlIHRoZSBsYXN0Ci0gICAgICAgIHJvdyBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nCi0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA9PSB1MzJfaGVpZ2h0X2luKSB7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9IHUzMl9oZWlnaHRfb3V0LTE7Ci0gICAgICAgICAgICB1OEhmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAvKgotICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgICAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kCi0gICAgICAgIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uCi0gICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbgotICAgICAgICBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpKwotICAgICAgICBmKHArJixxKzEpUigxLWEpUihiLTEpIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14Ci0gICAgICAgIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudCBpcyB0aGUgZGlzdGFuY2UKLSAgICAgICAgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgdTMyX3N0cmlkZV9pbjsKLSAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotICAgICAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICBUaGlzIHU4V2ZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0Ci0gICAgICAgICAgICAgICB3aWR0aCBpcyBzYW1lLCBhbmQgaGVpZ2h0IG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzCi0gICAgICAgICAgICAgICBwaXhlbCBpcyByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodThXZmxhZykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdThkdW0gPSAocHU4X2RhdGFfb3V0LXUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgcHU4X2RhdGFfb3V0ID0gcHU4X2RhdGFfb3V0ICsgdTMyX3N0cmlkZV9vdXQgLSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIHUzMl9zdHJpZGVfaW47Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgVGhpcyB1OEhmbGFnIGZsYWcgZ2V0cyBpbiB0byBlZmZlY3QgaWYgaW5wdXQgYW5kIG91dHB1dCBoZWlnaHQKLSAgICAgICAgaXMgc2FtZSwgYW5kIHdpZHRoIG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzIHBpeGVsIHJvdyBpcwotICAgICAgICByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHU4SGZsYWcpIHsKLSAgICAgICAgICAgIGZvcihsb29wID0wOyBsb29wIDwgKHUzMl93aWR0aF9vdXQrdThXZmxhZyk7IGxvb3ArKykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpKnB1OGR1bSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZykKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBwUGxhbmVPdXQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgICAgICBNNE9TQV9Db250ZXh0IG1fYWlyX2NvbnRleHQ7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lWSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVZID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKnRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMV0udV9oZWlnaHQqcFBsYW5lT3V0WzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJZIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJVIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclYiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwSW5QbGFuZVkgPSBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aCkgL3BQbGFuZUluLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KS8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKSAvcFBsYW5lSW4tPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X3dpZHRoICogcFBsYW5lT3V0LT51X2hlaWdodCkgL3BQbGFuZUluLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmhlaWdodCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocFBsYW5lSW4tPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCBBSVIgZnVuY3Rpb25zICovCi0gICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmbV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGluaXRpYWxpemluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKG1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChtX2Fpcl9jb250ZXh0LCBwUGxhbmVJbiwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksIHBQbGFuZU91dFswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVUsICh2b2lkICopcEluUGxhbmVVLCBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIG1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy9UT0RPOiByZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGxpbmsgd2l0aCB2aWRlb2FydGlzdCBsaWIKLS8qIE00QUlSIGNvZGUqLwotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgIE00QUlSX1N0YXRlcwotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jcmVhdGUgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRBSVJfa0NvbmZpZ3VyZWQgICAgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfU3RhdGVzICAgICAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAgICAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAgICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfaW5jWzRdOyAgICAgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgLyoqPCBob3Jpem9udGFsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgICAgIC8qKjwgc2F2ZSBvZiBob3Jpem9udGFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1bNF07ICAgICAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgICAgICAgICAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYk9ubHlDb3B5OyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFggY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWSBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyICgrLTkwwrAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIElNUExFTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLSAqIEBhdXRob3IgIEFybmF1ZCBDb2xsYXJkCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovCi0gICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksIE00QUlSLCAoTTRPU0FfQ2hhciopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYXV0aG9yICBBcm5hdWQgQ29sbGFyZAotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0gICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICYmKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KSkpCi0gICAgewotICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHJlc2l6ZSBmaWx0ZXIgKi8KLSAgICAgICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdTMyX3dpZHRoX2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8gc2V0dGluZ3MKLSAqICAgICAgICAgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUKLSAqICAgICAgICAgIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLAotICogICAgICAgICAgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLiBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkCi0gKiAgICAgICAgICBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgcE91dDogICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSl8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3g+PnUzMl9zaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7Ci0KLSAgICAgICAgICAgIC8qKiBHbyBhdCBlbmQgb2YgbGluZS9jb2x1bW4gaW4gY2FzZSBYL1kgc2Nhbm5pbmcgaXMgZmxpcHBlZCAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PnUzMl9zaGlmdCkgLTEgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IE5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NfaGVpZ2h0ID0gcE91dFtpXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2Nfd2lkdGggPSBwT3V0W2ldLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX3N0cmlkZSA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxvY19oZWlnaHQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sIGxvY193aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBsb2Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IGxvY19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKjwgSGVyZSB3ZSBoYXZlIGEgKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfS8qKiAzICE9IGkgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgKz0gcE91dFswXS51X2hlaWdodDsKLSAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8PSBwQy0+bV9wcm9jUm93cykgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKE00T1NBX1VDaGFyICpmaWxlTmFtZSwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIFlVVjQyMCBidWZmZXIgb2YgYSBnaXZlbiBpbWFnZSBmaWxlIChpbiBhcmdiODg4IGZvcm1hdCkKLSAqIEBOb3RlOiBUaGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmcmVlIHRoZSB5dXYgYnVmZmVyIGFsbG9jYXRlZAotICogQHBhcmFtICAgZmlsZU5hbWU6ICAgICAgIChJTikgUGF0aCB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFyZ2IgZGF0YQotICogQHBhcmFtICAgaGVpZ2h0OiAgICAgKElOKSBIZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgIHdpZHRoOiAgICAgICAgICAgICAoT1VUKSBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHl1diBkYXRhIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogaWYgdGhlIGZpbGUgcGFzc2VkIGRvZXMgbm90IGV4aXN0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChjb25zdCBjaGFyICpmaWxlTmFtZSwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcikgewotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUsICp5dXZQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSAod2lkdGggKiBoZWlnaHQgKiA0KTsgLy8gYXJnYiBkYXRhCi0gICAgTTRPU0FfQ29udGV4dCBsSW1hZ2VGaWxlRnAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAvKiogUmVhZCB0aGUgYXJnYiBkYXRhIGZyb20gdGhlIHBhc3NlZCBmaWxlLiAqLwotICAgIE00T1NBX0VSUiBsZXJyID0gTTRPU0FfZmlsZVJlYWRPcGVuKCZsSW1hZ2VGaWxlRnAsIChNNE9TQV9Wb2lkICopIGZpbGVOYW1lLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgaWYoKGxlcnIgIT0gTTROT19FUlJPUikgfHwgKGxJbWFnZUZpbGVGcCA9PSBNNE9TQV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBDYW4gbm90IG9wZW4gdGhlIGZpbGUgIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGxlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobEltYWdlRmlsZUZwLCAoTTRPU0FfTWVtQWRkcjgpcFRtcERhdGEsICZmcmFtZVNpemVfYXJnYik7Ci0gICAgaWYobGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IGNhbiBub3QgcmVhZCB0aGUgZGF0YSAiKTsKLSAgICAgICAgTTRPU0FfZmlsZVJlYWRDbG9zZShsSW1hZ2VGaWxlRnApOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIE00T1NBX2ZpbGVSZWFkQ2xvc2UobEltYWdlRmlsZUZwKTsKLQotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFlVVjQyMCBkYXRhLgotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoTTRPU0FfVUludDMyIGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocFRtcERhdGEpOwotCi0jaWZkZWYgRklMRV9EVU1QCi0gICAgRklMRSAqZnAgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3JnYi5yYXciLCAid2IiKTsKLSAgICBpZihmcCA9PSBOVUxMKQotICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShyZ2JQbGFuZS5wYWNfZGF0YSwgZnJhbWVTaXplLCAxLCBmcCk7Ci0gICAgICAgIGZjbG9zZShmcCk7Ci0gICAgfQotI2VuZGlmCi0gICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICAgICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgICAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICAgICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMF0ucGFjX2RhdGEgKyB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgICAgICB5dXZQbGFuZVsyXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgICAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzFdLnBhY19kYXRhICsgeXV2UGxhbmVbMV0udV9oZWlnaHQgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLQotCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsKLSAgICAgICAgLy9lcnIgPSBNNFZJRklfQkdSODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLCB5dXZQbGFuZSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotCi0gICAgICAgIC8vQUxPR0UoIlJHQiB0byBZVVYgZG9uZSIpOwotI2lmZGVmIEZJTEVfRFVNUAotICAgICAgICBGSUxFICpmcDEgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3l1di5yYXciLCAid2IiKTsKLSAgICAgICAgaWYoZnAxID09IE5VTEwpCi0gICAgICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZndyaXRlKHl1dlBsYW5lWzBdLnBhY19kYXRhLCB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIDEsIGZwMSk7Ci0gICAgICAgICAgICBmY2xvc2UoZnAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICpwQnVmZmVyID0geXV2UGxhbmVbMF0ucGFjX2RhdGE7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotfQotTTRPU0FfVm9pZCBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNFZJRklfVUludDggKmJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoOwotICAgIHBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMF0ucGFjX2RhdGEgPSBidWZmZXI7Ci0KLSAgICAvLyBVIHBsYW5lCi0gICAgcGxhbmVbMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsxXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGggPj4gMTsKLSAgICBwbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzFdLnBhY19kYXRhID0gYnVmZmVyKyhyZXBvcnRlZFdpZHRoKnJlcG9ydGVkSGVpZ2h0KTsKLQotICAgIC8vIFYgUGxhbmUKLSAgICBwbGFuZVsyXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzJdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aCA+PiAxOwotICAgIHBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMl0ucGFjX2RhdGEgPSBwbGFuZVsxXS5wYWNfZGF0YSArICgocmVwb3J0ZWRXaWR0aC8yKSoocmVwb3J0ZWRIZWlnaHQvMikpOwotfQotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVjEySW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgc3RyaWRlLAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyKSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSBzdHJpZGU7Ci0gICAgcGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVswXS5wYWNfZGF0YSA9IGJ1ZmZlcjsKLQotICAgIC8vIFUgcGxhbmUKLSAgICBwbGFuZVsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzFdLnVfc3RyaWRlID0gYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZS8yLCAxNik7Ci0gICAgcGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsxXS5wYWNfZGF0YSA9IChidWZmZXIKLSAgICAgICAgICAgICAgICArIHBsYW5lWzBdLnVfaGVpZ2h0ICogcGxhbmVbMF0udV9zdHJpZGUKLSAgICAgICAgICAgICAgICArIChwbGFuZVswXS51X2hlaWdodC8yKSAqIGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04oKAotICAgICAgICAgICAgICAgICBwbGFuZVswXS51X3N0cmlkZSAvIDIpLCAxNikpOwotCi0gICAgLy8gViBQbGFuZQotICAgIHBsYW5lWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMl0udV9zdHJpZGUgPSBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLzIsIDE2KTsKLSAgICBwbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzJdLnBhY19kYXRhID0gKGJ1ZmZlciArCi0gICAgIHBsYW5lWzBdLnVfaGVpZ2h0ICogYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZSwgMTYpKTsKLQotCi19Ci0KLU00T1NBX1ZvaWQgc3dhcEltYWdlUGxhbmVzKAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIpIHsKLQotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBwbGFuZU91dFswXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfd2lkdGggPSBwbGFuZU91dFswXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMF0udV9zdHJpZGUgPSBwbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzBdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzBdLnBhY19kYXRhID0gcGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBVIHBsYW5lICovCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gcGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMV0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMV0ucGFjX2RhdGEgPSBwbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICAvKioKLSAgICAgKiBWIFBsYW5lICovCi0gICAgcGxhbmVJblsyXS51X3dpZHRoID0gcGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICBwbGFuZUluWzJdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsyXS51X3N0cmlkZSA9IHBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMl0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMl0ucGFjX2RhdGEgPSBwbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGlmKHBsYW5lT3V0WzBdLnBhY19kYXRhID09IChNNFZJRklfVUludDgqKWJ1ZmZlcjEpCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjI7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjIgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMiArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjE7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjEgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMSArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLQotfQotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQZXJjZW50YWdlRG9uZSgKLSAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00T1NBX0RvdWJsZSAqcGVyY2VudGFnZURvbmUpIHsKLQotICAgIE00T1NBX0RvdWJsZSB2aWRlb0VmZmVjdFRpbWUgPTA7Ci0KLSAgICAvLyBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4KLSAgICB2aWRlb0VmZmVjdFRpbWUgPQotICAgICAoTTRPU0FfSW50MzIpKGN0c01zKyAwLjUpIC0gZWZmZWN0U3RhcnRUaW1lTXM7Ci0KLSAgICAvLyBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQKLSAgICAvLyBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lCi0gICAgLy8gd2hpY2ggaXMgZnJvbSBDVFMgPSAoZW9mLXRpbWVJbmNyZW1lbnQpIHRpbGwgQ1RTID0gZW9mCi0gICAgKnBlcmNlbnRhZ2VEb25lID0KLSAgICAgdmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdCllZmZlY3REdXJhdGlvbik7Ci0KLSAgICBpZigqcGVyY2VudGFnZURvbmUgPCAwLjApICpwZXJjZW50YWdlRG9uZSA9IDAuMDsKLSAgICBpZigqcGVyY2VudGFnZURvbmUgPiAxLjApICpwZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotfQotCi0KLU00T1NBX1ZvaWQgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QoCi0gICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyogZXh0UHJvZ3Jlc3MpIHsKLQotICAgIE00T1NBX0RvdWJsZSBwZXJjZW50YWdlRG9uZSA9MDsKLQotICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShjdHNNcywgZWZmZWN0U3RhcnRUaW1lTXMsIGVmZmVjdER1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgZXh0UHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKSggcGVyY2VudGFnZURvbmUgKiAxMDAwICk7Ci0gICAgZXh0UHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpKGN0c01zICsgMC41KTsKLSAgICBleHRQcm9ncmVzcy0+dWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgZXh0UHJvZ3Jlc3MtPmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLX0KLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gRm9yY2UgaW5wdXQgUkdCIGJ1ZmZlciB0byBldmVuIHNpemUgdG8gYXZvaWQgZXJyb3JzIGluIFlVViBjb252ZXJzaW9uCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCAmIH4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTlVMTDsKLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uOwotICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnRvcGxlZnRfeTsKLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksIE00VlMsCi0gICAgICAoTTRPU0FfQ2hhciopImFscGhhIGJsZW5kaW5nIHN0cnVjdCIpOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgIC8vIElmIG5ldyBPdmVybGF5IGJ1ZmZlciwgY29udmVydCBmcm9tIFJHQiB0byBZVVYKLSAgICBpZigob3ZlcmxheVJHQiAhPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSkgfHwgKG92ZXJsYXlZVVYgPT0gTlVMTCkgKSB7Ci0KLSAgICAgICAgLy8gSWYgWVVWIGJ1ZmZlciBleGlzdHMsIGRlbGV0ZSBpdAotICAgICAgICBpZihvdmVybGF5WVVWICE9IE5VTEwpIHsKLSAgICAgICAgICAgZnJlZShvdmVybGF5WVVWKTsKLSAgICAgICAgICAgb3ZlcmxheVlVViA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSkgewotICAgICAgICAvLyBJbnB1dCBSR0I1NjUgcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjg4OCkgewotICAgICAgICAvLyBJbnB1dCBSR0I4ODggcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgICAgIG92ZXJsYXlZVVYgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhOwotICAgICAgICBvdmVybGF5UkdCID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIgWVVWIGJ1ZmZlciByZXVzZSIpOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiWVVWIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilvdmVybGF5WVVWOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfVUludDE2IHJnYkNvbG9yRGF0YSkgewotCi0gICAgTTR4VlNTX0NvbG9yU3RydWN0IGNvbG9yQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGNvbG9yQ29udGV4dC5jb2xvckVmZmVjdFR5cGUgPSBjb2xvckVmZmVjdDsKLSAgICBjb2xvckNvbnRleHQucmdiMTZDb2xvckRhdGEgPSByZ2JDb2xvckRhdGE7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKAotICAgICAoTTRPU0FfVm9pZCAqKSZjb2xvckNvbnRleHQsIHBsYW5lSW4sIHBsYW5lT3V0LCBOVUxMLAotICAgICBjb2xvckVmZmVjdCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HVigiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvciglZCkgZXJyb3IgJWQiLAotICAgICAgICAgICAgY29sb3JFZmZlY3QsIGVycik7Ci0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOwotICAgICAgICAgICAgYnVmZmVyMSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHZpZGVvRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX0ludDMyIGx1bV9mYWN0b3IpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgKLSAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVJbiwoTTRWaUNvbUltYWdlUGxhbmUqKXBsYW5lT3V0LAotICAgICAgICAgbHVtX2ZhY3RvciwgTlVMTCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSglZCkgZXJyb3IgJWQiLCB2aWRlb0VmZmVjdCwgKGludCllcnIpOwotCi0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgewotICAgICAgICAgICAgZnJlZShidWZmZXIxKTsKLSAgICAgICAgICAgIGJ1ZmZlcjE9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMj0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopYnVmZmVyMSwKLSAgICAgKE00VklGSV9VSW50OCAqKWJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUodmVQb3N0UHJvY2Vzc1BhcmFtcyAqcGFyYW1zLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMLCAqdGVtcE91dHB1dEJ1ZmZlcj0gTlVMTDsKLSAgICBNNE9TQV9Eb3VibGUgcGVyY2VudGFnZURvbmUgPTA7Ci0gICAgTTRPU0FfSW50MzIgbHVtX2ZhY3RvcjsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCBmaWZ0aWVzQ3R4OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwLCBpPTA7Ci0KLSAgICBmcmFtZVNpemUgPSAocGFyYW1zLT52aWRlb1dpZHRoKnBhcmFtcy0+dmlkZW9IZWlnaHQqMykgPj4gMTsKLQotICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgKE00T1NBX0NoYXIqKSgibHZwcCBmaW5hbE91dHB1dEJ1ZmZlciIpKTsKLQotICAgIGlmKGZpbmFsT3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gYWxsb2NhdGUgdGhlIHRlbXBPdXRwdXRCdWZmZXIKLSAgICB0ZW1wT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAoKHBhcmFtcy0+dmlkZW9IZWlnaHQqcGFyYW1zLT52aWRlb1dpZHRoKjMpPj4xKSwgTTRWUywgKE00T1NBX0NoYXIqKSgibHZwcCBjb2xvckJ1ZmZlciIpKTsKLQotICAgIGlmKHRlbXBPdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZTogbWFsbG9jIGVycm9yIHRlbXBPdXRwdXRCdWZmZXIiKTsKLSAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIHBhcmFtcy0+dmlkQnVmZmVyLCByZXBvcnRlZFdpZHRoLCByZXBvcnRlZEhlaWdodCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBPdXQgcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZU91dCwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQpOwotCi0gICAgLy8gVGhlIHBsYW5lSW4gY29udGFpbnMgdGhlIFlVVjQyMCBpbnB1dCBkYXRhIHRvIHBvc3Rwcm9jZXNzaW5nIG5vZGUKLSAgICAvLyBhbmQgcGxhbmVPdXQgd2lsbCBjb250YWluIHRoZSBZVVY0MjAgZGF0YSB3aXRoIGVmZmVjdAotICAgIC8vIEluIGVhY2ggc3VjY2Vzc2l2ZSBpZiBjb25kaXRpb24sIGFwcGx5IGZpbHRlciB0byBzdWNjZXNzaXZlCi0gICAgLy8gb3V0cHV0IFlVViBmcmFtZSBzbyB0aGF0IGNvbmN1cnJlbnQgZWZmZWN0cyBhcmUgYm90aCBhcHBsaWVkCi0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1BJTkspIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JFRU4pIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1NFUElBKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9ORUdBVElWRSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JBRElFTlQpIHsKLSAgICAgICAgLy8gZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50LAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aVJnYjE2SW5wdXRDb2xvcik7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTYpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlSZ2IxNklucHV0Q29sb3IpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGlmKHBhcmFtcy0+aXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCkgewotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHgucHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlmdGllc0N0eC5maWZ0aWVzRWZmZWN0RHVyYXRpb24gPQotICAgICAgICAgICAgIDEwMDAvcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHguc2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LnN0cmlwZVJhbmRvbVZhbHVlID0gMDsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJmZpZnRpZXNDdHgsIHBsYW5lSW4sIHBsYW5lT3V0LCAmZXh0UHJvZ3Jlc3MsCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcyk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgICAgICAgICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0KLSAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgZnJhbWluZ0N0eDsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYoKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBhcmFtcy0+dGltZU1zICsgcGFyYW1zLT50aW1lT2Zmc2V0KSAmJgotICAgICAgICAgICAgICAgICAgICgocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGVyciA9IHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKCZmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3MsIGksIHBhcmFtcy0+b3ZlcmxheUZyYW1lUkdCQnVmZmVyLAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdmVybGF5RnJhbWVZVVZCdWZmZXIpOwotCi0gICAgICAgICAgICBpZihlcnIgPT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZygKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZmcmFtaW5nQ3R4LCBwbGFuZUluLCBwbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguYWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGZyYW1pbmdDdHguRnJhbWluZ1l1diAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHguRnJhbWluZ1l1diA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0lmIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlIC8gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBlcnJvciwgdGhlbiByZXR1cm4gZnJvbSBmdW5jdGlvbgotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICAgICAgICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSykgewotICAgICAgICAvKiBmaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkqLwotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KQotICAgICAgICAgICAgbHVtX2ZhY3RvciA9IChNNE9TQV9JbnQzMikoIHBlcmNlbnRhZ2VEb25lICogMTAyNCApOwotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QKLSAgICAgICAgICAgIGVyciA9IGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpCi0gICAgICAgICAgICBsdW1fZmFjdG9yID0gKE00T1NBX0ludDMyKSggKDEuMC1wZXJjZW50YWdlRG9uZSkgKiAxMDI0ICk7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdAotICAgICAgICAgICAgZXJyID0gYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy8gVyAmIEggZXZlbgotICAgIC8vIFlWVSBpbnN0ZWFkIG9mIFlVVgotICAgIC8vIGFsaWduIGJ1ZmZlcnMgb24gMzIgYml0cwotCi0gICAgLy8gWSBwbGFuZQotICAgIC8vaW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgocGFyYW1zLT5vdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgocGFyYW1zLT5vdXRWaWRlb0hlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpcGFyYW1zLT5vdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilwYXJhbXMtPnBPdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBwYXJhbXMtPnJlbmRlcmluZ01vZGUpOwotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgZmluYWxPdXRwdXRCdWZmZXI9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImRvVmlkZW9Qb3N0UHJvY2Vzc2luZzogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0lZCIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSByZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0KSB7Ci0KLSAgICB1aW50MzJfdCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodDsKLQotICAgIGlmIChwV2lkdGggPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwV2lkdGgiKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHBIZWlnaHQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwSGVpZ2h0Iik7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChyZXNvbHV0aW9uKSB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTc2OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNzIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4NTQ7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEwODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gOTYwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gcmVzb2x1dGlvbiAlZC4iLCByZXNvbHV0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgKnBXaWR0aCA9IGZyYW1lV2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBmcmFtZUhlaWdodDsKLQotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqLCB1X3N0cmlkZTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgLyoqPCBBcyB3ZSBoYXZlIGEgLTkwwrAgcm90YXRpb24sIGZpcnN0IG5lZWRlZCBwaXhlbCBpcyB0aGUgdXBwZXItcmlnaHQgb25lICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKSArCi0gICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQgLSAxIDsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICB1X3N0cmlkZSA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIC8qKjwgTG9vcCBvbiBvdXRwdXQgcm93cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgLyoqPCBMb29wIG9uIGFsbCBvdXRwdXQgcGl4ZWxzIGluIGEgcm93ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QrKz0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0gdV9zdHJpZGU7ICAvKio8IEdvIHRvIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgLT0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArIDEgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksaiwgdV9zdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIC8qKjwgQXMgd2UgaGF2ZSBhICs5MMKwIHJvdGF0aW9uLCBmaXJzdCBuZWVkZWQgcGl4ZWwgaXMgdGhlIGxlZnQtZG93biBvbmUgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pICsKLSAgICAgICAgICAgICAocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMSkpOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHVfc3RyaWRlID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgLyoqPCBMb29wIG9uIG91dHB1dCByb3dzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAvKio8IExvb3Agb24gYWxsIG91dHB1dCBwaXhlbHMgaW4gYSByb3cgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAqcF9idWZfZGVzdCsrPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyAtPSB1X3N0cmlkZTsgIC8qKjwgR28gdG8gdGhlIHByZXZpb3VzIHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgdGVtcF9waXgxOwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIC8qKjwgSWYgcFBsYW5lSW4gPSBwUGxhbmVPdXQsIHRoZSBhbGdvcml0aG0gd2lsbCBiZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKHBfYnVmX3NyYyA9PSBwX2J1Zl9kZXN0KSB7Ci0gICAgICAgICAgICAvKio8IEdldCBBZGRyZXNzIG9mIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodC0xKSArCi0gICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxOwotCi0gICAgICAgICAgICAvKio8IFdlIGxvb3AgKGhlaWdodC8yKSB0aW1lcyBvbiB0aGUgcm93cy4KLSAgICAgICAgICAgICAqIEluIGNhc2UgdV9oZWlnaHQgaXMgb2RkLCB0aGUgcm93IGF0IHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lCi0gICAgICAgICAgICAgKiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFzIG11c3QgYmUgbWlycm9yZWQgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KT4+MSk7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9waXgxPSAqcF9idWZfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX3NyYysrID0gdGVtcF9waXgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IGluIHRvcCBvZiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byB0aGUgbGFzdCBwaXhlbCBpbiBwcmV2aW91cyByb3cgaW4gYm90dG9tIG9mIGZyYW1lKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0IC09Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBNaXJyb3IgbWlkZGxlIHJvdyBpbiBjYXNlIGhlaWdodCBpcyBvZGQgKi8KLSAgICAgICAgICAgIGlmICgocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQlMikhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ+PjEpOwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgLyoqPCBXZSBsb29wIHVfd2lkdGgvMiB0aW1lcyBvbiB0aGlzIHJvdy4KLSAgICAgICAgICAgICAgICAgKiAgSW4gY2FzZSB1X3dpZHRoIGlzIG9kZCwgdGhlIHBpeGVsIGF0IHRoZSBtaWRkbGUgb2YgdGhpcyByb3cKLSAgICAgICAgICAgICAgICAgKiByZW1haW5zIHVuY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aD4+MSk7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX3BpeDE9ICpwX2J1Zl9kZXN0OwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfc3JjKysgPSB0ZW1wX3BpeDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqPCBHZXQgQWRkcmVzcyBvZiBsYXN0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0LTEpICsKLSAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMTsKLQotICAgICAgICAgICAgLyoqPCBMb29wIG9uIHJvd3MgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBpbiB0b3Agb2YgaW5wdXQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byBsYXN0IHBpeGVsIG9mIHByZXZpb3VzIHJvdyBpbiBib3R0b20gb2YgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgLT0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLCBNNE9TQV9VSW50MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiByb3RhdGlvbikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0KLSAgICBpZiAocEJ1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseVZpZGVvUm90YXRpb246IE5VTEwgaW5wdXQgZnJhbWUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVUludDgqIG91dFB0ciA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgKHdpZHRoKmhlaWdodCoxLjUpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJyb3RhdGlvbiBvdXQgcHRyIikpOwotICAgIGlmIChvdXRQdHIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB3aWR0aCwKLSAgICAgICAgaGVpZ2h0LCAoTTRWSUZJX1VJbnQ4ICopcEJ1ZmZlciwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICBpZiAocm90YXRpb24gIT0gMTgwKSB7Ci0gICAgICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lT3V0LCBoZWlnaHQsCi0gICAgICAgICAgICB3aWR0aCwgb3V0UHRyLCBoZWlnaHQsIHdpZHRoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2gocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVPdXQpOwotICAgICAgICAgICAgbWVtY3B5KHBCdWZmZXIsICh2b2lkICopb3V0UHRyLCAod2lkdGgqaGVpZ2h0KjEuNSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVJbik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZU91dCk7Ci0gICAgICAgICAgICBtZW1jcHkocEJ1ZmZlciwgKHZvaWQgKilvdXRQdHIsICh3aWR0aCpoZWlnaHQqMS41KSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZyZWUoKHZvaWQgKilvdXRQdHIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI0NjRkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1RPT0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9UT09MU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jZGVmaW5lIE1FRElBX1JFTkRFUklOR19JTlZBTElEIDI1NQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotZW51bSB7Ci0gICAgVklERU9fRUZGRUNUX05PTkUgICAgICAgICAgICAgICA9IDAsCi0gICAgVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEUgICAgICA9IDEsCi0gICAgVklERU9fRUZGRUNUX1BJTksgICAgICAgICAgICAgICA9IDIsCi0gICAgVklERU9fRUZGRUNUX0dSRUVOICAgICAgICAgICAgICA9IDQsCi0gICAgVklERU9fRUZGRUNUX1NFUElBICAgICAgICAgICAgICA9IDgsCi0gICAgVklERU9fRUZGRUNUX05FR0FUSVZFICAgICAgICAgICA9IDE2LAotICAgIFZJREVPX0VGRkVDVF9GUkFNSU5HICAgICAgICAgICAgPSAzMiwKLSAgICBWSURFT19FRkZFQ1RfRklGVElFUyAgICAgICAgICAgID0gNjQsCi0gICAgVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2ICAgICAgICA9IDEyOCwKLSAgICBWSURFT19FRkZFQ1RfR1JBRElFTlQgICAgICAgICAgID0gMjU2LAotICAgIFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLICAgICAgPSA1MTIsCi0gICAgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLICAgICAgICA9IDIwNDgsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX1VJbnQ4ICp2aWRCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0OwotICAgIE00T1NBX1VJbnQzMiB0aW1lTXM7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQ7IC8vaGFzIHRoZSBkdXJhdGlvbiBvZiBjbGlwcyBwbGF5ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGZsYWcgc2hhbGwgYmUgdXNlZCBmb3IgRnJhbWluZy4KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbnVtYmVyRWZmZWN0czsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9XaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9IZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBNNE9TQV9Cb29sIGlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGU7Ci0gICAgdWludDhfdCAqcE91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlOwotICAgIE00VklGSV9VSW50OCogIG92ZXJsYXlGcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBvdmVybGF5RnJhbWVZVVZCdWZmZXI7Ci19IHZlUG9zdFByb2Nlc3NQYXJhbXM7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCxNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKCBNNE9TQV9Wb2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LCB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLU00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1ZvaWQgKipwQnVmZmVyKTsKLS8qLSBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZyk7Ci0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRWSUZJX1VJbnQ4ICpidWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiBzdHJpZGUsIE00VklGSV9VSW50OCAqYnVmZmVyKTsKLQotTTRPU0FfVm9pZCBzd2FwSW1hZ2VQbGFuZXMoCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMik7Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKAotICAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNE9TQV9Eb3VibGUgKnBlcmNlbnRhZ2VEb25lKTsKLQotTTRPU0FfVm9pZCBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdCgKLSAgICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MqIGV4dFByb2dyZXNzKTsKLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpOwotCi1NNE9TQV9FUlIgYXBwbHlDb2xvckVmZmVjdChNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX1VJbnQxNiByZ2JDb2xvckRhdGEpOwotCi1NNE9TQV9FUlIgYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdmlkZW9FZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfSW50MzIgbHVtX2ZhY3Rvcik7Ci0KLU00T1NBX0VSUiBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKHZlUG9zdFByb2Nlc3NQYXJhbXMgKnBhcmFtcywKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KTsKLQotYW5kcm9pZDo6c3RhdHVzX3QgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIHJlc29sdXRpb24sCi0gICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHJvdGF0aW9uKTsKLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1RPT0xTX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM3Mzc2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uaAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgU3ltYmlhbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotLyoqLwotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICgqcEZjdFB0cl9PcGVuKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1JlYWQpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfU2VlaykoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1RlbGwpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9JbnQzMiAgICAgICAgKCpwRmN0UHRyX0Nsb3NlKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX1ZvaWQgICAgICAgICAoKnBGY3RQdHJfQWNjZXNzVHlwZSkoIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2Vzc19JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogRmlsZU1vZGVBY2Nlc3NfT3V0ICk7Ci0KLSAgICB9IE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyOwotI2VuZGlmCi0vKiovCi0KLQotLyogUmVhZGVyIEFQSSA6IGJ1ZmZlcml6ZWQgZnVuY3Rpb25zICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpOwotI2VuZGlmCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOwotCi0jZW5kaWYgLyogTTRPU0FfRklMRVJFQURFUl9PUFRJTV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGQ3ZTg1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgICAgICAgTFZfTWFjcm9zLmgKLSogQHBhciAgICAgICAgTlhQIFNvZnR3YXJlCi0qIEBicmllZiAgICBNYWNyb3MgZGVmaW5pdGlvbiBmb3IgU21hcnRwaG9uZSB0ZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWX01BQ1JPU19ICi0jZGVmaW5lIExWX01BQ1JPU19ICi0KLS8qLS0tLS0tLS0tLS0tKi8KLS8qICAgIElOQ0xVREVTICAqLwotLyotLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIHAuIElmIGl0IGlzIE5VTEwsIGl0IHNldHMgdGhlIHZhcmlhYmxlIGVycgotKiAgICAgICAgICAgdG8gZXJyVmFsdWUgYW5kIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLiBBIHRyYWNlIGlzIGRpc3BsYXllZAotKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIRUNLX1BUUihmY3QsIHAsIGVyciwgZXJyVmFsdWUpIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgPT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIChlcnIpID0gKGVyclZhbHVlKSA7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoKE00T1NBX0NoYXIqKSIiICNmY3QgIihMJWQpOiAiICNwICIgaXMgTlVMTCwgcmV0dXJuaW5nICIgI2VyclZhbHVlICIiLF9fTElORV9fKSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfRVJSKGZjdCwgZXJyKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgZXJyLiBJZiBpdCBpcyBub3QgTlVMTCwgYSB0cmFjZSBpcyBkaXNwbGF5ZWQKLSogICAgICAgICAgIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLiBUaGUgbWFjcm8KLSogICAgICAgICAgIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDSEVDS19FUlIoZmN0LCBlcnIpIFwKLXsgXAotICAgIGlmKE00Tk9fRVJST1IgIT0gKGVycikpIFwKLSAgICB7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoKE00T1NBX0NoYXIqKSIhISEgIiAjZmN0ICIoTCVkKTogRVJST1IgMHglLjh4IHJldHVybmVkIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyxlcnIpIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX0VSUihmY3QsIGVycikKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjb21wYXJlcyBhIGN1cnJlbnQgc3RhdGUgd2l0aCBhIHN0YXRlIHZhbHVlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsCi0qICAgICAgICAgICBlcnIgaXMgc2V0IHRvIE00RVJSX1NUQVRFLgotKiAgICAgICAgICAgQSB0cmFjZSBpcyBkaXNwbGF5ZWQgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qICAgICAgICAgICBUaGUgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICAgIENIRUNLX1NUQVRFKGZjdCwgc3RhdGVWYWx1ZSwgc3RhdGUpIFwKLXsgXAotICAgIGlmKChzdGF0ZVZhbHVlKSAhPSAoc3RhdGUpKSBcCi0gICAgeyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCIiICNmY3QgIiBjYWxsZWQgaW4gYmFkIHN0YXRlICVkIiwgc3RhdGUpIDsgXAotICAgICAgICAoZXJyKSA9IE00RVJSX1NUQVRFIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBTQUZFX0ZSRUUocCkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIG9mIHAgaXMgbm90IE5VTEwuIElmIGl0IGlzIE5VTEwsIGl0IGRvZXMKLSogICAgICAgICAgIG5vdGhpbmcuIEVsc2UsIHAgaXMgZGUgYWxsb2NhdGVkIGFuZCBzZXQgdG8gTlVMTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotCi0KLSNlbmRpZiAvKi0tLSAgTFZfTUFDUk9TX0ggLS0tKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MzE2ZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0NoYXJTdGFyLmgKLSAqIEBpbmdyb3VwCi0gKiBAYnJpZWYgICAgICAgIGV4dGVybmFsIEFQSSBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0NIQVJTVEFSX0gKLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVJfSAotCi0vKiBnZW5lcmFsIE9TQUwgdHlwZXMgYW5kIHByb3RvdHlwZXMgaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0KLS8qIHR5cGVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa2NockRlYyAgPSAweDAxLAotICAgTTRPU0Ffa2NockhleGEgPSAweDAyLAotICAgTTRPU0Ffa2Nock9jdCAgPSAweDAzCi19IE00T1NBX2Nock51bUJhc2U7Ci0KLS8qIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05PVF9GT1VORCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfQ0hSX05VTV9SQU5HRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05FR0FUSVZFICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMykKLQotLyogcHJvdG90eXBlcyBvZiB0aGUgQ2hhciBTdGFyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJOQ29weSAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29weSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbCAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgICpyZXN1bHQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2ICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlYTY5Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIGNsb2NrIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9DTE9DS19ICi0jZGVmaW5lIE00T1NBX0NMT0NLX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLQotI2RlZmluZSBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRyAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBUaW1lIHByZWNpc2lvbiB0b28gaGlnaCBmb3IgdGhlIHN5c3RlbSovCi0jZGVmaW5lIE00RVJSX0NMT0NLX0JBRF9SRUZfWUVBUiAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NMT0NLLDB4MDAwMDAxKSAvKio8IElucHV0IHllYXIgb2YgcmVmZXJlbmNlIGlzIG5laXRoZXIgMTkwMCwgbm9yIDE5NzAgbm9yIDIwMDAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lc2NhbGUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypNNE9TQV9DTE9DS19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE3MjgwMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE9TQV9Db3JlSUQuaAotICogQGJyaWVmICBkZWZpbmVzIHRoZSB1bmlxdWVzIGNvbXBvbmVudCBpZGVudGlmaWVycyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICogICAgICAgICBhbmQgb3B0aW9uSUQgbWVjaGFuaXNtCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjZhYjUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRGVidWcuaAotICogQGJyaWVmICAgICAgICBEZWJ1ZyBhbmQgVHJhY2UgTWFjcm8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfTTRPU0FfREVCVUdfSF8KLSNkZWZpbmUgX000T1NBX0RFQlVHX0hfCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotLyogZGVmYXV0IHZhbHVlLCBkZWZpbmVkIG9ubHkgaWYgbm90IGRlZmluZWQgYWxyZWFkeS4gKi8KLSNpZm5kZWYgTTRUUkFDRV9JRAotI2RlZmluZSBNNFRSQUNFX0lEIE00VU5LTk9XTl9DT1JFSUQKLSNlbmRpZiAvKiBNNFRSQUNFX0lEIHVuZGVmaW5lZCAqLwotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX0RFQlVHX0xFVkVMCi0jZGVmaW5lIE00T1NBX0RFQlVHX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCi0KLS8qIERlYnVnIG1hY3JvcyAqLwotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcik7Ci0KLQotI2RlZmluZSBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIGxldmVsKVwKLSAgICAgIGlmKGNvbmQpXAotICAgICAge1wKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2NvbmQsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JDb2RlKSk7XAotICAgICAgICAgcmV0dXJuKGVycm9yQ29kZSk7XAotICAgICAgfQotCi0jZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikjZXJyb3JDb2RlLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yQ29kZSkpOwotCi0jZWxzZSAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLSNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpCi0KLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDEpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYxKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDIpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYyKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDMpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYzKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAzKSovCi0KLQotCi0vKiBUcmFjZSBtYWNyb3MgKi8KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKLQotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gKTsKLQotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzAobXNnLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLHBhcmFtMiwgcGFyYW0zKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KTsKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMSkKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMikKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM180KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDMpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX000T1NBX0RFQlVHX0hfICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWMzMTc3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRXJyb3IuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIHR5cGVzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgZXJyb3IgY29kZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRVJST1JfSAotI2RlZmluZSBNNE9TQV9FUlJPUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKiogTTRPU0FfRVJSIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotICogVG8gc29ydCByZXR1cm5lZCBjb2RlLCBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uIG11c3QgYmUgZm9sbG93ZWQ6Ci0gKiAtIFNldmVyaXR5ICgyIGJpdHMpOiBJdCBtYXkgYnIgZWl0aGVyIDBiMDAgKG5vIGVycm9yKSwgMGIwMSAod2FybmluZykgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIDBiMDEgKGZhdGFsIGVycm9yKQotICogLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKLSAqIC0gRXJyb3JJRCAoMTYgYml0cyk6IEl0IGlzIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlCi0KLSAqIEVBQ0ggQ09SRSBDT01QT05FTlQgRlVOQ1RJT04gU0hPVUxEIFJFVFVSTiBBTiBNNE9TQV9FUlIKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiAgIE00T1NBX0VSUjsKLQotI2RlZmluZSBNNF9PSyAgICAgMAotI2RlZmluZSBNNF9XQVIgICAgMQotI2RlZmluZSBNNF9FUlIgICAgMgotCi0KLS8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfRVJSICovCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSB3YXJuaW5nIG9yIG5vdCovCi0jZGVmaW5lIE00T1NBX0VSUl9JU19XQVJOSU5HKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9XQVIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyBpZiB0aGUgcHJvdmlkZWQgTTRPU0FfRVJSIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90Ki8KLSNkZWZpbmUgTTRPU0FfRVJSX0lTX0VSUk9SKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9FUlIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIGFuIGVycm9yIGNvZGUgYWNjcm9kaW5nIHRvIHRoZSAzIHByb3ZpZGVkIGZpZWxkczoKLSAgKiBAYXJnIHNldmVyaXR5OiAoSU4pIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgY29yZUlEOiAoSU4pIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChJTikgW000T1NBX1VJbnQzMl0gRXJyb3JJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUqLwotI2RlZmluZSBNNE9TQV9FUlJfQ1JFQVRFKHNldmVyaXR5LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfVUludDMyKXNldmVyaXR5KTw8MzApKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQotCi0vKiogVGhpcyBtYWNybyBleHRyYWN0cyB0aGUgMyBmaWVsZHMgZnJvbSB0aGUgZXJyb3I6Ci0gICogQGFyZyBlcnJvcjogKElOKSBbTTRPU0FfRVJSXSBFcnJvciBjb2RlCi0gICogQGFyZyBzZXZlcml0eTogKE9VVCkgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBjb3JlSUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIEVycm9ySUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlKi8KLSNkZWZpbmUgTTRPU0FfRVJSX1NQTElUKGVycm9yLCBzZXZlcml0eSwgY29yZUlELCBlcnJvcklEKVwKLSAgIHsgc2V2ZXJpdHk9KE00T1NBX1VJbnQzMikoKGVycm9yKT4+MzApO1wKLSAgICAgY29yZUlEPShNNE9TQV9VSW50MzIpKCgoZXJyb3IpPj4xNikmMHgwMDNGRkYpO1wKLSAgICAgKE00T1NBX1VJbnQzMikoZXJyb3JJRD0oZXJyb3IpJjB4MDBGRkZGKTsgfQotCi0KLS8qICJmYWtlIiBDb3JlSUQsIGlzIHVzZWQgdG8gcmVwb3J0IGFuIHVua25vd24gQ29yZUlELiBVc2VkIGJ5IHRoZSB0cmFjZSBzeXN0ZW0KLXdoZW4gdGhlIGNvcmUgSUQgbWFjcm8gaXNuJ3QgZGVmaW5lZC4gRGVmaW5lZCBoZXJlIGluc3RlYWQgb2YgQ29yZUlELmggdG8gYXZvaWQKLWludHJvZHVjaW5nIGRlcGVuZGVuY2llcyB0byBjb21tb24vaW5jLiAqLwotCi0jZGVmaW5lIE00VU5LTk9XTl9DT1JFSUQgICAgMHgzRkZGIC8qIG1heCBwb3NzaWJsZSBDb3JlSUQgKi8KLQotI2RlZmluZSBNNF9DT01NT04gICAgICAgICAgIDB4MDAgIC8qKjxDb21tb24qLwotI2RlZmluZSBNNE1QNF9DT01NT04gICAgICAgIDB4MDEgIC8qKjxDb3JlIE1QNCAoY29tbW9uKSovCi0jZGVmaW5lIE00TVA0X1dSSVRFUiAgICAgICAgMHgwMiAgLyoqPENvcmUgTVA0IHdyaXRlciovCi0jZGVmaW5lIE00TVA0X1JFQURFUiAgICAgICAgMHgwMyAgLyoqPENvcmUgTVA0IHJlYWRlciovCi0jZGVmaW5lIE00UlRTUF9DT01NT04gICAgICAgMHgxMSAgLyoqPENvcmUgUlRTUCBjb21tb24qLwotI2RlZmluZSBNNFJUU1BfV1JJVEVSICAgICAgIDB4MTIgIC8qKjxDb3JlIFJUU1AgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFJUU1BfUkVBREVSICAgICAgIDB4MTMgIC8qKjxDb3JlIFJUU1AgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFJUUF9XUklURVIgICAgICAgIDB4MTQgIC8qKjxDb3JlIFJUUC9SVENQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRSVFBfUkVBREVSICAgICAgICAweDE1ICAvKio8Q29yZSBSVFAvUlRDUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00U0FQX1dSSVRFUiAgICAgICAgMHgxNiAgLyoqPENvcmUgU0FQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRTQVBfUkVBREVSICAgICAgICAweDE3ICAvKio8Q29yZSBTQVAgcmVjZWl2ZXIqLwotI2RlZmluZSBNNERWQkhfUkVBREVSICAgICAgICAweDE4ICAvKio8Q29yZSBEVkJIIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRTRFBfV1JJVEVSICAgICAgICAweDIyICAvKio8Q29yZSBTRFAgd3JpdGVyKi8KLSNkZWZpbmUgTTRTRFBfUkVBREVSICAgICAgICAweDMxICAvKio8Q29yZSBTRFAgcmVhZGVyKi8KLSNkZWZpbmUgTTRQQUtfQU1SICAgICAgICAgICAweDMyICAvKio8Q29yZSBwYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLwotI2RlZmluZSBNNERFUEFLX0FNUiAgICAgICAgIDB4MzMgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgQU1SIChSRkMzMjY3KSovCi0jZGVmaW5lIE00UEFLX0gyNjMgICAgICAgICAgMHgzNCAgLyoqPENvcmUgcGFja2V0aXplciBIMjYzIChSRkMyNDI5KSovCi0jZGVmaW5lIE00REVQQUtfSDI2MyAgICAgICAgMHgzNSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBIMjYzKFJGQzI0MjkpKi8KLSNkZWZpbmUgTTRQQUtfU0lNUExFICAgICAgICAweDM2ICAvKio8Q29yZSBwYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLwotI2RlZmluZSBNNERFUEFLX1NJTVBMRSAgICAgIDB4MzcgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgU2ltcGxlRHJhZnQgKFJGQyB4eHh4KSovCi0jZGVmaW5lIE00UEFLXzMwMTZfVklERU8gICAgMHgzOCAgLyoqPENvcmUgcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KLSNkZWZpbmUgTTRERVBBS18zMDE2X1ZJREVPICAweDM5ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgdmlkZW8qLwotI2RlZmluZSBNNFBBS18zMDE2X0FVRElPICAgIDB4M0EgIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLXzMwMTZfQVVESU8gIDB4M0IgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLX0gyNjQgICAgICAgIDB4M0MgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2NCovCi0jZGVmaW5lIE00REVQQUtfUkVBTFYgICAgICAgIDB4M0QgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUmVhbCBWaWRlbyAqLwotI2RlZmluZSBNNERFUEFLX1JFQUxBICAgICAgICAweDNFICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgQXVkaW8gKi8KLSNkZWZpbmUgTTRSRFRfUkVBREVSICAgICAgICAweDNGICAvKio8Q29yZSBSRFQgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFRDUF9ETVVYICAgICAgICAgIDB4NTAgIC8qKjxDb3JlIFRDUCBkZW11eCovCi0jZGVmaW5lIE00SU9EX1BBUlNFUiAgICAgICAgMHg1MSAgLyoqPENvcmUgSU9EIHBhcnNlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfQ09NTU9OICAgMHg2MSAgLyoqPE9TQUwgZmlsZSBjb21tb24qLwotI2RlZmluZSBNNE9TQV9GSUxFX1dSSVRFUiAgIDB4NjIgIC8qKjxPU0FMIGZpbGUgd3JpdGVyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9SRUFERVIgICAweDYzICAvKio8T1NBTCBmaWxlIHJlYWRlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfRVhUUkEgICAgMHg2NCAgLyoqPE9TQUwgZmlsZSBleHRyYSovCi0jZGVmaW5lIE00T1NBX0RJUkVDVE9SWSAgICAgMHg2NSAgLyoqPE9TQUwgZGlyZWN0b3J5Ki8KLSNkZWZpbmUgTTRPU0FfU09DS0VUICAgICAgICAweDcxICAvKio8T1NBTCBzb2NrZXQgKGJvdGggcmVhZGVyIGFuZCB3cml0ZXIpKi8KLSNkZWZpbmUgTTRPU0FfVEhSRUFEICAgICAgICAweDgxICAvKio8T1NBTCB0aHJlYWQqLwotI2RlZmluZSBNNE9TQV9NVVRFWCAgICAgICAgIDB4ODIgIC8qKjxPU0FMIG11dGV4Ki8KLSNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFICAgICAweDgzICAvKio8T1NBTCBzZW1hcGhvcmUqLwotI2RlZmluZSBNNE9TQV9DTE9DSyAgICAgICAgIDB4ODQgIC8qKjxPU0FMIGNsb2NrKi8KLSNkZWZpbmUgTTRPU0FfTUVNT1JZICAgICAgICAweDkxICAvKio8T1NBTCBtZW1vcnkqLwotI2RlZmluZSBNNENBTExfQkFDSyAgICAgICAgIDB4QTEgIC8qKjxDYWxsIEJhY2sgZXJyb3IqLwotI2RlZmluZSBNNE9TQV9VUkkgICAgICAgICAgIDB4QjEgIC8qKjxPU0FMIFVSSSBoYW5kbGVyKi8KLSNkZWZpbmUgTTRPU0FfU1RSSU5HICAgICAgICAweEIyICAvKio8T1NBTCBzdHJpbmcqLwotI2RlZmluZSBNNFNZU19DTUFQSSAgICAgICAgIDB4QjMgIC8qKjxTWVNURU0gQ29tbW9uIE1lZGkgQVBJKi8KLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVIgICAgICAweEI0ICAvKio8T1NBTCBDaGFyU3RhciovCi0jZGVmaW5lIE00UkVBQ1RPUiAgICAgICAgICAgMHhDMSAgLyoqPENvcmUgcmVhY3RvciovCi0jZGVmaW5lIE00VEVTVCAgICAgICAgICAgICAgMHhEMSAgLyoqPFRlc3QgY29tcG9uZW50Ki8KLSNkZWZpbmUgTTRTVEFDSyAgICAgICAgICAgICAgICAweEUxICAvKio8IENvcmUgSUQgb2YgdGhlIGludGVncmF0ZWQgc3RhY2sqLwotI2RlZmluZSBNNFNUQUNLX1JFQUwgICAgICAgIDB4RTIgIC8qKjxDb3JlIElEIG9mIHRoZSBSZWFsIGludGVncmF0ZWQgc3RhY2sgKi8KLSNkZWZpbmUgTTRUT09MX0xCVlRfUEFSQU0gICAweEYxICAvKio8TEJfVlQgY29uZmlnIGZpbGUgbWFuYWdlciovCi0jZGVmaW5lIE00VE9PTF9MSU5LX0xJU1QgICAgMHhGMiAgLyoqPFRvb2wgbGlua2VkIGxpc3QqLwotI2RlZmluZSBNNFRPT0xfQkFTRTY0ICAgICAgIDB4RjMgIC8qKjxDb3JlIGJhc2U2NCBlbmNvZGVyL2RlY29kZXIqLwotCi0KLQotLyogRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgY29kZXMgKi8KLS8qKiB0aGVyZSBpcyBubyBlcnJvciovCi0jZGVmaW5lIE00Tk9fRVJST1IgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qKiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwqLwotI2RlZmluZSBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDEpCi0vKiogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdyovCi0jZGVmaW5lIE00RVJSX1NUQVRFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMikKLS8qKiBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUqLwotI2RlZmluZSBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDMpCi0vKiogUHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00RVJSX0NPTlRFWFRfRkFJTEVEICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNSkKLSNkZWZpbmUgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA2KQotLyoqIFRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDcpCi0vKiogVGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZSovCi0jZGVmaW5lIE00RVJSX1dSSVRFX09OTFkgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qKiBUaGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUqLwotI2RlZmluZSBNNEVSUl9SRUFEX09OTFkgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDkpCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCovCi0jZGVmaW5lIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwQSkKLQotI2RlZmluZSAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRfQ09NTU9OLCAweDAwMDAwQikKLQotI2RlZmluZSBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX05PX01PUkVfU1RSRUFNICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAzKQotI2RlZmluZSBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00V0FSX1RJTUVfT1VUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNSkKLS8qKiBUaGUgYnVmZmVyIGlzIGZ1bGwqLwotI2RlZmluZSBNNFdBUl9CVUZGRVJfRlVMTCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDYpCi0vKiBUaGUgc2VydmVyIGFza3MgZm9yIGEgcmVkaXJlY3Rpb24gKi8KLSNkZWZpbmUgTTRXQVJfUkVESVJFQ1QgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDcpCi0jZGVmaW5lIE00V0FSX1RPT19NVUNIX1NUUkVBTVMgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qIFNGIENvZGVjIGRldGVjdGVkIElORk9fRk9STUFUX0NIQU5HRSBkdXJpbmcgZGVjb2RlICovCi0jZGVmaW5lIE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRfQ09NTU9OLCAweDAwMDAwOSkKLQotI2VuZGlmIC8qTTRPU0FfRVJST1JfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTZlODEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRPU0FfRXhwb3J0LmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyBleHBvcnQgdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIHdoaWNoIG11c3QgYmUKLSAqICAgICAgICAgIHVzZWQgdG8gaW1wb3J0IG9yIGV4cG9ydCBhbnkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0VYUE9SVF9ICi0jZGVmaW5lIE00T1NBX0VYUE9SVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgT1NBTCBFWFBPUlRTICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0hBUl9TVEFSICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0xPQ0sgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfREFURV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgREFURSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9GSUxFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBGSUxFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFJFQUwgVElNRSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NPQ0tFVF9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgU09DS0VUICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgU1RSSU5HICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVVJJX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBVUkkgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIE1FTU9SWSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFRSQUNFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RPT0xfVElNRVJfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgT1NBTCBUT09MIFRJTUVSICAgICovCi0jZGVmaW5lIE00T1NBTF9TWVNURU1fQ01fRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgU1lTVEVNIENPTU1PTiBBUEkgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0xJTktFRF9MSVNUX0VYUE9SVF9UWVBFICAgICAgICAvKio8IFRPT0wgTElOS0VEIExJU1QgICAgKi8KLSNkZWZpbmUgTTRPU0FMX01FTU9SWV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgTUVNT1JZIE1BTkFHRVIgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UUkFDRV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgVE9PTCBUUkFDRSBNQU5BR0VSICovCi0jZGVmaW5lIE00VlBTX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZQUyBBUEkgICAgICAgICAgICAqLwotI2RlZmluZSBNNEFQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IEFVRElPIFBSRVNFTlRFUlMgICAgKi8KLSNkZWZpbmUgTTRWUF9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBWSURFTyBQUkVTRU5URVJTICAgICovCi0jZGVmaW5lIE00Q0JfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbCBiYWNrICAgICAgICAgICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLSNlbmRpZiAvKk00T1NBX0VYUE9SVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmFmYjhjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUKLSAqICAgICAgICAgICAgICAgd3JpdGVyIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNPTU1PTl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247Ci0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gbW9kZSBhY2Nlc3MuCi0gKiAgaWUsIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgb3IgdG8gd3JpdGUgIG9yCi0gKiAgYm90aCB0byByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIE1NIHByb2plY3Qgb25seS4gSXQgZW5hYmxlcyB0byByZWFkIGFuZCB3cml0ZSB0byBhIGZpbGUKLSAqICB3aXRoIG9uZSBkZXNjcmlwdG9yLgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tEZXNjTm9uZUFjY2VzcyAgICA9IDB4MDAsCi0gICBNNE9TQV9rRGVzY1JlYWRBY2Nlc3MgICAgPSAweDAxLCAgICAvKiogVGhlIERlc2NyaXB0b3IgcmVhZHMgb25seSBmcm9tIHRoZSBmaWxlICovCi0gICBNNE9TQV9rRGVzY1dyaXRlQWNjZXNzICAgID0gMHgwMiwgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHdyaXRlcyBvbmx5IGZyb20gdGhlIGZpbGUqLwotICAgTTRPU0Ffa0Rlc2NSV0FjY2VzcyAgICAgICAgPSAweDAzICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBhbmQgd3JpdGVzIGZyb20vaW4gdGhlIGZpbGUqLwotfSBNNE9TQV9EZXNjck1vZGVBY2Nlc3M7Ci0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIG1vZGUgYWNjZXNzLiBCb3RoIHRleHQgbW9kZSBhcyBiaW5hcnkgbW9kZQotICAgIGNhbm5vdCBiZSBzZXQgdG9nZXRoZXIuKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gcmVhZCBvbmx5IG1vZGUqLwotICAgTTRPU0Ffa0ZpbGVSZWFkICAgICAgICAgICAgID0gMHgwMSwKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHdyaXRlIG9ubHkgbW9kZSovCi0gICBNNE9TQV9rRmlsZVdyaXRlICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gYXBwZW5kIG1vZGUgKEFuIGV4aXN0aW5nIGZpbGUgbXVzdAotICAgICAgIGJlIGF2YWlsYWJsZSB0byBhcHBlbmQgZGF0YSkqLwotICAgTTRPU0Ffa0ZpbGVBcHBlbmQgICAgICAgICAgID0gMHgwNCwKLSAgIC8qKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkKi8KLSAgIE00T1NBX2tGaWxlQ3JlYXRlICAgICAgICAgICA9IDB4MDgsCi0gICAvKiogRGF0YSBhcmUgcHJvY2Vzc2VkIGFzIGJpbmFyeSBvbmUsIHRoZXJlIGlzIG5vIGRhdGEgbWFuYWdlbWVudCovCi0gICBNNE9TQV9rRmlsZUlzVGV4dE1vZGUgICAgICAgPSAweDEwCi19IE00T1NBX0ZpbGVNb2RlQWNjZXNzOwotCi0KLS8qKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSBhIGRhdGUuKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAvKiogVGltZSBzY2FsZSAodGljayBudW1iZXIgcGVyIHNlY29uZCkqLwotICAgTTRPU0FfVUludDMyIHRpbWVTY2FsZTsKLSAgIC8qKiBEYXRlIGV4cHJlc3NlZCBpbiB0aGUgdGltZSBzY2FsZSovCi0gICBNNE9TQV9UaW1lICAgdGltZTsKLSAgIC8qKiBZZWFyIG9mIHRoZSBhYnNvbHV0ZSB0aW1lICgxOTAwLCAxOTcwIG9yIDIwMDApKi8KLSAgIE00T1NBX1VJbnQzMiByZWZlcmVuY2VZZWFyOwotfSBNNE9TQV9EYXRlOwotCi0KLS8qKiBUaGlzIHN0cnVjdXJlIGRlZmluZXMgdGhlIGZpbGUgYXR0cmlidXRlcyovCi10eXBlZGVmIHN0cnVjdAotewotICAgLyoqIFRoZSBmaWxlIG1vZGUgYWNjZXNzKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzICAgIG1vZGVBY2Nlc3M7Ci0gICAvKiogVGhlIGNyZWF0aW9uIGRhdGUqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgY3JlYXRpb25EYXRlOwotICAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIG1vZGlmaWVkRGF0ZTsKLSAgIC8qKiBUaGUgbGFzdCBhY2Nlc3MgZGF0ZSAocmVhZCkqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbGFzdEFjY2Vzc0RhdGU7Ci19IE00T1NBX0ZpbGVBdHRyaWJ1dGU7Ci0KLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHNlZWsgYmVoYXZpb3IqLwotdHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZQotewotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nICAgICAgICAgICAgPSAweDAxLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrRW5kICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24qLwotICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCAgICAgICAgICAgICAgPSAweDAzCi19IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZTsKLQotCi0vKiBFcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0ZJTEVfTE9DS0VEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAzKQotI2RlZmluZSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDQpCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYTQ1Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIE00T1NBX2lzQWNjZXNzTW9kZUFjdGl2ZWQoY29tcG91bmRfbW9kZV9hY2Nlc3MsZWxlbWVudGFyeV9tb2RlX2FjY2VzcylcCi0gICAgICAgICgoKGNvbXBvdW5kX21vZGVfYWNjZXNzKSYoZWxlbWVudGFyeV9tb2RlX2FjY2VzcykpPyAxOjApCi0KLQotdHlwZWRlZiBlbnVtIE00T1NBX0xhc3RTZWVrCi17Ci0gICBTZWVrTm9uZSwKLSAgIFNlZWtSZWFkLAotICAgU2Vla1dyaXRlCi19IE00T1NBX0xhc3RTZWVrOwotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZmlsZSBjb250ZXh0Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF9yZWFkOwotICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3dyaXRlOwotICAgRklMRSogICAgICAgICAgICAgICAgZmlsZV9kZXNjOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBVUkwgKi8KLSAgIE00T1NBX0NoYXIqICAgICAgICAgIHVybF9uYW1lOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlICovCi0gICBNNE9TQV9DaGFyKiAgICAgICAgICBmaWxlX25hbWU7Ci0gICAvKiogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIGZpbGVfc2l6ZTsKLSAgIC8qKiBUaGUgZmlsZSBtb2RlIGFjY2VzcyB1c2VkIHRvIG9wZW4gdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2Vzc19tb2RlOwotICAgTTRPU0FfTGFzdFNlZWsgICAgICAgY3VycmVudF9zZWVrOwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgcmVhZF9wb3NpdGlvbjsKLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHdyaXRlX3Bvc2l0aW9uOwotICAgTTRPU0FfQm9vbCAgICAgICAgICAgYl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgIE00T1NBX0NvbnRleHQgICAgICAgIHNlbWFwaG9yZV9jb250ZXh0OwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAvKiBUaGVzZSB0d28gdmFyaWFibGVzIHdlcmUgYWRkZWQgdG8gbWFuYWdlIGNhc2Ugd2hlcmUgYSBmaWxlCi0gICAgKiBpcyBvcGVuZWQgaW4gcmVhZCBhbmQgd3JpdGUgbW9kZSB3aXRoIG9uZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfRGVzY3JNb2RlQWNjZXNzICAgIG1fRGVzY3JNb2RlQWNjZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlMb2NrTW9kZTsKLQotCi19IE00T1NBX0ZpbGVDb250ZXh0OwotCi0KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRVUkwoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHVybCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogZmlsZW5hbWUpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi1NNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSk7Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMjc1NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3B0aW9uIElEIHRvIGJlIHVzZWQgaW4gTTRPU0FfRmlsZVJlYWRHZXRPcHRpb24oKQotICAgIGFuZCBNNE9TQV9GaWxlUmVhZFNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bSBNNE9TQV9GaWxlUmVhZE9wdGlvbklECi17Ci0gICAvKiogR2V0IHRoZSBmaWxlIHNpemUgKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAxKSwKLQotICAgICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlUmVhZE9wZW4gKE00T1NBX0NoYXIqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRVUkwKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMyksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgcG9zaXRpb24gKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNCksCi0KLSAgIC8qKiBDaGVjayBlbmQgb2YgZmlsZTogVFJVRSBpZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIEZBTFNFIGVsc2UKLSAgICAgICAoTTRPU0FfQm9vbCopKi8KLSAgIE00T1NBX2tGaWxlUmVhZElzRU9GCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDUpLAotCi0gICAvKiogQ2hlY2sgbG9jayBvZiBmaWxlICovCi0gICBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDYpCi0KLX0gTTRPU0FfRmlsZVJlYWRPcHRpb25JRDsKLQotCi0KLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEKLSAgICBmaWxlIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlblJlYWQpICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqcmVhZERhdGEpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKmNsb3NlUmVhZCkgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0gICBNNE9TQV9FUlIgKCpzZXRPcHRpb24pICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7Ci19IE00T1NBX0ZpbGVSZWFkUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbiAgICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YSAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVJFQURFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI3YjA4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFUkVBREVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWExMTMzMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gd3JpdGUgaW4gYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfSAotI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlV3JpdGVHZXRPcHRpb24oKQotYW5kIE00T1NBX0ZpbGVXcml0ZVNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlV3JpdGVPcGVuIChNNE9TQV9DaGFyKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTAotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAxKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0Ci0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDMpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDQpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNSksCi0KLQotICAgIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDYpLAotCi0KLSAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZQotICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA3KQotfSBNNE9TQV9GaWxlV3JpdGVPcHRpb25JRDsKLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEgZmlsZQotICAgIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlbldyaXRlKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqd3JpdGVEYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKkZsdXNoKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKmNsb3NlV3JpdGUpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotfSBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4gICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiBXQVJOSU5HISB0aGUgZmVhdHVyZSBvZiBmaWxlKlNlZWsgd2hpY2ggcmV0dXJucwotdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIChmcm9tIHRoZSBiZWdpbm5pbmcpIGFmdGVyIHRoZSBzZWVrIGluIHRoZSAicG9zaXRpb24iCi1wb2ludGVyIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVucmVsaWFibHkgKG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsKSBpbXBsZW1lbnRlZAotaW4gc29tZSBPU0FMcywgc28gcmVseWluZyBvbiBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgdW5sZXNzIHlvdSByZWFsbHkgd2FudAotdG8gaGF2ZSBhIHBpenphIGV2ZW5pbmcuICovCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaCAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDk3MmY0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBwcml2YXRlIGZvciBBbmRyb2lkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZDE1Y2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NZW1vcnkuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgYW5kIGZyZWUgbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9NRU1PUllfSAotI2RlZmluZSBNNE9TQV9NRU1PUllfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiIC8qZm9yIE00T1NBX0NvcmVJRCBkZWZpbml0aW9uKi8KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiogTTRPU0FfTWVtQWRkcjMyOwotdHlwZWRlZiBNNE9TQV9JbnQ4KiAgTTRPU0FfTWVtQWRkcjg7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZyk7Ci0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCh2b2lkKTsKLQotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heF92YWx1ZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDk2YmRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NdXRleC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgbXV0ZXggQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfTVVURVhfSAotI2RlZmluZSBNNE9TQV9NVVRFWF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0KLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbiggICAgTTRPU0FfQ29udGV4dCogY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKCAgICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKCAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9NVVRFWF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxYjkwNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX09wdGlvbklELmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBPcHRpb24gSUQgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBvcHRpb24gSUQuCi0gKiAgICAgICAgICAgICAgIE9wdGlvbiBJRCBpcyB1c2VkIGJ5IE00WVlZX1pac2V0T3B0aW9uKCkgYW5kCi0gKiAgICAgICAgICAgICAgIE00WVlZX1paZ2V0T3B0aW9uKCkgZnVuY3Rpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9PUFRJT05JRF9ICi0jZGVmaW5lIE00T1NBX09QVElPTklEX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqIE00T1NBX09wdGlvbklEIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotLSBSaWdodCBhY2Nlc3MgKDIgYml0cyk6IFNvbWUgb3B0aW9ucyBtYXkgaGF2ZSByZWFkIG9ubHksIHdyaXRlIG9ubHkgb3IgcmVhZAotICBhbmQgd3JpdGUgYWNjZXNzCi0tIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAotLSBTdWJPcHRpb24gSUQgKDE2IGJpdHMpOiBUbyBzZWxlY3Qgd2hpY2ggb3B0aW9uIGluIGEgc3BlY2lmaWMgY29yZSBjb21wb25lbnQKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE9TQV9PcHRpb25JRDsKLXR5cGVkZWYgdm9pZCogICAgICAgIE00T1NBX0RhdGFPcHRpb247Ci0KLSNkZWZpbmUgTTRfUkVBRCAgICAgIDB4MDEKLSNkZWZpbmUgTTRfV1JJVEUgICAgIDB4MDIKLSNkZWZpbmUgTTRfUkVBRFdSSVRFIDB4MDMKLQotLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9PcHRpb25JRCAqLwotCi0vKiogVGhpcyBtYWNybyBjcmVhdGVzIGFuIG9wdGlvbklEIGdpdmVuIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX0ludDMyKSgoKCgoKE00T1NBX1VJbnQzMilyaWdodCkmMHgwMyk8PDMwKSkrKCgoKE00T1NBX1VJbnQzMiljb3JlSUQpJjB4MDAzRkZGKTw8MTYpKygoKE00T1NBX1VJbnQzMillcnJvcklEKSYweDAwRkZGRikpCi0KLS8qKiBUaGlzIG1hY3JvIHNwbGl0cyBhbiBvcHRpb25JRCBpbnRvIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfU1BMSVQob3B0aW9uSUQsIHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgeyByaWdodD0oTTRPU0FfVUludDgpKChvcHRpb25JRCk+PjMwKTtcCi0gICAgIGNvcmVJRD0oTTRPU0FfVUludDE2KSgoKG9wdGlvbklEKT4+MTYpJjB4MDAwMDNGRkYpO1wKLSAgICAgZXJyb3JJRD0oTTRPU0FfVUludDMyKSgob3B0aW9uSUQpJjB4MDAwMEZGRkYpOyB9Ci0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaXMgd3JpdGFibGUsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSAoKCgob3B0aW9uSUQpPj4zMCkmTTRfV1JJVEUpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHJlYWRhYmxlLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1JFQUQpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGhhcyBpdHMgY29yZSBJRCBlcXVhbCB0byAnY29yZUlEJywgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBjb3JlSUQpXAotICAgKCgoKChvcHRpb25JRCk+PjE2KSYweDAwM0ZGRikgPT0gKGNvcmVJRCkpID8gTTRPU0FfVFJVRTpNNE9TQV9GQUxTRSkKLQotCi0jZW5kaWYgICAvKk00T1NBX09QVElPTklEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjMwNDU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBzZW1hcGhvcmUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1NFTUFQSE9SRV9ICi0jZGVmaW5lIE00T1NBX1NFTUFQSE9SRV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlT3BlbiggIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgIGluaXRpYWxOdW1iZXIgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9TRU1BUEhPUkVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTZhZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICB0aHJlYWQgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVEhSRUFEX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotCi0KLS8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9USFJFQUQsMHgwMDAwMDEpCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkT3BlbmVkICAgPSAweDEwMCwKLSAgIE00T1NBX2tUaHJlYWRTdGFydGluZyA9IDB4MjAwLAotICAgTTRPU0Ffa1RocmVhZFJ1bm5pbmcgID0gMHgzMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RvcHBpbmcgPSAweDQwMCwKLSAgIE00T1NBX2tUaHJlYWRDbG9zZWQgID0gMHg1MDAKLX0gTTRPU0FfVGhyZWFkU3RhdGU7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHkgID0gIDB4MDAwLAotICAgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eSAgICAgPSAgMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgICA9ICAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eSAgICAgID0gIDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5ICAgPSAgMHg0MDAKLX0gTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0FfVGhyZWFkU3RhcnRlZAotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMSksCi0KLSAgIE00T1NBX1RocmVhZFN0b3BwZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDIpLAotCi0gICBNNE9TQV9UaHJlYWRQcmlvcml0eQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMyksCi0KLSAgIE00T1NBX1RocmVhZE5hbWUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDQpLAotCi0gICBNNE9TQV9UaHJlYWRTdGFja1NpemUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDUpLAotCi0gICBNNE9TQV9UaHJlYWRVc2VyRGF0YQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNikKLQotfSBNNE9TQV9UaHJlYWRPcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoKk00T1NBX1RocmVhZERvSXQpKE00T1NBX1ZvaWQqKTsKLXR5cGVkZWYgTTRPU0FfVm9pZCAoKk00T1NBX1RocmVhZENhbGxCYWNrKShNNE9TQV9Db250ZXh0LCBNNE9TQV9Wb2lkKik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oICAgICBNNE9TQV9Db250ZXh0KiAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgICAgICBmdW5jICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICAgIHBhcmFtICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcCggICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqICAgIHN0YXRlICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcCggICAgICAgIE00T1NBX1VJbnQzMiAgICAgICAgICB0aW1lICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgICB2YWx1ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiAgICAgdmFsdWUgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9USFJFQURfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI0YjA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWRfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGhyZWFkIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9QUklWX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX1BSSVZfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSB0aHJlYWQgKi8KLXR5cGVkZWYgc3RydWN0IE00T1NBX1RocmVhZENvbnRleHQgewotICAgTTRPU0FfVUludDMyIGNvcmVJRDsgICAgICAgICAgICAgICAgLyogdGhyZWFkIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfdCB0aHJlYWRJRDsgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZGVudGlmaWVyLiAqLwotICAgTTRPU0FfQ2hhciogbmFtZTsgICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIG5hbWUgKi8KLSAgIE00T1NBX1VJbnQzMiBzdGFja1NpemU7ICAgICAgICAgICAgIC8qIHRocmVhZCBzdGFja1NpemUgaW4gYnl0ZXMgKi8KLSAgIE00T1NBX1RocmVhZERvSXQgZnVuYzsgICAgICAgICAgICAgIC8qIHRocmVhZCBmdW5jdGlvbiAqLwotICAgTTRPU0FfVm9pZCogcGFyYW07ICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIHBhcmFtZXRlciAqLwotLyoKLSAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOyAgICAgICAgICAgICAgIC8gKiB0aHJlYWQgdXNlciBkYXRhICogLwotKi8KLSAgIE00T1NBX1RocmVhZFN0YXRlIHN0YXRlOyAgICAgICAgICAgIC8qIHRocmVhZCBhdXRvbWF0b24gc3RhdGUgKi8KLSAgIE00T1NBX0NvbnRleHQgc3RhdGVNdXRleDsgICAgICAgICAgIC8qIG11dGV4IGZvciB0aHJlYWQgc3RhdGUgbWFuYWdlbWVudCAqLwotLyoKLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0YXJ0Q2FsbEJhY2s7IC8gKiBzdGFydGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RvcENhbGxCYWNrOyAgLyAqIHN0b3BwaW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCi0qLwotICAgTTRPU0FfQ29udGV4dCBzZW1TdGFydFN0b3A7ICAgICAgICAgLyogc2VtYXBob3JlIGZvciBzdGFydCBhbmQgc3RvcCBkb19pdCAqLwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eTsgLyogdGhyZWFkIHByaW9yaXR5IGxldmVsICovCi19IE00T1NBX1RocmVhZENvbnRleHQgOwotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFmMjVlZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaW1lLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBUaW1lIG1hY3JvcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aW1lIHR5cGUgYW5kIGFzc29jaWF0ZWQgbWFjcm9zIHdoaWNoIG11c3QKLSAqICAgICAgICAgICAgICAgYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRpbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiAkSWQ6IE00T1NBX1RpbWUuaCx2IDEuMiAyMDA3LzAxLzA1IDEzOjEyOjIyIHRoZW5hdWx0IEV4cCAkICovCi0KLSNpZm5kZWYgTTRPU0FfVElNRV9ICi0jZGVmaW5lIE00T1NBX1RJTUVfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgTTRPU0FfVGltZTsKLQotCi0vKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KLQotI2RlZmluZSBNNE9TQV9USU1FX1VOS05PV04gMHg4MDAwMDAwMAotCi0vKiogVGhpcyBtYWNybyBjb252ZXJ0cyBhIHRpbWUgd2l0aCBhIHRpbWUgc2NhbGUgdG8gbWlsbGlzZWNvbmQuCi0gICAgVGhlIHJlc3VsdCBpcyBhIE00T1NBX0RvdWJsZSovCi0jZGVmaW5lIE00T1NBX1RJTUVfVE9fTVMocmVzdWx0LCB0aW1lLCB0aW1lc2NhbGUpXAotICAgICAgeyByZXN1bHQgPSAoMTAwMCooTTRPU0FfRG91YmxlKXRpbWUpLygoTTRPU0FfRG91YmxlKXRpbWVzY2FsZSk7IH0KLQotI2VuZGlmIC8qTTRPU0FfVElNRV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyYTY4ZDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UeXBlcy5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgQWJzdHJhY3Rpb24gdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIHJlZGVmaW5lcyBiYXNpYyB0eXBlcyB3aGljaCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgIHVzZWQgdG8gZGVjbGFyZSBhbnkgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9UWVBFU19ICi0jZGVmaW5lIE00T1NBX1RZUEVTX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9Cb29sOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfVUludDg7Ci10eXBlZGVmIHNpZ25lZCBjaGFyICAgICBNNE9TQV9JbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgTTRPU0FfVUludDE2OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgTTRPU0FfSW50MTY7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBNNE9TQV9VSW50MzI7Ci10eXBlZGVmIHNpZ25lZCBsb25nICAgICBNNE9TQV9JbnQzMjsKLQotdHlwZWRlZiBzaWduZWQgY2hhciAgICAgTTRPU0FfQ2hhcjsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1VDaGFyOwotCi10eXBlZGVmIGRvdWJsZSAgICAgICAgICBNNE9TQV9Eb3VibGU7Ci10eXBlZGVmIGZsb2F0ICAgICAgICAgICBNNE9TQV9GbG9hdDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgTTRPU0FfV0NoYXI7Ci0KLXR5cGVkZWYgdm9pZCAgICAgICAgICAgIE00T1NBX1ZvaWQ7Ci0KLS8qIE1pbiAmIG1heCBkZWZpbml0aW9ucyovCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDhfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDE2X01BWCAgICAgICAgICAgICA2NTUzNQotCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUlOVDMyX01BWCAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0lOVDhfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfSU5UOF9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX0lOVDE2X01JTiAgICAgICAgICAgICAtMzI3NjgKLSNkZWZpbmUgTTRPU0FfSU5UMTZfTUFYICAgICAgICAgICAgICAzMjc2NwotCi0jZGVmaW5lIE00T1NBX0lOVDMyX01JTiAgICAgICAoLTB4N0ZGRkZGRkYtMSkKLSNkZWZpbmUgTTRPU0FfSU5UMzJfTUFYICAgICAgICAgMHg3RkZGRkZGRgotCi0jZGVmaW5lIE00T1NBX0NIQVJfTUlOICAgICAgICAgICAgICAgIC0xMjgKLSNkZWZpbmUgTTRPU0FfQ0hBUl9NQVggICAgICAgICAgICAgICAgIDEyNwotCi0jZGVmaW5lIE00T1NBX1VDSEFSX01JTiAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRPU0FfVUNIQVJfTUFYICAgICAgICAgICAgICAgIDI1NQotCi0jZGVmaW5lIE00T1NBX05VTEwgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1RSVUUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE00T1NBX0ZBTFNFICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE00T1NBX1dBSVRfRk9SRVZFUiAgICAgICAweGZmZmZmZmZmCi0KLSNkZWZpbmUgTTRPU0FfQ09OU1QgICAgICAgICAgICAgICAgICAgY29uc3QKLSNkZWZpbmUgTTRPU0FfSU5MSU5FICAgICAgICAgICAgICAgICBpbmxpbmUKLQotLyogUm9sbG92ZXIgb2Zmc2V0IG9mIHRoZSBjbG9jayAqLwotLyogVGhpcyB2YWx1ZSBtdXN0IGJlIHRoZSBvbmUgb2YgTTRPU0FfY2xvY2tHZXRUaW1lICovCi0jZGVmaW5lIE00T1NBX0NMT0NLX1JPTExPVkVSICAgICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLQotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0OwotCi0vKiogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQqLwotdHlwZWRlZiAgTTRPU0FfVUludDE2IE00T1NBX0NvcmVJRDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qTTRPU0FfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZjM4YjBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9vc2FsCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBNNE9TQV9DaGFyU3Rhci5jIFwKLSAgICBNNE9TQV9DbG9jay5jIFwKLSAgICBNNE9TQV9GaWxlQ29tbW9uLmMgXAotICAgIE00T1NBX0ZpbGVSZWFkZXIuYyBcCi0gICAgTTRPU0FfRmlsZVdyaXRlci5jIFwKLSAgICBNNE9TQV9NdXRleC5jIFwKLSAgICBNNE9TQV9SYW5kb20uYyBcCi0gICAgTTRPU0FfU2VtYXBob3JlLmMgXAotICAgIE00T1NBX1RocmVhZC5jIFwKLSAgICBNNFBTV19EZWJ1Z1RyYWNlLmMgXAotICAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jIFwKLSAgICBNNFBTV19UcmFjZS5jIFwKLSAgICBMVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURfX0FORFJPSURfXyBcCi0gICAgLURNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9SRUFERVJTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF8zR1BQX1JFQURFUgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxMWUwMDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uYwotICogQGJyaWVmCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGZpbGVzeXN0ZW0gYWNjZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQWRkaXRpb24gb2YgVHJhY2UgSUQgKiovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotI2lmZGVmIE00VFJBQ0VfSUQKLSN1bmRlZiBNNFRSQUNFX0lECi0jZW5kaWYKLSNkZWZpbmUgTTRUUkFDRV9JRCAgICBNNE9TQV9GSUxFX1JFQURFUgotCi0KLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5oIgotCi0jZGVmaW5lIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAjaW5jbHVkZSAiTTRPU0FfRmlsZUFjY2Vzcy5oIgotI2VuZGlmCi0KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKSBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAocmV0dmFsKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaWxlIHJlYWRlciBjYWNoZSBidWZmZXJzIHBhcmFtZXRlcnMgKHNpemUsIG51bWJlciBvZiBidWZmZXJzLCBldGMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX1NJWkUgICAgMTAyNCoxNgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05CICAgICAgICAyCi0jZGVmaW5lIE00T1NBX1JFQURCVUZGRVJfTk9ORSAgICAtMQotI2RlZmluZSBNNE9TQV9FT0YgICAgICAgICAgICAgICAtMQotCi0jZGVmaW5lIE1BWF9GSUxMU19TSU5DRV9MQVNUX0FDQ0VTUyAgICBNNE9TQV9SRUFEQlVGRkVSX05CKjIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBGaWxlIHJlYWRlciBCdWZmZXJzIGNvbnRleHQgKHByaXZhdGUpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgIGRhdGE7ICAgICAgICAvKio8IGJ1ZmZlciBkYXRhICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBzaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVwb3M7ICAgIC8qKjwgcG9zaXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGJ1ZmZlciBzdGFydHMgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIHJlbWFpbjsgICAgICAgIC8qKjwgZGF0YSBhbW91bnQgbm90IGFscmVhZHkgY29waWVkIGZyb20gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBuYkZpbGxTaW5jZUxhc3RBY2VzczsgICAgLyoqPCBUbyBrbm93IHNpbmNlIGhvdyBtYW55IHRpbWUgd2UgZGlkbid0IHVzZSB0aGlzIGJ1ZmZlciAqLwotfSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlcl9vcHRpbTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgRmlsZSBSZWFkZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIElzT3BlbmVkOyAgICAgICAvKio8IE1pY3JvIHN0YXRlIG1hY2hpbmUgKi8KLSAgICBNNE9TQV9GaWxlQXR0cmlidXRlICAgICBGaWxlQXR0cmlidXRlOyAgLyoqPCBPcGVuaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICByZWFkRmlsZVBvczsgICAgLyoqPCBFZmZlY3RpdmUgcG9zaXRpb24gb2YgdGhlIEdGTCByZWFkIHBvaW50ZXIgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBhYnNvbHV0ZVBvczsgICAgLyoqPCBWaXJ0dWFsIHBvc2l0aW9uIGZvciBuZXh0IHJlYWRpbmcgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICBmaWxlU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSAqLwotCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW0gYnVmZmVyW000T1NBX1JFQURCVUZGRVJfTkJdOyAgLyoqPCBSZWFkIGJ1ZmZlcnMgKi8KLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIGFGaWxlRGVzYzsgIC8qKjwgRmlsZSBkZXNjcmlwdG9yICovCi0KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICBGUzsgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZWxzZQotICAgIE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyICpGUzsgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNlbmRpZgotCi19IE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbTsKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgIEdsb2JhbCBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbG93IGxldmVsIHJlYWQgYWNjZXNzICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1zdGF0aWMgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotCi1NNE9TQV9FUlIgTlhQU1dfRmlsZVJlYWRlck9wdGltX2luaXQoTTRPU0FfVm9pZCAqbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVycywgTTRPU0FfVm9pZCAqb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBsb3dMZXZlbF9mcCAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgbG93TGV2ZWxfZnVuY3Rpb25Qb2ludGVyczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIG9wdGltaXplZF9mcCA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBvcHRpbWl6ZWRfZnVuY3Rpb25Qb2ludGVyczsKLQotICAgIC8vU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIKLSAgICBvcHRpbWl6ZWRfZnAtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnJlYWREYXRhICA9IE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbTsKLSAgICBvcHRpbWl6ZWRfZnAtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltOwotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9jbGVhblVwKCkKLXsKLQotICAgIGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9nZXRMb3dMZXZlbEZ1bmN0aW9ucyhNNE9TQV9Wb2lkICoqRlMpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiogcEZ1bmN0aW9uc1BvaW50ZXIgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKiopIEZTOwotICAgICpwRnVuY3Rpb25zUG9pbnRlciA9IGd2X05YUFNXX1JFQURPUFRfbG93TGV2ZWxGdW5jdGlvbnM7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICAgICAgICBCdWZmZXIgaGFuZGxpbmcgZnVuY3Rpb25zIGZvciBSZWFkIGFjY2VzcyAgICAgICAgIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gMDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gKE00T1NBX01lbUFkZHI4KSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfUkVBREJVRkZFUl9TSVpFLCAKLSAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQiKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgZnJlZShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRmlsZVBvc2l0aW9uIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gc2l6ZSwgTTRPU0FfTWVtQWRkcjggcERhdGEpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcHlzaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBvZmZzZXQ7Ci0KLSAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID09IE00T1NBX0VPRikgcmV0dXJuIE00T1NBX0VPRjsKLQotICAgIGlmKCAgIChwb3MgPCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKQotICAgICAgIHx8IChwb3MgPiAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSAxKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcgY29waWVkICovCi0gICAgfQotCi0gICAgb2Zmc2V0ID0gcG9zIC0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvczsKLQotICAgIGNvcHlzaXplID0gYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSAtIG9mZnNldDsKLSAgICBjb3B5c2l6ZSA9IChzaXplIDwgY29weXNpemUpID8gc2l6ZSA6IGNvcHlzaXplOwotCi0gICAgbWVtY3B5KCh2b2lkICopcERhdGEsICh2b2lkICopKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgKyBvZmZzZXQpLCBjb3B5c2l6ZSk7Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gLT0gY29weXNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPSAwOwotCi0gICAgcmV0dXJuIGNvcHlzaXplOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBpLCBNNE9TQV9GaWxlUG9zaXRpb24gcG9zKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZ3JpZFBvczsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgdGVtcFBvczsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIGJ1ZmZlclNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBkaWZmOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgc2l6ZTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgIGZpbGVSZWFkU2l6ZSA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gMDsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiQnVmZmVyRmlsbCAgaSA9ICVkICBwb3MgPSAlbGQgIHJlYWQgPSAlbGQgIG9sZCA9ICVsZCIsIGksIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MsIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpOwotCi0gICAgLyogQXZvaWQgY3ljbGluZyBzdGF0ZW1lbnQgYmVjYXVzZSBvZiBFT0YgKi8KLSAgICBpZihwb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0KLSAgICAvKiBSZWxvY2F0ZSB0byBhYnNvbHV0ZSBwb3N0aW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGJ1ZmZlclNpemUgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgdGVtcFBvcyA9IChNNE9TQV9GaWxlUG9zaXRpb24pIChwb3MgLyBidWZmZXJTaXplKTsKLSAgICBncmlkUG9zID0gdGVtcFBvcyAqIE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBkaWZmID0gZ3JpZFBvcyAtIGFwQ29udGV4dC0+cmVhZEZpbGVQb3M7Ci0KLSAgICBpZihkaWZmICE9IDApCi0gICAgewotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgICAgICBmaWxlU2Vla1Bvc2l0aW9uID0gZGlmZjsKLSAgICAgICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5zZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTZWVrUG9zaXRpb24pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycm5vKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0jZWxzZQotICAgICAgICByZXRfdmFsID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9TZWVrKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBkaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gZ3JpZFBvczsKLQotICAgICAgICBpZihyZXRfdmFsICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotICAgIH0KLQotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgLyogUmVhZCBEYXRhICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZmlsZVJlYWRTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+cmVhZERhdGEoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsICZmaWxlUmVhZFNpemUpOwotCi0gICAgc2l6ZSA9IChNNE9TQV9GaWxlUG9zaXRpb24pZmlsZVJlYWRTaXplOwotICAgIGlmICgoTTROT19FUlJPUiAhPSBlcnJubykmJihNNFdBUl9OT19EQVRBX1lFVCAhPSBlcnJubykpCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gTTRPU0FfRU9GOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZWxzZQotICAgIHNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1JlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgIChNNE9TQV9VSW50OCAqKWFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEsIE00T1NBX1JFQURCVUZGRVJfU0laRSwgJmVycm5vKTsKLSAgICBpZihzaXplID09IC0xKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSBzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIC8qIFJldHJpZXZlIGN1cnJlbnQgcG9zaXRpb24gKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5yZWFkRmlsZVBvcyk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiggICAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA+PSAwKQotICAgICAgICYmIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIDwgTTRPU0FfUkVBREJVRkZFUl9TSVpFKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCByZXR1cm5zIE5PIERBVEEgWUVUIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9JbnQ4IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyTWF0Y2goTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9JbnQ4IGk7Ci0KLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIG1hdGNoZXMgd2l0aCBnaXZlbiBwb3MgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKCAgIChwb3MgPj0gYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICAgICAgJiYgKHBvcyA8IChhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zICsgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00T1NBX1JFQURCVUZGRVJfTk9ORTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlclNlbGVjdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBjdXJyZW50X2kpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpLGo7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1pbl9hbW91bnQsbWF4X2Ftb3VudDsKLSAgICBNNE9TQV9JbnQ4IG1pbl9pLG1heF9jb3VudDsKLQotICAgIC8qIHVwZGF0ZSBuYkZpbGxTaW5jZUxhc3RBY2VzcyBmaWVsZCAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgKys7Ci0gICAgfQotCi0gICAgLyogUGxhbiBBIDogU2NhbiBmb3IgZW1wdHkgYnVmZmVyICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZihhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtYXhfY291bnQgPSBNNE9TQV9SRUFEQlVGRkVSX05COwotICAgIG1heF9hbW91bnQgPSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1M7Ci0KLSAgICAvKiBQbGFuIEIgOiBTY2FuIGZvciBkZWFkIGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ubmJGaWxsU2luY2VMYXN0QWNlc3MgPj0gKE00T1NBX1VJbnQzMikgbWF4X2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4X2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzOwotICAgICAgICAgICAgbWF4X2NvdW50ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtYXhfY291bnQ8TTRPU0FfUkVBREJVRkZFUl9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJERUFEIEJVRkZFUjogJWQsICVkIixtYXhfY291bnQsYXBDb250ZXh0LT5idWZmZXJbbWF4X2NvdW50XS5uYkZpbGxTaW5jZUxhc3RBY2Vzcyk7Ci0gICAgICAgIHJldHVybiBtYXhfY291bnQ7Ci0gICAgfQotCi0gICAgbWluX2kgPSBjdXJyZW50X2k7Ci0gICAgbWluX2Ftb3VudCA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLQotICAgIC8qIFNlbGVjdCB0aGUgYnVmZmVyIHdoaWNoIGlzIHRoZSBtb3N0ICJlbXB0eSIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSAoaStjdXJyZW50X2kpJU00T1NBX1JFQURCVUZGRVJfTkI7Ci0KLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbal0ucmVtYWluIDwgbWluX2Ftb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgbWluX2Ftb3VudCA9IGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbjsKLSAgICAgICAgICAgIG1pbl9pID0gajsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtaW5faTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICByZXRfdmFsOwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgIGVycm5vOwotI2VuZGlmCi0KLSAgICAvKiBnbyB0byB0aGUgZW5kIG9mIGZpbGUqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uKGFwQ29udGV4dC0+YUZpbGVEZXNjLCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopICZhcENvbnRleHQtPmZpbGVTaXplKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICB7Ci0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgMCwgTTRPU0Ffa0ZpbGVTZWVrRW5kLCAmZXJybm8pOwotCi0gICAgaWYgKHJldF92YWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplIEVSUiA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZXRyaWV2ZSBzaXplIG9mIHRoZSBmaWxlICovCi0gICAgICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1RlbGwoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0gICAgICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSBhcENvbnRleHQtPmZpbGVTaXplOwotICAgIH0KLSNlbmRpZiAvKk00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRiovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgICAgICAgICAgICBPU0FMIGZpbGVzeXN0ZW0gQVBJICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIG9wZW5zIHRoZSBwcm92aWRlZCBmaWxlRGVzY3JpcHRvciBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoT1VUKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcEZpbGVEZXNjcmlwdG9yIDogICAgICAgKElOKSBGaWxlIERlc2NyaXB0b3Igb2YgdGhlIGlucHV0IGZpbGUuCi0qIEBwYXJhbSAgICAgICBGaWxlTW9kZUFjY2VzcyA6ICAgICAgICAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MuCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSIHBDb250ZXh0IG9yIGZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTICAgICAgdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QgKGl0IG11c3QgYmUgZWl0aGVyIGlzVGV4dE1vZGUgb3IgcmVhZCkKLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIFRoZSBmaWxlIGNhbiBub3QgYmUgb3BlbmVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MpCi0jZWxzZQotICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0oTTRPU0FfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZU1vZGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpCi0jZW5kaWYKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9FUlIgICBlcnIgICAgICAgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1ZvaWQqIGFGaWxlRGVzYyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQm9vbCAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9GQUxTRTsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBwID0gMHglcCBmZCA9ICVzIG1vZGUgPSAlbHUiLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgLyogICAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwRmlsZURlc2NyaXB0b3IpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qICAgICAgQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgRmlsZSByZWFkZXIgY29udGV4dC4gKi8KLSAgICBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltIik7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9BTExPQywgYXBDb250ZXh0KTsKLQotICAgIC8qIFNldCBmaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotCi0gICAgLypTZXQgdGhlIG9wdGltaXplZCBmdW5jdGlvbnMsIHRvIGJlIGNhbGxlZCBieSB0aGUgdXNlciovCi0KLSAgICBhcENvbnRleHQtPkZTID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRQb2ludGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZJTEVfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCIpOwotICAgIGlmIChNNE9TQV9OVUxMPT1hcENvbnRleHQtPkZTKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX0ZpbGVSZWFkZXJPcHRpbV9pbml0IC0gRVJST1IgOiBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkICA9IE00T1NBX2ZpbGVSZWFkT3BlbjsKLSAgICBhcENvbnRleHQtPkZTLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGE7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2VlayAgICAgID0gTTRPU0FfZmlsZVJlYWRTZWVrOwotICAgIGFwQ29udGV4dC0+RlMtPmNsb3NlUmVhZCA9IE00T1NBX2ZpbGVSZWFkQ2xvc2U7Ci0gICAgYXBDb250ZXh0LT5GUy0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb247Ci0gICAgYXBDb250ZXh0LT5GUy0+Z2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRHZXRPcHRpb247Ci0jZWxzZQotICAgIGFwQ29udGV4dC0+RlMgPSBGUzsKLSNlbmRpZgotCi0gICAgLyogVmVyaWZ5IGFjY2VzcyBtb2RlICovCi0gICAgaWYgKCAgICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgIT0gMCkKLSAgICAgICAgfHwgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgPT0gMCkpCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIE9wZW4gZmlsZSBpbiByZWFkIG1vZGUgKi8KLSAgICBpZigoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSkgIT0gMCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlsZSBpcyBvcGVuZWQgaW4gcmVhZCBvbmx5Ki8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+b3BlblJlYWQoJmFGaWxlRGVzYywgcEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICAgICAgICAgIGlmICgoYUZpbGVEZXNjID09IE00T1NBX05VTEwpfHwoTTROT19FUlJPUiAhPSBlcnJubykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBhRmlsZURlc2MgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX09wZW4ocEZpbGVEZXNjcmlwdG9yLCBGaWxlTW9kZUFjY2VzcywgJmVycm5vKTsKLQotICAgICAgICAgICAgaWYgKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICBlcnIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckluaXQoYXBDb250ZXh0KTsKLSAgICBidWZmZXJzX2FsbG9jYXRlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIC8qIEluaXRpYWxpemUgcGFyYW1ldGVycyAqLwotICAgIGFwQ29udGV4dC0+ZmlsZVNpemUgPSAwOwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAwOwotICAgIGFwQ29udGV4dC0+cmVhZEZpbGVQb3MgPSAwOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgRGVzY3JpcHRvciovCi0gICAgYXBDb250ZXh0LT5hRmlsZURlc2MgPSBhRmlsZURlc2M7Ci0KLSAgICAvKiBSZXRyaWV2ZSB0aGUgRmlsZSBtb2RlIEFjY2VzcyAqLwotICAgIGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzID0gKE00T1NBX0ZpbGVNb2RlQWNjZXNzKSBGaWxlTW9kZUFjY2VzczsKLQotICAgIC8qUmV0cmlldmUgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9IChNNE9TQV9Db250ZXh0KWFwQ29udGV4dDsKLQotICAgIC8qIENvbXB1dGUgZmlsZSBzaXplICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9DYWxjdWxhdGVTaXplKGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIGdvdG8gY2xlYW51cDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogZnJlZSBjb250ZXh0ICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgaWYoYnVmZmVyc19hbGxvY2F0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKCBhcENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xICgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltOiByZXR1cm5zIGVycm9yIDB4JTB4IiwgZXJyKQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKQotKiAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScgcG9pbnRlci4gSWYgJ3NpemUnIGJ5dGUgY2FuIG5vdCBiZSByZWFkIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyLAotKiAgICAgICAgICAgICAgICAgICAgICAnc2l6ZScgcGFyYW1ldGVyIGlzIHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHJlYWQgYnl0ZXMuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcERhdGEgOiAoT1VUKSBEYXRhIHBvaW50ZXIgb2YgdGhlIHJlYWQgZGF0YS4KLSogQHBhcmFtICAgICAgIHBTaXplIDogKElOT1VUKSBTaXplIG9mIHRoZSBkYXRhIHRvIHJlYWQgKGluIGJ5dGUpLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwU2l6ZSwgZmlsZURlc2NyaXB0b3Igb3IgcERhdGEgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWREYXRhX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsTTRPU0FfTWVtQWRkcjggcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBTaXplKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBhU2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gY29waWVkU2l6ZTsKLSAgICBNNE9TQV9JbnQ4IHNlbGVjdGVkX2J1ZmZlciwgY3VycmVudF9idWZmZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWREYXRhX29wdGltIHAgPSAweCVwICBkID0gMHglcCAgcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHBEYXRhLCAqcFNpemUpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcERhdGEpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFNpemUpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICAvKiBQcmV2ZW50IHJlYWRpbmcgYmV5b25kIEVPRiAqLwotICAgIGlmKCgqcFNpemUgPiAwKSAmJiAoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA+PSBhcENvbnRleHQtPmZpbGVTaXplKSkKLSAgICB7Ci0gICAgICAgIGNvcGllZFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgZGF0YSBjYW4gYmUgcmVhZCBmcm9tIGEgYnVmZmVyICovCi0gICAgLyogSWYgbm90LCBmaWxsIG9uZSBhY2NvcmRpbmcgdG8gcXVhbnRpemVkIHBvc2l0aW9ucyAqLwotICAgIGNvcGllZFNpemUgPSAwOwotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgIHsKLSAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LCAwKTsKLSAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zKTsKLSAgICB9Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCpwU2l6ZSA8PSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcGllZFNpemUgPSAoTTRPU0FfVUludDMyKWFwQ29udGV4dC0+YnVmZmVyW3NlbGVjdGVkX2J1ZmZlcl0uc2l6ZTsKLSAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGNvbnRlbnQgaW50byBwRGF0YSovCi0gICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MsIGNvcGllZFNpemUsIHBEYXRhKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygicmVhZCAgc2l6ZSA9ICVsdSAgYnVmZmVyID0gJWQgIHBvcyA9ICVsZCIsICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciwgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0KLSAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHBEYXRhICovCi0gICAgd2hpbGUoKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkgJiYgKGVyciA9PSBNNE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwU2l6ZS1jb3BpZWRTaXplLCBwRGF0YStjb3BpZWRTaXplKTsKLSAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICBpZihhU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpY29waWVkU2l6ZSA8ICpwU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlciA9IHNlbGVjdGVkX2J1ZmZlcjsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZihzZWxlY3RlZF9idWZmZXIgPT0gTTRPU0FfUkVBREJVRkZFUl9OT05FKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsKGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyID09IE00V0FSX05PX0RBVEFfWUVUKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qSWYgd2UgZ290IGFsbCB0aGUgZGF0YSB0aGF0IHdlIHdhbnRlZCwgd2Ugc2hvdWxkIHJldHVybiBubyBlcnJvciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFNpemUtY29waWVkU2l6ZSkgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGRpZCBub3QgZ2V0IGVub3VnaCBkYXRhLCB3ZSB3aWxsIHJldHVybiBOT19EQVRBX1lFVCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvcHkgdGhlIGRhdGEgcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVNpemUgPSBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoYXBDb250ZXh0LCBzZWxlY3RlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkU2l6ZSArPSBhU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qd2UgcmVhY2hlZCBlbmQgb2YgZmlsZSwgc28gc3RvcCB0cnlpbmcgdG8gcmVhZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi1jbGVhbnVwIDoKLQotICAgIC8qIFVwZGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyICovCi0gICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyBjb3BpZWRTaXplOwotCi0gICAgaWYoKGVyciAhPSBNNE5PX0VSUk9SKSYmKGVyciE9TTRXQVJfTk9fREFUQV9ZRVQpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBzaXplID0gJWxkICBjb3BpZWQgPSAlbGQgIGVyciA9IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUsIGNvcGllZFNpemUsIGVycik7Ci0gICAgfQotCi0gICAgLyogRWZmZWN0aXZlIGNvcGllZCBzaXplIG11c3QgYmUgcmV0dXJuZWQgKi8KLSAgICAqcFNpemUgPSBjb3BpZWRTaXplOwotCi0KLSAgICAvKiBSZWFkIGlzIGRvbmUgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2Qgc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4KLSogICAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciA6Ci0qICAgICAgICAgICAgICBGcm9tIHRoZSBiZWdpbm5pbmcgKHBvc2l0aW9uIE1VU1QgYmUgcG9zaXRpdmUpIDogZW5kIHBvc2l0aW9uID0gcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGVuZCAocG9zaXRpb24gTVVTVCBiZSBuZWdhdGl2ZSkgOiBlbmQgcG9zaXRpb24gPSBmaWxlIHNpemUgKyBwb3NpdGlvbgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiAoc2lnbmVkIG9mZnNldCkgOiBlbmQgcG9zaXRpb24gPSBjdXJyZW50IHBvc2l0aW9uICsgcG9zaXRpb24uCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgU2Vla01vZGUgOiAgICAgIChJTikgU2VlayBhY2Nlc3MgbW9kZS4KLSogQHBhcmFtICAgICAgIHBQb3NpdGlvbiA6ICAgICAoSU4pIFBvc2l0aW9uIGluIHRoZSBmaWxlLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBTZWVrbW9kZSBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSogQHJldHVybiAgICAgIE00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgU2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1RSQUNFM18zKCJNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW0gcCA9IDB4JXAgbW9kZSA9ICVkIHBvcyA9ICVkIiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vla01vZGUsICpwUG9zaXRpb24pOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcFBvc2l0aW9uKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIFNlZWtNb2RlKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgIHN3aXRjaChTZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nIDoKLSAgICAgICAgICAgIGlmKCpwUG9zaXRpb24gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0VuZCA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZSArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA6Ci0gICAgICAgICAgICBpZigoKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgKyAqcFBvc2l0aW9uKSA+IGFwQ29udGV4dC0+ZmlsZVNpemUpIHx8Ci0gICAgICAgICAgICAgICAgKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPCAwKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsgLyoqPCBCYWQgU2Vla0FjZXNzIG1vZGUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0qICAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkgYW5kIGFsc28gZnJlZXMgdGhlIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBGaWxlIHJlYWRlciBjb250ZXh0LgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiBlcnJubyA9IE00Tk9fRVJST1I7Ci0jZWxzZQotICAgIE00T1NBX1VJbnQxNiBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gcCA9IDB4JXAiLCBwQ29udGV4dCApOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0JBRF9DT05URVhULCBhcENvbnRleHQpOwotCi0gICAgaWYgKGFwQ29udGV4dC0+SXNPcGVuZWQgIT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsgICAgICAgLyoqPCBUaGUgY29udGV4dCBjYW4gbm90IGJlIGNvcnJlY3QgKi8KLSAgICB9Ci0KLSAgICAvKiBidWZmZXIgKi8KLSAgICBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIENsb3NlIHRoZSBmaWxlICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQoYXBDb250ZXh0LT5hRmlsZURlc2MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IGVycm5vOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2Vsc2UKLSAgICBhUmV0X1ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfQ2xvc2UoYXBDb250ZXh0LT5hRmlsZURlc2MsICZlcnJubyk7Ci0KLSAgICBpZiAoYVJldF9WYWwgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8+Pj4+IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotICAgIGlmIChhcENvbnRleHQtPkZTICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKCBhcENvbnRleHQtPkZTKTsKLSAgICB9Ci0gICAgLy88PDw8IEdMTTIwMDkwMjEyIDogc2V0IHRoZSBsb3cgbGV2ZWwgZnVuY3Rpb24gc3RhdGljYWxseQotCi0gICAgLyogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgaXMgYSBkdW1teSBmdW5jdGlvbiByZXF1aXJlZCB0byBtYWludGFpbiBmdW5jdGlvbiBwb2ludGVyCi0qICAgICAgICAgICAgICBzdHJ1Y3R1cmUuCi0qIEBub3RlICAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25JZCA6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSogQHBhcmFtICAgICAgIE9wdGlvblZhbHVlIDogICAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBPcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZAotKiAgICAgICAgICAgICAgd2l0aCB0aGUgb3B0aW9uSUQuVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nCi0qICAgICAgICAgICAgICB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSogQG5vdGUgICAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBwT3B0aW9uVmFsdWUgOiAgKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbi4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwQ29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfT1BUSU9OX0lEIHRoZSBvcHRpb24gaWQgaXMgbm90IHZhbGlkLgotKiBAcmV0dXJuICAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEIFRoZSBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR2V0IHRoZSBkZXNpcmVkIG9wdGlvbiBpZiBpdCBpcyBhdmFsYWlibGUgKi8KLSAgICBzd2l0Y2goT3B0aW9uSUQpCi0gICAgewotICAgICAgICAvKiBHZXQgRmlsZSBTaXplICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6LyoqPCBHZXQgc2l6ZSBvZiB0aGUgZmlsZSwgbGltaXRlZCB0byAzMiBiaXQgc2l6ZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9VSW50MzIgKilwT3B0aW9uVmFsdWUpID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIENoZWNrIEVuZCBvZiBmaWxlIE9jY3VycyAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GIDogICAgIC8qKjwgU2VlIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0KLSAgICAgICAgICAgICgqKE00T1NBX0Jvb2wgKilwT3B0aW9uVmFsdWUpID0gKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgRmlsZSBQb3NpdGlvbiAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVQb3NpdGlvbiA6ICAgLyoqPCBHZXQgZmlsZSBwb3NpdGlvbiAqLwotCi0gICAgICAgICAgICAqKE00T1NBX0ZpbGVQb3NpdGlvbiAqKXBPcHRpb25WYWx1ZSA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBHZXQgQXR0cmlidXRlICovCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZSA6ICAvKio8IEdldCB0aGUgZmlsZSBhdHRyaWJ1dGUgPSBhY2Nlc3MgbW9kZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9GaWxlQXR0cmlidXRlICopcE9wdGlvblZhbHVlKS5tb2RlQWNjZXNzID0gYXBDb250ZXh0LT5GaWxlQXR0cmlidXRlLm1vZGVBY2Nlc3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyoqPCBCYWQgb3B0aW9uIElEICovCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLypSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDgxNGNiZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DaGFyU3Rhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00RFBBS19DaGFyU3Rhci5jCi0gKiBAaW5ncm91cAotICAqIEBicmllZiAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBDaGFyIFN0YXIgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qIFdBUk5JTkc6IFNwZWNpZmljIEFuZHJvaWQgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG1pbWljcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGliYydzIHN0cm5jcHkoKS4KLSAqIEBub3RlICAgICAgIEl0IGNvcGllcyBleGFjdGx5IGxlbjJDb3B5IGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gcFN0ck91dCwKLSAqICAgICAgICAgICAgIHRydW5jYXRpbmcgIHBTdHJJbiBvciBhZGRpbmcgbnVsbCBjaGFyYWN0ZXJzIHRvIHBTdHJPdXQgaWYKLSAqICAgICAgICAgICAgIG5lY2Vzc2FyeS4KLSAqICAgICAgICAgICAgIC0gSWYgbGVuMkNvcHkgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgcFN0ckluLAotICogICAgICAgICAgICAgICBhIG51bGwgY2hhcmFjdGVyIGlzIGFwcGVuZGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGNvcGllZAotICogICAgICAgICAgICAgICBzdHJpbmcuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwgcFN0ck91dCBpcwotICogICAgICAgICAgICAgICBwYWRkZWQgd2l0aCBudWxsIGNoYXJhY3RlcnMgdXAgdG8gbGVuZ3RoIGxlbjJDb3B5LgotICogICAgICAgICAgICAgLSBwU3RyT3V0IGFuZCBwU3RySW4gTVVTVCBOT1QgT1ZFUkxBUCAodGhpcyBpcyBOT1QgQ0hFQ0tFRCkuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBEZXN0aW5hdGlvbiBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIFNvdXJjZSBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgbGVuMkNvcHk6IChJTikgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHBTdHJJbiB0byBjb3B5LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwU3RyT3V0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJOQ29weShNNE9TQV9DaGFyKiBwU3RyT3V0LCBNNE9TQV9DaGFyICAgKnBTdHJJbiwgTTRPU0FfVUludDMyIGxlbjJDb3B5KQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJOQ29weVx0KE00T1NBX0NoYXIqICV4LE00T1NBX0NoYXIqICV4LE00T1NBX1VJbnQzMiAlbGQpIiwKLSAgICAgICAgcFN0ck91dCxwU3RySW4sbGVuMkNvcHkpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyT3V0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nock5Db3B5Olx0cFN0ck91dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJJbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzdHJuY3B5KChjaGFyICopcFN0ck91dCwgKGNvbnN0IGNoYXIgKilwU3RySW4sIChzaXplX3QpbGVuMkNvcHkpOwotICAgIGlmKGxlbjJDb3B5IDw9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluKSkKLSAgICB7Ci0gICAgICAgIHBTdHJPdXRbbGVuMkNvcHldID0gJ1wwJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBib29sZWFuIGNvbXBhcmlzb24gb2YgcFN0ckluMSBhbmQgcFN0ckluMi4KLSAqIEBub3RlICAgICAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpbiByZXN1bHQgaXMgTTRPU0FfVFJVRSBpZiB0aGUgc3RyaW5nCi0gKiAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHBTdHJJbjEgaXMgc3RyaWN0bHkgaWRlbnRpY2FsIHRvIHRoZSBzdHJpbmcgcG9pbnRlZAotICogICAgICAgICAgICAgdG8gYnkgcFN0ckluMiwgYW5kIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjE6IChJTikgRmlyc3QgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjI6IChJTikgU2Vjb25kIGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBjbXBSZXN1bHQ6IChPVVQpIENvbXBhcmlzb24gcmVzdWx0LgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbjEgcFN0ckluMiBvciBjbXBSZXN1bHQgaXMgTTRPU0FfTlVMTC4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbChNNE9TQV9DaGFyKiBwU3RySW4xLCBNNE9TQV9DaGFyKiBwU3RySW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCogcFJlc3VsdCkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTMyLGxlbjMyOwotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJBcmVJZGVudGljYWxcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCwiCi0gICAgICAgICJNNE9TQV9JbnQzMiogJXgpIixwU3RySW4xLHBTdHJJbjIscFJlc3VsdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4xIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4yLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBTdHJJbjIgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBSZXN1bHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFJlc3VsdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBsZW4zMiA9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMSk7Ci0gICAgaWYobGVuMzIgIT0gKE00T1NBX1VJbnQzMilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RySW4yKSkKLSAgICB7Ci0gICAgICAgICpwUmVzdWx0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGZvcihpMzI9MDtpMzI8bGVuMzI7aTMyKyspCi0gICAgewotICAgICAgICBpZihwU3RySW4xW2kzMl0gIT0gcFN0ckluMltpMzJdKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcFJlc3VsdCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQzMiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MzIgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDMyX01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQzMl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIoTTRPU0FfQ2hhciogICAgcFN0ckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgIHBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqKiAgICBwU3RyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9jaHJOdW1CYXNlIGJhc2UpCi17Ci0gICAgTTRPU0FfVUludDMyIHVsOwotICAgIGNoYXIqICAgICAgICBwVGVtcDsKLQotICAgIE00T1NBX1RSQUNFMV80KCJNNE9TQV9jaHJHZXRVSW50MzJcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyKiAleCIKLSAgICAgICAgIk00T1NBX0NoYXIqKiAleCxNNE9TQV9jaHJOdW1CYXNlICVkKSIscFN0ckluLHBWYWwscFN0ck91dCxiYXNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RySW4sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQzMjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGVycm5vID0gMDsKLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwgMTApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJIZXhhOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxNik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2Nock9jdDoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsOCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogaGFzIGNvbnZlcnNpb24gZmFpbGVkID8gKi8KLSAgICBpZigoTTRPU0FfQ2hhciopcFRlbXAgPT0gcFN0ckluKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOwotICAgIH0KLQotICAgIC8qIHdhcyB0aGUgbnVtYmVyIG5lZ2F0aXZlID8gKi8KLSAgICBpZigqKHBTdHJJbitzdHJzcG4oKGNvbnN0IGNoYXIgKilwU3RySW4sIiBcdCIpKSA9PSAnLScpCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTkVHQVRJVkU7Ci0gICAgfQotCi0gICAgLyogaGFzIGFuIG92ZXJmbG93IG9jY3VyZWQgPyAqLwotICAgIGlmKGVycm5vID09IEVSQU5HRSkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDMyX01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MzIpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgTTRPU0FfVUludDE2IGZyb20gc3RyaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgZmlyc3Qgc2V0IG9mIG5vbi13aGl0ZXNwYWNlCi0gKiAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIHBTdHJJbiB0byBhIE00T1NBX1VJbnQxNiB2YWx1ZSBwVmFsLCBhc3N1bWluZyBhCi0gKiAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBpbiBiYXNlIHByb3ZpZGVkIGJ5IHRoZSBwYXJhbWV0ZXIgYmFzZS4gcFN0ck91dCBpcwotICogICAgICAgICAgICAgc2V0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhc3QKLSAqICAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgbnVtYmVyIHRoYXQgaGFzIGJlZW4gY29udmVydGVkLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24sIHBTdHJPdXQgaXMgbm90Ci0gKiAgICAgICAgICAgICAgIHVwZGF0ZWQsIGFuZCBwVmFsIGlzIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG5lZ2F0aXZlIG51bWJlciwgcFN0ck91dCBpcyBub3QgdXBkYXRlZCwgYW5kIHBWYWwgaXMKLSAqICAgICAgICAgICAgICAgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbnVtZXJpY2FsIG92ZXJmbG93LCBwVmFsIGlzIHNldCB0byBNNE9TQV9VSU5UMTZfTUFYLgotICogICAgICAgICAgICAgLSBpZiBwU3RyT3V0IGlzIG5vdCB0byBiZSB1c2VkLCBpdCBjYW4gYmUgc2V0IHRvIE00T1NBX05VTEwuCi0gKiBAcGFyYW0gICAgICBwU3RySW46IChJTikgQ2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBWYWw6IChPVVQpIHJlYWQgdmFsdWUuCi0gKiBAcGFyYW0gICAgICBwU3RyT3V0OiAoT1VUKSBPdXRwdXQgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGJhc2U6IChJTikgQmFzZSBvZiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFZhbCBpcyBNNE9TQV9OVUxMLgotICogQHJldHVybiAgICAgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEOiBjb252ZXJzaW9uIGZhaWx1cmUuCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTlVNX1JBTkdFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbnVtYmVyCi0gKiAgICAgICAgICAgICBncmVhdGVyIHRoYW4gTTRPU0FfVUlOVDE2X01BWC4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9ORUdBVElWRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG5lZ2F0aXZlCi0gKiAgICAgICAgICAgICBudW1iZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2NockdldFVJbnQxNiAoTTRPU0FfQ2hhciogcFN0ckluLCBNNE9TQV9VSW50MTYgKnBWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogcFN0ck91dCwgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDE2XHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQxNiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockdldFVJbnQxNjpcdHBTdHJJbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFZhbCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwVmFsIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHN3aXRjaChiYXNlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tjaHJEZWM6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZih1bD5NNE9TQV9VSU5UMTZfTUFYKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSBNNE9TQV9VSU5UMTZfTUFYOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9DSFJfTlVNX1JBTkdFOwotICAgIH0KLQotICAgIC8qIG5vbWluYWwgY2FzZSAqLwotICAgICpwVmFsID0gKE00T1NBX1VJbnQxNil1bDsKLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJPdXQpCi0gICAgewotICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE9TQV9jaHJTUHJpbnRmKE00T1NBX0NoYXIgICpwU3RyT3V0LCBNNE9TQV9VSW50MzIgc3RyT3V0TWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0ICAgICAgIG1hcmtlcjsKLSAgICBNNE9TQV9DaGFyICAgKnBUZW1wOwotICAgIE00T1NBX0NoYXIgICAqcGVyY2VudFBvaW50ZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpuZXdGb3JtYXQ7Ci0gICAgTTRPU0FfSW50MzIgIG5ld0Zvcm1hdExlbmd0aD0wOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfbGwgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfdG0gPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnRfYWEgPSAwOwotICAgIE00T1NBX1VJbnQzMiAgY291bnQ7Ci0gICAgTTRPU0FfVUludDMyICBuYkNoYXI7Ci0gICAgTTRPU0FfSW50MzIgICAgIGVycjsKLSAgICBNNE9TQV9DaGFyIGZsYWdDaGFyW10gICAgICAgICAgICAgPSAiJy0rICMwIjsKLSAgICBNNE9TQV9DaGFyIHdpZHRoT3JQcmVjaXNpb25DaGFyW10gPSAiKjAxMjM0NTY3ODkiOwotICAgIE00T1NBX0NoYXIgb3RoZXJQcmVmaXhDaGFyW10gICAgICA9ICJobEwiOwotICAgIE00T1NBX0NoYXIgY29udmVyc2lvbkNoYXJbXSAgICAgICA9ICJkaW91eFhuZmVFZ0djQ3NTcCUiOwotCi0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2NoclNQcmludGZcdChNNE9TQV9DaGFyKiAleCwgTTRPU0FfVUludDMyICVsZCIKLSAgICAgICAgIk00T1NBX0NoYXIqICV4KSIscFN0ck91dCxzdHJPdXRNYXhMZW4sZm9ybWF0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU3RyT3V0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGZvcm1hdCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJTUHJpbnRmOlx0Zm9ybWF0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHZhX3N0YXJ0KG1hcmtlcixmb3JtYXQpOwotCi0gICAgLyogY291bnQgdGhlIG51bWJlciBvZiAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1sbFtjb252ZXJzaW9uXSAqLwotICAgIHBUZW1wID0gZm9ybWF0OwotICAgIHdoaWxlKCpwVGVtcCkKLSAgICB7Ci0gICAgICAgIHBlcmNlbnRQb2ludGVyID0gKE00T1NBX0NoYXIgKilzdHJjaHIoKGNvbnN0IGNoYXIgKilwVGVtcCwnJScpOyAvKiBnZXQgdGhlIG5leHQgcGVyY2VudCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgaWYoIXBlcmNlbnRQb2ludGVyKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wID0gcGVyY2VudFBvaW50ZXIrMTsgICAgICAgICAgIC8qIHNwYW4gaXQgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsgICAgLyogc3BhbiB0aGUgb3B0aW9uYWwgZmxhZ3MgKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgd2lkdGggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZigqcFRlbXA9PScuJykKLSAgICAgICAgewotICAgICAgICAgICAgcFRlbXArKzsKLSAgICAgICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsgLyogc3BhbiB0aGUgb3B0aW9uYWwgcHJlY2lzaW9uICovCi0gICAgICAgIH0KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBpZihzdHJsZW4oKGNvbnN0IGNoYXIgKilwVGVtcCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImxsIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9sbCsrOyAgICAgICAgICAgICAgICAgLyogSSBnb3QgT05FICovCi0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOyAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsInRtIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF90bSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilwVGVtcCwiYWEiLDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50X2FhKys7Ci0gICAgICAgICAgICAgICAgcFRlbXAgKz0yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7IC8qIHNwYW4gdGhlIG90aGVyIG9wdGlvbmFsIHByZWZpeCAqLwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZighKnBUZW1wKQotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICB9Ci0KLSAgICBjb3VudCA9IGNvdW50X2xsICsgY291bnRfdG0gKyBjb3VudF9hYTsKLQotICAgIGlmKCFjb3VudCkKLSAgICB7Ci0gICAgICAgIGVycj0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbWFya2VyKTsKLSAgICAgICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoID0gc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KSArIDE7Ci0KLSAgICBuZXdGb3JtYXRMZW5ndGggLT0gKGNvdW50X2xsK2NvdW50X3RtK2NvdW50X2FhKTsKLQotICAgIG5ld0Zvcm1hdCA9KE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdGb3JtYXRMZW5ndGgsCi0gICAgICAgIE00T1NBX0NIQVJTVEFSLChNNE9TQV9DaGFyKikiTTRPU0FfY2hyUHJpbnRmOiBuZXdGb3JtYXQiKTsKLSAgICBpZihNNE9TQV9OVUxMID09IG5ld0Zvcm1hdCkKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIG5ld0Zvcm1hdFtuZXdGb3JtYXRMZW5ndGgtMV0gPSAnXDAnOwotICAgIHBUZW1wID0gbmV3Rm9ybWF0OwotCi0gICAgLyogY29weSBmb3JtYXQgdG8gbmV3Rm9ybWF0LCByZXBsYWNpbmcgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0KLSAgICAgKiBieSAlW2ZsYWdzXVt3aWR0aF1bLnByZWNpc2lvbl1JNjRbY29udmVyc2lvbl0gKi8KLSAgICB3aGlsZSgqZm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJDaGFyID0gc3RyY3NwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgIiUiKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgY2hhcmFjdGVycyBiZWZvcmUgdGhlICUgY2hhcmFjdGVyICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgKnBUZW1wKysgPSAqZm9ybWF0Kys7ICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopZmxhZ0NoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgZmxhZyBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBpZigqZm9ybWF0PT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgLyogY29weSB0aGUgZG90IGNoYXJhY3RlciAqLwotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopd2lkdGhPclByZWNpc2lvbkNoYXIpOwotICAgICAgICAgICAgaWYobmJDaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7ICAgICAgLyogY29weSB0aGUgd2lkdGggY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopZm9ybWF0KT49MikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJsbCIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOyAvKiAlbCAqLwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJsbCIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAidG0iLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAidG0iIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgImFhIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgImFhIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopb3RoZXJQcmVmaXhDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIG90aGVyIFByZWZpeCAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKiljb252ZXJzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsKLSAgICAgICAgICAgIGZvcm1hdCArPSBuYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9IG5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogWmVybyB0ZXJtaW5hdGUgdGhlIGZvcm1hdCBzdHJpbmcuICovCi0gICAgKCpwVGVtcCkgPSAnXDAnOwotCi0gICAgZXJyID0gdnNucHJpbnRmKChjaGFyICopcFN0ck91dCwgKHNpemVfdClzdHJPdXRNYXhMZW4gKyAxLCAoY29uc3QgY2hhciAqKW5ld0Zvcm1hdCwgbWFya2VyKTsKLSAgICB2YV9lbmQobWFya2VyKTsKLSAgICBmcmVlKG5ld0Zvcm1hdCk7Ci0gICAgaWYgKChlcnI8MCkgfHwgKChNNE9TQV9VSW50MzIpZXJyPnN0ck91dE1heExlbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W3N0ck91dE1heExlbl0gPSAnXDAnOwotICAgICAgICByZXR1cm4gTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTgxN2IyMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9DbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9DbG9jay5jCi0gKiBAYnJpZWYgICAgICAgIENsb2NrIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNsb2NrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Nsb2NrLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYW4gYWJzb2x1dGUgdGltZSB0byBhbiB1bmtub3duIHJlZmVyZW5jZSB3aXRoCi0gKiAgICAgICAgICAgICBhIGhpZ2ggcHJlY2lzaW9uLgotICogQG5vdGUgICAgICAgSXQgbWVhbnMgaXQgY2FuIG9ubHkgYmUgdXNlZCB0byBnZXQgYSByZWxhdGl2ZSB0aW1lIGJ5IGNvbXB1dGluZwotICogICAgICAgICAgICAgZGlmZmVyZW5jZXMgYmV0d2VlbiB0byB0aW1lcy4KLSAqICAgICAgICAgICAgIEl0IGlzIHRvIHRoZSBjYWxsZXIgdG8gYWxsb2NhdGUgdGltZS4gVGltZSBpcyBleHByZXNzZWQgaW4KLSAqICAgICAgICAgICAgIHRpbWVzY2FsZSB1bml0LgotICogICAgICAgICAgICAgTTRPU0FfUk9MTE9WRVJfQ0xPQ0sgaW4gTTRPU0FfVHlwZXMuaCBtdXN0IGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgcm9sbG92ZXIKLSAqICAgICAgICAgICAgIG9mZnNldCBvZiB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgdGltZTogKElOL09VVCkgdGltZQotICogQHBhcmFtICAgICAgdGltZXNjYWxlOiAoSU4pIFRoZSB0aW1lc2NhbGUgKHRpbWUgdW5pdCBwZXIgc2Vjb25kKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzogdGhlIHByZWNpc2lvbiBvZiB0aGUgc3lzdGVtIGNsb2NrIGlzCi0gKiAgICAgICAgICAgICBub3QKLSAqICAgICAgICAgICAgIGNvbXBsaWFudCB3aXRoIHRoZSBpbnB1dCB0aW1lc2NhbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2xvY2tHZXRUaW1lKE00T1NBX1RpbWUqIHBUaW1lLCBNNE9TQV9VSW50MzIgdGltZXNjYWxlKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9oaTsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfbG87Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xoOwotICAgIE00T1NBX1VJbnQzMiBmYWN0b3I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfY2xvY2tHZXRUaW1lXHRcdE00T1NBX1RpbWUqIDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUaW1lLCB0aW1lc2NhbGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFRpbWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiBwVGltZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gdGltZXNjYWxlLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2xvY2tHZXRUaW1lOiB0aW1lc2NhbGUgaXMgMCIpOwotCi0gICAgZmFjdG9yID0gMTAwMDAwMCAvIHRpbWVzY2FsZTsKLQotICAgIGlmKGdldHRpbWVvZmRheSgmdHYsICZ0eikgPT0gMCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lX2xvID0gKHR2LnR2X3NlYyAmIDB4RkZGRikgKiB0aW1lc2NhbGU7Ci0gICAgICAgIHUzMl90aW1lX2hpID0gKCgodHYudHZfc2VjID4+IDE2KSAmIDB4RkZGRikgKiB0aW1lc2NhbGUpICsgKCh1MzJfdGltZV9sbyA+PiAxNikgJiAweEZGRkYpOwotICAgICAgICB1MzJfdGltZV9sbyAmPSAweEZGRkY7Ci0gICAgICAgIHUzMl90aW1lX2xvICs9IHR2LnR2X3VzZWMgLyBmYWN0b3I7Ci0gICAgICAgIHUzMl90aW1lX2hpICs9ICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZSA9ICgodTMyX3RpbWVfaGkgJiAweDdGRkYpIDw8IDE2KSB8IHUzMl90aW1lX2xvOwotICAgIH0KLQotICAgIC8qIE00T1NBX1RpbWUgaXMgc2lnbmVkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBtYXggdmFsdWUqLwotICAgIGlmICh1MzJfdGltZSA+IE00T1NBX0lOVDMyX01BWCkKLSAgICB7Ci0gICAgICAgIHUzMl90aW1lID0gdTMyX3RpbWUgLSBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgfQotCi0gICAgKnBUaW1lID0gKE00T1NBX1RpbWUpdTMyX3RpbWU7Ci0KLSAgICBpZiggdGltZXNjYWxlID4gMTAwMDAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVTQ0FMRV9UT09fQklHOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZUNvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMTJkYjVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSBjb21tb24gZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHVzZWQgYnkgYm90aCB0aGUgZmlsZSB3cml0ZXIKLSAqICAgICAgICAgICAgICAgYW5kIGZpbGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTCi0jZXJyb3IgIlVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgaXMgbm90IGRlZmluZWQiCi0jZW5kaWYgLypVU0VfU1RBR0VGUklHSFRfQ09ERUNTKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgY29yZV9pZDogKElOKSBDb3JlIElEIG9mIHRoZSBjYWxsZXIgKE00T1NBX0ZJTEVfUkVBREVSIG9yIE00T1NBX0ZJTEVfV1JJVEVSKQotICogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotICogQHBhcmFtICAgICAgZmlsZU1vZGVBY2Nlc3M6IChJTikgRmlsZSBtb2RlIGFjY2VzcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgICBmaWxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX05PVF9GT1VORDogdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0gKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzogdGhlIGZpbGUgbW9kZSBhY2Nlc3MgaXMgbm90IGNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfVUludDE2IGNvcmVfaWQsIE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKQotewotCi0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpTW9kZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTaXplICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotCi0gICAgTTRPU0FfQ2hhciAgbW9kZVs0XSAgICAgICAgICAgID0gIiI7Ci0gICAgTTRPU0FfQ2hhciogcFJlYWRTdHJpbmcgICAgICAgID0gKE00T1NBX0NoYXIqKSJyIjsKLSAgICBNNE9TQV9DaGFyKiBwV3JpdGVTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopInciOwotICAgIE00T1NBX0NoYXIqIHBBcHBlbmRTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImEiOwotICAgIE00T1NBX0NoYXIqIHBCaW5hcnlTdHJpbmcgICAgPSAoTTRPU0FfQ2hhciopImIiOwotICAgIE00T1NBX0NoYXIqIHBQbHVzU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiKyI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEZJTEUqIHBGaWxlSGFuZGxlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQgKnBGaWxlQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypGQjogdG8gdGVzdCB0aGUgVVRGMTYtPlVURjggY29udmVyc2lvbiBpbnRvIFZpZGVvIEFydGlzdCovCi0gICAgLypDb252ZXJ0IHRoZSBVUkwgZnJvbSBVVEYxNiB0byBVVEY4Ki8KLSAgICBNNE9TQV9Wb2lkKiB0ZW1wQ29udmVyc2lvbkJ1ZjsKLSAgICBNNE9TQV9VSW50MzIgdGVtcENvbnZlcnNpb25TaXplID0gMTAwMDsKLQotICAgIHRlbXBDb252ZXJzaW9uQnVmID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh0ZW1wQ29udmVyc2lvblNpemUgKzEsIDAsICJjb252ZXJzaW9uIGJ1ZiIpOwotICAgIGlmKHRlbXBDb252ZXJzaW9uQnVmID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3Igd2hlbiBhbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVG9VVEY4X09TQUwocFVybCwgdGVtcENvbnZlcnNpb25CdWYsICZ0ZW1wQ29udmVyc2lvblNpemUpOwotICAgICgoTTRPU0FfQ2hhciopdGVtcENvbnZlcnNpb25CdWYpW3RlbXBDb252ZXJzaW9uU2l6ZSBdID0gJ1wwJzsKLQotICAgIHByaW50ZigiZmlsZSBvcGVuICVzXG4iLCB0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLSAgICBNNE9TQV9UUkFDRTNfNCgiTTRPU0FfZmlsZUNvbW1vbk9wZW5cdFx0TTRPU0FfVUludDE2ICVkXHRNNE9TQV9Db250ZXh0KiAweCV4XHQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAlc1x0ZmlsZU1vZGVBY2Nlc3MgJWQiLCBjb3JlX2lkLCBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBwVXJsICBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gZmlsZU1vZGVBY2Nlc3MsICAgIE00RVJSX1BBUkFNRVRFUiwgICAgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlTW9kZUFjY2VzcyBpcyAwIik7Ci0KLSAgICAvKiBSZWFkIG1vZGUgbm90IHNldCBmb3IgdGhlIHJlYWRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlUmVhZCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIE00T1NBZmlsZVJlYWRPcGVuIGNhbm5vdCBiZSB1c2VkIHdpdGggV3JpdGUgZmlsZSBtb2RlIGFjY2VzcyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIEFwcGVuZCBhbmQgQ3JlYXRlIGZsYWdzIGNhbm5vdCBiZSB1c2VkIHdpdGggUmVhZCAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUFwcGVuZCIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUNyZWF0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlQ3JlYXRlIik7Ci0KLSAgICAvKiBXcml0ZSBtb2RlIG5vdCBzZXQgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfV1JJVEVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVXcml0ZSIpOwotCi0gICAgLyogQ3JlYXRlIGZsYWcgbmVjZXNzYXJ5IGZvciBvcGVuaW5nIGZpbGUgKi8KLSAgICBpZiAoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSAmJgotICAgICAgICAoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVdyaXRlKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpKQotICAgIHsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUGx1c1N0cmluZywgKHNpemVfdCkxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcEFwcGVuZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwUmVhZFN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFdyaXRlU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSYmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVJc1RleHRNb2RlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBCaW5hcnlTdHJpbmcsKHNpemVfdCkxKTsKLSAgICB9Ci0KLSAgICAvKk9wZW4gdGhlIGZpbGUqLwotCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLSAgICAvKk9wZW4gdGhlIGNvbnZlcnRlZCBwYXRoKi8KLSAgICBwRmlsZUhhbmRsZXIgPSBmb3BlbigoY29uc3QgY2hhciAqKXRlbXBDb252ZXJzaW9uQnVmLCAoY29uc3QgY2hhciAqKW1vZGUpOwotICAgIC8qRnJlZSB0aGUgdGVtcG9yYXJ5IGRlY29kZWQgYnVmZmVyKi8KLSAgICBmcmVlKHRlbXBDb252ZXJzaW9uQnVmKTsKLSNlbHNlIC8qIFVURl9DT05WRVJTSU9OICovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKilwVXJsLCAoY29uc3QgY2hhciAqKW1vZGUpOwotI2VuZGlmIC8qIFVURl9DT05WRVJTSU9OICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUhhbmRsZXIpCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFTk9FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9OT1RfRk9VTkQsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGaWxlIG5vdCBmb3VuZDogJXMiLCBwVXJsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRUFDQ0VTOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTE9DS0VELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFBlcm1pc3Npb24gZGVuaWVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTE9DS0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBJbnZhbGlkIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgICB9Ci0gICAgICAgIGNhc2UgRU1GSUxFOgotICAgICAgICAgY2FzZSBFTk9TUEM6Ci0gICAgICAgIGNhc2UgRU5PTUVNOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFRvbyBtYW55IG9wZW4gZmlsZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgdGhlIGZpbGUgY29udGV4dCAqLwotICAgIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZUNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25PcGVuOiBmaWxlIGNvbnRleHQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MgICAgICAgID0gcEZpbGVIYW5kbGVyOwotICAgIHBGaWxlQ29udGV4dC0+YWNjZXNzX21vZGUgICAgPSBmaWxlTW9kZUFjY2VzczsKLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAgICA9IFNlZWtOb25lOwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSAgICA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgICogTm90ZTogTmV2ZXIgdXNlIHRoaXMgZXhwcmVzc2lvbiAiaSA9ICh2YWx1ZTEgPT0gdmFsdWUyKSA/IHg6IHk7IgotICAgICAqIGJlY2F1c2UgdGhhdCBkb2Vucyd0IGNvbXBpbGUgb24gb3RoZXIgcGxhdGZvcm1zIChBRFMgZm9yIGV4YW1wbGUpCi0gICAgICogVXNlOiBpZih2YWx1ZTEgPT0gdmFsdWUyKQotICAgICAqICAgICAgICB7IGk9IHg7IC4uZXRjCi0gICAgICovCi0gICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSAwOwotICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSBNNE9TQV9rRGVzY05vbmVBY2Nlc3M7Ci0KLSAgICBpZiAoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NSZWFkQWNjZXNzOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUgPSBjb3JlX2lkOwotICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NXcml0ZUFjY2VzczsKLSAgICB9Ci0KLSAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSAwOwotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAwOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgVVJMIHN0cmluZyAqLwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSAoTTRPU0FfQ2hhciopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxLAotICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogVVJMIG5hbWUiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnVybF9uYW1lKQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIGZyZWUocEZpbGVDb250ZXh0KTsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIE00T1NBX2Nock5Db3B5KHBGaWxlQ29udGV4dC0+dXJsX25hbWUsIHBVcmwsIHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpKzEpOwotCi0gICAgLyogR2V0IHRoZSBmaWxlIG5hbWUgKi8KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUocFVybCwgJnBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZU9wZW4oJihwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KSwgMSk7IC8qIEFsbG9jYXRlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotCi0jaWZkZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotICAgIC8vIFdvcmthcm91bmQgZm9yIGZpbGUgc3lzdGVtIGJ1ZyBvbiBTdGluZ3JheS9Ib25leWNvbWIgd2hlcmUgYSBmaWxlIHJlLWNyZWF0ZWQgd2lsbCBrZWVwCi0gICAgLy8gdGhlIG9yaWdpbmFsIGZpbGUncyBzaXplIGZpbGxlZCB3aXRoIDBzLiBEbyBub3Qgc2VlayB0byB0aGUgZW5kIHRvIGF2b2lkIGlsbCBlZmZlY3RzCi0gICAgaWYoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZUFwcGVuZCkgewotICAgICAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgMCwgU0VFS19FTkQpOyAgICAgICAgLyogICAgMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSovCi0gICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaVNpemUgPSAwOwotICAgIH0KLSNlbHNlIC8qIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MgKi8KLSAgICAvKiBHZXQgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgIGlTaXplID0gZnRlbGwocEZpbGVIYW5kbGVyKTsgICAgICAgICAgICAvKiAgICAzLSBDaGVjayB0aGUgZmlsZSBzaXplICAgICAgICAqLwotICAgIGZzZWVrKHBGaWxlSGFuZGxlciwgaVNhdmVQb3MsIFNFRUtfU0VUKTsvKiAgICA0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSNlbmRpZiAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0KLQotCi0gICAgLyogV2FybmluZyBwb3NzaWJsZSBvdmVyZmxvdyBpZiB0aGUgZmlsZSBpcyBoaWdoZXIgdGhhbiAyR0J5dGVzICovCi0gICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICpwQ29udGV4dCA9IHBGaWxlQ29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gVVRGMTYgdG8gVVRGOAotICogQHBhcmFtICAgICAgcEJ1ZmZlckluOiAoSU4pIFVURjE2IGlucHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJPdXQ6IChPVVQpIFVURjggb3V0cHV0IHBhdGgKLSAqIEBwYXJhbSAgICAgIGJ1ZmZlck91dFNpemU6IChJTi9PVVQpIHNpemUgb2YgdGhlIG91dHB1dCBwYXRoCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiB0aGUgb3V0cHV0IHBhdGggc2l6ZSBpcyBub3QgZW5vdWdoIHRvIGNvbnRhaW4KLSAqICAgICAgICAgICAgICAgdGhlIGRlY29kZWQgcGF0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotTTRPU0FfRVJSIE00T1NBX1RvVVRGOF9PU0FMIChNNE9TQV9Wb2lkICAgKnBCdWZmZXJJbiwgTTRPU0FfVUludDggICpwQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MTYgaTsKLSAgICB3Y2hhcl90ICAgICAgKndfc3RyID0gKHdjaGFyX3QgKikgcEJ1ZmZlckluOwotICAgIE00T1NBX1VJbnQzMiBsZW4sIHNpemVfbmVlZGVkLCBzaXplX2dpdmVuOwotICAgIGlmIChwQnVmZmVySW4gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwQnVmZmVyT3V0PU5VTEw7Ci0gICAgICAgICpidWZmZXJPdXRTaXplPTE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGxlbiAgICAgICAgID0gd2NzbGVuKHdfc3RyKTsKLSAgICAgICAgc2l6ZV9uZWVkZWQgPSBsZW4rMTsKLSAgICAgICAgc2l6ZV9naXZlbiAgPSAqYnVmZmVyT3V0U2l6ZTsKLQotICAgICAgICpidWZmZXJPdXRTaXplPXNpemVfbmVlZGVkOwotICAgICAgICBpZiAoc2l6ZV9naXZlbiA8IHNpemVfbmVlZGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCdWZmZXJPdXRbaV09KE00T1NBX1VJbnQ4KXdfc3RyW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEJ1ZmZlck91dFtsZW5dPTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0jZW5kaWYgLypVVEYgQ09OVkVSU0lPTiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24uCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBGaWxlUG9zKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19jdXJyZW50OwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWs7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbnVsbCA9IDA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfbmVnX3VuID0gLTE7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfZmlsZV9zaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZUNvbW1vblNlZWtcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlICVkXHRNNE9TQV9GaWxlUG9zaXRpb24qIDB4JXgiLAotICAgICAgICBwQ29udGV4dCwgc2Vla01vZGUsIHBGaWxlUG9zKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHNlZWtNb2RlLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlUG9zLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0gICAgZnBvc19maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotICAgIGlmKFNlZWtSZWFkID09IHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrKQotICAgIHsKLSAgICAgICAgZnBvc19jdXJyZW50ID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmKFNlZWtXcml0ZSA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IDA7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZwb3Nfc2VlayA9ICpwRmlsZVBvcyArIGZwb3NfZmlsZV9zaXplIC0gZnBvc19jdXJyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nID0gZnBvc19jdXJyZW50ICsgZnBvc19zZWVrOwotCi0gICAgaWYoZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGZwb3Nfc2VlaywgU0VFS19DVVIpICE9IDApCi0gICAgewotICAgICAgICBzd2l0Y2goZXJybm8pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBFSU5WQUw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBtZWFuaW5nIHRoZSB2YWx1ZSBmb3Igb3JpZ2luIGlzIGludmFsaWQgb3IgdGhlIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWVkIGJ5IG9mZnNldCBpcyBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBFQkFERjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7LyogZmlsZSBoYW5kbGUgaXMgaW52YWxpZCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSByZXR1cm5lZCBwb3NpdGlvbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAqcEZpbGVQb3MgPSBmcG9zX3NlZWtfZnJvbV9iZWdpbm5pbmc7Ci0KLSAgICAvKiBTRUVLIGRvbmUsIHJlc2V0IGVuZCBvZiBmaWxlIHZhbHVlICovCi0gICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0byBjbG9zZSB0aGUgZmlsZSAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkKLSAqIEBub3RlICAgICAgIFRoZSBjb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyL3dyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpMzJfZXJyX2NvZGU9MDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uQ2xvc2VcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2lkLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsCi0gICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25DbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dC0+dXJsX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+dXJsX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgcEZpbGVDb250ZXh0LT5maWxlX25hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgaTMyX2Vycl9jb2RlID0gZmNsb3NlKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjID0gTTRPU0FfTlVMTDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVDbG9zZShwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsvKiBmcmVlIHRoZSBzZW1hcGhvcmUgKi8KLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0KLSAgICBpZiAoaTMyX2Vycl9jb2RlICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVDb21tb25DbG9zZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGZpbGUgYXR0cmlidXRlcyAoYXNzb2NpYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIGNvbnRleHQpCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4pIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIGF0dHJpYnV0ZTogKE9VVCkgVGhlIGZpbGUgYXR0cmlidXRlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZUF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkKLXsKLQotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBmaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgc3RydWN0IHN0YXQgVGhlU3RhdDsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlXHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgIk00T1NBX0ZpbGVBdHRyaWJ1dGUqIDB4JXgiLCBwQ29udGV4dCwgcEF0dHJpYnV0ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQXR0cmlidXRlLCAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0KLSAgICBpZihzdGF0KChjaGFyKilmaWxlQ29udGV4dC0+dXJsX25hbWUsICZUaGVTdGF0KSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfY3RpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZSA9IChNNE9TQV9UaW1lKVRoZVN0YXQuc3RfYXRpbWU7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X210aW1lOwotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUudGltZVNjYWxlID0gMTsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUudGltZVNjYWxlID0gMTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5sYXN0QWNjZXNzRGF0ZS5yZWZlcmVuY2VZZWFyID0gMTk3MDsKLSAgICBwQXR0cmlidXRlLT5tb2RpZmllZERhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0KLSAgICBwQXR0cmlidXRlLT5tb2RlQWNjZXNzID0gZmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIFVSTCAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICB1cmw6IChPVVQpIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMIChhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgIE00T1NBX2ZpbGVDb21tb25HZXRVUkwpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NoYXIqKiBwVXJsKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlMZW5ndGg7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldFVSTDogcFVybCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB1aUxlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBGaWxlQ29udGV4dC0+dXJsX25hbWUpKzE7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IHRvIHN0b3JlIHRoZSB1cmxfbmFtZSAqLwotICAgICpwVXJsID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aUxlbmd0aCwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHVybCIpOwotICAgIGlmKE00T1NBX05VTEwgPT0gKnBVcmwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRVUkwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX2Nock5Db3B5KCpwVXJsLCBwRmlsZUNvbnRleHQtPnVybF9uYW1lLCB1aUxlbmd0aCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIG5hbWUgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgdG8gdGhlIGlucHV0IFVSTC4KLSAqIEBub3RlICAgICAgIFRoZSB1c2VyIHNob3VsZCBub3QgZm9yZ2V0IHRvIGRlbGV0ZSB0aGUgb3V0cHV0IHN0cmluZyB1c2luZwotICogICAgICAgICAgICAgTTRPU0Ffc3RyRGVzdHJveQotICogQHBhcmFtICAgICAgcFVybDogICAgICAgICAgICAoSU4pIFRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgVVJMCi0gKiBAcGFyYW0gICAgICBwRmlsZU5hbWU6ICAgIChPVVQpIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMLiBJdCBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGluc2lkZSB0aGlzIGZ1bmN0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogcFVybCwgTTRPU0FfQ2hhcioqIHBGaWxlTmFtZSkKLXsKLSAgICBNNE9TQV9JbnQzMiBpICAgICAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlVcmxMZW4gICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBGaWxlTmFtZUxlbiA9IDA7Ci0KLSAgICBNNE9TQV9DaGFyKiBwdHJVcmwgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9DaGFyKiBwdHJGaWxlbmFtZSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldFVSTFx0TTRPU0FfQ2hhciogJXNcdE00T1NBX0NoYXIqKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVcmwsIHBGaWxlTmFtZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlTmFtZSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogcEZpbGVOYW1lIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwRmlsZU5hbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgLypQYXJzZSBVUkwqLwotICAgIGlVcmxMZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKTsKLSAgICBmb3IoaT1pVXJsTGVuLTE7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICAgIGlmIChwVXJsW2ldICE9ICdcXCcgJiYgcFVybFtpXSAhPSAnLycpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVOYW1lTGVuKys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsgLyogZmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIG5hbWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB0ckZpbGVuYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoRmlsZU5hbWVMZW4rMSwgTTRPU0FfRklMRV9DT01NT04sCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBGaWxlbmFtZSBzdHJpbmciKTsKLSAgICBpZiAocHRyRmlsZW5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwdHJVcmwgPSBwVXJsICsgKGlVcmxMZW4gLSBGaWxlTmFtZUxlbik7Ci0gICAgTTRPU0FfY2hyTkNvcHkocHRyRmlsZW5hbWUsIHB0clVybCwgRmlsZU5hbWVMZW4rMSk7Ci0KLSAgICAqcEZpbGVOYW1lID0gcHRyRmlsZW5hbWU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVJlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGE3MmY1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuYwotICogQGF1dGhvciAgICAgICBDZWRyaWMgTGVjb3V0cmUgKGNlZHJpYy5sZWNvdXRyZUBwaGlsaXBzLmNvbSkKLSAqICAgICAgICAgICAgICAgTGF1cmVudCBGYXkgKGxhdXJlbnQuZmF5QHBoaWxpcHMuY29tKQotICogQHBhciBPcmc6ICAgICBQaGlsaXBzIERpZ2l0YWwgU3lzdGVtcyBMYWJvcmF0b3JpZXMgLSBQYXJpcyAoUERTTC1QKQotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgQW5kcm9pZAotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gcmVhZCBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSogQHBhcmFtICAgICAgY29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICB1cmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoZSBVUkwgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc3VwcG9ydGVkCi0qICAgICAgICAgICAgIGZpbGUKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0xPQ0tFRDogdGhlIGZpbGUgaXMgbG9ja2VkIGJ5IGFuIG90aGVyCi0qICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcykKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfZmlsZVJlYWRPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uT3BlbihNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlRGVzY3JpcHRvciwgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSAnc2l6ZScgYnl0ZXMgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogICAgICAgICAgICAgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpIGFuZCB3cml0ZXMgdGhlIGRhdGEgdG8gdGhlICdkYXRhJwotKiAgICAgICAgICAgICBwb2ludGVyLgotKiBAbm90ZSAgICAgICBJZiAnc2l6ZScgYnl0ZSBjYW5ub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwgJ3NpemUnCi0qICAgICAgICAgICAgIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0Ci0qIEBub3RlICAgICAgIG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qIEBwYXJhbSAgICAgIGJ1ZmZlcjogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEKLSogQHBhcmFtICAgICAgc2l6ZTogKElOL09VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlcykKLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRXQVJfTk9fREFUQV9ZRVQ6IHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIHRvIGZpbGwgdGhlICdkYXRhJwotKiAgICAgICAgICAgICBidWZmZXIsIHNvIHRoZSBzaXplIHBhcmFtZXRlciBoYXMgYmVlbiB1cGRhdGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfSW50MzIgICAgdWlTaXplUmVhZDsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9maWxlUmVhZERhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAoTTRPU0FfTlVMTCAhPSBwU2l6ZSkgPyAoKnBTaXplKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZERhdGE6IHBTaXplIGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVJlYWREYXRhOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICB1aVNpemVSZWFkID0gZnJlYWQoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBoYW5kbGUgaXMgaW52YWxpZCwgb3IgdGhlIGZpbGUgaXMgbm90IG9wZW4gZm9yIHJlYWRpbmcsIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAgICAgKnBTaXplID0gMDsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgICAgIGlmICgoTTRPU0FfVUludDMyKXVpU2l6ZVJlYWQgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGZzZWVrIHRvIHRoZSBsYXN0IHJlYWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uKSk7Ci0gICAgICAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrID0gU2Vla1JlYWQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCBkYXRhICovCi0gICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICBpZigtMSA9PSB1aVNpemVSZWFkKQotICAgIHsKLSAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLAotICAgICAgICAgb3IgdGhlIGZpbGUgaXMgbG9ja2VkICovCi0gICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgIGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24gKyB1aVNpemVSZWFkOwotICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotCi0gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5iX2lzX2VuZF9vZl9maWxlID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFNpemUgPSB1aVNpemVSZWFkOwotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICByZWFkZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywgZnJvbQotICogICAgICAgICAgICAgdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudAotICogICAgICAgICAgICAgcG9zaXRpb24gcG9pbnRlciBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWRTZWVrIDogbW9kZSA9ICVkICBwb3MgPSAlbHUiLCBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFBvc2l0aW9uICE9IE00T1NBX05VTEwpID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlZWtNb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkU2Vlazogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlUmVhZFNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHbyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgKnBQb3NpdGlvbiwgU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZFNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJldHVybiB3aXRob3V0IGVycm9yICovCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKHBGaWxlQ29udGV4dC0+Y3VycmVudF9zZWVrICE9IFNlZWtSZWFkKQotICAgIHsKLQotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBzZWVrTW9kZSwgcFBvc2l0aW9uKTsKLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gKnBQb3NpdGlvbjsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoTTRPU0FfRklMRV9XUklURVIgPT0gcEZpbGVDb250ZXh0LT5jb3JlSURfd3JpdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkNsb3NlKE00T1NBX0ZJTEVfUkVBREVSLCBwQ29udGV4dCk7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAndmFsdWUnIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklEIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5Ci0gKiAgICAgICAgICAgICB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBwT3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbgotICogQHBhcmFtICAgICAgcE9wdGlvblZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwT3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogb3B0aW9uSUQgaXMgMCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogcE9wdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZEdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZElzRU9GOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sKiBiSXNFbmRPZkZpbGUgPSAoTTRPU0FfQm9vbCopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKmJJc0VuZE9mRmlsZSA9IHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0lTX0VPRiovCi0KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwUG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBCdWdmaXg6IHVwZGF0ZSB0aGUgZmlsZSBzaXplLgotICAgICAgICAgICAgKiBXaGVuIGEgZmlsZSBpcyBpbiByZWFkIG1vZGUsIG1heSBiZSBhbm90aGVyIGFwcGxpY2F0aW9uIGlzIHdyaXRpbmcgaW4uCi0gICAgICAgICAgICAqIFNvLCB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgICAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgaVNpemUgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgaVNhdmVQb3MsIFNFRUtfU0VUKTsgICAgLyo0LSBnbyB0byB0aGUgZmlyc3QgcG9zaXRpb24qLwotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBpU2l6ZTsKLQotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlQXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9VUkwqLwotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpKQotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgcmVhZGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IG9wdGlvbklELCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9SRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1JFQURfT05MWSwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU9IChNNE9TQV9VSW50MzIpKihNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfRmlsZVdyaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzN2ZjMTczLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyLmMKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHdyaXRlIGluIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb25fcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgcHJvdmlkZWQgVVJMIGFuZCByZXR1cm5zIGl0cyBjb250ZXh0LgotICogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKE9VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHBhcmFtICAgICAgcFVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVXcml0ZU9wZW4gOiBwQyA9IDB4JXAgIGZkID0gMHglcCAgbW9kZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0LCBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTW9kZUFjY2Vzcyk7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgJ3NpemUnIGJ5dGVzIHN0b3JlZCBhdCAnZGF0YScgbWVtb3J5Ci0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBzZWxlY3RlZCBieSBpdHMgY29udGV4dC4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgIG1lbW9yeSBmb3IgJ2RhdGEnIHBhcmFtZXRlci4KLSAqIEBub3RlICAgICAgIE1vcmVvdmVyIHRoZSBkYXRhIHBvaW50ZXIgbXVzdCBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgYXQgbGVhc3QKLSAqICAgICAgICAgICAgICdzaXplJyBieXRlcy4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBidWZmZXI6IChJTikgRGF0YSBwb2ludGVyIG9mIHRoZSB3cml0ZSBkYXRhCi0gKiBAcGFyYW0gICAgICBzaXplOiAoSU4pIFNpemUgb2YgdGhlIGRhdGEgdG8gd3JpdGUgKGluIGJ5dGVzKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlTaXplV3JpdGU7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlRGF0YSA6IGRhdGEgPSAweCVwICBzaXplID0gJWx1IiwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpU2l6ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBkYXRhLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGRhdGEgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHVpU2l6ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogdWlTaXplIGlzIDAiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChNNE9TQV9rRGVzY1JXQWNjZXNzID09IHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgICAgV3JpdGVTaXplOwotICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICBXcml0ZVNpemUgPSBmd3JpdGUoKHZvaWQgKilkYXRhLDEsIHVpU2l6ZSwgcEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotICAgICAgICBpZihXcml0ZVNpemUgIT0gdWlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnIgPSAoKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKFdyaXRlU2l6ZSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVdyaXRlRGF0YSBlcnJvcjoleCIsZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOwotCi0gICAgICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgV3JpdGVTaXplOwotCi0gICAgICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrV3JpdGUpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24pKTsKLQotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBkYXRhICovCi0gICAgdWlTaXplV3JpdGUgPSBmd3JpdGUoZGF0YSwgc2l6ZW9mKE00T1NBX0NoYXIpLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgIGlmKHVpU2l6ZVdyaXRlID09IChNNE9TQV9VSW50MzIpLTEpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgLyogQW4gZXJyb3Igb2NjdXJlZCAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZVdyaXRlRGF0YTogZndyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gKyB1aVNpemVXcml0ZTsKLQotICAgIC8qIFVwZGF0ZSB0aGUgZmlsZSBzaXplICovCi0gICAgaWYocEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA+IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplKQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5maWxlX3NpemUgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLQotICAgIGlmKChNNE9TQV9VSW50MzIpdWlTaXplV3JpdGUgPCB1aVNpemUpCi0gICAgewotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlV3JpdGVEYXRhIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIGluIHRoZSBjb3JlIGZpbGUKLSAqICAgICAgICAgICAgIHdyaXRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuIFRoZSBwb3NpdGlvbiBpcyByZWxhdGVkIHRvCi0gKiAgICAgICAgICAgICB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgZnJvbSB0aGUgYmVnaW5uaW5nLAotICogICAgICAgICAgICAgZnJvbSB0aGUgZW5kIG9yIGZyb20gdGhlIGN1cnJlbnQgcG9zdGlvbi4gVG8gc3VwcG9ydCBsYXJnZSBmaWxlCi0gKiAgICAgICAgICAgICBhY2Nlc3MgKG1vcmUgdGhhbiAyR0J5dGVzKSwgdGhlIHBvc2l0aW9uIGlzIHByb3ZpZGVkIG9uIGEgNjQKLSAqICAgICAgICAgICAgIGJpdHMuCi0gKiBAbm90ZSAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gcG9pbnRlcgotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgbXVzdCBub3QgY2hhbmdlLiBFbHNlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIG11c3QgYmUgdXBkYXRlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBzZWVrTW9kZTogKElOKSBTZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICAgICBwb3NpdGlvbjogKElOL09VVCkgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT046IHRoZSBwb3NpdGlvbiBjYW5ub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVTZWVrKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVdyaXRlU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlLCAoTTRPU0FfTlVMTCAhPSBwUG9zaXRpb24pID8gKCpwUG9zaXRpb24pIDogMCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlZW1Nb2RlIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUG9zaXRpb24sIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHBQb3NpdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKSAvKiByZWFkIHdyaXRlICovCi0gICAgewotICAgICAgICAgTTRPU0FfVUludDMyICAgIFNlZWtNb2RlT3B0aW9uOwotICAgICAgICAvKlRoZSBwb3NpdGlvbiBmb3IgdGhlIHNlZWsgbW9kZSBiZXR3ZWVuIHRoZSBTSFAgYW5kIHRoZSBPU0FsIHBhcnQgYXJlIGRpZmZlcmVudCAqLwotICAgICAgICBpZiAoTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfU0VUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0VuZCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0VORDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtDdXJyZW50ID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfQ1VSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00T1NBX2ZpbGVXcml0ZVNlZWs6IEVORCBXSVRIIEVSUk9SICEhISAoQ09OVkVSSU9OIEVSUk9SIEZPUiBUSEUgU0VFSyBNT0RFKSAiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsKnBQb3NpdGlvbixTZWVrTW9kZU9wdGlvbik7Ci0gICAgICAgIGlmKGVyciAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICBlcnI9KChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShlcnIpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZVNlZWsgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0KLSAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZVNlZWs6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0KLSAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtXcml0ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIGNsb3NlIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAoYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dCkuCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlciBpcyBmcmVlZC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlQ2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9maWxlV3JpdGVDbG9zZSA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1dSSVRFUiwgcENvbnRleHQpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIHRoZSBzdHJlYW0gYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVGbHVzaCA6IHBDID0gMHglcCIsIHBDb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVGbHVzaDogcGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmIChmZmx1c2gocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUKLSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRAotICogICAgICAgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZAotICogICAgICAgICAgICAgdG8gaXRzIGludGVybmFsIHZhcmlhYmxlLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChJTi9PVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IDAsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBPcHRpb25WYWx1ZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IHBPdGlvblZhbHVlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfRklMRV9XUklURVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksIE00RVJSX1dSSVRFX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1BPU0lUSU9OID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlV2FpdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgKnBvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotICAgICAgICAgICAgaWYoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotCi0gICAgICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICBmc2VlayhwRmlsZUNvbnRleHQtPmZpbGVfZGVzYywgMCwgU0VFS19FTkQpOyAgICAgICAgLyoyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlICovCi0gICAgICAgICAgICAgICAgKnBvc2l0aW9uID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0VVJMOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldFVSTCAocENvbnRleHQsIChNNE9TQV9DaGFyKiopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfVVJMKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0QXR0cmlidXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZUF0dHJpYnV0ZSopcE9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9BVFRSSUJVVEUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQgPT0gTTRPU0FfVFJVRSkKLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0OgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlTW9kZUFjY2VzcyBhY2Nlc3MgPSBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlOwotCi0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoIShhY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb246IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5jb3JlSURfcmVhZCA9IE00T1NBX0ZJTEVfUkVBREVSOwotCi0gICAgICAgICAgICAqcE9wdGlvblZhbHVlID0gcENvbnRleHQ7Ci0KLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCovCi0KLSAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9VSW50MzIqKXBPcHRpb25WYWx1ZSA9IHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbiIpOwotCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIGNvcmUgZmlsZSB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZQotKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSogICAgICAgICAgICAgJ3ZhbHVlJyBmaWVsZCwgdGhlIGNhbGxlZSBtdXN0IGNvcHkgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwKLSogICAgICAgICAgICAgdmFyaWFibGUuCi0qIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0qIEBwYXJhbSAgICAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSogQHBhcmFtICAgICAgdmFsdWU6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9SRUFEX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgcmVhZCBvbmx5IG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24gOiBvcHRpb24gPSAweCV4Iiwgb3B0aW9uSUQpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLCBNNEVSUl9SRUFEX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZToKLSAgICAgICAgewotICAgICAgICAgICAgcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGUgPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlRGVzY01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV9EZXNjck1vZGVBY2Nlc3MgPSAoTTRPU0FfSW50MzIpKihNNE9TQV9JbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYmU2YmJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX011dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgTXV0ZXggZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgbXV0ZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIG11dGV4ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfVUludDMyICAgICBjb3JlSUQ7ICAgICAgICAgICAgICAgLyogbXV0ZXggY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgcHRocmVhZF9tdXRleF90ICBtdXRleDsgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KLSAgIHB0aHJlYWRfdCAgICAgICAgdGhyZWFkT3duZXJJRDsgICAgICAgIC8qIHRocmVhZCBvd25lciBpZGVudGlmaWFudCAqLwotfSBNNE9TQV9NdXRleENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0FfbXV0ZXhDbG9zZSBmdW5jdGlvbi4gVGhlIGNvbnRleHQgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIG11dGV4IGZ1bmN0aW9ucyB0byBhbGxvdwotICogICAgICAgICAgICAgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0KilNNE9TQV9OVUxMOwotICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cmlidXRlID0geyAwIH07Ci0gICAgTTRPU0FfQm9vbCBvcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleE9wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleCIsIHBDb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleE9wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9NdXRleENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9NVVRFWCwgKE00T1NBX0NoYXIqKSJNNE9TQV9tdXRleE9wZW46IG11dGV4IGNvbnRleHQiKTsKLQotICAgIGlmKE00T1NBX05VTEwgPT0gcE11dGV4Q29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfbXV0ZXhPcGVuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICAgewotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleCB0eXBlLiAqLwotICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSggJmF0dHJpYnV0ZSwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIG11dGV4LiAqLwotICAgICAgICAgICAgaWYgKDAgPT0gcHRocmVhZF9tdXRleF9pbml0KCAmcE11dGV4Q29udGV4dC0+bXV0ZXgsICZhdHRyaWJ1dGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlc3Ryb3kgdGhlIG11dGV4IGF0dHJpYnV0ZS4gKi8KLSAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgIH0KLQotICAgIGlmKCFvcGVuZWQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwgIk00T1NBX211dGV4T3BlbjogT1MgbXV0ZXggY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIGZyZWUocE11dGV4Q29udGV4dCk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRCA7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+Y29yZUlEID0gTTRPU0FfTVVURVg7Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMDsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KSBwTXV0ZXhDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgbG9ja3MgdGhlIG11dGV4LiAiQ29udGV4dCIgaWRlbnRpZmllcyB0aGUgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJZiB0aGUgbXV0ZXggaXMgYWxyZWFkeSBsb2NrZWQsIHRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MgdW50aWwKLSAqICAgICAgICAgICAgIHRoZSBtdXRleCBiZWNvbWVzIGF2YWlsYWJsZSAoYnkgY2FsbGluZyBNNE9TQV9tdXRleFVubG9jaykgb3IKLSAqICAgICAgICAgICAgICJ0aW1lb3V0IiBpcyByZWFjaGVkLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIG11dGV4IGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleExvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9VSW50MzIgdGltZW91dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgY3VycmVudFRocmVhZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlc3VsdDsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHRzOwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgbGVmdDsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9tdXRleExvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4TG9jazogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrIik7Ci0KLSAgICBjdXJyZW50VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Ci0KLSAgICBpZihwTXV0ZXhDb250ZXh0IC0+dGhyZWFkT3duZXJJRCA9PSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleExvY2s6IFRocmVhZCB0cmllZCB0byBsb2NrIGEgbXV0ZXggaXQgYWxyZWFkeSBvd25zIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVCA7Ci0gICAgfQotCi0gICAgLyogTG9jayB0aGUgbXV0ZXguICovCi0gICAgaWYgKCBNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgICB7Ci0gICAgICAgIGlmICggMCAhPSBwdGhyZWFkX211dGV4X2xvY2soJnBNdXRleENvbnRleHQtPm11dGV4KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotICAgICAgICB3aGlsZSAoICggRUJVU1kgPT0gcmVzdWx0ICkgJiYgKCAwIDwgdGltZW91dCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgICBpZiAoMSA8PSB0aW1lb3V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgLT0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFQlVTWSA9PSByZXN1bHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBPUyBtdXRleCB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgPSBjdXJyZW50VGhyZWFkOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHVubG9ja3MgdGhlIG11dGV4LiBUaGUgbXV0ZXggaXMgaWRlbnRpZmllZCBieQotICogICAgICAgICAgICAgaXRzIGNvbnRleHQKLSAqIEBub3RlICAgICAgIFRoZSBNNE9TQV9tdXRleExvY2sgdW5ibG9ja3MgdGhlIHRocmVhZCB3aXRoIHRoZSBoaWdoZXN0Ci0gKiAgICAgICAgICAgICBwcmlvcml0eSBhbmQgbWFkZSBpdCByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuLWJsb2NrZWQKLSAqICAgICAgICAgICAgIGJldHdlZW4gdGhyZWFkcyB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBtdXRleAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleFVubG9jayhNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgY3VycmVudFRocmVhZDsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9tdXRleFVubG9ja1x0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhVbmxvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9NVVRFWCAhPSBwTXV0ZXhDb250ZXh0LT5jb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCAhPSBjdXJyZW50VGhyZWFkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jazogVGhyZWFkIHRyaWVkIHRvIHVubG9jayBhIG11dGV4IGl0IGRvZXNuJ3Qgb3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gMCA7Ci0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcE11dGV4Q29udGV4dC0+bXV0ZXgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIG11dGV4IChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuIEFmdGVyCi0gKiAgICAgICAgICAgICB0aGlzIGNhbGwsIHRoZSBtdXRleCBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgbXV0ZXguCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBtdXRleC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX211dGV4Q2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhDbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKHBNdXRleENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9NVVRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4VW5sb2NrIik7Ci0KLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIGZyZWUoIHBNdXRleENvbnRleHQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyNGQwMzkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfUmFuZG9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qZm9yIHByaW50ZiAqLwotI2luY2x1ZGUgPHN0ZGFyZy5oPiAvKiBBTlNJIEMgbWFjcm9zIGFuZCBkZWZzIGZvciB2YXJpYWJsZSBhcmdzICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi0gKiBAYnJpZWYgICAgICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIG51bWJlciBnZW5lcmF0b3IKLSAqICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgY2FsbCB0byBNNE9TQV9yYW5kKCkKLSAqICAgICAgICAgICAgICAgbmVlZCB0aGUgc3RkbGliIGFuZCB0aW1lIGxpYnJhcmllcwotICogQG5vdGUKLSAqIEBwYXJhbQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmRJbml0KCkKLXsKLSAgICBpbnQgaTsKLQotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotCi0gICAgLyogV2luZG93cycgcmFuZCBpcyByb3R0ZW4sIHRoZSBmaXJzdCBnZW5lcmF0ZWQgdmFsdWUgYWZ0ZXIgdGhlIGluaXQKLSAgICBhYm92ZSBpcyBub3QgcmFuZG9tIGVub3VnaCwgc28gbGV0J3Mgc2hha2UgdGhpbmdzIGEgbGl0dGxlLi4uICovCi0KLSAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykgcmFuZCgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgICAgTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLSAqIEBicmllZiAgICAgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIDEgYW5kIG1heF92YWx1ZQotICogICAgICAgICAgICAgICAoaW5jbHVzaXZlKSB3aXRoIGFwcHJveGltYXRlbHkgZXF1YWwgcHJvYmFiaWxpdHksIGFuZAotICogICAgICAgICAgICAgICByZXR1cm5zIHRoaXMgbnVtYmVyIGluIG91dF92YWx1ZS4gRm9yIGluc3RhbmNlLCBhIG1heF92YWx1ZQotICogICAgICAgICAgICAgb2YgNiB3aWxsIHNpbXVsYXRlIGEgZmFpciA2LXNpZGVkIGRpY2Ugcm9sbC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBvdXRfdmFsdWUgKE9VVCk6IG9uIHJldHVybiwgcG9pbnRzIHRvIHJhbmRvbSByZXN1bHQKLSAqIEBwYXJhbSAgICAgICBtYXhfdmFsdWUgKElOKTogbWF4IGV4cGVjdGVkIHZhbHVlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLCBNNE9TQV9VSW50MzIgbWF4X3ZhbHVlKQotewotICAgIGlmKCAob3V0X3ZhbHVlID09IE00T1NBX05VTEwpIHx8IChtYXhfdmFsdWUgPCAxKSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgICgqb3V0X3ZhbHVlKSA9IHJhbmQoKTsKLSAgICAvKiBub3RpY2UgdGhpcyBhbGdvcml0aG0gd2lsbCBvbmx5IHdvcmsgZm9yIG1heF92YWx1ZXMgc3VjaCB0aGF0IHRoZSBtdWx0aXBsaWNhdGlvbgotICAgIHdvbid0IG92ZXJmbG93LCB3aGljaCBtZWFucyB0aGF0IG1heF92YWx1ZSB0eXBpY2FsbHkgc2hvdWxkbid0IGdvIG92ZXIgdGhlIHJhbmdlIG9mCi0gICAgYW4gSW50MTYuICovCi0gICAgKCpvdXRfdmFsdWUpID0gKCgoKm91dF92YWx1ZSkgKiBtYXhfdmFsdWUpIC8gKChNNE9TQV9VSW50MzIpUkFORF9NQVggKyAxKSkgKyAxOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNiNTg1Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9TZW1hcGhvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9TZW1hcGhvcmUuYwotICogQGJyaWVmICAgICAgICBTZW1hcGhvcmUgZm9yIFdpbmRvd3MKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgc2VtYXBob3JlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotCi0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotCi0vKiBDb250ZXh0IGZvciB0aGUgc2VtYXBob3JlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNE9TQV9VSW50MzIgICBjb3JlSUQ7ICAgICAvKiBzZW1hcGhvcmUgY29udGV4dCBpZGVudGlmaWFudCAqLwotICAgc2VtX3QgICAgICAgICAgc2VtYXBob3JlOyAgLyogc2VtYXBob3JlICovCi19IE00T1NBX1NlbWFwaG9yZUNvbnRleHQ7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBzZW1hcGhvcmUgd2l0aCB0aGUgImluaXRpYWxDb3VudGVyIgotICogICAgICAgICAgICAgdmFsdWUuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIGFsbG9jYXRlcyBhIHVuaXF1ZSBjb250ZXh0LiBJdCdzIHRoZQotICogICAgICAgICAgICAgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cyBjb250ZXh0LiBJdCBtdXN0Ci0gKiAgICAgICAgICAgICBiZSBmcmVlZCBieSB0aGUgTTRPU0Ffc2VtYXBob3JlQ2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0Ci0gKiAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBzZW1hcGhvcmUgZnVuY3Rpb25zCi0gKiAgICAgICAgICAgICB0byBhbGxvdyByZXRyaWV2aW5nIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgb3BlbmVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIGluaXRpYWxfY291bnQ6KElOKSBJbml0aWFsIGNvdW50ZXIgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcHJvdmlkZWQgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZU9wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpbml0aWFsX2NvdW50KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdE00T1NBX1VJbnQzMiAiCi0gICAgICAgICAgICAgICAgICAiJWQiLCBjb250ZXh0LCBpbml0aWFsX2NvdW50KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNE9TQV9TZW1hcGhvcmVDb250ZXh0KSwgTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0Ffc2VtYXBob3JlT3Blbjogc2VtYXBob3JlIGNvbnRleHQiKTsKLQotICAgaWYoc2VtYXBob3JlQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgIH0KLQotICAgaWYgKDAgIT0gc2VtX2luaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSwgMCwgaW5pdGlhbF9jb3VudCkpCi0gICB7Ci0gICAgICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVPcGVuOiBPUyBzZW1hcGhvcmUgY3JlYXRpb24gZmFpbGVkIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9DT05URVhUX0ZBSUxFRDsKLSAgIH0KLQotICAgc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfU0VNQVBIT1JFIDsKLSAgICpjb250ZXh0ID0gKE00T1NBX0NvbnRleHQpc2VtYXBob3JlQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVjcmVtZW50cyAob25lIGJ5IG9uZSkgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZSBpcyBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0IFRoaXMgY2FsbCBpcyBub3QgYmxvY2tpbmcKLSAqICAgICAgICAgICAgIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlciBpcyBwb3NpdGl2ZSBvciB6ZXJvIChhZnRlcgotICogICAgICAgICAgICAgZGVjcmVtZW50YXRpb24pLiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcgaWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyCi0gKiAgICAgICAgICAgICBpcyBsZXNzIHRoYW4gemVybyAoYWZ0ZXIgZGVjcmVtZW50YXRpb24pLCB1bnRpbCB0aGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICB1cHBlciB0aGFuIHplcm8gKHNlZSBNNE9TQV9zZW1hcGhvcmVQb3N0KSBvciB0aW1lX291dCBpcwotICogICAgICAgICAgICAgcmVhY2hlZC4KLSAqIEBub3RlICAgICAgIElmICJ0aW1lb3V0IiB2YWx1ZSBpcyBNNE9TQV9XQUlUX0ZPUkVWRVIsIHRoZSBjYWxsaW5nIHRocmVhZAotICogICAgICAgICAgICAgd2lsbCBibG9jayBpbmRlZmluaXRlbHkgdW50aWwgdGhlIHNlbWFwaG9yZSAgaXMgdW5sb2NrZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHBhcmFtICAgICAgdGltZW91dDooSU4pIFRpbWUgb3V0IGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNFdBUl9USU1FX09VVDogdGltZSBvdXQgaXMgZWxhcHNlZCBiZWZvcmUgc2VtYXBob3JlIGhhcyBiZWVuCi0gKiAgICAgICAgICAgICBhdmFpbGFibGUuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlV2FpdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX0ludDMyIHRpbWVvdXQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICB0czsKLSAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgIGxlZnQ7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV9zZW1hcGhvcmVXYWl0XHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIHRpbWVvdXQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3NlbWFwaG9yZVdhaXQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIGlmICggKE00T1NBX0ludDMyKU00T1NBX1dBSVRfRk9SRVZFUiA9PSB0aW1lb3V0KQotICAgewotICAgICAgIGlmICggMCAhPSBzZW1fd2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKSApCi0gICAgICAgewotICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLQotICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB3aGlsZSAoICgoRUJVU1kgPT0gcmVzdWx0KSB8fCAoRUFHQUlOID09IHJlc3VsdCkpICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgewotICAgICAgICAgICB0cy50dl9zZWMgID0gMDsKLSAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAqIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICB0aW1lb3V0ID0gMDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBuYW5vc2xlZXAoJnRzLCAmbGVmdCk7Ci0gICAgICAgICAgIHJlc3VsdCA9IHNlbV90cnl3YWl0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotICAgICAgIH0KLSAgICAgICBpZiAoMCAhPSByZXN1bHQpCi0gICAgICAgewotICAgICAgICAgICBpZiAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfVElNRV9PVVQ7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVdhaXQ6IE9TIHNlbWFwaG9yZSB3YWl0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgfQotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGluY3JlbWVudHMgdGhlIHNlbWFwaG9yZSBjb3VudGVyLiBUaGUgc2VtYXBob3JlIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBJZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgdXBwZXIgdGhhbiB6ZXJvIChhZnRlciBhZGRpdGlvbiksCi0gKiAgICAgICAgICAgICB0aGUgTTRPU0Ffc2VtYXBob3JlV2FpdCBjYWxsIG9mIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgaXMgdW5ibG9ja2VkIGFuZCBtYWRlIHJlYWR5IHRvIHJ1bi4KLSAqIEBub3RlICAgICAgIE5vIGh5cG90aGVzZXMgY2FuIGJlIG1hZGUgb24gd2hpY2ggdGhyZWFkIHdpbGwgYmUgdW5ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlUG9zdFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVQb3N0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBzZW1fcG9zdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgc2VtYXBob3JlIChpZGVudGlmeSBieSBpdHMgY29udGV4dCkuCi0gKiAgICAgICAgICAgICBBZnRlciB0aGlzIGNhbGwgdGhlIHNlbWFwaG9yZSBhbmQgaXRzIGNvbnRleHQgaXMgbm8gbW9yZQotICogICAgICAgICAgICAgdXNlYWJsZS4gVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMKLSAqICAgICAgICAgICAgIHNlbWFwaG9yZS4KLSAqIEBub3RlICAgICAgIEl0IGlzIGFuIGFwcGxpY2F0aW9uIGlzc3VlIHRvIHdhcnJhbnQgbm8gbW9yZSB0aHJlYWRzIGFyZSBsb2NrZWQKLSAqICAgICAgICAgICAgIG9uIHRoZSBkZWxldGVkIHNlbWFwaG9yZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgc2VtYXBob3JlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9TZW1hcGhvcmVDb250ZXh0KiBzZW1hcGhvcmVDb250ZXh0ID0gKE00T1NBX1NlbWFwaG9yZUNvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9zZW1hcGhvcmVDbG9zZVx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgIHNlbV9kZXN0cm95KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUpOwotCi0gICBmcmVlKHNlbWFwaG9yZUNvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI1NDI0NS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9UaHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX1RocmVhZC5jCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgSW1wbGVtZW50cyBhbmQgbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHRocmVhZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZC5oIgotI2luY2x1ZGUgIk00T1NBX1RocmVhZF9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotCi0KLXZvaWQqIE00T1NBX3RocmVhZFN5bmNGb3JFdmVyRG8odm9pZCAqY29udGV4dCkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0Jvb2wgYXV0b19raWxsID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKgotICAgICAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvXHRcdExQVk9JRCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICAvKgotICAgICAgIHVzZXJEYXRhID0gdGhyZWFkQ29udGV4dC0+dXNlckRhdGE7Ci0gICAgKi8KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkUnVubmluZzsKLQotICAgTTRPU0Ffc2VtYXBob3JlUG9zdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICB3aGlsZSh0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBpZigodGhyZWFkQ29udGV4dC0+ZnVuYyh0aHJlYWRDb250ZXh0LT5wYXJhbSkpICE9IE00Tk9fRVJST1IpCi0gICAgICB7Ci0gICAgICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgICAgICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8vUFIgMjM1NCAtIEFDTyA6IFN1cHByZXNzIHN0b3BwaW5nIHN0YXRlIGFuZCBkb24ndAotICAgICAgICAgICAgLy8gICAgICAgICB1bmxvY2sgbXV0ZXggYmVmb3JlIGNsb3NpbmcgdGhlIHRocmVhZAotICAgICAgICAgICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgIH0KLQotICAgICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICAgICB9Ci0KLSAgICAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgfQotCi0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotCi0gICByZXR1cm4gMDsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IHRocmVhZC4gQWZ0ZXIgdGhpcyBjYWxsIHRoZSB0aHJlYWQgaXMKLSAqICAgICAgICAgICAgIGlkZW50aWZpZWQgYnkgaXRzICJjb250ZXh0Ii4gVGhlIHRocmVhZCBmdW5jdGlvbiBpcyBwcm92aWRlZCBieQotICogICAgICAgICAgICAgdGhlICJmdW5jIiBwYXJhbWV0ZXIuIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyAmIGFsbG9jYXRlcyBhIHVuaXF1ZQotICogICAgICAgICAgICAgY29udGV4dC4gSXQncyB0aGUgT1NBTCByZWFsIHRpbWUgcmVzcG9uc2liaWxpdHkgZm9yIG1hbmFnaW5nIGl0cwotICogICAgICAgICAgICAgY29udGV4dC4gSXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgTTRPU0FfdGhyZWFkU3luY0Nsb3NlIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgVGhlIGNvbnRleHQgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgdGhyZWFkCi0gKiAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZAotICogICAgICAgICAgICAgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSB0aHJlYWQsIGJ1dCB0aGUgdGhyZWFkIGlzIG5vdCBydW5uaW5nLgotICogQG5vdGUgICAgICAgT25jZSB0aGUgdGhyZWFkIGlzIGNyZWF0ZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogQHBhcmFtICAgICAgY29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIHRocmVhZAotICogQHBhcmFtICAgICAgZnVuYzooSU4pICJkb0l0IiBmdW5jdGlvbiBwb2ludGVyIHRvIHJ1bgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRDogdGhlIGNvbnRleHQgY3JlYXRpb24gZmFpbGVkCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jT3BlbihNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgZnVuYykKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfdGhyZWFkU3luY09wZW5cdFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX1RocmVhZERvSXQgMHgleCIsIGNvbnRleHQsIGZ1bmMpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihmdW5jID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNPcGVuIik7Ci0KLSAgICpjb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgdGhyZWFkQ29udGV4dCA9Ci0gICAgICAoTTRPU0FfVGhyZWFkQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9UaHJlYWRDb250ZXh0KSwKLSAgICAgIE00T1NBX1RIUkVBRCwgKE00T1NBX0NoYXIqKSJNNE9TQV90aHJlYWRTeW5jT3BlbjogdGhyZWFkIGNvbnRleHQiKTsKLQotICAgaWYodGhyZWFkQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgewotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPmZ1bmMgPSBmdW5jOwotICAgdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplID0gNjQgKiAxMDI0OwotICAgdGhyZWFkQ29udGV4dC0+bmFtZSA9IE00T1NBX05VTEw7Ci0gICB0aHJlYWRDb250ZXh0LT50aHJlYWRJRCA9IDA7Ci0gICB0aHJlYWRDb250ZXh0LT5jb3JlSUQgPSBNNE9TQV9USFJFQUQ7Ci0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0gICB0aHJlYWRDb250ZXh0LT5wcmlvcml0eSA9IE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eSA7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhPcGVuKCYodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCkpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0FfbXV0ZXhPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVPcGVuKCYodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKSwgMCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNPcGVuOiBNNE9TQV9zZW1hcGhvcmVPcGVuIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgKmNvbnRleHQgPSB0aHJlYWRDb250ZXh0OwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHJ1bnMgYSBzcGVjaWZpZWQgdGhyZWFkLiBUaGUgInBhcmFtIiBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2V0IGEgc3BlY2lmaWMgcGFyYW1ldGVyIHRvIHRoZQotICogICAgICAgICAgICAgY3JlYXRlZCB0aHJlYWQuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2Vjb25kIG9uZSBvZgotICogICAgICAgICAgICAgdGhlICJNNE9TQV9UaHJlYWREb0l0IiBmdW5jdGlvbi4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIGlzIGEgYmxvY2tpbmcgdXAgdG8gdGhlIHRocmVhZCBpcyBydW5uaW5nLgotICogICAgICAgICAgICAgQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdGFydGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBydW5uaW5nLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZFJ1bm5pbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LiBJZiB0aGUgInRocmVhZFN0YXJ0ZWQiIG9wdGlvbklECi0gKiAgICAgICAgICAgICBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIGRvSXQKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIHBhcmFtOihJTikgQXBwbGljYXRpb24gZGF0YSB0aHJlYWQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRDogdGhlIHRocmVhZCBkaWQgbm90IHN0YXJ0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTdGFydChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBhcmFtKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9ICAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIHB0aHJlYWRfYXR0cl90ICAgICBhdHRyaWJ1dGUgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgIGludCAgICAgICAgICAgICAgICBtaW4gICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIG1heCAgICAgICA9IDA7Ci0gICBpbnQgICAgICAgICAgICAgICAgcHJpb3JpdHkgID0gMDsKLSAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZCAgICAgPSB7IDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1ZvaWQqICIKLSAgICAgICAgICAgICAgICAgICIweCV4IiwgY29udGV4dCwgcGFyYW0pOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0YXJ0aW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLSAgIHRocmVhZENvbnRleHQtPnBhcmFtID0gcGFyYW07Ci0KLSAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfaW5pdCggJmF0dHJpYnV0ZSApICkKLSAgIHsKLSAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEICkgKQotICAgICAgewotICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoICZhdHRyaWJ1dGUsIChzaXplX3QpdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplICkgKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSggJmF0dHJpYnV0ZSwgU0NIRURfT1RIRVIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGVudGF0aXZlIHBhdGNoZXMgdG8gaGFuZGxlIHByaW9yaXRpZXMgaW4gYSBiZXR0ZXIgd2F5IDogKi8KLSAgICAgICAgICAgICAgICAvKiBVc2UgQW5kcm9pZCdzIHByZWRlZmluZWQgcHJpb3JpdGllcyAocmFuZ2UgKzE5Li4tMjApCi0gICAgICAgICAgICAgICAgICpyYXRoZXIgdGhhbiBMaW51eCBvbmVzICgwLi45OSkqLwotCi0gICAgICAgICAgICAgICAgLyogR2V0IG1pbiBhbmQgbWF4IHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICBtaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKCBTQ0hFRF9GSUZPICk7Ci0gICAgICAgICAgICAgICAgbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heCggU0NIRURfRklGTyApOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNTdGFydCBNQVg9JWQgTUlOPSVkIiwgbWF4LCBtaW4pOwotCi0gICAgICAgICAgICAgICAgLyogdGVudGF0aXZlIG1vZGlmaWNhdGlvbiBvZiB0aGUgcHJpb3JpdGllcyAqLwotICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHJpb3JpdHkgYmFzZWQgb24gZGVmYXVsdCBhbmRyb2lkIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBUaGlzIHByb2JhYmx5IHJlcXVpcmVzIHNvbWUgbW9yZSB0dW5pbmcsCi0gICAgICAgICAgICAgICAgICogb3V0Y29tZSBvZiB0aGlzIHByaW9yaXR5IHNldHRpbmdzIGFyZSBub3QgeWV0IHNhdGlzZmFjdG9yeSAqLwotICAgICAgICAgICAgICAgIC8qIEltcGxlbWVudGluZyB0aHJlYWQgaGFuZGxpbmcgYmFzZWQgb24gQW5kcm9pZCdzIHRocmVhZCBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAqIGhlbHBlcnMgbWlnaHQgYnJpbmcgc29tZSBpbXByb3ZlbWVudCAoc2VlIHRocmVhZHMuaCkgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2godGhyZWFkQ29udGV4dC0+cHJpb3JpdHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfTk9STUFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZE5vcm1hbFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzY2hlZC5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OwotCi0gICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCAmYXR0cmlidXRlLCAmc2NoZWQgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIDAgPT0gcHRocmVhZF9jcmVhdGUoICZ0aHJlYWRDb250ZXh0LT50aHJlYWRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGhyZWFkQ29udGV4dCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBNNE9TQV9GQUxTRSA9PSBNNE9TQV9FUlJfSVNfRVJST1IoIE00T1NBX3NlbWFwaG9yZVdhaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfV0FJVF9GT1JFVkVSICkgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSggJmF0dHJpYnV0ZSApOwotICAgfQotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0FfREVCVUcoTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVELCAiTTRPU0FfdGhyZWFkU3luY1N0YXJ0Iik7Ci0KLSAgIHJldHVybiBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2Qgc3RvcHMgYSBzcGVjaWZpZWQgdGhyZWFkLgotICogQG5vdGUgICAgICAgVGhpcyBjYWxsIGlzIGEgYmxvY2tpbmcgb25lIHVwIHRvIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgIEJlZm9yZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRTdG9wcGluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBzdG9wcGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBub3RlICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgb25jZSB0aGUgdGhyZWFkIGhhcyBiZWVuIHN0b3BwZWQuIElmIHRoZQotICogICAgICAgICAgICAgInRocmVhZFN0b3BwZWQiIG9wdGlvbklEIGlzIG5vdCBOVUxMLCB0aGUgdGhyZWFkIHdpbGwgY2FsbCBpdAotICogICAgICAgICAgICAgYmVmb3JlIGR5aW5nLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jU3RvcFx0XHRNNE9TQV9Db250ZXh0IDB4JXgiLCBjb250ZXh0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkUnVubmluZykKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTdG9wIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkU3RvcHBpbmc7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBNNE9TQV9zZW1hcGhvcmVXYWl0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSB0aHJlYWQgKGlkZW50aWZpZWQgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsIHRoZSB0aHJlYWQgYW5kIGl0cyBjb250ZXh0IGFyZSBubyBtb3JlIHVzZWFibGUuIFRoaXMKLSAqICAgICAgICAgICAgIGZ1bmN0aW9uIGZyZWVzIGFsbCB0aGUgbWVtb3J5IHJlbGF0ZWQgdG8gdGhpcyB0aHJlYWQuCi0gKiBAbm90ZSAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkT3BlbmVkLgotICogICAgICAgICAgICAgT25jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRDbG9zZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNDbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9FUlIgZXJyX2NvZGU7Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTeW5jQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5zdGF0ZSA9PSBNNE9TQV9rVGhyZWFkQ2xvc2VkLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICBpZih0aHJlYWRDb250ZXh0LT5zdGF0ZSAhPSBNNE9TQV9rVGhyZWFkT3BlbmVkKQotICAgewotICAgICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX1NUQVRFLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkQ2xvc2VkOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgZXJyX2NvZGUgPSBNNE9TQV9tdXRleENsb3NlKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX211dGV4Q2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBlcnJfY29kZSA9IE00T1NBX3NlbWFwaG9yZUNsb3NlKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLSAgIGlmKE00T1NBX0VSUl9JU19FUlJPUihlcnJfY29kZSkpCi0gICB7Ci0gICAgICBNNE9TQV9ERUJVRyhlcnJfY29kZSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZTogTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgICAgcmV0dXJuIGVycl9jb2RlOwotICAgfQotCi0gICBpZih0aHJlYWRDb250ZXh0LT5uYW1lICE9IE00T1NBX05VTEwpCi0gICB7Ci0gICAgICBmcmVlKHRocmVhZENvbnRleHQtPm5hbWUpOwotICAgfQotCi0gICBmcmVlKHRocmVhZENvbnRleHQpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSB0aHJlYWQgdG8gcmV0dXJuIGl0cyBzdGF0ZS4KLSAqIEBub3RlICAgICAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgZmllbGQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTikgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBzdGF0ZTooT1VUKSBUaHJlYWQgc3RhdGUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZFN0YXRlKiBzdGF0ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWRTdGF0ZSogMHgleCIsIGNvbnRleHQsIHN0YXRlKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHN0YXRlID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgICpzdGF0ZSA9IHRocmVhZENvbnRleHQtPnN0YXRlOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjYWxsaW5nIHRocmVhZCB0byBzbGVlcCBkdXJpbmcgInRpbWVTbGVlcCIKLSAqICAgICAgICAgICAgIG1pbGxpc2Vjb25kcy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICAgIHRpbWU6KElOKSBUaW1lIHRvIHNsZWVwIGluIG1pbGxpc2Vjb25kcwotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU2xlZXAoTTRPU0FfVUludDMyIHRpbWUpCi17Ci0gICBzdHJ1Y3QgdGltZXNwZWMgcnF0cCA9IHsgMCwgMCB9OwotICAgc3RydWN0IHRpbWVzcGVjIHJtdHAgPSB7IDAsIDAgfTsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3RocmVhZFNsZWVwXHRcdE00T1NBX1VJbnQzMiAlZCIsIHRpbWUpOwotCi0gICBycXRwLnR2X3NlYyA9ICh0aW1lX3QpdGltZS8xMDAwOwotICAgcnF0cC50dl9uc2VjID0gKHRpbWUlMTAwMCkgKiAxMDAwMDAwOwotICAgbmFub3NsZWVwKCZycXRwLCAmcm10cCk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0KLU00T1NBX0VSUiBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsIHByaW9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKShvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX1RSQUNFMl8yKCJNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHlcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfRGF0YU9wdGlvbiAweCV4IiwgY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICBpZigoTTRPU0FfVUludDMyKW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKLSAgIHsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOwotICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgfQotCi0gICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgbmFtZVNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiluYW1lKSsxOwotCi0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KLSAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7Ci0KLSAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KCh2b2lkICopdGhyZWFkQ29udGV4dC0+bmFtZSwgKHZvaWQgKiluYW1lLAotICAgICAgICAgICAgICAgICAgIG5hbWVTaXplKTsKLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIpb3B0aW9uVmFsdWU7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBPU0FMLVRocmVhZCBjb21wb25lbnQgdG8gc2V0IHRoZSB2YWx1ZQotICogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBvZiBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICAidmFsdWUiIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weSB0aGlzIGZpZWxkIHRvIGl0cyBpbnRlcm5hbAotICogICAgICAgICAgICAgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9TVEFURTogdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX1JFQURfT05MWTogdGhpcyBvcHRpb24gaXMgYSByZWFkIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAoTTRPU0FfVGhyZWFkQ29udGV4dCopY29udGV4dDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb25cdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfT3B0aW9uSUQgJWRcdE00T1NBX0RhdGFPcHRpb24gMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9USFJFQUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgIH0KLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jUHJpb3JpdHkoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWROYW1lOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jTmFtZShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkU3RhY2tTaXplOgotICAgICAgewotICAgICAgICAgZXJyX2NvZGUgPSBNNE9TQV9TZXRUaHJlYWRTeW5jU3RhY2tTaXplKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSovCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgICAgICAgIGVycl9jb2RlID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgfQotICAgfQotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgcmV0dXJuIGVycl9jb2RlOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBPU0FMLVRocmVhZCB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICAib3B0aW9uVmFsdWUiIG11c3QgYmUgY2FzdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgcmVsYXRlZCB0byB0aGUKLSAqICAgICAgICAgICAgIG9wdGlvbklELgotICogQG5vdGUgICAgICAgQXMgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGUtYWxsb2NhdGluZyB0aGUgInZhbHVlIgotICogICAgICAgICAgICAgZmllbGQsIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCBtdXN0IHBlcmZvcm0gYSBjb3B5IG9mIGl0cwotICogICAgICAgICAgICAgaW50ZXJuYWwgdmFsdWUgdG8gdGhlIHZhbHVlIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgb3B0aW9uSUQ6KElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICBvcHRpb25WYWx1ZTooT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfV1JJVEVfT05MWTogdGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiogMHgleCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKG9wdGlvbklEID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uVmFsdWUgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1dSSVRFX09OTFksICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIHN3aXRjaChvcHRpb25JRCkKLSAgIHsKLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRQcmlvcml0eToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqIHByaW9yaXR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9UaHJlYWRQcmlvcml0eUxldmVsKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKnByaW9yaXR5ID0gdGhyZWFkQ29udGV4dC0+cHJpb3JpdHk7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9DaGFyKiogbmFtZSA9IChNNE9TQV9DaGFyKiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpuYW1lID0gdGhyZWFkQ29udGV4dC0+bmFtZTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBNNE9TQV9VSW50MzIqIHN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqc3RhY2tTaXplID0gdGhyZWFkQ29udGV4dC0+c3RhY2tTaXplOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmNiYTk0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX0RlYnVnVHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICBNNFBTV19EZWJ1Z1RyYWNlLmMKLSAqIEBicmllZiAgICAgIERlZmF1bHQgdHJhY2UgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyBtYWNyb3MKLSAqIEBub3RlICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhY2UgZnVuY3Rpb24KLSAqICAgICAgICAgICAgIHVzZWQgaW4gdGhlIGRlYnVnIGluc3RydW1lbnRhdGlvbiBtYWNyb3MsIGJhc2VkIG9uIHByaW50Zi4KLSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHdyaXRlcnMgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gaW1wbGVtZW50IHRoZWlyCi0gKiAgICAgICAgICAgICBvd24gIk00T1NBX0RlYnVnVHJhY2UiLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qI2RlZmluZSBOT19GSUxFICovIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfRGVidWdUcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBjaGFyKiBmaWxlLCBNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLCBjaGFyKiBtc2csIE00T1NBX0VSUiBlcnIpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2FsbGVkIGluIHRoZSBkZWJ1ZyBtYWNyb3Mgb25seS4KLSAqICAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHByaW50Zi4KLSAqIEBwYXJhbSAgICBsaW5lIChJTik6IHRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIGZpbGUKLSAqIEBwYXJhbSAgICBmaWxlIChJTik6IHRoZSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgbXNnIChJTik6IHRoZSBlcnJvciBtZXNzYWdlCi0gKiBAcGFyYW0gICAgZXJyIChJTik6IHRoZSByZXR1cm4gdmFsdWUgKGVycm9yIGNvZGUpCi0gKiBAcmV0dXJuICAgIG5vbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVycikKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgLyogdHJ5IHRvICJpbmRlbnQiIHRoZSByZXN1bHRpbmcgdHJhY2VzIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgKi8KLSAgICBmb3IgKGkgPTAgOyBpIDwgbGV2ZWw7IGkgKyspCi0gICAgewotICAgICAgICBwcmludGYoIiAiKTsKLSAgICB9Ci0KLSNpZmRlZiBOT19GSUxFCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXNcbiIsZXJyLGNvbmQsbXNnKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgcHJpbnRmKCJFcnJvcjogJWxpLCBvbiAlczogJXMgTGluZSAlbHUgaW46ICVzXG4iLGVycixjb25kLG1zZyxsaW5lLGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcikKLXsKLSAgICBNNE9TQV9EZWJ1Z1RyYWNlKGxpbmUsIGZpbGVOYW1lLCBsZXZlbCwgc3RyaW5nQ29uZGl0aW9uLCBtZXNzYWdlLCByZXR1cm5lZEVycm9yKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWE0Y2NlYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19NZW1vcnlJbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UFNXX01lbW9yeUludGVyZmFjZS5jCi0gKiBAYnJpZWYgIE1lbW9yeSBJbnRlcmZhY2UKLSAqIEBub3RlICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIG9zYWwgbWVtb3J5IGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpZm5kZWYgTTRWUFNfQURWQU5DRURfTUVNT1JZX01BTkFHRVIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZuICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBtZW1vcnkgYmxvY2sgKGF0IGxlYXN0IDMyIGJpdHMgYWxpZ25lZCkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgICBzaXplIChJTik6IHNpemUgb2YgYWxsb2NhdGVkIGJsb2NrIGluIGJ5dGVzCi0gKiBAcGFyYW0gICAgICBjb3JlSUQgKElOKTogaWRlbnRpZmljYXRpb24gb2YgdGhlIGNhbGxlciBjb21wb25lbnQKLSAqIEBwYXJhbSAgICAgIHN0cmluZyAoSU4pOiBkZXNjcmlwdGlvbiBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIChudWxsIHRlcm1pbmF0ZWQpCi0gKiBAcmV0dXJuICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE00T1NBX05VTEwgaWYgbm8gbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfTWVtQWRkcjMyIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nKQotewotICAgIE00T1NBX01lbUFkZHIzMiBBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqIElmIHNpemUgaXMgMCwgbWFsbG9jIG9uIFdJTiBPUyBhbGxvY2F0ZXMgYSB6ZXJvLWxlbmd0aCBpdGVtIGluCi0gICAgICogdGhlIGhlYXAgYW5kIHJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHRoYXQgaXRlbS4KLSAgICAgKiBPbiBvdGhlciBwbGF0Zm9ybXMsIG1hbGxvYyBjb3VsZCByZXR1cm5zIGFuIGludmFsaWQgcG9pbnRlcgotICAgICAqIFNvLCBET04nVCBhbGxvY2F0ZSBtZW1vcnkgb2YgMCBieXRlICovCi0gICAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBZGRyZXNzOwotICAgIH0KLQotICAgIGlmIChzaXplJTQgIT0gMCkKLSAgICB7Ci0gICAgICAgIHNpemUgPSBzaXplICsgNCAtIChzaXplJTQpOwotICAgIH0KLQotICAgIEFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKSBtYWxsb2Moc2l6ZSk7Ci0KLSAgICByZXR1cm4gQWRkcmVzczsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmM2Q5YTFmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX1RyYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00UFNXX1RyYWNlLmMKLSAqIEBicmllZiAgICAgICAgVHJhY2UgZnVuY3Rpb24gZm9yIHRyYWNlIG1hY3JvcwotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBnaXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyYWNlIGZ1bmN0aW9uIHVzZWQKLSAqICAgICAgICAgICAgICAgIGluIHRoZSB0cmFjZSBpbnN0cnVtZW50YXRpb24gbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPiAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jZGVmaW5lIE5PX0ZJTEUgLyogc3VwcHJlc3NlcyB0aGUgZmlsZSBuYW1lIHByaW50IG91dCAqLwotCi0jZGVmaW5lIE1BWF9TVFJJTkdfU0laRSAxMDI0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICxNNE9TQV9JbnQzMiBsZXZlbCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSB0cmFjZSBmb3IgZGVidWcgdGVzdHMKLSAqIEBub3RlICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuIEZpcnN0IHRoZSB2YXJpYWJsZXMgYXJlIHJldHJpZXZlZCB1c2luZwotICogICAgICAgICAgICBBTlNJIEMgZGVmcyBhbmQgbWFjcm9zIHdoaWNoIGVuYWJsZSB0byBhY2Nlc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgotICogICAgICAgICAgICBUaGVuIHRoZSBwcmludGYgaXMgZG9uZSAod2l0aCBzb21lIG9ybmVtZW50YWwgYWRkcykuCi0gKiBAcGFyYW0gICAgbGV2ZWwgKElOKTogdGhlIGRlYnVnIGxldmVsCi0gKiBAcGFyYW0gICAgZm9ybWF0IChJTik6IHRoZSAicHJpbnRmIiBmb3JtYXRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICAuLi4gKElOKTogYXMgbWFueSBwYXJhbWV0ZXJzIGFzIHJlcXVpcmVkIC4uLgotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9UcmFjZShNNE9TQV9JbnQzMiBsaW5lLCBNNE9TQV9DaGFyKiBmaWxlICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfQ2hhciogZm9ybWF0LCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UcmFjZSIsICIlcyIsIChjaGFyKiltZXNzYWdlKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgTTRPU0FfVm9pZCBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKE00T1NBX1VJbnQzMiBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBzdHJpbmdNc2csIC4uLikKLXsKLSAgICBNNE9TQV9DaGFyIG1lc3NhZ2VbTUFYX1NUUklOR19TSVpFXTsKLSAgICBNNE9TQV9JbnQzMiBpOwotICAgIHZhX2xpc3QgbWFya2VyOyAvKiBwb2ludGVyIHRvIGxpc3Qgb2YgYXJndW1lbnRzICovCi0KLSAgICAvKiBnZXQgdGhlIHZhciBhcmd1bWVudHMgaW50byB0aGUgc3RyaW5nIG1lc3NhZ2UgdG8gYmUgYWJsZSB0byBwcmludCAqLwotICAgIHZhX3N0YXJ0KG1hcmtlcixzdHJpbmdNc2cpOyAvKiBzZXQgcHRyIHRvIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uICovCi0gICAgdnNwcmludGYoKGNoYXIgKiltZXNzYWdlLCAoY29uc3QgY2hhciAqKXN0cmluZ01zZyxtYXJrZXIgKTsgIC8qIGZvcm1hdHMgYW5kIHdyaXRlcyB0aGUgZGF0YSBpbnRvIG1lc3NhZ2UgKi8KLSAgICB2YV9lbmQobWFya2VyKTsgLyogcmVzZXQgcG9pbnRlciB0byBOVUxMICovCi0KLSAgICAvKiBkbyB0aGUgYWN0dWFsIHByaW50ICovCi0jaWZkZWYgTk9fRklMRQotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24iLCAiJXMiLCAiJXMgYXQgJWx1IGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXNzYWdlLCBsaW5lLCAoY2hhciopZmlsZSk7Ci0jZW5kaWYgLyogTk9fRklMRSAgICAgKi8KLQotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVmOWQxNmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1R5cGVzLmgKLSAqIEBicmllZiAgIERlZmluaXRpb24gb2YgdHlwZXMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIE00TVA0V19UWVBFU19ICi0jZGVmaW5lIE00TVA0V19UWVBFU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRDX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICBJbmZvcm1hdGlvbiB0byBidWlsZCB0aGUgJ2Z0eXAnIGF0b20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QQUNfRlRZUF9UQUcgMHg2Njc0Nzk3MCAvKiAnZnR5cCcgKi8KLSNkZWZpbmUgTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EUyAxMAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbGwgYnJhbmQgZmllbGRzIGFyZSBhY3R1YWxseSBjaGFyWzRdIHN0b3JlZCBpbiBiaWctZW5kaWFuIGludGVnZXIgZm9ybWF0ICovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbWFqb3JfYnJhbmQ7ICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgIC8qIGdlbmVyYWxseSAnMDAwMCcgb3IgJ3gueCAnICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBuYkNvbXBhdGlibGVCcmFuZHM7ICAvKiBudW1iZXIgb2YgY29tcGF0aWJsZSBicmFuZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY29tcGF0aWJsZV9icmFuZHNbTTRNUEFDX01BWF9DT01QQVRJQkxFX0JSQU5EU107ICAgLyogYXJyYXkgb2YgbWF4IGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRzICovCi19IE00TVA0Q19GdHlwQm94OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19tZW1BZGRyCi0gKiBAYnJpZWYgICAgICAgIEJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBzaXplOwotICAgIE00T1NBX01lbUFkZHIzMiAgICBhZGRyOwotfSBNNE1QNFdfbWVtQWRkcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaW1lIHR5cGUgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9VSW50MzIgTTRNUDRXX1RpbWUzMjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgIE00TVA0V19TdGF0ZQotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgICBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgaW50ZXJuYWx5LCBidXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIG91dHNpZGUKLSAqICAgICAgICAgICAgICAgdGhlIHdyaXRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX29wZW5lZCAgICAgICAgICAgID0gMHgxMDAsCi0gICAgTTRNUDRXX3JlYWR5ICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgTTRNUDRXX3dyaXRpbmcgICAgICAgICAgID0gMHgzMDAsCi0gICAgTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSAgID0gMHgzMDEsCi0gICAgTTRNUDRXX2Nsb3NlZCAgICAgICAgICAgID0gMHg0MDAKLX0gTTRNUDRXX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00TVA0V19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBNUDQgd3JpdGVyIG9wdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGVzZSBvcHRpb25zIGdpdmUgcGFyYW1ldGVycyBmb3IgdGhlIGNvcmUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1QNFdfbWF4QVVwZXJDaHVuayAgICAgICAgPSAweEMxMDEsCi0gICAgTTRNUDRXX21heENodW5rU2l6ZSAgICAgICAgID0gMHhDMTAyLAotICAgIE00TVA0V19tYXhDaHVua0ludGVyICAgICAgICA9IDB4QzEwMywKLSAgICBNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayAgICAgPSAweEMxMDQsCi0gICAgTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrICAgID0gMHhDMTA1LAotICAgIE00TVA0V19tYXhBVXNpemUgICAgICAgICAgICA9IDB4QzEwNiwKLSAgICBNNE1QNFdfSU9EICAgICAgICAgICAgICAgICAgPSAweEMxMTEsCi0gICAgTTRNUDRXX0VTRCAgICAgICAgICAgICAgICAgID0gMHhDMTEyLAotICAgIE00TVA0V19TRFAgICAgICAgICAgICAgICAgICA9IDB4QzExMywKLSAgICBNNE1QNFdfdHJhY2tTaXplICAgICAgICAgICAgPSAweEMxMTQsCi0gICAgTTRNUDRXX01PT1ZmaXJzdCAgICAgICAgICAgID0gMHhDMTIxLAotICAgIE00TVA0V19WMl9NT09GICAgICAgICAgICAgICA9IDB4QzEzMSwKLSAgICBNNE1QNFdfVjJfdGJsQ29tcHJlcyAgICAgICAgPSAweEMxMzIsCi0gICAgLyp3YXJuaW5nOiB1bnNwZWNpZmllZCBvcHRpb25zOiovCi0gICAgTTRNUDRXX21heEZpbGVTaXplICAgICAgICAgID0gMHhDMTUyLAotICAgIE00TVA0V19DYW1jb2RlclZlcnNpb24gICAgICA9IDB4QzE1MywgLyowMDAgdG8gOTk5ICEqLwotICAgIE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSAgICA9IDB4QzE1NCwgLyphdWRpbyBBVXMgYXJlIHByb2Nlc3NlZCBhZnRlciB0aGUgdmlkZW8sICovCi0gICAgLyp0aGlzIG9wdGlvbiBNVVNUIE5PVCBiZSBzZXQgaWYgbm9uIGNvbnN0YW50IGF1ZGlvCi0gICAgZnJhbWUgc2l6ZSAoZS5nLiBpZiBTSUQpKi8KLSAgICBNNE1QNFdfZW1iZWRkZWRTdHJpbmcgICAgICAgPSAweEMxNTUsCi0gICAgTTRNUDRXX2ludGVncmF0aW9uVGFnICAgICAgID0gMHhDMTU2LAotICAgIE00TVA0V19tYXhGaWxlRHVyYXRpb24gICAgICA9IDB4QzE1NywKLSAgICBNNE1QNFdfc2V0RnR5cEJveCAgICAgICAgICAgPSAweEMxNTgsCi0gICAgTTRNUDRXX0RTSSAgICAgICAgICAgICAgICAgID0gMHhDMTU5LAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi0gICAgTTRNUDRXX01VTF9QUFNfU1BTICAgICAgICAgID0gMHhDMTYwLAotICAgIC8qIEguMjY0IHRyaW1taW5nICovCi19IE00TVA0V19PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBdWRpbyAmIHZpZGVvIHN0cmVhbSBJRHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBBdWRpb1N0cmVhbUlEIDEKLSNkZWZpbmUgVmlkZW9TdHJlYW1JRCAyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGVmYXVsdCBwYXJhbWV0ZXJzIHZhbHVlcywgdGhhdCBjYW4gYmUgbW9kaWZpZWQgYnkgTTRNUDRXX3NldE9wdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0V2lkdGggMzIwCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0SGVpZ2h0IDI0MAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdE1heEF1U2l6ZSAgNDA5NiAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemUgMTAwMDAwIC8qYnl0ZXMqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEludGVybGVhdmVEdXIgMCAvKmJ5dGVzKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfU3RyZWFtSURzaXplCi0gKiBAYnJpZWYgICAgICAgIFZpZGVvIHBsYW5lIHNpemUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRDsKLSAgICBNNE9TQV9VSW50MTYgICAgaGVpZ2h0OwotICAgIE00T1NBX1VJbnQxNiAgICB3aWR0aDsKLX0gTTRNUDRXX1N0cmVhbUlEc2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB0cmFjayBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFNZU19TdHJlYW1UeXBlICAgIHRyYWNrVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHRpbWVzY2FsZTsgICAgICAgICAgLyogVCAodmlkZW89MTAwMCksIChBTVI4PTgwMDApLCAoQU1SMTY9MTYwMDApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNhbXBsZVNpemU7ICAgICAgICAgLyogUyAodmlkZW89MCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc3R0c1RhYmxlRW50cnlOYjsgICAvKiBKIChhdWRpbz0xKSovCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgbGFzdENUUzsgICAgICAgICAgIC8qIENUUyBvZiB0aGUgcHJldmlvdXMgQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgdG8gMC5HaXZlcyBkdXJhdGlvbiBhdCB0aGUgZW5kLiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVOYjsgICAgICAgICAgIC8qIEsgKGF1ZGlvPUYpKi8KLX0gTTRNUDRXX1RyYWNrRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIGF1ZGlvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3M7ICAgICAgICAgLyogSW5pdCB0byAwICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2VuZGlmCi0gICAgTTRNUDRXX1RpbWUzMiAgICAgICAgICAgc2FtcGxlRHVyYXRpb247ICAgICAvKiBDaGVjayAoQU1SOD0xNjApLCAoQU1SMTY9MzIwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4QVVTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBMYXN0QWxsb2NhdGVkQ2h1bms7Ci0gICAgLyogcHJldmlvdXNseSwgYXVkaW8gYXUgc2l6ZSB3YXMgc3VwcG9zZWQgY29uc3RhbnQsCi0gICAgICogd2hpY2ggaXMgYWN0dWFsbHkgbm90IHRoZSBjYXNlIGlmIHNpbGVuY2VzIChzaWQpLiovCi0gICAgLyogYXQgZmlyc3QgYXVkaW8gYXUsIHNhbXBsZVNpemUgaXMgc2V0LiBJdCBpcyBsYXRlciByZXNldCB0byAwIGlmIG5vbiBjb25zdGFudCBzaXplLiovCi0gICAgLyogU28gc2FtcGxlU2l6ZSBzaG91bGQgYmUgdGVzdGVkIHRvIGtub3cgd2VpdGhlciBvciBub3QgdGhlcmUgaXMgYSBUQUJMRV9TVFNaLiAqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUU1o7IC8qIHRhYmxlIHNpemUgaXMgNEsqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbWF4Qml0cmF0ZTsgICAgIC8qbm90IHVzZWQgaW4gYW1yIGNhc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgQU1SICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgOSBieXRlcyBmb3IgQU1SICovCi19IE00TVA0V19BdWRpb1RyYWNrRGF0YTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgY29yZSBNUDQgd3JpdGVyIHZpZGVvIHNwZWNpZmljIHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgIG1pY3JvU3RhdGU7Ci0gICAgTTRNUDRXX1RyYWNrRGF0YSAgICAgICAgQ29tbW9uRGF0YTsKLSAgICBNNE9TQV9VQ2hhcioqICAgICAgICAgICBDaHVuazsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1NpemVUYWJsZTsKLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlOwotICAgIE00TVA0V19UaW1lMzIqICAgICAgICAgIGNodW5rVGltZU1zVGFibGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudENodW5rOyAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFBvcyA7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50U3RzYzsgICAgICAgICAgICAgLyogSW5pdCB0byAwKi8KLSNlbmRpZgotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHN0c3NUYWJsZUVudHJ5TmIgOyAgICAgICAvKiBOKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgICAgLyogWCovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFkqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIFRBQkxFX1NUVFM7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIEoqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDE2KiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgMksqLwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyA0SyovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBOKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVcGVyQ2h1bms7ICAgICAgICAgICAvKkluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhDaHVua1NpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heEFVU2l6ZTsgICAgICAgICAgICAgICAvKkluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgYXZnQml0cmF0ZTsKLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICBEU0k7ICAgICAgICAgICAgLyogRGVjb2RlciBTcGVjaWZpYyBJbmZvOiBNYXkgYmUgTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdGVkKSBmb3IgSDI2MyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgZHNpU2l6ZTsgICAgICAgIC8qIERTSSBzaXplLCBhbHdheXMgNyBieXRlcyBmb3IgSDI2MyAqLwotfSBNNE1QNFdfVmlkZW9UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19NcDRGaWxlRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBwcml2YXRlIGNvbnRleHQgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRNUDRXX1N0YXRlICAgICAgICAgICAgICAgICAgc3RhdGU7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgdXJsOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOyAgICAvKiBEIGluIG1zLCBtYXggZHVyYXRpb24gb2YgYXVkaW8mdmlkZW8qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGZpbGVzaXplOyAgICAvKiBhY3R1YWwgZmlsZXNpemUgaW4gYnl0ZXMqLwotICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YSogICAgICAgIGF1ZGlvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW87Ci0gICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhKiAgICAgICAgdmlkZW9UcmFja1B0cjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhDaHVua1NpemU7ICAgICAgIC8qIEluaXQgdG8gMTAwMDAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gNDA5NiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4RmlsZVNpemU7ICAgICAgICAvKiBJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7ICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkLCBtcyovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQcmVXcml0ZUNhbGxCYWNrOyovICAgIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICAvKiBNNE1QNFdfV3JpdGVDYWxsQmFjayAgICAgICAgICAgIFBvc3RXcml0ZUNhbGxCYWNrOyovIC8qSW5pdCB0byBNNE9TQV9OVUxMKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBmaWxlV3JpdGVyRnVuY3Rpb25zOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIGZpbGVSZWFkZXJGdW5jdGlvbnM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgY2FtY29kZXJWZXJzaW9uOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplOyAgLyogZGVmYXVsdCBpcyBmYWxzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgYXVkaW9Nc0NodW5rRHVyOyAgICAvKiBpbiBtcywgc2V0IG9ubHkgaWYgZXN0aW1hdGVBdWRpb1NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRydWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNTdG9wVGltZTsgICAgLyogdGltZSB0byBzdG9wIGF1ZGlvLCBzZXQgb25seSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVBdWRpb1NpemUgaXMgdHJ1ZSovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQ7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGFic29sdXRlQ3VycmVudFBvczsgLyogbmV3IGZpZWxkIGZvciBvZmZzZXQgdXBkYXRlKi8KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgZW1iZWRkZWRTdHJpbmc7ICAgICAvKiAxNiBieXRlcyBzdHJpbmcsIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbiBpZiBOVUxMKi8KLSAgICBNNE9TQV9VQ2hhciogICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvblRhZzsgICAgIC8qIDYwIGJ5dGVzIHN0cmluZywgbWVtc2V0IHRvIDAgaWYgTlVMTCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVEdXJhdGlvbjsgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNENfRnR5cEJveCAgICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgIC8qIGZ0eXAgYXRvbSwgaWYgbm90IGRlZmluZWQgc2V0IG1ham9yX2JyYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsIHdpbGwgdXNlIGRlZmF1bHQgYm94ICovCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgc2FmZXR5RmlsZVVybDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5TYWZldHlGaWxlOwotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTVVMUFBTU1BTOwotfSBNNE1QNFdfTXA0RmlsZURhdGE7Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVFlQRVNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiZTdhYmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmgKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZGVjbGFyYXRpb24gZm9yIHRoZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVVRJTFNfSAotI2RlZmluZSBNNE1QNFdfVVRJTFNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFV0aWxpdHkgZnVuY3Rpb25zIHRvIHdyaXRlIGRhdGEgaW4gYmlnIGVuZGlhbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTE2KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUyNChNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdyaXRlIGEgYnVsayBvZiBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBmaWxlLCBzaXplIGlzIGdpdmVuIGluIGJ5dGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IHRoZSAnbmInIHVuc2lnbmVkIGludGVnZXJzIGluICd0YWInIHRhYmxlIGZyb20gTEUgaW50byBCRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb252ZXJ0IGFuIHVuc2lnbmVkIDMyIGJpdHMgaW50ZWdlciBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlLWFsbG9jYXRpb24gZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZS1hbGxvY2F0ZSB0aGUgY29udGV4dAotICogVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIGluIHRoZSB3cml0ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlLCBidXQgaXMgY2FsbGVkIGZyb20KLSAqIHRoZSBmdW5jdGlvbiBNNE1QNFdfY2xvc2VXcml0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFB1dCBIaSBhbmQgTG8gdTE2IHBhcnQgaW4gYSB1MzIgdmFyaWFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSk7Ci1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IExvKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIpOwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYik7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKk00TVA0V19VVElMU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9pbmMvTTRNUDRXX1dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNzNhMjIzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmgKLSAqIEBicmllZiAgIENvcmUgTVA0IHdyaXRlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTVA0IHdyaXRlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogICAgICAgICAgVGhlIE1QNCB3cml0ZXIgc3BlY2lmaWMgdHlwZXMgYXJlIGRlZmluZWQgaW4gZmlsZSBNNE1QNFdfVHlwZXMuaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZuZGVmIE00TVA0V19XUklURVJfSAotI2RlZmluZSBNNE1QNFdfV1JJVEVSX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1QNFcgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIE00V0FSX01QNFdfT1ZFUlNJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNE1QNF9XUklURVIgLDB4MDAwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgTVA0VyB2ZXJzaW9uCi0gKiBAcGFyYW0gICAgbWFqb3IgICAgICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAnbWFqb3InIHZlcnNpb24gbnVtYmVyLgotICogQHBhcmFtICAgIG1pbm9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21pbm9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICByZXZpc2lvbiAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdyZXZpc2lvbicgbnVtYmVyLgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFZlcnNpb24oTTRPU0FfVUludDgqIG1ham9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcmV2aXNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWF0aW9uIG9mIHRoZSBNUDQgZmlsZSBjcmVhdGlvbgotICogQHBhcmFtICAgIGNvbnRleHRQdHIgICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgTVA0IHdyaXRlciBjb250ZXh0IHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgICBvdXRwdXRGaWxlRGVzY3JpcHRvciAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVdyaXRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucy4KLSAqIEBwYXJhbSAgICB0ZW1wRmlsZURlc2NyaXB0b3IgICAgIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIG9wZW4uCi0gKiBAcGFyYW0gICAgZmlsZVJlYWRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX29wZW5Xcml0ZSggTTRPU0FfQ29udGV4dCogICAgICAgICAgICAgICAgICBjb250ZXh0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb24gKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQWRkIGEgbmV3IHRyYWNrCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgKElOL09VVCkgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBzdHJlYW1EZXNjUHRyICAgICAgICAoSU4pICAgICAgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgZm9yIHRoZSBuZXcgdHJhY2suCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVDogIEFuIGF1ZGlvIChyZXNwLnZpZGVvKSBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBhZGRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoaXMgY29udGV4dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGFkZCBhbm90aGVyIG9uZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpcyBmb3JiaWRkZW4uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKCBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgICBzdHJlYW1EZXNjUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTaWduYWwgdG8gdGhlIGNvcmUgTVA0IHdyaXRlciB0aGF0IHRoZXJlIGlzIG5vIG1vcmUgdHJhY2tzIHRvIGFkZAotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUOiAgQXVkaW8gc2l6ZSBlc3RpbWF0aW9uIGlzIHJlcXVpcmVkIGJ1dCBub3QgdHdvIHN0cmVhbXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0V3JpdGluZyggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBBc2tzIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gaW5pdGlhdGUgdGhlIGFjY2VzcyB1bml0IGNyZWF0aW9uIGluCi0gKiAgICAgICAgICB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpIEFjY2VzcyB1bml0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOlVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgSW52YWxpZCBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0QVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiAgICBhdVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gd3JpdGUgdGhlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW1JRCB0cmFjawotICogQG5vdGUgICAgSWYgTTRNUDRXX1dBUl9PVkVSU0laRSBpcyByZXR1cm5lZCwgTTRNUDRXX3N0YXJ0QVUgbXVzdCBub3QgYmUgY2FsbGVkIGFueW1vcmUsCi0gKiAgICAgICAgICBidXQgZGlyZWN0bHkgTTRNUDRXX2Nsb3NlV3JpdGUoKS4KLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBzdHJlYW1JRCAgICAgICAgICAgIChJTikgICAgICAgU3RyZWFtIElEIG9mIHRoZSB0cmFjay4KLSAqIEBwYXJhbSAgIGF1UHRyICAgICAgICAgICAgICAgKElOL09VVCkgICBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgICAgICBVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRTogICBJdCBpcyBub3QgcG9zc2libGUgdG8gZXZhbHVhdGUgYXVkaW8gc2l6ZSBpZiBhdWRpbwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyBkb24ndCBoYXZlIGEgY29uc3RhbnQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTRXQVJfTVA0V19PVkVSU0laRTogICAgICAgIE1heCBmaWxlIHNpemUgd2FzIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wcm9jZXNzQVUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICAgICAgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgQ2xvc2UgdGhlIE1QNCBmaWxlCi0gKiBAbm90ZSAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBNUDQgd3JpdGVyLCB0aGUgTTRNUDRXX2ZyZWVDb250ZXh0IG1ldGhvZAotICogICAgICAgICAgICB3YXMgaW4gdGhlIGludGVyZmFjZSwgd2hpY2ggaXMgbm90IHRoZSBjYXNlIGFueW1vcmUuCi0gKiAgICAgICAgICAgIFRoZSBjb250ZXh0IGlzIG5vdyBhbHdheXMgZGVhbGxvY2F0ZWQgaW4gdGhlIE00TVA0V19jbG9zZVdyaXRlIGZ1bmN0aW9uLgotICogQHBhcmFtICAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19jbG9zZVdyaXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTikgICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgICAgKElOKSAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWVQdHIgICAgICAgICAgICAgICAoT1VUKSAgIFBvaW50ZXIgdG8gdGhlIG9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCAgICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgKnZhbHVlUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gc2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgb3B0aW9uICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiBJRC4KLSAqIEBwYXJhbSAgICB2YWx1ZSAgICAgICAgICAgICAgICAoSU4pICAgICAgT3B0aW9uIHZhbHVlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogIE5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6ICAgIFVua25vd24gb3B0aW9uSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgQmFkIHN0cmVhbSBJRCBpbiB0aGUgb3B0aW9uIHZhbHVlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIEEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0ICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAgICB2YWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgQnkgc2VsZWN0aW5nIGEgc3BlY2lmaWMgc3RyZWFtSUQgKG5vdCBudWxsKSwgdGhlIGNhbGxlciBjYW4gb2J0YWluCi0gKiAgICAgICAgICAgdGhlIHN0YXRlIG9mIGEgc3BlY2lmaWMgc3RyZWFtLiBCeSB1c2luZyAwIGFzIHN0cmVhbUlEIHRoZSByZXR1cm5lZAotICogICAgICAgICAgIHN0YXRlIGlzIG5vdCBzdHJlYW0gc3BlY2lmaWMuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgICBQb2ludGVyIHRvIHRoZSBzdGF0ZSBlbnVtZXJhdGlvbi4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIHN0cmVhbUlEIG9mIHRoZSBzdHJlYW0gdG8gcmV0cmlldmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyby1zdGF0ZSAoMCBmb3IgZ2xvYmFsIHN0YXRlKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFN0YXRlKCBNNE9TQV9Db250ZXh0ICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfU3RhdGUqICAgIHN0YXRlUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgICBzdHJlYW1JRCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgY3VycmVudGx5IGV4cGVjdGVkIGZpbGUgc2l6ZQotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSggTTRPU0FfQ29udGV4dCAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqICAgICAgICBjdXJyZW50RmlsZVNpemUpOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0jZW5kaWYgLypNNE1QNFdfV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFiMzJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGliM2dwd3JpdGVyCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRNUDRXX0ludGVyZmFjZS5jIFwKLSAgICAgIE00TVA0V19VdGlscy5jIFwKLSAgICAgIE00TVA0V19Xcml0ZXIuYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfSW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyYzUyNTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19JbnRlcmZhY2UuYwotICogQGJyaWVmICAgIDNHUFAgZmlsZSB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIGNvbW1vbiBpbnRlcmZhY2UgZGVmaW5lZAotICogICAgICAgICAgaW4gIk00V1JJVEVSX2NvbW1vbi5oIi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogT1NBTCBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGJhc2ljIHR5cGVzIGRlZmluaXRvbiAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBmaWxlIGFjY2Vzc2VzIGltcGxlbWVudGF0aW9uICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIG1lbW9yeSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyoqPCBPU0FMIGRlYnVnIHRvb2xzICovCi0KLS8qKgotICogV3JpdGVyIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IERlZmluaXRpb24gb2YgdGhlIHdyaXRlciBjb21tb24gaW50ZXJmYWNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbW9kdWxlIGZvbGxvd3MgKi8KLQotI2lmZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyX0NzdE1lbS5oIiAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZWxzZQotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgTVA0LzNHUCBjb3JlIHdyaXRlciB0eXBlcyAqLwotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgZnVuY3Rpb25zICovCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotLyoqCi0gKiBTcGVjaWZpYyBlcnJvcnMgZm9yIHRoaXMgbW9kdWxlICovCi0jZGVmaW5lIE00V1JJVEVSXzNHUF9FUlJfVU5TVVBQT1JURURfU1RSRUFNX1RZUEUgXAotICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdSSVRFUl8zR1AsIDB4MDAwMDAxKQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgd3JpdGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIHdyaXRlciBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICBwTVA0Q29udGV4dDsgICAgLyoqPCBNUDQgd3JpdGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbWF4QVVzaXplczsgICAgICAgIC8qKjwgdGhlIG1heGltdW0gQVUgc2l6ZSBwb3NzaWJsZSAqLwotfSBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKE00V1JJVEVSX0NvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwV2hhdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyKQotICogQGJyaWVmICAgIE9wZW4gYSB3cml0ZXIgc2Vzc2lvbi4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gY3JlYXRlLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mIE9TQUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEBwYXJhbSAgICBmaWxlUmVhZGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMIGZpbGUgcmVhZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAoTlVMTCBpZiBub3QgdXNlZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwRmlsZVB0ckZjdCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBvcGVuV3JpdGUgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlKCBNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZXJQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRlbXBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlciApCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZSIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVXcml0ZXJQb2ludGVyKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcEZpbGVXcml0ZXJQb2ludGVyIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQ9TTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQgPSAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBjb250ZXh0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmVzZXQgY29udGV4dCB2YXJpYWJsZXMgKi8KLSAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBhcENvbnRleHQtPm1heEFVc2l6ZXMgPSAwOwotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuIHRoZSB3cml0ZXIgY29udGV4dCAqLwotICAgICpwQ29udGV4dCA9IChNNFdSSVRFUl9Db250ZXh0ICopYXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgTGF1bmNoIHRoZSBvcGVuV3JpdGUgb2YgdGhlIE1QNCB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogY2FsbGluZyBNNE1QNFdfb3BlbldyaXRlKCkiKTsKLQotICAgIGVyciA9IE00TVA0V19vcGVuV3JpdGUoJmFwQ29udGV4dC0+cE1QNENvbnRleHQsIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgcEZpbGVXcml0ZXJQb2ludGVyLCB0ZW1wRmlsZURlc2NyaXB0b3IsIHBGaWxlUmVhZGVyUG9pbnRlciApOwotCi0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19vcGVuV3JpdGUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX29wZW5Xcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZyhNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIEluZGljYXRlcyB0byB0aGUgd3JpdGVyIHRoYXQgdGhlIHNldHVwIHNlc3Npb24gaXMgZW5kZWQgYW5kIHRoYXQKLSAqICAgICAgICAgIHdlIHdpbGwgc3RhcnQgdG8gd3JpdGUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHN0YXJ0V3JpdGluZyAoSXRzCi0gKiAgICAgICAgICAgIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmcoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogY2FsbGluZyBNNE1QNFdfc3RhcnRXcml0aW5nKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRXcml0aW5nKGFwQ29udGV4dC0+cE1QNENvbnRleHQpOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc3RhcnRXcml0aW5nIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKAotICogICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gKnBTdHJlYW1EZXNjcmlwdGlvbikKLSAqIEBicmllZiAgICAgQWRkIGEgc3RyZWFtIChhdWRpbyBvciB2aWRlbykuCi0gKiBAbm90ZSAgICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyBwcm9wZXJ0aWVzIGFyZSBjb3JyZWN0bHkgc2V0IGJlZm9yZSBjYWxsaW5nCi0gKiAgICAgICAgICAgIHRoZSBjb3JlIHdyaXRlciBhZGQgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtRGVzY3JpcHRpb246ICAgIChJTikgc3RyZWFtIGRlc2NyaXB0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBhZGRTdHJlYW0KLSAqICAgICAgICAgICAgKEl0cyBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2NyaXB0aW9uKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQgKmFwQ29udGV4dCA9Ci0gICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgKnBWaWRlb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgKnBBdWRpb0luZm8gPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19TdHJlYW1JRHNpemUgc2l6ZVZhbHVlOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBDb250ZXh0PTB4JXgsICIKLSAgICAgICAgICAgICAgICAgICAicFN0cmVhbURlc2NyaXB0aW9uPTB4JXgiLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwU3RyZWFtRGVzY3JpcHRpb24pOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjcmlwdGlvbiksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHBTdHJlYW1EZXNjcmlwdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBZGFwdCBhdWRpby92aWRlbyBzdHJlYW0gaW5mb3MgKi8KLSAgICBzd2l0Y2ggKHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiAiCi0gICAgICAgICAgICAgICAgICAgICJhZGRpbmcgYSBWaWRlbyBzdHJlYW0gKHN0cmVhbVR5cGU9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBDb21tb24gZGVzY3JpcHRpb25zICovCi0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsgICAgLyoqPCBUaGUgb25seSB2YWx1ZXMgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgd3JpdGVyIGFyZSBzdHJlYW1JRCAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT50aW1lU2NhbGUgPSAxMDAwOyAgICAgICAgICAgIC8qKjwgYW5kIHRpbWVTY2FsZSAqLwotCi0vKiBOb3QgcmVjb21tZW5kZWQgZm9yIHZpZGVvIGVkaXRpbmcgLT4gd3JpdGUgZXhwbGljaXRlbHkgdGhlICdiaXRyJyBib3ggaW50byAnZDI2MycgKi8KLS8qIFJlbSA6IGl0IGlzIFJFTCA1IG9mIDNncHAgZG9jdW1lbnRhdGlvbiAqLwotLy8gICAgICAgICAgICAvKioKLS8vICAgICAgICAgICAgICogQXZlcmFnZSBiaXQtcmF0ZSBtdXN0IG5vdCBiZSBzZXQgaW4gSDI2MyB0byBiZSBjb21wYXRpYmxlIHdpdGggUGxhdGZvcm00ICovCi0vLyAgICAgICAgICAgIGlmIChNNFNZU19rSDI2MyA9PSBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+YXZlcmFnZUJpdHJhdGUgPSAtMTsKLS8vICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIERlY29kZXIgc3BlY2lmaWMgaW5mbyAqLwotICAgICAgICAgICAgcFZpZGVvSW5mbyA9IChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICopcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHBWaWRlb0luZm8tPkhlYWRlci5TaXplOwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX01lbUFkZHIzMilwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZjsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogRFNJPTB4JXgsIERTSXNpemU9JWQiLAotICAgICAgICAgICAgICAgICBwVmlkZW9JbmZvLT5IZWFkZXIucEJ1ZiwgcFZpZGVvSW5mby0+SGVhZGVyLlNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBTVJfV0I6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgY2FzZSBNNFNZU19rRVZSQzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBhZGRpbmcgYW4gQXVkaW8gc3RyZWFtIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgQ29tbW9uIGRlc2NyaXB0aW9ucyAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1JRCA9IEF1ZGlvU3RyZWFtSUQ7ICAgIC8qKjwgVGhlIG9ubHkgdmFsdWUgY2hlY2tlZCBieSBvdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSB3cml0ZXIgaXMgc3RyZWFtSUQgKi8KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICAgICAgICAgIHBBdWRpb0luZm8gPSAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyAqKXBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBwQXVkaW9JbmZvLT5IZWFkZXIuU2l6ZTsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9NZW1BZGRyMzIpcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWY7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogQXVkaW86IERTST0weCV4LCBEU0lzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgcEF1ZGlvSW5mby0+SGVhZGVyLnBCdWYsIHBBdWRpb0luZm8tPkhlYWRlci5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTpcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IGNhbGxpbmcgTTRNUDRXX2FkZFN0cmVhbSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX2FkZFN0cmVhbShhcENvbnRleHQtPnBNUDRDb250ZXh0LHBTdHJlYW1EZXNjcmlwdGlvbik7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IE00TVA0V19hZGRTdHJlYW0gcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIChlcnIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZvciBWaWRlbywgc2V0IHRoZSBNNE1QNFdfdHJhY2tTaXplIE9wdGlvbiAqLwotICAgIHN3aXRjaCAocFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICBjYXNlIE00U1lTX2tIMjYzOgotICAgICAgICAgICAgc2l6ZVZhbHVlLnN0cmVhbUlEID0gVmlkZW9TdHJlYW1JRDsKLSAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQgPSAoTTRPU0FfVUludDE2KShwVmlkZW9JbmZvLT5oZWlnaHQpOwotICAgICAgICAgICAgc2l6ZVZhbHVlLndpZHRoICA9IChNNE9TQV9VSW50MTYpKHBWaWRlb0luZm8tPndpZHRoKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBWaWRlbzogaGVpZ2h0PSVkLCB3aWR0aD0lZCIsCi0gICAgICAgICAgICAgICAgIHNpemVWYWx1ZS5oZWlnaHQsIHNpemVWYWx1ZS53aWR0aCk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBjYWxsaW5nIE00TVA0V19zZXRPcHRpb24oTTRNUDRXX3RyYWNrU2l6ZSkiKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V190cmFja1NpemUsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSZzaXplVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBNNE1QNFdfc2V0T3B0aW9uIHJldHVybnMgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2xvc2UgdGhlIHdyaXRlci4gVGhlIGNvbnRleHQgaXMgZnJlZWQgaGVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgY2xvc2VXcml0ZSAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0PShNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dC0+cE1QNENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IGNhbGxpbmcgTTRNUDRXX2Nsb3NlV3JpdGUoKSIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfY2xvc2VXcml0ZShhcENvbnRleHQtPnBNUDRDb250ZXh0KTsKLSAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IE00TVA0V19jbG9zZVdyaXRlIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBEZWFsbG9jYXRlIG91ciBvd24gY29udGV4dCAqLwotICAgIGZyZWUoYXBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gKiAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBwcHRpb25JZDogICAgIChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcGFyYW0gICAgIE9wdGlvblZhbHVlIDogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uIHRvIHNldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgSUQgb2YgdGhlIG9wdGlvbiBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHNldE9wdGlvbiAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zZXRPcHRpb24oCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX21lbUFkZHIgbWVtdmFsOwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0dmFsOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHBDb250ZXh0PTB4JXgsIG9wdGlvbklEPTB4JXgsXAotICAgICAgICAgb3B0aW9uVmFsdWU9MHgleCIsIHBDb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1hcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4QVVzaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heENodW5rU2l6ZSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHN0cmluZyBzaWduYXR1cmUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmc6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHRleHQgc3RyaW5nICovCi0gICAgICAgICAgICBtZW12YWwuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICAvKio8IHRoaXMgaXMgbWF4IHN0cmluZyBzaXplIGNvcGllZCBieSB0aGUgY29yZSAqLwotICAgICAgICAgICAgbWVtdmFsLnNpemUgPSAxNjsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfZW1iZWRkZWRTdHJpbmcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19lbWJlZGRlZFN0cmluZylcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIGludGVncmF0aW9uIHRhZyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZzoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIFRoZSBnaXZlbiBNNE9TQV9EYXRhT3B0aW9uIG11c3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAgIGJlIGEgdGV4dCBzdHJpbmcgKi8KLSAgICAgICAgICAgIG1lbXZhbC5hZGRyID0gKE00T1NBX01lbUFkZHIzMilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIC8qKjwgdGhpcyBpcyBtYXggc3RyaW5nIHNpemUgY29waWVkIGJ5IHRoZSBjb3JlICovCi0gICAgICAgICAgICBtZW12YWwuc2l6ZSA9IHN0cmxlbigoY29uc3QgY2hhciAqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfaW50ZWdyYXRpb25UYWcsICZtZW12YWwpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19pbnRlZ3JhdGlvblRhZykiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBGaWxlIHZlcnNpb24gc2lnbmF0dXJlICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24gb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHZlcnNpb24gbnVtYmVyICovCi0KLSAgICAgICAgICAgIC8qKjwgSGVyZSAwIG1lYW5zIGJvdGggc3RyZWFtcyAqLwotICAgICAgICAgICAgb3B0dmFsLnN0cmVhbUlEID0gMDsKLSAgICAgICAgICAgIC8qKjwgdmVyc2lvbiBudW1iZXIgKi8KLSAgICAgICAgICAgIG9wdHZhbC52YWx1ZSA9ICooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfQ2FtY29kZXJWZXJzaW9uLCAmb3B0dmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFNvbWUgb3B0aW9ucyBhcmUgcmVhZC1vbmx5ICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplOgotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBzZXQgYSByZWFkLW9ubHkgb3B0aW9uISAoSUQ9MHgleCkiLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9SRUFEX09OTFk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gZmlsZXNpemUgbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlU2l6ZToKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJzZXR0aW5nIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4RmlsZVNpemUsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfbWF4RmlsZVNpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGZpbGUgZHVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb246Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhGaWxlRHVyYXRpb24sIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgU2V0ICdmdHlwJyBhdG9tICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa1NldEZ0eXBCb3g6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rU2V0RnR5cEJveCBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX3NldEZ0eXBCb3gsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfc2V0RnR5cEJveClcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tEU0k6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRFNJIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfRFNJLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0RTSSlcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKyBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTVVMX1BQU19TUFM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTVVMX1BQU19TUFMgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19NVUxfUFBTX1NQUywgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19EU0kpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKi0gSC4yNjQgVHJpbW1pbmcgICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFVua25vd24gb3B0aW9uICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgidHJ5aW5nIHRvIHNldCBhbiB1bmtub3duIG9wdGlvbiFcCi0gICAgICAgICAgICAgICAgIChvcHRpb25JRD0weCV4KSIsIG9wdGlvbklEKTsKLSAgICAgICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRPcHRpb24oCi0gKiAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICogICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi0gKiBAYnJpZWYgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgd3JpdGVyIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgIHRoZSBvcHRpb25JRC4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy8KLSAqICAgICAgICAgICAgZGUtYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgVGhlIG9wdGlvbnMgaGFuZGxlZCBieSB0aGUgY29tcG9uZW50IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24KLSAqICAgICAgICAgICAgb2YgdGhlIGNvbXBvbmVudC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBPcHRpb25JZDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHBhcmFtICAgICBwT3B0aW9uVmFsdWU6IChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24gdG8gZ2V0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBJRCBvZiB0aGUgb3B0aW9uIGlzIG5vdCB2YWxpZC4KLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiBUaGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBnZXRPcHRpb24gKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcENvbnRleHQ9MHgleCwgb3B0aW9uSUQ9MHgleCxcCi0gICAgICAgICBvcHRpb25WYWx1ZT0weCV4IiwgcENvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhBVVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4QVVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldE9wdGlvbihhcENvbnRleHQtPnBNUDRDb250ZXh0LE00TVA0V19tYXhBVXNpemUsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSZvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRPcHRpb24oTTRNUDRXX21heEFVc2l6ZSkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGNodW5jayBzaXplICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01heENodW5ja1NpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRPcHRpb24oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0T3B0aW9uKE00TVA0V19tYXhDaHVua1NpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVGhlIGZpbGUgc2l6ZSBvcHRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBnZXQgdGhlIGN1cnJlbnQgZmlsZSBzaXplICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFRoZSBmaWxlIHNpemUgd2l0aCBhdWRpbyBvcHRpb24gaGFzIGl0cyBvd24gZnVuY3Rpb24gY2FsbAotICAgICAgICAgICAgICBpbiB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiZ2V0dGluZyBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCBvcHRpb24iKTsKLSAgICAgICAgICAgIC8qIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgLi4uICovCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIChNNE9TQV9VSW50MzIqKW9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL25vIG1vcmUgbmVlZGVkIDNncCB3cml0ZXIgaGFzIGl0cyBvd24gbWVjYW5pc20KLSAgICAgICAgICAgIC8vLyogLi4uIGFkZCB0aGUgZXN0aW1hdGVkIG5leHQgbWF4IEFVIHNpemUgKi8KLSAgICAgICAgICAgIC8vKigoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSkgKz0gYXBDb250ZXh0LT5tYXhBVXNpemVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBVbmtub3duIG9wdGlvbiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBnZXQgYW4gdW5rbm93biBvcHRpb24hXAotICAgICAgICAgICAgICAgICAob3B0aW9uSUQ9MHgleCkiLCBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gICAgKE00T1NBX0VSUilNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRBVSgKLSAqICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICogICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgICBQcmVwYXJlIGFuIEFjY2VzcyBVbml0IHRvIGJlIHJlYWR5IHRvIHN0b3JlIGRhdGEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEFVIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6IHN0cmVhbUlEIGlzIG5vdCBWaWRlb1N0cmVhbUlEIG5vcgotICogICAgICAgICAgICBBdWRpb1N0cmVhbUlEIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzdGFydEFVIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0QVUoCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBDb250ZXh0PTB4JXgsIHN0cmVhbUlEPSVkLCBwQVU9MHgleCIsCi0gICAgICAgICBwQ29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcEFVIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoCi0gICAgICAgICAoKFZpZGVvU3RyZWFtSUQgIT0gc3RyZWFtSUQpICYmIChBdWRpb1N0cmVhbUlEICE9IHN0cmVhbUlEKSksCi0gICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lELAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IFdyb25nIHN0cmVhbUlEIik7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9zdGFydEFVOiBjYWxsaW5nIE00TVA0V19zdGFydEFVKCkiKTsKLSAgICBlcnIgPSBNNE1QNFdfc3RhcnRBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3N0YXJ0QVUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiQVU6IGRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQiLAotICAgICAgICAgcEFVLT5kYXRhQWRkcmVzcywgcEFVLT5zaXplKTsKLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYgKE00V0FSX01QNFdfT1ZFUlNJWkUgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfV1JJVEVSX1NUT1BfUkVROwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcmV0dXJuaW5nIDB4JXgiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9wcm9jZXNzQVUoCi0gKiAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAqICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgICAgV3JpdGUgYW4gQWNjZXNzIFVuaXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHBhcmFtICAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdAotICogICAgICAgICAgICBpcyByZWxhdGVkLgotICogQHBhcmFtICAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBBVSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiBzdHJlYW1JRCBpcyBub3QgVmlkZW9TdHJlYW1JRCBub3IKLSAqICAgICAgICAgICAgQXVkaW9TdHJlYW1JRCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgcHJvY2Vzc0FVCi0gKiAgICAgICAgICAgIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX3Byb2Nlc3NBVSgKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KiBhcENvbnRleHQgPQotICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6ICIKLSAgICAgICAgICAgICAgICAgICAicENvbnRleHQ9MHgleCwgc3RyZWFtSUQ9JWQsIHBBVT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBVSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBwQVUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigKLSAgICAgICAgICgoVmlkZW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkgJiYgKEF1ZGlvU3RyZWFtSUQgIT0gc3RyZWFtSUQpKSwKLSAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogV3Jvbmcgc3RyZWFtSUQiKTsKLQotICAgIE00T1NBX1RSQUNFM180KCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBBVTogIgotICAgICAgICAgImRhdGFBZGRyZXNzPTB4JXgsIHNpemU9JWQsIENUUz0lZCwgbmJGcmFnPSVkIiwKLSAgICAgICAgIHBBVS0+ZGF0YUFkZHJlc3MsIHBBVS0+c2l6ZSwgKE00T1NBX1VJbnQzMilwQVUtPkNUUywgcEFVLT5uYkZyYWcpOwotCi0gICAgaWYocEFVLT5zaXplID4gYXBDb250ZXh0LT5tYXhBVXNpemVzKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5tYXhBVXNpemVzID0gcEFVLT5zaXplOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBDYWxsIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IGNhbGxpbmcgTTRNUDRXX3Byb2Nlc3NBVSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX3Byb2Nlc3NBVShhcENvbnRleHQtPnBNUDRDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3Byb2Nlc3NBVSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIC8qIENvbnZlcnQgb3ZlcnNpemUgdG8gYSByZXF1ZXN0IHRvd2FyZCBWRVMgYXV0b21hdG9uICovCi0gICAgaWYoTTRXQVJfTVA0V19PVkVSU0laRSA9PSBlcnIpCi0gICAgewotICAgICAgICBlcnIgPSBNNFdBUl9XUklURVJfU1RPUF9SRVE7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAqICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gKiAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAqICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICAgIEdldCB0aGUgM0dQUCB3cml0ZXIgY29tbW9uIGludGVyZmFjZQotICogQG5vdGUgICAgICBSZXRyaWV2ZXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSB0aGUgM0dQUCB3cml0ZXIuCi0gKiAgICAgICAgICAgIEl0IGZvbGxvd3MgdGhlIGNvbW1vbiB3cml0ZXIgaW50ZXJmYWNlLgotICogQHBhcmFtICAgICBUeXBlOiAoT1VUKSByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB3cml0ZXIuIFdpbGwgYWx3YXlzIGJlCi0gKiAgICAgICAgICAgIE00V1JJVEVSX2szR1BQLgotICogQHBhcmFtICAgICBTcmNHbG9iYWxJbnRlcmZhY2U6IChPVVQpIE1haW4gc2V0IG9mIGZ1bmN0aW9uIHRvIHVzZSB0aGlzCi0gKiAgICAgICAgICAgIDNHUFAgd3JpdGVyCi0gKiBAcGFyYW0gICAgIFNyY0RhdGFJbnRlcmZhY2U6ICAgKE9VVCkgU2V0IG9mIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZGF0YXMKLSAqICAgICAgICAgICAgdG8gdXNlIHRoaXMgM0dQUCB3cml0ZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcygKLSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwR2xvYmFsOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiAiCi0gICAgICAgICAiVHlwZT0weCV4LCBTcmNHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgICBTcmNEYXRhSW50ZXJmYWNlPTB4JXgiLCBUeXBlLCBTcmNHbG9iYWxJbnRlcmZhY2UsIFNyY0RhdGFJbnRlcmZhY2UpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFR5cGUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFR5cGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBTcmNHbG9iYWxJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IFNyY0RhdGFJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldEludGVyZmFjZXM6IFNyY0RhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgU2V0IHRoZSBvdXRwdXQgdHlwZSAqLwotICAgICpUeXBlID0gTTRXUklURVJfazNHUFA7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSB0aGUgZ2xvYmFsIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwR2xvYmFsID0gKE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgICAgICAgIE00V1JJVEVSXzNHUCwgKE00T1NBX0NoYXIgKikiTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEdsb2JhbCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICpTcmNEYXRhSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgdGhlIGRhdGEgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBEYXRhID0KLSAgICAgICAgKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICBNNFdSSVRFUl8zR1AsIChNNE9TQV9DaGFyICopIk00V1JJVEVSX0RhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGF0YSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJ1bmFibGUgdG8gYWxsb2NhdGUgTTRXUklURVJfRGF0YUludGVyZmFjZSxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUocEdsb2JhbCk7Ci0gICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEZpbGwgdGhlIGdsb2JhbCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcEdsb2JhbC0+cEZjdE9wZW4gPSBNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOwotICAgIHBHbG9iYWwtPnBGY3RBZGRTdHJlYW0gPSBNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOwotICAgIHBHbG9iYWwtPnBGY3RTdGFydFdyaXRpbmcgPSBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOwotICAgIHBHbG9iYWwtPnBGY3RDbG9zZVdyaXRlID0gTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU7Ci0gICAgcEdsb2JhbC0+cEZjdFNldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9zZXRPcHRpb247Ci0gICAgcEdsb2JhbC0+cEZjdEdldE9wdGlvbiA9IE00V1JJVEVSXzNHUF9nZXRPcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBGaWxsIHRoZSBkYXRhIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwRGF0YS0+cFN0YXJ0QVUgPSBNNFdSSVRFUl8zR1Bfc3RhcnRBVTsKLSAgICBwRGF0YS0+cFByb2Nlc3NBVSA9IE00V1JJVEVSXzNHUF9wcm9jZXNzQVU7Ci0KLSAgICAvKioKLSAgICAgKiAgICBTZXQgdGhlIHJldHVybiB2YWx1ZXMgKi8KLSAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gcEdsb2JhbDsKLSAgICAqU3JjRGF0YUludGVyZmFjZSA9IHBEYXRhOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MmUyYWQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19VdGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1V0aWxzLmMKLSAqIEBicmllZiAgIFV0aWxpdGllcyBhbmQgcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIHRoZSBNUDQgd3JpdGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1R5cGVzLmgiCi0KLSNkZWZpbmUgRVJSX0NIRUNLKGV4cCwgZXJyKSBpZiAoIShleHApKSB7IHJldHVybiBlcnI7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJ5dGUoTTRPU0FfVUNoYXIgYywgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gZmlsZUZ1bmN0aW9uLT53cml0ZURhdGEoY29udGV4dCwgKE00T1NBX01lbUFkZHI4KSZjLCAxKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDE2KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMzIoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDI0KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gMTYpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiA4KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKXZhbCwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfcHV0QmxvY2soY29uc3QgTTRPU0FfVUNoYXIqIEJsb2NrLCBNNE9TQV9VSW50MzIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBmaWxlRnVuY3Rpb24tPndyaXRlRGF0YShjb250ZXh0LCAoTTRPU0FfTWVtQWRkcjgpQmxvY2ssIHNpemUpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE1QNFdfY29udmVydEludDMyQkUoTTRPU0FfVUludDMyKiB2YWxQdHIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VQ2hhciBhLCBiOwotICAgIE00T1NBX1VDaGFyKiBjID0gKE00T1NBX1VDaGFyKil2YWxQdHI7Ci0gICAgYSAgICAgICA9ICooYyk7Ci0gICAgYiAgICAgICA9ICooYysxKTsKLSAgICAqKGMpICAgPSAqKGMrMyk7Ci0gICAgKihjKzEpID0gKihjKzIpOwotICAgICooYysyKSA9IGI7Ci0gICAgKihjKzMpID0gYTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE00TVA0V190YWJsZTMyVG9CRShNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDMyIG5iKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgZm9yIChpPTA7IGk8bmI7IGkrKykKLSAgICAgICAgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKCYodGFiKVtpXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCogTTRNUDRXX3JlYWxsb2MoTTRPU0FfTWVtQWRkcjMyIHB0ciwgTTRPU0FfVUludDMyIG9sZFNpemUsIE00T1NBX1VJbnQzMiBuZXdTaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfTWVtQWRkcjMyIHB0cjIgPSAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhuZXdTaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicmVhbGxvYyIpOwotICAgIGlmIChNNE9TQV9OVUxMICE9IHB0cjIpCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwdHIyLCAodm9pZCAqKXB0ciwgb2xkU2l6ZSk7Ci0gICAgfQotICAgIGZyZWUocHRyKTsKLSAgICByZXR1cm4gcHRyMjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2ZyZWVDb250ZXh0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiBpOwotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEqIG1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qZnJlZUNvbnRleHQgaXMgbm93IGNhbGxlZCBhZnRlciBjbG9zZVdyaXRlKi8KLSAgICBFUlJfQ0hFQ0soIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX2Nsb3NlZCwgTTRFUlJfU1RBVEUpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLypkZWxldGUgYWxzbyBvdGhlciBjaHVua3MgaWYgYW55Ki8KLSAgICAgICAgLypmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgICAgIGZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0pOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykgJiYKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qZGVsZXRlIGFsc28gb3RoZXIgY2h1bmtzIGlmIGFueSovCi0gICAgICAgIC8qZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rW2ldKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspICYmCi0gICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKm5vdyBkeW5hbWljKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0cik7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfSGkoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBIaSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgICp0YWIgJj0gMHhGRkZGOwotICAgICp0YWIgfD0gSGk8PDE2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0xvKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgTG8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqdGFiICY9IDB4RkZGRjAwMDA7Ci0gICAgKnRhYiB8PSBMbzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICgqdGFiID4+IDE2KSAmIDB4RkZGRjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0xvKE00T1NBX1VJbnQzMiogdGFiKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgcmV0dXJuICp0YWIgJiAweEZGRkY7Ci19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19Xcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2RmYzQ0MS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1Mzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfV3JpdGVyLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlci5oIgotI2luY2x1ZGUgIk00TVA0V19VdGlscy5oIgotCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBCRUdJTiAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0jZXJyb3IgIl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIF9NNE1QNFdfTU9PVl9GSVJTVCIKLQotI2VuZGlmCi0KLSNlbmRpZgotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jZXJyb3IgIl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyBzaG91bGQgYmUgdXNlZCB3aXRoIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FIgotCi0jZW5kaWYKLQotI2VuZGlmCi0vKiBDaGVjayBvcHRpbWlzYXRpb24gZmxhZ3MgOiBFTkQgKi8KLQotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2VuZGlmIC8qX000TVA0V19ET05UX1VTRV9USU1FX0gqLwotCi0vKk1BQ1JPUyovCi0jZGVmaW5lIE1BSk9SX1ZFUlNJT04gMwotI2RlZmluZSBNSU5PUl9WRVJTSU9OIDMKLSNkZWZpbmUgUkVWSVNJT04gMAotCi0jZGVmaW5lIEVSUl9DSEVDSyhleHAsIGVycikgaWYgKCEoZXhwKSkgeyByZXR1cm4gZXJyOyB9Ci0jZGVmaW5lIENMRUFOVVBvbkVSUihmdW5jKSBpZiAoKGVyciA9IGZ1bmMpICE9IE00Tk9fRVJST1IpIGdvdG8gY2xlYW51cAotCi0jZGVmaW5lIG1heChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLQotLyoqKioqKioqKioqKioqKi8KLS8qU3RhdGljIGJsb2NrcyovCi0vKioqKioqKioqKioqKioqLwotCi0vKkNvbW1vbkJsb2NrcyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIERlZmF1bHRfZnR5cCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgJ2YnLCAndCcsICd5JywgJ3AnLCAnMycsICdnJywgJ3AnLCAnNycsIDB4MDAsIDB4MDAsCi0gICAgMHgwMywgMHgwMCwgJzMnLCAnZycsICdwJywgJzcnLCAnaScsICdzJywgJ28nLCAnbScKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMiBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdhJywgJ3QnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazMgW10gPQotewotICAgICdtJywgJ28nLCAnbycsICd2JywgMHgwMCwgMHgwMCwgMHgwMCwgMHg2QywgJ20nLCAndicsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMywgMHhFOAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazYgW10gPQotewotICAgICd0JywgJ3InLCAnYScsICdrJywgMHgwMCwgMHgwMCwgMHgwMCwgMHg1QywgJ3QnLCAnaycsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNyBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s3YmlzIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrOCBbXSA9Ci17Ci0gICAgJ20nLCAnZCcsICdpJywgJ2EnLCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAnbScsICdkJywgJ2gnLCAnZCcsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s5IFtdID0KLXsKLSAgICAweDU1LCAweEM0LCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazEwIFtdID0KLXsKLSAgICAnbScsICdpJywgJ24nLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsICdkJywgJ2knLCAnbicsICdmJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDFDLCAnZCcsICdyJywgJ2UnLCAnZicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgJ3UnLCAncicsICdsJywgJyAnLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTEgW10gPQotewotICAgICdzJywgJ3QnLCAnYicsICdsJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMiBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICd0JywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNSBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ3onLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE2IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAnYycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTcgW10gPQotewotICAgICdzJywgJ3QnLCAnYycsICdvJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwSGVhZGVyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDVFLCAncycsICdrJywgJ2knLCAncCcKLX07Ci0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDE2ICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcgW10gPQotewotICAgICdOJywgJ1gnLCAnUCcsICdTJywgJ1cnLCAnICcsICdDJywgJ0EnLCAnTScsICdDJywgJ08nLCAnUicsICdEJywgJ0UnLAotICAgICdSJywgJyAnCi19OwotLyogZm9sbG93cyB0aGUgdmVyc2lvbiAobGlrZSAiIDMuMC4yIiksIHRoZW4gIiAtLSAiICovCi0vKiBkdWUgdG8gY3VycmVudCBsaW1pdGF0aW9ucywgc2l6ZSBtdXN0IGJlIDYwICovCi1jb25zdCBNNE9TQV9VQ2hhciBCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcgW10gPQotewotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi0vKlZpZGVvQmxvY2tzKi8KLS8qIDMyMCoyNDAsIG5vdyBubyBsb25nZXIgaGFyZGNvZGVkICovCi0vKiBjb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrMVtdID0KLSAgICB7IDB4MDEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4MDAsIDB4MDAgfTsgKi8KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2sxXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsICdoJywgJ2QnLCAnbCcsICdyJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAndicsICdpJywgJ2QnLCAnZScsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4RkYsIDB4RkYKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s0IFtdID0KLXsKLSAgICAncycsICd0JywgJ3MnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07IC8qU1RTUyovCi0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvQmxvY2s1IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE0LCAndicsICdtJywgJ2gnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9SZXNvbHV0aW9ucyBbXSA9Ci17Ci0gICAgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0OCwgMHgwMCwgMHgwMAotfTsKLQotLypNcDR2QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1wNHZCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICd2JwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTXA0dkJsb2NrMyBbXSA9Ci17Ci0gICAgMHgyMCwgMHgxMQotfTsKLQotLypIMjYzQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazEgW10gPQotewotICAgICdzJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMiBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgJ2QnLCAnMicsICc2JywgJzMnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2syX2JpdHIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsICdkJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMyBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDBBLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAnYicsICdpJywgJ3QnLCAncicKLX07Ci0KLS8qSDI2NEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2sxIFtdID0KLXsKLSAgICAnYScsICd2JywgJ2MnLCAnMScKLX07Ci0KLS8qIFN0b3JlIHRoZSBhdmNDIGZpZWxkLCB0aGUgdmVyc2lvbiAoPTEpLAotICAgIHRoZSBwcm9maWxlICg9NjYpLCB0aGUgY29tcGF0aWJpbGl0eSAoPTApLCAqLwotCi0vKiB0aGUgbGV2ZWwgKD0xMCksMTExMTExICsgTkFMIGZpZWxkIFNpemUgKD0gNCAtIDEpLAotICAgIDExMSArIG51bWJlciBvZiBQUFMgKD0xKSAqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBIMjY0QmxvY2syIFtdID0KLXsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICdhJyAsICd2JyAsICdjJyAsICdDJwotfTsKLQotLypBTVJCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2sxIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazFfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgJ2gnLCAnZCcsICdsJywgJ3InLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsICdzJywgJ28nLCAndScsICduJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlIFtdID0KLXsKLSAgICAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJEU0lIZWFkZXIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsICdkJywgJ2EnLCAnbScsICdyJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SRGVmYXVsdERTSSBbXSA9Ci17Ci0gICAgJ1AnLCAnSCcsICdMJywgJ1AnLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBBTVJCbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsICdzJywgJ20nLCAnaCcsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi0vKkFNUjhCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQU1SOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnYScsICdtJywgJ3InCi19OwotCi0vKkFNUjE2QmxvY2tzKi8KLS8qY29uc3QgTTRPU0FfVUNoYXIgQU1SMTZCbG9jazFbXSA9IHsgJ3MnLCAnYScsICd3JywgJ2InfTsqLwotCi0vKkFBQ0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBBQUNCbG9jazEgW10gPQotewotICAgICdtJywgJ3AnLCAnNCcsICdhJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQUFDQmxvY2syIFtdID0KLXsKLSAgICAweDQwLCAweDE1Ci19OwotCi0vKk1QRUdDb25maWdCbG9ja3MgKEFBQyAmIE1QNFYpKi8KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazAgW10gPQotewotICAgICdlJywgJ3MnLCAnZCcsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMiBbXSA9IHsgMHgwNSB9OwotY29uc3QgTTRPU0FfVUNoYXIgTVBFR0NvbmZpZ0Jsb2NrMyBbXSA9Ci17Ci0gICAgMHgwNiwgMHgwMSwgMHgwMgotfTsKLQotLypFVlJDQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEVWUkNCbG9jazNfMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgJ2QnLCAnZScsICd2JywgJ2MnCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDQmxvY2szXzIgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwMAotfTsKLQotLypFVlJDOEJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDOEJsb2NrMSBbXSA9Ci17Ci0gICAgJ3MnLCAnZScsICd2JywgJ2MnCi19OwotCi0vKioqKioqKioqKiovCi0vKiBNZXRob2RzICovCi0vKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4ICptYWpvciwgTTRPU0FfVUludDggKm1pbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpyZXZpc2lvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtYWpvciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBtaW5vciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSByZXZpc2lvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICptYWpvciA9IE1BSk9SX1ZFUlNJT047Ci0gICAgKm1pbm9yID0gTUlOT1JfVkVSU0lPTjsKLSAgICAqcmV2aXNpb24gPSBSRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFRTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNaX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNTX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19DSFVOS19BTExPQ19OQjsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLS8qIHN0c2NbIF0gdGFibGUgaXMgc3BsaXR0ZWQgYXQgMTIgYml0cyAqLwotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA0MDk1IC8qIDA9bm90dXNlZCAqLwotCi0jZWxzZQotI2RlZmluZSBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAxMCAgIC8qIDA9bm90dXNlZCAqLwotCi0jZW5kaWYKLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgTTRNUDRXX2luaXRpYWxpemVBbGxvY2F0aW9uUGFyYW1ldGVycyhNNE1QNFdfTXA0RmlsZURhdGEgKlB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIG1heE1lbW9yeSwgdmVzTWVtb3J5OwotICAgIE00T1NBX1VJbnQzMiBuYlZpZGVvRnJhbWVzLCBuYkF1ZGlvRnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBhdmVyYWdlVmlkZW9DaHVuazsKLQotICAgIC8qLS0tLS0tLS0tLS0qLwotICAgIC8qIE5CX0ZSQU1FUyAqLwotICAgIC8qLS0tLS0tLS0tLS0qLwotCi0gICAgLyogbWFnaWNhbCBmb3JtdWxhIDogbWVtb3J5ID0gdmVzTWVtb3J5ICsgMTIgKiBmcmFtZXJhdGUgKiBkdXJhdGlvbiAqLwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICB2ZXNNZW1vcnkgPSAweDMyMDAwOyAvKiAyMDAga0IgKi8KLQotI2Vsc2UKLQotICAgIHZlc01lbW9yeSA9IDB4M0U4MDA7IC8qIDI1MCBrQiAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBWSURFT19QT09MX01FTU9SWSAxMDAwMDAwCi0KLSAgICBtYXhNZW1vcnkgPSBWSURFT19QT09MX01FTU9SWTsKLQotICAgIGlmIChtYXhNZW1vcnkgPCB2ZXNNZW1vcnkpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIG5iVmlkZW9GcmFtZXMgPSAoIG1heE1lbW9yeSAtIHZlc01lbW9yeSkgLyAxMjsKLQotICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFc6ICVkIGltYWdlcyBtYXgiLCBuYlZpZGVvRnJhbWVzKTsKLQotICAgIC8qIFZJREVPICovCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgMjUgZnBjIDogcmVmZXJlbmNlID0gMTUgZnBzICogMnMgKiAwLjggKi8KLQotICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gMjUwMDsKLQotI2Vsc2UKLQotICAgIGlmIChNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyA+IDApCi0gICAgewotICAgICAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDEwMCAqIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMjAKLSAgICAgICAgICAgICogKE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LIC0gMSk7IC8qIG1hcmdpbiAyMCUgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogYXNzdW1lIGFuIGF2ZXJhZ2Ugb2YgNTAgZnBjICovCi0gICAgICAgIGF2ZXJhZ2VWaWRlb0NodW5rID0gNTAwMDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgTTRNUDRXX1NUVFNfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoTTRPU0FfVUludDMyKTsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZihNNE9TQV9VSW50MTYpOwotICAgIE00TVA0V19TVFNTX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKAotICAgICAgICBNNE9TQV9VSW50MzIpOyAvKiB2ZXJ5IGNvbnNlcnZhdGl2ZSAoYWxsIGltYWdlcyBhcmUgaW50cmEpICovCi0KLSAgICBNNE1QNFdfQ0hVTktfQUxMT0NfTkIgPSAoIG5iVmlkZW9GcmFtZXMgKiAxMDApIC8gYXZlcmFnZVZpZGVvQ2h1bmsgKyAxOwotCi0gICAgLyogQVVESU8gKi8KLQotICAgIG5iQXVkaW9GcmFtZXMgPSBuYlZpZGVvRnJhbWVzOwotICAgIC8qIGF1ZGlvIGlzIDUgZnBzLCB3aGljaCBpcyB0aGUgc21hbGxlc3QgZnJhbWVyYXRlIGZvciB2aWRlbyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDEwMDsgLyogY29tcHJlc3NlZCAqLwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAxMDA7IC8qIGNvbXByZXNzZWQgKi8KLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gbmJBdWRpb0ZyYW1lcyAvIDEwICsgMTsKLQotI2Vsc2UKLQotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IG5iQXVkaW9GcmFtZXMgLyAzOCArIDE7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbHNlCi0KLSAgICAvKiBWSURFTyA1IG1pbiBhdCAyNSBmcHMgbnVsbC1lbmMgKi8KLQotICAgIE00TVA0V19TVFRTX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfU1RTWl9BTExPQ19TSVpFID0gMTgwMDA7Ci0gICAgTTRNUDRXX1NUU1NfQUxMT0NfU0laRSA9IDUwMDA7Ci0gICAgTTRNUDRXX0NIVU5LX0FMTE9DX05CID0gNTAwOwotCi0gICAgLyogQVVESU8gMiBtaW4gYWFjKyBudWxsLWVuYyAqLwotCi0gICAgTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSA9IDMyMDAwOwotICAgIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUgPSAyMDAwMDsKLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSAxMDAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfb3BlbldyaXRlKE00T1NBX0NvbnRleHQgKmNvbnRleHRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpmaWxlV3JpdGVyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKmZpbGVSZWFkZXJGdW5jdGlvbiApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0UHRyLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IG91dHB1dEZpbGVEZXNjcmlwdG9yLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGZpbGVXcml0ZXJGdW5jdGlvbiwgTTRFUlJfUEFSQU1FVEVSKTsKLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIE9wdGlvbmFsLCBmZWF0dXJlIHdvbid0IGJlIHVzZWQgaWYgTlVMTCAqLwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoInRlbXBGaWxlRGVzY3JpcHRvciA9ICVwIiwgdGVtcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IHRlbXBGaWxlRGVzY3JpcHRvcikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgInRlbXBGaWxlRGVzY3JpcHRvciBpcyBOVUxMLCBSRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgZmVhdHVyZSBub3QgdXNlZCIpOwotICAgIH0KLQotI2Vsc2UgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICAvKiBOb3QgdXNlZCA6IEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IHRlbXBGaWxlRGVzY3JpcHRvciwgTTRFUlJfUEFSQU1FVEVSKTsgKi8KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIC8qIE5vdCB1c2VkIDogRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gZmlsZVJlYWRlckZ1bmN0aW9uLCBNNEVSUl9QQVJBTUVURVIpOyAqLwotCi0gICAgLyogVGhlIGNvbnRleHQgcmV1c2UgbW9kZSB3YXMgc3VwcHJlc3NlZCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHIgPQotICAgICAgICAoTTRNUDRXX01wNEZpbGVEYXRhICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfTXA0RmlsZURhdGEpLAotICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk1QNCB3cml0ZXIgY29udGV4dCIpOwotICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsID0gb3V0cHV0RmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplID0gTTRNUDRXX0RlZmF1bHRNYXhDaHVua1NpemU7IC8qZGVmYXVsdCAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZSA9IE00TVA0V19EZWZhdWx0TWF4QXVTaXplOyAgICAgICAvKmRlZmF1bHQgICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyID0KLSAgICAgICAgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplID0gMDsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gPSAwOyAvKmRlZmF1bHQgaXMgIiAwLjAuMCIqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgaXMgaW4gQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7IC8qZGVmYXVsdCBpcyAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPSAwOyAvKmRlZmF1bHQgPSAwLCBpLmUuIG5vdCB1c2VkKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucyA9IGZpbGVXcml0ZXJGdW5jdGlvbjsKLSAgICBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfb3BlbmVkOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPSAwOyAvKmkqLwotICAgIC8qcGF0Y2ggZm9yIGludGVncmF0aW9uVGFnIDE3NCAtPiAyMzggKCs2NCkqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgPQotICAgICAgICAyMzg7IC8qaW5pdGlhbGl6YXRpb24gd2l0aCBjb25zdGFudCBwYXJ0IGluIGZ0eXArbWRhdCttb292K3NraXAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lID0KLSAgICAgICAgMDsgLypzZXQgYW5kIHVzZWQgb25seSB3aGVuIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPQotICAgICAgICAzMjsgLyppbml0IHdpdGggZnR5cCArIGJlZ2lubmluZyBvZiBtZGF0IHNpemUqLwotCi0jZW5kaWYKLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSB0ZW1wRmlsZURlc2NyaXB0b3I7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPQotICAgICAgICBNNE9TQV9GQUxTRTsgLyogTm8gbmVlZCB0byBjbGVhbiBpdCBqdXN0IHlldC4gKi8KLQotI2VuZGlmICAgICAgICAgICAgICAgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIC8qIGZ0eXAgYXRvbSAqLwotCi0gICAgbWVtc2V0KCh2b2lkICopICZtTXA0RmlsZURhdGFQdHItPmZ0eXAsMCwKLSAgICAgICAgc2l6ZW9mKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCkpOwotCi0gICAgKmNvbnRleHRQdHIgPSBtTXA0RmlsZURhdGFQdHI7Ci0KLSAgICBNNE1QNFdfaW5pdGlhbGl6ZUFsbG9jYXRpb25QYXJhbWV0ZXJzKG1NcDRGaWxlRGF0YVB0cik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfYWRkU3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICpzdHJlYW1EZXNjUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLQotICAgIEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3JlYWR5OwotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAvKkF1ZGlvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYW4gYXVkaW8gdHJhY2sgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSwKLSAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYWxsb2MgbmVlZCB0byBiZSBkb25lKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSAoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfQXVkaW9UcmFja0RhdGEpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19BdWRpb1RyYWNrRGF0YSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXZSBtdXN0IGluaXQgdGhlc2UgcG9pbnRlcnMgaW4gY2FzZSBhbiBhbGxvYyBiZWxsb3cgZmFpbHMgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKm5vdyBkeW5hbWljKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0MDI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7IC8qIGluaXQgdmFsdWUgKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19yZWFkeTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT50aW1lU2NhbGUgPT0gODAwMCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgMTYwOyAvKkFNUjgrdGltZXNjYWxlPTgwMDAgPT4gc2FtcGxlIGR1cmF0aW9uIDE2MCBjb25zdGFudCovCi0KLSAgICAgICAgICAgICAgICAvKlVzZSBnaXZlbiBEU0kgaWYgcGFzc2VkLCBlbHNlIHVzZSBkZWZhdWx0IHZhbHVlKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qYW1yIERTSSBpcyA5IGJ5dGVzIGxvbmcgISovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICA5OyAvKmFsd2F5cyA5IGZvciBhbXIqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gOSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg5LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDkgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rRVZSQykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDgwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDE2MDsgLypFVlJDK3RpbWVzY2FsZT04MDAwID0+IHNhbXBsZSBkdXJhdGlvbiAxNjAgY29uc3RhbnQqLwotCi0gICAgICAgICAgICAgICAgLypVc2UgZ2l2ZW4gRFNJIGlmIHBhc3NlZCwgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSovCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmV2cmMgRFNJIGlzIDYgYnl0ZXMgbG9uZyAhKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDY7IC8qYWx3YXlzIDYgZm9yIGV2cmMqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2LCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICA2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IHN0YXRpYyBibG9jayB3aWxsIGJlIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMDsgLypidXQgdGhlIGFjdHVhbCBzdGF0aWMgZHNpIGlzIDYgYnl0ZXMgISovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKk00U1lTX2tBQUMqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qYXZnIGJpdHJhdGUgc2hvdWxkIGJlIHNldCovCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlICE9IC0xLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qZG9uJ3Qga25vdyBmb3IgYWFjLCBzbyBzZXQgMCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKm5vIGRzaTogcmV0dXJuIGJhZCBwYXJhbWV0ZXIgPyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNFNZU19rTVBFR180KToKLSAgICAgICAgY2FzZSAoTTRTWVNfa0gyNjQpOgotICAgICAgICBjYXNlIChNNFNZU19rSDI2Myk6Ci0gICAgICAgICAgICAvKlZpZGVvKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5zdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlELAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYSB2aWRlbyB0cmFjayBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFLAotICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICAgICAgLypjaGVjayBpZiBhbGxvYyBuZWVkIHRvIGJlIGRvbmUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9IChNNE1QNFdfVmlkZW9UcmFja0RhdGEKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TVA0V19WaWRlb1RyYWNrRGF0YSksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiTTRNUDRXX1ZpZGVvVHJhY2tEYXRhIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFdlIG11c3QgaW5pdCB0aGVzZSBwb2ludGVycyBpbiBjYXNlIGFuIGFsbG9jIGJlbGxvdyBmYWlscyAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLypub3cgZHluYW1pYyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0gICAgICAgICAgICAgICAgLypyZS11c2UgdGhlIHNhbWUgY2h1bmsgYW5kIGZsdXNoIGl0IHdoZW4gZnVsbCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rID0gMDsKLSAgICAgICAgICAgICAgICAvKnRhYmxlcyBhcmUgbm93IGR5bmFtaWMqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyA9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX1NUU1NfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDYyOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA9IE00TVA0V19EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCA9IE00TVA0V19EZWZhdWx0SGVpZ2h0OwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsgLyogaW5pdCB2YWx1ZSAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuayA9Ci0gICAgICAgICAgICAgICAgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTks7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDEwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlID0gMTAwMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlWzBdID0gMDsgICAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVswXSA9IDA7IC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGVbMF0gPSAwOyAgIC8qaW5pdCovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA9Ci0gICAgICAgICAgICAgICAgMDsgLyoxc3QgY2h1bmsgaXMgQ2h1bmtbMF0qLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tIMjYzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlID09IC0xKQotICAgICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZSA9PSAtMSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnRoZSBiaXRyYXRlIHdpbGwgbm90IGJlIHdyaXR0ZW4gaWYgdGhlIGJpdHJhdGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBmdWxseSBzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnByb3ByaWV0YXJ5IHN0b3JhZ2Ugb2YgaDI2MyBiaXRyYXRlLgotICAgICAgICAgICAgICAgICAgICAgV2FybmluZzogbm90IHRoZSBhY3R1YWwgYml0cmF0ZSAoYml0IHNldCB0byAxKS4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoIDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNyBieXRlcyBsb25nICovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9PSA3LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp1c2UgdGhlIGRlZmF1bHQgZHNpKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa01QRUdfNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDIyOyAvKmV4dHJhIGJ5dGVzIChmcm9tIGgyNjMpKi8KLSAgICAgICAgICAgICAgICAvKiBhbGxvdyBEU0kgdG8gYmUgTTRPU0FfTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGUgYWN0dWFsIERTSSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgIHNldCBieSBzZXRPcHRpb24uICovCi0gICAgICAgICAgICAgICAgaWYgKCggMCA9PSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTVA0ViBzcGVjaWZpYyovCi0gICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwNSBzbyB0aGF0IEVTRCBzaXplIGNhbiBiZSBjb2RlZCB3aXRoIDEgYnl0ZSovCi0gICAgICAgICAgICAgICAgICAgIC8qKHRoaXMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGl2ZSBiZWNhdXNlIGRzaSBpcyBhbHdheXMgc2hvcnRlciAhKSovCi0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA8IDEwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKmF2ZyBiaXRyYXRlIHNob3VsZCBiZSBzZXQqLwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogSDI2NCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKDAgIT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmJNVUxQUFNTUFMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiBTUFNMZW5ndGgsIFBQU0xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqRFNJOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMjQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBEU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICAgICAgU1BTTGVuZ3RoID0gRFNJWzZdOwotICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoID0gRFNJWzEwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsxMiksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrMiksICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCksIFNQU0xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIgKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyMCksIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSkrNCArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKHN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8pKzI4ICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogLSBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdXNlIHRoZSBkZWZhdWx0IGRzaSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MgPSBNNE9TQV9rRmlsZVdyaXRlIHwgTTRPU0Ffa0ZpbGVDcmVhdGU7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSAgICAvKmF1ZGlvIG1pY3Jvc3RhdGUgKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IGF1ZGlvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAvKiAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICB7Ci0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID09IE00TVA0V19yZWFkeSksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIC8qIEZpcnN0IHZpZGVvIGNodW5rIGFsbG9jYXRpb24gKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rWzBdIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgfQotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIC8qc2V0IGF1ZGlvTXNDaHVua0R1ciAoZHVyYXRpb24gaW4gbXMgYmVmb3JlIGEgbmV3IGNodW5rIGlzIGNyZWF0ZWQpCi0gICAgICAgICBmb3IgYXVkaW8gc2l6ZSBlc3RpbWF0aW9uKi8KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8sIE00RVJSX0JBRF9DT05URVhUKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8sIE00RVJSX0JBRF9DT05URVhUKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9Ci0gICAgICAgICAgICAyMCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotCi0gICAgICAgIGlmICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cgotICAgICAgICAgICAgPCAyMCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cjsKLSAgICAgICAgfQotICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKAotICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIoMTYgKyAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihNNE1QQUNfRlRZUF9UQUcsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1pbm9yX3ZlcnNpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAuY29tcGF0aWJsZV9icmFuZHNbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHV0IGRlZmF1bHQgZnR5cCBib3ggKi8KLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKERlZmF1bHRfZnR5cCwgc2l6ZW9mKERlZmF1bHRfZnR5cCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgfQotCi0gICAgLyppbml0IG1kYXQgdmFsdWUgd2l0aCAwIGJ1dCB0aGUgcmlnaHQgdmFsdWUgaXMgc2V0IGp1c3QgYmVmb3JlIHRoZSBmaWxlIGlzIGNsb3NlZCovCi0gICAgZXJyID0gTTRNUDRXX3B1dEJFMzIoMCwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICBpZiAoMCAhPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplCi0gICAgICAgICYmIE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfRVJSIGVycjIgPSBNNE5PX0VSUk9SOwotICAgICAgICBNNE9TQV9Db250ZXh0IHNhZmV0eUZpbGVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNhZmV0eUZpbGVTaXplID0gMCwgYWRkZW5kdW0gPSAwOwotICAgICAgICBNNE9TQV9VQ2hhciBkdW1teURhdGFbMTAwXTsgLyogVG8gZmlsbCB0aGUgc2FmZXR5IGZpbGUgd2l0aCAqLwotCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmc2FmZXR5RmlsZUNvbnRleHQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIDEwJSBzZWVtcyB0byBiZSBhIHJlYXNvbmFibGUgd29yc3QgY2FzZSwgYnV0IGFsc28gcHJvdmlzaW9uIGZvciAxa2Igb2YgbW9vdiBvdmVyaGVhZC4qLwotICAgICAgICBzYWZldHlGaWxlU2l6ZSA9IDEwMDAgKyAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSAqIDEwICsgOTkpIC8gMTAwOwotCi0gICAgICAgIC8qIEhlcmUgd2UgYWRkIHNwYWNlIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHdlIGhhdmUgdG8gZmx1c2ggYW55IHBlbmRpbmcKLSAgICAgICAgY2h1bmsgaW4gY2xvc2VXcml0ZSwgdGhpcyBzcGFjZSBpcyB0aGUgc3VtIG9mIHRoZSBtYXhpbXVtIGNodW5rIHNpemVzLCBmb3IgZWFjaAotICAgICAgICB0cmFjay4gKi8KLQotI2lmbmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbykKLSAgICAgICAgewotICAgICAgICAgICAgc2FmZXR5RmlsZVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZmV0eUZpbGVTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopZHVtbXlEYXRhLCAweENBLHNpemVvZihkdW1teURhdGEpKTsgLyogRm9yIGV4dHJhIHNhZmV0eS4gKi8KLQotICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgIGkgPCAoc2FmZXR5RmlsZVNpemUgKyBzaXplb2YoZHVtbXlEYXRhKSAtIDEpIC8gc2l6ZW9mKGR1bW15RGF0YSk7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPndyaXRlRGF0YSgKLSAgICAgICAgICAgICAgICBzYWZldHlGaWxlQ29udGV4dCwgZHVtbXlEYXRhLCBzaXplb2YoZHVtbXlEYXRhKSk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIERvbid0IHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbiB5ZXQsIGFzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGZpbGUgZmlyc3QuICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJIGRvbid0IG5lZWQgdG8ga2VlcCBpdCBvcGVuLiAqLwotICAgICAgICBlcnIyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZShzYWZldHlGaWxlQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIyKSwgZXJyMik7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlNhZmV0eSBmaWxlIGNvcnJlY3RseSBjcmVhdGVkIik7Ci0gICAgfQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfbmV3QXVkaW9DaHVuayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqbGVmdFNwYWNlSW5DaHVuayApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvOwotCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgcmVhbGxvY05iOwotCi0jZW5kaWYKLQotICAgIC8qIHZpZGVvIG9ubHkgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiIE00TVA0V19uZXdBdWRpb0NodW5rIC0gZmx1c2ggYXVkaW8iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zKTsKLQotICAgIHNjYWxlX2F1ZGlvID0gMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3QXVkaW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0KLSAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgIGNvbnNlcXVlbmNlIHRoYXQgaXQgd2lsbCBiZSBhcyBpZiB0aGUgY2h1bmsgaGFzIG5vdCBiZWVuIGZsdXNoZWQgeWV0LCBhbmQgdGhlcmVmb3JlCi0gICAgICAgICBpdCB3aWxsIGJlIGRvbmUgYXMgcGFydCBvZiBjbG9zZVdyaXRlICh3aGVyZSB0aGVyZSBjb3VsZCBiZSByb29tIHRvIGRvIHNvLAotICAgICAgICAgaWYgc29tZSBlbWVyZ2VuY3kgcm9vbSBpcyBmcmVlZCBmb3IgdGhhdCBwdXJwb3NlKS4gKi8KLQotICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4gKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLyp1cGRhdGUgY2h1bmsgaW5mbyAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayArPSAxOwotICAgIC8qaWYgYXVkaW8gYW1vdW50IG9mIGRhdGEgaXMgbm90IGVzdGltYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gMTY7Ci0KLSAgICAvKmFsbG9jIG5ldyBjaHVuayovCi0gICAgLypvbmx5IGlmIG5vdCBhbHJlYWR5IGFsbG9jYXRlZCovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdBdWRpb0NodW5rIDogYXVkaW8gY2h1bmsgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBpZiAoKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICAgICAgICAgICUgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWFsbG9jTmIgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgICAgICsgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05COwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE1QNFdfVGltZTMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLQotICAgIC8qdXBkYXRlIGxlZnRTcGFjZUluQ2h1bmssIGN1cnJlbnRQb3MgYW5kIGN1cnJlbnRDaHVua0R1ciovCi0gICAgKmxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAvKiBjaGVjayB3ZXRoZXIgdG8gdXNlIGEgbmV3IHN0c2Mgb3Igbm90ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA+IDApCi0gICAgewotICAgICAgICBpZiAoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgIT0gKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgLSAxXSAmIDB4RkZGKSkKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0KLSAgICAvKiBtYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld0F1ZGlvQ2h1bmsgOiBhdWRpbyBzdHNjIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyogc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2NdID0KLSAgICAgICAgMCArIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayA8PCAxMik7Ci0KLSNlbHNlCi0gICAgLypzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgLypzZXQgdGltZSBvZiB0aGUgbmV3IGNodW5rIHRvIGxhc3RDVFMgKGZvciBpbml0aWFsaXphdGlvbiwgYnV0IHVwZGF0ZWQgZnVydGhlciB0byB0aGUKLSAgICBDVFMgb2YgdGhlIGxhc3Qgc2FtcGxlIGluIHRoZSBjaHVuaykqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX2F1ZGlvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19uZXdWaWRlb0NodW5rKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpsZWZ0U3BhY2VJbkNodW5rICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW87Ci0KLSNpZm5kZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiByZWFsbG9jTmI7Ci0KLSNlbmRpZgotCi0gICAgLyogYXVkaW8gb25seSAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciA9PSBNNE9TQV9OVUxMKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayAtIGZsdXNoIHZpZGVvIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICBzY2FsZV92aWRlbyA9IDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAvKiBzYW1wbGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4gdG8gZmlsZSAqLwotI2Vsc2UKLSAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICJNNE1QNFdfbmV3VmlkZW9DaHVuazogcHV0QmxvY2sgZXJyb3Igd2hlbiBmbHVzaGluZyBjaHVuazogJSNYIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIC8qIE91Y2gsIHdlIGdvdCBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBmaWxlLCBidXQgd2UgbmVlZCB0byBwcm9wZXJseSByZWFjdCBzbyB0aGF0IHRoZQotICAgICAgICAgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMgYmVlbgotICAgICAgICAgcmVjb3JkZWQgc28gZmFyIGlzIG5vdCBsb3N0LiBZYXkgZXJyb3IgcmVjb3ZlcnkhICovCi0KLSAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgc3RhdGUgZGF0YS4gKi8KLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0gICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIGNodW5rIGhhcyBub3QgYmVlbiBmbHVzaGVkIHlldCwgYW5kIHRoZXJlZm9yZSBpdAotICAgICAgICAgd2lsbCBiZSBkb25lIGFzIHBhcnQgb2YgY2xvc2VXcml0ZSAod2hlcmUgdGhlcmUgY291bGQgYmUgcm9vbSB0byBkbyBzbywgaWYgc29tZQotICAgICAgICAgZW1lcmdlbmN5IHJvb20gaXMgZnJlZWQgZm9yIHRoYXQgcHVycG9zZSkuICovCi0KLSAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBvZmZzZXQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtPZmZzZXRUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyArPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnVwZGF0ZSBjaHVuayBpbmZvIGJlZm9yZSB0byBnbyBmb3IgYSBuZXcgb25lKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfdmlkZW8pOwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgKz0gMTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDE2OwotCi0gICAgLyphbGxvYyBuZXcgY2h1bmsqLwotICAgIC8qb25seSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgTGFzdEFsbG9jYXRlZENodW5rICggLT4gPSBjdXJyZW50Q2h1bmspKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsgKz0gMTsKLQotICAgICAgICAvKm1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBpZiAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayA6IHZpZGVvIGNodW5rIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKCgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgICAgICAgICAlIE00TVA0V19DSFVOS19BTExPQ19OQikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGxvY05iID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICAgICArIE00TVA0V19DSFVOS19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuaywKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYgotICAgICAgICAgICAgICAgIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKSAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUNoYXIgKikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua09mZnNldFRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTaXplVGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZSwgKCByZWFsbG9jTmIKLSAgICAgICAgICAgICAgICAtIE00TVA0V19DSFVOS19BTExPQ19OQikgKiBzaXplb2YoTTRNUDRXX1RpbWUzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00TVA0V19UaW1lMzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUiKTsKLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDaHVua1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10KLSAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotCi0gICAgLyp1cGRhdGUgbGVmdFNwYWNlSW5DaHVuaywgY3VycmVudFBvcyBhbmQgY3VycmVudENodW5rRHVyKi8KLSAgICAqbGVmdFNwYWNlSW5DaHVuayA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIC8qIGNoZWNrIHdldGhlciB0byB1c2UgYSBuZXcgc3RzYyBvciBub3QgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjID4gMCkKLSAgICB7Ci0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpICE9IChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgIC0gMV0gJiAweEZGRikpCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotCi0gICAgLyogbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdWaWRlb0NodW5rIDogdmlkZW8gc3RzYyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSA9Ci0gICAgICAgIDAgKyAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPDwgMTIpOwotCi0jZWxzZQotICAgIC8qc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAwOwotCi0jZW5kaWYKLQotICAgIC8qc2V0IHRpbWUgb2YgdGhlIG5ldyBjaHVuayB0byBsYXN0Q1RTIChmb3IgaW5pdGlhbGl6YXRpb24sIGJ1dCB1cGRhdGVkIGZ1cnRoZXIgdG8gdGhlCi0gICAgQ1RTIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgY2h1bmspKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV92aWRlbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICphdVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVmdFNwYWNlSW5DaHVuazsKLSAgICBNNE1QNFdfVGltZTMyIGNodW5rRHVyTXM7Ci0KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW87Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvOwotCi0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soYXVQdHIgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCItLS0tLSBNNE1QNFdfc3RhcnRBVSAtLS0tLSIpOwotCi0gICAgLypjaGVjayBtYWNybyBzdGF0ZSovCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiBhdWRpbyIpOwotCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoImF1ZGlvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGNodW5rRHVyTXMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV9hdWRpbykgLSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudENodW5rXSk7Ci0KLSAgICAgICAgaWYgKChsZWZ0U3BhY2VJbkNodW5rIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUpCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChjaHVua0R1ck1zID49IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cikpKQotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgICAgICAvKiBvbmx5IGlmIHRoZXJlIGlzIGF0IGxlYXN0IDEgdmlkZW8gc2FtcGxlIGluIHRoZSBjaHVuayAqLwotCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjbG9zZSB0aGUgb3BlbmVkIHZpZGVvIGNodW5rIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBhdWRpbyBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3VmlkZW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgICAgICAgLyogbm90IGVub3VnaCBzcGFjZSBpbiBjdXJyZW50IGNodW5rOiBjcmVhdGUgYSBuZXcgb25lICovCi0KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdBdWRpb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBhdVB0ci0+c2l6ZSA9IGxlZnRTcGFjZUluQ2h1bms7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPSAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLQotICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpIC8qdmlkZW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfc3RhcnRBVSAtPiB2aWRlbyIpOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZ19zdGFydEFVOwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSAgICAgICAgY2h1bmtEdXJNcyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50Q2h1bmtdKTsKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLQotI2VuZGlmCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoInZpZGVvICVkICAlZCIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgIGlmICgoIGxlZnRTcGFjZUluQ2h1bmsgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSkKLSAgICAgICAgICAgIHx8ICgoIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKQotICAgICAgICAgICAgJiYgKGNodW5rRHVyTXMgPj0gbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyKSkKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmICgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKQotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rKSkKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgLypub3QgZW5vdWdoIHNwYWNlIGluIGN1cnJlbnQgY2h1bms6IGNyZWF0ZSBhIG5ldyBvbmUqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld1ZpZGVvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJzdGFydEFVOiBzaXplIDB4JXggcG9zIDB4JXggY2h1bmsgJXUiLCBhdVB0ci0+c2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiYWRyID0gMHglcCIsIGF1UHRyLT5kYXRhQWRkcmVzcyk7Ci0KLSAgICAgICAgaWYgKGF1UHRyLT5kYXRhQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzMoIiBkYXRhID0gJTA4WCAlMDhYICUwOFgiLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMF0sCi0gICAgICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzWzFdLCBhdVB0ci0+ZGF0YUFkZHJlc3NbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVQdHItPnNpemUgPSBsZWZ0U3BhY2VJbkNodW5rOwotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zICsgNCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zKTsKLQotI2Vsc2UKLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSArIDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MKLSAgICAgICAgICAgICsgNCk7IC8qIEluIEgyNjQsIHdlIG11c3Qgc3RhcnQgYnkgdGhlIGxlbmd0aCBvZiB0aGUgTkFMVSwgY29kZWQgaW4gNCBieXRlcyAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE1QV19zdGFydEFVOiBzdGFydCBhZGRyZXNzOiVwLCBzaXplOiVsdSwgc3RyZWFtOiVkIiwKLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzLCBhdVB0ci0+c2l6ZSwgc3RyZWFtSUQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3Byb2Nlc3NBVSggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKmF1UHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19UaW1lMzIgZGVsdGE7Ci0gICAgTTRNUDRXX1RpbWUzMiBsYXN0U2FtcGxlRHVyOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIC8qZXhwZWN0ZWRTaXplIGlzIHRoZSBtYXggZmlsZXNpemUgdG8gZm9yZWNhc3Qgd2hlbiBhZGRpbmcgYSBuZXcgQVU6Ki8KLSAgICBNNE9TQV9VSW50MzIgZXhwZWN0ZWRTaXplID0KLSAgICAgICAgMzI7IC8qaW5pdGlhbGl6ZWQgd2l0aCBhbiBlc3RpbWF0aW9uIG9mIHRoZSBtYXggbWV0YWRhdGEgc3BhY2UgbmVlZGVkIGZvciBhbiBBVS4qLwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbyA9IDAuMDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW8gPSAwLjA7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKmNoZWNrIG1hY3JvIHN0YXRlKi8KLSAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3dyaXRpbmcpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSIpOwotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpCi0gICAgICAgIHNjYWxlX2F1ZGlvID0KLSAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICAvKiBQTCAyNy8xMC8yMDA4OiBhZnRlciB0aGUgcmVzdXJnZW5jZSBvZiB0aGUgQUFDIDEyOCBidWcsIEkgYWRkZWQgYSBkZWJ1ZyBjaGVjayB0aGF0Ci0gICAgIHRoZSBlbmNvZGVkIGRhdGEgZGlkbid0IG92ZXJmbG93IHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIEFVICovCi0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgQXVkaW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplLAotICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgWW91IG1pZ2h0IHdpc2ggdG8gaW52ZXN0aWdhdGUgdGhhdC4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVmlkZW9TdHJlYW1JRDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShhdVB0ci0+c2l6ZQotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAiVWggb2guIEJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUgd3JpdGVyLiBBYmFuZG9uIHNoaXAhIik7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjIoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICJPb3BzLiBBbiBBVSB3ZW50IG92ZXIgdGhlIGRlY2xhcmVkIE1heCBBVSBzaXplLlwKLSAgICAgICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3aXNoIHRvIGludmVzdGlnYXRlIHRoYXQuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKm9ubHkgaWYgbm90IGluIHRoZSBjYXNlIGF1ZGlvIHdpdGggZXN0aW1hdGVBdWRpb1NpemUKLSAgICAoZWxzZSwgc2l6ZSBhbHJlYWR5IGVzdGltYXRlZCBhdCB0aGlzIHBvaW50KSovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICB8fCAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKmNoZWNrIGZpbGVzaXplIGlmIG5lZWRlZCovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdGVkU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICsgYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgIGlmICgoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgICAgID09IE00U1lTX2tIMjY0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3RlZFNpemUgKz0gNDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4cGVjdGVkU2l6ZSA+IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInByb2Nlc3NBVSA6ICEhIEZJTEVTSVpFIEVYQ0VFREVEICEhIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBwYXRjaCBmb3IgYXV0b3N0b3AgaXMgTWF4RmlsZVNpemUgZXhjZWVkZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHN0b3AgYXQgdGFyZ2V0ZWQgZmlsZXNpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qY2FzZSBhdWRpb01zU3RvcFRpbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQgZHVyaW5nIHZpZGVvIHByb2Nlc3NpbmcsCi0gICAgIGFuZCBub3cgY2hlY2sgaXQgZm9yIGF1ZGlvKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc1N0b3BUaW1lIDw9IChhdVB0ci0+Q1RTICpzY2FsZV9hdWRpbykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RvcCB0aW1lIHJlYWNoZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0cmVhbUlEID09IEF1ZGlvU3RyZWFtSUQpIC8qYXVkaW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIC0+IGF1ZGlvIik7Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nX3N0YXJ0QVUpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBkZWx0YSA9IChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICAgICAgLyogREVCVUcgc3R0cyBlbnRyaWVzIHdoaWNoIGFyZSBlcXVhbCB0byAwICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJBX0RFTFRBID0gJWxkXG4iLCBkZWx0YSk7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotICAgICAgICAgICAgLypzZXQgYXUgc2l6ZSovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9IGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICAvKnNhbXBsZSBkdXJhdGlvbiBpcyBhIHByaW9yaSBjb25zdGFudCBpbiBhdWRpbyBjYXNlLCAqLwotICAgICAgICAgICAgLypidXQgaWYgYW4gQXUgYXQgbGVhc3QgaGFzIGRpZmZlcmVudCBzaXplLCBhIHN0c3ogdGFibGUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9IGRlbHRhOyAqLwotICAgICAgICAgICAgLypUT0RPIHRlc3Qgc2FtcGxlIGR1cmF0aW9uPyAoc2hvdWxkIGJlIDIwbXMgaW4gQU1SOCwgMTYwIHRpY3Mgd2l0aCB0aW1lc2NhbGUgODAwMCkgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYXUgc2l6ZSBpcyBjb25zdGFudCAoYXVkaW8pICovCi0gICAgICAgICAgICAvKjAgc2FtcGxlIHNpemUgbWVhbnMgbm9uIGNvbnN0YW50IHNpemUqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICE9IGF1UHRyLT5zaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBBVSB3aXRoIGRpZmZlcmVudCBzaXplID0+IG5vbiBjb25zdGFudCBzaXplID0+IFNUU1ogdGFibGUgbmVlZGVkKi8KLSAgICAgICAgICAgICAgICAgICAgLypjb21wdXRhdGlvbiBvZiB0aGUgbmIgb2YgYmxvY2sgb2Ygc2l6ZSBNNE1QNFdfU1RTWl9BTExPQ19TSVpFIHRvIGFsbG9jYXRlKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxICsgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgICAgICogNCAvIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWgotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaSA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmJdID0gYXVQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qdXNlZCBhcyBhIGZsYWcgaW4gdGhhdCBjYXNlKi8KLSAgICAgICAgICAgICAgICAgICAgLyptb3JlIGJ5dGVzIGluIHRoZSBmaWxlIGluIHRoYXQgY2FzZToqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UgdGFibGUgYWxyZWFkeSBleGlzdHMqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArIDMpCi0gICAgICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKk00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaLCAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUU1pfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVOYl0gPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVsdGEgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIHJlYWwgc2FtcGxlIGR1cmF0aW9uKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPSBkZWx0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMSkgLyp0ZXN0IGlmIHNlY29uZCBBVSovCi0gICAgICAgIHsKLSNpZm5kZWYgRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IGRlbHRhOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotICAgICAgICAgICAgbGFzdFNhbXBsZUR1ciA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgaWYgKDggKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogYXVkaW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg4ICptTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFMsICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBsYXN0U2FtcGxlRHVyKSAvKm5ldyBlbnRyeSBpbiB0aGUgdGFibGUqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXSA9IGRlbHRhOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9Ci0gICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpIC0gMl0gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKz0gMTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gKz0KLSAgICAgICAgICAgIDE7Ci0KLSNlbmRpZgotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkgLyp2aWRlbyBzdHJlYW0qLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUgLT4gdmlkZW8iKTsKLQotICAgICAgICAvKiBJbiBoMjY0LCB0aGUgc2l6ZSBvZiB0aGUgQVUgbXVzdCBiZSBhZGRlZCB0byB0aGUgZGF0YSAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFkZCB0aGUgc2l6ZSBvZiB0aGUgTkFMVSBpbiBCRSAqLwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcERhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyAtPSAxOwotICAgICAgICAgICAgcFRtcERhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KWF1UHRyLT5kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgLy8gYml0IG1hbmlwdWxhdGlvbgotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gMjQpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiAxNikgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDgpICAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUpICAgICAgICYgMHgwMDAwMDBGRik7Ci0KLSAgICAgICAgICAgIGF1UHRyLT5zaXplICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIG1pY3Jvc3RhdGUqLwotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZQotICAgICAgICAgICAgPT0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVSksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmc7Ci0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgLyogc2FtcGxlcyBhcmUgd3JpdHRlbiB0byBmaWxlIG5vdyAqLwotCi0gICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jaygoTTRPU0FfVUNoYXIgKilhdVB0ci0+ZGF0YUFkZHJlc3MsIGF1UHRyLT5zaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gdGVtcCA9IG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX3Byb2Nlc3NBVTogcHV0QmxvY2sgZXJyb3Igd2hlbiB3cml0aW5nIHVuYnVmZmVyZWQgdmlkZW8gc2FtcGxlOiAlI1giLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdAotICAgICAgICAgICAgIHRoZSBzdGF0ZSBpcyBzdGlsbCBjb25zaXN0ZW50IGFuZCB3ZSBjYW4gcHJvcGVybHkgY2xvc2UgdGhlIGZpbGUgc28gdGhhdCB3aGF0IGhhcwotICAgICAgICAgICAgICBiZWVuIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgICAgICAvKiBGaXJzdCwgd2UgZG8gbm90IGtub3cgd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlLiBQdXQgdXMgYmFjayBhdCB3aGVyZSB3ZSB3ZXJlIGJlZm9yZQotICAgICAgICAgICAgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZGF0YS4gVGhhdCB3YXksIHdlJ3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY2h1bmsgYW5kIHNhbXBsZQotICAgICAgICAgICAgIHN0YXRlIGRhdGEuYWJzb2x1dGVDdXJyZW50UG9zIGlzIG9ubHkgdXBkYXRlZCBmb3IgY2h1bmtzLCBpdCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgIG9mIHRoZSBjaHVuayx0aGVyZWZvcmUgd2UgbmVlZCB0byBhZGQgdmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyB0byBrbm93IHdoZXJlIHdlCi0gICAgICAgICAgICAgd2VyZSBpbiB0aGUgZmlsZS4gKi8KLSAgICAgICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJnRlbXApOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAiQmFja3RyYWNraW5nIHRvIHBvc2l0aW9uIDB4JTA4WCwgc2VlayByZXR1cm5lZCAlZCBhbmQgcG9zaXRpb24gJTA4WCIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywgZXJyLCB0ZW1wKTsKLQotICAgICAgICAgICAgLyogVGhlbiwgZG8gbm90IHVwZGF0ZSBhbnkgaW5mbyB3aGF0c29ldmVyIGluIHRoZSB3cml0aW5nIHN0YXRlLiBUaGlzIHdpbGwgaGF2ZSB0aGUKLSAgICAgICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIHNhbXBsZSBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLCBzbyB0aGUgY2h1bmsKLSAgICAgICAgICAgICB3aWxsIGJlIG1lcmVseSBjbG9zZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHNhbXBsZSAodGhlIHNhbXBsZSB3ZSBhdHRlbXB0ZWQgdG8gd3JpdGUKLSAgICAgICAgICAgICBoZXJlIGlzIGxvc3QpLiAqLwotCi0gICAgICAgICAgICAvKiBBbmQgbGFzdGx5IChmb3IgaGVyZSksIHJldHVybiB0aGF0IHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbWl0IG9mIGF2YWlsYWJsZSBzcGFjZS4KLSAgICAgICAgICAgICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciBvcmlnaW5hbGx5IHJldHVybmVkIGJ5IHB1dEJsb2NrLiAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBpZiAoKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUyA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTKSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgcmVwb3J0IGFzIGVycm9yLCBpdCB3aWxsIGFib3J0IHRoZSBlbnRpcmUgZmlsZXdyaXRlLiBKdXN0IHNraXAgdGhpcyBmcmFtZS4KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJTa2lwIGZyYW1lLiBWaWRlbyBmcmFtZSBoYXMgdG9vIG9sZCB0aW1lc3RhbXAuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyArPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIGRlbHRhID0gKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUwotICAgICAgICAgICAgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUzsKLQotICAgICAgICAvKiBERUJVRyBzdHRzIGVudHJpZXMgd2hpY2ggYXJlIGVxdWFsIHRvIDAgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIlZfREVMVEEgPSAlbGRcbiIsIGRlbHRhKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKDIgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKyAzKQotICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgKk00TVA0V19TVFNaX0FMTE9DX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzeiB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYl0gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZWxzZQotCi0gICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BTExPQ19TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzICs9IDE7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FMTE9DX1NJWkUpOwotCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIFRBQkxFX1NUU1pbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iXSA9Ci0gICAgICAgICAgICBhdVB0ci0+c2l6ZTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotCi0jZW5kaWYKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDEpOwotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0sIDApOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gMDsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDEgKSAvKnRlc3QgaWYgc2Vjb25kIEFVKi8KLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSBkZWx0YTsKLQotI2VuZGlmCi0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qcmV0cmlldmUgbGFzdCBzYW1wbGUgZGVsdGEqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBNNE1QNFdfZ2V0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLQotICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgICsgMykgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3R0cyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXTsKLQotICAgICAgICAgICAgaWYgKDggKm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RUU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUUywgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUVFNfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RUU19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FKi8KLQotICAgICAgICAgICAgaWYgKGRlbHRhICE9IGxhc3RTYW1wbGVEdXIpIC8qbmV3IGVudHJ5IGluIHRoZSB0YWJsZSovCi0gICAgICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmJdLCAxKTsKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iXSwgKE00T1NBX1VJbnQxNilkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpXSA9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpKzFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgKz0KLSAgICAgICAgICAgICAgICAgICAgMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppbmNyZWFzZSBvZiAxIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQVVzIHdpdGggc2FtZSBkdXJhdGlvbiovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0gKz0gMTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICs9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2NdICs9Ci0gICAgICAgICAgICAxOwotCi0jZWxzZQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdICs9Ci0gICAgICAgICAgICAxOwotCi0jZW5kaWYKLQotICAgICAgICBpZiAoYXVQdHItPmF0dHJpYnV0ZSA9PSBBVV9SQVApCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBpZiAoNCAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiArIDMpCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfcHJvY2Vzc0FVIDogdmlkZW8gc3RzcyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGlmICg0ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFNTX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNTLCAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHNzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RTU19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNTX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RTU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmJdID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKz0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpYXVQdHItPkNUUzsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLQotICAgIC8qIEkgbW92ZWQgc29tZSBzdGF0ZSBtb2RpZmljYXRpb24gdG8gYWZ0ZXIgd2Uga25vdyB0aGUgc2FtcGxlIGhhcyBiZWVuIHdyaXR0ZW4gY29ycmVjdGx5LiAqLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA9Ci0gICAgICAgICAgICAoTTRNUDRXX1RpbWUzMikoYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgIHx8IChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIGZpbGVTaXplKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSBhdVB0ci0+c2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLyp1cGRhdGUgZmlsZXNpemUgd2l0aCBlc3RpbWF0ZWQgYXVkaW8gZGF0YSB0aGF0IHdpbGwgYmUgYWRkZWQgbGF0ZXIuICAgICovCi0gICAgICAgIC8qV2FybmluZzogQXNzdW1wdGlvbiBpcyBtYWRlIHRoYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gYXVkaW8gc2FtcGxlcyBoYXZlIGNvbnN0YW50IHNpemUgKGUuZy4gbm8gc2lkKS4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIC0gbWF4IGF1ZGlvIHNhbXBsZSBzaXplIGhhcyBiZWVuIHNldCwgYW5kIGlzIHRoZSBhY3R1YWwgc2FtcGxlIHNpemUuICovCi0KLSAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyICE9IDAsCi0gICAgICAgICAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAqIHNjYWxlX3ZpZGVvKSAqICgwLjA1LyphbHdheXMgNTAgQU1SIHNhbXBsZXMgcGVyIHNlY29uZCovCi0gICAgICAgICAgICAqKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZQotICAgICAgICAgICAgKyAxNi8qYWRkaXRpb25hbCBkYXRhIGZvciBhIG5ldyBjaHVuayovCi0gICAgICAgICAgICAvIChNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIpKTsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IChNNE9TQV9VSW50MzIpKCggYXVQdHItPkNUUyAqIHNjYWxlX3ZpZGVvKQotICAgICAgICAgICAgKiAoMC4wNS8qYWx3YXlzIDUwIEFNUiBzYW1wbGVzIHBlciBzZWNvbmQqLwotICAgICAgICAgICAgKihNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUKLSAgICAgICAgICAgICsgMTYvKmFkZGl0aW9uYWwgZGF0YSBmb3IgYSBuZXcgY2h1bmsqLwotICAgICAgICAgICAgLyAoTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyKSk7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzQoInByb2Nlc3NBVSA6IHNpemUgMHgleCBtb2RlICVkIGZpbGVzaXplICVsdSBsaW1pdCAlbHUiLAotICAgICAgICBhdVB0ci0+c2l6ZSwgYXVQdHItPmF0dHJpYnV0ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0ICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBlcnIyID0gTTROT19FUlJPUiwgZXJyMyA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKldhcm5pbmc6IHRlc3Qgc2hvdWxkIGJlIGRvbmUgaGVyZSB0byBlbnN1cmUgY29udGV4dC0+cENvbnRleHQgaXMgbm90IE00T1NBX05VTEwsCi0gICAgIGJ1dCBDIGlzIG5vdCBDKysuLi4qLwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VQ2hhciBjYW1jb2Rlcl9tYWosIGNhbWNvZGVyX21pbiwgY2FtY29kZXJfcmV2OyAvKmNhbWNvZGVyIHZlcnNpb24qLwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvID0KLSAgICAgICAgKCggbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbykKLSAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAhPSAwKSk7IC8qKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAhPSAwKSk7Ki8KLSAgICBNNE9TQV9Cb29sIGJWaWRlbyA9Ci0gICAgICAgICgoIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgIT0gMCkpOyAvKigobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgIT0gMCkpOyovCi0gICAgTTRPU0FfQm9vbCBiSDI2MyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkgyNjQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJNUDRWID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiQUFDID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiRVZSQyA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyppbnRlcm1lZGlhdGUgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgQSwgQiwgTiwgQUI0TjsKLQotICAgIC8qVHJhayB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtJZCA9IEF1ZGlvU3RyZWFtSUQ7IC8qICAgICAoYXVkaW89MSkqLwotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrT2Zmc2V0ID0gMzI7Ci0gICAgTTRPU0FfVUludDMyIGFfc3R0c1NpemUgPSAyNDsgICAgICAgICAgLyogQSAoYXVkaW89MjQpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdHN6U2l6ZSA9IDIwOyAgICAgICAgICAvKiBCIChhdWRpbz0yMCkqLwotICAgIE00T1NBX1VJbnQzMiBhX3RyYWtTaXplID0gNDAyOyAgICAgICAgIC8qICAgICAoYXVkaW89NDAyKSovCi0gICAgTTRPU0FfVUludDMyIGFfbWRpYVNpemUgPSAzMDI7ICAgICAgICAgLyogICAgIChhdWRpbz0zMDIpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9taW5mU2l6ZSA9IDIyOTsgICAgICAgICAvKiAgICAgKGF1ZGlvPTIyOSkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0YmxTaXplID0gMTY5OyAgICAgICAgIC8qICAgICAoYXVkaW89MTY5KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RzZFNpemUgPSA2OTsgICAgICAgICAgLyogICAgIChhdWRpbz02OSApKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RTaXplID0gNTM7ICAgICAgICAgICAvKiAgICAgKGF1ZGlvPTUzICkqLwotICAgIE00T1NBX1VJbnQzMiBhX2RhdGFTaXplID0gMDsgICAgICAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiBhX3RyYWtEdXJhdGlvbiA9IDA7ICAgICAgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgIE00TVA0V19UaW1lMzIgYV9tc1RyYWtEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFfc3RzY1NpemUgPSAyODsgICAgICAgICAgLyogMTYrMTIqbmJjaHVua3NhdWRpbyovCi0gICAgTTRPU0FfVUludDMyIGFfc3Rjb1NpemUgPSAyMDsgICAgICAgICAgLyogMTYrNCpuYmNodW5rc2F1ZGlvKi8KLQotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtJZCA9IFZpZGVvU3RyZWFtSUQ7IC8qICh2aWRlbz0yKSovCi0gICAgLyogZmlyc3QgdHJhayBvZmZzZXQgaXMgMzIrbW9vdlNpemUsIHNlY29uZCBlcXVhbHMgMzIrbW9vdlNpemUrMXN0X3RyYWNrX3NpemUqLwotICAgIE00T1NBX1VJbnQzMiB2X3RyYWtPZmZzZXQgPSAzMjsKLSAgICBNNE9TQV9VSW50MzIgdl9zdHRzU2l6ZSA9IDA7ICAgICAgLyogQSAodmlkZW89MTYrOEopKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHN6U2l6ZSA9IDA7ICAgICAgLyogQiAodmlkZW89MjArNEspKi8KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0Tis0MjYpLCAobXA0dj1BK0IrZHNpKzROKzQ0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9tZGlhU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TiszMjYpLCAobXA0dj1BK0IrZHNpKzROKzM0OCkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9taW5mU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisyNTMpLCAobXA0dj1BK0IrZHNpKzROKzI3NSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGJsU2l6ZSA9IDA7IC8qIChoMjYzPUErQis0TisxODkpLCAobXA0dj1BK0IrZHNpKzROKzIxMSkgKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNkU2l6ZSA9IDA7ICAgICAgLyogKGgyNjM9MTE3KSAgICAgICAgLCAobXA0dj0xMzkrZHNpICAgICkqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZFNpemUgPSAwOyAgICAgICAvKiAoaDI2Mz0xMDEpICAgICAgICAsIChtcDR2PTE1Mytkc2kgICAgKSovCi0gICAgTTRPU0FfVUludDMyIHZfZGF0YVNpemUgPSAwOyAgICAgIC8qIHRlbXA6IEF0IHRoZSBlbmQsID0gY3VycmVudFBvcyovCi0gICAgTTRNUDRXX1RpbWUzMiB2X3RyYWtEdXJhdGlvbiA9IDA7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICBNNE1QNFdfVGltZTMyIHZfbXNUcmFrRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQzMiB2X3N0c2NTaXplID0gMjg7ICAgICAvKiAxNisxMipuYmNodW5rc3ZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdGNvU2l6ZSA9IDIwOyAgICAgLyogMTYrNCpuYmNodW5rc3ZpZGVvKi8KLQotICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9zdHNzU2l6ZSA9IDA7IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSAgICAvKmFhYyAmIG1wNHYgdGVtcCB2YXJpYWJsZSovCi0gICAgTTRPU0FfVUludDggZHNpID0gMDsKLQotICAgIC8qSDI2NCB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2F2Y0NTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qTVA0ViB2YXJpYWJsZXMqLwotICAgIE00T1NBX1VJbnQzMiB2X2VzZHNTaXplID0gMDsgICAgICAgIC8qIGRzaSszNyovCi0gICAgTTRPU0FfVUludDggdl9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgMDsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICBNNE9TQV9VSW50OCB2X0RDRGVzY3JpcHRvclNpemUgPSAwOyAvKiBkc2krMTUqLwotCi0gICAgLypBQUMgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgYV9lc2RzU2l6ZSA9IDA7ICAgICAgICAvKiBkc2krMzcqLwotICAgIE00T1NBX1VJbnQ4IGFfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgIDA7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgTTRPU0FfVUludDggYV9EQ0Rlc2NyaXB0b3JTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qR2VuZXJhbCB2YXJpYWJsZXMqLwotCi0gICAgLyogYXVkaW8gY2h1bmsgc2l6ZSArIHZpZGVvIGNodW5rIHNpemUqLwotICAgIE00T1NBX1VJbnQzMiBtZGF0U2l6ZSA9IDg7Ci0gICAgTTRPU0FfVUludDMyIG1vb3ZTaXplID0gMTE2OyAvKiAxMTYgKyA0MDIoYXVkaW8pICsgICAgKEErQis0Tis0MjYpKGgyNjMpIG9yICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAoQStCK2RzaSs0Tis0NDgpKG1wNHYpICAgICovCi0gICAgTTRPU0FfVUludDMyIGNyZWF0aW9uVGltZTsgLyogQyAqLwotCi0gICAgLypmbGFnIHRvIHNldCB1cCB0aGUgY2h1bmsgaW50ZXJsZWF2ZSBzdHJhdGVneSovCi0gICAgTTRPU0FfQm9vbCBiSW50ZXJsZWF2ZUFWID0KLSAgICAgICAgKGJBdWRpbyAmJiBiVmlkZW8gJiYgKG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciAhPSAwKSk7Ci0KLSAgICBNNE9TQV9Db250ZXh0IGZpbGVXcml0ZXJDb250ZXh0ID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dDsKLQotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvID0gMC4wOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbyA9IDAuMDsKLSAgICBNNE1QNFdfVGltZTMyIGRlbHRhOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIG1vb3ZQb3MsIG1kYXRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyptYWNybyBzdGF0ZSAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPSBNNE1QNFdfY2xvc2VkOwotCi0gICAgLyppZiBubyBkYXRhICEqLwotICAgIGlmICgoIWJBdWRpbykgJiYgKCFiVmlkZW8pKQotICAgIHsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsgLyp3b3VsZCBiZSBiZXR0ZXIgdG8gcmV0dXJuIGEgd2FybmluZyA/Ki8KLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgLyogUmVtb3ZlIHNhZmV0eSBmaWxlIHRvIG1ha2Ugcm9vbSBmb3Igd2hhdCBuZWVkcyB0byBiZSB3cml0dGVuIG91dCBoZXJlCi0gICAgKGNodW5rIGZsdXNoaW5nIGFuZCBtb292KS4gKi8KLQotICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlKQotICAgIHsKLSAgICAgICAgTTRPU0FfQ29udGV4dCB0ZW1wQ29udGV4dDsKLSAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnNhZmV0eUZpbGVVcmwgPSBNNE9TQV9OVUxMOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotI2VuZGlmIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICBpZiAoYlZpZGVvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICAvKmN1cnJlbnQgY2h1bmsgaXMgdGhlIGxhc3Qgb25lIGFuZCBnaXZlcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZpZGVvIGNodW5rcyAoLTEpKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdl9kYXRhU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0jaWZuZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiZmx1c2ggdmlkZW8gfCBDTE9TRSIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMygiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IHNpemUgPSAweCUwOFgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayBzaXplLCBhbmQgYWRkIHRoaXMgdmFsdWUgdG8gdl9kYXRhU2l6ZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgIHZfZGF0YVNpemUgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvczsgLyphZGQgbGFzdCBjaHVuayBzaXplKi8KLQotICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLmxhc3RDVFM7IC8qIGVxdWFscyBsYXN0Q1RTKi8KLQotICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgfQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MtLTsKLSAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0gICAgICAgIC8qIExhc3Qgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgIC8qIElmIHdlIGhhdmUgdGhlIGZpbGUgZHVyYXRpb24gd2UgdXNlIGl0LCBlbHNlIHdlIGR1cGxpY2F0ZSB0aGUgbGFzdCBBVSAqLwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVzZSBtYXggZmlsZSBkdXJhdGlvbiB0byBjYWxjdWxhdGUgZGVsdGEgb2YgbGFzdCBBVSAqLwotICAgICAgICAgICAgZGVsdGEgPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0gICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBtb3JlIHRoYW4gMSBmcmFtZSwgY3JlYXRlIGEgbmV3IHN0dHMgZW50cnkgKGVsc2UgYWxyZWFkeSBjcmVhdGVkKSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKys7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdLCAxKTsKLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMV0sIGRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKV0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKSArIDFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkdXBsaWNhdGUgdGhlIGRlbHRhIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbW9yZSB0aGFuIDEgZnJhbWUsIGR1cGxpY2F0ZSB0aGUgc3R0cyBlbnRyeSAoZWxzZSBhbHJlYWR5IGV4aXN0cykgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX2dldDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdICs9IDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSArIDFdOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpXSArPSAxOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgdmlkZW9UcmFja1B0cixcCi0gICAgICAgICAgICAgICAgICAgICBjYW5ub3Qga25vdyB0aGUgZHVyYXRpb24gb2YgdGhlIHVuaXF1ZSBBVSAhIik7Ci0gICAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gYXVkaW8gdHJhY2ssIHdlIHVzZSBpdCBhcyBhIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAoYW5kIHNvLCBhcyBBVSBkdXJhdGlvbi4uLikgKi8KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTGV0J3MgdXNlIHRoZSBhdWRpbyB0cmFjayBkdXJhdGlvbiAhIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICAgICAgICAgICAgICAgICAqICgxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS50aW1lc2NhbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBFbHNlLCB3ZSB1c2UgYSBNQUdJQ0FMIHZhbHVlICg2NiBtcykgKi8KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZSA6ICEgTm8gYXVkaW8gdHJhY2sgLT4gdXNlIG1hZ2ljYWwgdmFsdWUgKDY2KSAhIik7IC8qICAgICovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDY2OwotICAgICAgICAgICAgICAgICAgICB2X3RyYWtEdXJhdGlvbiA9IDY2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0YWJsZSBzaXplcyAqLwotICAgICAgICBBID0gdl9zdHRzU2l6ZSA9IDE2ICsgOCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7IC8qIEEgKHZpZGVvPTE2KzhKKSovCi0gICAgICAgIEIgPSB2X3N0c3pTaXplID0gMjAgKyA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmI7IC8qIEIgKHZpZGVvPTIwKzRLKSovCi0gICAgICAgIE4gPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmI7Ci0gICAgICAgIEFCNE4gPSBBICsgQiArIDQgKiBOOwotCi0gICAgICAgIHNjYWxlX3ZpZGVvID0KLSAgICAgICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0gICAgICAgIHZfbXNUcmFrRHVyYXRpb24gPSAoTTRPU0FfVUludDMyKSh2X3RyYWtEdXJhdGlvbiAqIHNjYWxlX3ZpZGVvKTsKLQotICAgICAgICAvKkNvbnZlcnQgaW50ZWdlcnMgaW4gdGhlIHRhYmxlIGZyb20gTEUgaW50byBCRSovCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYik7Ci0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAyICogKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSk7Ci0KLSNlbmRpZgotCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIpOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyA0MjY7IC8qIChoMjYzPUErQis0Tis0MjYpKi8KLSAgICAgICAgICAgIHZfbWRpYVNpemUgPSBBQjROICsgMzI2OyAvKiAoaDI2Mz1BK0IrNE4rMzI2KSovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIDI1MzsgLyogKGgyNjM9QStCKzROKzI1MykqLwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyAxODk7IC8qIChoMjYzPUErQis0TisxODkpKi8KLSAgICAgICAgICAgIHZfc3RzZFNpemUgPSAxMTc7ICAgICAgICAvKiAoaDI2Mz0xMTcpKi8KLSAgICAgICAgICAgIHZfZXNkU2l6ZSA9IDEwMTsgICAgICAgICAvKiAoaDI2Mz0xMDEpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIDQyNjsKLQotICAgICAgICAgICAgaWYgKCgoTTRPU0FfSW50MzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKnRoZSBvcHRpb25hbCAnYml0cicgYXRvbSBpcyBhcHBlbmRlZCB0byB0aGUgZHNpLHNvIGZpbGVzaXplIGlzIDE2IGJ5dGVzIGJpZ2dlciovCi0gICAgICAgICAgICAgICAgdl90cmFrU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X21kaWFTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfbWluZlNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9zdGJsU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X3N0c2RTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfZXNkU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICBtb292U2l6ZSArPSAxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgYkgyNjQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgLyogRm9yIEgyNjQgdGhlcmUgaXMgbm8gZGVmYXVsdCBEU0ksIGFuZCBpdHMgcHJlc2VuY2UgaXMgbWFuZGF0b3J5LAotICAgICAgICAgICAgc28gY2hlY2sgdGhlIERTSSBoYXMgYmVlbiBzZXQqLwotICAgICAgICAgICAgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplCi0gICAgICAgICAgICAgICAgfHwgTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBlcnJvciwgbm8gSDI2NCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypIMjY0IHNpemVzIG9mIHRoZSBhdG9tKi8KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBoYXJkY29kZWQgRFNJIHZhbHVlcyBvZiBIMjY0QmxvY2syCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBiTVVMUFBTU1BTIGNhc2UKLSAgICAgICAgICAgIHZfYXZjQ1NpemUgPSBzaXplb2YoTTRPU0FfVUludDMyKSArIHNpemVvZihIMjY0QmxvY2syKSArCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplOwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyA0MTE7Ci0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAzMTE7Ci0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAyMzg7Ci0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIHZfYXZjQ1NpemUgKyAxNzQ7Ci0gICAgICAgICAgICB2X3N0c2RTaXplID0gICAgICAgIHZfYXZjQ1NpemUgKyAxMDI7Ci0gICAgICAgICAgICB2X2VzZFNpemUgID0gICAgICAgIHZfYXZjQ1NpemUgKyA4NjsKLQotICAgICAgICAgICAgbW9vdlNpemUgICArPSBBQjROICsgdl9hdmNDU2l6ZSArIDQxMTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tNUEVHXzQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNUDRWID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIEZvciBNUEVHNCB0aGVyZSBpcyBubyBkZWZhdWx0IERTSSwgYW5kIGl0cyBwcmVzZW5jZSBpcyBtYW5kYXRvcnksCi0gICAgICAgICAgICBzbyBjaGVjayB0aGUgRFNJIGhhcyBiZWVuIHNldCovCi0gICAgICAgICAgICBpZiAoMCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUKLSAgICAgICAgICAgICAgICB8fCBNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGVycm9yLCBubyBNUEVHNCBEU0kgaGFzIGJlZW4gc2V0ISIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypNUDRWIHZhcmlhYmxlcyovCi0gICAgICAgICAgICBkc2kgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemU7Ci0gICAgICAgICAgICB2X2VzZHNTaXplID0gMzcgKyBkc2k7ICAgICAgICAgLyogZHNpKzM3Ki8KLSAgICAgICAgICAgIHZfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgICAgICAgICAgMjMKLSAgICAgICAgICAgICAgICArIGRzaTsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICAgICAgICAgIHZfRENEZXNjcmlwdG9yU2l6ZSA9IDE1ICsgZHNpOyAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICB2X3RyYWtTaXplID0gQUI0TiArIGRzaSArIDQ0ODsgLyogKG1wNHY9QStCK2RzaSs0Tis0NDgpICAgICovCi0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIGRzaSArIDM0ODsgLyogKG1wNHY9QStCK2RzaSs0TiszNDgpICAgICovCi0gICAgICAgICAgICB2X21pbmZTaXplID0gQUI0TiArIGRzaSArIDI3NTsgLyogKG1wNHY9QStCK2RzaSs0TisyNzUpICAgICovCi0gICAgICAgICAgICB2X3N0YmxTaXplID0gQUI0TiArIGRzaSArIDIxMTsgLyogKG1wNHY9QStCK2RzaSs0TisyMTEpICAgICovCi0gICAgICAgICAgICB2X3N0c2RTaXplID0gZHNpICsgMTM5OyAgICAgICAgLyogKG1wNHY9MTM5K2RzaSkqLwotICAgICAgICAgICAgdl9lc2RTaXplID0gZHNpICsgMTIzOyAgICAgICAgIC8qIChtcDR2PTEyMytkc2kpKi8KLQotICAgICAgICAgICAgbW9vdlNpemUgKz0gQUI0TiArIGRzaSArIDQ0ODsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gdmFyaWFibGVzKi8KLSAgICAgICAgdl9zdHNzU2l6ZSA9IDE2ICsgNCAqIE47IC8qIDQqTisxNiAgICAgU1RTUyovCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0Y28gdXBkYXRlICovCi0gICAgICAgIHZfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIHZfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayB0aW1lKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgdl9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiAoYkF1ZGlvKQotICAgIHsKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KTsgLyoqPCBjbG9zZSB0aGUgc3RyZWFtIGFueXdheSAqLwotICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyphdWRpbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZSA9PSBNNFNZU19rQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiQUFDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLSAgICAgICAgICAgIGRzaSA9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZTsgLyp2YXJpYWJsZSBzaXplKi8KLQotICAgICAgICAgICAgYV9lc2RzU2l6ZSA9IDM3ICsgZHNpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkc2krMzcqLwotICAgICAgICAgICAgYV9FU0Rlc2NyaXB0b3JTaXplID0KLSAgICAgICAgICAgICAgICAyMwotICAgICAgICAgICAgICAgICsgZHNpOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgICAgICAgICAgYV9EQ0Rlc2NyaXB0b3JTaXplID0gMTUgKyBkc2k7ICAgICAgICAgICAgICAgICAvKiBkc2krMTUqLwotCi0gICAgICAgICAgICBhX2VzZFNpemUgPSBkc2kgKyA3MzsgLypvdmVyd3JpdGUgYV9lc2RTaXplIHdpdGggYWFjIHZhbHVlKi8KLSAgICAgICAgICAgIC8qYWRkIGRpZi4gYmV0d2VlbiBhbXIgJiBhYWMgc2l6ZXM6ICgtIDUzICsgZHNpICsgMzcpKi8KLSAgICAgICAgICAgIGFfc3RzZFNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9taW5mU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgbW9vdlNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0VWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJFVlJDID0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKmVsc2UsIGF1ZGlvIGlzIGltcGxpY2l0ZWx5IGFtciBpbiB0aGUgZm9sbG93aW5nKi8KLQotICAgICAgICAgICAgLyogZXZyYyBkc2kgaXMgb25seSA2IGJ5dGVzIHdoaWxlIGFtciBkc2kgaXMgOSBieXRlcyxhbGwgb3RoZXIgYmxvY2tzIGFyZSB1bmNoYW5nZWQgKi8KLSAgICAgICAgICAgIGFfZXNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdHNkU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9taW5mU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSAtPSAzOwotICAgICAgICAgICAgYV90cmFrU2l6ZSAtPSAzOwotICAgICAgICAgICAgbW9vdlNpemUgLT0gMzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBNNE1QNFdfZnJlZUNvbnRleHQoY29udGV4dCk7IC8qKjwgRnJlZSB0aGUgY29udGV4dCBjb250ZW50ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypDb252ZXJ0IGludGVnZXJzIGluIHRoZSB0YWJsZSBmcm9tIExFIGludG8gQkUqLwotICAgICAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIpOwotICAgICAgICAgICAgYV9zdHN6U2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3N0YmxTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfbWluZlNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9tZGlhU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX3RyYWtTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgIH0KLQotICAgICAgICBtb292U2l6ZSArPSA0MDI7Ci0KLSAgICAgICAgLypjdXJyZW50IGNodW5rIGlzIHRoZSBsYXN0IG9uZSBhbmQgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBhdWRpbyBjaHVua3MgKC0xKSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFfZGF0YVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICAvKmZsdXNoIGNodW5rKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJmbHVzaCBhdWRpbyB8IENMT1NFIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICAgICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgICAgIC8qYWRkIGNodW5rIHNpemUgdG8gYWJzb2x1dGVDdXJyZW50UG9zKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHNpemUsIGFuZCBhZGQgdGhpcyB2YWx1ZSB0byBhX2RhdGFTaXplKi8KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTaXplVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICAgICAgYV9kYXRhU2l6ZSArPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOyAvKmFkZCBsYXN0IGNodW5rIHNpemUqLwotCi0gICAgICAgIC8qIGJ1Z2ZpeDogaWYgYSBuZXcgY2h1bmsgd2FzIGp1c3QgY3JlYXRlZCwgY2FuY2VsIGl0IGJlZm9yZSB0byBjbG9zZSAqLwotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rICE9IDApCi0gICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuay0tOwotICAgICAgICB9Ci0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYy0tOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTyovCi0KLSAgICAgICAgYV90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5sYXN0Q1RTOyAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgICAgIC8qIGFkZCBsYXN0IHNhbXBsZSBkdXIgKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgIT0gMSkKLSAgICAgICAgewotI2lmZGVmIERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLSAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICAtIDEpIC0gMl0gKz0gMTsKLQotI2VuZGlmIC8qRFVQTElDQVRFX1NUVFNfSU5fTEFTVF9BVSovCi0KLSAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTRTWVNfa0FNUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoMTIyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMzIKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoMTAyMDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjcKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNzk1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyMQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg3NDAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDIwCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDY3MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTgKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNTkwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxNgotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg1MTUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDQ3NTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTMKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotICAgICAgICBhX21zVHJha0R1cmF0aW9uID0gKE00T1NBX1VJbnQzMikoYV90cmFrRHVyYXRpb24gKiBzY2FsZV9hdWRpbyk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgICAgICAvKiBzdHNjIHVwZGF0ZSAqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3N0YmxTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX3RyYWtTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgbW9vdlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotCi0gICAgICAgIC8qIHN0c28gdXBkYXRlICovCi0gICAgICAgIGFfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0YmxTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWRpYVNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3RyYWtTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotCi0jZWxzZQotICAgICAgICAvKnN0c2Mvc3RjbyB1cGRhdGUqLwotCi0gICAgICAgIGFfc3RzY1NpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGNvU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9taW5mU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21kaWFTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfdHJha1NpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgbW9vdlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2VuZGlmCi0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgbmV3IHNpemUgb2Ygc3R0cyovCi0KLSAgICAgICAgYV9zdHRzU2l6ZSA9IDE2ICsgOCAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSk7Ci0KLSAgICAgICAgbW9vdlNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX21kaWFTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9taW5mU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfc3RibFNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX3RyYWtTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLQotICAgICAgICAvKnVwZGF0ZSBsYXN0IGNodW5rIHRpbWUqLwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgYV9tc1RyYWtEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBjaGFuZ2luZyB0aGUgd2F5IHRoZSBtZGF0IHNpemUgaXMgY29tcHV0ZWQuCi0gICAgVGhlIHJlYWwgcHVycG9zZSBvZiB0aGUgbWRhdCBzaXplIGlzIHRvIGtub3cgdGhlIGFtb3VudCB0byBza2lwIHRvIGdldCB0byB0aGUgbmV4dAotICAgIGF0b20sIHdoaWNoIGlzIHRoZSBtb292OyB0aGUgc2l6ZSBvZiBtZWRpYSBpbiB0aGUgbWRhdCBpcyBhbG1vc3Qgc2Vjb25kYXJ5LiBUaGVyZWZvcmUsCi0gICAgaXQgaXMgb2YgdXRtb3N0IGltcG9ydGFuY2UgdGhhdCB0aGUgbWRhdCBzaXplICJwb2ludHMiIHRvIHdoZXJlIHRoZSBtb292IGFjdHVhbGx5Ci0gICAgYmVnaW5zLiBOb3csIHRoZSBtb292IGJlZ2lucyByaWdodCBhZnRlciB0aGUgbGFzdCBkYXRhIHdlIHdyb3RlLCBzbyBob3cgY291bGQgdGhlIHN1bQotICAgIG9mIGFsbCBjaHVuayBzaXplcyBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgdG90YWwgc2l6ZSBvZiB3aGF0IGhhcyBiZWVuIHdyaXR0ZW4/IFdlbGwsIGl0Ci0gICAgY2FuIGhhcHBlbiB3aGVuIHRoZSB3cml0aW5nIHdhcyB1bmV4cGVjdGVkbHkgc3RvcHBlZCAoYmVjYXVzZSBvZiBsYWNrIG9mIGRpc2sgc3BhY2UsCi0gICAgZm9yIGluc3RhbmNlKSwgaW4gdGhpcyBjYXNlIGEgY2h1bmsgbWF5IGJlIHBhcnRpYWxseSB3cml0dGVuICh0aGUgcGFydGlhbCB3cml0ZSBpcyBub3QKLSAgICBuZWNlc3NhcmlseSBlcmFzZWQpIGJ1dCBpdCBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUgY2h1bmsgc2l6ZSBsaXN0ICh3aGljaCBtYXkKLSAgICBiZWxpZXZlIGl0IGhhc24ndCBiZWVuIHdyaXR0ZW4gb3Igb24gdGhlIGNvbnRyYXJ5IHRoYXQgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbikuIEluCi0gICAgdGhlIGNhc2Ugb2Ygc3VjaCBhIG1pc21hdGNoLCB0aGVyZSBpcyBlaXRoZXIgdW51c2VkIGRhdGEgaW4gdGhlIG1kYXQgKG5vdCB2ZXJ5IGdvb2QsCi0gICAgYnV0IHRvbGVyYWJsZSkgb3Igd2hlbiByZWFkaW5nIHRoZSBsYXN0IGNodW5rIGl0IHdpbGwgcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtb292Ci0gICAgYXMgcGFydCBvZiB0aGUgY2h1bmsgKHdoaWNoIG1lYW5zIHRoZSBsYXN0IGNodW5rIHdvbid0IGJlIGNvcnJlY3RseSBkZWNvZGVkKSwgYm90aCBvZgotICAgIHdoaWNoIGFyZSBzdGlsbCBiZXR0ZXIgdGhhbiBsb3NpbmcgdGhlIHdob2xlIHJlY29yZGluZy4gSW4gdGhlIGxvbmcgcnVuIGl0J2xsIHByb2JhYmx5Ci0gICAgYmUgYXR0ZW1wdGVkIHRvIGFsd2F5cyBjbGVhbiB1cCBiYWNrIHRvIGEgY29uc2lzdGVudCBzdGF0ZSwgYnV0IGF0IGFueSByYXRlIGl0IGlzCi0gICAgYWx3YXlzIHNhZmVyIHRvIGhhdmUgdGhlIG1kYXQgc2l6ZSBiZSBjb21wdXRlZCB1c2luZyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG1vb3YKLSAgICBhY3R1YWxseSBiZWdpbnMsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBzaXplIGl0IGlzIHRob3VnaHQgdGhlIG1kYXQgaGFzLgotCi0gICAgVGhlcmVmb3JlLCBJIHdpbGwgcmVjb3JkIHdoZXJlIHdlIGFyZSBqdXN0IGJlZm9yZSB3cml0aW5nIHRoZSBtb292LCB0byBzZXJ2ZSB3aGVuCi0gICAgdXBkYXRpbmcgdGhlIG1kYXQgc2l6ZS4gKi8KLQotICAgIC8qIG1kYXRTaXplICs9IGFfZGF0YVNpemUgKyB2X2RhdGFTaXplOyAqLy8qVE9ETyBhbGxvdyBmb3IgbXVsdGlwbGUgY2h1bmtzKi8KLQotICAgIC8qIEVuZCBvZiBQaWVycmUgTGViZWF1cGluIDE5LzEyLzIwMDc6IGNoYW5naW5nIHRoZSB3YXkgdGhlIG1kYXQgc2l6ZSBpcyBjb21wdXRlZC4gKi8KLQotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBhX3RyYWtPZmZzZXQgKz0gbW9vdlNpemU7Ci0gICAgdl90cmFrT2Zmc2V0ICs9IG1vb3ZTaXplLyorIGFfZGF0YVNpemUqLzsKLQotICAgIGlmIChiSW50ZXJsZWF2ZUFWID09IE00T1NBX0ZBTFNFKQotICAgICAgICB2X3RyYWtPZmZzZXQgKz0gYV9kYXRhU2l6ZTsKLQotICAgIC8qc3lzdGVtIHRpbWUgc2luY2UgMTk3MCAqLwotI2lmbmRlZiBfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSAotCi0gICAgdGltZSgodGltZV90ICopJmNyZWF0aW9uVGltZSk7Ci0gICAgLypjb252ZXJ0IGludG8gdGltZSBzaW5jZSAxLzEvMTkwNCAwMGgwMCAobm9ybWF0aXZlKSovCi0gICAgY3JlYXRpb25UaW1lICs9IDIwODI4NDE3NjE7IC8qbmIgb2Ygc2VjIGJldHdlZW4gMTkwNCBhbmQgMTk3MCovCi0KLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIGNyZWF0aW9uVGltZSA9Ci0gICAgICAgIDB4QkJEMDkxMDA7IC8qID0gNy8xMS8yMDAzIDAwaDAwIDsgaW4gaGV4YSBiZWNhdXNlIG9mIGNvZGUgc2NyYW1ibGVyIGxpbWl0YXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIGludGVnZXJzICovCi0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24gPQotICAgICAgICBtYXgoYV9tc1RyYWtEdXJhdGlvbiwgdl9tc1RyYWtEdXJhdGlvbik7IC8qbWF4IGF1ZGlvL3ZpZGVvKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qb3BlbiBmaWxlIGluIHdyaXRlIGJpbmFyeSBtb2RlKi8KLQotICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZmaWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT51cmwsIDB4MjIpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLQotICAgIC8qZnR5cCBhdG9tKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKiBQdXQgY3VzdG9taXplZCBmdHlwIGJveCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMTYKLSAgICAgICAgICAgICsgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVBBQ19GVFlQX1RBRywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5taW5vcl92ZXJzaW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5jb21wYXRpYmxlX2JyYW5kc1tpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBkZWZhdWx0IGZ0eXAgYm94ICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRGVmYXVsdF9mdHlwLCBzaXplb2YoRGVmYXVsdF9mdHlwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyogc2VlayBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0gICAgLyogLi4uIG9yIHJhdGhlciwgc2VlayB1c2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQsIGJ1dCBpdCBoYXMgYmVlbiBmb3VuZCB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAgICBpcyBub3QgcmVsaWFibHksIG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsLCBpbXBsZW1lbnRlZCBpbiB0aGUgdmFyaW91cyBPU0FMcywgc28gd2Ugbm93IGF2b2lkCi0gICAgdXNpbmcgaXQuICovCi0gICAgLyogTm90aWNlIHRoaXMgbmV3IG1ldGhvZCBhc3N1bWVzIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoaXMgd2lsbCBicmVhayBpZiBldmVyIHdlCi0gICAgYXJlIG92ZXJ3cml0aW5nIGEgbGFyZ2VyIGZpbGUuICovCi0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5nZXRPcHRpb24oCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIE00T1NBX2tGaWxlV3JpdGVHZXRGaWxlU2l6ZSwgKE00T1NBX0RhdGFPcHRpb24gKikgJm1vb3ZQb3MpKTsKLSAgICAvKiBtb292UG9zIHdpbGwgYmUgdXNlZCBhZnRlciB3cml0aW5nIHRoZSBtb292LiAqLwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1vb3ZTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazMsIHNpemVvZihDb21tb25CbG9jazMpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNCwgc2l6ZW9mKENvbW1vbkJsb2NrNCksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5kdXJhdGlvbiwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s1LCBzaXplb2YoQ29tbW9uQmxvY2s1KSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgaWYgKGJBdWRpbykKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNiwgc2l6ZW9mKENvbW1vbkJsb2NrNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtJZCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazcsIHNpemVvZihDb21tb25CbG9jazcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tc1RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazdiaXMsIHNpemVvZihDb21tb25CbG9jazdiaXMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrMSwgc2l6ZW9mKEFNUkJsb2NrMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9tZGlhU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazgsIHNpemVvZihDb21tb25CbG9jazgpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s5LCBzaXplb2YoQ29tbW9uQmxvY2s5KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazFfMSwgc2l6ZW9mKEFNUkJsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAvKmludmVydCB0aGUgdGFibGUgZGF0YSB0byBiaWdlbmRpYW4qLwotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgMiAqIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgLSAxKSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKQotICAgICAgICAgICAgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAvKiBzdHNkICovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYkFBQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBQUNCbG9jazEsIHNpemVvZihBQUNCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRVZSQzhCbG9jazEsIHNpemVvZihFVlJDOEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qZXZyYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAvKkFNUjgqLwotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUjhCbG9jazEsIHNpemVvZihBTVI4QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphbXI4Ki8KLSAgICAgICAgfQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUsCi0gICAgICAgICAgICBzaXplb2YoQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlCi0gICAgICAgICAgICA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBEU0kgaW5zaWRlIHNhbXBsZSBkZXNjIGVudHJ5ICovCi0gICAgICAgIGlmIChiQUFDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9lc2RzU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2swLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2swKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShhX0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMSksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoYV9EQ0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFBQ0Jsb2NrMiwgc2l6ZW9mKEFBQ0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUyNChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUgKiA1LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMywKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMyksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYkVWUkMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxvY2FsRHNpWzZdOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY2FsSTsKLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhFVlJDQmxvY2szXzEsIHNpemVvZihFVlJDQmxvY2szXzEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLQotICAgICAgICAgICAgLyogY29weSB0aGUgZGVmYXVsdCBibG9jayBpbiBhIGxvY2FsIHZhcmlhYmxlKi8KLSAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDY7IGxvY2FsSSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gRVZSQ0Jsb2NrM18yW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgbG9jYWxEc2lbNV0gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbgotICAgICAgICAgICAgICAgIC8gMTYwKS8qRVZSQyAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobG9jYWxEc2ksIDYsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLypBTVI4Ki8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDggbG9jYWxEc2lbOV07Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jYWxJOwotCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkRTSUhlYWRlciwgc2l6ZW9mKEFNUkRTSUhlYWRlciksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgICAgICAvKiBjb3B5IHRoZSBkZWZhdWx0IGJsb2NrIGluIGEgbG9jYWwgdmFyaWFibGUqLwotICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgOTsgbG9jYWxJKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSBBTVJEZWZhdWx0RFNJW2xvY2FsSV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwZXIgYXUgKi8KLSAgICAgICAgICAgIC8qIGFuZCBzdG9yZXMgaXQgaW4gdGhlIERTSSovCi0gICAgICAgICAgICAvKiBhc3N1bWVzIGEgY2hhciBpcyBlbm91Z2ggdG8gc3RvcmUgdGhlIGRhdGEqLwotICAgICAgICAgICAgLyogQUxFUlQhIFRoZSBwb3RlbnRpYWwgb2YgdGhlIGZvbGxvd2luZyBsaW5lIG9mIGNvZGUgdG8gZXhwbG9kZSBpbiBvdXIgZmFjZQotICAgICAgICAgICAgaXMgZW5vcm1vdXMgd2hlbiBhbnl0aGluZyAoc2FtcGxlIHJhdGUgb3Igd2hhdGV2ZXIpIHdpbGwgY2hhbmdlLiBUaGlzCi0gICAgICAgICAgICBjYWxjdWxhdGlvbiB3b3VsZCBiZSBNVUNIIGJldHRlciBoYW5kbGVkIGJ5IHRoZSBWRVMgb3Igd2hhdGV2ZXIgZGVhbHMgd2l0aAotICAgICAgICAgICAgdGhlIGVuY29kZXIgbW9yZSBkaXJlY3RseS4gKi8KLSAgICAgICAgICAgIGxvY2FsRHNpWzhdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAvIDE2MCkvKkFNUiBOQiAxIGZyYW1lIGR1cmF0aW9uKi87Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvcHkgdmVuZG9yIG5hbWUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA0OyBsb2NhbEkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gKE00T1NBX1VJbnQ4KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJW2xvY2FsSV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIE1vZGUgU2V0ICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gNTsgbG9jYWxJIDwgNzsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKGxvY2FsRHNpLCA5LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qZW5kIHRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHN6U2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE1LCBzaXplb2YoQ29tbW9uQmxvY2sxNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyowIHZhbHVlIGZvciBzYW1wbGVzaXplIG1lYW5zIG5vdCBjb25zdGFudCBBVSBzaXplKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICogNCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHNjU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE2LCBzaXplb2YoQ29tbW9uQmxvY2sxNiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXQotICAgICAgICAgICAgPj4gMTIpICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW2ldICYgMHhGRkYpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihpICsgMSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3Rjb1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNywgc2l6ZW9mKENvbW1vbkJsb2NrMTcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3RyYWtPZmZzZXQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0KLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYV90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEFNUkJsb2NrNCwgc2l6ZW9mKEFNUkJsb2NrNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgIH0KLQotICAgIGlmIChiVmlkZW8pCi0gICAgewotICAgICAgICAvKnRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazYsIHNpemVvZihDb21tb25CbG9jazYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrSWQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3LCBzaXplb2YoQ29tbW9uQmxvY2s3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfbXNUcmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3YmlzLCBzaXplb2YoQ29tbW9uQmxvY2s3YmlzKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBJbiB0aGUgdHJhY2sgaGVhZGVyIHdpZHRoIGFuZCBoZWlnaHQgYXJlIDE2LjE2IGZpeGVkIHBvaW50IHZhbHVlcywKLSAgICAgICAgc28gc2hpZnQgbGVmdCB0aGUgcmVndWxhciBpbnRlZ2VyIHZhbHVlIGJ5IDE2LiAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCA8PCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodAotICAgICAgICAgICAgPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21kaWFTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOCwgc2l6ZW9mKENvbW1vbkJsb2NrOCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3RyYWtEdXJhdGlvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazksIHNpemVvZihDb21tb25CbG9jazkpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2sxXzEsIHNpemVvZihWaWRlb0Jsb2NrMV8xKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21pbmZTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTAsIHNpemVvZihDb21tb25CbG9jazEwKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RibFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMSwgc2l6ZW9mKENvbW1vbkJsb2NrMTEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHRzU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEyLCBzaXplb2YoQ29tbW9uQmxvY2sxMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmI7Ci0gICAgICAgICAgICBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUDRXX2dldDMyX0xvKAotICAgICAgICAgICAgICAgICZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbaV0pLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QNFdfZ2V0MzJfSGkoCi0gICAgICAgICAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1tpXSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikgKiA4LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgLyogc3RzZCAqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c2RTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uSGVhZGVyKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAvKiBzYW1wbGUgZGVzYyBlbnRyeSBpbnNpZGUgc3RzZCAqLwotICAgICAgICBpZiAoYk1QNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTXA0dkJsb2NrMSwgc2l6ZW9mKE1wNHZCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazEsIHNpemVvZihIMjYzQmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2NCkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjY0QmxvY2sxLCBzaXplb2YoSDI2NEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgIH0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTEsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUxNihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTE2KG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb1Jlc29sdXRpb25zLCBzaXplb2YoVmlkZW9SZXNvbHV0aW9ucyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotCi0gICAgICAgIC8qIERTSSBpbnNpZGUgc2FtcGxlIGRlc2MgZW50cnkgKi8KLSAgICAgICAgaWYgKGJIMjYzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUaGUgaDI2MyBkc2kgZ2l2ZW4gdGhyb3VnaCB0aGUgYXBpIG11c3QgYmUgNyBieXRlcywgdGhhdCBpcywgaXQgc2hhbGwgbm90IGluY2x1ZGUKLSAgICAgICAgICAgICB0aGUgb3B0aW9uYWwgYml0cmF0ZSBib3guIEhvd2V2ZXIsIGlmIHRoZSBiaXRyYXRlIGluZm9ybWF0aW9uIGlzIHNldCBpbiB0aGUgc3RyZWFtCi0gICAgICAgICAgICAgaGFuZGxlciwgYSBiaXRyYXRlIGJveCBpcyBhcHBlbmRlZCBoZXJlIHRvIHRoZSBkc2kgKi8KLSAgICAgICAgICAgIGlmICgoKE00T1NBX0ludDMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syX2JpdHIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihIMjYzQmxvY2syX2JpdHIpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qIGQyNjMgYm94IHdpdGggYml0ciBhdG9tICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMywgc2l6ZW9mKEgyNjNCbG9jazMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazQsIHNpemVvZihIMjYzQmxvY2s0KSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIC8qIFBpZXJyZSBMZWJlYXVwaW4gMjAwOC8wNC8yOTogdGhlIHR3byBmb2xsb3dpbmcgbGluZXMgdXNlZCB0byBiZSBzd2FwcGVkOwotICAgICAgICAgICAgICAgIEkgY2hhbmdlZCB0byB0aGlzIG9yZGVyIGluIG9yZGVyIHRvIGNvbmZvcm0gdG8gM0dQUC4gKi8KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2syLCBzaXplb2YoSDI2M0Jsb2NrMiksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyogZDI2MyBib3ggKi8KLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2szLCBzaXplb2YoSDI2M0Jsb2NrMyksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiTVA0VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ1ZmZlclNpemVEQiA9IDUgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGF2Z0JpdHJhdGU7IC8qYnVmZmVyU2l6ZURCIHNldCB0byA1IHRpbWVzIHRoZSBiaXRyYXRlKi8KLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfZXNkc1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazApLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0VTRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazEsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazEpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSh2X0RDRGVzY3JpcHRvclNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1wNHZCbG9jazMsIHNpemVvZihNcDR2QmxvY2szKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUyNChidWZmZXJTaXplREIsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMiwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMiksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2szLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2szKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBwcHNMZW50Z2ggPSAwOyAvKiBQUFMgbGVuZ3RoICovCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgc3BzTGVudGdoID0gMDsgLyogU1BTIGxlbmd0aCAqLwotICAgICAgICAgICAgTTRPU0FfVUNoYXIgKnRtcERTSSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJOyAvKiBEU0kgKi8KLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBOdW1iZXJPZlBQUzsKLSAgICAgICAgICAgIE00T1NBX1VJbnQxNiBsQ250UFBTOwotCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgKGhlYWRlciArIERTSSkgc2l6ZSAqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfYXZjQ1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgICAgICAvKiBQdXQgdGhlIGF2Y0MgaGVhZGVyICovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjRCbG9jazIsIHNpemVvZihIMjY0QmxvY2syKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjY0Ki8KLSAgICAgICAgICAgIC8qIFB1dCB0aGUgRFNJIChTUFMgKyBQUFMpIGludCB0aGUgM2dwIGZvcm1hdCovCi0gICAgICAgICAgICAvKiBTUFMgbGVuZ3RoIGluIEJFICovCi0KLSAgICAgICAgICAgIGlmICgoMHgwMSAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVswXSkgfHwKLSAgICAgICAgICAgICAgICAgKDB4NDIgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCIhISEgTTRNUDRXX2Nsb3NlV3JpdGUgRVJST1IgOiBpbnZhbGlkIEFWQ0MgMHglWCAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzFdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUiggTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpICk7LypoMjY0Ki8KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyplbmQgdHJhayovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c3pTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTUsIHNpemVvZihDb21tb25CbG9jazE1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWltpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKiA0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3RzY1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNiwgc2l6ZW9mKENvbW1vbkJsb2NrMTYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0KLSAgICAgICAgICAgID4+IDEyKSArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVtpXSAmIDB4RkZGKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGkgKyAxLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdGNvU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE3LCBzaXplb2YoQ29tbW9uQmxvY2sxNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoIGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPj0gaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdl90cmFrT2Zmc2V0ICs9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrT2Zmc2V0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIHZfdHJha09mZnNldCArPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3Rzc1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s0LCBzaXplb2YoVmlkZW9CbG9jazQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiAqIDQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFZpZGVvQmxvY2s1LCBzaXplb2YoVmlkZW9CbG9jazUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICB9Ci0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLyptZGF0Ki8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtZGF0U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2syLCBzaXplb2YoQ29tbW9uQmxvY2syKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgLyp3cml0ZSBkYXRhLCBhY2NvcmRpbmcgdG8gdGhlIGludGVybGVhdmUgbW9kZSAoZGVmYXVsdCBpcyBub3QgaW50ZXJsZWF2ZWQpKi8KLSAgICBpZiAoYkludGVybGVhdmVBViA9PSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGlmIChiQXVkaW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICAgICAgICAgIGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qaW4gdGhpcyBtb2RlLCB3ZSBoYXZlIGF1ZGlvIGFuZCB2aWRlbyB0byBpbnRlcmxlYXZlKi8KLSAgICB7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1heChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGkgPD0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvIChwcmV2aW91c2x5IGFfZGF0YVNpemUpKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qc2tpcCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciwKLSAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGVtYmVkZGVkIHN0cmluZyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsIDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIH0KLQotICAgIC8qIFdyaXRlIHZlcyBjb3JlIHZlcnNpb24gKi8KLSAgICBjYW1jb2Rlcl9tYWogPSAoTTRPU0FfVUNoYXIpKG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC8gMTAwKTsKLSAgICBjYW1jb2Rlcl9taW4gPQotICAgICAgICAoTTRPU0FfVUNoYXIpKCggbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWopCi0gICAgICAgIC8gMTApOwotICAgIGNhbWNvZGVyX3JldiA9Ci0gICAgICAgIChNNE9TQV9VQ2hhcikobU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gLSAxMDAgKiBjYW1jb2Rlcl9tYWogLSAxMAotICAgICAgICAqIGNhbWNvZGVyX21pbik7Ci0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJyAnLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfbWFqICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnLicsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9taW4gKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcuJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX3JldiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qIFdyaXRlIGludGVncmF0aW9uIHRhZyAqLwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyICopIiAtLSAiLCA0LAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypvdmVyd3JpdGUgbWRhdCBzaXplKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQgIT0gMCkKLSAgICAgICAgbWRhdFBvcz0gMTYgKyBtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNDsKLSAgICBlbHNlCi0gICAgICAgIG1kYXRQb3MgPSAyNDsKLQotICAgIG1vb3ZQb3MgPSBtb292UG9zIC0gbWRhdFBvczsKLSAgICBtZGF0U2l6ZSA9IG1vb3ZQb3M7Ci0KLSAgICBDTEVBTlVQb25FUlIobU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5zZWVrKGZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZtZGF0UG9zKSk7IC8qc2VlayBhZnRlciBmdHlwLi4uKi8KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobWRhdFNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotY2xlYW51cDoKLQotICAgIC8qKgotICAgICogQ2xvc2UgdGhlIGZpbGUgZXZlbiBpZiBhbiBlcnJvciBvY2N1cmVkICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVycjIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlKG1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGU6IGZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIyKTsKLSAgICAgICAgfQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIFJlbW92ZSBzYWZldHkgZmlsZSBpZiBzdGlsbCBwcmVzZW50IChoZXJlIGl0IGlzIGNsZWFudXAgaW4gY2FzZSBvZiBlcnJvciBhbmQgTk9UIHRoZSBub3JtYWwKLSAgICByZW1vdmFsIG9mIHRoZSBzYWZldHkgZmlsZSB0byBmcmVlIGVtZXJnZW5jeSBzcGFjZSBmb3IgdGhlIG1vb3YpLiAqLwotCi0gICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUpCi0gICAgewotICAgICAgICBNNE9TQV9Db250ZXh0IHRlbXBDb250ZXh0OwotICAgICAgICBlcnIzID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnRlbXBDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLAotICAgICAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IKLSAgICAgICAgICAgICE9IGVycjMpIC8qIE5vIHNlbnNlIGNsb3NpbmcgaWYgd2UgY291bGRuJ3Qgb3BlbiBpbiB0aGUgZmlyc3QgcGxhY2UuICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVycjMgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSh0ZW1wQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgICAgICAgICAgICAgZXJyMiA9IGVycjM7Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gTTRPU0FfTlVMTDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgLyogRGVsZXRlIGVtYmVkZGVkIHN0cmluZyAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZykKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIERlbGV0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKQotICAgIHsKLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNNE1QNFdfZnJlZUNvbnRleHQoKSBpcyBub3cgYSBwcml2YXRlIG1ldGhvZCwgY2FsbGVkIG9ubHkgZnJvbSBoZXJlKi8KLSAgICBlcnIzID0gTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogTTRNUDRXX2ZyZWVDb250ZXh0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENob29zZSB3aGljaCBlcnJvciBjb2RlIHRvIHJldHVybiAqLwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGdpdmUgcHJpb3JpdHkgdG8gbWFpbiBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnI9MHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEVycm9yIGZyb20gY2xvc2VXcml0ZSBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjI9MHgleCIsIGVycjIpOwotICAgICAgICByZXR1cm4gZXJyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRXJyb3IgZnJvbSBNNE1QNFdfZnJlZUNvbnRleHQgaXMgcmV0dXJuZWQgb25seSBpZiB0aGVyZSBpcyBubyBtYWluIGVycm9yIGFuZAotICAgICAgICAgIG5vIGNsb3NlIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfY2xvc2VXcml0ZTogcmV0dXJuaW5nIGVycjM9MHgleCIsIGVycjMpOwotICAgICAgICByZXR1cm4gZXJyMzsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqdmFsdWVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICAvKiAgICBNNE1QNFdfV3JpdGVDYWxsQmFjayogICAgY2FsbEJhY2tQdHIgPSBNNE9TQV9OVUxMOyovCi0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19yZWFkeSksIE00RVJSX1NUQVRFKTsKLQotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+Ci0gICAgICAgICAgICAgICAgICAgIEludGVybGVhdmVEdXI7IC8qdGltZSBjb252ZXJzaW9uICEqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2VtYmVkZGVkU3RyaW5nKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gMTY7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywgMTYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICAxNik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKSgqdmFsdWVQdHIpOwotICAgICAgICAvKm1lbUFkZHJQdHIgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcgotICAgICAgICBhbmQgbWVtQWRkclB0ci0+c2l6ZSBpbml0aWFsaXplZCB3aXRoIHRoZSBtYXggcG9zc2libGUgbGVuZ3RoIGluIGJ5dGVzKi8KLSAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gNjAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5hZGRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8qbWVtQWRkclB0ci0+c2l6ZSBpcyB1cGRhdGVkIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBzdHJpbmcqLwotICAgICAgICBtZW1BZGRyUHRyLT5zaXplID0gNjA7Ci0gICAgICAgIC8qaWYgbm8gdmFsdWUgd2FzIHNldCwgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyAwICovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLCA2MCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgIDYwKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIC8qY2FsbEJhY2tQdHIgPSAoTTRNUDRXX1dyaXRlQ2FsbEJhY2sqKSgqdmFsdWVQdHIpOwotICAgICAgICAqY2FsbEJhY2tQdHIgPSBtTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2s7Ci0gICAgICAgIGJyZWFrOyovCi0KLSAgICBjYXNlIChNNE1QNFdfcG9zdFdyaXRlQ2FsbEJhY2spOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAvKmNhbGxCYWNrUHRyID0gKE00TVA0V19Xcml0ZUNhbGxCYWNrKikoKnZhbHVlUHRyKTsKLSAgICAgICAgKmNhbGxCYWNrUHRyID0gbU1wNEZpbGVEYXRhUHRyLT5Qb3N0V3JpdGVDYWxsQmFjazsKLSAgICAgICAgYnJlYWs7Ki8KLQotICAgIGNhc2UgKE00TVA0V19tYXhBVXNpemUpOgotCi0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotCi0gICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPSBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX0lPRCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfRVNEKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX3RyYWNrU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ciA9IChNNE1QNFdfU3RyZWFtSURzaXplICopKCp2YWx1ZVB0cik7Ci0gICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+d2lkdGggPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoOwotICAgICAgICBzdHJlYW1JRHNpemVQdHItPmhlaWdodCA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0OwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19lc3RpbWF0ZUF1ZGlvU2l6ZSk6Ci0gICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKSgqdmFsdWVQdHIpOwotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX01PT1ZmaXJzdCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfVjJfdGJsQ29tcHJlcyk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gdmFsdWUgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICpzdHJlYW1JRHZhbHVlUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplICpzdHJlYW1JRHNpemVQdHIgPSBNNE9TQV9OVUxMOwotICAgIE00TVA0V19tZW1BZGRyICptZW1BZGRyUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgKnN0cmVhbUlEbWVtQWRkclB0cjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qIFZlcmlmeSBzdGF0ZSAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNUDRXX21heEZpbGVEdXJhdGlvbjoKLSAgICAgICAgY2FzZSBNNE1QNFdfRFNJOgotICAgICAgICAgICAgLyogdGhpcyBwYXJhbSBjYW4gYmUgc2V0IGF0IHRoZSBlbmQgb2YgYSByZWNvcmRpbmcgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSAhPSBNNE1QNFdfY2xvc2VkKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1QNFdfc2V0RnR5cEJveDoKLSAgICAgICAgICAgIC8qIHRoaXMgcGFyYW0gY2FuIG9ubHkgYmUgc2V0IGJlZm9yZSBzdGFydGluZyBhbnkgd3JpdGUgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQsIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBpbiBnZW5lcmFsIHBhcmFtcyBjYW4gYmUgc2V0IGF0IG9wZW4gb3IgcmVhZHkgc3RhZ2UgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSygoIG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX29wZW5lZCkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgfQotCi0gICAgLyogU2V0IG9wdGlvbiAqLwotICAgIHN3aXRjaCggb3B0aW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXBlckNodW5rKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ7IC8qbWF5YmUgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gYWRkZWQgeWV0Ki8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRDsgLyptYXliZSB0aGUgc3RyZWFtIGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLQotICAgICAgICAgICAgICAgICAgICAvKkluIE00TVA0V19vcGVuZWQgc3RhdGUsIG5vIHN0cmVhbSBpcyBwcmVzZW50IHlldCwgc28gb25seSBnbG9iYWwgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgdXBkYXRlZC4qLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZSA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heENodW5rSW50ZXIpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRNUDRXX1RpbWUzMilzdHJlYW1JRHZhbHVlUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAvKnRpbWUgY29udmVyc2lvbiEqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfbWF4RmlsZVNpemUpOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZW1iZWRkZWRTdHJpbmcpOgotICAgICAgICAgICAgbWVtQWRkclB0ciA9IChNNE1QNFdfbWVtQWRkciAqKXZhbHVlOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA+IDE2IGJ5dGVzLCB0aGVuIHRoZSBzdHJpbmcgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPCAxNiBieXRlcywgdGhlbiByZXR1cm4gTTRFUlJfUEFSQU1FVEVSCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1lbUFkZHJQdHItPnNpemUgPj0gMTYsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygxNiwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJlbWJlZGRlZFN0cmluZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2ludGVncmF0aW9uVGFnKToKLSAgICAgICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKil2YWx1ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPiA2MCBieXRlcywgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplIDwgNjAgYnl0ZXMsIHRoZW4gcGFkIHdpdGggMAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg2MCwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnRlZ3JhdGlvblRhZyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qZWxzZSwganVzdCBvdmVyd3JpdGUgdGhlIHByZXZpb3VzbHkgc2V0IHN0cmluZyovCi0gICAgICAgICAgICBpZiAobWVtQWRkclB0ci0+c2l6ZSA8IDYwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICA2MCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCBtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDYwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19DYW1jb2RlclZlcnNpb24pOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiA9IHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAvKm5vdCBtZWFuaW5nZnVsbCB0byBzZXQgdGhpcyBwYXJhbWV0ZXIgb24gYSBzdHJlYW1JRCBiYXNpcyovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfcHJlV3JpdGVDYWxsQmFjayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPlByZVdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+UG9zdFdyaXRlQ2FsbEJhY2sgPSAqKE00TVA0V19Xcml0ZUNhbGxCYWNrKil2YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOyovCi0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEFVc2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHIgPSAoTTRTWVNfU3RyZWFtSURWYWx1ZSAqKXZhbHVlOwotCi0gICAgICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAvKmlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkqLwotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemUgPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfSU9EKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0VTRCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19TRFApOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfdHJhY2tTaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyID0gKE00TVA0V19TdHJlYW1JRHNpemUgKil2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKChzdHJlYW1JRHNpemVQdHItPnN0cmVhbUlEICE9IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpKQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPSBzdHJlYW1JRHNpemVQdHItPndpZHRoOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURzaXplUHRyLT5oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgLypzaGFsbCBub3Qgc2V0IHRoaXMgb3B0aW9uIGJlZm9yZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyB3ZXJlIGFkZGVkKi8KLSAgICAgICAgICAgIC8qbm9uc2Vuc2UgdG8gc2V0IHRoaXMgb3B0aW9uIGlmIG5vdCBpbiBjYXNlIGF1ZGlvK3ZpZGVvKi8KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19NT09WZmlyc3QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfVjJfTU9PRik6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19WMl90YmxDb21wcmVzKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEZpbGVEdXJhdGlvbik6Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbiA9ICooTTRPU0FfVUludDMyICopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfc2V0RnR5cEJveCk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHNpemU7Ci0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soKCAoTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZSktPm1ham9yX2JyYW5kICE9IDAsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cCA9ICooTTRNUDRDX0Z0eXBCb3ggKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBnbG9iYWwgcG9zaXRpb24gdmFyaWFibGVzIHdpdGggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb21tb24gYW5kCi0gICAgICAgICAgICAgICAgIHVzZXIgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBzaXplID0KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIHNpemVvZihNNE9TQV9VSW50MzIpOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgPSA4LyptZGF0Ki8gKyAxNiArIHNpemU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSA9IDIxOC8qbWRhdCttb292K3NraXAqLyArIDE2ICsgc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19EU0kpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ciA9IChNNFNZU19TdHJlYW1JRG1lbUFkZHIgKil2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIE5lc3RlZCBzd2l0Y2ghIFdoZWUhICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRG1lbUFkZHJQdHItPnN0cmVhbUlEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBEU0kgc2V0dGluZyA6IG9ubHkgb25jZSBhbGxvd2VkIG9uIGEgZ2l2ZW4gc3RyZWFtICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnRyYWNrVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgSDI2MyBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSBpcyBzdXBwb3NlZCB0byBiZSBhbHdheXMgNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplID09IDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbUlEbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIE1QRUc0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1QNFYgc3BlY2lmaWMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplIDwgMTA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKyBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHN0cmlwIHRoZSBEU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb246IGluIHNldCBvcHRpb24gRFNJIHNpemUgPSVkIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLCBNNE1QNF9XUklURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtIEguMjY0IHRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBkc2kgYWxyZWFkeSBzZXQgISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBIMjY0IGRzaSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSB0aGUgRFNJIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgRFNJIChTUFMgKyBQUFMpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGNhc2UgTTRNUDRXX01VTF9QUFNfU1BTOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTID0gKihNNE9TQV9JbnQ4ICopdmFsdWU7Ci0gICAgICAgICAgICAvKiBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0U3RhdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRNUDRXX1N0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBzd2l0Y2goIHN0cmVhbUlEICkKLSAgICB7Ci0gICAgICAgIGNhc2UgKDApOgotICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKEF1ZGlvU3RyZWFtSUQpOgotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqc3RhdGUgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcEN1cnJlbnRGaWxlU2l6ZSApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSyhwQ3VycmVudEZpbGVTaXplICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgKnBDdXJyZW50RmlsZVNpemUgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotCi0gICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkNGVjN2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNmZmYjNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0Zyb20yaVRvTW9ub18xNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0ZST00ySVRPTU9OT18xNl9IXwotI2RlZmluZSBfRlJPTTJJVE9NT05PXzE2X0hfCi0KLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoICBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAgLyogX0ZST00ySVRPTU9OT18xNl9IXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI4OTc0ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9MVk1fVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlIG5hbWU6ICAgICAgICAgIExWTV9UeXBlcy5oCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzdGFuZGFyZCBMaWZlVmliZXMgdHlwZXMgZm9yIHVzZSBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgICovCi0vKiAgaW50ZXJmYWNlIG9mIGFsbCBMaWZlVmliZXMgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgTFZNX1RZUEVTX0gKLSNkZWZpbmUgTFZNX1RZUEVTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KLQotI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCi0jZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCi0jZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3Ci0jZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKLSNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NwotCi0jZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGNhbGxiYWNrSWQgKi8KLSNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSWQgKi8KLQotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJhc2ljIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9DSEFSOyAgICAgICAgICAgLyogQVNDSUkgY2hhcmFjdGVyICovCi0KLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0lOVDg7ICAgICAgICAgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgY2hhciAgICAgICBMVk1fVUlOVDg7ICAgICAgICAgIC8qIFVuc2lnbmVkIDgtYml0IHdvcmQgKi8KLQotdHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBMVk1fSU5UMTY7ICAgICAgICAgIC8qIFNpZ25lZCAxNi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdW5zaWduZWQgc2hvcnQgICAgICBMVk1fVUlOVDE2OyAgICAgICAgIC8qIFVuc2lnbmVkIDE2LWJpdCB3b3JkICovCi0KLXR5cGVkZWYgICAgIGxvbmcgICAgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RhbmRhcmQgRW51bWVyYXRlZCB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Ci0KLQotLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX0Zvcm1hdF9lbjsKLQotCi0vKiBXb3JkIGxlbmd0aCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNXzE2X0JJVCAgICAgID0gMCwKLSAgICBMVk1fMzJfQklUICAgICAgPSAxLAotICAgIExWTV9XT1JETEVOR1RIX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1dvcmRMZW5ndGhfZW47Ci0KLQotLyogTFZNIHNhbXBsaW5nIHJhdGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fRlNfODAwMCAgPSAwLAotICAgIExWTV9GU18xMTAyNSA9IDEsCi0gICAgTFZNX0ZTXzEyMDAwID0gMiwKLSAgICBMVk1fRlNfMTYwMDAgPSAzLAotICAgIExWTV9GU18yMjA1MCA9IDQsCi0gICAgTFZNX0ZTXzI0MDAwID0gNSwKLSAgICBMVk1fRlNfMzIwMDAgPSA2LAotICAgIExWTV9GU180NDEwMCA9IDcsCi0gICAgTFZNX0ZTXzQ4MDAwID0gOCwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCi0gICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0ZzX2VuOwotCi0KLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAotICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCi0gICAgTFZNX1RFTVBPUkFSWV9GQVNUICAgICAgICAgID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKLSAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQotfSBMVk1fTWVtb3J5VHlwZXNfZW47Ci0KLQotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9NZW1vcnlSZWdpb25fc3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTdGFuZGFyZCBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgTFZNX0lOVDMyICgqTFZNX0NhbGxiYWNrKSh2b2lkICAgICAgICAgICpwQ2FsbGJhY2tEYXRhLCAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLCAgIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGluIHRoZSBjYWxsYmFjaykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIEdlbmVyYWxQdXJwb3NlICk7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gdG8gYmUgdXNlZCBhcyBjYWxsYmFjayBJRCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEVuZCBvZiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIExWTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjZlNTk2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsICAgICAgICBNNEFEX0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgQXVkaW8gU2hlbGwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHRoYXQgYXVkaW8gZGVjb2RlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBRF9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRBRF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00QURfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEF1ZGlvIGRlY29kZXIgb3B0aW9ucy4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgZGVjb2RlciB2aWEKLSAqICAgICAgICAgICAgTTRBRF9nZXRPcHRpb25fZmN0L000QURfc2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmxhZyBvZiBwcmVzZW5jZSBvZiBwcm90ZWN0aW9uICovCi0gICAgTTRBRF9rT3B0aW9uSURfUHJvdGVjdGlvbkFic2VudCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIGJsb2MgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9OYkZyYW1lUGVyQmxvYyAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00REVDT0RFUl9BVURJTywgMHgwMiksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEFBQyBkZWNvZGVyIHVzZXIgcGFyYW1ldGVycyAqLwotICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDMpLAotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEFBQyBzdGVhbSB0eXBlICovCi0gICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTApLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgdXNlZCBieXRlcyBpbiB0aGUgbGF0ZXN0IGRlY29kZQotICAgICAodXNlZCBvbmx5IHdoZW4gZGVjb2RpbmcgQUFDIGZyb20gQURJRiBmaWxlKSAqLwotICAgIE00QURfa09wdGlvbklEX1VzZWRCeXRlcyAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQgLCBNNERFQ09ERVJfQVVESU8sIDB4MTEpLAotCi0gICAgLyogUmVhZGVyIEludGVyZmFjZSAqLwotICAgIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDAxMiksCi0KLSAgICAvKiBBdWRpbyBBY2Nlc3MgVW5pdCAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvQVUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxMyksCi0KLSAgICAvKiBSZWFkZXIgZXJyb3IgY29kZSAqLwotICAgIE00QURfa09wdGlvbklEX0dldEF1ZGlvQVVFcnJDb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTQpLAotCi0gICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTUpLAotCi0gICAgLyogU2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTYpLAotCi0gICAgLyogQXVkaW8gQVUgQ1RTICovCi0gICAgTTRBRF9rT3B0aW9uSURfQXVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgxNykKLQotfSBNNEFEX09wdGlvbklEOwotCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRfa1Vua25vd24gPSAwLCAgICAvKiBVbmtub3duIHN0cmVhbSB0eXBlICovCi0gICAgTTRfa0FBQywgICAgICAgICAgICAvKiBNNF9rQUFDX01BSU4gb3IgTTRfa0FBQ19MQyBvciBNNF9rQUFDX1NTUiBvciBNNF9rQUFDX0xUUCAgICAqLwotICAgIE00X2tBQUNwbHVzLCAgICAgICAgLyogRGVjb2RlciB0eXBlIGlzIEFBQyBwbHVzICovCi0gICAgTTRfa2VBQUNwbHVzICAgICAgICAvKiBEZWNvZGVyIHR5cGUgaXMgZW5oYW5jZWQgQUFDIHBsdXMgKi8KLX0gTTRfQUFDVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNEFEX1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXVkaW8gdHlwZXMgdXNlZCB0byBjcmVhdGUgZGVjb2RlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuIEVhY2ggZGVjb2RlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgZGVjb2RlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5Ci0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00QURfa1R5cGVBTVJOQiA9IDAsCi0gICAgTTRBRF9rVHlwZUFNUldCLAotICAgIE00QURfa1R5cGVBQUMsCi0gICAgTTRBRF9rVHlwZU1QMywKLSAgICBNNEFEX2tUeXBlUENNLAotICAgIE00QURfa1R5cGVCQk11c2ljRW5naW5lLAotICAgIE00QURfa1R5cGVXTUEsCi0gICAgTTRBRF9rVHlwZVJNQSwKLSAgICBNNEFEX2tUeXBlQURQQ00sCi0gICAgTTRBRF9rVHlwZV9OQiAgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00QURfVHlwZSA7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBidWZmZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIG1fZGF0YUFkZHJlc3M7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fYnVmZmVyU2l6ZTsKLSAgICBpbnQ2NF90ICAgICAgICAgbV90aW1lU3RhbXBVczsKLX0gTTRBRF9CdWZmZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9jcmVhdGVfZmN0KShNNEFEX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVzdHJveXMgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfZGVzdHJveV9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgRGVjb2RlcyB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUgICAgUGFyc2VzIGFuZCBkZWNvZGVzIHRoZSBuZXh0IGF1ZGlvIGZyYW1lLCBmcm9tIHRoZSBnaXZlbiBidWZmZXIuCi0gKiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBwSW5wdXRCdWZmZXJTaXplIHZhbHVlIGFjY29yZGluZyB0byB0aGUgYW1vdW50Ci0gKiAgICAgICAgICAgIG9mIGRhdGEgYWN0dWFsbHkgcmVhZC4KLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBpbnB1dEJ1ZmZlcjogICAgICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBkZWNvZGVkUENNQnVmZmVyOiAgICAoT1VUKSAgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgICAoSU4pICAgIE00T1NBX1RSVUUgaWYgYSBqdW1wIHdhcyBqdXN0IGRvbmUsIE00T1NBX0ZBTFNFIG90aGVyd2lzZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3N0ZXBfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00QURfQnVmZmVyICpwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9CdWZmZXIgKnBEZWNvZGVkUENNQnVmZmVyLCBNNE9TQV9Cb29sIGp1bXBpbmcpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXRzIHRoZSBkZWNvZGVyIHZlcnNpb24KLSAqIEBub3RlICAgIFRoZSB2ZXJzaW9uIGlzIGdpdmVuIGluIGEgTTRfVmVyc2lvbkluZm8gc3RydWN0dXJlCi0gKgotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgIChPVVQpICAgICAgICBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBnaXZlbiBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2dldFZlcnNpb25fZmN0KShNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIEFBQyBjb3JlIGRlY29kZXIgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgIHRoZSBzdHJlYW0gcHJvcGVydGllcyBhbmQgdG8gdGhlIG9wdGlvbnMgdGhhdCBtYXkKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIHNldCB1c2luZyBNNEFEX3NldE9wdGlvbl9mY3QKLSAqIEBub3RlICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFBQyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZXNwZWNpYWxseSBieSB0aGUgQUFDIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4vT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfc3RhcnRfZmN0KSAgICAoTTRBRF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9yZXNldF9mY3QpICAgIChNNEFEX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBhdWRpbyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRF9zZXRPcHRpb25fZmN0KSAoTTRBRF9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgYXVkaW8gZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFEX2dldE9wdGlvbl9mY3QpIChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgYXVkaW8gZGVjb2RlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvZiBvbmUgYXVkaW8gZGVjb2RlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00QURfVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEFEX0ludGVyZmFjZQotewotCi0gICAgTTRBRF9jcmVhdGVfZmN0KiAgICAgICAgbV9wRmN0Q3JlYXRlQXVkaW9EZWM7Ci0gICAgTTRBRF9zdGFydF9mY3QqICAgICAgICAgICAgbV9wRmN0U3RhcnRBdWRpb0RlYzsKLSAgICBNNEFEX3N0ZXBfZmN0KiAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYzsKLSAgICBNNEFEX2dldFZlcnNpb25fZmN0KiAgICBtX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWM7Ci0gICAgTTRBRF9kZXN0cm95X2ZjdCogICAgICAgIG1fcEZjdERlc3Ryb3lBdWRpb0RlYzsKLSAgICBNNEFEX3Jlc2V0X2ZjdCogICAgICAgICAgICBtX3BGY3RSZXNldEF1ZGlvRGVjOwotICAgIE00QURfc2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjOwotICAgIE00QURfZ2V0T3B0aW9uX2ZjdCogICAgICAgIG1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjOwotCi19IE00QURfSW50ZXJmYWNlOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypfX000QURfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MTQwY2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuaAotICogQGJyaWVmICAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UgdGhhdCBkbyBub3RoaW5nCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFEX05VTExfSF9fCi0jZGVmaW5lIF9fTTRBRF9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IHBvaW50ZXIgb24gYW4gTTRBRF9UeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBhZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBkZWNvZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYW5kIG11c3QgYmUgdW4tYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gKgotICogQHJldHVybiA6IE00Tk9fRVJST1IgIGlmIE9LCi0gKiAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000QURfTlVMTF9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTQxMzYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QUlSX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00QUlSX0FQSS5oCi0gKiBAYnJpZWYgIEFyZWEgb2YgSW50ZXJlc3QgUmVzaXplciAgQVBJCi0gKiBAbm90ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgTTRBSVJfQVBJX0gKLSNkZWZpbmUgTTRBSVJfQVBJX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gbGlzdHMgdGhlIGRpZmZlcmVudCBhY2NlcHRlZCBmb3JtYXQgZm9yIHRoZSBBSVIuCi0gKiBUbyBiZSBhdmFpbGFibGUsIHRoZSBhc3NvY2lhdGVkIGNvbXBpbGF0aW9uIGZsYWcgbXVzdCBiZSBkZWZpbmVkLCBlbHNlLAotICogdGhlIEFJUiB3aWxsIHJldHVybiBhbiBlcnJvciAoY29tcGlsYXRpb24gZmxhZyA6IE00QUlSX1hYWFhYWF9GT1JNQVRfU1VQUE9SVEVEKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rWVVWNDIwUCwKLSAgICBNNEFJUl9rWVVWNDIwQVAsCi0gICAgTTRBSVJfa0pQRwotfU00QUlSX0lucHV0Rm9ybWF0VHlwZSA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgICAgICBNNEFJUl9Db29yZGluYXRlcwotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIFggYW5kIFkgY29vcmRpbmF0ZXMgaW4gYSBnaXZlbiBwaWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIG1feDsgICAgLyoqPCBYIGNvb3JkaW5hdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV95OyAgICAvKio8IFkgY29vcmRpbmF0ZSAqLwotfU00QUlSX0Nvb3JkaW5hdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfU2l6ZQotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaW1lbnNpb24gb2YgYSBnaXZlbiBwaWN0dXJlIGFyZWEuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgLyoqPCBXaWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgLyoqPCBIZWlnaHQgKi8KLX1NNEFJUl9TaXplOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfUGFyYW1zCi0gKiBAYnJpZWYgICAgIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGdldCBhIHJlc2l6ZWQgUk9JIChSZWdpb24gb2YgaW50ZXJlc3QpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfQ29vcmRpbmF0ZXMgICAgICAgIG1faW5wdXRDb29yZDsgICAgICAgICAgICAvKio8IFggYW5kIFkgcG9zaXRpb25uaW5nIGluIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgcGl4ZWwgKHRvcC1sZWZ0KSAqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9pbnB1dFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBpbnRlcmVzdGluZyBhcmVhIGluc2lkZSBpbnB1dCAod2lkdGggYW5kIGhlaWdodCkqLwotICAgIE00QUlSX1NpemUgICAgICAgICAgICAgICAgbV9vdXRwdXRTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgb3V0cHV0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPdXRwdXRTdHJpcGU7ICAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgd2Ugd2lsbCBoYXZlIHRvIHByb3ZpZGUgb3V0cHV0IHBlciBzdHJpcGUgb3Igbm90ICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gICAgICAgIG1fb3V0cHV0T3JpZW50YXRpb247ICAgIC8qKjwgRGVzaXJlZCBvcmllbnRhdGlvbiBvZiB0aGUgQUlSIG91dHB1dCAqLwotfU00QUlSX1BhcmFtczsKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIEVSUk9SUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3RlZCB2aWRlbyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gKi8KLSNkZWZpbmUgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAxKQotCi0vKiBUaGlzIGVycm9yIG1lYW5zIHRoYXQgdGhlIGlucHV0IG9yIG91dHB1dCBzaXplIGlzIGluY29ycmVjdCAqLwotI2RlZmluZSBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QUlSLDB4MDAwMDAyKQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpOwotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgICBwcm9jZXNzaW5nIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0Q29vcmQ6ICAgIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX2lucHV0U2l6ZTogICAgKElOKSBpbnB1dCBST0kgc2l6ZS4KLSAqIEBwYXJhbSAgICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAgIChJTikgb3V0cHV0IHNpemUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9BSVJfRk9STUFUX05PVF9TVVBQT1JURUQ6IHRoZSByZXF1ZXN0ZWQgaW5wdXQgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgICAgc2V0dGluZ3MgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5Ci0gKiAgICAgICAgICAgIHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4gSW4gc3RyaXBlCi0gKiAgICAgICAgICAgIG1vZGUsIGl0IGlzIGNhbGxlZCBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kCi0gKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgaXMgaW50ZXJuYWxseSBpbmNyZW1lbnRlZAotICogICAgICAgICAgICBhdCBlYWNoIHN0ZXAuCi0gKiAgICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUKLSAqICAgICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwaWN0dXJlLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcEluOiAgICAgICAgICAgIChJTikgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgaW5wdXQgUGxhbmUocykuCi0gKiBAcGFyYW0gICAgcE91dDogICAgICAgIChJTi9PVVQpICBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvdXRwdXQgUGxhbmUocykuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpOwotCi0KLQotI2VuZGlmIC8qIE00QUlSX0FQSV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ3MTBmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFNUlJfQ29yZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNEFNUlJfQ29yZVJlYWRlci5oCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIEFNUiBwYXJzZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFQSSBkZWYuIGZvciBBTVIgUGFyc2VyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEFNUl9DT1JFUkVBREVSX0hfXwotI2RlZmluZSBfX000QU1SX0NPUkVSRUFERVJfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQU1SIHJlYWRlciBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FNUl9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00QU1SX1JFQURFUiwgMHgwMDAwMDIpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRBTVJSX1N0YXRlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBTVIgcmVhZGVyIHN0YXRlcwotICogQG5vdGUgICAgICAgIFRoZXNlIHN0YXRlcyBhcmUgdXNlZCBpbnRlcm5hbHksIGJ1dCBjYW4gYmUgcmV0cmlldmVkIGZyb20gb3V0c2lkZSB0aGUgcmVhZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bXsKLSAgICBNNEFNUlJfa09wZW5pbmcgICAgPSAweDAxMDAsCi0gICAgTTRBTVJSX2tPcGVuZWQgICAgPSAweDAxMDEsCi0gICAgTTRBTVJSX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPSAweDAyMDEsCi0gICAgTTRBTVJSX2tDbG9zZWQgPSAweDMwMAotfU00QU1SUl9TdGF0ZTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLSogQGJyaWVmICAgIE00QU1SUl9PcGVuUmVhZCBwYXJzZXMgdGhlIG1ldGEgZGF0YSBvZiB0aGUgQU1SIGFuZCBhbGxvY2F0ZXMgZGF0YSBzdHJ1Y3R1cmUKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGZpbGUgYW5kIGNyZWF0ZXMgYSBjb250ZXh0IGZvciBBTVIgIFBhcnNlci4KLSogICAgICAgICAgICAtIHNldHMgY29udGV4dCB0byBudWxsIGlmIGVycm9yIG9jY3VyZWQuCi0qIEBwYXJhbSAgICBwQ29udGV4dChPVVQpICAgICAgICA6IEFNUiBSZWFkZXIgY29udGV4dCBhbGxvY2F0ZWQgaW4gdGhlIGZ1bmN0aW9uCi0qIEBwYXJhbSAgICBwRmlsZURlc3NjcmlwdG9yKElOKTogRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlCi0qIEBwYXJhbSAgICBwRmlsZUZ1bmN0aW9uKElOKSAgICA6IHBvaW50ZXIgdG8gZmlsZSBmdW5jdGlvbiBmb3IgZmlsZSBhY2Nlc3MKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBwQ29udGV4dCBhbmQvb3IgcEZpbGVEZXNjcmlwdG9yIGlzIE5VTEwKLSogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EIDogZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybnMgICAgTTRBTVJSX0VSUl9BTVJfTk9UX0NPTVBMSUFOVCA6IFR0aGUgaW5wdXQgaXMgbm90IGEgQU1SIGZpbGUKLSogQHJldHVybnMgICAgTTRPU0FfRklMRSAgICAgICAgOiBTZWUgT1NBTCBmaWxlIFNwZWMuIGZvciBkZXRhaWxzLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0qIEBicmllZiAgICBSZWFkcyB0aGUgbmV4dCBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBmaWxlCi0qIEBub3RlICAgICAgICBHZXQgdGhlIHN0cmVhbSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RyZWFtLgotKiAgICAgICAgICAgIC0gVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIGluIEFNUiBmaWxlLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtRGVzYyhPVVQpOiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV4dCByZWFkIHN0cmVhbQotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEFNUlJfV0FSX05PX01PUkVfU1RSRUFNIDogVGhlcmUgYXJlIG5vIG1vcmUgc3RyZWFtcyBpbiB0aGUgZmlsZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLSogQGJyaWVmICAgIFByZXBhcmVzIHRoZSBBTVIgcmVhZGluZyBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbSBJZHMKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIHJlYWRlciByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RyZWFtSURzKElOKSAgICA6IEFycmF5IG9mIHN0cmVhbSBJZHMgdG8gYmUgcHJlcGFyZWQuCi0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KTsKLSogQGJyaWVmICAgIFJlYWRzIHRoZSBhY2Nlc3MgdW5pdCBpbnRvIHRoZSBwcm92aWRpbmcgc3RyZWFtCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyB0aGUgbWVtb3J5IHRvIGRhdGFBZGRyZXNzIGZpbGVkIGFuZCBjb3BpZWQgdGhlIGRhdGEuCi0qICAgICAgICAgICAgLVRoZSBBcHBsaWNhdGlvbiBzaG91bGQgbm90IGZyZWUgdGhlIGRhdGFBZGRyZXNzIHBvaW50ZXIuCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIFN0cmVhbUlEKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbQotKiBAcGFyYW0gICAgcEF1KElOL09VVCkgICAgICAgIDogQWNjZXNzIFVuaXQKLSoKLSogQHJldHVybnMgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9OT19EQVRBX1lFVCAgICA6IHRoZXJlICAgIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotKiBAcmV0dXJucyAgICAgTTRXQVJfRU5EX09GX1NUUkVBTSAgICA6IFRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSogQHJldHVybnMgICAgIE00QU1SUl9FUlJfSU5WQUxJRF9GUkFNRV9UWVBFIDogY3VycmVudCBmcmFtZSBoYXMgbm8gdmFsaWQgZnJhbWUgdHlwZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0qIEBicmllZiAgICBOb3RpZnkgdGhlIEFSTSBSZWFkZXIgdGhhdCBhcHBsaWNhdGlvbiB3aWxsIG5vIGxvbmdlciB1c2UgIkFVIgotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgcEF1LT5kYXRhQWRkcmVzcyBwb2ludGVyCi0qICAgICAgICAgICAgLUNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgYmFjayB0byByZWFkaW5nLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0KLSogQHBhcmFtICAgIHBBdShJTikgICAgICAgICAgICA6IEFjY2VzcyBVbml0Ci0qCi0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSogICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19zZWVrQWNjZXNzTW9kZSAgICBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci0qIEBicmllZiAgICBUaGUgZnVuY3Rpb24gc2Vla3MgdGhlIHRhcmdldGVkIHRpbWUgaW4gdGhlIGdpdmUgc3RyZWFtIGJ5IHN0cmVhbUlkLgotKiBAbm90ZSAgICAgICAgRWFjaCBmcmFtZSBpcyBvZiAyMCBtcyBkdXJhdGlvbiwsIGJ1aWxkcyB0aGUgc2VlayB0YWJsZSBhbmQgcG9pbnRzCi0qICAgICAgICAgICAgdGhlIGZpbGUgcG9pbnRlciB0byBzdGFydGluZyBmb3IgdGhlIHJlcXVpcmVkIEFVLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBBcnJheSBvZiBzdHJlYW0gSURzLgotKiBAcGFyYW0gICAgdGltZShJTikgICAgICAgIDogdGFyZ2V0ZWQgdGltZQotKiBAcGFyYW0gICAgc2Vla01vZGUoSU4pICAgIDogU2VsZWN0cyB0aGUgc2VlayBtb2RlCi0qIEBwYXJhbSAgICBwT2J0YWluQ1RTKE9VVCkgICAgOiBSZXR1cm5lZCB0aW1lIG5lYXJlc3QgdG8gdGFyZ2V0LgotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qIEByZXR1cm5zICAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgOiB0aW1lIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlICAgIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLSogQGJyaWVmICAgIEFNUiByZWFkZXIgY2xvc2VzIHRoZSBmaWxlCi0qIEBwYXJhbSAgICBDb250ZXh0KElOP09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KTsKLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0qIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBBTVIgcmVhZGVyCi0qIEBwYXJhbSAgICBDb250ZXh0KElOL09VVCkgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQKLSogQHBhcmFtICAgIHBTdGF0ZShPVVQpICAgICAgICA6IENvcmUgQU1SIHJlYWRlciBzdGF0ZQotKiBAcGFyYW0gICAgc3RyZWFtSWQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtIDAgZm9yIGFsbAotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgOiAgICBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6ICAgIEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRTdGF0ZShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00QU1SUl9TdGF0ZSogcFN0YXRlLCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBHZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIEFNUiByZWFkZXIKLSAqIEBwYXJhbSAgICB2ZXJzaW9uKE9VVCkgICAgOiB0aGUgc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMKLSAqCi0gKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgICAgIDogICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIDogICAgdmVyc2lvbiBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplICAgIChNNE9TQV9Db250ZXh0IENvbnRleHQsIE00T1NBX1VJbnQzMiAqcE1heEF1U2l6ZSkKLSAqIEBicmllZiAgICBDb21wdXRlcyB0aGUgbWF4aW11bSBhY2Nlc3MgdW5pdCBzaXplIG9mIGEgc3RyZWFtCi0gKgotICogQHBhcmFtICAgIENvbnRleHQgICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNYXhBdVNpemUgICAgKE9VVCkgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIGluIHRoZSBzdHJlYW0KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogT25lIG9mIHRoZSBpbnB1dCBwb2ludGVyIGlzIE00T1NBX05VTEwgKERlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzKi8KLSNlbmRpZiAvKl9fTTRBTVJfQ09SRVJFQURFUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2YTBmYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNENvbW1vbl90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00Q29tbW9uX1R5cGVzLmgKLSAqIEBicmllZiAgZGVmaW5lcyBjb21tb24gc3RydWN0dXJlcwotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBNNENPTU1PTl9UWVBFU19ICi0jZGVmaW5lIE00Q09NTU9OX1RZUEVTX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00Q09NTU9OX01ldGFkYXRhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tVbmtub3duTWV0YURhdGFUeXBlLAotICAgIC8qIExvY2FsIGZpbGVzICovCi0gICAgTTRDT01NT05fa1RhZ0lEM3YxLCAgICAgICAgICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIFRBRyBJRDMgVjEgKi8KLSAgICBNNENPTU1PTl9rVGFnSUQzdjIsICAgICAgICAgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gVEFHIElEMyBWMiAqLwotICAgIE00Q09NTU9OX2tBU0ZDb250ZW50RGVzYywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gQVNGIGNvbnRlbnQgZGVzY3JpcHRpb24gICovCi0KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0TW92aWVCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKG1vdmllIGJveCkgKi8KLSAgICBNNENPTU1PTl9rM0dwcEFzc2V0VHJhY2tCb3gsICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYSAzZ3BwIGZpbGUgKHRyYWNrIGJveCkgKi8KLQotICAgIC8qIFN0cmVhbWluZyAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcFNlc3Npb24sICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKFNlc3Npb24gbGV2ZWwpICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwQXVkaW8sICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChtZWRpYSBhdWRpbyBsZXZlbCkgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBWaWRlbywgICAgICAgIC8qKjwgIE1ldGFkYXRhIGZyb20gYW4gU0RQIGZpbGUgKG1lZGlhIHZpZGVvIGxldmVsKSAqLwotCi0gICAgTTRDT01NT05fa0pwZWdFeGlmICAgICAgICAgICAgICAgIC8qKjwgRVhJRiBpbiBKUEVHICovCi19IE00Q09NTU9OX01ldGFkYXRhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNFZQU19FbmNvZGluZ0Zvcm1hdAotICogQGJyaWVmICAgICAgICBUZXh0IGVuY29kaW5nIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVbmtub3duICAgID0gMCwgICAgICAvKio8IFVua25vd24gZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0QVNDSUkgICAgPSAxLCAgICAgICAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAgIC8qKjwgVVRGLTggZW5jb2RlZCBVbmljb2RlIC4gVGVybWluYXRlZCB3aXRoICQwMCAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVVEYxNiAgICA9IDMgICAgICAgICAvKio8IFVURi0xNiBlbmNvZGVkIFVuaWNvZGUuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgMDAgKi8KLX0gIE00Q09NTU9OX0VuY29kaW5nRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZQU19TdHJpbmcKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBzdHJpbmcgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcFN0cmluZzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUZXh0IHNpemUgaW4gYnl0ZXMgICAgICAgICovCi0gICAgTTRDT01NT05fRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotCi19IE00Q09NTU9OX1N0cmluZzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZ2VuZXJpYyBidWZmZXIgYXR0cmlidXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIG1fcEJ1ZmZlcjsgICAgICAgIC8qKjwgUG9pbnRlciB0byBidWZmZXIgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3NpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIGJ1ZmZlciBpbiBieXRlcyAgICAqLwotfSBNNENPTU1PTl9CdWZmZXI7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9OT05FLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9KUEcsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1BORywKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfQk1QLCAgIC8qIGJpdG1hcCwgd2l0aCBoZWFkZXIgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUkdCMjQsIC8qIHJhdyBSR0IgMjQgYml0cyAqLwotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9SR0I1NjUsIC8qIHJhdywgUkdCIDE2IGJpdHMgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfWVVWNDIwLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9NUEVHNF9JRnJhbWUgLyogUkM6IHRvIHN1cHBvcnQgUFYgYXJ0ICovCi0KLX0gTTRDT01NT05fTWltZVR5cGU7Ci0KLS8qIHBpY3R1cmUgdHlwZSBkZWZpbml0aW9uIGZyb20gaWQzdjIgdGFnKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyICAgICAgICAgICAgICAgID0gMHgwMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV8zMl8zMl9JY29uICAgICAgICAgICAgPSAweDAxLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX090aGVyX0ljb24gICAgICAgICAgICA9IDB4MDIsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRnJvbnRDb3ZlciAgICAgICAgICAgID0gMHgwMywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CYWNrQ292ZXIgICAgICAgICAgICA9IDB4MDQsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTGVhZmxldFBhZ2UgICAgICAgICAgICA9IDB4MDUsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTWVkaWEgICAgICAgICAgICAgICAgPSAweDA2LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0xlYWRBcnRpc3QgICAgICAgICAgICA9IDB4MDcsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQXJ0aXN0ICAgICAgICAgICAgICAgID0gMHgwOCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Db25kdWN0b3IgICAgICAgICAgICA9IDB4MDksCi0gICAgTTRDT01NT05fa1BpY1R5cGVfT3JjaGVzdHJhICAgICAgICAgICAgPSAweDBBLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0NvbXBvc2VyICAgICAgICAgICAgPSAweDBCLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0x5cmljaXN0ICAgICAgICAgICAgPSAweDBDLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX1JlY29yZGluZ0xvY2F0aW9uICAgID0gMHgwRCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdSZWNvcmRpbmcgICAgICAgID0gMHgwRSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9EdXJpbmdQZXJmb3JtYW5jZSAgICA9IDB4MEYsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfTW92aWVTY3JlZW5DYXB0dXJlICAgID0gMHgxMCwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9CcmlnaHRDb2xvdXJlZEZpc2ggICAgPSAweDExLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0lsbHVzdHJhdGlvbiAgICAgICAgPSAweDEyLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0FydGlzdExvZ28gICAgICAgICAgICA9IDB4MTMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfU3R1ZGlvTG9nbyAgICAgICAgICAgID0gMHgxNAotfSBNNENPTU1PTl9QaWN0dXJlVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNENPTU1PTl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgb3JpZW50YXRpb24gb2YgYSBmcmFtZSBhcyBkZXNjcmliZWQKLSAqICAgICAgICAgICAgaW4gdGhlIEVYSUYgc3RhbmRhcmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93biA9IDAsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3AsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbQotfU00Q09NTU9OX09yaWVudGF0aW9uIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRFWElGQ19Mb2NhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgSW1hZ2UgR1BTIGxvY2F0aW9uIChleGFtcGxlIDogNDiwNTIuMjEnICkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0Zsb2F0ICAgIGRlZ3JlZXM7Ci0gICAgTTRPU0FfRmxvYXQgICAgbWluc2VjOwotfSBNNENPTU1PTl9Mb2NhdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGZpZWxkcyBvZiBhIGFsYnVtIGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWltZVR5cGUgICAgbV9taW1lVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdWlTaXplOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wRGF0YTsKLQotICAgIE00Q09NTU9OX1N0cmluZyAgICAgICAgbV9wRGVzY3JpcHRpb247Ci0KLX0gTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRDT01NT05fTWV0YURhdGFGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgbWV0YWRhdGEgaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01ldGFkYXRhVHlwZSAgICBtX01ldGFkYXRhVHlwZTsKLQotICAgIC8qIE1ldGEgZGF0YSBmaWVsZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wVGl0bGU7ICAgICAgICAgICAgLyoqPCBUaXRsZSBmb3IgdGhlIG1lZGlhICAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBcnRpc3Q7ICAgICAgICAgICAgLyoqPCBQZXJmb3JtZXIgb3IgYXJ0aXN0ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEFsYnVtOyAgICAgICAgICAgIC8qKjwgQWxidW0gdGl0bGUgZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBdXRob3I7ICAgICAgICAgICAgLyoqPCBBdXRob3Igb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcEdlbnJlOyAgICAgICAgICAgIC8qKjwgR2VucmUgKGNhdGVnb3J5IGFuZCBzdHlsZSkgb2YgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcERlc2NyaXB0aW9uOyAgICAgICAgLyoqPCBDYXB0aW9uIG9yIGRlc2NyaXB0aW9uIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ29weVJpZ2h0czsgICAgICAgIC8qKjwgTm90aWNlIGFib3V0IG9yZ2FuaXphdGlvbiBob2xkaW5nIGNvcHlyaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG1lZGlhIGZpbGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wUmVjb3JkaW5nWWVhcjsgICAgLyoqPCBSZWNvcmRpbmcgeWVhciBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFJhdGluZzsgICAgICAgICAgICAvKio8IE1lZGlhIHJhdGluZyAqLwotCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENsYXNzaWZpY2F0aW9uOyAgICAvKio8IENsYXNzaWZpY2F0aW9uIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BLZXlXb3JkczsgICAgICAgIC8qKjwgTWVkaWEga2V5d29yZHMgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9jYXRpb247ICAgICAgICAvKio8IExvY2F0aW9uIGluZm9ybWF0aW9uICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFVybDsgICAgICAgICAgICAgICAgLyoqPCBSZWZlcmVuY2Ugb2YgdGhlIHJlc291cmNlICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV91aVRyYWNrTnVtYmVyOyAgICAvKio8IFRyYWNrIG51bWJlciBmb3IgdGhlIG1lZGlhKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV91aUR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzICovCi0KLSAgICBNNENPTU1PTl9NZXRhRGF0YUFsYnVtQXJ0ICAgIG1fYWxidW1BcnQ7ICAgIC8qKjwgQWxidW1BcnQgZGVzY3JpcHRpb24gKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgICAgICAgICAgICAgbV9wTW9vZDsgICAgLyoqPCBNb29kIG9mIHRoZSBtZWRpYSAqLwotCi0gICAgLyoqPCBNb2RpZnMgQUNPIDQvMTIvMDcgOiBhZGQgRXhpZiBzcGVjaWZpYyBpbmZvcyAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDcmVhdGlvbkRhdGVUaW1lOyAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BNYW51ZmFjdHVyZXI7ICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFNvZnR3YXJlOyAgICAgICAgICAgIC8qKjwgc29mdHdhcmUgdXNlZCAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG1fT3JpZW50YXRpb247ICAgICAgICAvKio8IE9yaWVudGF0aW9uIG9mIHRoZSBwaWN0dXJlICovCi0KLSAgICAvKio8IE1vZGlmcyBGUyAyOS8wOC8wOCA6IGFkZGl0aW9ubmFsIEV4aWYgaW5mb3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV93aWR0aDsgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2hlaWdodDsgICAgICAgICAgICAvKio8IGltYWdlIGhlaWdodCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV90aHVtYm5haWxTaXplOyAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BMYXRpdHVkZVJlZjsgICAgICAgIC8qKjwgTGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbV9sYXRpdHVkZTsgICAgICAgIC8qKjwgTGF0aXR1ZGUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTG9uZ2l0dWRlUmVmOyAgICAvKio8IExvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBtX2xvbmdpdHVkZTsgICAgICAgIC8qKjwgTG9uZ2l0dWRlICAqLwotCi19IE00Q09NTU9OX01ldGFEYXRhRmllbGRzOwotCi0KLSNlbmRpZiAvKk00Q09NTU9OX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4Y2FiN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNERBX1R5cGVzLmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyB0eXBlIGRlZmluaXRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG1lZGlhIHNwZWNpZmljIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTREQV9UWVBFU19IX18KLSNkZWZpbmUgX19NNERBX1RZUEVTX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNF9TdHJlYW1UeXBlCi0gKiBAYnJpZWYgICAgICAgIFR5cGUgdXNlZCB0byBkZXNjcmliZSBhIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8gZGF0YSBmbG93KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERBX1N0cmVhbVR5cGVVbmtub3duICAgICAgICAgICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93IHR5cGUgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0ICAgICAgICAgICAgPSAwLCAgICAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyAgICAgICAgICAgID0gMSwgICAgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kICAgID0gMiwgICAgLyoqPCBBbXIgbmFycm93IGJhbmQgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kICAgICAgICA9IDMsICAgIC8qKjwgQW1yIHdpZGUgYmFuZCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBBQUMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01wMyAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTVAzIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NSnBlZyAgICAgICAgICAgID0gNiwgICAgLyoqPCBNSlBFRyB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBXYXYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb01pZGkgICAgICAgICAgICA9IDgsICAgIC8qKjwgTWlkaSBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgICAgICAgID0gOSwgICAgLyoqPCBNUEVHLTQgQVZDIHZpZGVvIChoMjY0KSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUyAgICAgICAgICAgID0gMTAsICAgIC8qKjwgQUFDIEFEVFMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUYgICAgICAgICAgICA9IDExLCAgICAvKio8IEFBQyBBRElGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9XbWEgICAgICAgICAgICAgICAgPSAxMiwgICAgLyoqPCBXTUEgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb1dtdiAgICAgICAgICAgICAgICA9IDEzLCAgICAvKio8IFdNViB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvUmVhbCAgICAgICAgICAgID0gMTQsICAgLyoqPCBSRUFMIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9SZWFsICAgICAgICAgICAgPSAxNSwgICAvKio8IFJFQUwgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgICAgICAgICAgICA9IDE2LCAgIC8qKjwgRXZyYyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVRpbWVkVGV4dCAgICAgICAgICAgID0gMjAsICAgIC8qKjwgVGltZWQgVGV4dCAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQmJhICAgICAgICAgICAgICAgID0gMjEsICAgIC8qKjwgQmVhdCBCcmV3IGF1ZGlvIGZvbWF0ICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9TbWFmICAgICAgICAgICAgPSAyMiwgICAgLyoqPCBTTUFGIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9JbWVsb2R5ICAgICAgICAgICAgPSAyMywgICAgLyoqPCBJTUVMT0RZIGF1ZGlvKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1htZiAgICAgICAgICAgICAgICA9IDI0LCAgICAvKio8IFhNRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQnBjICAgICAgICAgICAgICAgID0gMjUsICAgIC8qKjwgQlBDIGF1ZGlvICovCi0KLSAgICAvKiBBRFBDTSAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQURQY20gICAgICAgICAgICA9IDI2LCAgICAvKio8IEFEUENNICovCi0KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4ICAgICAgICA9IDI3Ci19IE00X1N0cmVhbVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N0cmVhbUhhbmRsZXIKLSAqIEBicmllZiAgICAgICAgQmFzZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1UeXBlICAgIG1fc3RyZWFtVHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cmVhbUlkOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdHJlYW0gSWQgKHVuaXF1ZSBudW1iZXIgZGVmaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0pICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIG1fZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzdHJlYW0gaW4gbWlsbGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9hdmVyYWdlQml0UmF0ZTsgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgYml0cmF0ZSBpbiBrYi9zICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fbWF4QVVTaXplOyAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gc2l6ZSBvZiBhbiBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgICAgICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBhYm92ZSAqLwotICAgIHZvaWQqICAgICAgICAgICAgbV9wVXNlckRhdGE7ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciBvbiBVc2VyIERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5pdGlhbGl6ZWQgYnkgdGhlIHVzZXIpICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgbV9iU3RyZWFtSXNPSzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHN0cmVhbSBoYXMgbm8gZXJyb3JzIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgaXMgZmluaXNoZWQgKi8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87ICAgICAgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHBvaW50ZXIgYWJvdmUgKi8KLSAgICAvLyBNUEVHNCAmIEFBQyBkZWNvZGVycyByZXF1aXJlIEVTRFMgaW5mbwotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFU0RTSW5mbzsgICAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIG9uIE1QRUc0IG9yIEFBQyBFU0RTIGJveCAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX0VTRFNJbmZvU2l6ZTsgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBNUEVHNCBvciBBQUMgRVNEUyBib3ggKi8KLX0gTTRfU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHZpZGVvIHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgICAgICAvKio8IEF1ZGlvLVZpZGVvIHN0cmVhbSBjb21tb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV92aWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdmlkZW9IZWlnaHQ7ICAgICAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgIG1fYXZlcmFnZUZyYW1lUmF0ZTsgICAgICAgIC8qKjwgQXZlcmFnZSBmcmFtZSByYXRlIG9mIHRoZSB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZXM7ICAgICAgICAvKio8IFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1ZpZGVvU3RyZWFtSGFuZGxlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhbiBhdWRpbyBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fbmJDaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLW1vbm8sIDItc3RlcmVvKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlRnJhbWVMZW5ndGg7ICAgICAgICAvKio8IFNpemUgb2YgZnJhbWUgc2FtcGxlcyBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9ieXRlU2FtcGxlU2l6ZTsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7ICAgIC8qKjwgU2FtcGxlIGZyZXF1ZW5jeSBpbiBrSHogKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9BdWRpb1N0cmVhbUhhbmRsZXI7Ci0KLSNpZmRlZiBNNFZQU19TVVBQT1JUX1RURVhUCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1RleHRTdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEV4dGVuZGVkIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHRleHQgc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tXaWR0aDsgICAgICAgIC8qKjwgV2lkdGggb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tIZWlnaHQ7ICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgdmlkZW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1hwb3M7ICAgICAgICAvKio8IFggcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV90cmFja1lwb3M7ICAgICAgICAvKio8IFkgcG9zaXRpb24gb2YgdGhlIHRleHQgdHJhY2sgaW4gdmlkZW8gYXJlYSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgYmFja19jb2xfcmdiYVs0XTsgICAgLyoqPCB0aGUgYmFja2dyb3VuZCBjb2xvciBpbiBSR0JBICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICB1aUxlbmdodDsgICAgICAgICAgICAvKio8IHRoZSBzdHJpbmcgbGVuZ2h0IGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBkaXNwX2ZsYWc7ICAgICAgICAgICAgLyoqPCB0aGUgd2F5IHRleHQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGhvcml6X2p1c3RpZjsgICAgICAgIC8qKjwgdGhlIGhvcml6b250YWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgdmVydGlfanVzdGlmOyAgICAgICAgLyoqPCB0aGUgdmVydGljYWwganVzdGlmaWNhdGlvbiBvZiB0aGUgdGV4dCAqLwotICAgIC8qIHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBzdHlsX3N0YXJ0X2NoYXI7ICAgIC8qKjwgdGhlIGZpcnN0IGNoYXJhY3RlciBpbXBhY3RlZCBieSBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgc3R5bF9lbmRfY2hhcjsgICAgICAgIC8qKjwgdGhlIGxhc3QgY2hhcmFjdGVyIGltcGFjdGVkIGJ5IHN0eWxlICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBmb250SUQ7ICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGZvbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGZhY2Vfc3R5bGU7ICAgICAgICAgICAgLyoqPCB0aGUgdGV4dCBmYWNlLXN0eWxlOiBib2xkLCBpdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmVkLCBwbGFpbihkZWZhdWx0KSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgZm9udF9zaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBpbiBwaXhlbCBvZiBmb250ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICB0ZXh0X2NvbF9yZ2JhWzRdOyAgICAvKio8IHRoZSB0ZXh0IGNvbG9yIGluIFJHQkEgKi8KLSAgICAvKiBib3ggKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF90b3A7ICAgICAgICAgLyoqPCB0aGUgdG9wIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfbGVmdDsgICAgICAgIC8qKjwgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGV4dCBib3ggaW4gdGhlIHRyYWNrIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIGJveF9ib3R0b207ICAgICAgLyoqPCB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfcmlnaHQ7ICAgICAgIC8qKjwgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi19IE00X1RleHRTdHJlYW1IYW5kbGVyOwotCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQWNjZXNzVW5pdAotICogQGJyaWVmICAgICAgICBTdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYW4gYWNjZXNzIHVuaXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zdHJlYW1JRDsgICAgICAgLyoqPCBJZCBvZiB0aGUgc3RyZWFtIHRvIGdldCBhbiBBVSBmcm9tICovCi0gIE00T1NBX01lbUFkZHI4ICAgICAgICBtX2RhdGFBZGRyZXNzOyAgICAgIC8qKjwgUG9pbnRlciB0byBhIG1lbW9yeSBhcmVhIHdpdGggdGhlIGVuY29kZWQgZGF0YSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3NpemU7ICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGFBZHJlc3MgYXJlYSAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0NUUzsgICAgICAgICAgICAvKio8IENvbXBvc2l0aW9uIFRpbWUgU3RhbXAgZm9yIHRoZSBBY2Nlc3MgVW5pdCAqLwotICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX0RUUyA7ICAgICAgICAgICAvKio8IERlY29kZWQgVGltZSBTdGFtcCBmb3IgdGhlIEFjY2VzcyBVbml0ICovCi0gIE00T1NBX1VJbnQ4ICAgICAgICAgICAgbV9hdHRyaWJ1dGU7ICAgICAgIC8qKjwgUkFQIGluZm9ybWF0aW9uICYgQVUgY29ycnVwdGVkICovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fbWF4c2l6ZTsgICAgICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBBVSAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAvKio8IFN0cnVjdHVyZSBzaXplICovCi19IE00X0FjY2Vzc1VuaXQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qX19jcGx1c3BsdXMqLwotCi0jZW5kaWYgLyogX19NNERBX1RZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzZTMwNjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00REVDT0RFUl9Db21tb24uaAotICogQGJyaWVmICBTaGVsbCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IGRlY29kZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNERFQ09ERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfT3B0aW9uSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0vKiAtLS0tLSBFcnJvcnMgYW5kIFdhcm5pbmdzIC0tLS0tICovCi0KLS8qKgotICogV2FybmluZzogdGhlcmUgaXMgbm8gbmV3IGRlY29kZWQgZnJhbWUgdG8gcmVuZGVyIHNpbmNlIHRoZSBsYXN0IHJlbmRlcmluZwotICovCi0jZGVmaW5lIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNERFQ09ERVJfQ09NTU9OLCAweDAwMDEpCi0vKioKLSAqIFdhcm5pbmc6IHRoZSBkZWJsb2NraW5nIGZpbHRlciBpcyBub3QgaW1wbGVtZW50ZWQKLSAqLwotI2RlZmluZSBNNFdBUl9ERUJMT0NLSU5HX0ZJTFRFUl9OT1RfSU1QTEVNRU5URUQgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIpCi0KLQotLyogRXJyb3I6IFN0cmVhbSBIMjYzIHByb2ZpbGVzIChvdGhlciB0aGFuICAwKSBhcmUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDAwMSkKLS8qIEVycm9yOiBTdHJlYW0gSDI2MyBub3QgYmFzZWxpbmUgbm90IHN1cHBvcnRlZCAoU3VwcG9ydGVkIHNpemVzIGFyZSBDSUYsIFFDSUYgb3IgU1FDSUYpICovCi0jZGVmaW5lIE00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNCwgMHgwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWwKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQVZDIGRlY29kZXIgcHJvZmlsZSBhbmQgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlCi0gKiBAbm90ZSAgICBUaGlzIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBkZWNvZGVyIHZpYSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xID0gMCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMWIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzMsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzJfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMl8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzNfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNCwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNF8xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF80XzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzUsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzVfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlX2FuZF9MZXZlbF9PdXRfT2ZfUmFuZ2UgPSAyNTUKLX0gTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZGVjb2RlciBvcHRpb25zCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGRlY29kZXIgdmlhIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmVyc2lvbiAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDEpLAotICAgIC8qKgotICAgIEdldCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudGx5IGRlY29kZWQgdmlkZW8KLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9TaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAyKSwKLSAgICAvKioKLSAgICBTZXQgdGhlIGNvbnZlcnNpb24gZmlsdGVyIHRvIHVzZSBhdCByZW5kZXJpbmcKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAzKSwKLSAgICAvKioKLSAgICBBY3RpdmF0ZSB0aGUgRGVibG9ja2luZyBmaWx0ZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNCksCi0gICAgLyoqCi0gICAgR2V0IG5leCByZW5kZXJlZCBmcmFtZSBDVFMKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfTmV4dFJlbmRlcmVkRnJhbWVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUpLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZHVtbXkgdmlkZW8gZGVjb2RlcgotICAgICovCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA2KSwKLSAgICAvKioKLSAgICBTZXQgdGhlIFlVViBkYXRhIHdpdGggY29sb3IgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGR1bW15IHZpZGVvIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdE5vbkNvbnRpZ3VvdXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDcpLAotCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwOCksCi0KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDkpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdXBwb3J0ZWQgdmlkZW8gZGVjb2RlcnMgYW5kIGNhcGFiaWxpdGllcyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfVmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKiBjb21tb24gdG8gTVBFRzQgZGVjb2RlcnMgKi8KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvICovCi0gICAgTTRERUNPREVSX01QRUc0X2tPcHRpb25JRF9EZWNvZGVyQ29uZmlnSW5mbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDEpLAotCi0gICAgLyogbGFzdCBkZWNvZGVkIGN0cyAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FWQyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEpCi0vKiBMYXN0IGRlY29kZWQgY3RzICovCi0KLX0gTTRERUNPREVSX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gcmVhZCBmcm9tIHRoZSBNUEVHLTQgVmlkZW9PYmplY3RMYXllci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVByb2ZpbGU7ICAgICAgICAgICAgICAgIC8qKjwgcHJvZmlsZSBhbmQgbGV2ZWwgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpVGltZVNjYWxlOyAgICAgICAgICAgIC8qKjwgdGltZSBzY2FsZSBhcyBwYXJzZWQgaW4gVk9MIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aVVzZU9mUmVzeW5jaE1hcmtlcjsgICAgLyoqPCBVc2FnZSBvZiByZXN5bmNocm9uaXphdGlvbiBtYXJrZXIgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiRGF0YVBhcnRpdGlvbjsgICAgICAgICAgICAvKio8IElmIDEgZGF0YSBwYXJ0aXRpb25pbmcgaXMgdXNlZC4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICBiVXNlT2ZSVkxDOyAgICAgICAgICAgICAgICAvKio8IFVzYWdlIG9mIFJWTEMgZm9yIHRoZSBzdHJlYW0gKi8KLQotfSBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm87Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9TaXplCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHZpZGVvIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB2aWEgdGhlIE00REVDT0RFUl9nZXRPcHRpb25fZmN0Ci0gKiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBkZWNvZGVkIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000REVDT0RFUl9WaWRlb1NpemUKLXsKLSAgICBNNE9TQV9VSW50MzIgICBtX3VpV2lkdGg7ICAgIC8qKjwgdmlkZW8gd2lkdGggIGluIHBpeGVscyAqLwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlIZWlnaHQ7ICAgIC8qKjwgdmlkZW8gaGVpZ2h0IGluIHBpeGVscyAqLwotCi19IE00REVDT0RFUl9WaWRlb1NpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udmVyc2lvbiBmaWx0ZXIKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgIHBvaW50ZXIgYW5kIGl0cyB1c2VyIGRhdGEgdmlhIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgTTRERUNPREVSX2dldE9wdGlvbl9mY3QgICAgd2l0aCB0aGUgb3B0aW9uCi0gKiAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfT3V0cHV0RmlsdGVyCi17Ci0gICAgTTRPU0FfVm9pZCAgICptX3BGaWx0ZXJGdW5jdGlvbjsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgKm1fcEZpbHRlclVzZXJEYXRhOyAgICAvKio8IHVzZXIgZGF0YSBvZiB0aGUgZmlsdGVyICAgICAgICAqLwotCi19IE00REVDT0RFUl9PdXRwdXRGaWx0ZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX1ZpZGVvVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgICB2aWRlbyBkZWNvZGVyIGludGVyZmFjZS4gRWFjaCBkZWNvZGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCBvbmUgb2YgdGhpcyB0eXBlIGFzc29jaWF0ZWQuCi0gKiAgICAgICAgICAgIFdoZW4gYSBkZWNvZGVyIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW5kCi0gKiAgICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQgPSAwLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlTUpQRUcsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVXTVYsCi0gICAgTTRERUNPREVSX2tWaWRlb1R5cGVSRUFMLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUCwKLQotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlX05CICAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRERUNPREVSX1ZpZGVvVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgbVByb2ZpbGU7Ci0gICAgTTRPU0FfVUludDMyIG1MZXZlbDsKLX0gVmlkZW9Qcm9maWxlTGV2ZWw7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcHJvZmlsZUxldmVsOwotICAgIE00T1NBX1VJbnQzMiBwcm9maWxlTnVtYmVyOwotfSBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00X1N0cmVhbVR5cGUgY29kZWM7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKmNvbXBvbmVudDsKLSAgICBNNE9TQV9VSW50MzIgY29tcG9uZW50TnVtYmVyOwotfSBWaWRlb0RlY29kZXI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWaWRlb0RlY29kZXIgKmRlY29kZXI7Ci0gICAgTTRPU0FfVUludDMyIGRlY29kZXJOdW1iZXI7Ci19IE00REVDT0RFUl9WaWRlb0RlY29kZXJzOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwR2xvYmFsSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlIHRoYXQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzdHJlYW0KLSAqIEBwYXJhbSAgICBwRGF0YUludGVyZmFjZTogICAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIGRlY29kZWQgZGF0YSBhcmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfY3JlYXRlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcEdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwRGF0YUludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZGVzdHJveV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlY29kZXIKLSAqICAgICAgICAgIC10aGUgc2l6ZSAod2lkdGh4aGVpZ2h0KSBvZiB0aGUgaW1hZ2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAoSU4pICAgICAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAoSU4vT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCkoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSBjb252ZXJzaW9uIGZpbHRlciB0byB1c2UgYXQgcmVuZGVyaW5nCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX3NldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIERlY29kZSBBY2Nlc3MgVW5pdHMgdXAgdG8gYSB0YXJnZXQgdGltZQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIHBvc3NpYmxlIHRvIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UgZm9yIHdoaWNoCi0gKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGlvbiB0aW1lIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdG8gdGhlIHBhc3NlZCB0YXJnZXRlZCB0aW1lCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBUaW1lOiAgICAgICAgKElOL09VVCkgICAgSU46IFRpbWUgdG8gZGVjb2RlIHVwIHRvIChpbiBtaWxsaSBzZWNvbmRlcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlCi0gKiBAcGFyYW0gICB0b2xlcmFuY2U6ICAgICAgKElOKSAgICAgICAgV2UgbWF5IGRlY29kZSBhbiBlYXJsaWVyIGZyYW1lIHdpdGhpbiB0aGUgdG9sZXJhbmNlLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aW1lIGRpZmZlcmVuY2UgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IHRvIGRlY29kZSAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9kZWNvZGVfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkp1bXAsIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZW5kZXJzIHRoZSB2aWRlbyBhdCB0aGUgc3BlY2lmaWVkIHRpbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1pbGxpIHNlY29uZGVzKQotICogICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGFjdHVhbGx5IHJlbmRlcmVkIGZyYW1lIChpbiBtcykKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmU6KE9VVCkgICAgICAgIE91dHB1dCBwbGFuZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGRhdGEgKGNvbnZlcnRlZCkKLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdCBoYXMgYWxyZWFkeSBiZWVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCAoaW4gd2hpY2ggY2FzZSB0aGUgZnVuY3Rpb24gY2FuIHJldHVybgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgdG8gcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9yZW5kZXJfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyB2aWRlbyBkZWNvZGVyIGludGVyZmFjZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9mIG9uZSB2aWRlbyBkZWNvZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgZGVjb2RlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRERUNPREVSX1ZpZGVvVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UKLXsKLSAgICBNNERFQ09ERVJfY3JlYXRlX2ZjdCogICAgICAgIG1fcEZjdENyZWF0ZTsKLSAgICBNNERFQ09ERVJfZGVzdHJveV9mY3QqICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00REVDT0RFUl9nZXRPcHRpb25fZmN0KiAgICBtX3BGY3RHZXRPcHRpb247Ci0gICAgTTRERUNPREVSX3NldE9wdGlvbl9mY3QqICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNERFQ09ERVJfZGVjb2RlX2ZjdCogICAgICAgIG1fcEZjdERlY29kZTsKLSAgICBNNERFQ09ERVJfcmVuZGVyX2ZjdCogICAgICAgIG1fcEZjdFJlbmRlcjsKLX0gTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlOwotCi0jZW5kaWYgLypfX000REVDT0RFUl9DT01NT05fSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdkODU3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9OdWxsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWRF9OdWxsLmgKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhICJudWxsIiB2aWRlbyBkZWNvZGVyLGkuZS4gYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90IGRvIGFjdHVhbCBkZWNvZGluZy4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZXRJbnRlcmZhY2UgZnVuY3Rpb24uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000REVDT0RFUl9OVUxMX0hfXwotI2RlZmluZSBfX000REVDT0RFUl9OVUxMX0hfXwotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgaWYgT0sKLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKCBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKipwRGVjb2RlckludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRERUNPREVSX05VTExfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2JhMDJhMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfQXVkaW9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKLSAqIEBicmllZiAgICBWRVMgYXVkaW8gZW5jb2RlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IGF1ZGlvIGVuY29kZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWCAyCi0vKiBXQVJOSU5HOiB0aGlzIHZhbHVlIG11c3QgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIGdyYWJiZWQgKi8KLS8vI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgOTYwICAgIC8qIGltcG9zZWQgYnkgdGhlIEFBQyBlbmNvZGVyLiAqLwotI2RlZmluZSBNNEVOQ09ERVJfQVVESU9fUENNX1NBTVBMRV9OVU1CRVIgMTAyNCAgICAvKiBpbXBvc2VkIGJ5IHRoZSBBQUMgZW5jb2Rlci4gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00RU5DT0RFUl9BdWRpb19PcHRpb25JRAotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29yZSBBQUMgc2hlbGwgZW5jb2RlciBvcHRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gLyogTWF4aW11bSBnZW5lcmF0ZWQgQVUgc2l6ZSAqLwotICAgIE00RU5DT0RFUl9BdWRpb19tYXhBVXNpemUgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELE00RU5DT0RFUl9BVURJTywgMHgwMSkKLQotfSBNNEVOQ09ERVJfQXVkaW9fT3B0aW9uSUQ7Ci0KLQotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazgwMDBIeiA9IDgwMDAsCi0gICAgTTRFTkNPREVSX2sxMTAyNUh6ID0gMTEwMjUsCi0gICAgTTRFTkNPREVSX2sxMjAwMEh6ID0gMTIwMDAsCi0gICAgTTRFTkNPREVSX2sxNjAwMEh6ID0gMTYwMDAsCi0gICAgTTRFTkNPREVSX2syMjA1MEh6ID0gMjIwNTAsCi0gICAgTTRFTkNPREVSX2syNDAwMEh6ID0gMjQwMDAsCi0gICAgTTRFTkNPREVSX2szMjAwMEh6ID0gMzIwMDAsCi0gICAgTTRFTkNPREVSX2s0NDEwMEh6ID0gNDQxMDAsCi0gICAgTTRFTkNPREVSX2s0ODAwMEh6ID0gNDgwMDAKLX0gTTRFTkNPREVSX1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBTVJOQiA9IDAsCi0gICAgTTRFTkNPREVSX2tBQUMsCi0gICAgTTRFTkNPREVSX2tBdWRpb05VTEwsICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa01QMywKLSAgICBNNEVOQ09ERVJfa0F1ZGlvX05CICAgICAgICAvKiBudW1iZXIgb2YgZW5jb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi0KLX0gTTRFTkNPREVSX0F1ZGlvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa01vbm8gID0gMCwKLSAgICBNNEVOQ09ERVJfa1N0ZXJlbywKLSAgICBNNEVOQ09ERVJfa1N0ZXJlb05vSW50ZXJsZWF2ZQotfSBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzRfNzVfS0JQUyAgICA9IDQ3NTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181XzE1X0tCUFMgICAgPSA1MTUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNV85X0tCUFMgICAgPSA1OTAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNl83X0tCUFMgICAgPSA2NzAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN180X0tCUFMgICAgPSA3NDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fN185NV9LQlBTICAgID0gNzk1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzhfS0JQUyAgICAgICAgPSA4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTBfMl9LQlBTICAgID0gMTAyMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMl8yX0tCUFMgICAgPSAxMjIwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2X0tCUFMgICAgPSAxNjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI0X0tCUFMgICAgPSAyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzMyX0tCUFMgICAgPSAzMjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQwX0tCUFMgICAgPSA0MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzQ4X0tCUFMgICAgPSA0ODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzU2X0tCUFMgICAgPSA1NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzY0X0tCUFMgICAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzgwX0tCUFMgICAgPSA4MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzk2X0tCUFMgICAgPSA5NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzExMl9LQlBTICAgID0gMTEyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTI4X0tCUFMgICAgPSAxMjgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNDRfS0JQUyAgICA9IDE0NDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE2MF9LQlBTICAgID0gMTYwMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTkyX0tCUFMgICAgPSAxOTIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yMjRfS0JQUyAgICA9IDIyNDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzI1Nl9LQlBTICAgID0gMjU2MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMzIwX0tCUFMgICAgPSAzMjAwMDAKLX0gTTRFTkNPREVSX0F1ZGlvQml0cmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbgotICogQGJyaWVmICAgICAgICBUaGUgY3VycmVudCBtb2RlIG9mIHRoZSBiaXRyYXRlIHJlZ3VsYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmUgPSAwLCAgICAvKio8IG5vIGJpdHJhdGUgcmVndWxhdGlvbiAqLwotICAgIE00RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyICAgICAgICAvKio8IGJldHRlciBxdWFsaXR5LCBidXQgbW9yZSBDUFUgY29uc3VtZWQgKi8KLX0gTTRFTkNPREVSX0FhY1JlZ3VsYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0FtclNJRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBTSUQgb2YgdGhlIEFNUiBlbmNvZGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQW1yTm9TSUQgPSAwICAgICAvKio8IG5vIFNJRCAqLwotfSBNNEVOQ09ERVJfQW1yU0lEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQWFjUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZSBBQUMgZW5jb2Rlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uICAgIFJlZ3VsYXRpb247Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSGlnaFNwZWVkOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYlROUzsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJQTlM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSVM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiTVM7Ci19IE00RU5DT0RFUl9BYWNQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZyBhdWRpby4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBzX000RU5DT0RFUl9BdWRpb1BhcmFtcwotewotICAgIE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBGcmVxdWVuY3k7ICAgIC8qKjwgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00RU5DT0RFUl9DaGFubmVsTnVtYmVyICAgICAgICBDaGFubmVsTnVtOyAgICAvKio8IHRoZSBudW1iZSBvZiBjaGFubmVscyAobW9ubywgc3RlcmVvLCAuLikgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CaXRyYXRlICAgICAgICBCaXRyYXRlOyAgICAvKio8ICBiaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgIC8qKjwgIGF1ZGlvIGNvbXByZXNzaW9uIGZvcm1hdCwgQU1SLCBBQUMgLi4uICAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgTTRFTkNPREVSX0FhY1BhcmFtcyAgICAgICAgQWFjUGFyYW07Ci0gICAgICAgIE00RU5DT0RFUl9BbXJTSUQgICAgICAgIEFtclNJRDsKLSAgICB9IFNwZWNpZlBhcmFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHRoZSBhdWRpbyBlbmNvZGVyIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLX0gTTRFTkNPREVSX0F1ZGlvUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwSW5mbzsgICAgICAgIC8qKjwgdGhlIGJ1ZmZlciBhZHJlc3MgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgaW5mb1NpemU7ICAgIC8qKjwgdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCi19IE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGF0YSBidWZmZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IHRoZSB0YWJsZSBvZiBidWZmZXJzICh1bnVzZWQgYnVmZmVycyBhcmUgc2V0IHRvIE5VTEwpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgcFRhYmxlQnVmZmVyW000RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVhdOwotICAgIC8qKjwgdGhlIHRhYmxlIG9mIHRoZSBzaXplIG9mIGNvcnJlc3BvbmRpbmcgYnVmZmVyIGF0IHNhbWUgaW5kZXggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgcFRhYmxlQnVmZmVyU2l6ZVtNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYXTsKLX0gTTRFTkNPREVSX0F1ZGlvQnVmZmVyOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9pbml0KSAgICAgICAgKE00T1NBX0NvbnRleHQqIGhDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xlYW5VcCkgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfb3BlbikgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgKnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKmRlY1NwZWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZ3JhYmJlckNvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfY2xvc2UpICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9zdGVwKSAgICAgICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciAqb3V0QnVmZmVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2dldE9wdGlvbikgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX09wdGlvbklEICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICp2YWx1ZVB0cik7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBhdWRpbyBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEFFX2luaXQqICAgICAgICBwRmN0SW5pdDsKLSAgICBNNEFFX2NsZWFuVXAqICAgIHBGY3RDbGVhblVwOwotICAgIE00QUVfb3BlbiogICAgICAgIHBGY3RPcGVuOwotICAgIE00QUVfY2xvc2UqICAgICAgICBwRmN0Q2xvc2U7Ci0gICAgTTRBRV9zdGVwKiAgICAgICAgcEZjdFN0ZXA7Ci0gICAgTTRBRV9nZXRPcHRpb24qICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000RU5DT0RFUl9BVURJT0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEVOQ09ERVJfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwNjQ2MDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVOQ09ERVJfY29tbW9uLmgKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCBlbmNvZGVycwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000RU5DT0RFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRFTkNPREVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICogVmlkZW8gcHJlcHJvY2Vzc2luZyBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFdSSVRFUl9jb21tb24uaCIKLQotLyogSU1BR0UgU1RBQiAqLwotLyogcGVyY2VudGFnZSBvZiBpbWFnZSBzdXBwcmVzc2VkIChjb21wdXRlZCBmcm9tIHRoZSBzdGFuZGFyZCBkaW1lbnNpb24pLiovCi0jZGVmaW5lIE00RU5DT0RFUl9TVEFCX0ZJTFRFUl9DUk9QX1BFUkNFTlRBR0UgMTAKLSAgICAgICAgLyogV0FSTklORzogdGFrZSB0aGUgaW5mZXJpb3IgZXZlbiBkaW1lbnNpb24sIGV4OiAxMCUgZm9yIFFDSUYgb3V0cHV0ID0+IDE5MngxNTggKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfT3Blbk1vZGUKLSAqIEBicmllZiAgICBEZWZpbml0aW9uIG9mIG9wZW4gbW9kZSBmb3IgdGhlIGVuY29kZXIuCi0gKiBAbm90ZSAgICBERUZBVUxUICA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW4oKSB3aGljaCB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKiAgICAgICAgICBBRFZBTkNFRCA6IHBvaW50ZXIgdG8gTTRFTkNPREVSX29wZW5fYWR2YW5jZWQoKSB3aGljaCBhbGxvdyB0byBjdXN0b21pemUKLSAqICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX09QRU5fREVGQVVMVCwKLSAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRAotfSBNNEVOQ09ERVJfT3Blbk1vZGU7Ci0KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9GcmFtZVJhdGUKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgZW5jb2RlZCB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rNV9GUFMsCi0gICAgTTRFTkNPREVSX2s3XzVfRlBTLAotICAgIE00RU5DT0RFUl9rMTBfRlBTLAotICAgIE00RU5DT0RFUl9rMTJfNV9GUFMsCi0gICAgTTRFTkNPREVSX2sxNV9GUFMsCi0gICAgTTRFTkNPREVSX2syMF9GUFMsCi0gICAgTTRFTkNPREVSX2syNV9GUFMsCi0gICAgTTRFTkNPREVSX2szMF9GUFMsCi0gICAgTTRFTkNPREVSX2tWQVJJQUJMRV9GUFMsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFICAgICAgICAgICAgLyoqPCBBZHZhbmNlZCBlbmNvZGluZywgdXNlIHRpbWVzY2FsZSBpbmRpY2F0aW9uIHJhdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBmcmFtZXJhdGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lUmF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gZm9ybWF0IG9mIHRoZSBncmFiYmluZy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0lZVVY0MjA9MCwgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00RU5DT0RFUl9rSVlVVjQyMiwgICAvKio8IFlVVjQyMiBwbGFuYXIgKi8KLSAgICBNNEVOQ09ERVJfa0lZVVlWLCAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00RU5DT0RFUl9rSVVZVlksICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNEVOQ09ERVJfa0lKUEVHLCAgICAgLyoqPCBKUEVHIGNvbXByZXNzZWQgZnJhbWVzICovCi0gICAgTTRFTkNPREVSX2tJUkdCNDQ0LCAgIC8qKjwgUkdCIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I1NTUsICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00RU5DT0RFUl9rSVJHQjU2NSwgICAvKio8IFJHQiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRFTkNPREVSX2tJUkdCMjQsICAgIC8qKjwgUkdCIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNEVOQ09ERVJfa0lSR0IzMiwgICAgLyoqPCBSR0IgMzIgYml0cyAgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I0NDQsICAgLyoqPCBCR1IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjU1NSwgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRFTkNPREVSX2tJQkdSNTY1LCAgIC8qKjwgQkdSIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1IyNCwgICAgLyoqPCBCR1IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00RU5DT0RFUl9rSUJHUjMyICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNEVOQ09ERVJfSW5wdXRGb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0Zvcm1hdAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTVBFRzQgPSAwLAotICAgIE00RU5DT0RFUl9rSDI2MywKLSAgICBNNEVOQ09ERVJfa0gyNjQsCi0gICAgTTRFTkNPREVSX2tKUEVHLAotICAgIE00RU5DT0RFUl9rTUpQRUcsCi0gICAgTTRFTkNPREVSX2tOVUxMLAotICAgIE00RU5DT0RFUl9rWVVWNDIwLCAgICAgICAgICAgIC8qKjwgTm8gY29tcHJlc3Npb24gKi8KLSAgICBNNEVOQ09ERVJfa1lVVjQyMiwgICAgICAgICAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0KLSAgICBNNEVOQ09ERVJfa1ZpZGVvX05CIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLX0gTTRFTkNPREVSX0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aAotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgZnJhbWUgV2lkdGguCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX1NRQ0lGX1dpZHRoID0gMTI4LCAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9XaWR0aCA9IDE2MCwgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRFTkNPREVSX1FDSUZfV2lkdGggID0gMTc2LCAvKio8IFFDSUYgMTc2eDE0NCAqLwotICAgIE00RU5DT0RFUl9RVkdBX1dpZHRoICA9IDMyMCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX1dpZHRoICAgPSAzNTIsIC8qKjwgQ0lGIDM1MngyODggKi8KLSAgICBNNEVOQ09ERVJfVkdBX1dpZHRoICAgPSA2NDAsIC8qKjwgVkdBIDY0MHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfU1ZHQV9XaWR0aCAgPSA4MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9XaWR0aCAgID0gMTAyNCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9XaWR0aCAgPSAxMjgwLCAvKio8IFhWR0EgMTI4MHgxMDI0ICovCi0vKiArUFIgTFY1ODA3ICovCi0gICAgTTRFTkNPREVSX1dWR0FfV2lkdGggID0gODAwLCAvKio8IFdWR0EgODAwIHggNDgwICovCi0gICAgTTRFTkNPREVSX05UU0NfV2lkdGggID0gNzIwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aCAgID0gNjQwLCAgLyoqPCA2NDB4MzYwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl84NTRfNDgwX1dpZHRoICAgPSA4NDgsICAvKio8IDg0OHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGggID0gMTI4MCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgIE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aCAgPSAxMDg4LCAvKio8IDcyMHAgMTA4OHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9XaWR0aCAgID0gOTYwLCAgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoID0gMTkyMCAgLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNEVOQ09ERVJfRnJhbWVXaWR0aDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGZyYW1lIEhlaWdodC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0ID0gOTYsICAvKio8IFNRQ0lGIDEyOHg5NiAqLwotICAgIE00RU5DT0RFUl9RUVZHQV9IZWlnaHQgPSAxMjAsIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00RU5DT0RFUl9RQ0lGX0hlaWdodCAgPSAxNDQsIC8qKjwgUUNJRiAxNzZ4MTQ0ICovCi0gICAgTTRFTkNPREVSX1FWR0FfSGVpZ2h0ICA9IDI0MCwgLyoqPCBRVkdBIDMyMHgyNDAgKi8KLSAgICBNNEVOQ09ERVJfQ0lGX0hlaWdodCAgID0gMjg4LCAvKio8IENJRiAzNTJ4Mjg4ICovCi0gICAgTTRFTkNPREVSX1ZHQV9IZWlnaHQgICA9IDQ4MCwgLyoqPCBWR0EgMzQweDQ4MCAqLwotICAgIE00RU5DT0RFUl9TVkdBX0hlaWdodCAgPSA2MDAsIC8qKjwgU1ZHQSA4MDB4NjAwICovCi0gICAgTTRFTkNPREVSX1hHQV9IZWlnaHQgICA9IDc2OCwgLyoqPCBYR0EgMTAyNHg3NjggKi8KLSAgICBNNEVOQ09ERVJfWFZHQV9IZWlnaHQgID0gMTAyNCwgLyoqPCBYVkdBIDEyODB4MTAyNCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00RU5DT0RFUl9XVkdBX0hlaWdodCAgPSA0ODAsIC8qKjwgV1ZHQSA4MDAgeCA0ODAgKi8KLSAgICBNNEVOQ09ERVJfTlRTQ19IZWlnaHQgID0gNDgwLCAvKio8IE5UU0MgNzIwIHggNDgwICovCi0vKiAtUFIgTFY1ODA3ICovCi0KLS8qICtDUiBHb29nbGUgKi8KLSAgICBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQgID0gMzYwLCAvKio8IDY0MHgzNjAgKi8KLSAgICBNNEVOQ09ERVJfODU0XzQ4MF9IZWlnaHQgID0gNDgwLCAvKio8IDg1NHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTI4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0ID0gNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNEVOQ09ERVJfOTYwXzcyMF9IZWlnaHQgID0gNzIwLCAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodCA9IDEwODggLyoqPCAxMDgwcCAxOTIweDEwODAgKi8KLS8qIC1DUiBHb29nbGUgKi8KLX0gTTRFTkNPREVSX0ZyYW1lSGVpZ2h0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9CaXRyYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBiaXRyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazI4X0tCUFMgID0gMjgwMDAsCi0gICAgTTRFTkNPREVSX2s0MF9LQlBTICA9IDQwMDAwLAotICAgIE00RU5DT0RFUl9rNjRfS0JQUyAgPSA2NDAwMCwKLSAgICBNNEVOQ09ERVJfazk2X0tCUFMgID0gOTYwMDAsCi0gICAgTTRFTkNPREVSX2sxMjhfS0JQUyA9IDEyODAwMCwKLSAgICBNNEVOQ09ERVJfazE5Ml9LQlBTID0gMTkyMDAwLAotICAgIE00RU5DT0RFUl9rMjU2X0tCUFMgPSAyNTYwMDAsCi0gICAgTTRFTkNPREVSX2szODRfS0JQUyA9IDM4NDAwMCwKLSAgICBNNEVOQ09ERVJfazUxMl9LQlBTID0gNTEyMDAwLAotICAgIE00RU5DT0RFUl9rODAwX0tCUFMgPSA4MDAwMDAKLQotfSBNNEVOQ09ERVJfQml0cmF0ZTsKLQotLyogSU1BR0UgU1RBQiAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfU3RhYk1vZGUKLSAqIEBicmllZiAgICAgICAgVGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgc3RhYmlsaXphdGlvbiBmaWx0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tTdGFiT2ZmID0gMCwgICAgICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZGlzYWJsZWQgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJDZW50ZXJlZCwgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGFuZCBvdXRwdXQgbXVzdCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbnMuIE91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lsbCBoYXZlIGJsYWNrIGJvcmRlcnMgKi8KLSAgICBNNEVOQ09ERVJfa1N0YWJHcmFiTW9yZSAgICAgICAgLyoqPCBzdGFiaWxpemF0aW9uIGZpbHRlciBpcyBlbmFibGVkLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGlucHV0IGRpbWVuc2lvbnMgbXVzdCBiZSBiaWdnZXIgdGhhbiBvdXRwdXQuIFRoZSByYXRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluZGljYXRlZCBieSBNNEVOQ09ERVJfU1RBQl9GSUxURVJfQ1JPUF9QRVJDRU5UQUdFICovCi0KLX0gTTRFTkNPREVSX1N0YWJNb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNEVOQ09ERVJfRnJhbWVNb2RlCi0gKiBAYnJpZWYgICAgICAgIFZhbHVlcyB0byBkcml2ZSB0aGUgZW5jb2RlciBiZWhhdmlvdXIgKHR5cGUgb2YgZnJhbWVzIHByb2R1Y2VkKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rTm9ybWFsRnJhbWUgPSAwLCAgIC8qKjwgbGV0IHRoZSBlbmNvZGVyIGRlY2lkZSB3aGljaCB0eXBlIG9mIGZyYW1lIHRvIGVuY29kZSAqLwotICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lICAgPSAxLCAgIC8qKjwgZm9yY2UgZW5jb2RlciB0aGUgZmx1c2ggYWxsIGl0cyBidWZmZXJzIGJlY2F1c2UgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBmcmFtZSAgKi8KLSAgICBNNEVOQ09ERVJfa0lGcmFtZSAgICAgID0gMiAgICAvKio8IGZvcmNlIGVuY29kZXIgdG8gZ2VuZXJhdGUgYW4gSSBmcmFtZSAqLwotCi19IE00RU5DT0RFUl9GcmFtZU1vZGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9QYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBJbnB1dCAqLwotICAgIE00RU5DT0RFUl9JbnB1dEZvcm1hdCAgICBJbnB1dEZvcm1hdDsgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0IChncmFiYmluZykgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBJbnB1dEZyYW1lV2lkdGg7ICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKGdyYWJiaW5nKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBJbnB1dEZyYW1lSGVpZ2h0OyAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAoZ3JhYmJpbmcpICovCi0KLSAgICAvKiBPdXRwdXQgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRFTkNPREVSX0JpdHJhdGUgICAgICAgIEJpdHJhdGU7ICAgICAgICAgICAgLyoqPCBCaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICAgICBGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCBGcmFtZXJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMsIE1QRUc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUpQRUcgLi4uICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9Qcm9maWxlOyAvKiogdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9MZXZlbDsgICAvKiogdmlkZW8gbGV2ZWwgKi8KLX0gTTRFTkNPREVSX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWR2YW5jZWQgc2V0dGluZ3MgYXZhaWxhYmxlIGZvciBNUEVHLTQgZW5jb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBJbnB1dCBwYXJhbWV0ZXJzIChncmFiYmVyIGNvdXBsZWQgd2l0aCBlbmNvZGVyKTogKi8KLSAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgSW5wdXQgdmlkZW8gZm9ybWF0ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgSW5wdXRGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgSW5wdXQgRnJhbWUgd2lkdGggKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgSW5wdXRGcmFtZUhlaWdodDsgICAgICAgICAgICAvKio8IElucHV0IEZyYW1lIGhlaWdodCAqLwotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBIMjYzIGFuZCBNUEVHLTQ6ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIGhlaWdodCAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBGcmVlIHZhbHVlIGZvciB0aGUgYml0cmF0ZSAqLwotICAgIC8qKjwgRnJhbWVyYXRlIChpZiBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFIHVzZSB1aVJhdGVGYWN0b3IgJiB1aVRpbWVTY2FsZSBpbnN0ZWFkKSAqLwotICAgIE00RU5DT0RFUl9GcmFtZVJhdGUgICAgICAgIEZyYW1lUmF0ZTsKLSAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdDogSDI2MyBvciBNUEVHNCAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEZvcm1hdDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvUHJvZmlsZTsgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb0xldmVsOyAgIC8qKiBvdXRwdXQgdmlkZW8gbGV2ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUhvcml6b250YWxTZWFyY2hSYW5nZTsgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnRpY2FsU2VhcmNoUmFuZ2U7ICAgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgxNSkgKi8KLSAgICAvKio8IFNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKDB4N0ZGRiBpLmUuIGxldCBlbmdpbmUgZGVjaWRlIHdoZW4gdG8gcHV0IGFuIEkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlTdGFydGluZ1F1YW50aXplclZhbHVlOwotICAgIC8qKjwgRW5hYmxlIGlmIHByaW9yaXR5IGlzIHF1YWxpdHksIERpc2FibGUgaWYgcHJpb3JpdHkgaXMgZnJhbWVyYXRlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiSW50ZXJuYWxSZWd1bGF0aW9uOwotICAgIC8qKjwgUmF0aW8gYmV0d2VlbiB0aGUgZW5jb2RlciBmcmFtZSByYXRlIGFuZCB0aGUgYWN0dWFsIGZyYW1lIHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aVJhdGVGYWN0b3I7Ci0gICAgLyoqPCBJIGZyYW1lcyBwZXJpb2RpY2l0eSwgc2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpSVZvcFBlcmlvZDsKLSAgICAvKio8IE1vdGlvbiBlc3RpbWF0aW9uIFtkZWZhdWx0PTAgKGFsbCB0b29scyksIGRpc2FibGU9OCAobm8gdG9vbCldICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgdWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHM7Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5ncyBmb3IgTVBFRy00IG9ubHk6ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlUaW1lU2NhbGU7ICAgICAgICAgICAgICAgIC8qKjwgRnJlZSB2YWx1ZSBmb3IgdGhlIHRpbWVzY2FsZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkVycm9yUmVzaWxpZW5jZTsgICAgICAgICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAqLwotICAgIC8qKjwgRGlzYWJsZWQgYnkgZGVmYXVsdCAoaWYgZW5hYmxlZCwgYkVycm9yUmVzaWxpZW5jZSBzaG91bGQgYmUgZW5hYmxlZCB0b28hKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkRhdGFQYXJ0aXRpb25pbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkFjUHJlZGljdGlvbjsgICAgICAgICAgIC8qKjwgQUMgcHJlZGljdGlvbiBbZGVmYXVsdD0xLCBkaXNhYmxlPTBdICovCi0KLX0gTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nIHN0aWxsCi0gKiAgICAgICAgICAgIHBpY3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBGcmFtZVdpZHRoOyAgICAgICAgICAgIC8qKjwgRnJhbWUgd2lkdGggICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIEZyYW1lSGVpZ2h0OyAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgUXVhbGl0eTsgICAgICAgICAgICAvKio8IEJpdHJhdGUsIHNlZSBlbnVtICAqLwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIElucHV0Rm9ybWF0OyAgICAgICAgLyoqPCBZVVYgNDIwIG9yIDQyMiAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzLCBNUEVHNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KUEVHIC4uLiAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFByZVByb2Nlc3NOZWVkZWQ7ICAgIC8qKjwgSXMgdGhlIGNhbGwgdG8gdGhlIFZQUCBpcyBuZWNlc3NhcnkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIEVuY29kaW5nUGVyU3RyaXBlczsgICAgLyoqPCBJcyBlbmNvZGluZyBwZXIgc3RyaXBlcyAqLwotCi19IE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgdGhlIHNlcXVlbmNlIGhlYWRlciBpcyBwdXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwQnVmOyAgICAgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YSAqLwotCi19IE00RU5DT0RFUl9IZWFkZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICBNNEVOQ09ERVJfT3B0aW9uSUQKLSAqIEBicmllZiBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKjwgc2V0IHRoZSBmcmFnbWVudCBzaXplLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfVUludDMyIHR5cGUgKi8KLSAgICBNNEVOQ09ERVJfa09wdGlvbklEX1ZpZGVvRnJhZ21lbnRTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDAxKSwKLQotICAgIC8qKjwgc2V0IHRoZSBzdGFiaWxpemF0aW9uIGZpbHRlcmluZywgb3B0aW9uIHZhbHVlIGlzIE00RU5DT0RFUl9TdGFiTW9kZSB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbWFnZVN0YWJpbGl6YXRpb24gICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMiksCi0KLSAgICAvKio8IHByZXZlbnQgd3JpdHRpbmcgb2YgYW55IEFVLCBvcHRpb24gdmFsdWUgaXMgTTRPU0FfQm9vbCB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9JbnN0YW50U3RvcCAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMyksCi0KLSAgICAvKio8IGdldCB0aGUgRFNJIChlbmNvZGVyIGhlYWRlcikgZ2VuZXJhdGVkIGJ5IHRoZSBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA0KSwKLS8qKyBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNSksCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9IMjY0UHJvY2Vzc05BTFVDb250ZXh0ICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQ09NTU9OLCAweDA2KQotLyotQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLX0gTTRFTkNPREVSX09wdGlvbklEOwotCi0vKisgQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QpKE00T1NBX1ZvaWQqYWluc3RhbmNlLE00T1NBX1VJbnQ4KiBpbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSk7Ci0vLyotIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi0KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRFTkNPREVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfaW5pdCkgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX29wZW4pICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSwKLSAgICAgICAgTTRPU0FfVm9pZCogcFBhcmFtcyAgICAgLyogQ2FuIGJlIE00RU5DT0RFUl9QYXJhbXMsIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtcyAqLwotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9zdGFydCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc3RvcCkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfcGF1c2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3Jlc3VtZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfY2xvc2UpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2NsZWFudXApIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSkgKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9lbmNvZGUpICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5QbGFuZSwKLSAgICAgICAgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfZ2V0T3B0aW9uKSAgICAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhbiBlbmNvZGVyIHNoZWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX000RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UKLXsKLSAgICBNNEVOQ09ERVJfaW5pdCogICAgICAgICAgICAgICAgcEZjdEluaXQ7Ci0gICAgTTRFTkNPREVSX29wZW4qICAgICAgICAgICAgICAgIHBGY3RPcGVuOwotCi0gICAgTTRFTkNPREVSX3N0YXJ0KiAgICAgICAgICAgIHBGY3RTdGFydDsgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0gICAgTTRFTkNPREVSX3N0b3AqICAgICAgICAgICAgICAgIHBGY3RTdG9wOyAgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfcGF1c2UqICAgICAgICAgICAgcEZjdFBhdXNlOyAgICAgICAgICAvKiBHcmFiYmVyIG1vZGUgKi8KLSAgICBNNEVOQ09ERVJfcmVzdW1lKiAgICAgICAgICAgIHBGY3RSZXN1bWU7ICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0KLSAgICBNNEVOQ09ERVJfY2xvc2UqICAgICAgICAgICAgcEZjdENsb3NlOwotICAgIE00RU5DT0RFUl9jbGVhbnVwKiAgICAgICAgICAgIHBGY3RDbGVhbnVwOwotCi0gICAgTTRFTkNPREVSX3JlZ3VsQml0UmF0ZSogICAgIHBGY3RSZWd1bEJpdFJhdGU7Ci0gICAgTTRFTkNPREVSX2VuY29kZSogICAgICAgICAgICBwRmN0RW5jb2RlOyAgICAgICAgIC8qIFN0YW5kYWxvbmUgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX3NldE9wdGlvbiogICAgICAgIHBGY3RTZXRPcHRpb247Ci0gICAgTTRFTkNPREVSX2dldE9wdGlvbiogICAgICAgIHBGY3RHZXRPcHRpb247Ci19IE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEVOQ09ERVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0MDhmYzguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRPU0FfQ29yZUlELmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRPU0FfQ29yZUlELmgKLSAqIEBicmllZiAgZGVmaW5lcyB0aGUgdW5pcXVlcyBjb21wb25lbnQgaWRlbnRpZmllcnMgdXNlZCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQKLSAqICAgICAgICAgYW5kIG9wdGlvbklEIG1lY2hhbmlzbQotICogQG5vdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000T1NBX0NPUkVJRF9IX18KLSNkZWZpbmUgX19NNE9TQV9DT1JFSURfSF9fCi0KLS8qIENvcmVJZCBhcmUgZGVmaW5lZCBvbiAxNCBiaXRzICovCi0vKiB3ZSBzdGFydCBmcm9tIDB4MDEwMCwgbG93ZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igb3NhbCBjb3JlIGNvbXBvbmVudHMgKi8KLQotLyogcmVhZGVyIHNoZWxscyovCi0jZGVmaW5lIE00UkVBREVSX0NPTU1PTiAgICAgMHgwMTAwCi0jZGVmaW5lIE00UkVBREVSX0FWSSAgICAgICAgMHgwMTAxCi0jZGVmaW5lIE00UkVBREVSX0FNUiAgICAgICAgMHgwMTAyCi0jZGVmaW5lIE00UkVBREVSXzNHUCAgICAgICAgMHgwMTAzCi0jZGVmaW5lIE00UkVBREVSX05FVCAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIE00UkVBREVSXzNHUF9IVFRQICAgMHgwMTA1Ci0jZGVmaW5lIE00UkVBREVSX01QMyAgICAgICAgMHgwMTA2Ci0jZGVmaW5lIE00UkVBREVSX1dBViAgICAgICAgMHgwMTA3Ci0jZGVmaW5lIE00UkVBREVSX01JREkgICAgICAgMHgwMTA4Ci0jZGVmaW5lIE00UkVBREVSX0FTRiAgICAgICAgMHgwMTA5Ci0jZGVmaW5lIE00UkVBREVSX1JFQUwgICAgICAgIDB4MDEwQQotI2RlZmluZSBNNFJFQURFUl9BQUMgICAgICAgIDB4MDEwQgotI2RlZmluZSBNNFJFQURFUl9GTEVYICAgICAgICAweDAxMEMKLSNkZWZpbmUgTTRSRUFERVJfQkJBICAgICAgICAweDAxMEQKLSNkZWZpbmUgTTRSRUFERVJfU1lOVEhFU0lTX0FVRElPICAgIDB4MDEwRQotI2RlZmluZSBNNFJFQURFUl9KUEVHICAgICAgICAweDAxMEYKLQotCi0vKiB3cml0ZXIgc2hlbGxzKi8KLSNkZWZpbmUgTTRXUklURVJfQ09NTU9OICAgICAweDAxMTAKLSNkZWZpbmUgTTRXUklURVJfQVZJICAgICAgICAweDAxMTEKLSNkZWZpbmUgTTRXUklURVJfQU1SICAgICAgICAweDAxMTIKLSNkZWZpbmUgTTRXUklURVJfM0dQICAgICAgICAweDAxMTMKLSNkZWZpbmUgTTRXUklURVJfSlBFRyAgICAgICAgMHgwMTE2Ci0jZGVmaW5lIE00V1JJVEVSX01QMyAgICAgICAgMHgwMTE3Ci0KLS8qIGRlY29kZXIgc2hlbGxzICovCi0jZGVmaW5lIE00REVDT0RFUl9DT01NT04gICAgMHgwMTIwCi0jZGVmaW5lIE00REVDT0RFUl9KUEVHICAgICAgMHgwMTIxCi0jZGVmaW5lIE00REVDT0RFUl9NUEVHNCAgICAgMHgwMTIyCi0jZGVmaW5lIE00REVDT0RFUl9BVURJTyAgICAgMHgwMTIzCi0jZGVmaW5lIE00REVDT0RFUl9BVkMgICAgICAgMHgwMTI0Ci0jZGVmaW5lIE00REVDT0RFUl9NSURJICAgICAgMHgwMTI1Ci0jZGVmaW5lIE00REVDT0RFUl9XTUEgICAgICAgIDB4MDEyNgotI2RlZmluZSBNNERFQ09ERVJfV01WICAgICAgICAweDAxMjcKLSNkZWZpbmUgTTRERUNPREVSX1JNViAgICAgICAgMHgwMTI4Ci0jZGVmaW5lIE00REVDT0RFUl9STUEgICAgICAgIDB4MDEyOQotI2RlZmluZSBNNERFQ09ERVJfQUFDICAgICAgIDB4MDEyQQotI2RlZmluZSBNNERFQ09ERVJfQkVBVEJSRVcgIDB4MDEyQgotI2RlZmluZSBNNERFQ09ERVJfRVhURVJOQUwgIDB4MDEyQwotCi0vKiBlbmNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNEVOQ09ERVJfQ09NTU9OICAgIDB4MDEzMAotI2RlZmluZSBNNEVOQ09ERVJfSlBFRyAgICAgIDB4MDEzMQotI2RlZmluZSBNNEVOQ09ERVJfTVBFRzQgICAgIDB4MDEzMgotI2RlZmluZSBNNEVOQ09ERVJfQVVESU8gICAgIDB4MDEzMwotI2RlZmluZSBNNEVOQ09ERVJfVklEX05VTEwgIDB4MDEzNAotI2RlZmluZSBNNEVOQ09ERVJfTUpQRUcgICAgICAgIDB4MDEzNQotI2RlZmluZSBNNEVOQ09ERVJfTVAzICAgICAgICAweDAxMzYKLSNkZWZpbmUgTTRFTkNPREVSX0gyNjQgICAgICAgIDB4MDEzNwotI2RlZmluZSBNNEVOQ09ERVJfQUFDICAgICAgICAweDAxMzgKLSNkZWZpbmUgTTRFTkNPREVSX0FNUk5CICAgICAgICAweDAxMzkKLSNkZWZpbmUgTTRFTkNPREVSX0FVRF9OVUxMICAweDAxM0EKLSNkZWZpbmUgTTRFTkNPREVSX0VYVEVSTkFMICAweDAxM0IKLQotLyogY29yZXMgKi8KLSNkZWZpbmUgTTRKUEdfREVDT0RFUiAgICAgICAweDAxNDAKLSNkZWZpbmUgTTRKUEdfRU5DT0RFUiAgICAgICAweDAxNDEKLQotI2RlZmluZSBNNE1QNF9ERUNPREVSICAgICAgIDB4MDE0MgotI2RlZmluZSBNNE1QNF9FTkNPREVSICAgICAgIDB4MDE0MwotCi0jZGVmaW5lIE00QVZJX0NPTU1PTiAgICAgICAgMHgwMTQ0Ci0jZGVmaW5lIE00QVZJX1JFQURFUiAgICAgICAgMHgwMTQ1Ci0jZGVmaW5lIE00QVZJX1dSSVRFUiAgICAgICAgMHgwMTQ2Ci0KLSNkZWZpbmUgTTRIVFRQX0VOR0lORSAgICAgICAweDAxNDcKLQotI2RlZmluZSBNNE9TQV9UTVBGSUxFICAgICAgIDB4MDE0OAotI2RlZmluZSBNNFRPT0xfVElNRVIgICAgICAgIDB4MDE0OQotCi0jZGVmaW5lIE00QU1SX1JFQURFUiAgICAgICAgMHgwMTRBCi0KLSNkZWZpbmUgTTRNUDNfUkVBREVSICAgICAgICAweDAxNEIKLQotI2RlZmluZSBNNFdBVl9SRUFERVIgICAgICAgIDB4MDE0QwotI2RlZmluZSBNNFdBVl9XUklURVIgICAgICAgIDB4MDE0RAotI2RlZmluZSBNNFdBVl9DT01NT04gICAgICAgIDB4MDE0RQotCi0jZGVmaW5lIE00QURUU19SRUFERVIgICAgICAgIDB4MDE0RgotI2RlZmluZSBNNEFESUZfUkVBREVSICAgICAgICAweDAxNkEKLQotI2RlZmluZSBNNFNQUyAgICAgICAgICAgICAgIDB4MDE1MAotI2RlZmluZSBNNEVYSUZfREVDT0RFUiAgICAgIDB4MDE1MQotI2RlZmluZSBNNEVYSUZfRU5DT0RFUiAgICAgIDB4MDE1MgotI2RlZmluZSBNNEdJRl9ERUNPREVSICAgICAgIDB4MDE1MwotI2RlZmluZSBNNEdJRl9FTkNPREVSICAgICAgIDB4MDE1NAotI2RlZmluZSBNNFBOR19ERUNPREVSICAgICAgIDB4MDE1NQotI2RlZmluZSBNNFBOR19FTkNPREVSICAgICAgIDB4MDE1NgotI2RlZmluZSBNNFdCTVBfREVDT0RFUiAgICAgIDB4MDE1NwotI2RlZmluZSBNNFdCTVBfRU5DT0RFUiAgICAgIDB4MDE1OAotCi0jZGVmaW5lIE00QU1SX1dSSVRFUiAgICAgICAgMHgwMTU5ICAgIC8qKjwgbm8gcm9vbSB0byBwdXQgaXQgYWxvbmcgTTRBTVJfUkVBREVSICovCi0KLQotI2RlZmluZSBNNEFWQ19ERUNPREVSICAgICAgIDB4MDE1QQotI2RlZmluZSBNNEFWQ19FTkNPREVSICAgICAgIDB4MDE1QgotCi0jZGVmaW5lIE00QVNGX1JFQURFUiAgICAgICAgMHgwMTVDCi0jZGVmaW5lIE00V01EUk1fQUdFTlQgICAgICAgIDB4MDE1RAotI2RlZmluZSBNNE1JRElfUkVBREVSICAgICAgICAweDAxNjIgICAgLyoqPCBubyByb29tIGJlZm9yZSB0aGUgcHJlc2VudGVycyAqLwotI2RlZmluZSBNNFJNX1JFQURFUiAgICAgICAgIDB4MTYzCi0jZGVmaW5lIE00Uk1WX0RFQ09ERVIgICAgICAgIDB4MTY0Ci0jZGVmaW5lIE00Uk1BX0RFQ09ERVIgICAgICAgIDB4MTY1Ci0KLSNkZWZpbmUgTTRUT09MX1hNTCAgICAgICAgICAgIDB4MDE2NgotI2RlZmluZSBNNFRPT0xfRUZSICAgICAgICAgICAgMHgwMTY3ICAgIC8qKjwgRGVjcnlwdGlvbiBtb2R1bGUgZm9yIFZpZGVvIEFydGlzdCAqLwotI2RlZmluZSBNNElBTF9GVE4gICAgICAgICAgICAweDAxNjggICAgLyogRlROIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJQUwgKi8KLSNkZWZpbmUgTTRGVE4gICAgICAgICAgICAgICAgMHgwMTY5ICAgIC8qIEZUTiBsaWJyYXJ5ICovCi0KLS8qIHByZXNlbnRlciAqLwotI2RlZmluZSBNNFBSRVNFTlRFUl9BVURJTyAgIDB4MDE2MAotI2RlZmluZSBNNFBSRVNFTlRFUl9WSURFTyAgIDB4MDE2MQotCi0vKiBoaWdoIGxldmVsIGludGVyZmFjZXMgKHZwcywgZXRjLi4pKi8KLSNkZWZpbmUgTTRWUFMgICAgICAgICAgICAgICAweDAxNzAKLSNkZWZpbmUgTTRWVFMgICAgICAgICAgICAgICAweDAxNzEKLSNkZWZpbmUgTTRWWFMgICAgICAgICAgICAgICAweDAxNzIKLSNkZWZpbmUgTTRDQUxMQkFDSyAgICAgICAgICAweDAxNzMKLSNkZWZpbmUgTTRWRVMgICAgICAgICAgICAgICAweDAxNzQKLSNkZWZpbmUgTTRQUkVQUk9DRVNTX1ZJREVPICAweDAxNzUKLSNkZWZpbmUgTTRHUkFCX0FVRElPICAgICAgICAweDAxNzYKLSNkZWZpbmUgTTRHUkFCX1ZJREVPICAgICAgICAweDAxNzcKLSNkZWZpbmUgTTRWU1NBVkkgICAgICAgICAgICAweDAxNzgKLSNkZWZpbmUgTTRWU1MzR1BQICAgICAgICAgICAweDAxNzkKLSNkZWZpbmUgTTRQVE8zR1BQICAgICAgICAgICAweDAxN0EKLSNkZWZpbmUgTTRQVlhfUEFSU0VSICAgICAgICAweDAxN0IKLSNkZWZpbmUgTTRWQ1MgICAgICAgICAgICAgICAgMHgwMTdDCi0jZGVmaW5lIE00TUNTICAgICAgICAgICAgICAgIDB4MDE3RAotI2RlZmluZSBNNE1OTUMgICAgICAgICAgICAgICAgMHgwMTgwICAgIC8qKjwgbW5tIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTTRUVEVYVF9QQVJTRVIgICAgICAweDAxODEgICAgLyoqPCB0aW1lZCB0ZXh0ICovCi0jZGVmaW5lIE00TU0gICAgICAgICAgICAgICAgMHgwMTgyICAgIC8qKjwgTXVzaWMgbWFuYWdlciAqLwotI2RlZmluZSBNNE1EUCAgICAgICAgICAgICAgICAweDAxODMgICAgLyoqPCBNZXRhZGF0YSBwYXJzZXIgKi8KLSNkZWZpbmUgTTRNTVNRTENPUkUgICAgICAgICAgICAweDAxODQKLSNkZWZpbmUgTTRWUFNJTCAgICAgICAgICAgICAgICAweDAxODUKLSNkZWZpbmUgTTRGSUxFSUwgICAgICAgICAgICAweDAxODYgLyogSUwgZmlsZSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgTTRNVSAgICAgICAgICAgICAgICAweDAxODcKLSNkZWZpbmUgTTRWRUUgICAgICAgICAgICAgICAgMHgwMTg4ICAvKio8IFZpZGVvIGVmZmVjdCBlbmdpbmUgKi8KLSNkZWZpbmUgTTRWQSAgICAgICAgICAgICAgICAweDAxODkgLyogVmlkZW9BcnRpc3QgKi8KLSNkZWZpbmUgTTRKVFMgICAgICAgICAgICAgICAgMHgwMThBCi0jZGVmaW5lIE00SlRTSUwgICAgICAgICAgICAgICAgMHgwMThCCi0jZGVmaW5lIE00QUlSICAgICAgICAgICAgICAgIDB4MDE4QyAgLyoqPCBBSVIgKi8KLSNkZWZpbmUgTTRTUEUgICAgICAgICAgICAgICAgMHgwMThEICAvKio8IFN0aWxsIHBpY3R1cmUgZWRpdG9yICovCi0jZGVmaW5lIE00VlMgICAgICAgICAgICAgICAgMHgwMThFICAgIC8qKjwgVmlkZW8gU3R1ZGlvICh4VlNTKSAqLwotI2RlZmluZSBNNFZFU0lMICAgICAgICAgICAgICAgIDB4MDE4RiAgICAvKio8IFZFUyBpbCAqLwotI2RlZmluZSBNNElEMyAgICAgICAgICAgICAgICAweDAxOTAgICAgLyoqPCBJRDMgVGFnIE1vZHVsZSAqLwotI2RlZmluZSBNNFNDICAgICAgICAgICAgICAgIDB4MDE5MSAgICAvKio8IE1lZGlhIFNjYW5uZXIgKi8KLSNkZWZpbmUgTTRURyAgICAgICAgICAgICAgICAweDAxOTIgIC8qKjwgVGh1bWJuYWlsIEdlbmVyYXRvciovCi0jZGVmaW5lIE00VFMgICAgICAgICAgICAgICAgMHgwMTkzICAgIC8qKjwgVGh1bWJuYWlsIHN0b3JhZ2UgKi8KLSNkZWZpbmUgTTRNQiAgICAgICAgICAgICAgICAweDAxOTQgICAgLyoqPCBNZWRpYSBicm93c2VyICovCi0KLS8qIGhpZ2ggbGV2ZWwgYXBwbGljYXRpb24gKHRlc3Qgb3IgY2xpZW50IGFwcCkgKi8KLSNkZWZpbmUgTTRBUFBMSSAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgTTRWQV9BUFBMSSAgICAgICAgICAgIDB4MDIwMSAgICAvKio8IFZpZGVvIEFydGlzdCB0ZXN0IGFwcGxpY2F0aW9uICovCi0KLS8qIGV4dGVybmFsIGNvbXBvbmVudHMgKEhXIHZpZGVvIGNvZGVjcywgZXRjLikgKi8KLSNkZWZpbmUgTTRWRF9FWFRFUk5BTCAgICAgICAgMHgwMzAwCi0jZGVmaW5lIE00VkVfRVhURVJOQUwgICAgICAgIDB4MDMwMQotCi0KLS8qIHByaW9yaXR5IHRvIGNvbWJpbmUgd2l0aCBtb2R1bGUgaWRzICovCi0jZGVmaW5lIE00SElHSF9QUklPUklUWSAgICAgMHhDMDAwCi0jZGVmaW5lIE00TUVESVVNX1BSSU9SSVRZICAgMHg4MDAwCi0jZGVmaW5lIE00TE9XX1BSSU9SSVRZICAgICAgMHg0MDAwCi0jZGVmaW5lIE00REVGQVVMVF9QUklPUklUWSAgMHgwMDAwCi0KLQotI2VuZGlmIC8qX19NNE9TQV9DT1JFSURfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhZmM1MGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRQQ01SX0NvcmVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRXQVZfV2F2UmVhZGVyLmgKLSAqIEBicmllZiAgIFdBViBSZWFkZXIgZGVjbGFyYXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgb2YgdGhlIFdBViByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT1RfQ09NUExJQU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PX1NQQUNFX0FWQUlMICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UENNQ19XQVJfRU5EX09GX1NUUkVBTSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V0FWX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00V0FWQ19EZWNvZGVyU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZGVjb2RlciBTcGVjaWZpYyBpbmZvcm1hdGlvbnMKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBXQVYgcmVhZGVyIHRvIHN0b3JlIGFsbAotICogICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mb3JtYXRpb25zOgotICogICAgICAgICAgICAgIC0gU2FtcGxlIEZyZXF1ZW5jeQotICogICAgICAgICAgICAgIC0gQXZlcmFnZSBCeXRlcyBwZXIgc2Vjb25kCi0gKiAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgKDEgb3IgMikKLSAqICAgICAgICAgICAgICAtIE51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgKDggb3IgMTYpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBTYW1wbGVGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgIEF2Z0J5dGVzUGVyU2VjOwotICAgIE00T1NBX1VJbnQzMiAgICBEYXRhTGVuZ3RoOwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOwotICAgIE00T1NBX1VJbnQxNiAgICBCaXRzUGVyU2FtcGxlOwotfSBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFdBVlJfU3RhdGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIFN0YXRlcwotICogQG5vdGUgICAgVGhlIHN0YXRlIGF1dG9tYXRvbiBpcyBkb2N1bWVudGVkIHNlcGFyYXRlbHkKLSAqICAgICAgICAgIGNvbnN1bHQgdGhlIGRlc2lnbiBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFBDTVJfa0luaXQgICAgPSAweDAwMDAsCi0gICAgTTRQQ01SX2tPcGVuaW5nID0gMHgwMTAwLAotICAgIE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgPSAweDAxMDEsCi0gICAgTTRQQ01SX2tSZWFkaW5nID0gMHgwMjAwLAotICAgIE00UENNUl9rUmVhZGluZ19uZXh0QVUgID0gMHgwMjAxLAotICAgIE00UENNUl9rQ2xvc2VkICA9IDB4MDMwMAotfSBNNFBDTVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRXQVZSX09wdGlvbklECi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBvcHRpb25zCi0gKiBAbm90ZSAgICBPbmx5IG9uZSBvcHRpb24gaXMgYXZhaWxhYmxlOgotICogICAgICAgICAgLSBNNFdBVlJfa1BDTWJsb2NrU2l6ZTogc2V0cyB0aGUgc2l6ZSBvZiB0aGUgUENNIGJsb2NrIHRvIHJlYWQKLSAqICAgICAgICAgICAgZnJvbSBXQVYgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRQQ01SX2tQQ01ibG9ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00V0FWX1JFQURFUiwgMHgwMSkKLX0gTTRQQ01SX09wdGlvbklEOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdBVlJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBXQVYgUmVhZGVyIGNhbGxzIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIG1fcERlY29kZXJTcGVjSW5mbzsvKio8IFBvaW50ZXIgdG8gdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgY29udGFpbmVkIGluIHBTdHJlYW1EZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHVzZWQgdG8gZnJlZS4uLikgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgbV9wRmlsZVJlYWRGdW5jOy8qKjwgVGhlIE9TQUwgc2V0IG9mIHBvaW50ZXIgdG8gZnVuY3Rpb24gZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIG1hbmFnZW1lbnQgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgbV9maWxlQ29udGV4dDsgIC8qKjwgVGhlIGNvbnRleHQgbmVlZGVkIGJ5IE9TQUwgdG8gbWFuYWdlIEZpbGUgKi8KLSAgICBNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyAgbV9kZWNvZGVyQ29uZmlnOy8qKjwgU3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgZGVjb2RlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgLyoqPCBzdGF0ZSBvZiB0aGUgd2F2IHJlYWRlciAqLwotICAgIE00UENNUl9TdGF0ZSAgICAgICAgICAgICAgICBtX21pY3JvU3RhdGU7ICAgLyoqPCBzdGF0ZSBvZiB0aGUgcmVhZCB3YXYgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fYmxvY2tTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHJlYWQgYmxvY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9vZmZzZXQ7ICAgICAgIC8qKjwgT2Zmc2V0IG9mIHRoZSBQQ00gcmVhZCAoaS5lIG1fb2Zmc2V0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHdpdGhvdXQgd2F2IGhlYWRlcikgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgbV9wQXVCdWZmZXI7ICAgIC8qKjwgUmUtdXNlZCBidWZmZXIgZm9yIEFVIGNvbnRlbnQgc3RvcmFnZSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgICAgICBtX2RhdGFTdGFydE9mZnNldDsvKio8IG9mZnNldCBvZiB0aGUgcGNtIGRhdGEgYmVnaW5uaW5nIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlICovCi19IE00UENNUl9Db250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBQcm90b3R5cGVzIG9mIGFsbCBXQVYgcmVhZGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pOwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKTsKLU00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpOwotTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLU00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci1NNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKTsKLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSk7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyYTVhMDMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfM2dwQ29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UkVBREVSXzNncENvbS5oCi0gKiBAYnJpZWYgICAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIDNncCByZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZ2VuZXJpYyBzaGVsbCBpbnRlcmZhY2UgcmV0cmlldmluZyBmdW5jdGlvbgotICogICAgICAgICAgICBvZiB0aGUgM0dQIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000UkVBREVSXzNHUENPTV9IX18KLSNkZWZpbmUgX19NNFJFQURFUl8zR1BDT01fSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiBFcnJvcjogRnVuY3Rpb24gTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyIG11c3QgYmUgY2FsbGVkIGJlZm9yZS4KLSAqLwotI2RlZmluZSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00UkVBREVSXzNHUCwgMHgwMDAwMDEpCi0KLS8qKgotICogRXJyb3I6IE5vIHZpZGVvIHN0cmVhbSBIMjYzIGluIGZpbGUuCi0gKi8KLSNkZWZpbmUgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAyKQotCi0vKioKLSAqIFRoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24sIHNlZW1zIHRvIGJlIGludmFsaWQgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAzKQotCi0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhWSURFT1NUUkVBTSAgNQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYQVVESU9TVFJFQU0gIDUKLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWFRFWFRTVFJFQU0gICA1Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBtX3BGRkNvbnRleHQ7ICAgIC8qKjwgY29yZSBmaWxlIGZvcm1hdCBjb250ZXh0ICovCi0KLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fQXVkaW9TdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhBVURJT1NUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BBdWRpb1N0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLQotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9WaWRlb1N0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWFZJREVPU1RSRUFNXTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fcFZpZGVvU3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotCi0jaWZkZWYgTTRWUFNfU1VQUE9SVF9UVEVYVAotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9UZXh0U3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYVEVYVFNUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BUZXh0U3RyZWFtOyAgICAvKio8IHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0jZW5kaWYgLypNNFZQU19TVVBQT1JUX1RURVhUKi8KLQotfSBNNFJFQURFUl9Db20zR1BfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfM0dQX0J1ZmZlciAoYnV0IG5vdGhpbmcgc3BlY2lmaWMgdG8gM0dQLCBub3IgdG8gYSByZWFkZXIgISkKLSAqIEBicmllZiAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4Y2hhbmdlIGRhdGEgKHNob3VsZCBiZSBpbiBPU0FMKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgICAgLyoqPCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgZGF0YUFkZHJlc3M7ICAgIC8qKjwgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAqLwotfSBNNFJFQURFUl8zR1BfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00UkVBREVSXzNHUF9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSByZWFkZXIgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgM0dQIGZvcm1hdC4KLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIGEgM0dQIHJlYWRlciB2aWEgTTRSRUFERVJfM0dQX2dldE9wdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlY29kZXJDb25maWdJbmZvIGZvciBIMjYzLAotICAgICAqIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGEgcG9pbnRlciB0byBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgYWxsb2NhdGVkIGJ5IGNhbGxlciAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfSDI2M1Byb3BlcnRpZXMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwMSksCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFB1cnBsZSBMYWJzIGRybSBpbmZvcm1hdGlvbiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDAyKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgRmFzdCBvcGVuIG1vZGUgKE9ubHkgdGhlIGZpcnN0IEFVIG9mIGVhY2ggc3RyZWFtIHdpbGwgYmUgcGFyc2VkIC0+IGxlc3MgQ1BVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyBSQU0pLiAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDAzKSwKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQXVkaW8gb25seSBtb2RlICh0aGUgdmlkZW8gc3RyZWFtIHdvbid0IGJlIG9wZW5lZCkgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0F1ZGlvT25seSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwNCksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFZpZGVvIG9ubHkgbW9kZSAodGhlIGF1ZGlvIHN0cmVhbSB3b24ndCBiZSBvcGVuZWQpICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9WaWRlb09ubHkgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDUpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuZXh0IHZpZGVvIENUUyAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfZ2V0TmV4dFZpZGVvQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDYpCi0KLX0gTTRSRUFERVJfM0dQX09wdGlvbklEOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcwotICogQGJyaWVmICAgIENvbnRhaW5zIGluZm8gYWJvdXQgSDI2MyBzdHJlYW0gcmVhZCBmcm9tIHRoZSAzR1AgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgdGhlIHByb2ZpbGUgYXMgZGVmaW5lZCBpbiB0aGUgVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlQcm9maWxlOwotICAgIC8qKjwgdGhlIGxldmVsIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbCBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpTGV2ZWw7Ci0KLX0gTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSAzZ3AgZmlsZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBQb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChPVVQpICAgIFBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBObyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2dldE5leHRTdHJlYW1IYW5kbGVyKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByZXBhcmUgdGhlICBhY2Nlc3MgdW5pdCAoQVUpCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdCAgICAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9Db20zR1BfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW5zIHVwIHRoZSBzdHJlYW0gaGFuZGxlcgotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSByZWFkZXIgc2hlbGwKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOL09VVCkgU3RyZWFtIGhhbmRsZXIKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2NsZWFuVXBIYW5kbGVyKE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRSRUFERVJfM0dQQ09NX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNmU3Zjk3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0Ftci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9BbXIuaAotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgYW1yIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfQU1SX0hfXwotI2RlZmluZSBfX000UkVBREVSX0FNUl9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfQU1SX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4NjNhN2UuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQ29tbW9uLmgKLSAqIEBicmllZiAgU2hlbGwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UgZGVjbGFyYXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IHJlYWRlciBzaGVsbHMgbXVzdCBpbXBsZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotCi0vKiBFUlJPUlMgKi8KLSNkZWZpbmUgTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLQotLyogV0FSTklOR1MgKi8KLSNkZWZpbmUgTTRXQVJfUkVBREVSX05PX01FVEFEQVRBICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMSkKLSNkZWZpbmUgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFJFQURFUl9DT01NT04sIDB4MDAwMikKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSB0eXBlcyB1c2VkIHRvIGNyZWF0ZSBtZWRpYSByZWFkZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICBtZWRpYSByZWFkZXIgaW50ZXJmYWNlLiBFYWNoIHJlYWRlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgV2hlbiBhIHJlYWRlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZAotICogICAgICAgICAgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gICAgICAgID0gLTEsICAgIC8qKjwgVW5rbm93biBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUFAgICAgICAgICAgICA9IDAsICAgIC8qKjwgM0dQUCBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVZJICAgICAgICAgICAgPSAxLCAgICAvKio8IEFWSSBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQU1SICAgICAgICAgICAgPSAyLCAgICAvKio8IEFNUiBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlTVAzICAgICAgICAgICAgPSAzLCAgICAvKio8IE1QMyBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUlRTUCAgICAgICAgICAgID0gNCwgICAgLyoqPCBSVFNQIG5ldHdvcmsgYWNjZXNzZWQgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BQSFRUUCAgICAgICAgPSA1LCAgICAvKio8IFByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVQVkhUVFAgICAgICAgID0gNiwgICAgLyoqPCBQYWNrZXQgVmlkZW8gSFRUUCBwcm9wcmlldGFyeSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVdBViAgICAgICAgICAgID0gNywgICAgLyoqPCBXQVYgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZTNHUEVYVEhUVFAgICAgPSA4LCAgICAvKio8IEFuIGV4dGVybmFsIHByb2dyZXNzaXZlbHkgZG93bmxvYWRlZCAzR1BQIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBQUMgICAgICAgICAgICA9IDksICAgIC8qKjwgQURUUyBhbmQgQURJRiBBQUMgc3VwcG9ydCAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVSRUFMICAgICAgICAgICAgPSAxMCwgICAgLyoqPCBSRUFMIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQVNGICAgICAgICAgICAgPSAxMSwgICAgLyoqPCBBU0YgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVGTEVYVElNRSAgICAgICAgPSAxMiwgICAgLyoqPCBGbGV4VGltZSBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUJCQSAgICAgICAgICAgID0gMTMsICAgIC8qKjwgQmVhdGJyZXcgYXVkaW8gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVTWU5USEFVRElPICAgID0gMTQsICAgIC8qKjwgU3ludGhlc2lzIGF1ZGlvIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUENNICAgICAgICAgICAgPSAxNSwgICAgLyoqPCBQQ00gTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVKUEVHICAgICAgICAgICAgPSAxNiwgICAgLyoqPCBKUEVHIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlR0lGICAgICAgICAgICAgPSAxNywgICAgLyoqPCBHSUYgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBRElGICAgICAgICAgICAgPSAxOCwgICAgLyoqPCBBQUMtQURUUyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFEVFMgICAgICAgICAgICA9IDE5LCAgICAvKio8IEFBQy1BRFRTIE1lZGlhIHR5cGUgKi8KLQotICAgIE00UkVBREVSX2tNZWRpYVR5cGVfTkIgIC8qIG51bWJlciBvZiByZWFkZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00UkVBREVSX01lZGlhVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBNZWRpYSBmYW1pbHkgb2YgYSBzdHJlYW0KLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSB3aGF0IGtpbmQgb2Ygc3RyZWFtCi0gKiAgICAgICAgICBoYXMgYmVlbiByZXRyaWV2ZWQgdmlhIGdldE5leHRTdHJlYW0oKSBmdW5jdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlVbmtub3duICAgPSAtMSwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyAgICAgPSAwLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvICAgICA9IDEsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VGV4dCAgICAgID0gMgotfSBNNFJFQURFUl9NZWRpYUZhbWlseTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcmVhZGVyIG9wdGlvbnMKLSAqIEBub3RlICAgIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHJlYWQgZnJvbSBhIHJlYWRlciB2aWEgTTRSRUFERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIG1vdmllIChpbiBtcykKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAwKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSByZWFkZXIKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAxKSwKLQotICAgIC8qKgotICAgIEdldCB0aGUgY29weXJpZ2h0IGZyb20gdGhlIG1lZGlhIChpZiBwcmVzZW50KQotICAgIChjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIDNHUFAgb25seTogY29weXJpZ2h0IGdldCBmcm9tIHRoZSBjcHJ0IGF0b20gaW4gdGhlIHVkdGEgaWYgcHJlc2VudCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db3B5cmlnaHQ9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAyKSwKLQotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucyB0byB0aGUgcmVhZGVyICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAzKSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVXcml0ZXJGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCA0KSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfTmV0RnVuY3Rpb24qKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYU5ldEZjdHNQdHIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNSksCi0KLSAgICAvKioKLSAgICBDcmVhdGlvbiB0aW1lIGluIHNlYy4gc2luY2UgbWlkbmlnaHQsIEphbi4gMSwgMTk3MCAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAoYXZhaWxhYmxlIG9ubHkgZm9yIDNHUFAgY29udGVudCwgaW5jbHVkaW5nIFBHRCkKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgNiksCi0KLSAgICAvKioKLSAgICBCaXRyYXRlIGluIGJwcyAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRG91YmxlKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDcpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YxIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDgpLAotCi0gICAgLyoqCi0gICAgVGFnIElEM3YyIG9mIE1QMyBzb3VyY2UgKHR5cGUgb2YgdmFsdWU6IE00TVAzUl9JRDNUYWcqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDkpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIEFjY2VzcyBVbml0IGluIHRoZSBBdWRpbyBzdHJlYW0gKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZBdWRpb0F1ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4QSksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgZnJhbWVzIHBlciBibG9jCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0TmJmcmFtZVBlckJsb2MgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhCKSwKLQotICAgIC8qKgotICAgIEZsYWcgZm9yIHByb3RlY3Rpb24gcHJlc2VuY2UKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXRQcm90ZWN0UHJlc2VuY2UgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhDKSwKLQotICAgIC8qKgotICAgIFNldCBEUk0gQ29udGV4dAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX1NldERSTUNvbnRleHQgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhEKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9Db250ZW50RGVzY3JpcHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHhFKSwKLQotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9FeHRlbmRlZENvbnRlbnREZXNjcmlwdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweEYpLAotCi0gICAgLyoqCi0gICAgR2V0IEFzc2V0IDNncHAgRmllbGRzCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwQXNzZXRGaWVsZHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMCksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIG1heCBtZXRhZGF0YSBzaXplIHN1cHBvcnRlZCBpbiB0aGUgcmVhZGVyCi0gICAgT25seSByZWxldmFudCBpbiAzZ3AgcGFyc2VyIHRpbGwgbm93LCBidXQgY2FuIGJlIHVzZWQgZm9yIG90aGVyIHJlYWRlcnMKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NYXhNZXRhZGF0YVNpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl9DT01NT04sIDB4MTEpLAotCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTIpLAotICAgIC8qKgotICAgIEdldCAzZ3BwICdmdHlwJyBhdG9tCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxMyksCi0KLQotICAgIC8qIHZhbHVlIGlzIE00T1NBX0Jvb2wqICovCi0gICAgLyogcmV0dXJuIHRoZSBkcm0gcHJvdGVjdGlvbiBzdGF0dXMgb2YgdGhlIGZpbGUqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9pc1Byb3RlY3RlZCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE0KSwKLQotICAgIC8qIHZhbHVlIGlzIGEgdm9pZCogKi8KLSAgICAvKiByZXR1cm4gdGhlIGFnZ3JlZ2F0ZSByaWdodHMgb2YgdGhlIGZpbGUqLwotICAgIC8qIFRoZSBidWZmZXIgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGFuZCBtdXN0IGJlIGJpZyBlbm91Z2gqLwotICAgIC8qIEJ5IGRlZmF1bHQsIHRoZSBzaXplIGZvciBXTURSTSBpcyA3NiBieXRlcyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9nZXRBZ2dyZWdhdGVSaWdodHMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNSksCi0gICAgLyoqCi0gICAgR2V0IEFTRiBDb250ZW50IERlc2NyaXB0aW9uIE9iamVjdAotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0V4dGVuZGVkQ29udGVudEVuY3J5cHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfQ09NTU9OLCAweDE2KSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgVmlkZW8gc3RyZWFtICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mVmlkZW9BdSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE3KSwKLQotICAgIC8qKgotICAgIENodW5rIG1vZGUgYWN0aXZhdGlvbiAgc2l6ZSBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0NodW5ja1NpemUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxOCksCi0KLSAgICAvKioKLSAgICBDaGVjayBpZiBBU0YgZmlsZSBjb250YWlucyB2aWRlbyAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9oYXNWaWRlbyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDE5KSwKLQotICAgIC8qKgotICAgICBTZXQgc3BlY2lmaWMgcmVhZCBtb2RlIGZvciBSYW5kb20gQWNjZXNzIEpQRUcgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1JBTW9kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSX0NPTU1PTiwgMHgyMCksCi0KLSAgICAvKioKLSAgICBHZXQgVGh1bWJuYWlsIGJ1ZmZlciBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ1RodW1ibmFpbCA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIxKSwKLQotICAgIC8qKgotICAgIEdldCBGUERBVEEgYnVmZmVyIGluIGNhc2Ugb2YgSlBHIHJlYWRlciAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnRlBEYXRhID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjIpLAotCi0gICAgLyoqCi0gICAgR2V0IEpQRUcgaW5mbyAocHJvZ3Jlc3NpdmUsIHN1YnNhbXBsaW5nKSAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9KcGVnSW5mbz0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MjMpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotfSBNNFJFQURFUl9PcHRpb25JRDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQ29weVJpZ2h0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjb3B5UmlnaHQgZGVzY3JpcHRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBjb3B5UmlnaHQgb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAgICAgKGlmIHByZXNlbnQpIHZpYSB0aGUgZ2V0T3B0aW9uKCkgZnVuY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQ29weVJpZ2h0Ci17Ci0gICAgLyoqCi0gICAgUG9pbnRlciB0byBjb3B5cmlnaHQgZGF0YSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gICAgKi8KLSAgICBNNE9TQV9VSW50OCogICBtX3BDb3B5UmlnaHQ7Ci0KLSAgICAvKioKLSAgICBQb2ludGVyIHRvIGNvcHlyaWdodCBzaXplLiBUaGUgcENvcHlSaWdodFNpemUgbXVzdAotICAgIGJlIEluaXRpYWxpemVkIHdpdGggdGhlIHNpemUgYXZhaWxhYmxlIGluIHRoZSBwQ29weVJpZ2h0IGJ1ZmZlcgotICAgICovCi0gICAgTTRPU0FfVUludDMyICAgbV91aUNvcHlSaWdodFNpemU7Ci0KLX0gTTRSRUFERVJfQ29weVJpZ2h0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfU3RyZWFtRGF0YU9wdGlvbgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgZ2VuZXJpYyBzdHJlYW0gZGF0YSBvcHRpb24KLSAqIEBub3RlICAgICAgICBJdCBpcyB1c2VkIGlzIHVzZWQgdG8gc2V0IG9yIGdldCBhIHN0cmVhbSBzcGVjaWZpYyBkYXRhIGRlZmluZWQKLSAqICAgICAgICAgICAgICBieSBhIHJlbGV2YW50IHJlYWRlciBvcHRpb24gSUQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX1N0cmVhbURhdGFPcHRpb24KLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgbV9wU3RyZWFtSGFuZGxlcjsgLyoqPCBpZGVudGlmaWVyIG9mIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgbV9wT3B0aW9uVmFsdWU7ICAgLyoqPCB2YWx1ZSBvZiB0aGUgZGF0YSBvcHRpb24gdG8gZ2V0IG9yIHRvIHNldCAqLwotCi19IE00UkVBREVSX1N0cmVhbURhdGFPcHRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRfRW5jb2RpbmdGb3JtYXQKLSAqIEBicmllZiAgICAgICAgVGV4dCBlbmNvZGluZyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vLyB0eXBlZGVmIGVudW0KLS8vIHsKLS8vICAgICBNNF9rRW5jRm9ybWF0VW5rbm93biAgICA9IDAsICAgIC8qKjwgVW5rbm93biBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRBU0NJSSAgICAgICAgPSAxLCAgLyoqPCBJU08tODg1OS0xLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICAgICAgICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdFVURjggICAgICAgID0gMiwgICAvKio8IFVURi04IGVuY29kZWQgVW5pY29kZSAuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0VVRGMTYgICAgICAgID0gMyAgIC8qKjwgVVRGLTE2IGVuY29kZWQgVW5pY29kZS4gVGVybWluYXRlZCB3aXRoICQwMCAwMCAgICAqLwotLyp9ICBNNF9FbmNvZGluZ0Zvcm1hdDsqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TdHJpbmdBdHRyaWJ1dGVzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RyaW5nIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8vIHR5cGVkZWYgc3RydWN0Ci0vLyB7Ci0vLyAgICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BTdHJpbmc7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRleHQgICAgICAgICovCi0vLyAgICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGV4dCAgICAgICAgICAgICovCi0vLyAgICAgTTRfRW5jb2RpbmdGb3JtYXQgICAgbV9FbmNvZGluZ0Zvcm1hdDsgICAgLyoqPCBUZXh0IGVuY29kaW5nIGZvcm1hdCAgICAqLwotLy8gfSBNNF9TdHJpbmdBdHRyaWJ1dGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgYnVmZmVyIGluIGFsbCByZWFkZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCogICBtX3BEYXRhOwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlCdWZmZXJTaXplOwotfSBNNFJFQURFUl9CdWZmZXI7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlTZXNzaW9uSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU1lZGlhSWQ7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iSW5zdGFuY2U7Ci0gICAgTTRPU0FfQ2hhcioqICAgICAgICAgICAgbV9wSW5zdGFuY2U7Ci19IE00X1NkcEFzc2V0SW5zdGFuY2U7Ci0vKgotdHlwZWRlZiBlbnVtCi17Ci0gICAgIE00UkVBREVSX2tVbmtub3duRm9ybWF0ICAgID0gMCwKLSAgICAgTTRSRUFERVJfa1RhZ0lEM1YxLAotICAgICBNNFJFQURFUl9rVGFnSUQzVjIsCi0gICAgTTRSRUFERVJfa0FTRkNvbnRlbnREZXNjLAotICAgIE00UkVBREVSX2szR3BwQXNzZXRCb3hGcm9tVURUQSwKLSAgICBNNFJFQURFUl9rM0dwcEFzc2V0Qm94RnJvbVNEUCwKLSAgICBNNFJFQURFUl9rSnBlZ0V4aWYKLX0gTTRSRUFERVJfTWV0YURhdGFUeXBlOyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfM2dwQXNzZXRGaWVsZHMKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgYSAzZ3BwIGFzc2V0IGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NZXRhRGF0YUZpZWxkcyAgICBtX21ldGFkYXRhOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aVNlc3Npb25JRDsgICAgLyogRm9yIFNEUCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlNZWRpYUlEOyAgICAvKiBGb3IgU0RQICovCi0KLQotICAgIC8qIE5vdGU6IFRoZSB0d28gZm9sbG93aW5nIGZpZWxkcyB3ZXJlIGFkZGVkIGZvciBpbnRlcm5hbCB1c2UKLSAgICAgICAgKEZvciBNdXNpYyBtYW5hZ2VyIHByb2plY3QuLikgISEgKi8KLSAgICBNNF9TdHJlYW1UeXBlICAgICAgIG1fVmlkZW9TdHJlYW1UeXBlOyAgICAvKio8IFZpZGVvIHN0cmVhbSB0eXBlICovCi0gICAgTTRfU3RyZWFtVHlwZSAgICAgICBtX0F1ZGlvU3RyZWFtVHlwZTsgICAgLyoqPCBBdWRpbyBzdHJlYW0gdHlwZSAqLwotCi19IE00X01ldGFEYXRhRmllbGRzOwotCi0KLSNkZWZpbmUgTTRfTUVUQURBVEFfU1RSX05CICAgIDIyIC8qIG9uZSBzdHJpbmcgaW4gYWxidW0gYXJ0IHN0cnVjdHVyZSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV91aU5iQnVmZmVyOwotICAgIE00X1NkcEFzc2V0SW5zdGFuY2UqICAgIG1fcEFzc2V0SW5mb0luc3Q7ICAgIC8qIFNldCBvZiAzZ3BwIGFzc2V0IGJveGVzICovCi0gICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydCAgICAgICAgbV9hbGJ1bUFydDsgICAgICAgICAgICAvKiBSQzogUFYgc3BlY2lmaWMgYWxidW0gYXJ0OmFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGJlY2F1c2UgdGhpcyB0eXBlIGlzIHVzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGJlbG93IGluIHN0cmVhbWluZyAqLwotCi19IE00UkVBREVSX25ldEluZm9zOwotCi0KLXR5cGVkZWYgdW5pb24KLXsKLSAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcFRhZ0lEM0J1ZmZlclsyXTsgICAgICAgIC8qIFRhZyBJRDMgVjEsIFYyICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgICBNNFJFQURFUl9CdWZmZXIgICAgICAgIG1fcEFzZkRlc2NDb250ZW50OyAgICAvKiBBU0YgZGVzY3JpcHRpb24gY29udGVudCBidWZmZXIgKi8KLSAgICAgICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BBc2ZFeHREZXNjQ29udGVudDsgLyogQVNGIGV4dGVuZGVkIGRlc2NyaXB0aW9uIGNvbnRlbnQgYnVmZmVyICovCi0gICAgfSBtX2FzZjsKLSAgICBNNF9NZXRhRGF0YUZpZWxkcyAgICBtX3BNZXRhZGF0YUZpZWxkczsgICAgICAvKiBBbHJlYWR5IHBhcnNlZCBhbmQgZmlsbGVkIDNncHAgYXNzZXQgZmllbGRzICovCi0gICAgTTRSRUFERVJfbmV0SW5mb3MgICAgbV9wQXNzZXRJbmZvSW5zdGFuY2U7ICAgLyogU2V0IG9mIDNncHAgYXNzZXQgYm94ZXMgaW4gdGhlIHNkcCBmaWxlICovCi0KLX0gTTRfTWV0YWRhdGFCdWZmZXI7Ci0KLQotCi0KLS8qKioqKioqKioqKiBSRUFERVIgR0xPQkFMIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBjcmVhdGUgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9jcmVhdGVfZmN0KSAgICAgICAgICAoTTRPU0FfQ29udGV4dCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZGVzdHJveV9mY3QpICAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiwgZm9yIHRoZSBuZXR3b3JrIHJlYWRlciwgc2VuZHMgdGhlIERFU0NSSUJFCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfb3Blbl9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9jbG9zZV9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiAgICAoT1VUKSAgICBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKE9VVCkgICAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgICBubyBtb3JlIGF2YWlsYWJsZSBzdHJlYW0gaW4gdGhlIG1lZGlhIChhbGwgc3RyZWFtcyBmb3VuZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZ2V0TmV4dFN0cmVhbV9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgICBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHN0YXJ0cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgb25seSBuZWVkZWQgZm9yIG5ldHdvcmsgdW50aWwgbm93Li4uCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0YXJ0X2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgc3RvcCByZWFkaW5nCi0gKiBAbm90ZSAgICBvbmx5IG5lZWRlZCBmb3IgbmV0d29yayB1bnRpbCBub3cuLi4gKG1ha2VzIGEgcGF1c2UpCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX3N0b3BfZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC10aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChPVVQpICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2dldE9wdGlvbl9mY3QpICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSBub3RoaW5nIGZvciB0aGUgbW9tZW50Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKElOKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpIHdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zZXRPcHRpb25fZmN0KSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfanVtcF9mY3QpICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX3Jlc2V0X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgdGhlIHRpbWUgb2YgdGhlIGNsb3Nlc3QgUkFQIGFjY2VzcyB1bml0IGJlZm9yZSB0aGUgZ2l2ZW4gdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gc2VhcmNoCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIHNlYXJjaCBmcm9tIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgKGN0cykgb2YgdGhlIHByZWNlZGluZyBSQVAgQVUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfZ2V0UHJldlJhcFRpbWVfZmN0KSAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyKiBwVGltZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgbWVkaWEgcmVhZGVyIEdMT0JBTCBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBjcmVhdGlvbiBhbmQgY29udHJvbCBvZiBvbmUgcmVhZGVyIHR5cGUuCi0gKiAgICAgICAgICAgICAgICBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRSRUFERVJfY3JlYXRlX2ZjdCogICAgICAgICAgICBtX3BGY3RDcmVhdGU7Ci0gICAgTTRSRUFERVJfZGVzdHJveV9mY3QqICAgICAgICAgICBtX3BGY3REZXN0cm95OwotICAgIE00UkVBREVSX29wZW5fZmN0KiAgICAgICAgICAgICAgbV9wRmN0T3BlbjsKLSAgICBNNFJFQURFUl9jbG9zZV9mY3QqICAgICAgICAgICAgIG1fcEZjdENsb3NlOwotICAgIE00UkVBREVSX2dldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00UkVBREVSX3NldE9wdGlvbl9mY3QqICAgICAgICAgbV9wRmN0U2V0T3B0aW9uOwotICAgIE00UkVBREVSX2dldE5leHRTdHJlYW1fZmN0KiAgICAgbV9wRmN0R2V0TmV4dFN0cmVhbTsKLSAgICBNNFJFQURFUl9maWxsQXVTdHJ1Y3RfZmN0KiAgICAgIG1fcEZjdEZpbGxBdVN0cnVjdDsKLSAgICBNNFJFQURFUl9zdGFydF9mY3QqICAgICAgICAgICAgIG1fcEZjdFN0YXJ0OwotICAgIE00UkVBREVSX3N0b3BfZmN0KiAgICAgICAgICAgICAgbV9wRmN0U3RvcDsKLSAgICBNNFJFQURFUl9qdW1wX2ZjdCogICAgICAgICAgICAgIG1fcEZjdEp1bXA7Ci0gICAgTTRSRUFERVJfcmVzZXRfZmN0KiAgICAgICAgICAgICBtX3BGY3RSZXNldDsKLSAgICBNNFJFQURFUl9nZXRQcmV2UmFwVGltZV9mY3QqICAgIG1fcEZjdEdldFByZXZSYXBUaW1lOwotCi19IE00UkVBREVSX0dsb2JhbEludGVyZmFjZTsKLQotCi0vKioqKioqKioqKioqKiBSRUFERVIgREFUQSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2RlciAoYXVkaW8vdmlkZW8pLgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTi9PVVQpICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgICAgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2dldE5leHRBdV9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZ2VuZXJpYyBtZWRpYSByZWFkZXIgREFUQSBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBjb25jZXJuaW5nCi0gKiAgICAgICAgICAgICAgICBkYXRhIGFjY2VzcyBmb3Igb25lIHJlYWRlciB0eXBlLih0aG9zZSBmdW5jdGlvbnMgYXJlIHR5cGljYWxseSBjYWxsZWQgZnJvbQotICogICAgICAgICAgICAgICAgYSBkZWNvZGVyKSBUaGUgcmVhZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNFJFQURFUl9NZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfRGF0YUludGVyZmFjZQotewotICAgIE00UkVBREVSX2dldE5leHRBdV9mY3QqICAgbV9wRmN0R2V0TmV4dEF1OwotCi0gICAgLyoqCi0gICAgc3RvcmVzIHRoZSBjb250ZXh0IGNyZWF0ZWQgYnkgdGhlIE00UkVBREVSX2NyZWF0ZV9mY3QoKSBmdW5jdGlvbgotICAgIHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aG91dCAgZGVjb2RlcgotICAgICovCi0gICAgTTRPU0FfQ29udGV4dCBtX3JlYWRlckNvbnRleHQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi19IE00UkVBREVSX0RhdGFJbnRlcmZhY2U7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2VuZGlmIC8qX19NNFJFQURFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBmYzg1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9QY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFJFQURFUl9QY20uaAotICogQGJyaWVmICAgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSB3YXYgcmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgb2YgdGhlIHdhdiByZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRSRUFERVJfUENNX0hfXwotI2RlZmluZSBfX000UkVBREVSX1BDTV9IX18KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0qICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000UkVBREVSX1BDTV9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfQWNjZXNzVW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNTAzNjdjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQuaAotICogQGJyaWVmICAgICAgICBBY2Nlc3MgdW5pdCBtYW5pcHVsYXRpb24KLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSwKLSAqICAgICAgICAgICAgICAgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGl0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19BQ0NFU1NVTklUX0gKLSNkZWZpbmUgTTRTWVNfQUNDRVNTVU5JVF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIgotCi0vKiogVGhlIGF0dHJpYnV0ZSBvZiBhIGZyYWdtZW50Ki8KLXR5cGVkZWYgZW51bSB7Ci0gIE00U1lTX2tGcmFnQXR0ck9rICAgICAgICA9IDAxLCAvKio8IFRoZSBmcmFnbWVudCBpcyBjb3JyZWN0LCB0aGVyZSBpcyBubyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJDb3JydXB0ZWQgPSAwMiwgLyoqPCBUaGUgZnJhZ21lbnQgaXMgY29ycnVwdGVkICh0aGVyZSBpcyBhdCBsZWFzdCBhIGJpdCBvciBieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Igc29tZXdoZXJlIGluIHRoZSBmcmFnbWVudCAoc2l6ZSBjYW5ub3QgYmUgMCkqLwotICBNNFNZU19rRnJhZ0F0dHJMb3N0ICAgICAgPSAwMyAgLyoqPCBUaGUgZnJhZ21lbnQgaXMgbG9zdCwgc28gdGhlIHNpemUgbXVzdCBiZSAwLiovCi19IE00U1lTX0ZyYWdBdHRyOwotCi0KLS8qKiBBIEZyYWdtZW50IGlzIGEgcGllY2Ugb2YgYWNjZXNzIHVuaXQuIEl0IGNhbiBiZSBkZWNvZGVkIHdpdGhvdXQgZGVjb2RpbmcgdGhlIG90aGVycyovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX01lbUFkZHI4ICBmcmFnQWRkcmVzczsgICAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIEFsbCBmcmFnbWVudHMgb2YgdGhlIHNhbWUgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5Ki8KLSAgTTRPU0FfVUludDMyICAgIHNpemU7ICAgICAgICAgIC8qKjwgVGhlIHNpemUgb2YgdGhlIGZyYWdtZW50LiBJdCBtdXN0IGJlIDAgaWYgZnJhZ21lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnZ2VkICdsb3N0JyovCi0gIE00U1lTX0ZyYWdBdHRyICBpc0NvcnJ1cHRlZDsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhpcyBmcmFnbWVudCovCi19IE00U1lTX0ZyYWc7Ci0KLS8qKjwgVGhlIGF0dHJpYnV0ZSBvZiBhbiBhY2Nlc3MgdW5pdCovCi10eXBlZGVmIE00T1NBX1VJbnQ4IE00U1lTX0FVX0F0dHI7Ci0KLSNkZWZpbmUgQVVfQ29ycnVwdGVkICAgMHgwMSAvKio8IEF0IGxlYXN0IG9uZSBmcmFnbWVudCBvZiB0aGUgYWNjZXNzIHVuaXQgaXMgZmxhZ2dlZCBjb3JydXB0ZWQuKi8KLSNkZWZpbmUgQVVfUF9GcmFtZSAgICAgMHgwMiAvKio8IFRoZSBhY2Nlc3MgdW5pdCBpcyBhIFBfZnJhbWUqLwotI2RlZmluZSBBVV9SQVAgICAgICAgICAweDA0IC8qKjwgVGhlIGFjY2VzcyB1bml0IGlzIGEgcmFuZG9tIGFjY2VzcyBwb2ludC4qLwotCi0KLS8qKiBBbiBhY2Nlc3MgdW5pdCBpcyB0aGUgc21hbGxlc3QgcGllY2Ugb2YgZGF0YSB3aXRoIHRpbWluZyBpbmZvcm1hdGlvbi4qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgc3RyZWFtIDsKLSAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIGRhdGFBZGRyZXNzOyAvKio8IFRoZSBkYXRhIHBvaW50ZXIuIFRoZSBzaXplIG9mIHRoaXMgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBzaXplKSBtdXN0IGJlIGEgMzItYml0cyBpbnRlZ2VyIG11bHRpcGxlKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHNpemU7ICAgICAgICAvKio8IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhQWRkcmVzcy4gVGhlIHNpemUgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGNoIGEgMzItYml0cyB3b3JkIGJvdW5kYXJ5LiovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBDVFM7ICAgICAgICAgLyoqPCBUaGUgQ29tcG9zaXRpb24gVGltZSBTdGFtcCovCi0gIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBEVFM7ICAgICAgICAgLyoqPCBUaGUgRGVjb2RlZCBUaW1lIFN0YW1wKi8KLSAgTTRTWVNfQVVfQXR0ciAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsgICAvKio8IFRoZSBhdHRyaWJ1dGUgb2YgdGhlIGFjY2VzcyB1bml0Ki8KLSAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG5iRnJhZzsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhZ21lbnRzLiBJdCBjYW4gYmUgMCBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZnJhZ21lbnQuKi8KLSAgTTRTWVNfRnJhZyoqICAgICAgICAgICAgICAgIGZyYWc7ICAgICAgICAvKio8IEFuIGFycmF5IG9mICduYkZyYWcnIGZyYWdtZW50cy4gSXQgc3RvcmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzIHN0cnVjdHVyZS4gVGhlIG9yaWdpbmFsIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIGZyYWcgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIE00U1lTX0ZyYWcqIGZyYWdbXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gTTRTWVNfRnJhZyoqIGZyYWcgc2luY2UgdGhlIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG9mIHN1Y2ggc3ludGF4IGlzIG9ubHkgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQyBjb21waWxlci4gKi8KLX0gTTRTWVNfQWNjZXNzVW5pdDsKLQotLyogRXJyb3IgY29kZXMgKi8KLSNkZWZpbmUgTTRFUlJfQVVfTk9fTU9SRV9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0FVX0JVRkZFUl9PVkVSRkxPVyAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAyKQotI2RlZmluZSBNNEVSUl9BVV9CQURfSU5ERVggICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMykKLSNkZWZpbmUgTTRFUlJfTk9UX0VOT1VHSF9GUkFHICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDQpCi0KLQotCi0jZW5kaWYgLypNNFNZU19BQ0NFU1NVTklUX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYWIwY2U3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX1N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNFNZU19TdHJlYW0uaAotICogQGJyaWVmICAgICAgICBTdHJlYW0gbWFuaXB1bGF0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBzdHJlYW0gc3RydWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFNZU19TVFJFQU1fSAotI2RlZmluZSBNNFNZU19TVFJFQU1fSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00U1lTX1N0cmVhbUlEOwotCi0vKiogVGhlIHN0cmVhbVR5cGUgdHlwZSBwcm92aWRlcyBhIHdheSB0byBkaXN0aW5ndWlzaCBhbGwgc3RyZWFtcyAoQUFDLCBBTVIsIFlVVjQyMCwgTVBFRy00IFZpZGVvLAotICAgICBIMjYzKS4gU3RyZWFtIHR5cGVzIGNhbiBiZSBzb3J0ZWQgaW4gMiB3YXlzOgotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmF3IGRhdGEsIG90aGVycyBhcmUgZW5jb2RlZAotQGFyZyAgIFNvbWUgb2YgdGhlbSBhcmUgcmVsYXRlZCB0byBhbiBhdWRpbyBtZWRpYSwgYSB2aWRlbyBtZWRpYS4uLgotQG4gU28gYSBzcGVjaWZpYyBuYW1pbmcgY29udmVudGlvbiBoYXMgYmVlbiBkZXNpZ25lZCB0byBhbGxvdyBhIHF1aWNrIHBhcnNpbmcgb2YgdGhlIHN0cmVhbVR5cGUKLSAgICB2YWx1ZSB0byByZXR1cm4gdGhlIGFib3ZlIGNhdGVnb3JpZXMuIFN0cmVhbVR5cGUgaXMgYW4gdW4tc2lnbmVkIGludGVnZXIgb24gMTYgYml0cy4KLUBhcmcgICBUaGUgZmlyc3QgYnl0ZSAoTVNCKSBkZWZpbmVzIHRoZSBjb2RlYyB0eXBlLiBJdCBjYW4gYmUgZWl0aGVyIEF1ZGlvLFZpZGVvLCBQaWN0dXJlLAotICAgICAgICAgVGV4dCBvciBTY2VuZS4KLUBhcmcgICBUaGUgc2Vjb25kIGJ5dGUgKExTQikgZGVmaW5lcyB0aGUgc3ViLWNvZGVjcyB0eXBlIChpZSBZVVY0MjAsIFBDTV8xNiBiaXRzLCBBTVIuLi4pLgotICAgICAgICBNb3Jlb3ZlciBpZiB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAweDgwIHRoZSBzdHJlYW0gaXMgYSByYXcgc3RyZWFtLCBlbHNlIHRoZSBzdHJlYW0KLSAgICAgICAgaXMgYW4gZW5jb2RlZCBvbmUKLUBuICAgMHgwMDAwIGlzIGEgZm9yYmlkZGVuIHZhbHVlLCBpdCBkZXNjcmliZXMgYW4gdW5rbm93biBzdHJlYW0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgIE00U1lTX2tVbmtub3duICAgICAgID0gMHgwMDAwLAotICAgLyogU3RyZWFtIHR5cGUgZGVmaW5pdGlvbgotICAgICAgIDB4WVlaWiAgIDogWVkgaXMgdGhlIGNvZGVjIHR5cGUgKEF1ZGlvLCBWaWRlbywgUGljdHVyZSwgU2NlbmUgLi4uKQotICAgICAgICAgICAgICAgICAgWlogaXMgdGhlIHN1Yi1jb2RlYyB0eXBlIChBQUMsIEFNUiAsIC4uLikKLSAgICAgICAgICAgICAgICAgICAgIGlmIFpaIGlzIGdyZWF0ZXIgdGhhbiAweDgwIGl0IGlzIGEgcmF3IGZvcm1hdCovCi0KLSAgIC8qIEF1ZGlvIG9uZXMgICA6IFJhbmdlIGZyb20gWzB4MDEwMC0weDAxRkZdKi8KLSAgIE00U1lTX2tBdWRpb1Vua25vd24gID0gMHgwMTAwLAotICAgTTRTWVNfa0FBQyAgICAgICAgICAgPSAweDAxMDEsCi0gICBNNFNZU19rQ0VMUCAgICAgICAgICA9IDB4MDEwMiwKLSAgIE00U1lTX2tBTVIgICAgICAgICAgID0gMHgwMTAzLAotICAgTTRTWVNfa0FNUl9XQiAgICAgICAgPSAweDAxMDQsCi0gICBNNFNZU19rTVAzICAgICAgICAgICA9IDB4MDEwNSwKLSAgIE00U1lTX2tNSURJICAgICAgICAgID0gMHgwMTA2LAotICAgTTRTWVNfa1dNQSAgICAgICAgICAgPSAweDAxMDcsCi0gICBNNFNZU19rUkVBTEFVRElPICAgICA9IDB4MDEwOCwKLSAgIE00U1lTX2tFVlJDICAgICAgICAgICAgPSAweDAxMDksCi0gICBNNFNZU19rUENNXzE2Yml0c1MgICA9IDB4MDE4MSwgLyogUENNIDE2IGJpdHMgU2lnbmVkICovCi0gICBNNFNZU19rUENNXzE2Yml0c1UgICA9IDB4MDE4MiwgLyogUENNIDE2IGJpdHMgVW4tc2lnbmVkICovCi0gICBNNFNZU19rUENNXzhiaXRzVSAgICA9IDB4MDE4MywgLyogUENNICA4IGJpdHMgVW4tc2lnbmVkICovCi0vKiBGaXhBQSAyMDA4LzAzLzAzIHR5cGVzOiBNNFNZU19rUENNXzE2Yml0c1MsIE00U1lTX2tQQ01fMTZiaXRzVSBhbmQgTTRTWVNfa1BDTV84Yml0c1UKLSAgIGFyZSBub3cgb25seSB1c2VkIGJ5IEF1ZGlvTWl4ZXIgYW5kIFJlYWRlckFWSSA9PiBBbiB1cGRhdGUgaXMgbmVjZXNzYXJ5IGluIHRoZSBmdXR1cmUgZm9yIHVzZQotICAgdHlwZSBNNFNZU19rUENNICovCi0gICBNNFNZU19rWE1GICAgICAgICAgICAgPSAweDAxODQsCi0gICBNNFNZU19rU01BRiAgICAgICAgICA9IDB4MDE4NSwKLSAgIE00U1lTX2tJTUVMICAgICAgICAgID0gMHgwMTg2LAotICAgTTRTWVNfa0JCQSAgICAgICAgICAgID0gMHgwMTg3LAotICAgTTRTWVNfa0JQQyAgICAgICAgICAgID0gMHgwMTg4LAotICAgTTRTWVNfa0FEUENNICAgICAgICAgPSAweDAxODksICAvKiBBRFBDTSBhZGRlZCAqLwotICAgTTRTWVNfa1BDTSAgICAgICAgICAgPSAweDAxOTAsICAvKiBzdHJlYW0gdHlwZSBhZGRlZDogUENNOyAgUFIyNTY5IGZpeEFBICovCi0gICBNNFNZU19rQXVkaW9BbGwgICAgICAgID0gMHgwMUZGLCAgLyogYWxsIGF1ZGlvIHN0cmVhbXMgKi8KLQotICAgLyogVmlkZW8gb25lcyAgIDogUmFuZ2UgWzB4MDIwMC0weDAyRkZdKi8KLSAgIE00U1lTX2tWaWRlb1Vua25vd24gID0gMHgwMjAwLAotICAgTTRTWVNfa01QRUdfNCAgICAgICAgPSAweDAyMDEsCi0gICBNNFNZU19rSDI2MyAgICAgICAgICA9IDB4MDIwMiwKLSAgIE00U1lTX2tIMjYzcHAgICAgICAgID0gMHgwMjAzLAotICAgTTRTWVNfa0gyNjQgICAgICAgICAgPSAweDAyMDQsCi0gICBNNFNZU19rUkVBTFZJREVPICAgICA9IDB4MDIwNSwKLSAgIE00U1lTX2tZVVY0MjAgICAgICAgID0gMHgwMjgxLAotICAgTTRTWVNfa1JHQjMyICAgICAgICAgPSAweDAyODIsCi0gICBNNFNZU19rQkdSMzIgICAgICAgICA9IDB4MDI4MywKLSAgIE00U1lTX2tSR0IyNCAgICAgICAgID0gMHgwMjg0LAotICAgTTRTWVNfa0JHUjI0ICAgICAgICAgPSAweDAyODUsCi0gICBNNFNZU19rVmlkZW9BbGwgICAgICAgID0gMHgwMkZGLCAgLyogYWxsIHZpZGVvIHN0cmVhbXMgKi8KLQotICAvKiBQaWN0dXJlIG9uZXMgOiBSYW5nZSBbMHgwMzAwLTB4MDNGRl0qLwotICAgTTRTWVNfa1BpY3R1cmVVbmtub3duID0gMHgwMzAwLAotICAgTTRTWVNfa0pQRUcgICAgICAgICAgID0gMHgwMzAxLAotICAgTTRTWVNfa0dJRiAgICAgICAgICAgID0gMHgwMzAyLAotICAgTTRTWVNfa0JNUCAgICAgICAgICAgID0gMHgwMzgzLAotICAgTTRTWVNfa1N0aWxsQWxsICAgICAgICAgPSAweDAzRkYsICAvKiBhbGwgc3RpbGwgcGljdHVyZSBzdHJlYW1zICovCi0KLSAgIC8qIFRleHQgb25lcyAgICA6IFJhbmdlIFsweDA0MDAtMHgwNEZGXSovCi0gICBNNFNZU19rVGV4dFVua25vd24gID0gMHgwNDAwLAotICAgTTRTWVNfa1RpbWVkVGV4dCAgICA9IDB4MDQwMSwKLSAgIE00U1lTX2tVVEY4ICAgICAgICAgPSAweDA0ODEsCi0gICBNNFNZU19rVVRGMTYgICAgICAgID0gMHgwNDgyLAotICAgTTRTWVNfa1VDUzIgICAgICAgICA9IDB4MDQ4MywKLSAgIE00U1lTX2tUZXh0QWxsICAgICAgID0gMHgwNEZGLCAgLyogYWxsIHRleHQgc3RyZWFtcyAqLwotCi0gICAvKiBTY2VuZSAmIEdyYXBoaWNzIG9uZXMgICA6IFJhbmdlIFsweDA1MDAtMHgwNUZGXSovCi0gICBNNFNZU19rU2NlbmVVbmtub3duICA9IDB4MDUwMCwKLSAgIE00U1lTX2tTTUlMICAgICAgICAgID0gMHgwNTAxLAotICAgTTRTWVNfa0JJRlMgICAgICAgICAgPSAweDA1MDIsCi0gICBNNFNZU19rU2NlbmVBbGwgICAgICAgID0gMHgwNUZGLCAgLyogYWxsIHNjZW5lIHN0cmVhbXMgKi8KLQotICAgLyogaGludGVkIG9uZXMgICA6IFJhbmdlIFsweDA2MDAtMHgwNkZGXSovCi0gICBNNFNZU19rSGludGVkVW5rbm93biA9IDB4MDYwMCwKLSAgIE00U1lTX2tSVFAgICAgICAgICAgID0gMHgwNjAxLAotICAgTTRTWVNfa01QRUcyX1RTICAgICAgPSAweDA2MDIsCi0gICBNNFNZU19rSGludGVkQWxsICAgICAgICA9IDB4MDZGRiwgIC8qIGFsbCBwYWNrZXRpemVkIHN0cmVhbXMgKi8KLQotICAgLyogTVBFRy00IHN5c3RlbSBvbmVzIDogUmFuZ2UgWzB4MDcwMC0weDA3RkZdKi8KLSAgIE00U1lTX2tTeXNVbmtub3duICAgID0gMHgwNzAwLAotICAgTTRTWVNfa09EUyAgICAgICAgICAgPSAweDA3MDEsCi0gICBNNFNZU19rSVBNUCAgICAgICAgICA9IDB4MDcwMiwKLSAgIE00U1lTX2tPQ0kgICAgICAgICAgID0gMHgwNzAzLAotICAgTTRTWVNfa1N5c0FsbCAgICAgICAgPSAweDA3RkYgLyogYWxsIHN5c3RlbSBzdHJlYW1zKi8KLX0gTTRTWVNfU3RyZWFtVHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00U1lTX1N0cmVhbUlEICAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICB2YWx1ZSA7Ci19IE00U1lTX1N0cmVhbUlEVmFsdWUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNFNZU19TdHJlYW1JRCAgICBzdHJlYW1JRCA7Ci0gICBNNE9TQV9VSW50MzIgICAgICBzaXplIDsKLSAgIE00T1NBX01lbUFkZHIzMiAgIGFkZHIgOwotfSBNNFNZU19TdHJlYW1JRG1lbUFkZHIgOwotCi0vKiogVGhpcyBzdHJ1Y3VyZSBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB0byBhIHN0cmVhbSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQ7ICAgIC8qKjwgVGhlIElEIG9mIHRoZSBzdHJlYW0uIEl0IG11c3QgYmUgdW5pcXVlIGZvciBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZSBpbiBhIE1QNCBmaWxlLCB0d28gdHJhY2tzIGNhbiBub3QgaGF2ZSB0d28gdGltZXMgdGhlIHNhbWUgSUQpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpcyBmb3JiaWRkZW4uKi8KLSAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlOyAgICAvKio8IFRoZSBzdHJlYW0gdHlwZSBvZiB0aGUgc3RyZWFtKi8KLSAgTTRPU0FfVUludDggICAgICBwcm9maWxlTGV2ZWw7ICAvKio8IFRoZSBwcm9maWxlICYgbGV2ZWwgb2YgYSBzdHJlYW0uIEl0IGlzIHJlbGF0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAmIHRoZSBkZWZpbml0aW9uIGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIGJvZGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gTVBFRy00IFZpZGVvICYgTVBFRy00IEF1ZGlvKS4gU29tZSB2YWx1ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUtZGVmaW5lZDogMHhGRT11c2VyUHJpdmF0ZSAweEZGPW5vIFByb2ZpbGUgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwgc3BlY2lmaWVkKi8KLSAgTTRPU0FfVUludDMyICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsgIC8qKjwgVGhlIGRlY29kZXIgY29uZmlndXJhdGlvbi4gVGhlc2UgYnl0ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gaW5pdGlhbGlzZSBhIGRlY29kZXIuKi8KLSAgTTRPU0FfTWVtQWRkcjMyICBkZWNvZGVyU3BlY2lmaWNJbmZvOyAvKio8IFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mby4qLwotICBNNE9TQV9VSW50MzIgICAgIHRpbWVTY2FsZTsgICAgIC8qKjwgVGhlIHRpbWUgc2NhbGUgb2YgdGhlIHN0cmVhbS4gSXQgbWVhbnMgdGhhdCBhbGwgdGltaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gb2YgdGhpcyBzdHJlYW0gYXJlIGNvbXB1dGVkIGluIHRoaXMgdGltZXNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGllIHRpbWVTY2FsZSA9IDgwMDAsIG1lYW5zIHRoZXJlIGFyZSA4MDAwIHRpY2tzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHNlY29uZCkqLwotICBNNE9TQV9UaW1lICAgICAgIGR1cmF0aW9uOyAgICAgICAgLyoqPCBUaGUgc3RyZWFtIGR1cmF0aW9uIG9mIHRoaXMgc3RyZWFtLiBUaGUgdGltZSB1bml0IGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgc2NhbGUuIFRoZSB2YWx1ZSBjYW4gYmUgc2V0IHRvIE00U1lTX1Vua25vd25UaW1lIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGR1cmF0aW9uIGlzIG5vdCBrbm93bi4qLwotICBNNE9TQV9JbnQzMiAgICAgIGF2ZXJhZ2VCaXRyYXRlOyAgLyoqPCBUaGUgYXZlcmFnZSBiaXRyYXRlIChpbiBiaXQgcGVyIHNlY29uZCkgb2YgdGhpcyBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdmVyYWdlIGJpdHJhdGUgaXMgY29tcHV0ZWQgb24gdGhlIHN0cmVhbSBkdXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgdmFsdWUgbWVhbnMgZWl0aGVyIHRoZXJlIGlzIG5vIGF2ZXJhZ2UgYml0cmF0ZSBvciBubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIGJpdHJhdGUgaXMgcHJvdmlkZWQuKi8KLSAgTTRPU0FfSW50MzIgICAgICBtYXhCaXRyYXRlOyAgICAgIC8qKjwgVGhlIG1heGltdW0gYml0cmF0ZSAoaW4gYml0IHBlciBzZWNvbmQpIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBiaXRyYXRlIGlzIGNvbXB1dGVkIG9uIGEgc2xpZGluZyB3aW5kb3cgb2YgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQuIC0xIHZhbHVlIG1lYW5zIGVpdGhlciB0aGVyZSBpcyBubyBtYXguIGJpdHJhdGUgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gbWF4LiBiaXRyYXRlIGlzIHByb3ZpZGVkLiovCi19IE00U1lTX1N0cmVhbURlc2NyaXB0aW9uOwotCi10eXBlZGVmIGVudW0gewotICAgTTRTWVNfa1ByZXZpb3VzUkFQICAgICAgPSAweDAxICwKLSAgIE00U1lTX2tOZXh0UkFQICAgICAgICAgID0gMHgwMiAsCi0gICBNNFNZU19rQ2xvc2VzdFJBUCAgICAgICA9IDB4MDMgLAotICAgTTRTWVNfa05vUkFQcHJldmlvdXMgICAgPSAweDExICwKLSAgIE00U1lTX2tOb1JBUG5leHQgICAgICAgID0gMHgxMiAsCi0gICBNNFNZU19rTm9SQVBjbG9zZXN0ICAgICA9IDB4MTMgLAotICAgTTRTWVNfa0JlZ2lubmluZyAgICAgICAgPSAweDIwCi19IE00U1lTX1NlZWtBY2Nlc3NNb2RlIDsKLQotI2VuZGlmIC8qTTRTWVNfU1RSRUFNX0gqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzAxNmI4ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFRPT0xfVmVyc2lvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VE9PTF9WZXJzaW9uSW5mby5oCi0gKiBAYnJpZWYgIGRlZmluZXMgYSBjb21tb24gdmVyc2lvbiBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFRPT0xfVkVSU0lPTklORk9fSF9fCi0jZGVmaW5lIF9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfVmVyc2lvbkluZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHZlcnNpb24gb2YgY29yZSBjb21wb25lbnQKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB0eXBpY2FsbHkgdXNlZCB0byByZXRyaWV2ZSB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gKiAgICAgICAgICAgICAgICBvZiBhIGNvbXBvbmVudCB2aWEgZ2V0T3B0aW9uIGZ1bmN0aW9uCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNF9WZXJzaW9uSW5mbwotewotICAgIE00T1NBX1VJbnQzMiBtX21ham9yOyAgICAgICAgLyptYWpvciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX21pbm9yOyAgICAgICAgLyptaW5vciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIE00T1NBX1VJbnQzMiBtX3JldmlzaW9uOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0KLSAgICAvKiBTdHJ1Y3R1cmUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiBtX3N0cnVjdFNpemU7Ci0KLX0gTTRfVmVyc2lvbkluZm87Ci0KLQotI2VuZGlmIC8qX19NNFRPT0xfVkVSU0lPTklORk9fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwYmZjYjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fCi0KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogLS0tLS0gRFNJIGJpdHN0cmVhbSBwYXJzZXIgLS0tLS0gKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBhdmFpbGFibGUgdG8gY2xpZW50cyBvZiB0aGUgc2hlbGwgdG8gYWxsb3cgdGhlbSB0byBhbmFseXNlIGNsaXBzCi0odXNlZnVsIGZvciB2aWRlbyBlZGl0aW5nKSB3aXRob3V0IGhhdmluZyB0byBpbnN0YW5jaWF0ZSBhIGRlY29kZXIsIHdoaWNoIGNhbiBiZSB1c2VmdWwgcHJlY2lzZWx5Ci1pZiBIVyBkZWNvZGVycyBhcmUgYSBwb3NzaWJpbGl0eS4gKi8KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEY2ksCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSk7Ci0KLU00T1NBX0VSUiBnZXRBVkNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldEgyNjNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotTTRPU0FfRVJSIGdldE1QRUc0UHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4IHByb2ZpbGVBbmRMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZEX0VYVEVSTkFMX0lOVEVSRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2NhMzZhYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VkRfVE9PTFNfSF9fCi0jZGVmaW5lIF9fTTRWRF9UT09MU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0vKiAtLS0tLSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9ieXRlOwotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1faW5kZXg7Ci0gICAgTTRPU0FfTWVtQWRkcjggaW47Ci0KLX0gTTRWU19CaXRzdHJlYW1fY3R4dDsKLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKTsKLU00T1NBX0VSUiBNNFZEX1Rvb2xzX1dyaXRlQml0c1RvTWVtb3J5KE00T1NBX1VJbnQzMiBiaXRzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9UT09MU19IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkZMX3RyYW5zaXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdmNzZjYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uaAotICogQGJyaWVmCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000VkZMX1RSQU5TSVRJT05fSF9fCi0jZGVmaW5lIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJbnQzMjsKLQotdHlwZWRlZiAgICBzdHJ1Y3QgU19NNFZpQ29tSW1hZ2VQbGFuZQotewotICAgIFVJbnQzMiAgICAgICAgdV93aWR0aDsgICAgICAgICAgICAvKiBhY3RpdmUgd2lkdGgsIGluIHBpeGVscyAqLwotICAgIFVJbnQzMiAgICAgICAgdV9oZWlnaHQ7ICAgICAgICAgICAgLyogYWN0aXZlIGhlaWdodCwgaW4gbGluZXMgKi8KLSAgICBVSW50MzIgICAgICAgIHVfdG9wbGVmdDsgICAgICAgICAgICAvKiBpbmRleCBvZiAxc3QgYWN0aXZlIHBpeGVsICovCi0gICAgVUludDMyICAgICAgICB1X3N0cmlkZTsgICAgICAgICAgICAvKiBsaW5lIHN0cmlkZSwgaW4gYnl0ZXMgKi8KLSAgICBVSW50OCAgICAgICAgKnBhY19kYXRhOyAgICAgICAgICAgIC8qIGJ1ZmZlciBhZGRyZXNzICovCi19ICAgIE00VmlDb21JbWFnZVBsYW5lOwotCi10eXBlZGVmIHN0cnVjdCBTX000VkZMX21vZGlmTHVtUGFyYW0KLXsKLSAgICB1bnNpZ25lZCBzaG9ydCBsdW1fZmFjdG9yOwotICAgIHVuc2lnbmVkIHNob3J0IGNvcHlfY2hyb21hOwotfSBNNFZGTF9Nb2RpZkx1bVBhcmFtOwotCi0jZGVmaW5lICAgICBNNFZJRklfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgICAgIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVCAgICAgOAotI2RlZmluZSAgICAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEggICAgICA5Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX01vZGlmTHVtUGFyYW0gKmx1bV9wYXJhbSwgdm9pZCAqdXNlcl9kYXRhKTsKLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLCB2b2lkICp1c2VyX2RhdGEpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VSW50MzIgUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICBCbGVuZHMgdHdvIFlVViA0OjI6MCBQbGFuYXIgaW1hZ2VzLgotICogQG5vdGUgICAgQmxlbmRzIFlVVjQyMCBwbGFuYXIgaW1hZ2VzLAotICogICAgICAgICAgTWFwIHRoZSB2YWx1ZSBvZiBwcm9ncmVzcyBmcm9tICgwIC0gMTAwMCkgdG8gKDAgLSAxMDI0KQotICogICAgICAgICAgU2V0IHRoZSByYW5nZSBvZiBibGVuZGluZ2ZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgMS4gZnJvbSAwIHRvIChQcm9ncmVzcyA8PCAxKSAgICAgICAgICAgIDtmb3IgUHJvZ3Jlc3MgPD0gNTEyCi0gKiAgICAgICAgICAgICAgICAgIDIuIGZyb20gKCggUHJvZ3Jlc3MgLSA1MTIpPDwgMSkgdG8gMTAyNCA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBTZXQgdGhlIGluY3JlbWVudCBvZiBibGVuZGluZ2ZhY3RvciBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBpbWFnZSByb3cgYnkgdGhlIGZhY3RvciwKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlLTEpIC8gKGltYWdlIHdpZHRoLTEpICA7Zm9yIHdpZHRoID49IHJhbmdlCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZSkgLyAoaW1hZ2Ugd2lkdGgpICAgICAgO290aGVyd2lzZQotICogICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaSkgcm93IG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCg9IGopIGNvbHVtbiBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZyb20gdHdvIGlucHV0IFlVVjQ6MjowIGltYWdlcyBhbmQKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSBmb3VyIFkgc2FtcGxlIGFuZCBvbmUgVSAmIFYgc2FtcGxlIGZvciBvdXRwdXQgWVVWNDoyOjAgaW1hZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBmb2xsb3dpbmcsCi0gKiAgICAgICAgICAgICAgICAgIE91dChpLGopID0gYmxlbmRpbmdmYWN0b3IoaSxqKSAqIEluMShpLGopKyAobCAtIGJsZW5kaW5nZmFjdG9yKGksaikpICogSW4yKGksaikKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSAgVXNlciBTcGVjaWZpYyBQYXJhbWV0ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZUluMTogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZUluMjogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQgZm9yIFksIFUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIFByb2dyZXNzOiAgKElOKSAgUHJvZ3Jlc3MgdmFsdWUgKHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEwMDApCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZU91dCwgVUludDMyIFByb2dyZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8vIF9fTTRWRkxfVFJBTlNJVElPTl9IX18KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZjA3NjE2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9DbGlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9DbGlwLmgKLSAqIEBicmllZiAgICAgICAgR2xvYmFsIFRhYmxlIGRlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2xpcHBpbmcgYW5kIERpdmlzaW9uIHRhYmxlIGFkZHJlc3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgICAgX000VklGSV9DTElQX0hfCi0jZGVmaW5lICAgIF9NNFZJRklfQ0xJUF9IXwotCi0vKiBDbGlwcGluZyBtYXRyaXggZm9yIFJHQiB2YWx1ZXMgKi8KLUVYVEVSTiBDTlNUIE00VklGSV9VSW50OCAgICAqTTRWSUZJX0NsaXBUYWJsZV96ZXJvOwotLyogRGl2aXNpb24gdGFibGUgZm9yICg2NTUzNS94KTsgeCA9IDAgdG8gNTEyICovCi1FWFRFUk4gQ05TVCBNNFZJRklfVUludDE2ICAgICpNNFZJRklfRGl2VGFibGVfemVybzsKLQotI2VuZGlmIC8qIF9NNFZJRklfQ0xJUF9IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5oICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDU5MWU1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9EZWZpbmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfRGVmaW5lcy5oCi0gKiBAYnJpZWYgICAgICAgIE1hY3JvIERlZmluaXRpb24KLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgdGhlIG1hY3JvIHVzZWQgaW4gdGhlIGZpbHRlciBsaWJyYXJ5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfREVGSU5FU19IXwotI2RlZmluZSBfTTRWSUZJX0RFRklORVNfSF8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNyb3MgdXNlZCBmb3IgY29sb3IgdHJhbnNmb3JtIFJHQjU2NSB0byBZVVYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ1NUX1JHQl8xNl9TSVpFIDIKLSNkZWZpbmUgWTE2KHIsIGcsIGIpIENMSVAoICAoICggKDgwNTkzICogcikrKDc3ODU1ICogZykrKDMwNzI4ICogYikpID4+IDE1KSkKLSNkZWZpbmUgVTE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggLSg0NTQ4MyAqIHIpLSg0MzkzNiAqIGcpKygxMzQ3NzEgKiBiKSkgPj4gMTUgKSkKLSNkZWZpbmUgVjE2KHIsIGcsIGIpIENMSVAoMTI4KyAoICggKDEzNDc3MSAqIHIpLSg1NTUzMiAqIGcpLSgyMTkxNyAqIGIpKSA+PiAxNSAgKSkKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgTWFjcm9zIHVzZWQgZm9yIGNvbG9yIHRyYW5zZm9ybSBZVVYgdG8gUkdCCi0gKiAgICBCID0gMS4xNjQoWSAtIDE2KSAgICAgICAgICAgICAgICAgICsgMi4wMTgoVSAtIDEyOCkKLSAqICBHID0gMS4xNjQoWSAtIDE2KSAtIDAuODEzKFYgLSAxMjgpIC0gMC4zOTEoVSAtIDEyOCkKLSAqICBSID0gMS4xNjQoWSAtIDE2KSArIDEuNTk2KFYgLSAxMjgpCi0gKiAgQWJvdmUgQ29udmVyc2lvbiBGb3JtdWxhIGlzIGltcGxlbWVudGVkIGZvciBmaXhlZCBwb2ludCBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBDU1RfUkdCXzI0X1NJWkUgMwotCi0jaWZkZWYgX19SR0JfVjFfXwotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDM3LFV4LFZ4KSBcCi0gICAgUnggPSBDTElQKCgoWXgzNyArIChWeCAqIDUxKSArIDE2KSA+PiA1KSAtIDIyMyk7IFwKLSAgICBHeCA9IENMSVAoKChZeDM3IC0gKChVeCsoVng8PDEpKSAqIDEzKSArMTYpID4+IDUpICsgMTM1KTsgXAotICAgIEJ4ID0gQ0xJUCgoKFl4MzcgKyAoVXggKiA2NSkgKyAxNikgPj4gNSkgLSAyNzcpCi0jZWxzZQotI2RlZmluZSBERU1BVFJJWChSeCxHeCxCeCxZeDI1NjgsVXgsVngpIFwKLSAgICBSeCA9IENMSVAoKChZeDI1NjggKyAgICAgICAgICAgICAgICAgKFZ4ICogMHgzMzQzKSArIChNNFZJRklfSW50MzIpMHhmZmU0MDgwMCkgPj4gMTMpKTsgXAotICAgIEd4ID0gQ0xJUCgoKFl4MjU2OCAtIChVeCAqIDB4MGM5MikgLSAoVnggKiAweDFhMWUpICsgKE00VklGSV9JbnQzMikweDAwMTEwMTgwKSA+PiAxMykpOyBcCi0gICAgQnggPSBDTElQKCgoWXgyNTY4ICsgKFV4ICogMHg0MGNmKSAgICAgICAgICAgICAgICAgICAgKyAoTTRWSUZJX0ludDMyKTB4ZmZkZDQyMDApID4+IDEzKSk7Ci0jZW5kaWYgLyogX19SR0JfVjFfXyAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgUGFja2luZyBhbmQgVW5wYWNraW5nIGlzIGRpZmZlcmVudCBmb3IgbGl0dGxlIGFuZCBiaWcgZW5kaWFuCi0gKiAgciwgZywgYiwgUngsIEd4LCBCeCBhcmUgOCBiaXQgY29sb3IgdmFsdWUKLSAqICAgIGEsIGRhdGEgYXJlIDE2IGJpdCBwaXhlbCB2YWx1ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyogUGFjayBjb21wdXRhdGlvbnMgY29tbW9uIGZvciBsaXR0bGUgZW5kaWFuIGFuZCBiaWcgZW5kaWFuIG1vZGVzICovCi0jZGVmaW5lICAgIFBBQ0tfQkdSMjQocmdiX3B0cixSeCxHeCxCeCkge3JnYl9wdHJbMF0gPSAoTTRWSUZJX1VJbnQ4KUJ4OyByZ2JfcHRyWzFdID1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OClHeDsgcmdiX3B0clsyXSA9IChNNFZJRklfVUludDgpUng7fQotI2RlZmluZSAgICBQQUNLX1JHQjI0KHJnYl9wdHIsUngsR3gsQngpIHtyZ2JfcHRyWzBdID0gKE00VklGSV9VSW50OClSeDsgcmdiX3B0clsxXSA9XAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpR3g7IHJnYl9wdHJbMl0gPSAoTTRWSUZJX1VJbnQ4KUJ4O30KLQotI2lmZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgICAgUEFDS19SR0I1NjUoYSwgUngsIEd4LCBCeCkgKCgoUnggPj4gMykgPDwgKDExICsgKGEpKSlcCi0gICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSAgICBQQUNLX0JHUjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoMTEgKyAoYSkpKVwKLSAgICAgICAgICAgICAgICAgfCAoKEd4ID4+IDIpIDw8ICg1ICsgKGEpKSkgfCAoKFJ4ID4+IDMpIDw8IChhKSkpCi0jZGVmaW5lIEdFVF9SR0I1NjUociwgZywgYiwgZGF0YSkge2IgPSAoKGRhdGEpICYgMzEpOyBnID1cCi0gICAgICAgICAgICAgICAgICAgICAoKGRhdGEgPj4gNSkgJiA2Myk7IHIgPSAoKGRhdGEgPj4gMTEpICYgMzEpO30KLSNkZWZpbmUgR0VUX0JHUjU2NShiLCBnLCByLCBkYXRhKSBcCi0gICAgciA9ICgoZGF0YSkgJiAzMSk7IFwKLSAgICBnID0gKChkYXRhID4+IDUpICYgNjMpOyBcCi0gICAgYiA9ICgoZGF0YSA+PiAxMSkgJiAzMSApOwotI2Vsc2UgLyogTElUVExFIGVuZGlhbjogMHgxMjM0NTY3OCAtPiA3OCA1NiAzNCAxMiAqLwotI2RlZmluZSAgICBQQUNLX1JHQjU2NShhLCBSeCwgR3gsIEJ4KSAoKChCeCA+PiAzKSA8PCAoOCArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKCgoR3ggPj4gMikmMHg3KSA8PCAoMTMgKyAoYSkpKSB8ICgoR3ggPj4gNSkgPDwgKGEpKSB8ICgoUnggPj4gMykgPDwgKDMgKyBhKSkpCi0jZGVmaW5lICAgIFBBQ0tfQkdSNTY1KGEsIFJ4LCBHeCwgQngpICgoKFJ4ID4+IDMpIDw8ICgxMSArIChhKSkpIFwKLSAgICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChCeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSBHRVRfUkdCNTY1KHIsIGcsIGIsIGRhdGEpIHsgYiA9IChNNFZJRklfVUludDgpKCgoZGF0YSkgJiAweDFGMDApID4+IDgpOyBnID1cCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCkoKCgoZGF0YSkgJiAweDcpIDw8IDMpIHwgKCgoZGF0YSkgJiAweEUwMDApID4+IDEzKSk7IHIgPVwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KSgoKGRhdGEpICYgMHhGOCkgPj4gMyk7fQotI2RlZmluZSBHRVRfQkdSNTY1KGIsIGcsIHIsIGRhdGEpIFwKLSAgICBiID0gKChkYXRhKSAmIDMxKTsgXAotICAgIGcgPSAoKGRhdGEgPj4gNSkgJiA2Myk7IFwKLSAgICByID0gKChkYXRhID4+IDExKSAmIDMxICk7Ci0jZW5kaWYgLyogQklHX0VORElBTiAqLwotCi0KLSNkZWZpbmUgQ1NUX1JHQl8yNF9TSVpFIDMKLSNkZWZpbmUgWTI0KHIsZyxiKSBDTElQKCggKCAoMTk1OTUgKiByKSArICgzODQ3MCAqIGcpICsgKDk0MzcgKiBiKSApID4+MTYpKQotI2RlZmluZSBVMjQocixnLGIpIENMSVAoMTI4ICsgKCAoIC0oMTEwNTkgKiByKSAtICgyMTcwOSAqIGcpICsgKDMyNzY4ICogYikpID4+MTYpKQotI2RlZmluZSBWMjQocixnLGIpIENMSVAoMTI4ICsgKCAoICgzMjc2OCAqIHIpIC0gKDI3NDI2ICogZykgLSAoNTMyOSAqIGIpKSAgPj4xNikpCi0jZGVmaW5lIEdFVF9SR0IyNChyLGcsYixzLG8pIHIgPSBzW29dOyBnID0gc1tvICsgMV07IGIgPSBzW28gKyAyXTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBNYWNybyBmb3IgY2xpcHBpbmcgdXNpbmcgdGhlIGNsaXBwaW5nIG1hdHJpeCBmb3IgUkdCIHZhbHVlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIENsaXAgZnVuY3Rpb24gZW5zdXJlcyB2YWx1ZXMgd2l0aCByYW5nZSBvZiAwIGFuZCAyNTUgKi8KLSNkZWZpbmUgICAgICAgIENMSVAoeCkgICAgKihNNFZJRklfQ2xpcFRhYmxlX3plcm8gKyAoeCkpCi0jZGVmaW5lICAgICAgICBDTElQX09WRiAgICAgICAgNTAwCi0jZGVmaW5lICAgICBDTElQX0xVVF9TSVpFICAgICAoMjU2ICsgMiAqIENMSVBfT1ZGKQotLyoqIERpdmlzaW9uIHRhYmxlIGZvciBSR0I1NjUgdG8gSExTIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgICAgICAgIERJVkNMSVAoeCkgICAgKihNNFZJRklfRGl2VGFibGVfemVybyArICh4KSkKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBFbmRpYW5uZXNzIChkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgTGl0dGxlIEVuZGlhbikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZiAoIWRlZmluZWQoTElUVExFX0VORElBTikgJiYgIWRlZmluZWQoQklHX0VORElBTikpCi0vKiogRGVmYXVsdCBlbmRpYW4gc2V0dGluZyAqLwotI2RlZmluZSBMSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBPdGhlciBtYWNyb3MgYW5kIGRlZmluZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqIFlVViBwbGFuZSBpbmRleCAqLwotI2RlZmluZSBQTEFORVMgICAgMwotI2RlZmluZSBZUGxhbmUgICAgMAotI2RlZmluZSBVUGxhbmUgICAgMQotI2RlZmluZSBWUGxhbmUgICAgMgotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAgICghKGEgJiAweDAxKSkKLSNlbmRpZgotCi0vKiBVc2VkIGZvciBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAqLwotI2lmbmRlZiBNQVhfU0hPUlQKLSNkZWZpbmUgTUFYX1NIT1JUICAgIDB4MTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogX000VklGSV9ERUZJTkVTX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9EZWZpbmVzLmggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNkMmZjOWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0ZpbHRlcnNBUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VklGSV9GaWx0ZXJzQVBJLmgKLSAqIEBicmllZiAgICAgICAgRXh0ZXJuYWwgQVBJIGFuZCBEYXRhIGRlZmluaXRpb25zIGZvciB0aGUgdmlkZW8gZmlsdGVyIGxpYnJhcnkKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhbmQgZGVjbGFyZXMgZGF0YSBjb21tb24gdG8gdGhlIHZpZGVvIGZpbHRlciBsaWJyYXJ5OgotICogICAgICAgICAgICAgICAgICAgIC0jIGRhdGEgdHlwZXMKLSAqICAgICAgICAgICAgICAgICAgICAtIyBlcnJvciBjb2RlcwotICogICAgICAgICAgICAgICAgICAgIC0jIGV4dGVybmFsIEFQSSdzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgQVBJIGxldmVsIHN0cnVjdHVyZSBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jZGVmaW5lIF9NNFZJRklfRklMVEVSU0FQSV9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotZXh0ZXJuICJDIiB7Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0gICAgLyoqCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgICAgICAgICAgICAgICAgIERhdGEgdHlwZXMgZGVmaW5pdGlvbgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTTRWSUZJX1VJbnQ4OwotICAgIHR5cGVkZWYgY2hhciBNNFZJRklfSW50ODsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE00VklGSV9VSW50MTY7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIE00VklGSV9VSW50MzI7Ci0gICAgdHlwZWRlZiBzaG9ydCBNNFZJRklfSW50MTY7Ci0gICAgdHlwZWRlZiBsb25nIE00VklGSV9JbnQzMjsKLSAgICB0eXBlZGVmIGZsb2F0IE00VklGSV9GbG9hdDsKLSAgICB0eXBlZGVmIGRvdWJsZSBNNFZJRklfRG91YmxlOwotICAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciBNNFZJRklfRXJyb3JDb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIEVycm9yIGNvZGVzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRWSUZJX09LICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNNFZJRklfSU5WQUxJRF9QQVJBTSAgICAgICAgICAgIDcKLSNkZWZpbmUgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUICAgICAgICA4Ci0jZGVmaW5lIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIICAgICAgICA5Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgT3RoZXIgYmFzaWMgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgQ05TVCAgICBjb25zdAotI2RlZmluZSBFWFRFUk4gICAgZXh0ZXJuCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAgIDAKLQotI2VuZGlmCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICAgIDAKLSNkZWZpbmUgVFJVRSAgICAhRkFMU0UKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgU3RydWN0dXJlcyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9JbWFnZVBsYW5lCi0gKiBAYnJpZWYgICAgICAgIFRleHR1cmUgKFlVVikgcGxhbmVzIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIGltYWdlIHBsYW5lcyBmb3IgdGhlIG91dHB1dCB0ZXh0dXJlczoKLSAqICAgICAgICAgICAgICAgIHNpemVzIChpbiBwaXhlbHMpIGFyZSBsdW1hIHBsYW5lIHNpemVzLCB0aGUgMyBwb2ludGVycyBwb2ludAotICogICAgICAgICAgICAgICAgdG8gdGhlIFksIFUgYW5kIFYgYnVmZmVycyB3aGljaCBzdG9yZSBkYXRhIGluIHBsYW5hciBmb3JtYXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfVUludDMyIHVfd2lkdGg7ICAgLyoqPCBXaWR0aCBvZiBsdW1hIGluIHBpeGVsIHVuaXQgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X2hlaWdodDsgIC8qKjwgSGVpZ2h0IG9mIGx1bWEgaW4gcGl4ZWwgdW5pdCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfdG9wbGVmdDsgLyoqPCBQb2ludGVyIHRvIGZpcnN0IHRleHR1cmUgYWN0aXZlIHBpeGVsICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV9zdHJpZGU7ICAvKio8IFN0cmlkZSB2YWx1ZSAqLwotICAgICAgICBNNFZJRklfVUludDggKnBhY19kYXRhOyAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhICovCi0gICAgICAgIH0gTTRWSUZJX0ltYWdlUGxhbmU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9GcmFtaW5nRGF0YQotICogQGJyaWVmICAgICAgICBEYXRhIG5lY2Vzc2FyeSB0byBhZGQgYW4gb3ZlcmxheSBvbiBhbiBpbWFnZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGRldGFpbHMgdGhlIHBvc2l0aW9uIGFuZCB0aGUgZGF0YSBvZiB0aGUgb3ZlcmxheQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feFBvc1N0ZXA7IC8qKjwgWCBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MC8rNTAlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIG1lYW5zIG92ZXJsYXkgaXMgY2VudGVyZWQgdnMgbWFpbiBwaWN0dXJlIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFggYWJzY2lzc2EuICovCi0gICAgICAgIE00VklGSV9VSW50MzIKLSAgICAgICAgICAgIG1feVBvc1N0ZXA7IC8qKjwgWSBwb3NpdGlvbmluZyBvZiB0aGUgb3ZlcmxheSB2cyBtYWluIHBpY3R1cmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSBwb3NpdGlvbmluZyBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSB2cyB0aGUgbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feFBvc1N0ZXAgbXVzdCBiZSBleHByZXNzZWQgYnkgc3RlcCBvZiAxJSBhbmQgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTAvKzUwJS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBtZWFucyBvdmVybGF5IGlzIGNlbnRlcmVkIHZzIG1haW4gcGljdHVyZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZIGFic2Npc3NhLiAqLwotCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgbV9pbWFnZVBsYW5lOyAvKio8IFBvaW50ZXIgdG8gdGhlIGZyYW1pbmcgaW1hZ2Ugd2l0aCBhbHBoYSBjaGFubmVsICovCi0gICAgICAgIH0gTTRWSUZJX0ZyYW1pbmdEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfSExTb2Zmc2V0Ci0gKiBAYnJpZWYgICAgICAgIEhMUyBvZmZzZXQgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaGF2ZSB0aGUgaHVlLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgdmFsdWUKLSAqICAgICAgICAgICAgICAgIGZvciBxdWFsaXR5IGVuaGFuY2VtZW50LiBSYW5nZSBvZiB2YWx1ZXMgbmVjY2Vzc2FyaWx5IGJlCi0gKiAgICAgICAgICAgICAgICBodWUgPSAtMzYwIHRvIDM2MCwgc2F0ID0gMCB0byAxMDAgYW5kIGxpZ2h0ID0gMCB0MCAxMDAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSW50MTYgaHVlOyAgIC8qKjwgSHVlIG9mZnNldCAqLwotICAgICAgICBNNFZJRklfSW50MTYgc2F0OyAgIC8qKjwgU2F0dXJhdGlvbiBvZmZzZXQgKi8KLSAgICAgICAgTTRWSUZJX0ludDE2IGxpZ2h0OyAvKio8IExpZ2h0IG9mZnNldCAqLwotICAgICAgICB9IE00VklGSV9ITFNvZmZzZXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklGSV9UcmFuZm9ybWF0aW9uCi0gKiBAYnJpZWYgICAgICAgIEltYWdlIFRyYW5mb3JtYXRpb24gU3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgSW1hZ2UgVHJhbmZvcm1hdGlvbiBSZXF1ZXN0Ci0gKiAgICAgICAgICAgICAgICByb3RhdGlvbiA6IDEgLT4gKzkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgLT4gLTkwZGVnIFJvdGF0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4gIE5vIFJvdGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0ludDMyIGkzMl9yb3RhdGlvbjsgLyoqPCBSb3RhdGlvbiBGbGFnICAgICAgICAqLwotICAgICAgICB9IE00VklGSV9UcmFuZm9ybWF0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfcENvbnRleHQKLSAqIEBicmllZiAgICAgICAgTmV3IFN0cnVjdHVyZXMKLSAqIEBub3RlICAgICAgICAtIyBTdHJ1Y3R1cmUgb2YgTTRWSUZJX0hMU29mZnNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9ITFNvZmZzZXQgaGxzT2Zmc2V0OyAvKio8IEhMUyBvZmZzZXQgc3RydWN0dXJlICovCi0gICAgICAgIH0gTTRWSUZJX3BDb250ZXh0OwotCi0gICAgLyoKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgQVBJIGZ1bmN0aW9ucwotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICovCi0KLSAgICAvKio8IEVmZmVjdCBmaWx0ZXJzICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXBpYVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbnRyYXN0WVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTmVnYXRpdmVZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GbGlwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfTWlycm9yWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yUllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yR1lVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbG9yQllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0ZyYW1pbmdSR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GcmFtaW5nWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEh1ZUluWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX0NvbGRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9XYXJtWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0vKiAgICAgICAgICAgICAgICBBRFMgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLQotLyogICAgICAgIEdlbmVyaWMgQVJNIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNpZiBkZWZpbmVkIEFEU19BUk0KLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgUkdCODg4dG9SR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBSR0I1NjV0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUFkc0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgQURTX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIFlVVjQyMHRvWVVWNDIwIGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiArOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUkFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiAtOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfVVlWWXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0EgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhckFkc0FybTlFCi0vKiAgICAgICAgICAgICAgICBHQ0MgQ29tcGlsZXIgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBHZW5lcmljIEFSTSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0KLSNlbGlmIGRlZmluZWQgR0NDX0FSTQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5CR1I1NjVHY2NBcm0KLQotLyogICAgICAgIEFSTTlFIGFzc2VtYmx5IGZ1bmN0aW9ucyAgICAgICAgKi8KLSNlbGlmIGRlZmluZWQgR0NDX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBHY2NBcm05RQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfU2V0SExTaW5SR0I1NjVHY2NBcm05RQotCi0vKiBUSSBDQ1MgYXNzZW1ibHkgZmlsZXMgKi8KLSNlbGlmIGRlZmluZWQgVEk0MTFfQVJNOUUKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJlc2l6ZWQgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgKFBsYW5hcikgdG8gUmVzaXplZCBSR0I4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgYW5kIFJvdGF0ZWQgKC05MCkgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBhbmQgUm90YXRlZCAoKzkwKSBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIFlVVjQyMChQbGFuYXIpICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uIHdpdGggcm90YXRpb24oLTkwKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZSBZVVY0MjAoUGxhbmFyKSBvZiBRQ0lGIHRvIFJHQjU2NSBvZiBRVkdBIHJlc29sdXRpb24gd2l0aCByb3RhdGlvbigrOTApICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0VGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRUaTQxMUFybTlFCi0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0EgICAgICAgTTRWSUZJX1lVVjQyMFFDSUZ0b1lVVjQyMFFWR0FUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxUaTQxMUFybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUlRpNDExQXJtOUUKLQotLyogICAgICAgIEFOU0kgQyBGdW5jdGlvbnMgICAgICAgICovCi0jZWxzZQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCUkc1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQlJHODg4IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotICAgIC8qKiBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLSAgICAvKiogWVVWNDIyIHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfVVlWWXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBSR0IyNCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0IyNCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpblJHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luQkdSNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1lVVjQyMCBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gKzkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlIodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uIC05MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjAgTGluZWFyIGZvcm1hdCB3aXRoL3dpdGhvdXQgK29yLTkwIHJvdGF0aW9uKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hcnRvWVVWNDIwTGluZWFyKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotLyoqIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBJbWFnZSBhbmQgc3RvcmVzIGluIFlVVjQyMiBJbnRlcmxlYXZlZCBmb3JtYXQKLSAgICAgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMkludGVybGVhdmVkKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSNlbmRpZgotCi0gICAgLyoqIGRlZmluaXRpb24gb2YgdGhlIGNvbnZlcnRlciBmdW5jdGlvbiB0eXBlcyAqLwotCi0gICAgdHlwZWRlZiBNNFZJRklfVUludDggTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUodm9pZAotICAgICAgICAqcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBpbiwgTTRWSUZJX0ltYWdlUGxhbmUqIG91dCk7Ci0KLSAgICAvKiogZGVmaW5pdGlvbiBvZiB0aGUgcHJlcHJvY2Vzc2luZyBmdW5jdGlvbiB0eXBlcyAqLwotICAgIHR5cGVkZWYgTTRWSUZJX1VJbnQ4IE00VklGSV9QcmVwcm9jZXNzRnVuY3Rpb25UeXBlKHZvaWQKLSAgICAgICAgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogaW4sIE00VklGSV9JbWFnZVBsYW5lKiBvdXQpOwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotCi19Ci0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX000VklGSV9GSUxURVJTQVBJX0hfICovCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9GaWx0ZXJzQVBJLmggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2NWNhMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlBQX0FQSS5oCi0gKiBAYnJpZWYgICAgVmlkZW8gcHJlcHJvY2Vzc2luZyBBUEkgcHVibGljIGZ1bmN0aW9ucyBwcm90b3R5cGVzLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWUFBfQVBJX0gKLSNkZWZpbmUgTTRWUFBfQVBJX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCB0eXBlcyAqLwotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBjb21tb24gT1NBTCBlcnJvcnMgKi8KLQotLyoqCi0gKiAgICBJbmNsdWRlIFZpZGVvIGZpbHRlcnMgaW50ZXJmYWNlIGRlZmluaXRpb24gKGZvciB0aGUgTTRWSUZJX0ltYWdlUGxhbmUgdHlwZSkgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdWJsaWMgdHlwZSBvZiB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBleGVjdXRpb24gY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRWUFBfQ29udGV4dDsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWUFBfa0lZVVY0MjA9MCwgICAgLyoqPCBZVVYgNDoyOjAgcGxhbmFyIChzdGFuZGFyZCBpbnB1dCBmb3IgbXBlZy00IHZpZGVvKSAqLwotICAgIE00VlBQX2tJWVVWNDIyLCAgICAgICAgLyoqPCBZVVY0MjIgcGxhbmFyICovCi0gICAgTTRWUFBfa0lZVVlWLCAgICAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgbHVtYSBmaXJzdCAqLwotICAgIE00VlBQX2tJVVlWWSwgICAgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGNocm9tYSBmaXJzdCAqLwotICAgIE00VlBQX2tJSlBFRywgICAgICAgIC8qKjwgSlBFRyBjb21wcmVzc2VkIGZyYW1lcyAqLwotICAgIE00VlBQX2tJUkdCNDQ0LCAgICAgICAgLyoqPCBSR0IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00VlBQX2tJUkdCNTU1LCAgICAgICAgLyoqPCBSR0IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00VlBQX2tJUkdCNTY1LCAgICAgICAgLyoqPCBSR0IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00VlBQX2tJUkdCMjQsICAgICAgICAvKio8IFJHQiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRWUFBfa0lSR0IzMiwgICAgICAgIC8qKjwgUkdCIDMyIGJpdHMgICovCi0gICAgTTRWUFBfa0lCR1I0NDQsICAgICAgICAvKio8IEJHUiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRWUFBfa0lCR1I1NTUsICAgICAgICAvKio8IEJHUiAxNSBiaXRzIDU6NTo1ICovCi0gICAgTTRWUFBfa0lCR1I1NjUsICAgICAgICAvKio8IEJHUiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRWUFBfa0lCR1IyNCwgICAgICAgIC8qKjwgQkdSIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNFZQUF9rSUJHUjMyICAgICAgICAvKio8IEJHUiAzMiBiaXRzICAqLwotfSBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFByb3RvdHlwZSBvZiB0aGUgbWFpbiB2aWRlbyBwcmVwcm9jZXNzaW5nIGZ1bmN0aW9uCi0gKiBAbm90ZSAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBWUFAuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00VlBQX2FwcGx5X2ZjdCkgKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2luaXRWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCogcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgZXhlY3V0aW9uIGNvbnRleHQgZm9yIHRoZSBWaWRlbyBQcmVwcm9jZXNzaW5nIGNvbXBvbmVudC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChPVVQpIEV4ZWN1dGlvbiBjb250ZXh0IGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5LgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9pbml0VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfYXBwbHlWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBQcmVwcm9jZXNzIG9uZSBmcmFtZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFBsYW5lSW46ICAgIChJTk9VVCkgICAgSW5wdXQgSW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQ6ICAgIChJTk9VVCkgICAgT3V0cHV0IEltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBQbGFuZUluIG9yIHBQbGFuZU91dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IFZpZGVvIFByZXByb2Nlc3NpbmcgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9hcHBseVZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBtZXRob2QgZnJlZXMgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBjb21wb25lbnQuCi0gKiAgICAgICAgICAgIEFueSBmdXJ0aGVyIHVzYWdlIG9mIHRoZSBjb250ZXh0IHdpbGwgbGVhZCB0byB1bnByZWRpY3RhYmxlIHJlc3VsdC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE5VTEwgKGRlYnVnIG9ubHkpLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZQUF9jbGVhblVwVmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9zZXRWaWRlb1ByZXByb2Nlc3NpbmdNb2RlKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VkVTX0lucHV0VmlkZW9Gb3JtYXQgZm9ybWF0KQotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGFwcGx5IHRoZSB2aWRlbyBwcmVwcm9jZXNzaW5nIHRvIHRoZSBpbnB1dCBwbGFuZS4gUmVzdWx0IGlzIHB1dCBpbnRvIHRoZQotICogICAgICAgICAgIG91dHB1dCBwbGFuLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIGZvcm1hdCAgOiAgICAoSU4pIEZvcm1hdCBvZiBpbnB1dCBwbGFuZSAocmdiLCB5dXYsIC4uLikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfc2V0VmlkZW9QcmVwcm9jZXNzaW5nTW9kZShNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZQUF9JbnB1dFZpZGVvRm9ybWF0IGZvcm1hdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlZmluaXRpb24gb2YgdGhlIGVycm9ycyBzcGVjaWZpYyB0byB0aGlzIG1vZHVsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKjwgSW5wdXQgYW5kIG91dHB1dCBwbGFuZXMgaGF2ZSBpbmNvbXBhdGlibGUgcHJvcGVydGllcyAqLwotI2RlZmluZSBNNFZQUF9FUlJfSU1DT01QQVRJQkxFX0lOX0FORF9PVVRfUExBTkVTICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgIE00UFJFUFJPQ0VTU19WSURFTywgMHgwMDAwMDEpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogTTRWUFBfQVBJX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWJiN2I4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFdSSVRFUl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00V1JJVEVSX2NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVkVTIHdyaXRlcnMgc2hlbGwgaW50ZXJmYWNlLgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHR5cGVzIGludGVybmFsbHkgdXNlZCBieSB0aGUgVkVTIHRvIGFic3RyYWN0IHdyaXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRXUklURVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000V1JJVEVSX0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiICAgLyogZm9yIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIiAgIC8qIGZvciBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqLwotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiICAgICAvKiBmb3IgTTRPU0FfT1BUSU9OX0lEX0NSRUFURSgpICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiICAgICAgIC8qIGZvciBNNFdSSVRFUl9DT01NT04gKi8KLQotI2luY2x1ZGUgIk00U1lTX1N0cmVhbS5oIiAgICAgICAvKiBmb3IgTTRTWVNfU3RyZWFtSUQgKi8KLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiICAgLyogZm9yIE00U1lTX0FjY2Vzc1VuaXQgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00V0FSX1dSSVRFUl9TVE9QX1JFUSAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00V1JJVEVSX0NPTU1PTiAsMHgwMDAwMDEpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIG91dHB1dCBmaWxlIGZvcm1hdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9rVW5rbm93bj0tMSwKLSAgICBNNFdSSVRFUl9rM0dQUD0wLCAgICAgICAgICAgIC8qKjwgM0dQUCBjb21wbGlhbnQgZmlsZSAqLwotICAgIE00V1JJVEVSX2tBVkk9MSwgICAgICAgICAgICAvKio8IEFWSSBmaWxlICovCi0gICAgTTRXUklURVJfa0FNUj0yLCAgICAgICAgICAgIC8qKjwgQU1SIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rTkVUV09SSzNHUFA9MywgICAgLyoqPCAzR1BQIHZpYSBUQ1AgKi8KLSAgICBNNFdSSVRFUl9rUENNPTQsICAgICAgICAgICAgLyoqPCBQQ00gZmlsZSAqLwotICAgIE00V1JJVEVSX2tKUEVHPTUsICAgICAgICAgICAgLyoqPCBKUEVHIEVYSUYgd3JpdGVyICovCi0gICAgTTRXUklURVJfa01QMz02LCAgICAgICAgICAgIC8qKjwgTVAzIHdyaXRlciAqLwotCi0gICAgTTRXUklURVJfa1R5cGVfTkIgIC8qIG51bWJlciBvZiB3cml0ZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00V1JJVEVSX091dHB1dEZpbGVUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgTTRXUklURVJfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW1zIGRlZmluZXMgYWxsIGF2YWxhaWJsZSBvcHRpb25zLiBBbGwgdGhlIHJldXR1cm5lZCB2YWx1ZXMgYXJlIGluCi0gKiAgICAgICAgICAgTTRPU0FfVUludDMyIHR5cGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFdSSVRFUl9rTWF4QVVTaXplICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUR8TTRfV1JJVEUsIE00V1JJVEVSX0NPTU1PTiwgMHgwMSksCi0gICAgTTRXUklURVJfa01heENodW5ja1NpemUgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEfE00X1dSSVRFLCBNNFdSSVRFUl9DT01NT04sIDB4MDIpLAotICAgIE00V1JJVEVSX2tGaWxlU2l6ZSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1JFQUQgICAgICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDAzKSwgIC8qKjwgRmlsZSBzaXplIGlmIHRoZSBwcm9jZXNzIHdhcyBlbmRlZCB3aGVuIHdlIGNhbGwgdGhlIG1ldGhvZCAqLwotICAgIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDQpLCAgICAvKio8IEZpbGUgc2l6ZSBpZiB0aGUgcHJvY2VzcyB3YXMgZW5kZWQgd2hlbiB3ZSBjYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZXN0aW1hdGVkIHNpemUgZm9yIGF1ZGlvICovCi0gICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA1KSwgICAgLyoqPCBTdHJpbmcgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZShTVyAtIFZFUykgKi8KLSAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDYpLCAgICAvKio8IFZlcnNpb24gZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgIE00V1JJVEVSX2tJbnRlZ3JhdGlvblRhZyAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNyksICAgIC8qKjwgU3RyaW5nIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKGNoYXJbNjBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlZ3JhdGlvbiBwdXJwb3NlKSAqLwotICAgIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDgpLCAgICAvKio8IE1heGltdW0gZmlsZSBzaXplIGxpbWl0YXRpb24gKi8KLSAgICBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDkpLCAgICAvKio8IE1heGltdW0gZmlsZSBkdXJhdGlvbiBsaW1pdGF0aW9uICovCi0gICAgTTRXUklURVJfa1NldEZ0eXBCb3ggICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBBKSwgICAgLyoqPCBTZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBNNFdSSVRFUl9rTWV0YURhdGEgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQiksICAgIC8qKjwgQWRkaXRpb25uYWwgaW5mb3JtYXRpb24gdG8gc2V0IGluIHRoZSBmaWxlICovCi0gICAgTTRXUklURVJfa0RTSSAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBDKSwgICAgLyoqPCBUbyBzZXQgRFNJIG9mIHRoZSBmaWxlIChEZWNvZGVyIHNwZWNpZmMgaW5mbykgKi8KLSAgICBNNFdSSVRFUl9rSnBlZ1Jlc2VydmVGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEQpLCAgICAvKio8IFJlc2VydmUgc29tZSBzcGFjZSBpbiB0aGUgZmlsZSBmb3IgSlBFRyBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBkYXRhICovCi0gICAgTTRXUklURVJfa0pwZWdTZXRGUERhdGEgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICwgXAotICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEUpLCAgICAvKio8IFdyaXRlIEZhc3QgUHJvY2Vzc2luZyBEYXRhIGluIHRoZSBmaWxlKi8KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotICAgIE00V1JJVEVSX2tNVUxfUFBTX1NQUyAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIE00V1JJVEVSX0NPTU1PTiwgMHgwRikKLSAgICAvKiAtIENSTFY2Nzc1IC1ILjI2NCB0cmltbWluZyAqLwotfSBNNFdSSVRFUl9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9IZWFkZXIKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBidWZmZXIgd2hlcmUgYW4gaGVhZGVyIGlzIHB1dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX01lbUFkZHI4ICAgIHBCdWY7ICAgICAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGhlYWRlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBTaXplOyAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhICovCi19IE00V1JJVEVSX0hlYWRlcjsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgdmlkZW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAqICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgd2lkdGg7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgV2lkdGggKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgZnBzOyAgICAgICAgICAgICAgICAvKio8IFRhcmdldHRlZCBmcmFtZXJhdGUgb2YgdGhlIHZpZGVvICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgb2YgdGhlIHZpZGVvIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIgc2V0IHRvIE5VTEwgaWYgbm8gaGVhZGVyIHByZXNlbnQgKi8KLX0gTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3BlY2lmaWMgYXVkaW8gc3RyZWFtIGluZm9zLCBleHRlbnNpb24gdG8KLSAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iU2FtcGxlc1BlclNlYzsgICAgLyoqPCBOdW1iZXIgb2YgU2FtcGxlcyBwZXIgc2Vjb25kICovCi0gICAgTTRPU0FfVUludDE2ICAgIG5iQml0c1BlclNhbXBsZTsgICAgLyoqPCBOdW1iZXIgb2YgQml0cyBpbiAxIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICBuYkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgTTRXUklURVJfSGVhZGVyICAgIEhlYWRlcjsgICAgICAgICAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlIGF1ZGlvc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyIHNldCB0byBOVUxMIGlmIG5vIERTSSBwcmVzZW50ICovCi19IE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFdSSVRFUl9PcmllbnRhdGlvbgotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBwb3NzaWJsZSBvcmllbnRhdGlvbiBvZiBhIGZyYW1lIGFzIGRlc2NyaWJlZAotICogICAgICAgICAgICBpbiB0aGUgRVhJRiBzdGFuZGFyZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblVua25vd24gPSAwLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uVG9wTGVmdCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblRvcFJpZ2h0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uQm90dG9tUmlnaHQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Cb3R0b21MZWZ0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uTGVmdFRvcCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblJpZ2h0VG9wLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uUmlnaHRCb3R0b20sCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25MZWZ0Qm90dG9tCi19TTRXUklURVJfT3JpZW50YXRpb24gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9NZXRhRGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBtZXRhIGRhdGEgdG8gc3RvcmUgaW4gdGhlIGVuY29kZWQgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBQaG9uZU1hbnVmYWN0dXJlciA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgUGhvbmVNb2RlbCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQXJ0aXN0IDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFNvZnR3YXJlIDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBDcmVhdGlvbkRhdGU7Ci0gICAgTTRXUklURVJfT3JpZW50YXRpb24gICAgT3JpZW50YXRpb24gOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgV2lkdGggOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEhlaWdodCA7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBUaHVtYm5haWxXaWR0aCA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgVGh1bWJuYWlsSGVpZ2h0IDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIFRodW1ibmFpbFByZXNlbmNlIDsKLX1NNFdSSVRFUl9NZXRhRGF0YTsKLQotCi10eXBlZGVmIHZvaWQqIE00V1JJVEVSX0NvbnRleHQ7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9vcGVuV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCogaENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0RmlsZURlc2NyaXB0b3IsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlcixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wRmlsZURlc2NyaXB0b3IsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkZXJQb2ludGVyKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9hZGRTdHJlYW0pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbipzdHJlYW1EZXNjcmlwdGlvbik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfc3RhcnRXcml0aW5nKSAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2Nsb3NlV3JpdGUpICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX3NldE9wdGlvbikgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfZ2V0T3B0aW9uKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRXUklURVJfb3BlbldyaXRlKiAgICAgICAgICAgICBwRmN0T3BlbjsKLSAgICBNNFdSSVRFUl9hZGRTdHJlYW0qICAgICAgICAgICAgICAgIHBGY3RBZGRTdHJlYW07Ci0gICAgTTRXUklURVJfc3RhcnRXcml0aW5nKiAgICAgICAgICBwRmN0U3RhcnRXcml0aW5nOwotICAgIE00V1JJVEVSX2Nsb3NlV3JpdGUqICAgICAgICAgICAgcEZjdENsb3NlV3JpdGU7Ci0gICAgTTRXUklURVJfc2V0T3B0aW9uKiAgICAgICAgICAgICAgICBwRmN0U2V0T3B0aW9uOwotICAgIE00V1JJVEVSX2dldE9wdGlvbiogICAgICAgICAgICAgICAgcEZjdEdldE9wdGlvbjsKLX0gTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlOwotCi10eXBlZGVmIE00T1NBX0VSUiAgTTRXUklURVJfc3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLXR5cGVkZWYgTTRPU0FfRVJSICBNNFdSSVRFUl9wcm9jZXNzQVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UKLSAqIEBicmllZiAgICBEZWZpbmVzIGFsbCB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIHRvIHdyaXRlIGRhdGEgd2l0aCBhIHdyaXRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRXUklURVJfRGF0YUludGVyZmFjZQotewotICAgIE00V1JJVEVSX3N0YXJ0QVUqICAgIHBTdGFydEFVOwotICAgIE00V1JJVEVSX3Byb2Nlc3NBVSogcFByb2Nlc3NBVTsKLQotICAgIE00V1JJVEVSX0NvbnRleHQgICAgcFdyaXRlckNvbnRleHQ7Ci0KLX0gTTRXUklURVJfRGF0YUludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFdSSVRFUl9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg3NTQ1OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9CaXRTdHJlYW1QYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9CaXRTdHJlYW1QYXJzZXIuaAotICogQGJyaWVmICBNUEVHLTQgRmlsZSBGb3JtYXQgYml0IHN0cmVhbSB1dGlsaXR5Ci0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIHRvIHBhcnNlIE1QRUcgc3BlY2lmaWMKLSAqICAgICAgICAgZGF0YSBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fCi0jZGVmaW5lIF9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9Jbml0LgotKgotKiBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgYW5kIGluaXRpYWxpemVzIGludGVybmFsIGRhdGEKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlIC0gQUxMT0NBVEVEIEJZIFRIRQotKiAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04gKE00T1NBX05VTEwgaWYgYWxsb2NhdGlvbiBmYWlscykKLSogQHBhcmFtIGJpdFN0cmVhbSAgOiBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSAtIG11c3QgYmUgMzIgYml0cyBhcyBhY2Nlc3MgYXJlIDMyIGJpdHMKLSogQHBhcmFtIHNpemUgICAgICAgIDogVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX0luaXQodm9pZCoqIHBDb250ZXh0LCB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYW4gdXAgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9DbGVhblVwKHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBsZW5ndGggICAgICAgIChJTikgVGhlIG51bWJlciBvZiBiaXRzIHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiBAcmV0dXJuICAgIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX1Nob3dCaXRzKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbmNyZW1lbnQgdGhlIGJpdHN0cmVhbSBwb2ludGVyIG9mIDxsZW5ndGg+IGJpdHMuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9GbHVzaEJpdHModm9pZCogcENvbnRleHQsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBwb2ludGVkIGJ5IHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEl0IGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSAqIEBwYXJhbSBsZW5ndGggICAgICAgIDogVGhlIG51bWJlciBvZiBiaXQgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBAcmV0dXJucyB0aGUgcmVhZCBiaXRzCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRCaXRzKHZvaWQqIHBDb250ZXh0LE00T1NBX0ludDMyIGJpdFBvcywgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0qIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0IHJlc2V0cyB0aGUgYml0c3RyZWFtIGluZGV4ZXMuCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKi8KLXZvaWQgTTRfQml0U3RyZWFtUGFyc2VyX1Jlc3RhcnQodm9pZCogcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcmV0dXJucyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqIEBub3RlICAgIEl0IHNob3VsZCBiZSB1c2VkIGNhcmVmdWxseSBhcyB0aGUgcG9pbnRlciBpcyBpbiB0aGUgYml0c3RyZWFtIGl0c2VsZgotICogICAgICAgICAgICBhbmQgbm8gY29weSBpcyBtYWRlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSovCi1NNE9TQV9VSW50OCogIE00X0JpdFN0cmVhbVBhcnNlcl9HZXRDdXJyZW50Yml0U3RyZWFtUG9pbnRlcih2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSBnZXRzIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qCi0qIEByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSovCi1NNE9TQV9JbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCk7Ci0KLXZvaWQgTTRfTVBFRzRCaXRTdHJlYW1QYXJzZXJfSW5pdCh2b2lkKiogcENvbnRleHQsIHZvaWQqIHBCaXRTdHJlYW0sIE00T1NBX0ludDMyIHNpemUpOwotCi0vKioKLSogZ2V0TXBlZ0xlbmd0aEZyb21JbnRlZ2VyIHJldHVybnMgYSBkZWNvZGVkIHNpemUgdmFsdWUgZnJvbSBhbiBlbmNvZGVkIG9uZSAoU0RMKQotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSogQHBhcmFtIHZhbCA6IGVuY29kZWQgdmFsdWUKLSoKLSogQHJldHVybnMgc2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSovCi0KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwgTTRPU0FfVUludDMyIHZhbCk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVjb2RlIGFuIE1QRUc0IFN5c3RlbXMgZGVzY3JpcHRvciBzaXplIGZyb20gYW4gZW5jb2RlZCBTREwgc2l6ZSBkYXRhLgotICogQG5vdGUgICAgVGhlIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY3VycmVudCBiaXRzdHJlYW0gbG9jYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiAgICBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0ludDMyIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0dldE1wZWdMZW5ndGhGcm9tU3RyZWFtKHZvaWQqIHBDb250ZXh0KTsKLQotI2VuZGlmIC8qX19NNF9CSVRTVFJFQU1QQVJTRVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzYwYTdkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNF9Db21tb24uaAotICogQGJyaWVmICBDb21tb24gZGF0YSBzdHJ1Y3R1cmUgYmV0d2VlbiBzaGVsbHMKLSAqIEBub3RlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000X0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNF9DT01NT05fSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBfcGFyYW1ldGVyU2V0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgYXZjCi0gKiAgICAgICAgICAgICAgIGRlY29kZXIgc3BlY2lmaWMgaW5mbwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfcGFyYW1ldGVyU2V0Ci17Ci0gICAgTTRPU0FfVUludDE2IG1fbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMqLwotICAgIE00T1NBX1VJbnQ4KiBtX3BQYXJhbWV0ZXJTZXRVbml0OyAgIC8qIEFycmF5IG9mIGl0ZW1zKi8KLX0gUGFyYW1ldGVyU2V0IDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX2F2Y1NwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2Ygc3BlY2lmaWMgaW5mbyBmb3IgdGhlIGF2YyBkZWNvZGVyCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9hdmNTcGVjaWZpY0luZm8KLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9uYWxVbml0TGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIE5BTFVuaXRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIGEgQVZDIHNhbXBsZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyAgIC8qIE51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsgICAgLyogTnVtYmVyIG9mIHBpY3R1cmUgcGFyYW1ldGVyIHNldHMqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ7ICAgICAgICAvKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi0gICAgUGFyYW1ldGVyU2V0ICAgICptX3BQaWN0dXJlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogUGljdHVyZSBwYXJhbWV0ZXIgc2V0cyBhcnJheSovCi19IEF2Y1NwZWNpZmljSW5mbyA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1N5bnRoZXNpc0F1ZGlvSW5mbwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBzcGVjaWZpYyBwb2ludGVycyB1c2VkIGZvciBzeW50aGVzaXMgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3N5bnRoZXNpc0F1ZGlvSW5mbwotewotICAgIE00T1NBX1ZvaWQqICAgICAgICBtX3BJbnB1dEJ1ZjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRJbmZvOwotICAgIE00T1NBX1VJbnQxNiAgICBtX3VpTmJTdWJGcmFtZVBlclN0ZXA7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fdWlVc2VkQnl0ZXM7Ci19IE00X1N5bnRoZXNpc0F1ZGlvSW5mbzsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIHN0YXRlcyBtb2RlcyBmb3IgRG93biBzYW1wbGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIEFBQ19rRFNfT0ZGICAgID0gMCwgICAgICAgIC8qKjwgTm8gRG93biBzYW1wbGluZyAqLwotICAgIEFBQ19rRFNfQllfMiAgID0gMSwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gQUFDIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLzIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgPSBIRV9BQUMgYW5kIGlucHV0IGlzIEFBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IHNhbXBsaW5nIHJhdGUgPSBhYWNfc2FtcF9mcmVxLihObyBkb3duc2FtcGluZykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBIRV9BQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcSAoRG93bnNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycyBpbiBTQlIgdG9vbCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHByb2ZpbGUgPSBIRV9BQUNfdjIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkICovCi0gICAgQUFDX2tEU19CWV8zICAgPSAyLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDMgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzQgICA9IDMsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgNCAgLSBvbmx5IGZvciBBQUMgcHJvZmlsZSAqLwotICAgIEFBQ19rRFNfQllfOCAgID0gNCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDggIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLQotfSBNNF9BQUNEb3duc2FtcGxpbmdNb2RlOwotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNF9BQUNPdXRwdXRNb2RlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3V0cHV0IG1vZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa01vbm8gICAgICA9IDAsICAgIC8qKjwgT3V0cHV0IGlzIE1vbm8gICovCi0gICAgQUFDX2tTdGVyZW8gICAgPSAxICAgICAvKio8IE91dHB1dCBpcyBTdGVyZW8gKi8KLX0gTTRfQUFDT3V0cHV0TW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDRGVjUHJvZmlsZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFBQyBkZWNvZGVyIHByb2ZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0FBQyAgICAgICA9IDAsICAgICAgICAvKio8IEFBQyBwcm9maWxlIChvbmx5IEFBQyBMQyBvYmplY3QgYXJlIHN1cHBvcnRlZCkgKi8KLSAgICBBQUNfa0hFX0FBQyAgICA9IDEsICAgICAgICAvKio8IEhFIEFBQyBvciBBQUMrIHByb2ZpbGUgKFNCUiBpbiBMUCBNb2RlKSAgKi8KLSAgICBBQUNfa0hFX0FBQ192MiA9IDIgICAgICAgIC8qKjwgSEUgQUFDIHYyIG9yIEVuaGFuY2VkIEFBQysgcHJvZmlsZSAoU0JSIFRvb2wgaW4gSFEgTW9kZSkgKi8KLX0gTTRfQUFDRGVjUHJvZmlsZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9BYWNEZWNvZGVyQ29uZmlnCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3BlY2lmaWMgc2V0dGluZ3MgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgICAgICB0aGUgdXNlciByZXF1aXJlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X0FBQ0RlY1Byb2ZpbGUgICAgICAgIG1fQUFDRGVjb2RlclByb2ZpbGU7Ci0gICAgTTRfQUFDRG93bnNhbXBsaW5nTW9kZSAgICBtX0Rvd25TYW1wbGluZ01vZGU7Ci0gICAgTTRfQUFDT3V0cHV0TW9kZSAgICAgICAgbV9PdXRwdXRNb2RlOwotCi19IE00X0FhY0RlY29kZXJDb25maWc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHVzZXIncyBkYXRhIG5lZWRlZCB0byBkZWNvZGUgdGhlCi0gKiAgICAgICAgICAgIEFBQ3BsdXMgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGUgZmllbGQgbV9wRmlyc3RBVSBpcyB1c2VkIGluIGNhc2Ugb2YgbG9jYWwgZmlsZXMgICAgYW5kCi0gKiAgICAgICAgICAgIHRoZSBmaWVsZCBtX2JJc1NickVuYWJsZWQgaXMgdXNlZCBpbiBzdHJlYW1pbmcgY2FzZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcEZpcnN0QVU7ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZpcnN0IEFVIGZyb20gd2hlcmUgU0JSIGRhdGEgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgKGxvY2FsIGZpbGUgY2FzZSkqLwotICBNNE9TQV9Cb29sICAgICAgICAgICAgbV9iSXNTYnJFbmFibGVkOyAgICAgICAgLyoqPCBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgdGhlIHN0cmVhbSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBQ3BsdXMgKHN0cmVhbWluZyBjYXNlKSovCi0gIE00X0FhY0RlY29kZXJDb25maWcqICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnOy8qKjwgRGVjb2RlciBzcGVjaWZpYyB1c2VyIHNldHRpbmcgKi8KLQotfSBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhOwotCi0jZW5kaWYgLyogX19NNF9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExZTA4MjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNF9VdGlscy5oCi0gKiBAYnJpZWYgICAgVXRpbGl0aWVzCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB1dGlsaXR5IG1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9VVElMU19IX18KLSNkZWZpbmUgX19NNF9VVElMU19IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiAgICBNNF9NZWRpYVRpbWUgZGVmaW5pdGlvbgotICAgIFRoaXMgdHlwZSBpcyB1c2VkIGludGVybmFsbHkgYnkgc29tZSBzaGVsbCBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLXR5cGVkZWYgTTRPU0FfRG91YmxlICAgIE00X01lZGlhVGltZTsKLQotLyogICAgR0VUX01FTU9SWTMyIG1hY3JvIGRlZmluaXRpb24KLSAgICBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgdGhlIDNHUCByZWFkZXIqLwotI2lmZGVmIF9fQklHX0VORElBTgotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKHgpCi0jZWxzZQotI2RlZmluZSBHRVRfTUVNT1JZMzIoeCkgKCAoKCh4KSYweGZmKTw8MjQpIHwgKCgoeCkmMHhmZjAwKTw8OCkgfFwKLSAgICAgKCgoeCkmMHhmZjAwMDApPj44KSB8ICgoKHgpJjB4ZmYwMDAwMDApPj4yNCkgKQotI2VuZGlmIC8qX19CSUdfRU5ESUFOKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRfVVRJTFNfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU3ZDAzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9WaWRlb0VkaXRpbmdDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKLSAqIEBicmllZiAgICBWaWRlbyBFZGl0aW5nIChWU1MzR1BQLCBNQ1MsIFBUTzNHUFApIGNvbW1vbiBkZWZpbml0aW9ucwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgVmVyc2lvbiAqLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICAgIDMKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAgICAxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04gICAgMAotCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRSAweDdmZmZmZmZmCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUwgMHg3ZmZmZmZmZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGZpbGUgZm9ybWF0IHR5cGUgdG8gYmUgdXNlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAgICAgICAgID0gMCwgICAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgJiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICAgICAgICAgPSAxLCAgICAgIC8qKjwgTVA0ICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICAgICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgICAgICAgICA9IDIsICAgICAgLyoqPCBBTVIgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyAgICAgICAgID0gMywgICAgICAvKio8IE1QMyAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNICAgICAgICAgPSA0LCAgICAgIC8qKjwgUENNIFJBVyBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAgICBSQyAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcgICAgICAgICA9IDUsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEpQRyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBBTkQgT1VUUFVUICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCAgICAgICAgID0gNiwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQk1QIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfR0lGICAgICAgICAgPSA3LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBHSUYgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcgICAgICAgICA9IDgsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IFBORyBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ICAgID0gOSwgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogQVJHQjg4ODggZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYgICAgICAgICA9IDEwLCAgICAgLyoqPCBNNFYgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkID0gMjU1ICAgICAvKio8IFVuc3VwcG9ydGVkIGZpbGUgbWVkaWEgdHlwZSAgICAgICAgICAgKi8KLX0gTTRWSURFT0VESVRJTkdfRmlsZVR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvID0gMCwgLyoqPCBWaWRlbyBub3QgcHJlc2VudCAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjYzID0gMSwgLyoqPCBIMjYzIHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0gyNjQgPSAyLCAgICAvKio8IEgyNjQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTVBFRzQgPSAzLCAvKio8IE1QRUctNCB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPSAyNTQsICAvKio8IERvIG5vdCBjYXJlIHZpZGVvIHR5cGUsIHVzZSBOVUxMIGVuY29kZXIgKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbyA9IDI1NSAgICAvKio8IFVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSB0eXBlICovCi19IE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBhdWRpbyBmb3JtYXQuCi0gKiBAbm90ZSAgICBIRV9BQUMsIEhFX0FBQ192MiBhbmQgTVAzIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gICAgICAgICAgICA9IDAsICAgIC8qKjwgQXVkaW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rQU1SX05CICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQU1SIE5hcnJvdyBCYW5kIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FBQyAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEFBQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICAgICAgICAgICAgID0gNCwgICAgLyoqPCBFbmhhbmNlZCBBQUMrIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QMyAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tFVlJDICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFVlJDIGF1ZGlvICovCi0gICAgTTRWSURFT0VESVRJTkdfa1BDTSAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFBDTSBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8gICAgICAgICAgID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSBhdWRpbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW8gICAgPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgb3V0cHV0IGZyYW1lIHNpemVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tTUUNJRj0wLCAvKio8IFNRQ0lGIDEyOHg5NiAgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVFWR0EsICAgLyoqPCBRUVZHQSAxNjB4MTIwICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FDSUYsICAgIC8qKjwgUUNJRiAgMTc2eDE0NCAqLwotICAgIE00VklERU9FRElUSU5HX2tRVkdBLCAgICAvKio8IFFWR0EgIDMyMHgyNDAgKi8KLSAgICBNNFZJREVPRURJVElOR19rQ0lGLCAgICAgLyoqPCBDSUYgICAzNTJ4Mjg4ICovCi0gICAgTTRWSURFT0VESVRJTkdfa1ZHQSwgICAgIC8qKjwgVkdBICAgNjQweDQ4MCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00VklERU9FRElUSU5HX2tXVkdBLCAgICAvKio8IFdWR0EgODAweDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2tOVFNDLCAgICAvKio8IE5UU0MgNzIweDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRWSURFT0VESVRJTkdfazY0MF8zNjAsICAvKio8IDY0MHgzNjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rODU0XzQ4MCwgIC8qKjwgODU0eDQ4MCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMjgwXzcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazEwODBfNzIwLCAvKio8IDcyMHAgMTA4MHg3MjAgKi8KLSAgICBNNFZJREVPRURJVElOR19rOTYwXzcyMCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCAvKio8MTA4MHAgMTkyMHgxMDgwKi8KLS8qIC1DUiBHb29nbGUgKi8KLQotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvZnJhbWVyYXRlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2aWRlbyBmcmFtZXJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2s1X0ZQUyA9IDAsCi0gICAgTTRWSURFT0VESVRJTkdfazdfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMTJfNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjBfRlBTLAotICAgIE00VklERU9FRElUSU5HX2syNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazMwX0ZQUwotfSBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY2llcwotICogQG5vdGUgICAgOCBrSHogaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGZyZXF1ZW5jeSBmb3IgQU1SLU5CIG91dHB1dAotICogQG5vdGUgICAgMTYga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFBQyBvdXRwdXQKLSAqIEBub3RlICAgIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0byB1c2UgdGhlIERlZmF1bHQgdmFsdWUgd2hlbiBzZXR0aW5nIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0YgICAgPSAwLCAgICAvKio8IERlZmF1bHQgQXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvciBzZWxlY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIG91dHB1dCBmb3JtYXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rODAwMF9BU0YgICAgPSA4MDAwLCAgICAvKio8IE5vdGU6IERlZmF1bHQgYXVkaW8gU2FtcGxpbmcgRnJlcXVlbmN5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUi1OQiBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGICAgID0gMTEwMjUsCi0gICAgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRiAgICA9IDEyMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0YgICAgPSAxNjAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQUFDIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2syMjA1MF9BU0YgICAgPSAyMjA1MCwKLSAgICBNNFZJREVPRURJVElOR19rMjQwMDBfQVNGICAgID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMDAwX0FTRiAgICA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0YgICAgPSA0NDEwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGICAgID0gNDgwMDAKLQotfSBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgYXVkaW8gb3IgdmlkZW8gYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa1ZBUklBQkxFX0tCUFMgPSAtMSwgICAgIC8qIG5vIHJlZ3VsYXRpb24gKi8KLSAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSA9IDAsICAgLyogdW5kZWZpbmVkICovCi0gICAgTTRWSURFT0VESVRJTkdfazhfS0JQUyA9IDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTID0gOTIwMCwgICAgICAgIC8qIGV2cmMgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgPSAxMjIwMCwgICAgICAvKiBhbXIgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2sxNl9LQlBTID0gMTYwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0X0tCUFMgPSAyNDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUyA9IDMyMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0MF9LQlBTID0gNDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4X0tCUFMgPSA0ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTZfS0JQUyA9IDU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTID0gNjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwX0tCUFMgPSA4MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOTZfS0JQUyA9IDk2MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxMTJfS0JQUyA9IDExMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazE2MF9LQlBTID0gMTYwMDAwLAotICAgIE00VklERU9FRElUSU5HX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjI0X0tCUFMgPSAyMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syODhfS0JQUyA9IDI4ODAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMzIwX0tCUFMgPSAzMjAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTID0gMzg0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMgPSA4MDAwMDAsCi0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICBNNFZJREVPRURJVElOR19rMl9NQlBTID0gMjAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNV9NQlBTID0gNTAwMDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rOF9NQlBTID0gODAwMDAwMCwKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotfSBNNFZJREVPRURJVElOR19CaXRyYXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VklERU9FRElUSU5HX0Z0eXBCb3gKLSAqIEBicmllZiAgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgICAgLyogZ2VuZXJhbGx5ICczZ3A0JyAgICAgICAgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgIG1pbm9yX3ZlcnNpb247ICAgICAgICAgLyogZ2VuZXJhbGx5ICcwMDAwJyBvciAneC54ICcgICovCi0gICAgTTRPU0FfVUludDMyICAgIG5iQ29tcGF0aWJsZUJyYW5kczsgICAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000VklERU9FRElUSU5HX01BWF9DT01QQVRJQkxFX0JSQU5EU107IC8qIGFycmF5IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGNvbXBhdGlibGUgYnJhbmRzICovCi0KLX0gTTRWSURFT0VESVRJTkdfRnR5cEJveDsKLQotLyogU29tZSB1c2VmdWwgYnJhbmRzICovCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzAwMDAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0cyQSAgMHgzMzY3MzI2MQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A0ICAweDMzNjc3MDM0Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDUgIDB4MzM2NzcwMzUKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNiAgMHgzMzY3NzAzNgotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9BVkMxICAweDYxNzY2MzMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0VNUCAgIDB4NjU2RDcwMjAKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfSVNPTSAgMHg2OTczNkY2RAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQxICAweDZENzAzNDMxCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX01QNDIgIDB4NkQ3MDM0MzIKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfVkZKMSAgMHg3NjY2NkEzMQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFuIGlucHV0IGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiQW5hbHlzZWQ7ICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgZmlsZSBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gYWxyZWFkeSBhbmFseXNlZCBvciBub3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uWzNdOyAgICAgICAgICAvKio8IFZlcnNpb24gb2YgdGhlIGxpYnJhcmllcyB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBjbGlwIGFuYWx5c2lzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwRHVyYXRpb247ICAgICAgLyoqPCBDbGlwIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgKi8KLSAgICBNNFZJREVPRURJVElOR19GdHlwQm94ICAgICAgICAgICAgICBmdHlwOyAgICAgICAgICAgICAgICAvKio8IDNncCAnZnR5cCcgYXRvbSwgbWFqb3JfYnJhbmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdCB1c2VkICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKio8IFZpZGVvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgICAvKio8IFZpZGVvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgLyoqPCBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAvKio8IFZpZGVvIGZyYW1lIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgLyoqPCBWaWRlbyBmcmFtZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAvKio8IFZpZGVvIHRpbWUgc2NhbGUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICBmQXZlcmFnZUZyYW1lUmF0ZTsgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX0ludDMyIHVpVmlkZW9MZXZlbDsgICAvKio8IHZpZGVvIGxldmVsKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvUHJvZmlsZTsgLyoqPCB2aWRlbyBwcm9maWxlICovCi0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRkYXRhUGFydGl0aW9uOyAvKio8IE1QRUctNCB1c2VzIGRhdGEgcGFydGl0aW9uaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cnZsYzsgICAgICAgICAgLyoqPCBNUEVHLTQgdXNlcyBSVkxDIHRvb2wgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBiTVBFRzRyZXN5bmNoTWFya2VyOyAvKio8IE1QRUctNCBzdHJlYW0gdXNlcyBSZXN5bmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2VyICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgIC8qKjwgRm9ybWF0IG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb0R1cmF0aW9uOyAvKio8IEF1ZGlvIHRyYWNrIGR1cmF0aW9uIChpbiBtcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgICAvKio8IEF1ZGlvIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYnBzKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQXVkaW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IFNhbXBsaW5nIGF1ZGlvIGZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoODAwMCBmb3IgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5OyAvKio8IEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUMrLCBlQUFDKyBzdHJlYW1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWNvZGVkUGNtU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBkZWNvZGVkIFBDTSBkYXRhICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlZGl0aW5nIGNvbXBhdGliaWxpdHkgY2hhcnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZpZGVvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0VkaXRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RyZWFtIGNhbiBiZSBkZWNvZGVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUtZW5jb2RlZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgcHJvcGVydGllcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcDsgICAgICAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBtYXRjaCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFN0aWxsIFBpY3R1cmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aVN0aWxsUGljV2lkdGg7ICAgICAgICAvKio8IEltYWdlIHdpZHRoICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY0hlaWdodDsgICAgICAgLyoqPCBJbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2U7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEltYWdlRGF0YTsKLQotICAgIE00T1NBX0ludDMyICAgICB2aWRlb1JvdGF0aW9uRGVncmVlczsgICAgICAgIC8qKjwgVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXM7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YjFjOGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTW9ub1RvMklfMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9NT05PVE8ySV8xNl9IXwotI2RlZmluZSBfTU9OT1RPMklfMTZfSF8KLQotCi12b2lkIE1vbm9UbzJJXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmICAvKiBfTU9OT1RPMklfMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMWI2MmUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFQURFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5hbXIgZmlsZXMgKi8KLQotLyogLS0tLS0gM0dQUCAgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDQsIC4zZ3AgZmlsZXMgKi8KLQotCi0vKiAtLS0tLSBNUDMgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5tcDMgZmlsZXMgKi8KLQotLyogLS0tLS0gUkFXIHJlYWRlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCAucGNtIGZpbGVzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogREVDT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSAgQU1SIE5CIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQU1SIE5CIHN0cmVhbXMgKi8KLQotLyogLS0tLS0gQUFDIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgQUFDLCBBQUMrIGFuZCBlQUFDKyBzdHJlYW1zICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfVklERUNfTlVMTAotCi0vKiAtLS0tLSBNUDQvSDI2MyB2aWRlbyBkZWNvZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IG1wZWc0IGFuZCBIMjYzIGRlY29kZXJzICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUAotI2RlZmluZSBHRVRfREVDT0RFUl9DT05GSUdfSU5GTwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgICAgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IEgyNjQgZGVjb2RlcnMgKi8KLQotLyogLS0tLS0gTVAzIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBNUDMgZGVjb2RlcnMgKi8KLQotCi0vKiAtLS0tLSBOVUxMIGRlY29kZXIgc3VwcG9ydC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAgICAgICAgLyoqIFtkZWZhdWx0XSBTdXBwb3J0IFBDTSByZWFkaW5nICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXUklURVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotCi0vKiAtLS0tLSAzZ3Agd3JpdGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNhcHN1bGF0aW5nIGluIDNncCBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthbXIsYWFjfSB4IHttcGVnNCxoMjYzfSAqLwotCi0KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVOQ09ERVJTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gbXBlZzQgJiBoMjYzIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0ICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY29kaW5nIGluIG1wZWc0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2MyBmb3JtYXQge3l1dixyZ2J9ICovCi0KLS8qIC0tLS0tIGgyNjQgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0KLS8qIC0tLS0tIGFtciBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYW1yIDEyLjIgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0vKiAtLS0tLSBhYWMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQUFDICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gYWFjIGZvcm1hdCB7YW1yLHdhdn0gKi8KLQotCi0vKiAtLS0tLSBtcDMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVAzICAgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXAzIGZvcm1hdCB7bXAzfSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRUFUVVJFUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tIFZTUzNHUFAgJiB4VlNTIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMgLyoqPCBbZGVmYXVsdF0gaWYgZGVmaW5lZCwgaW1wbGVtZW50YXRpb24gaXMgeFZTUyBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIFZTUzNHUFAgKi8KLQotLyogLS0tLS0gU1BTIC0tLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0vLyNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgR0lGIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0pQRUdfTk9UX1NVUFBPUlRFRCAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEpQRUcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgUE5HIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19XQk1QX05PVF9TVVBQT1JURUQgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFdCTVAgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgTTRTUFNfR0lGX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfUE5HX05PVF9TVVBQT1JURUQgICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19CR1I1NjVfQ09MT1JfT1VUUFVUIC8qKjwgW29wdGlvbl0gb3V0cHV0IGluIHN0aWxsIHBpY3R1cmUgYXBpIGlzIEJHUjU2NQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IEJHUjI0KSAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfTUNTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjFjZmNmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1NTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICBQcm9qZWN0OjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICVuYW1lOiAgICAgICAgICBTU1JDLmggJSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgICBUaGUgaW5wdXQgYW5kIG91dHB1dCBibG9ja3Mgb2YgdGhlIFNSQyBhcmUgYnkgZGVmYXVsdCBibG9ja3Mgb2YgNDAgbXMuICBUaGlzIG1lYW5zIHRoYXQKLSAgICB0aGUgZm9sbG93aW5nIGRlZmF1bHQgYmxvY2sgc2l6ZXMgYXJlIHVzZWQ6Ci0KLSAgICAgICAgICBGcyAgICAgRGVmYXVsdCBCbG9jayBzaXplCi0gICAgICAgIC0tLS0tICAgICAgICAtLS0tLS0tLS0tCi0gICAgICAgICA4MDAwICAgICAgICAgICAzMjAKLSAgICAgICAgMTEwMjUgICAgICAgICAgIDQ0MQotICAgICAgICAxMjAwMCAgICAgICAgICAgNDgwCi0gICAgICAgIDE2MDAwICAgICAgICAgICA2NDAKLSAgICAgICAgMjIwNTAgICAgICAgICAgIDg4MgotICAgICAgICAyNDAwMCAgICAgICAgICAgOTYwCi0gICAgICAgIDMyMDAwICAgICAgICAgIDEyODAKLSAgICAgICAgNDQxMDAgICAgICAgICAgMTc2NAotICAgICAgICA0ODAwMCAgICAgICAgICAxOTIwCi0KLSAgICBBbiBBUEkgaXMgcHJvdmlkZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaW50byBhbnkgbXVsdGlwbGUgb2YgdGhlIG1pbmltYWwKLSAgICBibG9jayBzaXplLgotCi0gICAgQWxsIHRoZSBzYW1wbGluZyByYXRlcyBhYm92ZSBhcmUgc3VwcG9ydGVkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotKi8KLQotI2lmbmRlZiBfX1NTUkNfSF9fCi0jZGVmaW5lIF9fU1NSQ19IX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNTUkNfSU5TVEFOQ0VfU0laRSAgICAgICAgICA1NDgKLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9BTElHTk1FTlQgICAgIDQKLSNkZWZpbmUgU1NSQ19TQ1JBVENIX0FMSUdOTUVOVCAgICAgIDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgU1NSQ19PSyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBTU1JDX0lOVkFMSURfRlMgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAvKiBUaGUgaW5wdXQgb3IgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgICAgPSAyLCAgICAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBlcXVhbCB0byBtb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdGVyZW8gKi8KLSAgICBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAvKiBPbmUgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIE5VTEwgKi8KLSAgICBTU1JDX1dST05HX05SX1NBTVBMRVMgICAgICAgPSA0LCAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgICAgID0gNSwgICAgICAgICAgICAgICAgLyogVGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGFsbGlnbmVkICovCi0gICAgU1NSQ19JTlZBTElEX01PREUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgLyogQSB3cm9uZyB2YWx1ZSBoYXMgYmVlbiB1c2VkIGZvciB0aGUgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgKi8KLSAgICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICAgICAgPSA3LCAgICAgICAgICAgICAgICAvKiBBbiBpbnZhbGlkIChvdXQgb2YgcmFuZ2UpIHZhbHVlIGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIG9uZSBvZiB0aGUgcGFyYW1ldGVycyAqLwotICAgIExWWFhYX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IFNTUkNfUmV0dXJuU3RhdHVzX2VuOwotCi0vKiBJbnN0YW5jZSBtZW1vcnkgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2UgWyBTU1JDX0lOU1RBTkNFX1NJWkUvNCBdOwotfSBTU1JDX0luc3RhbmNlX3Q7Ci0KLS8qIFNjcmF0Y2ggbWVtb3J5ICovCi10eXBlZGVmIExWTV9JTlQzMiBTU1JDX1NjcmF0Y2hfdDsKLQotLyogTnViZXIgb2Ygc2FtcGxlcyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX05SX1NBTVBMRVNfREVGQVVMVCAgICAgPSAwLAotICAgIFNTUkNfTlJfU0FNUExFU19NSU4gICAgICAgICA9IDEsCi0gICAgU1NSQ19OUl9TQU1QTEVTX0RVTU1ZICAgICAgID0gTFZNX01BWEVOVU0KLX0gU1NSQ19OUl9TQU1QTEVTX01PREVfZW47Ci0KLS8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX0luOwotICAgIExWTV9Gc19lbiAgICAgICAgICAgU1NSQ19Gc19PdXQ7Ci0gICAgTFZNX0Zvcm1hdF9lbiAgICAgICBTU1JDX05yT2ZDaGFubmVsczsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE5yU2FtcGxlc0luOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzT3V0OwotfSBTU1JDX1BhcmFtc190OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBQUk9UT1RZUEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfR2V0TnJTYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAob3Igc2FtcGxlIHBhaXJzIGZvciBzdGVyZW8pIHRvIGJlICAgICovCi0vKiAgdXNlZCBhcyBpbnB1dCBhbmQgYXMgb3V0cHV0IG9mIHRoZSBTU1JDIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kZSAgICAgICAgICAgICAgICAgICAgVGhlcmUgYXJlIHR3byBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfREVGQVVMVC4gIEluIHRoaXMgbW9kZSwgdGhlIGZ1bmN0aW9uICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgNDAgbXMgYmxvY2tzICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NSQ19OUl9TQU1QRUxTX01JTiB3aWxsIHJldHVybiB0aGUgbWluaW1hbCBudW1iZXIgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBzYW1wbGVzIHRoYXQgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNvbnZlcnNpb24gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvLiAgRWFjaCBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoaXMgcmF0aW8gd2lsbCAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYWNjZXB0ZWQgYnkgdGhlIFNTUkNfSW5pdCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX0ZTICAgICAgICAgV2hlbiB0aGUgcmVxdWVzdGVkIGlucHV0IG9yIG91dHB1dCBzYW1wbGluZyByYXRlcyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyBXaGVuIHRoZSBjaGFubmVsIGZvcm1hdCBpcyBub3QgZXF1YWwgdG8gTFZNX01PTk8gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTFZNX1NURVJFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX1BhcmFtcyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdoZW4gTW9kZSBpcyBub3QgYSB2YWxpZCBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX0dldE5yU2FtcGxlcyggU1NSQ19OUl9TQU1QTEVTX01PREVfZW4gIE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19QYXJhbXNfdCogICAgICAgICAgIHBTU1JDX1BhcmFtcyApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXRTY3JhdGNoU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHNjcmF0Y2ggc2l6ZSBmb3IgYSBnaXZlbiBjb252ZXJzaW9uIHJhdGlvIGFuZCAgICAgICAgICAgKi8KLS8qICBmb3IgZ2l2ZW4gYnVmZmVyIHNpemVzIGF0IHRoZSBpbnB1dCBhbmQgYXQgdGhlIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19QYXJhbXMgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTY3JhdGNoU2l6ZSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggc2l6ZS4gIFRoZSBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBmaWxsIGluIHRoZSBjb3JyZWN0IHZhbHVlIChpbiBieXRlcykuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZnVuY3Rpb24gY2FsbCBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0U2NyYXRjaFNpemUoICAgU1NSQ19QYXJhbXNfdCogICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIqICAgICAgICBwU2NyYXRjaFNpemUgKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTU1JDIG1vZHVsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0luc3RhbmNlICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19TY3JhdGNoICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcElucHV0SW5TY3JhdGNoLCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBpbnB1dCBzYW1wbGVzIChlLmcuIHRvIHNhdmUgbWVtb3J5KSAgICAgICAqLwotLyogIHBPdXRwdXRJblNjcmF0Y2ggICAgICAgIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiB0aGUgc2NyYXRjaCBtZW1vcnkgdGhhdCBjYW4gYmUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgb3V0cHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgIFdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciB0aGUgb3V0cHV0ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGluY29ycmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIGFueSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogIFNTUkNfQUxMSU5HTUVOVF9FUlJPUiAgIFdoZW4gdGhlIGluc3RhbmNlIG1lbW9yeSBvciB0aGUgc2NyYXRjaCBtZW1vcnkgaXMgbm90ICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgNCBieXRlcyBhbGxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGluaXQgZnVuY3Rpb24gd2lsbCBjbGVhciB0aGUgaW50ZXJuYWwgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfSW5pdCggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQ19TY3JhdGNoX3QqICBwU1NSQ19TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgIHBTU1JDX1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiogICAgICBwcElucHV0SW5TY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwT3V0cHV0SW5TY3JhdGNoKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFNTUkNfU2V0R2FpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gc2V0cyBoZWFkcm9vbSBnYWluIGFuZCB0aGUgcG9zdCBnYWluIG9mIHRoZSBTU1JDICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJIZWFkcm9vbUdhaW5FbmFibGVkICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgaGVhZHJvb20gZ2FpbiBvZiB0aGUgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1NSQy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OLiAgTFZNX01PREVfT0ZGICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBjYXNlIGl0IGNhbiBiZSBndWFyYW50ZWVkIHRoYXQgdGhlIGlucHV0ICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGlzIGJlbG93IC02ZEIgaW4gYWxsIGNhc2VzICh0aGUgZGVmYXVsdCBoZWFkcm9vbSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgLTYgZEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJPdXRwdXRHYWluRW5hYmxlZCAgICAgIHBhcmFtZXRlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgb3V0cHV0IGdhaW4uICBUaGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyBMVk1fTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE91dHB1dEdhaW4gICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGdhaW4uICBUaGUgb3V0cHV0IGdhaW4gaXMgYSBsaW5lYXIgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiB2YWx1ZS4gMHg3RkZGIGlzIGVxdWFsIHRvICs2IGRCIGFuZCAweDAwMDAgY29ycmVzcG9uZHMgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtaW5mIGRCLiAgQnkgZGVmYXVsdCwgYSAzZEIgZ2FpbiBpcyBhcHBsaWVkLCByZXN1bHRpbmcgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIG92ZXJhbGwgZ2FpbiBvZiAtM2RCICgtNmRCIGhlYWRyb29tICsgM2RCIG91dHB1dCBnYWluKSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfT0sgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBwU1NSQ19JbnN0YW5jZSBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICBXcm9uZyB2YWx1ZSB1c2VkIGZvciB0aGUgYkhlYWRyb29tR2FpbkVuYWJsZWQgb3IgdGhlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX1ZBTFVFICAgICAgV2hlbiBPdXRwdXRHYWluIGlzIG91dCB0byB0aGUgcmFuZ2UgWzA7MzI3NjddICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIFNTUkNfU2V0R2FpbnMgZnVuY3Rpb24gaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkICAgICAgKi8KLS8qICAgICBpbiByYXJlIGNhc2VzLiAgUHJlZmVyYWJseSwgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19TZXRHYWlucyggU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYkhlYWRyb29tR2FpbkVuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTW9kZV9lbiAgICAgIGJPdXRwdXRHYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgT3V0cHV0R2FpbiApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19BdWRpb0luICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvT3V0ICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU1NSQ19PSyAgICAgICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX05VTExfUE9JTlRFUiAgICAgICAgV2hlbiBvbmUgb2YgcFNTUkNfSW5zdGFuY2UsIHBTU1JDX0F1ZGlvSW4gb3IgcFNTUkNfQXVkaW9PdXQgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfUHJvY2VzcyggIFNTUkNfSW5zdGFuY2VfdCogcFNTUkNfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqICAgICAgIHBTU1JDX0F1ZGlvT3V0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAvKiBfX1NTUkNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvVmlkZW9FZGl0b3JSZXNhbXBsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg0OTdkMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVklERU9FRElUT1JSRVNBTVBMRVJfSAotI2RlZmluZSBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1NNE9TQV9Db250ZXh0IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpOwotdm9pZCBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKTsKLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSA7Ci12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KTsKLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLQotdm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IE00T1NBX0ludDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiBuKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogVklERU9FRElUT1JSRVNBTVBMRVJfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL21hcmtlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzY2FkZTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvbWFya2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgTUFSS0VSX0gKLSNkZWZpbmUgTUFSS0VSX0gKLQotI2RlZmluZSBBRERfQ09ERV9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjQzXG5cdCIgICAgICAvKiAnX19fQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBBRERfVEVYVF9NQVJLRVJfRlVOKG1fY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggIShtX2NvbmRpdGlvbikgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDIxNjE0MDYyXG5cdCIgICAgICAvKiAnIWFAYicgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDQ3NzEyNTQzXG5cdCIgICAgICAvKiAnR3ElQycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjU0XG5cdCIgICAgICAvKiAnX19fVCcgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDVGNUY1RjVGXG5cdCIgICAgICAvKiAnX19fXycgKi8gICAgXAotICAgICAgICAgICAgIi53b3JkICAgICAweDI0NUY1RjVGIiAgICAgICAgICAvKiAnJF9fXycgKi8gICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000RVhJRkNfQ29tbW9uQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyM2MwMmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEVYSUZDX0NvbW1vbkFQSS5oCi0gKiBAYnJpZWYgICAgRVhJRiBjb21tb24gZGF0YSBoZWFkZXIKLSAqIEBub3RlICAgIFRoZSB0eXBlcywgc3RydWN0dXJlcyBhbmQgbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFsbG93IHJlYWRpbmcKLSAqICAgICAgICAgICAgYW5kIHdyaXRpbmcgRVhJRiBKUEVHIGltYWdlcyBjb21wbGlhbnQgc3BlYyBFWElGIDIuMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXwotI2RlZmluZSBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00Q29tbW9uX3R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB0eXBlIE00RVhJRkNfQ29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogICAgTTRFWElGQ19Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEVycm9ycyAmIFdhcm5pbmdzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIE00RVhJRkNfTk9fRVJSICAgICAgICAgICAgICAweDAwMDAwMDAwICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfUEFSQU1FVEVSICAgICAgIDB4MDAwMDAwMDEgICAgLyoqPCBpbnZhbGlkIHBhcmFtZXRlciAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BTExPQyAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKio8IGFsbG9jYXRpb24gZXJyb3IgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQkFEX0NPTlRFWFQgICAgIDB4MDAwMDAwMDMgICAgLyoqPCBpbnZhbGlkIGNvbnRleHQgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfTk9UX0NPTVBMSUFOVCAgIDB4MDAwMDAwMDQgICAgLyoqPCB0aGUgaW1hZ2UgaW4gYnVmZmVyIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUcgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PX0FQUF9GT1VORCAgICAweDAwMDAwMDA1ICAgIC8qKjwgdGhlIEpQRUcgaW1hZ2UgZG9lcyBub3QgY29udGFpbiBhbnkgQVBQMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlmIDIuMiBjb21wbGlhbnQgKi8KLSNkZWZpbmUgTTRFWElGQ19XQVJfTk9fVEhVTUJOQUlMICAgIDB4MDAwMDAwMDYgICAgLyoqPCB0aGUgRXhpZiBwYXJ0IGRvZXMgbm90IGNvbnRhaW4gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9BUFBfVFJVTkNBVEVEICAgMHgwMDAwMDAwNyAgICAvKio8IFRoZSBBUFAxIHNlY3Rpb24gaW4gaW5wdXQgYnVmZmVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb21wbGV0ZSAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00RVhJRkNfQmFzaWNUYWdzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgYmFzaWMgdGFncyB2YWx1ZXMuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBFeGlmIHJlYWRlciBmb2N1c2VzIG9uIGEgc2V0IG9mICJFbnRyeSBUYWdzIi4KLSAqICAgICAgICAgICAgICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nICJFbnRyeSBWYWx1ZXMiIG9mIHRoZXNlIHRhZ3MuCi0gKiAgICAgICAgICAgICAgICBNNEVYSUZDX0NoYXIqIGZpZWxkcyBvZiBzdHJ1Y3R1cmUgYXJlIE51bGwgdGVybWluYXRlZCBTdHJpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8IGltYWdlIHdpZHRoIGluIHBpeGVscyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgLyoqPCBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmNyZWF0aW9uRGF0ZVRpbWU7ICAgICAvKio8IGRhdGUgYW5kIHRpbWUgb3JpZ2luYWwgaW1hZ2Ugd2FzIGdlbmVyYXRlZCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXN0Q2hhbmdlRGF0ZVRpbWU7ICAgLyoqPCBmaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmRlc2NyaXB0aW9uOyAgICAgICAgICAvKio8IGltYWdlIHRpdGxlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1ha2U7ICAgICAgICAgICAgICAgICAvKio8IG1hbnVmYWN0dXJlciBvZiBpbWFnZSBpbnB1dCBlcXVpcG1lbnQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbW9kZWw7ICAgICAgICAgICAgICAgIC8qKjwgbW9kZWwgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKnNvZnR3YXJlOyAgICAgICAgICAgICAvKio8IHNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqYXJ0aXN0OyAgICAgICAgICAgICAgIC8qKjwgcGVyc29uIHdobyBjcmVhdGVkIHRoZSBpbWFnZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjb3B5cmlnaHQ7ICAgICAgICAgICAgLyoqPCBjb3B5cmlnaHQgaG9sZGVyICovCi0gICAgTTRDT01NT05fT3JpZW50YXRpb24gb3JpZW50YXRpb247ICAgICAgICAvKio8IG9yaWVudGF0aW9uIG9mIGltYWdlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgIHRodW1ibmFpbFNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhlIHRodW1ibmFpbCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAqdGh1bWJuYWlsSW1nOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIHRoZSB0aHVtYm5haWwgaW4gbWFpbiBpbWFnZSBidWZmZXIqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpsYXRpdHVkZVJlZjsgICAgICAgICAgLyoqPCBsYXRpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsYXRpdHVkZTsgICAgICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbG9uZ2l0dWRlUmVmOyAgICAgICAgIC8qKjwgbG9uZ2l0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIGxvbmdpdHVkZTsgICAgICAgICAgICAgLyoqPCBsb25naXR1ZGUgKi8KLQotfSBNNEVYSUZDX0Jhc2ljVGFnczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICBnZXQgdGhlIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgZXhpZiBsaWJyYXJ5LgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHZlcnNpb24gbnVtYmVycyBpbiBhIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbjogICAgKE9VVCkgICAgICAgIHRoZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB2ZXJzaW9uIG51bWJlcnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFWElGQ19FUlJfUEFSQU1FVEVSOiAgICAgICAgKERlYnVnIG9ubHkpIHRoZSBwYXJhbWV0ZXIgaXMgTTRFWElGQ19OVUxMLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEVYSUZDX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCi0jZW5kaWYgLyogX19NNF9FWElGX0NPTU1PTl9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhYTIwZDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9BUEkuaAotICogQGJyaWVmICAgIFRoZSBQaWN0dXJlcyB0byAzR1BQIENvbnZlcnRlci4KLSAqIEBub3RlICAgIE00UFRPM0dQUCBwcm9kdWNlcyAzR1BQIGNvbXBsaWFudCBhdWRpby92aWRlbyAgZmlsZXMKLSAqICAgICAgICAgICAgZnJvbSBhbiBBTVIgTkIgYXVkaW8gZmlsZSBhbmQgcmF3IHBpY3R1cmVzIGludG8gYSBNUEVHLTQvaDI2MyAzR1BQIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000UFRPM0dQUF9BUElfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0FQSV9IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBEZWZpbml0aW9ucyBvZiBNNFZJRklfSW1hZ2VQbGFuZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKiAgICBQdWJsaWMgdHlwZSBvZiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRQVE8zR1BQX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFBUTzNHUFBfUmVwbGFjZUF1ZGlvTW9kZQotICogQGJyaWVmICAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgd2F5IHRoZSBhdWRpbyBpcyBtYW5hZ2VkIGlmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmUgPSAwLCAgLyoqPCBBdWRpbyB0cmFjayBpcyBrZXB0IHNob3J0ZXIgdGhhbiB0aGUgdmlkZW8gdHJhY2sqLwotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlLCAgIC8qKjwgSWYgYXVkaW8gaXMgc2hvcnRlciwgc2lsZW5jZSBpcyBhZGRlZCBhdCB0aGUgZW5kKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgICAgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIGxvb3AgYmFjayB0byB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB3aG9sZSB0cmFjayBoYXMgYmVlbiBwcm9jZXNzZWQgKi8KLX0gTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX091dHB1dEZpbGVNYXhTaXplCi0gKiBAYnJpZWYgICAgRGVmaW5lcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSAzR1BQIGZpbGUgcHJvZHVjZWQgYnkgdGhlIFBUTzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2s1MF9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwIEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazc1X0tCLCAgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNzUgS2J5dGVzICAqLwotICAgIE00UFRPM0dQUF9rMTAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2sxNTBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDE1MCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazIwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMjAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMzAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAzMDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s0MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDQwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazUwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gNTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rVU5MSU1JVEVEPS0xICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbm90IGxpbWl0ZWQgICAgICAgICAgICovCi19IE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gKiBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLCBNNE9TQV9Eb3VibGUqIHBQaWN0dXJlRHVyYXRpb24pOwotICogQGJyaWVmICAgIFRoZSBpbnRlZ3JhdG9yIG11c3QgaW1wbGVtZW50IGEgZnVuY3Rpb24gZm9sbG93aW5nIHRoaXMgcHJvdG90eXBlLgotICogICAgICAgICAgICBJdHMgZ29hbCBpcyB0byBmZWVkIHRoZSBQVE8zR1BQIHdpdGggWVVWNDIwIHBpY3R1cmVzLgotICoKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgZ2l2ZW4gdG8gdGhlIFBUTzNHUFAgaW4gdGhlIE00UFRPM0dQUF9QYXJhbXMgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyhJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzCi0gKiBAcGFyYW0gICAgcFBpY3R1cmVEdXJhdGlvbihPVVQpIER1cmF0aW9uIG9mIHRoZSByZXR1cm5lZCBwaWN0dXJlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsIChiZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCkgKE00T1NBX1ZvaWQqIHBQaWN0dXJlQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFBUTzNHUFBfUGFyYW1zCi0gKiBAYnJpZWYgICAgTTRQVE8zR1BQIHBhcmFtZXRlcnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MyBvciBNUEVHNCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgZnJhbWUgc2l6ZSA6IFNRQ0lGIHRvIFZHQSovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICAvKio8IFRhcmdldGVkIE91dHB1dCBiaXQtcmF0ZSwgc2VlIGVudW0qLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgTWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlLCBzZWUgZW51bSAqLwotICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZSAgICAgT3V0cHV0RmlsZU1heFNpemU7Ci0gICAgLyoqPCBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgdGhlIFBUTzNHUFAgdG8gZ2V0IHRoZSBpbnB1dCBwaWN0dXJlcyovCi0gICAgTTRQVE8zR1BQX1BpY3R1cmVDYWxsYmFja0ZjdCogICBwUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIC8qKjwgQ29udGV4dCB0byBiZSBnaXZlbiBhcyB0aGlyZCBhcmd1bWVudCBvZiB0aGUgcGljdHVyZSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlQ2FsbGJhY2tDdHh0OwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBhdWRpbyB0cmFjayBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwSW5wdXRBdWRpb1RyYWNrRmlsZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gZmlsZSAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgQXVkaW9GaWxlRm9ybWF0OwotICAgIC8qKjwgVHlwZSBvZiBwcm9jZXNzaW5nIHRvIGFwcGx5IHdoZW4gYXVkaW8gaXMgc2hvcnRlciB0aGFuIHZpZGVvKi8KLSAgICBNNFBUTzNHUFBfQXVkaW9QYWRkaW5nTW9kZSAgICAgIEF1ZGlvUGFkZGluZ01vZGU7Ci0gICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQzZ3BwRmlsZTsKLSAgICAgLyoqPCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBOdW1iZXIgb2YgaW5wdXQgWVVWIGZyYW1lcyB0byBlbmNvZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIE5iVmlkZW9GcmFtZXM7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICB2aWRlb0xldmVsOwotfSBNNFBUTzNHUFBfUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNNFBUTzNHUFAgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTTRQVE8zR1BQIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZSBjb250ZXh0IHN0cnVjdHVyZSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHBhcmFtICAgIHBQYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBwb2ludGVkIHN0cnVjdHVyZSBjYW4gYmUgZGUtYWxsb2NhdGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBiZWNhdXNlCi0gKiAgICAgICAgICAgIGl0IGlzIGludGVybmFsbHkgY29waWVkIGJ5IHRoZSBQVE8zR1BQCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0ICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORwotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkc6ICAgIEVuY29kaW5nIGNvbXBsZXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTTRQVE8zR1BQIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTTRQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU3YmQ1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDEgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAyICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSAgICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDMgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwNCApCi0vKioKLSAqICAgIFRoZSBmaWxlIHNpemUgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfRklMRV9TSVpFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDUgKQotLyoqCi0gKiBUaGUgaW5wdXQgYXVkaW8gZmlsZSBjb250YWlucyBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDYgKQotLyoqCi0gKiAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDcgKQotCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMCApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMSApCi0vKioKLSAqICAgIFRoZSBBTVIgZGVjb2RlciBjbGVhbnVwIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9BTVJfREVDT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDIyICkKLQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9JTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMyApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGRlY29kaW5nIGZhaWxlZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9WSURFT19FTkNPREVfRVJST1IgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI0ICkKLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFUl9ERVNUUk9ZX0VSUk9SICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNSApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBmaWxlIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI2ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjcgKQotCi0vKioKLSAqICAgIFRoZSBFbmNvZGluZyBpcyBjb21wbGV0ZWQgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkUgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOCApCi0KLS8qKgotICogICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyOSApCi0KLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyQSApCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5MmU1NjYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCi0gKiBAYnJpZWYgICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgaW50ZXJuYWwgZGVmaW5pdGlvbnMKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZW51bSBhbmQgdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXwotCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX01JTk9SICAgICAgICAwCi0jZGVmaW5lIE00UFRPM0dQUF9WRVJTSU9OX1JFVklTSU9OICAgIDYKLQotLyoqCi0gKiAgICBNNFBUTzNHUFAgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgIC8qIFdyaXRlIDNHUFAgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAgICAvKiBSZWFkIEFNUiBmaWxlICAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRQVE8zR1BQX1N0YXRlcwotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIE00UFRPM0dQUC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICAgICAgICAgPSAwLCAgICAvKio8IE00UFRPM0dQUF9Jbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEICAgICAgICAgID0gMSwgICAgLyoqPCBNNFBUTzNHUFBfT3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX1JFQURZICAgICAgICAgICA9IDIsICAgIC8qKjwgU3RlcCBjYW4gYmUgY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCAgICAgICAgPSAzLCAgICAvKio8IFRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQgICAgICAgICAgPSA0ICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgKi8KLX0KLU00UFRPM0dQUF9TdGF0ZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZQotICogQGJyaWVmICAgICAgICBTdGF0ZSBvZiBhIG1lZGlhIHN0cmVhbSBlbmNvZGluZyAoYXVkaW8gb3IgdmlkZW8pLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgID0gMiAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGVuY29kaW5nICovCi19Ci1NNFBUTzNHUFBfU3RyZWFtU3RhdGU7Ci0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgIDAuOEYgICAgLyoqPCBNYXggQVUgc2l6ZSB3aWxsIGJlIDAuOCB0aW1lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1ZJREVPX0FVX1NJWkVfVE9fQ0hVTkNLX1NJWkVfUkFUSU8gICAgMS4yRiAvKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAgICAxMDAwICAgIC8qKjwgQUFDIG1heCBBVSBzaXplIHNlZW1zIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IDg1MCBieXRlcyAqLwotI2RlZmluZSBNNFBUTzNHUFBfQVVESU9fTUFYX0NIVU5LX1NJWkUgICAgICAgICAgIDUwMDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNFBUTzNHUFBfa05vRW5jb2RlciwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE00UFRPM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNNFBUTzNHUFAgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBNNFBUTzNHUFAgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFBUTzNHUFBfU3RhdGVzICAgICAgICAgICAgIG1fU3RhdGU7ICAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFBUTzNHUFBfUGFyYW1zICAgICAgICAgICAgIG1fUGFyYW1zOyAgICAgICAgICAgLyoqPCBNNFBUTzNHUFAgcGFyYW1ldGVycywgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX1ZpZGVvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIHZpZGVvIGVuY29kaW5nICovCi0gICAgTTRQVE8zR1BQX1N0cmVhbVN0YXRlICAgICAgICBtX0F1ZGlvU3RhdGU7ICAgICAgIC8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICAvKioKLSAgICAgKiAgICBPU0FMIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhbEZpbGVSZWFkOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICBwT3NhbEZpbGVXcml0ZTsgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqICAgIFJlYWRlciBzdHVmZiAqLwotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICAgICAgIG1fcFJlYWRlckF1ZGlvQVU7ICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgIG1fcFJlYWRlckF1ZGlvU3RyZWFtOy8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJWaWRlb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbV9Xcml0ZXJBdWRpb0FVOyAgICAgICAvKio8IFdyaXR0ZW4gYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNEVOQ09ERVJfSGVhZGVyKiAgICAgICAgICAgbV9wRW5jb2RlckhlYWRlcjsgICAgICAvKio8IFNlcXVlbmNlIGhlYWRlciByZXR1cm5lZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXQgZW5jb2RlciBjcmVhdGUgKGlmIGFueSkgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogICAgbV9wV3JpdGVyVmlkZW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqICBtX3BXcml0ZXJWaWRlb1N0cmVhbUluZm87ICAgIC8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyogICAgbV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgIC8qKjwgQXVkaW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0KLSAgICAvKioKLSAgICAgKiAgICBDb250ZXh0cyBvZiB0aGUgdXNlZCBtb2R1bGVzICAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb1JlYWRlckNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgYXVkaW8gcmVhZGVyIG1vZHVsZSovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcDNncFdyaXRlckNvbnRleHQ7ICAgLyoqPCBDb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyIG1vZHVsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BNcDRFbmNvZGVyQ29udGV4dDsgIC8qKjwgTXA0IGVuY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICBtX2VFbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkZXIgSW50ZXJmYWNlcyAqLwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgbV9wUmVhZGVyR2xvYkludDsgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgIG1fcFJlYWRlckRhdGFJbnQ7ICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlLCBkYXRhIHBhcnQgKi8KLQotICAgIC8qKgotICAgICAqIFdyaXRlciBJbnRlcmZhY2VzICovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFdyaXRlckdsb2JJbnQ7ICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlLCBnbG9iYWwgcGFydCAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BXcml0ZXJEYXRhSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgbV9wRW5jb2RlckludDsgICAgICAgICAgICAgICAgLyoqPCBFbmNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICBtX3BFbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKioKLSAgICAgKiAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgICAgIHBTYXZlZFBsYW5lOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIHVpU2F2ZWREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqICAgIFZpZGVvIHJhdGUgY29udHJvbCBzdHVmZiAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX2RMYXN0VmlkZW9SZWd1bEN0czsgLyoqPCBMYXN0IHRpbWUgKENUUykgdGhlIHZpZGVvIGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdGlvbiBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEN0czsgICAgICAgICAvKio8IEN1cnJlbnQgdmlkZW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXROZXh0Q3RzOyAgICAgLyoqPCBOZXh0IHZpZGVvIENUUyB0byB0cmFuc2NvZGUgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9tdEF1ZGlvQ3RzOyAgICAvKio8IEN1cnJlbnQgYXVkaW8gY3RzICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fQXVkaW9PZmZTZXQ7ICAgLyoqPCBBdWRpbyBPZmZzZXQgdG8gYWRkIHRvIHRoZSBjdHMgaW4gbG9vcCBtb2RlKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9QcmV2QXVkaW9DdHM7ICAvKio8IFByZXZpb3VzIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9EZWx0YUF1ZGlvQ3RzOyAvKio8IERlbHRhIGF1ZGlvIGN0cyBmb3IgQUFDIGxvb3BpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9DdXJyZW50RmlsZVNpemU7IC8qKjwgQ3VycmVudCBPdXRwdXQgZmlsZSBzaXplICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX01heEZpbGVTaXplOyAgICAgLyoqPCBNYXggT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9Jc0xhc3RQaWN0dXJlOyAgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0byB0aGUgZW5jb2RlciB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbV9iTGFzdEludGVybmFsQ2FsbEJhY2s7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fTmJDdXJyZW50RnJhbWU7ICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IFlVViBmcmFtZSBlbmNvZGVkICovCi0KLSAgICAvKioKLSAgICAgKiAgICBBdWRpbyBwYWRkaW5nIG1vZGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBtX2JBdWRpb1BhZGRpbmdTaWxlbmNlOyAgLyoqPCBBIGJvb2xlYW4gdGhhdCBzaWduYWxzIHRoYXQgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVSB3aWxsIGJlIHBhZGRlZCBieSBzaWxlbmNlICovCi19IE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBDYWxsIGFuIGV4dGVybmFsIGNhbGxiYWNrIHRvIGdldCB0aGUgcGljdHVyZSB0byBlbmNvZGUKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNNFBUTzNHUFAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlIHJlYWQgd2l0aCB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYjcxNDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9BUElfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0FQSS5oCi0gKiBAYnJpZWYgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIHB1YmxpYyBBUEkuCi0gKiBAbm90ZSAgICBWU1MgYWxsb3dzIGVkaXRpbmcgM0dQUCBmaWxlcy4KLSAqICAgICAgICAgIEl0IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGFuZCBmdWxseSBzeW5jaHJvbm91cyBBUEkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBJbWFnZSBwbGFuZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLS8qKgotICogQ29tbW9uIGRlZmluaXRpb25zIG9mIHZpZGVvIGVkaXRpbmcgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotCi0vKioKLSAqIEV4dGVuZGVkIEFQSSAoeFZTUykgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oIgotI2VuZGlmCi0KLS8vI2luY2x1ZGUgIk00VkRfSFdfQVBJLmgiCi0vLyNpbmNsdWRlICJNNFZFX0FQSS5oIgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRWRpdGlvbiBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZWRpdCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FZGl0Q29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUgICAgICAgICAgID0gMCwgIC8qKjwgTm8gdmlkZW8gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjayAgPSA4LCAgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2sgICAgPSAxNiwgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0V4dGVybmFsICAgICAgID0gMjU2IC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgKi8KLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICAgID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW4gID0gOCwgLyoqPCBJbnRlbmRlZCBmb3IgYmVnaW4gZWZmZWN0ICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2IC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLQotfSBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgICAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0Nyb3NzRmFkZSA9IDEsCi0gICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsICA9IDI1NgotICAgIC8qIHJlc2VydmVkIDI1NiArIG4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiBudW1iZXIgbiAqLwotCi19IE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUgPSAwLAotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUKLQotfSBNNFZTUzNHUFBfQXVkaW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0Ci0gKiAgICAgICAgICBhbmQgVHJhbnNpdGlvbiBmdW5jdGlvbnMKLSAqIEBub3RlICAgIFRoZSB1aVByb2dyZXNzIHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgY2FzZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IFByb2dyZXNzIG9mIHRoZSBFZmZlY3Qgb3IgdGhlIFRyYW5zaXRpb24sIGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpUHJvZ3Jlc3M7Ci0gICAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlwIChmaXJzdCBjbGlwIGluIGNhc2Ugb2YgYSBUcmFuc2l0aW9uKSwgZnJvbSAwIHRvIE4gKi8KLSAgICAvL000T1NBX1VJbnQ4ICAgICB1aUN1cnJlbnRDbGlwOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBjdXJyZW50IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7Ci0gICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywgaW4gdGhlIG91dHB1dCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aU91dHB1dFRpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgYklzTGFzdDsKLQotfSBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9jb2RlY1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgY29kZWMgdHlwZXMgdXNlZCB0byBjcmVhdGUgaW50ZXJmYWNlcwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlNTM0dQUCBzZXJ2aWNlcyB0byBpZGVudGlmeQotICogICAgICAgICAgICAgYSBjdXJyZW50bHkgc3VwcG9ydGVkIGNvZGVjIGludGVyZmFjZS4gRWFjaCBjb2RlYyBpcwotICogICAgICAgICAgICByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgY29kZWMgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0bwotICogICAgICAgICAgICBpZGVudGlmeSBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgVGhpcyBjYW4gYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGNvZGVjcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyogVmlkZW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNNUEVHNCA9IDAsCi0gICAgTTRWU1MzR1BQX2tWaWRlb0RlY0gyNjQsCi0KLSAgICAvKiBWaWRlbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tWaWRlb0VuY01QRUc0LAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjYzLAotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNIMjY0LAotCi0gICAgLyogQXVkaW8gRGVjb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQUFDLAotICAgIE00VlNTM0dQUF9rQXVkaW9EZWNNUDMsCi0KLSAgICAvKiBBdWRpbyBFbmNvZGVyIFR5cGVzICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VuY0FNUk5CLAotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBQUMsCi0KLSAgICAvKiBudW1iZXIgb2YgY29kZWNzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSwgYmVmb3JlIGludmxhaWQgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlX05CLAotICAgIC8qIGludmFsaWQgY29kZWMgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rQ29kZWNUeXBlSW52YWxpZCA9IDI1NQotCi19IE00VlNTM0dQUF9jb2RlY1R5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdAotICogQGJyaWVmICAgICAgIEJlZ2luIGFuZCBFbmQgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBjbGlwLgotICogICAgICAgICAgICAgIEl0IG11c3QgYXBwbHkgdGhlIHZpZGVvIGVmZmVjdCB0byBidWlsZCB0aGUgb3V0cHV0IGltYWdlLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcwotICogICAgICAgICAgICAgIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBJbnB1dFBsYW5lcyAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyB0cmFuc2l0aW9uIHByb2dyZXNzLgotICogQHBhcmFtICAgdWlFeHRlcm5hbEVmZmVjdElkICAoSU4pIFdoaWNoIGVmZmVjdCBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCAoZm9yIGV4dGVybmFsIGVmZmVjdHMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFeHRlcm5hbEVmZmVjdElkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0Ci0gKiBAYnJpZWYgICAgICAgRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbWFnZSBvZiB0aGUgZmlyc3QgY2xpcCBhbmQKLSAqICAgICAgICAgICAgICB0aGUgaW1hZ2Ugb2YgdGhlIHNlY29uZCBjbGlwLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgaW1hZ2UKLSAqICAgICAgICAgICAgICBmcm9tIHRoZSB0d28gaW5wdXQgaW1hZ2VzLgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgdHJhbnNpdGlvbiBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBleHRlcm5hbCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgaW1hZ2UgcGxhbmUKLSAqICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSB2YWxpZCBhbmQgb3duZWQgYnkgdGhlIFZTUyAzR1BQLgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgIHBDbGlwMUlucHV0UGxhbmVzICAgKElOKSBGaXJzdCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwQ2xpcDJJbnB1dFBsYW5lcyAgIChJTikgU2Vjb25kIGlucHV0IFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheSBvZiB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBPdXRwdXRQbGFuZXMgICAgICAgKElOL09VVCkgT3V0cHV0IChmaWx0ZXJlZCkgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKElOKSBTZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZpZGVvIGVmZmVjdCBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQgICAgKElOKSBXaGljaCB0cmFuc2l0aW9uIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgZXh0ZXJuYWwgdHJhbnNpdGlvbnMpCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcENsaXAxSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMklucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxUcmFuc2l0aW9uSWQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEVmZmVjdCBzdGFydCB0aW1lIGlzIHJlbGF0aXZlIHRvIG91dHB1dCBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlTdGFydFRpbWU7ICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aUR1cmF0aW9uOyAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlICAgIFZpZGVvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQsIGV0Yy4gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvRWZmZWN0RmN0IEV4dFZpZGVvRWZmZWN0RmN0OyAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7LyoqPCBDb250ZXh0IGdpdmVuIHRvIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00VlNTM0dQUF9BdWRpb0VmZmVjdFR5cGUgICAgQXVkaW9FZmZlY3RUeXBlOyAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZmZlY3RTZXR0aW5ncyAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cgotICogQGJyaWVmICAgIFRyYW5zaXRpb24gYmVoYXZpb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWRVcCA9IDAsCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkRG93biwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TbG93TWlkZGxlLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0Zhc3RNaWRkbGUKLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB0cmFuc2l0aW9uIHRvIGJlIGFwcGxpZWQgd2hlbiBhc3NlbWJsaW5nIHR3byBjbGlwcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IER1cmF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMgKHNldCB0byAwIHRvIGdldCBubyB0cmFuc2l0aW9uKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgIHVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgLyoqPCBUeXBlIG9mIHRoZSB2aWRlbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvVHJhbnNpdGlvblR5cGUgICAgVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotICAgIC8qKjwgRXh0ZXJuYWwgdHJhbnNpdGlvbiB2aWRlbyBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdCBFeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0KLSAgICAvKio8IENvbnRleHQgb2YgdGhlIGV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAqcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGUgICAgQXVkaW9UcmFuc2l0aW9uVHlwZTsgICAvKio8IFR5cGUgb2YgdGhlIGF1ZGlvIHRyYW5zaXRpb24gKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91ciAgICAgVHJhbnNpdGlvbkJlaGF2aW91cjsgICAgLyoqPFRyYW5zaXRpb24gYmVoYXZpb3VyKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgKnBGaWxlOyAgICAgICAgICAgIC8qKjwgQ2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEZpbGVUeXBlOyAgICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoU2l6ZTsgICAgICAvKio8IENsaXAgcGF0aCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGQgYmVjYXVzZSBvZiBVVEYxNiBjb252ZXJzaW9uKSovCi0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICBDbGlwUHJvcGVydGllczsgICAvKio8IENsaXAgYW5hbHlzaXMgcHJldmlvdXNseSBjb21wdXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFRpbWU7ICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWU7ICAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNjb2RpbmdSZXF1aXJlZDsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfQ2xpcFNldHRpbmdzICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLQotfSBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAgbGlzdCBwQ2xpcExpc3QgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBOdW1iZXI7Ci0gICAgLyoqPCBUaGUgcHJvcGVydGllcyBvZiB0aGlzIGNsaXAgd2lsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBjb21wYXRpYmlsaXR5IGNoZWNraW5nICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwOwotICAgIC8qKjwgTGlzdCBvZiB0aGUgaW5wdXQgY2xpcHMgc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyCi0gICAgIGNsaXAgc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICAgICAqKnBDbGlwTGlzdDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEKLSAgICAgdHJhbnNpdGlvbiBzZXR0aW5ncyBwb2ludGVycyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAgICoqcFRyYW5zaXRpb25MaXN0OwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAgICpFZmZlY3RzOyAgICAgICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIC8qKjwgRnJhbWUgcmF0ZSBhdCB3aGljaCB0aGUgbW9kaWZpZWQgdmlkZW8gc2VjdGlvbnMgd2lsbCBiZSBlbmNvZGVkICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgdmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aU91dHB1dFBhdGhTaXplOyAgICAvKio8IE91dHB1dCBmaWxlIHBhdGggc2l6ZSovCi0gICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAqcFRlbXBvcmFyeUZpbGU7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgICAgICAgICAgeFZTUzsKLSNlbmRpZgotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICBQVFZvbExldmVsOwotfSBNNFZTUzNHUFBfRWRpdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgYSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgM0dQUCBlZGl0aW5nCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZpbGxzIGEgQ2xpcEFuYWx5c2lzIHN0cnVjdHVyZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvCi0gKiAgICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgcENsaXAgICAgICAgICAgICAgICAoSU4pIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgM0dQUC9NUDMgY2xpcCBmaWxlLgotICogQHBhcmFtICAgcENsaXBQcm9wZXJ0aWVzICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICBGaWxlVHlwZSAgICAgICAgICAgIChJTikgVHlwZSBvZiB0aGUgaW5wdXQgZmlsZSAoLjNncCwgLmFtciwgLm1wMykKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoTTRPU0FfVm9pZCAqcENsaXAsIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyCi0gKiAgICAgICAgICBmb3IgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwMVByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgcENsaXAyUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBzZWNvbmQgY2xpcAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19QTEFURk9STQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgKnBDbGlwMlByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgM0dQUCBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KAotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCogcENvbnRleHQsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMgKGRlcHJlY2F0ZWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgRnJlZSB0aGUgcG9pbnRlcnMgYWxsb2NhdGVkIGluIHRoZSBDbGlwU2V0dGluZyBzdHJ1Y3R1cmUgKHBGaWxlLCBFZmZlY3RzKS4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgIFNldCB0aGUgVlNTIDNHUFAgaW5wdXQgYW5kIG91dHB1dCBmaWxlcywgYW5kIHNldCB0aGUgc2V0dGluZ3MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgcFNldHRpbmdzICAgICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3MKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbihNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGVkaXRpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgZWRpdGluZyBvcGVyYXRpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOkVkaXRpb24gaXMgZG9uZSwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZSgpCi0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBWU1MgM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGVkaXQgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQXVkaW8gTWl4aW5nIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgYXVkaW8gbWl4aW5nIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3JpZ2luYWxDbGlwRmlsZTsgICAgICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGRlZEF1ZGlvVHJhY2tGaWxlOyAgIC8qKjwgTmV3IGF1ZGlvIHRyYWNrICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgIEFkZGVkQXVkaW9GaWxlVHlwZTsgICAgIC8qKjwgRmlsZSBGb3JtYXQgb2YgdGhlIG5ldyBhdWRpbyBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgdGltZSBvZiB0aGUgbG9vcCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAvKio8IElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0Q2xpcEZpbGU7ICAgICAgLyoqPCBPdXRwdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtb292LmJpbiIpICovCi0gICAgLyoqPCBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbm5hbC4gVGhleSBhcmUganVzdCB1c2VkIGluIGNhc2Ugb2YgTVAzIHJlcGxhY2VtZW50LiAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBvdXRwdXRBU0Y7ICAgICAgICAgLyoqPCBPdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OyAvKio8IE91dHB1dCBhdWRpbyBjb2RlYyhBQUMvQU1SKSovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsgLyoqPCBPdXRwdXQgYXVkaW8gYml0cmF0ZSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXROQkNoYW5uZWxzOyAvKio8IE91dHB1dCBhdWRpbyBuYiBvZiBjaGFubmVscyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX0R1Y2tpbmdOZWVkZWVkOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0KAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQqIHBDb250ZXh0LAotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCgpCi0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIGF1ZGlvIG1peGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaW5hbGl6YXRpb24gb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkc6IEF1ZGlvIG1peGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgRXh0cmFjdCBQaWN0dXJlIEZlYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogIFB1YmxpYyB0eXBlIG9mIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgKi8KLXR5cGVkZWYgTTRPU0FfVm9pZCogTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGV4dHJhY3QgcGljdHVyZSBhdWRpbyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRDbGlwRmlsZTsgIC8qKjwgSW5wdXQgM0dQUCBjbGlwIGZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBpRXh0cmFjdGlvblRpbWU7IC8qKjwgZnJhbWUgdGltZSAoaW4gbXMpIHRvIGJlIGV4dHJhY3RlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXRZdXZQaWM7ICAgLyoqPCBPdXRwdXQgWVVWIHBpY3R1cmUgbmFtZSAqLwotfSBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5nczsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB2YWxpZCBleHRyYWN0IHBpY3R1cmUgc2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwV2lkdGggICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIHdpZHRoCi0gKiBAcGFyYW0gICAgcEhlaWdodCAgICAgICAgICAgICAgICAoT1VUKSB2aWRlbyBzdHJlYW0gaGVpZ2h0Ci0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVAxOiAgICBUaGUgaW5wdXQgY2xpcCBpcyBlbXB0eQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlSW5pdCgKLSAgICAgICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgIE00T1NBX1VJbnQzMiAqcFdpZHRoLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBIZWlnaHQsCi0gICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyBleHRyYWN0IHBpY3R1cmUgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgcERlY1BsYW5lcyAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQbGFuZSBpbiB3aWNoIHRoZSBleHRyYWN0ZWQgcGljdHVyZSBpcyBjb3BpZWQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHBpY3R1cmUgZXh0cmFjdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgVlNTX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFOiBQaWN0dXJlIGV4dHJhY3Rpb24gIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlU3RlcChNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVDb250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBEZWNQbGFuZXMsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgQ29tbW9uIGZlYXR1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKCkKLSAqIEBicmllZiAgIEdldCB0aGUgVlNTIHZlcnNpb24uCi0gKiBAbm90ZSAgICBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotI2lmZGVmIFdJTjMyCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCkKLSAqIEBicmllZiAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBnaXZlbiBlcnJvciBjb2RlCi0gKiBAbm90ZSAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgKGFuZCBsb25nIGVub3VnaCEpCi0gKiBAcGFyYW0gICBlcnIgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgc01lc3NhZ2UgICAgICAgIChJTi9PVVQpIEFsbG9jYXRlZCBzdHJpbmcgaW4gd2hpY2ggdGhlIGRlc2NyaXB0aW9uIHdpbGwgYmUgY29waWVkCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjpJbnB1dCBlcnJvciBpcyBub3QgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRFcnJvck1lc3NhZ2UoTTRPU0FfRVJSIGVyciwgTTRPU0FfQ2hhciogc01lc3NhZ2UpOwotI2VuZGlmIC8qKjwgV0lOMzIgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjNTAwZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCi0gKiBAYnJpZWYgICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBlcnJvciBkZWZpbml0aW9ucy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIGNvcmUgSUQgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogV2FybmluZyBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogICAgRW5kIG9mIGVkaXRpb24sIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDAxKQotCi0vKioKLSAqICAgIEVuZCBvZiBhdWRpbyBtaXhpbmcsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDEwKQotCi0vKioKLSAqICAgIEVuZCBvZiBleHRyYWN0IHBpY3R1cmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUNsZWFuVXAoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDIwKQotLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBJbnZhbGlkIGZpbGUgdHlwZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLS8qKgotICogSW52YWxpZCBlZmZlY3Qga2luZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRUZGRUNUX0tJTkQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwMikKLS8qKgotICogSW52YWxpZCBlZmZlY3QgdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VGRkVDVF9UWVBFICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDMpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIGF1ZGlvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA0KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgdmlkZW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDUpCi0vKioKLSAqIEludmFsaWQgdHJhbnNpdGlvbiB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fVFJBTlNJVElPTl9UWVBFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNikKLS8qKgotICogSW52YWxpZCB2aWRlbyBlbmNvZGluZyBmcmFtZSByYXRlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDcpCi0gLyoqCi0gKiBFeHRlcm5hbCBlZmZlY3QgZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOCkKLS8qKgotICogRXh0ZXJuYWwgdHJhbnNpdGlvbiBmdW5jdGlvbiBpcyB1c2VkIHdpdGhvdXQgYmVpbmcgc2V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA5KQotCi0vKioKLSAqIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEwKQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgb3IgZXF1YWwgdGhhbiBlbmQgY3V0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDExKQotLyoqCi0gKiBUd28gY29uc2VjdXRpdmUgdHJhbnNpdGlvbnMgYXJlIG92ZXJsYXBwaW5nIG9uIG9uZSBjbGlwICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDEyKQotCi0vKioKLSAqIEFuIGlucHV0IDNHUFAgZmlsZSBpcyBpbnZhbGlkL2NvcnJ1cHRlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfM0dQUF9GSUxFICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNikKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxNykKLS8qKgotICogQSBmaWxlIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVCAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOCkKLQotLyoqCi0gKiBBIGZpbGUgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxOSkKLSAvKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBWaWRlbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQSkKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYW4gdW5leHBlY3RlZGx5IGxhcmdlIEF1ZGlvIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDFCKQotLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhIGNvcnJ1cHRlZCBBdWRpbyBBTVIgQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQykKLS8qKgotICogVGhlIHZpZGVvIGVuY29kZXIgZW5jb3VudGVyZWQgYW4gQWNjZXMgVW5pdCBlcnJvcjogdmVyeSBwcm9iYWJseSBhIGZpbGUgd3JpdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxRCkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAoKSAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gZm9ybWF0IGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qKgotICogVW5zdXBwb3J0ZWQgSDI2MyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMSkKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyMikKLS8qKgotICogVW5zdXBwb3J0ZWQgTVBFRy00IFJWTEMgdG9vbCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQyAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjMpCi0vKioKLSAqIFVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjQpCi0gLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDI1KQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNikKLS8qKgotICogVW5zdXBwb3J0ZWQgdmlkZW8gcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fUFJPRklMRSBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI3KQotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0xFVkVMIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvcnMgcmV0dXJuZWQgYnkgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KCkgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBBdCBsZWFzdCBvbmUgb2YgdGhlIGNsaXAgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgVlNTIDNHUFAgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzApCi0vKioKLSAqIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgdmlkZW8gZm9ybWF0IChIMjYzIG9yIE1QRUc0KSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMSkKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMyKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIE1QRUctNCB0aW1lIHNjYWxlICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMzKQotLyoqCi0gKiAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHVzZSBvZiBNUEVHLTQgZGF0YSBwYXJ0aXRpb25pbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM0KQotLyoqCi0gKiAgICBNUDMgY2xpcHMgY2FuJ3QgYmUgYXNzZW1ibGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDM1KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBzdHJlYW0gdHlwZSAoZXg6IEFNUiAhPSBBQUMpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDM2KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBhdWRpbyBudW1iZXIgb2YgY2hhbm5lbHMgKGV4OiBzdGVyZW8gIT0gbW9ubykgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFMgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzcpCi0vKioKLSAqICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHNhbXBsaW5nIGZyZXF1ZW5jeSAoZXg6IDQ0MTAwSHogIT0gMTYwMDBIeikgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzOCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBlcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVGhlIGlucHV0IDNHUFAgZmlsZSBkb2VzIG5vdCBjb250YWluIGFueSBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gdHJhY2sgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTApCi0vKioKLSAqIFRoZSBWb2x1bWUgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIChBZGRWb2x1bWUpIG11c3QgYmUgc3RyaWN0bHkgc3VwZXJpb3IgdGhhbiB6ZXJvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUxKQotLyoqCi0gKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgYXVkaW8gdHJhY2sgaXMgYWRkZWQgKEFkZEN0cykgY2FuJ3QgYmUgc3VwZXJpb3IgdGhhbiB0aGUKLSAgIGlucHV0IHZpZGVvIHRyYWNrIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUyKQotLyoqCi0gKiBUaGUgYXVkaW8gdHJhY2sgZmlsZSBmb3JtYXQgc2V0dGluZyBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTMpCi0vKioKLSAqIFRoZSBhZGRlZCBhdWRpbyB0cmFjayBzdHJlYW0gaGFzIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTQpCi0vKioKLSAqIFRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSBkb2Vzbid0IHN1cHBvcnQgRVZSQywgTVAzIGF1ZGlvIHRyYWNrcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwNTUpCi0vKioKLSAqIEFuIGFkZGVkIGF1ZGlvIHRyYWNrIGxpbWl0IHRoZSBhdmFpbGFibGUgZmVhdHVyZXM6IHVpQWRkQ3RzIG11c3QgYmUgMAotICAgYW5kIGJSZW1vdmVPcmlnaW5hbCBtdXN0IGJlIE00T1NBX1RSVUUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0sgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1NikKLS8qKgotICogSW5wdXQgYXVkaW8gdHJhY2sgaXMgbm90IEFNUi1OQiBub3IgQUFDIHNvIGl0IGNhbid0IGJlIG1peGVkIHdpdGggb3V0cHV0ICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTcpCi0vKioKLSAqIElucHV0IGNsaXAgbXVzdCBiZSBhIDNncHAgZmlsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU4KQotLyoqCi0gKiBCZWdpbiBsb29wIHRpbWUgaXMgaGlnaGVyIHRoYW4gZW5kIGxvb3AgdGltZSBvciBoaWdoZXIgdGhhbiBhZGRlZCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQkVHSU5MT09QX0hJR0hFUl9FTkRMT09QICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTkpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF1ZGlvIG1peGluZyBhbmQgZXh0cmFjdCBwaWN0dXJlIGVycm9yIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEgyNjMgUHJvZmlsZSAzIGxldmVsIDEwIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjApCi0vKioKLSAqIEZpbGUgY29udGFpbnMgbm8gdmlkZW8gc3RyZWFtIG9yIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA2MSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSW50ZXJuYWwgZXJyb3IgYW5kIHdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW50ZXJuYWwgc3RhdGUgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlRFUk5BTF9TVEFURSAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwMCkKLS8qKgotICogTHVtaW5hbmNlIGZpbHRlciBlZmZlY3QgZXJyb3IgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDEwNCkKLS8qKgotICogVHJhbnNpdGlvbiBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVFJBTlNJVElPTl9GSUxURVJfRVJST1IgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDYpCi0vKioKLSAqIFRoZSBhdWRpbyBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTEwKQotLyoqCi0gKiBUaGUgZGVjb2RlciBwcm9kdWNlZCBhbiB1bmF0dGVuZGVkIGFtb3VudCBvZiBQQ00gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNSkKLS8qKgotICogT3V0cHV0IGZpbGUgbXVzdCBiZSAzR1BQIG9yIE1QMyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09VVFBVVF9GSUxFX1RZUEVfRVJST1IgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE3KQotLyoqCi0gKiBDYW4gbm90IGZpbmQgYSB2YWxpZCB2aWRlbyBmcmFtZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTgpCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FcnJvckNvZGVzX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjY4YjY3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0V4dGVuZGVkX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAotICogQGJyaWVmICAgIEFQSSBvZiB4VlNTCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0jZXJyb3IgIioqKiB0aGUgZmxhZyBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTIHNob3VsZCBiZSBhY3RpdmF0ZWQgaW4gQ29tcGlsZXJTd2l0Y2hlc1wKLSAgICAgICAgICAgICBmb3IgVmlkZW9TdHVkaW8gKioqIgotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0Ci0gKiBAYnJpZWYgICAgICAgIEV4dGVybmFsIHRleHQgdG8gUkdCIGJ1ZmZlciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIHJlbmRlcmluZ0RhdGEsIHRoZSB0ZXh0IGJ1ZmZlciBhbmQKLSAqICAgICAgICAgICAgICAgIGl0cyBzaXplLiBJdCBtdXN0IGJ1aWxkIHRoZSBvdXRwdXQgUkdCIGltYWdlIHBsYW5lIGNvbnRhaW5pbmcgdGhlIHRleHQuCi0gKgotICogQHBhcmFtICAgcFJlbmRlcmluZ0RhdGEgICAgKElOKSBUaGUgZGF0YSBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICBwVGV4dEJ1ZmZlciAgICAgICAgKElOKSBUZXh0IGJ1ZmZlciBnaXZlbiBieSB0aGUgdXNlciBpbiBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBwYXJhbSAgICB0ZXh0QnVmZmVyU2l6ZSAgICAoSU4pIFRleHQgYnVmZmVyIHNpemUgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lICAgIChJTi9PVVQpIE91dHB1dCBSR0I1NjUgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBSZW5kZXJpbmdEYXRhLAotICAgIE00T1NBX1ZvaWQgKnBUZXh0QnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB0ZXh0QnVmZmVyU2l6ZSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqKnBPdXRwdXRQbGFuZQotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0JHTVNldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBhZGQgQmFja2dyb3VuZCBtdXNpYyB0byAzZ3AgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAvKio8IElucHV0IGZpbGUgcGF0aCAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICBGaWxlVHlwZTsgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgLyoqPCBUaW1lLCBpbiBtaWxsaXNlY29uZHMsIGF0IHdoaWNoIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgaXMgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRWb2x1bWU7ICAgICAvKio8IFZvbHVtZSwgaW4gcGVyY2VudGFnZSwgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIHN0YXJ0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kIHRpbWUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgKDAgbWVhbnMgbm8gbG9vcCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOyAgICAgICAvKio8IGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvIHRoaXMgZmFjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluY3JlYXNlIHRoZSBwcmltYXJ5IHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkxvb3A7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTnVtQ2hhbm5lbHM7Ci19IE00eFZTU19CR01TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBWU1MzR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tSR0I4ODggICAgICAgICAgID0gMCwgIC8qKjwgUkdCODg4IGRhdGEgdHlwZSAqLwotICAgIE00VlNTM0dQUF9rUkdCNTY1ICAgICAgICAgICA9IDEgIC8qKjwgUkdCNTY1IGRhdGEgdHlwZSAqLwotCi19IE00VlNTM0dQUF9SR0JUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBhdWRpby92aWRlbyBlZmZlY3QgZm9yIHRoZSBlZGl0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBJbiBwZXJjZW50IG9mIHRoZSBjdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpU3RhcnRQZXJjZW50OwotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgKChjbGlwIGR1cmF0aW9uKSAtIChlZmZlY3Qgc3RhcnR0aW1lKSkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUR1cmF0aW9uUGVyY2VudDsKLSAgICAvKio8IEZyYW1pbmcgZmlsZSBwYXRoIChHSUYvUE5HIGZpbGUpLCB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAqcEZyYW1pbmdGaWxlUGF0aDsKLSAgICAvKio8IEZyYW1pbmcgUkdCNTY1IGJ1ZmZlciwgIHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICpwRnJhbWluZ0J1ZmZlcjsKLSAgICAvKio8UkdCIEJ1ZmZlciB0eXBlLHVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00VlNTM0dQUF9SR0JUeXBlICAgICAgICAgIHJnYlR5cGU7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeDsKLSAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIHdoZXJlIHRoZSBhZGRlZCBmcmFtZSB3aWxsIGJlIGRpc3BsYXllZC4KLSAgICAgVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nIHx8IFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdG9wbGVmdF95OwotICAgIC8qKjwgRG9lcyBmcmFtaW5nIGltYWdlIGlzIHJlc2l6ZWQgdG8gb3V0cHV0IHZpZGVvIHNpemUuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJSZXNpemU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgZnJhbWluZ1NjYWxlZFNpemU7Ci0vKio8IFNpemUgdG8gd2hpY2ggdGhlIHRoZSBmcmFtaW5nIGZpbGUgbmVlZHMgdG8gYmUgcmVzaXplZCAqLwotICAgIC8qKjwgVGV4dCBidWZmZXIuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBUZXh0QnVmZmVyOwotICAgIC8qKjwgVGV4dCBidWZmZXIgc2l6ZS4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdGV4dEJ1ZmZlclNpemU7Ci0gICAgLyoqPCBQb2ludGVyIGNvbnRhaW5pbmcgc3BlY2lmaWMgZGF0YSB1c2VkIGJ5IHRoZSBmb250IGVuZ2luZSAoc2l6ZSwgY29sb3IuLi4pICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcFJlbmRlcmluZ0RhdGE7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIHdpZHRoLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJXaWR0aDsKLSAgICAvKio8IFRleHQgcGxhbmUgaGVpZ2h0LiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVRleHRCdWZmZXJIZWlnaHQ7Ci0gICAgLyoqPCBQcm9jZXNzaW5nIHJhdGUgb2YgdGhlIGVmZmVjdCBhZGRlZCB3aGVuIHVzaW5nIHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHVpRmlmdGllc091dEZyYW1lUmF0ZTsKLSAgICAvKio8IFJHQjE2IGlucHV0IGNvbG9yIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgcmdiMTYgY29sb3IgZWZmZWN0ICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgdWlSZ2IxNklucHV0Q29sb3I7Ci0KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdTdGFydDsgICAgICAgLypTdGFydCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdNaWRkbGU7ICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nRW5kOyAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7ICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZHVyYXRpb24sIG9mIHRoZSBGYWRlSW4gcGhhc2UqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOyAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sIG9mIHRoZSBGYWRlT3V0IHBoYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgd2lkdGg7ICAgLyp3aWR0aCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLX0gTTR4VlNTX0VmZmVjdFNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBwQWxwaGFGaWxlUGF0aDsgICAgICAgIC8qKjwgQWxwaGEgZmlsZSBwYXRoIChKUEcgZmlsZSkgICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQ7ICAgIC8qKjwgQmxlbmRpbmcgUGVyY2VudGFnZSBiZXR3ZWVuIDAgYW5kIDEwMCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgd2lkdGg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgaGVpZ2h0OwotfSBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBkaXJlY3Rpb25zIGZvciB0aGUgc2xpZGUgdHJhbnNpdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Ub3BPdXRCb3R0b21JbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0JvdHRvbU91dFRvcEluCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25fRGlyZWN0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbiBkaXJlY3Rpb247IC8qIGRpcmVjdGlvbiBvZiB0aGUgc2xpZGUgKi8KLX0gTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19UcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWRkaXRpb25hbCB0cmFuc2l0aW9uIHNldHRpbmdzIHNwZWNpZmljIHRvCi0gKiAgICAgICAgICAgIHhWU1MsIHdoaWNoIGFyZSBhcHBlbmRlZCB0byB0aGUgVlNTM0dQUCB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFueXRoaW5nIHhWU1Mtc3BlY2lmaWMsIGJ1dCBjb21tb24gdG8gYWxsIHRyYW5zaXRpb25zLCB3b3VsZCBnbyBoZXJlLAotICAgIGJlZm9yZSB0aGUgdW5pb24uICovCi0gICAgdW5pb24gewotICAgICAgICAvKio8IEFscGhhTWFnaWMgc2V0dGluZ3MsIHVzZWQgb25seSBpZiBWaWRlb1RyYW5zaXRpb25UeXBlID09Ci0gICAgICAgICAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYyAqLwotICAgICAgICBNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzICAgICAgICAqcEFscGhhTWFnaWNTZXR0aW5nczsKLSAgICAgICAgLyogb25seSBpbiBjYXNlIG9mIHNsaWRlIHRyYW5zaXRpb24uICovCi0gICAgICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAgICAqcFNsaWRlVHJhbnNpdGlvblNldHRpbmdzOwotICAgIH0gdHJhbnNpdGlvblNwZWNpZmljOwotfSBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgZGlmZmVyZW50IG1lZGlhIHJlbmRlcmluZyB1c2luZyBleGlmIG9yaWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tSZXNpemluZyA9IDAsICAgICAgICAvKlRoZSBwaWN0dXJlIGlzIHJlc2l6ZWQsIHRoZSBhc3BlY3QgcmF0aW8gY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgb3JpZ2luYWwgb25lLiBBbGwgb2YgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotICAgIE00eFZTU19rQ3JvcHBpbmcsICAgICAgICAgICAgLypUaGUgcGljdHVyZSBpcyBjcm9wcGVkLCB0aGUgYXNwZWN0IHJhdGlvIGlzIHRoZSBzYW1lIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgb25lLiBUaGUgcGljdHVyZSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkqLwotICAgIE00eFZTU19rQmxhY2tCb3JkZXJzICAgICAgICAvKkJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgcGljdHVyZSBpcyByZW5kZXJlZCovCi0KLX0gTTR4VlNTX01lZGlhUmVuZGVyaW5nOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0NsaXBTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBpbnB1dCBjbGlwIGZvciB0aGUgZWRpdGlvbi4KLSAqIEBub3RlICAgIEl0IGFsc28gY29udGFpbnMgdGhlIHNldHRpbmdzIGZvciB0aGUgY3V0IGFuZCBiZWdpbi9lbmQgZWZmZWN0cyBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudDsgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50OyAgICAvKio8IEVuZCBjdXQgdGltZSwgaW4gcGVyY2VudCBvZiBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gKG9ubHkgZm9yIDNHUFAgY2xpcCAhKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBjbGlwLCBpZiBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDAsIGhhcyBwcmlvcml0eSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0VGltZSBvciB1aUVuZEN1dFBlcmNlbnQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNQYW5ab29tOyAgICAgICAgICAgIC8qKjwgUkM6IEJvb2xlYW4gdXNlZCB0byBrbm93IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkIgb25seSB1c2VkIHdpdGggSlBFRzogdG8gY3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0KLX0gTTR4VlNTX0NsaXBTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWRpdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRlZmluZSBhIGNvbXBsZXRlCi0gKiAgICAgICAgICBlZGl0aW9uIG9wZXJhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gc2l6ZSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgICAgICAgICAgIG91dHB1dFZpZGVvU2l6ZTsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBmb3JtYXQgKE1QRUc0IC8gSDI2MykgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBmb3JtYXQgKEFBQywgQU1STkIgLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIHNhbXBsaW5nIGZyZXEgKDgwMDBIeiwuLi4pICovCi0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICAgb3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyoqPCBNYXhpbXVtIG91dHB1dCBmaWxlIHNpemUgaW4gQllURVMgKGlmIHNldCB0byAwLCBubyBsaW1pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVTaXplOwotICAgIC8qKjwgSXMgb3V0cHV0IGF1ZGlvIG11c3QgYmUgTW9ubyA/IFZhbGlkIG9ubHkgZm9yIEFBQyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gYml0cmF0ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAvKio8IEJhY2tncm91bmQgbXVzaWMgdHJhY2sgc2V0dGluZ3MgKi8KLSAgICBNNHhWU1NfQkdNU2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAqcEJHTXRyYWNrOwotICAgIC8qKjwgRnVuY3Rpb24gcG9pbnRlciBvbiB0ZXh0IHJlbmRlcmluZyBlbmdpbmUsIGlmIG5vdCB1c2VkLCBtdXN0IGJlIHNldCB0byBOVUxMICEhICovCi0gICAgTTR4VlNTX2dldFRleHRSZ2JCdWZmZXJGY3QgICAgICAgICAgICAgICAgcFRleHRSZW5kZXJpbmdGY3Q7Ci0gICAgLyoqIG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCovCi0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICBvdXRwdXRWaWRlb0xldmVsOwotCi19IE00eFZTU19FZGl0U2V0dGluZ3M7Ci0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjY5ZmViLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgbWFnaWNhbCBhbmQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogVmlkZW9FZGl0aW9uIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9NSU5JTUFMX1RSQU5TSVRJT05fRFVSQVRJT04gICAgICAgICAgICAxMDAgICAgLyoqPCAxMDAgbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSCAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgIC8qKjwgcHJlZmVjdCA0IEFVcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTk9fU1RTU19KVU1QX1BPSU5UICAgICAgICAgICAgICAgICAgICA0MDAwMCAvKio8IElmIDNncCBmaWxlIGRvZXMgbm90IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBTVFNTIHRhYmxlIChubyByYXAgZnJhbWVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wIGJhY2t3YXJkIDQwIHMgbWF4aW11bSAqLwotCi0vKioqKioqKioqKioqKioqKiovCi0vKiBXcml0ZXIgY29uZmlnICovCi0vKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAyCi0KLS8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlIFlVVjQ6MjowIGZyYW1lIHNpemUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyAgICAgICAgICAgIDAuOUYKLS8qKjwgTWF4IGNodW5rIHNpemUgd2lsbCBiZSAxLjIgdGltZXMgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYKLQotLyoqIFJFQUQgQ0FSRUZVTExZIElOIENBU0UgT0YgUkVQT1JURUQgUlVOTklORyBUUk9VQkxFUwotVGhlIG1heCBBVSBzaXplIGlzIHVzZWQgdG8gcHJlLXNldCBtYXggc2l6ZSBvZiBBVSB0aGF0IGNhbiBiZSB3cml0dGVuIGluIHRoZSAzR1Agd3JpdGVyCi1Gb3IgYXVkaW8gc3RhbmRhcmQgd2l0aCB2YXJpYWJsZSBBVSBzaXplLCB0aGVyZSBjb3VsZCBiZSBzb21lIGVuY29kaW5nIHNldHRpbmdzIGxlYWRpbmcgdG8gQVUgc2l6ZQotZXhjZWVkaW5nIHRoaXMgbGltaXQuCi1Gb3IgQUFDIHN0cmVhbXMgZm9yIGluc3RhbmNlIHRoZSBhdmVyYWdlIEFVIHNpemUgaXMgZ2l2ZW4gYnk6Ci1hdiBBVSBzaXplID0gKGF2IGJpdHJhdGUgKiAxMDI0KS8oc2FtcGxpbmcgZnJlcSkKLUlmIFZTUyByZXR1cm5zIHRoZSBtZXNzYWdlOgotPj4gRVJST1I6IGF1ZGlvIEFVIHNpemUgKFhYWFgpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoWVlZWSkgPT4gYWJvcnQKLT4+IFBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkKLUVycm9yIGlzIG1vc3QgbGlrZWx5IHRvIGhhcHBlbiB3aGVuIG1peGluZyB3aXRoIGF1ZGlvIGZ1bGwgcmVwbGFjZW1lbnQKLSAqLwotLyoqPCBBQUMgbWF4IEFVIHNpemUgLSBSRUFEIEVYUExBTkFUSU9OIEFCT1ZFICovCi0jZGVmaW5lIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDIwNDgKLS8qKjwgc2V0IHRvIHg0IG1heCBBVSBzaXplIHBlciBjaHVuayAqLwotI2RlZmluZSBNNFZTUzNHUFBfQVVESU9fTUFYX0NIVU5DS19TSVpFICAgICAgICAgICAgICAgICAgICA4MTkyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqLwotLyogSDI2MyAvIE1QRUc0IGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICAgIE00VlNTM0dQUF9FRElUX0gyNjNfTU9EVUxPX1RJTUUgICAgICAgICAgICAyNTUKLQotI2lmZGVmIEJJR19FTkRJQU4KLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHgwMDAwMDFiMwotI2Vsc2UKLS8qKjwgMHhiMyAwMSAwMCAwMCBMaXR0bGUgZW5kaWFuIC8gYjAwIDAwIDAwIDAxIGIzIGJpZyBlbmRpYW4qLwotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9HT1ZfSEVBREVSICAgICAgICAgICAgMHhiMzAxMDAwMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEFNUiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfV1JJVFRFTl9BTVJfVFJBQ0tfVElNRV9TQ0FMRSAgICAgICAgICAgIDgwMDAKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9ERUNPREVEX1BDTV9TQU1QTEVfTlVNQkVSICAgICAgICAgICAgMTYwICAgICAgICAvKio8IDIwbXMgYXQgODAwMGh6IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjB4OD0xNjAgc2FtcGxlcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAgICAgICAxMjIwMCAgIC8qKjwgMTIuMiBrYnBzICovCi0KLS8qKioqKioqKioqKioqKi8KLS8qIEVWUkMgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0VWUkNfREVGQVVMVF9CSVRSQVRFICAgICAgICAgICAgICAgICAgOTIwMCAgIC8qKjwgOS4yIGticHMgKi8KLQotLyoqKioqKioqKioqKioqLwotLyogTVAzIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0vKiogTWFjcm8gdG8gbWFrZSBhIGp1bXAgb24gdGhlIE1QMyB0cmFjayBvbiBzZXZlcmFsIHN0ZXBzCi0gICAgVG8gYXZvaWQgdG8gYmxvY2sgdGhlIHN5c3RlbSB3aXRoIGFuIGxvbmcgTVAzIGp1bXAsIHRoaXMgcHJvY2VzcwotICAgIGlzIGRpdmlkZWQgb24gc2V2ZXJhbCBzdGVwcy4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0pVTVBFRF9BVV9OVU1CRVJfTUFYIDEwMAotCi0vKiogTWFjcm8gdG8gZGVmaW5lIHRoZSBudW1iZXIgb2YgcmVhZCBBVSB0byBhbmFseXNlIHRoZSBiaXRyYXRlCi0gICAgU28gdGhlIHByb2Nlc3Mgd2lsbCByZWFkIHRoZSBmaXJzdCBuIEFVIG9mIHRoZSBNUDMgc3RyZWFtIHRvIGdldAotICAgIHRoZSBhdmVyYWdlIGJpdHJhdGUuIG4gaXMgZGVmaW5lZCBieSB0aGlzIGRlZmluZS4KLSAqLwotI2RlZmluZSBNNFZTUzNHUFBfTVAzX0FVX05VTUJFUl9NQVggNTAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMTYwCi0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17Ci0gICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywKLSAgICAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBcCi0gICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotewotICAgIDB4MDAsIDB4QzgsIDB4MjAsIDB4MDcKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotI2VuZGlmCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFICAgICAgICA2Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci17Ci0gICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkVdOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NTU4ODIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb24gcHJvdG90eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIFZTUyBwcml2YXRlIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiIC8qKjwgZm9yIE00X0FjY2Vzc1VuaXQgZGVmaW5pdGlvbiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgdmlkZW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YgYXVkaW8gcHJvY2Vzc2luZwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKCkKLSAqIEBicmllZiAgICBEbyB3aGF0IHRvIGRvIHdoZW4gdGhlIGVuZCBvZiBhIGNsaXAgdmlkZW8gdHJhY2sgaXMgcmVhY2hlZAotICogQG5vdGUgICAgSWYgdGhlcmUgaXMgYXVkaW8gb24gdGhlIGN1cnJlbnQgY2xpcCwgcHJvY2VzcyBpdCwgZWxzZSBzd2l0Y2ggdG8gdGhlIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIGF1ZGlvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCkKLSAqIEBicmllZiAgICBDaGVjayBpZiB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCAoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqaENsaXBDdHh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0Ci0pOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuICgKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgIE00T1NBX0Jvb2wgYlNraXBBdWRpb1RyYWNrLAotICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwKLSAgICBNNE9TQV9Cb29sIGJBdm9pZE9wZW5pbmdWaWRlb0RlYwotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMoTTRWU1MzR1BQX0NsaXBDb250ZXh0KiBwQ2xpcEN0eHQsIE00T1NBX0ludDMyIGlDdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgUmVhZCBvbmUgQVUgZnJhbWUgaW4gdGhlIGNsaXAKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpCi0gKiBAYnJpZWYgICAgRGVjb2RlIHRoZSBjdXJyZW50IEFVRElPIGZyYW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpCi0gKiBAYnJpZWYgICAgSnVtcCBpbiB0aGUgYXVkaW8gdHJhY2sgb2YgdGhlIGNsaXAuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBKdW1wQ3RzICAgICAgICAgICAgKElOL09VVCkgaW46dGFyZ2V0IENUUywgb3V0OiByZWFjaGVkIENUUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsIE00T1NBX0ludDMyICpwSnVtcEN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKQotICogQGJyaWVmICAgIENsb3NlIGEgY2xpcC4gRGVzdHJveSB0aGUgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBqdW1waW5nIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcC4KLSAqIEBub3RlICAgIE9uIG9uZSBzdGVwLCB0aGUganVtcCBvZiBzZXZlcmFsIEFVIGlzIGRvbmUKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRKdW1wTVAzKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yIHBXdHJEYXRhSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciByZWFkZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIFZTUyB0byByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZW5jb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEF1ZGlvRnJhbWUgICAoSU4pIEFNUk5CIGZyYW1lCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuIGluIHRoZQotICogICAgICAgICAgICAgZmluYWwgaW50ZWdyYXRlZCBwcm9kdWN0KS4KLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBSZXNldCB0aGUgYXVkaW8gZW5jb2RlciAoQ3JlYXRlIGl0IGlmIG5lZWRlZCkKLSAqIEBub3RlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcihNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDX1NoZWxsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQXVkaW9CaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCkKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsIFJlYWRpZXMgdGhlCi0gKiAgICAgICAgICAgIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZShNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENfU2hlbGxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyICpwT3NhRmlsZVdyaXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBPc2FGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFRlbXBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiB0d28gY2xpcHMgYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGZvcgotICogICAgICAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUAotICogQHJldHVybiAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRDbGlwUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQWRkZWRDbGlwUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN0YXJ0QVUoKQotICogQGJyaWVmICAgIFN0YXJ0QVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgcHJlcGFyZWQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50U3RhcnRBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFByb2Nlc3NBVShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCkKLSAqIEBicmllZiAgICBXZSBpbXBsZW1lbnQgb3VyIG93biBWaWRlb1ByZVByb2Nlc3NpbmcgZnVuY3Rpb24KLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMRlVOQ1RJT05TX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3OTAwZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFZTU19WRVJTSU9OX01BSk9SICAgICAgICAzCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fTUlOT1IgICAgICAgIDIKLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9SRVZJU0lPTiAgICA1Ci0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKgotICogICAgVlNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotCi0vKioKLSAqICAgIEludGVybmFsbHkgdXNlZCBtb2R1bGVzICovCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiICAgICAgICAvKio8IFJlYWRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIiAgICAgICAgLyoqPCBEZWNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiICAgICAgICAvKio8IEVuY29kZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiICAgICAgICAvKio8IEltYWdlIHBsYW5lcyBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRSRUFERVJfM2dwQ29tLmgiICAgICAgICAvKio8IFJlYWQgM0dQUCBmaWxlICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICovCi0KLQotI2luY2x1ZGUgIlNTUkMuaCIgICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIkZyb20yaVRvTW9ub18xNi5oIiAgICAgICAgLyoqPCBTdGVyZW8gdG8gTW9ubyAgICAgKi8KLSNpbmNsdWRlICJNb25vVG8ySV8xNi5oIiAgICAgICAgICAgIC8qKjwgTW9ubyB0byBTdGVyZW8gICAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBXSU5ET1dfU0laRSAxMAotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCAgICA9IDAsICAgIC8qKjwgTTRWU1MzR1BQX2VkaXRJbml0IGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPICAgICAgICA9IDEsICAgIC8qKjwgUHJvY2Vzc2luZyB2aWRlbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0FVRElPICAgICAgICA9IDIsICAgIC8qKjwgUHJvY2Vzc2luZyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMyAgICAgICAgPSAzLCAgICAvKio8IFByb2Nlc3NpbmcgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVAgICA9IDQsICAgICAgICAvKio8IFByb2Nlc3NpbmcgYSBqdW1wIGluIGEgTVAzIGF1ZGlvIHRyYWNrICovCi0gICAgTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQgICAgPSA1LCAgICAvKio8IFByb2Nlc3NpbmcgZG9uZSwgVlNTIDNHUFAgY2FuIGJlIGNsb3NlZCAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAgICAgICAgPSA2ICAgICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNsb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlNTIDNHUFAgY2FuIGJlIGRlc3Ryb3llZCAqLwotfQotTTRWU1MzR1BQX0VkaXRTdGF0ZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gd2lsbCBoYXZlIG5vIHByb2Nlc3NpbmcKLSAgICAgKiBvbiBpbnB1dCBmcmFtZXMuIE9ubHkgdGltZSBzdGFtcCBtYW5pcHVsYXRpb25zIGluIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSAgICA9IDEwLAotICAgIC8qKjwgRGVjb2RlIGVuY29kZSB0byBjcmVhdGUgYW4gSSBmcmFtZS4gVGhpcyBpcyBkb25lIGZvciBhIHNpbmdsZSBmcmFtZQotICAgICAqIHRvIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2UgZnJhbWUuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgICAgID0gMTEsCi0gICAgLyoqPCBEb2luZyBSZWFkLT5EZWNvZGUtPkZpbHRlci0+RW5jb2RlLT5Xcml0ZSBvcGVyYXRpb24gb24gdGhlIGlucHV0IGZpbGUKLSAgICAgKiB0byBjcmVhdGUgdGhlIG91dHB1dCBmaWxlLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9IDEyLAotICAgIC8qKjwgQXBwbGllZCB3aGVuIFRyYW5zaXRpb24gaXMgYWN0aXZlIGFuZCBibGVuZGluZyBvZiB0d28gdmlkZW9zIGlzCi0gICAgICogcmVxdWlyZWQuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICAgID0gMTMsCi0gICAgLyoqPCBTcGVjaWFsIFJlYWQvV3JpdGUgbW9kZSB1c2VkIGFmdGVyIEJFR0lOX0NVVCBzdGF0ZS4gVGhlIGZyYW1lCi0gICAgICogaXMgYWxyZWFkeSBjb2RlZCBhcyBJIGZyYW1lIGluIEJFR0lOX0NVVCBzdGF0ZTsgc28gc2tpcCBpdC4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVCAgICAgPSAxNAotfQotTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgICAgPSAyMCwgICAgLyoqPCBEb2luZyBSZWFkL1dyaXRlIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gZGVjb2RpbmcvZW5jb2RpbmcpICovCi0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9ERUNPREVfRU5DT0RFID0gMjEsICAgIC8qKjwgRG9pbmcgUmVhZC1EZWNvZGUvRmlsdGVyLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RlLVdyaXRlIG9wZXJhdGlvbiAqLwotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAgICA9IDIyICAgIC8qKjwgVHJhbnNpdGlvbjsgYmxlbmRpbmcgb2YgdHdvIGF1ZGlvICovCi19Ci1NNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMKLSAqIEBicmllZiAgICAgICAgU3RhdHVzIG9mIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEICAgICAgICAgICAgPSAwLCAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSByZWFkeSBmb3IgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREUgICAgICAgID0gMSwgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgcmVhZHkgZm9yIGRlY29kaW5nICovCi0gICAgTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAgICA9IDIgICAgICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IGluIHNwbGl0dGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVVcFRvKCkgcHJvY2Vzc2luZyAqLwotfQotTTRWU1MzR1BQX0NsaXBTdGF0dXM7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBDdXJyZW50RWZmZWN0Ci0gKiBAYnJpZWYgICAgICAgIEN1cnJlbnQgZWZmZWN0IGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9OT05FICAgID0gMCwgICAgLyoqPCBOb25lICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9CRUdJTiAgICA9IDEsICAgIC8qKjwgQmVnaW4gZWZmZWN0IGN1cnJlbnRseSBhcHBsaWVkICovCi0gICAgTTRWU1MzR1BQX2tDbGlwQ3VycmVudEVmZmVjdF9FTkQgICAgPSAyICAgICAgICAvKio8IEVuZCBlZmZlY3QgY3VycmVudGx5IGFwcGxpZWQgKi8KLX0KLU00VlNTM0dQUF9DbGlwQ3VycmVudEVmZmVjdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTyA9IDAsICAgICAgICAgICAgLyoqPCBWaWRlbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVCwgIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5ULCAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5ULCAgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQgICAgICAgICAgICAgIC8qKjwgUHJvY2Vzc2luZyBmaW5pc2hlZCwgdXNlciBtdXN0IG5vdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKi8KLX0KLU00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0V4dHJhY3RQaWN0dXJlU3RhdGVfT1BFTkVEICAgPSAwLCAgLyoqPCBWaWRlbyBjbGlwIGlzIG9wZW5lZCBhbmQgcmVhZHkgdG8gYmUgcmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgUkFQIGJlZm9yZSB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX1BST0NFU1MgICAgPSAxLCAgLyoqPCBWaWRlbyBpcyBkZWNvZGVkIGZyb20gdGhlIHByZXZpb3VzIFJBUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcGljdHVyZSB0byBleHRyYWN0ICovCi0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX0VYVFJBQ1RFRD0gMiAgIC8qKjwgVmlkZW8gQVUgaGFzIGJlZW4gIGRlY29kZWQsIHVzZXIgbXVzdCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwICovCi19Ci1NNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgVlNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwR2xvYmFsRmN0czsgICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dAotICogQGJyaWVmICAgICAgICBGaWxlc3lzdGVtIGFuZCBjb2RlYyByZWdpc3RyYXRpb24gZnVuY3Rpb24gcG9pbnRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRWU1MzR1BQX1dyaXRlckludGVyZmFjZSAgICBXcml0ZXJJbnRlcmZhY2VbTTRXUklURVJfa1R5cGVfTkJdOwotICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciovCi0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgICBwV3JpdGVyR2xvYmFsRmN0czsKLSAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgcFdyaXRlckRhdGFGY3RzOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlckV4dGVybmFsQVBJVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBUYWJsZSBvZiBpbnRlcm5hbC9leHRlcm5hbCBmbGFncyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIG1fcFJlYWRlckdsb2JhbEl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIG1fcFJlYWRlckRhdGFJdDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFJlYWRlcnM7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBtX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2VuZGlmCi0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJJdFRhYmxlW000QURfa1R5cGVfTkJdOwotICAgIC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbCBkZWNvZGVycyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtNNEFEX2tUeXBlX05CXTsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgLyogYm9vbGVhbiB0byB0ZWxsIHdoZXRoZXIgcmVnaXN0ZXJlZCBleHRlcm5hbCBPTVggY29kZWNzIHNob3VsZCBiZSBmcmVlZCBkdXJpbmcgY2xlYW51cAotICAgICBvciBuZXcgY29kZWMgcmVnaXN0cmF0aW9uKi8KLSAgICBNNE9TQV9Cb29sICAgIGJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZTsKLSNlbmRpZgotCi0KLX0gTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbnMgcmVsYXRlZCB0byBvbmUgM0dQUCBjbGlwIChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnRleHQgcmVsYXRlZCB0byBvbmUgY2xpcAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyogICAgICAgIHBTZXR0aW5nczsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgcG9zc2Vzc2VkKSAqLwotCi0gICAgTTRWU1MzR1BQX0NsaXBTdGF0dXMgICAgICAgIFZzdGF0dXM7ICAgICAgICAgICAgLyoqPCBWaWRlbyBzdGF0dXMgb2YgdGhlIGNsaXAgcmVhZGluZyAqLwotICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzICAgICAgICBBc3RhdHVzOyAgICAgICAgICAgIC8qKjwgQXVkaW8gc3RhdHVzIG9mIHRoZSBjbGlwIHJlYWRpbmcgKi8KLQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpVm9mZnNldDsgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIE9mZnNldCBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBhbmQgdGhlIG91dHB1dCB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWdpbiBjdXQgdGFrZW4gaW50byBhY2NvdW50KSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQW9mZnNldDsgICAgICAgICAgIC8qKjwgW1RpbWVzY2FsZV0gT2Zmc2V0IGJldHdlZW4gdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSAoYmVnaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dCB0YWtlbiBpbnRvIGFjY291bnQpICovCi0KLSAgICAvKioKLSAgICAgKiAzR1BQIHJlYWRlciBTdHVmZiAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBGaWxlUmVhZFB0ckZjdDsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0OyAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCByZWFkZXIgbW9kdWxlICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgICAgICAgcFZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBwQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICAgICAgVmlkZW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKHdlIGRvIG5vdCB1c2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbGxvY2F0ZSBsYXRlciwgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zdCBvZiB0aGUgdGltZSB3ZSB3aWxsIG5lZWQgaXQpICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgICAgICBBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAod2UgZG8gbm90IHVzZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIGFsbG9jYXRlIGxhdGVyLCBiZWNhdXNlIG1vc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0aW1lIHdlIHdpbGwgbmVlZCBpdCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVmlkZW9BdUF2YWlsYWJsZTsgICAgLyoqPCBUZWxsIGlmIGEgdmlkZW8gQVUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNseSByZWFkKSAqLwotICAgIC8qKjwgQm9vbGVhbiBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkZpcnN0QXVXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpVmlkZW9EZWNDdHM7ICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRm9yIHZpZGVvIGRlY29kZVVwVG8oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHJlYWNoZWQgY3RzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlWaWRlb1JlbmRlckN0czsgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBGb3IgdmlkZW8gcmVuZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZWFjaGVkIGN0cyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGlzUmVuZGVyRHVwOyAgICAgICAgLyoqPCBUbyBoYW5kbGUgZHVwbGljYXRlIGZyYW1lIHJlbmRlcmluZyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXh0ZXJuYWwgZGVjb2RpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBsYXN0RGVjb2RlZFBsYW5lOyAgICAvKio8IExhc3QgZGVjb2RlZCBwbGFuZSAqLwotCi0gICAgLyoqCi0gICAgICogTVBFRzQgdGltZSBpbmZvIHN0dWZmIGF0IGNsaXAgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGJNcGVnNEdvdlN0YXRlOyAgICAgICAgICAgIC8qKjwgTmFtZWx5LCB1cGRhdGUgb3IgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVHZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHJlYWQgKGluIHNlY29uZCkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgIHVpTXBlZzRQcmV2R292VmFsdWVTZXQ7ICAgIC8qKjwgUHJldmlvdXMgR292IHZhbHVlIHdyaXRlIChpbiBzZWNvbmQpICovCi0KLSAgICAvKioKLSAgICAgKiBUaW1lLWxpbmUgc3R1ZmYgKi8KLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBDVFMgYXQgd2hpY2ggdGhlIHZpZGVvIGNsaXAgYWN0dWFsbHkgc3RhcnRzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ1RTIGF0IHdoaWNoIHRoZSBhdWRpbyBjbGlwIGFjdHVhbGx5IHN0YXJ0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQWN0dWFsQXVkaW9CZWdpbkN1dDsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYXQgd2hpY2ggdGhlIGNsaXAgbXVzdCBlbmQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUVuZFRpbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBBTVIgZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICAgICAgICBBdWRpb0RlY0J1ZmZlckluOyAgICAvKio8IElucHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQ7ICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgZGVjb2RlZCBQQ00gZGF0YSAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICAgICAgICBBYWNQcm9wZXJ0aWVzOyAgICAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEFVIHRvIEZyYW1lIHNwbGl0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiQXVkaW9GcmFtZUF2YWlsYWJsZTsgIC8qKjwgVHJ1ZSBpZiBhbiBhdWRpbyBmcmFtZSBpcyBhdmFpbGFibGUgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0ZyYW1lUHRyOyAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBBdWRpbyBmcmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0ZyYW1lU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgYXVkaW8gZnJhbWUgYXZhaWxhYmxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBpQXVkaW9GcmFtZUN0czsgICAgICAgLyoqPCBbVGltZXNjYWxlXSBDVFMgb2YgdGhlIGF1ZGlvIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgKi8KLQotICAgIC8qKgotICAgICAqIFNpbGVuY2UgZnJhbWUgc3R1ZmYgKi8KLSAgICAgLyoqPCBTaXplIHRvIHJlc2VydmUgdG8gc3RvcmUgYSBwY20gZnVsbCBvZiB6ZXJvcyBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAvKio8IFBvaW50ZXIgdG8gc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQ4KiAgICAgICAgICAgICAgICBwU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAvKio8IFNpemUgb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgc2NhbGVfYXVkaW87ICAgICAgICAgICAgLyoqPCBmcmVxdWVuY3kgLyAxMDAwLjAgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwgZGVjb2RlciBmdW5jdGlvbnMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgU2hlbGxBUEk7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICpwUGxhbmVZdXY7ICAvKiBZVVY0MjAgaW1hZ2UgcGxhbmUsIGNvbnZlcnRlZCBmcm9tIEFSR0I4ODggKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgbV9wUHJlUmVzaXplRnJhbWU7ICAvKiBUaGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIG9ubHkgaWYgcmVzaXplIG5lZWRlZCkqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAqcFBsYW5lWXV2V2l0aEVmZmVjdDsgLyogWVVWNDIwIGltYWdlIHBsYW5lLCB3aXRoIGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiR2V0WXV2RGF0YUZyb21EZWNvZGVyOyAgLyogQm9vbGVhbiB1c2VkIHRvIGdldCBZVVYgZGF0YSBmcm9tIGR1bW15IHZpZGVvIGRlY29kZXIgb25seSBmb3IgZmlyc3QgdGltZSAqLwotfSBNNFZTUzNHUFBfQ2xpcENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotZW51bQotewotICAgIE00VlNTM0dQUF9rTm9FbmNvZGVyLAotICAgIE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZCwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkLAotICAgIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9BdWRpb1ZpZGVvQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhdWRpbyB2aWRlbyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBhdWRpby92aWRlbywgZW5jb2Rpbmcvd3JpdGluZyBvcGVyYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogVGltaW5nIFN0dWZmICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIER1cmF0aW9uIG9mIHRoZSBvdXRwdXQgZmlsZSwgdXNlZCBmb3IgcHJvZ3Jlc3MgY29tcHV0YXRpb24gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZElucHV0VmlkQ3RzOwotICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIHZpZGVvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dFZpZEN0czsKLS8qKjwgW01pbGxpc2Vjb25kc10gQ3VycmVudCBDVFMgb2YgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW0gKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZEFUbzsKLSAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUsIHVzZWQgZm9yIHByb2dyZXNzIGNvbXB1dGF0aW9uICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlPdXRwdXREdXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCBWaWRlbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgVmlkZW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gY29kZWMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Qcm9maWxlOyAgLyoqPCBPdXRwdXQgdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBvdXRwdXRWaWRlb0xldmVsOyAgIC8qKjwgT3V0cHV0IHZpZGVvIGxldmVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9CaXRyYXRlOyAgICAgLyoqPCBBdmVyYWdlIHZpZGVvIGJpdHJhdGUgb2YgdGhlIG91dHB1dCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgZnJvbSBpbnB1dCBiaXRyYXRlcywgZHVyYXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zIGFuZCBjdXRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IE91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgT3V0cHV0IGltYWdlIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvVGltZVNjYWxlOyAgICAgICAgLyoqPCBUaW1lIHNjYWxlIHRvIHVzZSBmb3IgdGhlIGVuY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdHJhbnNpdGlvbiAoaWYgTVBFRy00KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJWaWRlb0RhdGFQYXJ0aXRpb25pbmc7ICAgIC8qKjwgRGF0YSBwYXJ0aXRpb25pbmcgdG8gdXNlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgdGhlIHRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIE1QRUctNCkgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgICBwVmlkZW9PdXRwdXREc2k7ICAgICAgICAvKio8IERlY29kZXIgU3BlY2lmaWMgSW5mbyBvZiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUctNCB0cmFjayAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICB1aVZpZGVvT3V0cHV0RHNpU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3V0cHV0IE1QRUctNCB0cmFjayAqLwotICAgIC8qKgotICAgICAqIE91dHB1dCBBdWRpbyBTdHJlYW0gU3R1ZmYgKi8KLSAgICBNNFNZU19TdHJlYW1UeXBlICAgICAgICAgICAgQXVkaW9TdHJlYW1UeXBlOyAgICAgICAgLyoqPCBUeXBlIG9mIHRoZSBvdXRwdXQgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpTmJDaGFubmVsczsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAoMT1tb25vLCAyPXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAgICAgLyoqPCBBdWRpbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgLyoqPCBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1yLCAxNjAwMCBvciBtb3JlIGZvciBhYWMpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgICAgcEF1ZGlvT3V0cHV0RHNpOyAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgIHVpQXVkaW9PdXRwdXREc2lTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvdXRwdXQgYXVkaW8gdHJhY2sgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIEVuY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY0N0eHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgICAgICAgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7ICAgICAvKio8IENvbmZpZyBvZiB0aGUgYXVkaW8gZW5jb2RlciAqLwotCi0gICAgLyoqCi0gICAgICogU2lsZW5jZSBmcmFtZSBzdHVmZiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VQY21TaXplOyAgICAgICAvKio8IFNpemUgdG8gcmVzZXJ2ZSB0byBzdG9yZSBhIHBjbSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgemVyb3MgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICAgICAgcFNpbGVuY2VGcmFtZURhdGE7ICAgICAgLyoqPCBQb2ludGVyIHRvIHNpbGVuY2UgZnJhbWUgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZUZyYW1lU2l6ZTsgICAgIC8qKjwgU2l6ZSBvZiBzaWxlbmNlIGZyYW1lIGRhdGEgY29tcGF0aWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVNpbGVuY2VGcmFtZUR1cmF0aW9uOyAgLyoqPCBbVGltZXNjYWxlXSBEdXJhdGlvbiBvZiBzaWxlbmNlIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIHNjYWxlX2F1ZGlvOyAgICAgICAgICAgIC8qKjwgZnJlcXVlbmN5IC8gMTAwMC4wICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBFbmNvZGVyIHN0dWZmICovCi0gICAgTTRFTkNPREVSX0NvbnRleHQgICAgICAgICAgICBwRW5jQ29udGV4dDsgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGVuY29kZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICAgICAgICBPdXJXcml0ZXJEYXRhSW50ZXJmYWNlOyAgICAvKio8IE91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBpbnRlcmZhY2UsIHRvIGdpdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVuY29kZXIgc2hlbGwgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgICAgICAgcER1bW15QXVCdWZmZXI7ICAgICAgICAgICAgLyoqPCBCdWZmZXIgZ2l2ZW4gdG8gdGhlIGVuY29kZXIgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gd3JpdGUgQVVzIHdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpTXBlZzRHb3ZPZmZzZXQ7ICAgICAgICAvKio8IENsaXAgR09WIG9mZnNldCBpbiBtcyBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGFuZCBzeXN0ZW0gdGltZSAqLwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICAgVnBwRXJyb3I7ICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IgZm9yIFZQUCBhcmUgbWFza2VkIGJ5IFZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVyLCBzbyB3ZSBtdXN0IHJlbWVtYmVyIGl0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlciBzdHVmZiAqLwotICAgIE00V1JJVEVSX0NvbnRleHQgICAgICAgICAgICBwM2dwV3JpdGVyQ29udGV4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQUCB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICAgICAgIFdyaXRlclZpZGVvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAgICAgICAgV3JpdGVyQXVkaW9TdHJlYW07ICAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgICAgV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgICAgV3JpdGVyQXVkaW9TdHJlYW1JbmZvOyAgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIFdyaXRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgICAgICAvKio8IE1heCBBVSBzaXplIHNldCB0byB0aGUgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB2aWRlbyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAgICAgICAgLyoqPCBNYXggQVUgc2l6ZSBzZXQgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgYXVkaW8gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlPdXRwdXRBdmVyYWdlVmlkZW9CaXRyYXRlOyAvKio8IEF2ZXJhZ2UgdmlkZW8gYml0cmF0ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgYml0cmF0ZXMsIGR1cmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbnMgYW5kIGN1dHMgKi8KLQotfSBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGVkaXQgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBlZGl0IG9wZXJhdGlvbnMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIFZTUyAzR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0VkaXRTdGF0ZSAgICAgICAgIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgICAgVnN0YXRlOwotICAgIE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSAgICBBc3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VyIFNldHRpbmdzIChjb3BpZWQsIHRodXMgb3duZWQgYnkgVlNTM0dQUCkgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcE51bWJlcjsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnQgb2YgdGhlIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBwQ2xpcExpc3QuICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKnBDbGlwTGlzdDsgICAgICAgICAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiB1aUNsaXBOdW1iZXIgY2xpcCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgICAqcFRyYW5zaXRpb25MaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIHRyYW5zaXRpb24gc2V0dGluZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgdWlDbGlwTnVtYmVyLTEgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAqcEVmZmVjdHNMaXN0OyAgICAgICAgLyoqPCBMaXN0IG9mIHRoZSBlZmZlY3RzIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0OyAgICAvKio8IExpc3Qgb2YgdGhlIGFjdGl2ZSBlZmZlY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgICAgICAgIC8qKjwgTnVtYmVycyBvZiBlZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHM7ICAgIC8qKjwgTnVtYmVycyBvZiBhY3RpdmUgZWZmZWN0cyBSQyAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgU3R1ZmYgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXA7ICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBjdXJyZW50IGNsaXAgMSBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBsaXN0ICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgICAgIHBDMTsgICAgICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBjdXJyZW50IGNsaXAgMSAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgICAgICBwQzI7ICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgY3VycmVudCBjbGlwIDIgKi8KLQotICAgIC8qKgotICAgICAqIERlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICAgICAgZE91dHB1dEZyYW1lRHVyYXRpb247ICAgIC8qKjwgW01pbGxpc2Vjb25kc10gZGlyZWN0bHkgcmVsYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZnJhbWUgcmF0ZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2MVszXTsgICAgICAgICAgICAvKio8IEZpcnN0IHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djJbM107ICAgICAgICAgICAgLyoqPCBTZWNvbmQgdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAgeXV2M1szXTsgICAgICAgICAgICAvKio8IFRoaXJkIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgUkMgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djRbM107ICAgICAgICAgICAgLyoqPCBGb3VydGggdGVtcG9yYXJ5IFlVVjQyMCBpbWFnZSBwbGFuZSBSQyAqLwotCi0gICAgLyoqCi0gICAgICogRWZmZWN0IHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXAxQXRCZWdpbkN1dDsgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGhlIGNsaXAxIGlzIGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIGJlZ2luIGN1dCAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMUFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAxICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNpbXVsdGFuZW91c2x5KSAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgICAgICAgIGlDbGlwMkFjdGl2ZUVmZmVjdDsgICAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIENsaXAyICg8MCBtZWFucyBub25lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgdmlkZW8gYW5kIGF1ZGlvIGJ1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2ltdWx0YW5lb3VzbHkpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlRyYW5zaXRpb25FZmZlY3Q7ICAgICAgICAvKio8IFRydWUgaWYgdGhlIHRyYW5zaXRpb24gZWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYXBwbGllZCBhdCB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHRoZSBvdXRwdXQgc3RyZWFtIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgc2lsZW5jZSAoZXZlbiBpZiBub3QgZWRpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBleGFtcGxlIEFBQyssIGJ1dCBub3QgRVZSQykgKi8KLSAgICBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICAgIGV3YzsgICAgICAgICAgICAgICAgLyoqPCBBdWRpbyBhbmQgdmlkZW8gZW5jb2RlL3dyaXRlIHN0dWZmICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJJc01NUzsgICAgICAgICAgICAgICAgLyoqPCBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB3ZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGEgZmlsZSB3aXRoIGFuIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29uc3RyYWludCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlNTVNWaWRlb0JpdHJhdGU7ICAgIC8qKjwgSWYgaW4gTU1TIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkIHZpZGVvIGJpdHJhdGUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICBNTVN2aWRlb0ZyYW1lcmF0ZTsgICAgLyoqPCBJZiBpbiBNTVMgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWQgdmlkZW8gZnJhbWVyYXRlICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAgICAgICAgIFNoZWxsQVBJOyAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJJc3NlY29uZENsaXA7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0c0xpc3QxOyAgLyoqPCBMaXN0IG9mIHRoZSBhY3RpdmUgZWZmZWN0cyBzZXR0aW5ncy4gQXJyYXkgb2YgbmJFZmZlY3RzIFJDICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgIG5iQWN0aXZlRWZmZWN0czE7ICAvKio8IE51bWJlcnMgb2YgYWN0aXZlIGVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iQ2xpcEV4dGVybmFsSGFzU3RhcnRlZDsgIC8qKjwgRmxhZyB0byBpbmRpY2F0ZSB0aGF0IGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGVmZmVjdCBpcyBhY3RpdmUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgaUluT3V0VGltZU9mZnNldDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYkVuY29kZVRpbGxFb0Y7Ci0gICAgTTR4VlNTX0VkaXRTZXR0aW5ncyAgICAgIHhWU1M7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0KLSAgICBNNE9TQV9Cb29sIGJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3Q7IC8qKjwgT3ZlcmxheSBmbGFnIGZvciBjbGlwMSAqLwotICAgIE00T1NBX0Jvb2wgYkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdDsgLyoqPCBPdmVybGF5IGZsYWcgZm9yIGNsaXAyLCB1c2VkIGluIHRyYW5zaXRpb24gKi8KLX0gTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGF1ZGlvIG1peGluZyBWU1MgM0dQUCBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgb3BlcmF0aW9ucyB0byBzdG9yZQotICogICAgICAgICAgICAgICAgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqICAgIFZTUyBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1N0YXRlIFN0YXRlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIHN0YXRlICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBjb3B5IG9mIHRoZSBpbnB1dCBzZXR0aW5ncyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlBZGRDdHM7ICAgICAgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCB3aGljaCB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUVuZExvb3A7ICAgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIG9mIHRoZSBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgYXVkaW8vdmlkZW8gZmlsZSAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIElucHV0Q2xpcFNldHRpbmdzOyAgICAgICAgLyoqPCBTdHJ1Y3R1cmUgaW50ZXJuYWxseSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0dQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIEFkZGVkIGF1ZGlvIGZpbGUgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBBZGRlZENsaXBTZXR0aW5nczsgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGFkZGVkIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0KiAgICAgICAgcEFkZGVkQ2xpcEN0eHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGFkZGVkIDNHUFAgY2xpcCAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gc3R1ZmYgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZk9yaWdGYWN0b3I7ICAgICAgICAgICAgLyoqPCBGYWN0b3IgdG8gYXBwbHkgdG8gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgZm9yIHRoZSBtaXhpbmcgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgZkFkZGVkRmFjdG9yOyAgICAgICAgICAgIC8qKjwgRmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBmb3IgdGhlIG1peGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiU3VwcG9ydFNpbGVuY2U7ICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgb3V0cHV0IHN0cmVhbSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNpbGVuY2UgKGV2ZW4gaWYgbm90IGVkaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBBQUMrLCBidXQgbm90IEVWUkMpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJIYXNBdWRpbzsgICAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVsZXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiQXVkaW9NaXhpbmdJc05lZWRlZDsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZG8gbWl4aW5nICovCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGluZyBhbmQgV3JpdGluZyBvcGVyYXRpb25zICovCi0gICAgTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAgICBld2M7ICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gYW5kIHZpZGVvIGVuY29kZS93cml0ZSBzdHVmZiAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZXMgb2YgdGhlIHVzZWQgbW9kdWxlcyAqLwotICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCBTaGVsbEFQSTsgICAgICAgICAgICAgICAvKio8IEZpbGVzeXN0ZW0gYW5kIHNoZWxsIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciBmdW5jdGlvbnMgKi8KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBSYXRlIENvbnZlcnRvciAoU1NSQykgc3R1ZmYgKG5lZWRlZCBpbiBjYXNlIG9mIG1peGluZyB3aXRoICE9IEFTRi9uYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9TU1JDbmVlZGVkOyAgICAgICAgLyoqPCBJZiB0cnVlLCBTU1JDIGlzIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCE9IEFTRiBvciBuYiBvZiBjaGFubmVscykgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgQ2hhbm5lbENvbnZlcnNpb247ICAgIC8qKjwgMT1Db252ZXJzaW9uIGZyb20gTW9ubyB0byBTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyPVN0ZXJlbyB0byBNb25vLCAwPW5vIGNvbnZlcnNpb24gKi8KLSAgICBTU1JDX0luc3RhbmNlX3QgICAgICAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBTc3JjICovCi0gICAgU1NSQ19TY3JhdGNoX3QqICAgICAgICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxJbjsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG5lZWRzIGFzIGlucHV0ICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJJbjsgICAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5Tc3JjQnVmZmVySW47ICAgIC8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBpbiBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luU3NyY0J1ZmZlck91dDsvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgb3V0IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwVGVtcEJ1ZmZlcjsgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICBwUG9zSW5UZW1wQnVmZmVyOyAgICAvKio8IFBvc2l0aW9uIGluIHRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbWluaW11bUJ1ZmZlckluOyAgICAvKio8IE1pbmltdW0gYW1vdW50IG9mIGRlY29kZWQgZGF0YSB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIGJ5IFNTUkMgYW5kIGNoYW5uZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsgIC8qKjwgVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoIGJhY2tncm91bmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOyAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHRvIGludmVyc2Ugb2YgdGhpcyBmYWN0b3IgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgbG93Vm9sdW1lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBhdWRpb1ZvbHVtZUFycmF5W1dJTkRPV19TSVpFXTsgLy8gc3RvcmUgcGVhayBhdWRpbyB2b2wuIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZHVyYXRpb24gZm9yIFdJTkRPV19TSVpFCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGF1ZFZvbEFyckluZGV4OwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBkdWNraW5nRmFjdG9yIDsgICAgIC8qKjwgbXVsdGlwbHkgYnkgdGhpcyBmYWN0b3IgdG8gYnJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQURFIElOL0ZBREUgT1VUIGVmZmVjdCAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICBmQlRWb2xMZXZlbDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZlBUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJEb0R1Y2tpbmc7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTm9Mb29waW5nOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBianVtcGZsYWc7Ci0KLX0gTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBleHRyYWN0IHBpY3R1cmUgVlNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb25zIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBWU1MgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZSBTdGF0ZTsgICAgICAgICAgICAgICAgLyoqPCBWU1MgZXh0cmFjdCBwaWN0dXJlaW50ZXJuYWwgc3RhdGUgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IGZpbGVzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgQ2xpcFNldHRpbmdzOyAgICAgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZSB0aGUgaW5wdXQgM0ZQUCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBJbnB1dENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBpbnB1dCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIFNldHRpbmdzICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlFeHRyYWN0Q3RzOyAgICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ3RzIG9mIHRoZSBBVQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGV4dHJhY3RlZCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gc3R1ZmYgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIGRlY1BsYW5lc1szXTsgICAgICAgICAgICAvKio8IERlY29kZWQgWVVWNDIwIHBpY3R1cmUgcGxhbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgRGVjb2RlZCBpbWFnZSBoZWlnaHQgKi8KLQotICAgIC8qCi0gICAgICogRGVjb2RlciBpbmZvICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlY0N0czsgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIERlY29kZWQgQVUgQ3RzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgYkp1bXBGbGFnOyAgICAgLyoqPCAxIGlmIGEganVtcCBoYXMgYmVlbiBtYWRlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgaURlbHRhVGltZTsgICAvKio8IFtNaWxsaXNlY29uZHNdIFRpbWUgYmV0d2VlbiBwcmV2aW91cyBSQVAgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlHYXA7ICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGJldHdlZW4ganVtcCBBVSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0aW9uIHRpbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0ZXA7ICAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gUHJvZ3Jlc3MgYmFyIHRpbWUgaW5jcmVtZW50ICovCi0KLSAgICAvKioKLSAgICAgKiBGaWxlc3lzdGVtIGZ1bmN0aW9ucyAqLwotICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgIHBPc2FGaWxlUmVhZFB0cjsKLSAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgcE9zYUZpbGVXcml0UHRyOwotCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYkNsaXBPcGVuZWQ7Ci19IE00VlNTM0dQUF9JbnRlcm5hbEV4dHJhY3RQaWN0dXJlQ29udGV4dDsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxUWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlMTAyZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000WFZTU19BUElfSF9fCi0jZGVmaW5lIF9fTTRYVlNTX0FQSV9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgVmlkZW8gU3R1ZGlvIDIuMQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0vKiBFcnJvcnMgY29kZXMgKi8KLQotLyoqCi0gKiBFbmQgb2YgYW5hbHl6aW5nID0+IHRoZSB1c2VyIGNhbiBjYWxsIE00eFZTU19QcmV2aWV3U3RhcnQgb3IgTTR4VlNTX1NhdmVTdGFydCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDEpCi0KLS8qKgotICogRW5kIG9mIHByZXZpZXcgZ2VuZXJhdGluZyA9PiB0aGUgdXNlciBjYW4gbGF1bmNoIHZwcyB0byBzZWUgcHJldmlldy4gT25jZSBwcmV2aWV3IGlzIG92ZXIsCi0gICB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1ByZXZpZXdTdG9wKCkgdG8gYmUgYWJsZSB0byBzYXZlIGVkaXRlZCBmaWxlLCBvciB0byBjYWxsIGFub3RoZXIKLSAgIE00eFZTU19TZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWSAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwMikKLQotLyoqCi0gKiBFbmQgb2Ygc2F2ZWQgZmlsZSBnZW5lcmF0aW9uID0+IHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU2F2ZVN0b3AoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDMpCi0KLS8qKgotICogVHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5IHRvIGdvIGZ1cnRoZXIgLT4gaWYgdGhlIHVzZXIgZG9lcyBub3Qgd2FudCB0byBjb250aW51ZSwKLSAgaGUgbXVzdCBjYWxsIE00eFZTU19zZW5kQ29tbWFuZCgpICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfVFJBTlNDT0RJTkdfTkVDRVNTQVJZICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNCkKLQotLyoqCi0gKiBJbiBjYXNlIG9mIE1NUywgdGhlIG91dHB1dCBmaWxlIHNpemUgd29uJ3QgYmUgcmVhY2hlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRCAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDUpCi0KLS8qKgotICogSlBHIGlucHV0IGZpbGUgZGltZW5zaW9ucyBhcmUgdG9vIGhpZ2ggKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9KUEdfVE9PX0JJRyAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWUywgMHgwMDAxKQotCi0vKioKLSAqIFVURiBDb252ZXJzaW9uLCB3YXJuaW5nIG9uIHRoZSBzaXplIG9mIHRoZSB0ZW1wb3JhcnkgY29udmVydGVkIGJ1ZmZlciovCi0jZGVmaW5lIE00eFZTU1dBUl9CVUZGRVJfT1VUX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlMsIDB4MDAwNikKLQotLyoqCi0gKiBTV0lLQVIgOkVycm9yIHdoYW4gTk9fTU9SRV9TUEFDRSovCi0jZGVmaW5lIE00eFZTU0VSUl9OT19NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlMsIDB4MDAwNykKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCsxLCAvKiAyNTcgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjU4ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1OSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjAgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYxICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MiAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1RleHQsIC8qIFRleHQgb3ZlcmxheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjMgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjY0ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2NSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjYgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY3ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2OCovCi19IE00eFZTU19WaWRlb0VmZmVjdFR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTR4VlNTX1ZpZGVvVHJhbnNpdGlvblR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgdmlkZW8gZWZmZWN0IHRoYXQgY2FuIGJlIGFwcGxpZWQgZHVyaW5nIGEgdHJhbnNpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwsIC8qMjU2Ki8KLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYywKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uLAotICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2sKLQotfSBNNHhWU1NfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIFZQUyBmb3IgcHJldmlldwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAzZ3BQcmV2aWV3RmlsZTsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFBDTUZpbGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBvdXRQQ01fQVNGOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICAgICAgICAgICAgICAgICAgICpFZmZlY3RzOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7Ci0KLX0gTTR4VlNTX1ByZXZpZXdTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX3RvVVRGOEZjdAotICogQGJyaWVmICAgICAgICBUaGlzIHByb3RvdHlwZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgdG8gY29udmVydCBhIHN0cmluZyBlbmNvZGVkIGluIGFueSBmb3JtYXQgdG8gYW4gVVRGOCBzdHJpbmcuCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQnVmZmVySW4gICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIFVURjgKLSAqIEBwYXJhbSAgICBwQnVmZmVyT3V0ICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBVVEY4IGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX3RvVVRGOEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICpwQnVmZmVyT3V0LAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgKmJ1ZmZlck91dFNpemUKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX2Zyb21VVEY4RmN0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgcHJvdG90eXBlIGRlZmluZXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICB0byBjb252ZXJ0IGFuIFVURjggc3RyaW5nIHRvIGEgc3RyaW5nIGVuY29kZWQgaW4gYW55IGZvcm1hdC4KLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBCdWZmZXJJbiAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgVVRGOCBzdHJpbmcgdG8gY29udmVydAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgotICogQHBhcmFtICAgIHBCdWZmZXJPdXQgICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcKLSAqIEBwYXJhbSAgICBidWZmZXJPdXRTaXplICAgIElOL09VVCAgICBJTjogICAgIFNpemUgb2YgdGhlIGdpdmVuIG91dHB1dCBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiBTaXplIG9mIHRoZSBjb252ZXJ0ZWQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTR4VlNTX2Zyb21VVEY4RmN0KQotKAotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgKnBCdWZmZXJJbiwKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgKnBCdWZmZXJPdXQsCi0gICAgTTRPU0FfVUludDMyICAgICAgICAqYnVmZmVyT3V0U2l6ZQotKTsKLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0luaXRQYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHBhcmFtZXRlcnMgZm9yIHhWU1MuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsKLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU190b1VURjhGY3QgICAgICAgICAgICAgICAgcENvbnZUb1VURjhGY3Q7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU19mcm9tVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udkZyb21VVEY4RmN0OwotCi0KLQotfSBNNHhWU1NfSW5pdFBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0luaXQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgeFZTUwotICogQG5vdGUgICAgICAgIEluaXRpYWxpemVzIHRoZSB4VlNTIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcGFyYW1zICAgICAgICAgICAgICAgIChJTikgUGFyYW1ldGVycyBtYW5kYXRvcnkgZm9yIHhWU1MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgZ2l2ZW4gZWRpdGluZyBzdHJ1Y3R1cmUgaW4gb3JkZXIgdG8KLSAqICAgICAgICAgICAgICAgIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgaWYgbmVlZGVkLCBjaGFuZ2VzIHRoZQotICogICAgICAgICAgICAgICAgb3V0cHV0IHBhcmFtZXRlcnMgKFZpZGVvIGNvZGVjLCB2aWRlbyBzaXplLCBhdWRpbyBjb2RlYywKLSAqICAgICAgICAgICAgICAgIGF1ZGlvIG5iIG9mIGNoYW5uZWxzKSB0byBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgdG8gdGhlIHhWU1MgYW4gZWRpdGluZyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIHByZXBhcmUgZWRpdGlvbgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfSW5pdCwgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgIE00eFZTU19DbG9zZUNvbW1hbmQsIG9yIGFmdGVyIE00eFZTU19QcmV2aWV3U3RvcC4KLSAqICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCB1bnRpbAotICogICAgICAgICAgICAgICAgaXQgcmV0dXJucyBhbm90aGVyIGVycm9yIHRoYW4gTTROT19FUlJPUi4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19QcmV2aWV3U3RhcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBwcmV2aWV3Ci0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBwcmV2aWV3IGZpbGUgYW5kIGZpbGwgcFByZXZpZXdTZXR0aW5ncyB3aXRoCi0gKiAgICAgICAgICAgICAgICBwcmV2aWV3IHBhcmFtZXRlcnMuCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQcmV2aWV3U2V0dGluZ3MgICAgKElOKSBQcmV2aWV3IHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1ByZXZpZXdTdGFydChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNHhWU1NfUHJldmlld1NldHRpbmdzKiBwUHJldmlld1NldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1ByZXZpZXdTdG9wCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gdW5hbGxvY2F0ZSBwcmV2aWV3IHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZSB0byBhbGxvdyBzYXZpbmcgb3IgcmVzZW5kIGFuIGVkaXRpbmcgY29tbWFuZAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19QcmV2aWV3U3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NhdmVTdGFydAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU2F2ZVN0b3AKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiB1bmFsbG9jYXRlIHNhdmUgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBNNHhWU1NfU3RlcCBoYXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkUKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TdGVwCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uIGZyb20gMCB0byAxMDAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfQ2xvc2VDb21tYW5kCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0Nsb3NlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0NsZWFuVXAKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFsbCB4VlNTIHJlc3NvdXJjZXMKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19DbG9zZUNvbW1hbmQuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3IKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBPdXRwdXRQbGFuZXMsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWRkIGEgZml4ZWQgb3IgYW5pbWF0ZWQgaW1hZ2Ugb24gYW4gaW5wdXQgWVVWNDIwIHBsYW5hciBmcmFtZQotICogQG5vdGUgICAgVGhlIHByb3RvdHlwZSBvZiB0aGlzIGVmZmVjdCBmdW5jdGlvbiBpcyBleHBvc2VkIGJlY2F1c2UgaXQgbmVlZHMgdG8KLSAqICAgICAgICAgICAgY2FsbGVkIGJ5IHRoZSBWUFMgZHVyaW5nIHRoZSBwcmV2aWV3Ci0gKiBAcGFyYW0gICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzCi0oCi0gICAgTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwSW5wdXRQbGFuZXMsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIHpvb20gdG8gYXBwbHkgKEluL091dCkKLSAqIEBwYXJhbSAgICBQbGFuZUluICAgICAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncygpCi0gKiBAYnJpZWYgICAgQWxsb3dzIGZpbGxpbmcgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gKgotICogQG5vdGUgICAgV0FSTklORzogcENsaXBTZXR0aW5ncy0+RWZmZWN0c1sgXSB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICogICAgICAgICAgICAgICAgICAgcENsaXBTZXR0aW5ncy0+cEZpbGUgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgcEZpbGUgICAgICAgICAgICAgICAoSU4pIENsaXAgZmlsZSBuYW1lCi0gKiBAcGFyYW0gICBmaWxlUGF0aFNpemUgICAgICAgIChJTikgU2l6ZSBvZiB0aGUgY2xpcCBwYXRoIChuZWVkZWQgZm9yIHRoZSBVVEYxNiBjb252ZXJzaW9uKQotICogQHBhcmFtICAgIG5iRWZmZWN0cyAgICAgICAgICAgKElOKSBOYiBvZiBlZmZlY3Qgc2V0dGluZ3MgdG8gYWxsb2NhdGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLCBNNE9TQV9Wb2lkKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX0ZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBNQ1MgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIGFuYWx5emluZyBzdGF0ZQotICogICAgICAgICAgICAgICAgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIG1jc0NvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gcG9pbnRlciBvZiBtY3MgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2dldE1DU0NvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcKLSAqICAgICAgICAgICAgICAgIHByZXZpZXcgb3IgYmV5b25kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ29udGV4dCogdnNzM2dwcENvbnRleHQpOwotCi0vLyBHZXQgc3VwcG9ydGVkIHZpZGVvIGRlY29kZXJzIGFuZCBjYXBhYmlsaXRpZXMuCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0jZW5kaWYgLyogX19NNFhWU1NfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTI5NjU3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000eFZTU19JbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRYVlNTX0lOVEVSTkFMX0hfXwotI2RlZmluZSBfX000WFZTU19JTlRFUk5BTF9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfSW50ZXJuYWwuaAotICogQGJyaWVmICAgIEludGVybmFsIG9mIFZpZGVvIEF1dGhvcmluZy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE00X3hWU1NfTUFKT1IgICAgICAgIDEKLSNkZWZpbmUgTTRfeFZTU19NSU5PUiAgICAgICAgNQotI2RlZmluZSBNNF94VlNTX1JFVklTSU9OICAgIDUKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGRlc2NyaWJlIHRoZSBtYXggZGltZW5zaW9ucyBvZiBhbiBpbnB1dCBKUEcgKi8KLSNkZWZpbmUgTTRYVlNTX01YX0pQR19OQl9PRl9QSVhFTFMgICAgMzkyNjAxNgotCi0vKlNpemUgb2YgdGhlIFVURiB0ZW1wb3JhcnkgY29udmVyc2lvbiBidWZmZXIga2VlcCBpbiB0aGUgVkEgaW50ZXJuYWwgY29udGV4dCBhbmQKLWFsbG9jYXRlIGF0IHRoZSBpbml0aWFsaXphdGlvbiovCi0jZGVmaW5lIFVURl9DT05WRVJTSU9OX0JVRkZFUl9TSVpFICAgICAgICAgICAgMjA0OAotCi0vKiBNYXggcGF0aCBsZW5ndGggc2l6ZSAqLwotI2RlZmluZSAgTTRYVlNTX01BWF9QQVRIX0xFTiAyNTYKLQotLyoqIERldGVybWluZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhLiAqLwotI2RlZmluZSBNNHhWU1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotLyoqIFksVSxWIHZhbHVlcyBpbiBjYXNlIG9mIGJsYWNrIGJvcmRlcnMgcmVuZGVyaW5nICovCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19FZmZlY3RzQWxwaGFCbGVuZGluZwotICogQGJyaWVmICAgIEludGVybmFsIGVmZmVjdHMgYWxwaGEgYmxlbmRpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGludGVybmFsIGluZm9ybWF0aW9ucyB0byBjcmVhdGUgYW4gYWxwaGEKLSAqICAgICAgICAgICAgYmxlbmRpbmcgZm9yIHRoZSBlZmZlY3RzIHRleHQgYW5kIGZyYW1pbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVJblRpbWU7ICAgICAgICAvKlN0YXJ0IHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2ZhZGVPdXRUaW1lOyAgICAgICAgLypNaWRkbGUgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fZW5kOyAgICAgICAgICAgIC8qRW5kIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX21pZGRsZTsgICAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZiBlZmZlY3QgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVJbiBwaGFzZSovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgIG1fc3RhcnQ7ICAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEZhZGVPdXQgcGhhc2UqLwotCi19IE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRISVMgU1RSVUNUVVJFIE1VU1QgTk9UIEJFIE1PRElGSUVECi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIGFuZCBieSBWUFMgZm9yIHByZXZpZXdpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklGSV9JbWFnZVBsYW5lICpGcmFtaW5nUmdiOyAgICAgICAgICAgICAgICAvKio8IGRlY29kZWQgQkdSNTY1IHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKkZyYW1pbmdZdXY7ICAgICAgICAgICAgICAgIC8qKjwgY29udmVydGVkIFlVVjQyMCBwbGFuYXIgcGxhbmUgKi8KLSAgICBNNE9TQV9JbnQzMiBkdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBmcmFtZSAqLwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzQ2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBTQVZJTkcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3T2Zmc2V0Q2xpcFRpbWU7ICAgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aWV3Q2xpcFRpbWU7ICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgZm9yIFBSRVZJRVcgKi8KLSAgICBNNE9TQV9Wb2lkKiBwQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgdXNlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZyBmaWx0ZXIgKi8KLSAgICBNNE9TQV9Wb2lkKiBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZXh0IE00eFZTU19GcmFtaW5nU3RydWN0LCBpZiBubyBtb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgb24gY3VycmVudCBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqLwotICAgIE00T1NBX1VJbnQzMiB0b3BsZWZ0X3g7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgb2YgdGhlIGZpcnN0IGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgdG9wbGVmdF95OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIG9mIHRoZSBmaXJzdCBkZWNvZGVkIHBpeGVsICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7IC8qIEFscGhhIGJsZW5kaW5nIFN0cnVjdCAqLwotLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGluIGNhc2Ugb2YgZmlsZSBBUkdCODg4IHVzZWQgaW4gZnJhbWluZwotIGFzIHZpZGVvIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB3aWR0aDsgICAvKndpZHRoIG9mIHRoZSBBUkdCODg4OCBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgaGVpZ2h0OyAvKmhlaWdodCBvZiB0aGUgQVJHQjg4ODggY2xpcCAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCBvbmx5IGlmIHZpZGVvIGVmZmVjdCBpcyBmcmFtbWluZyAqLwotCi19IE00eFZTU19GcmFtaW5nU3RydWN0OwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEhJUyBTVFJVQ1RVUkUgTVVTVCBOT1QgQkUgTU9ESUZJRUQKLSAqIHN0cnVjdCAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZnJhbWluZyBlZmZlY3QsIHdoZW4gdGhlIGZsYWcKLSAgICAgICAgICAgICAgICBERUNPREVfR0lGX09OX1NBVklORyBpcyBhY3RpdmF0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4OyAgICAgICAgLyoqPEZyYW1pbmcgc3RydWN0IGZvciB0aGUgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiAgICAgICAgICAgIGFGcmFtaW5nQ3R4X2xhc3Q7ICAgIC8qKjxGcmFtaW5nIHN0cnVjdCBmb3IgdGhlIGRlY29kaW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZXZpb3VzIGZyYW1lIG9mIHRoZSBnaWYqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7ICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogICAgICAgIHBGaWxlV3JpdGVQdHI7ICAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFNQU0NvbnRleHQ7ICAgICAgICAvKio8U1BTIGNvbnRleHQgZm9yIHRoZSBHSUYgZGVjb2RpbmcqLwotICAgIC8vTTRTUFNfU3RyZWFtICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbTsgICAgICAgIC8qKjxHSUYgaW5wdXQgc3RyZWFtIGJ1ZmZlciBwb2ludGVyKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBFZmZlY3RGaWxlUGF0aDsgICAgLyoqPGZpbGUgcGF0aCBvZiB0aGUgZ2lmKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICBvdXRwdXRWaWRlb1NpemU7ICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgUkMgKi8KLSAgICAvL000U1BTX0Rpc3Bvc2FsTW9kZSAgICAgICAgICAgICAgICBkaXNwb3NhbDsgICAgICAgICAgICAvKio8cHJldmlvdXMgZnJhbWUgR0lGIGRpc3Bvc2FsKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIGJfYW5pbWF0ZWQ7ICAgICAgICAgICAgLyoqPElzIHRoZSBHSUYgYW5pbWF0ZWQ/Ki8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYkVmZmVjdFJlc2l6ZTsgICAgICAgIC8qKjxJcyB0aGUgZ2lmIHJlc2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0b3BsZWZ0X3g7ICAgICAgICAgICAgLyoqPCBUaGUgdG9wLWxlZnQgWCBjb29yZGluYXRlIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcGljdHVyZSBvZiB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdG9wbGVmdF95OyAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFkgY29vcmRpbmF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBpY3R1cmUgb2YgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8R0lGIHdpZHRoLCBmaWxsIGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSBTUFMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgICAvKio8R0lGIGhlaWdodCwgZmlsbCBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHdpdGggdGhlIFNQUyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBlZmZlY3REdXJhdGlvbjsgICAgICAgIC8qKjxFZmZlY3QgZHVyYXRpb24qLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0U3RhcnRUaW1lOyAgICAvKio8RWZmZWN0IHN0YXJ0IHRpbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgY2xpcFRpbWU7ICAgICAgICAgICAgLyoqPGN1cnJlbnQgb3V0cHV0IGNsaXAgdGltZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBmcmFtZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X2NsaXBUaW1lOyAgICAgICAgLyoqPHByZXZpb3VzIG91dHB1dCBjbGlwIHRpbWUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzIGZyYW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RTdGVwRHVyYXRpb247ICAgIC8qKjxUaW1lIGludGVydmFsIGJldHdlZW4gdGhlIHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYW5kIHRoZSBjdXJyZW50IGZyYW1lKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgYl9Jc0ZpbGVHaWY7ICAgICAgICAvKio8SXMgdGhlIGZyYW1pbmcgdXNpbmcgYSBnaWYgZmlsZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3dpZHRoOyAgICAgICAgICAgIC8qKjxMYXN0IGZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfaGVpZ2h0OyAgICAgICAgLyoqPExhc3QgZnJhbWUgaGVpZ2h0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF94OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeCB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGxhc3RfdG9wbGVmdF95OyAgICAgICAgLyoqPExhc3QgZnJhbWUgeSB0b3BsZWZ0Ki8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZ2lmX3RpbWU7ICAgIC8qKjwgQ3VycmVudCB0aW1lIG9zIHRoZSBHSUYgaW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgdGltZSAqLwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblJhdGlvOyAgICAvKio8IEZyYW1lIGR1cmF0aW9uIHJhdGlvICovCi0gICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqICAgIGFscGhhQmxlbmRpbmdTdHJ1Y3Q7LypBbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotI2lmZGVmIERFQlVHX0dJRgotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgdWlEZWJ1Z19maWxlQ291bnRlcjsvKio8Zm9yIGRlYnVnIHB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50IHRoZSBmcmFtZSBvZiB0aGUgZ2lmKi8KLSNlbmRpZiAvKkRFQlVHX0dJRiovCi19TTR4VlNTX0ZyYW1pbmdDb250ZXh0OwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAqIEBicmllZiAgICBJbnRlcm5hbCB4VlNTIHBhcmFtZXRlciBmb3IgUHRvM0dQUCBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBQdG8zR1BQIG1vZHVsZQotICogQG5vdGUgICAgQWxsIHRoZSBKUEcgZmlsZXMgdG8gdHJhbnNmb3JtIHRvIDNHUCBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlSW47Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZU91dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlVGVtcDsgICAgICAgICAgICAvKio8IHRlbXBvcmFyeSBmaWxlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHdyaXRpbmcsIE5VTEwgaXMgY3N0bWVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciBub3QgdXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb247Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7ICAgICAgICAgICAgLyoqPCBUaGlzIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSBpcyBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW4gYW5kIHpvb20gbW9kZSBpcyBlbmFibGVkICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tWGE7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRYYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVRvcGxlZnRZYTsgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhiOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWI7ICAgIC8qKjwgUkMgKi8KLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAgICAgIC8qKjwgRkI6IHRvIHJlbmRlciBvciBub3QgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdCByYXRpbyAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIGZyYW1lcmF0ZTsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcE5leHQ7ICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBvZiBuZXh0IE00eFZTU19QdG8zR1BQX3BhcmFtcyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ICovCi0gICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4OndpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB3aWR0aDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgaGVpZ2h0OwotCi19IE00eFZTU19QdG8zR1BQX3BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ZpZnRpZXNTdHJ1Y3QKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgZmlmdGllcyBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBmaWZ0aWVzRWZmZWN0RHVyYXRpb247ICAgIC8qKjwgRHVyYXRpb24gb2YgdGhlIHNhbWUgZWZmZWN0IGluIGEgdmlkZW8gKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0NsaXBUaW1lOyAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nIGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIFNBVklORyAqLwotICAgIE00T1NBX1VJbnQzMiBzaGlmdFJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IFZlcnRpY2FsIHNoaWZ0IG9mIHRoZSBpbWFnZSAqLwotICAgICAgTTRPU0FfVUludDMyIHN0cmlwZVJhbmRvbVZhbHVlOyAgICAgICAgICAgICAgICAvKio8IEhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHN0cmlwZSAqLwotCi19IE00eFZTU19GaWZ0aWVzU3RydWN0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29sb3JSR0IxNgotICogQGJyaWVmICAgIEl0IGlzIHVzZWQgaW50ZXJuYWxseSBieSB4VlNTIGZvciBSR0IxNiBjb2xvciBlZmZlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3RUeXBlOyAgICAvKkNvbG9yIHR5cGUgb2YgZWZmZWN0Ki8KLSAgICBNNE9TQV9VSW50MTYgICAgcmdiMTZDb2xvckRhdGE7ICAgICAgICAgICAgLypSR0IxNiBjb2xvciBvbmx5IGZvciB0aGUgUkdCMTYgY29sb3IgZWZmZWN0Ki8KLX0gTTR4VlNTX0NvbG9yU3RydWN0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0Ci0gKiBAYnJpZWYgICAgVGhlIENhbGxiYWNrIENvbnRleHQgcGFyYW1ldGVycyBmb3IgUHRvM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgbV9GaWxlSW47Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9OYkltYWdlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fSW1hZ2VDb3VudGVyOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1fdGltZUR1cmF0aW9uOwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogIG1fcEZpbGVSZWFkUHRyOwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICAgICAgbV9wRGVjb2RlZFBsYW5lOyAvKiBVc2VkIGZvciBQYW4gYW5kIFpvb20gb25seSAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgbV9wUHRvM0dQUHBhcmFtczsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9haXJfY29udGV4dDsKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgICAgbV9tZWRpYVJlbmRlcmluZzsKLQotfSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBTdGF0ZSBvZiB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rU3RhdGVJbml0aWFsaXplZCA9IDAsCi0gICAgTTR4VlNTX2tTdGF0ZUFuYWx5emluZywKLSAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkLAotICAgIC8vTTR4VlNTX2tTdGF0ZUdlbmVyYXRpbmdQcmV2aWV3LAotICAgIC8vTTR4VlNTX2tTdGF0ZVByZXZpZXcsCi0gICAgTTR4VlNTX2tTdGF0ZVNhdmluZywKLSAgICBNNHhWU1Nfa1N0YXRlU2F2ZWQKLQotfSBNNHhWU1NfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgTWljcm8gc3RhdGUgb2YgdGhlIHhWU1MgZm9yIHByZXZpZXdpbmcvc2F2aW5nIHN0YXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rTWljcm9TdGF0ZUVkaXRpbmcgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUF1ZGlvTWl4aW5nCi0KLX0gTTR4VlNTX2VkaXRNaWNyb1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIE1pY3JvIHN0YXRlIG9mIHRoZSB4VlNTIGZvciBhbmFseXppbmcgc3RhdGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFAgPSAwLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUNvbnZlcnRQdG8zR1BQLAotICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MsCi0gICAgTTR4VlNTX2tNaWNyb1N0YXRlVHJhbnNjb2RlTUNTCi0KLX0gTTR4VlNTX2FuYWx5c2VNaWNyb1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19NQ1NfcGFyYW1zCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgeFZTUyBwYXJhbWV0ZXIgZm9yIE1DUyBtb2R1bGUKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGlzIGZpbGxlZCBieSBNNHhWU1Nfc2VuZENvbW1hbmQgZnVuY3Rpb24sCi0gKiBAbm90ZSAgICBhbmQgaXMgdXNlZCBkdXJpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBNQ1MgbW9kdWxlCi0gKiBAbm90ZSAgICBBbGwgdGhlIGlucHV0IGZpbGVzIHRvIHRyYW5zY29kZSBhcmUgY2hhaW5lZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVJbjsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVPdXQ7Ci0gICAgLyoqPCB0ZW1wb3JhcnkgZmlsZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0aW5nLCBOVUxMIGlzIGNzdG1lbSB3cml0ZXIgbm90IHVzZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVUZW1wOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVUeXBlOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICAgICBPdXRwdXRGaWxlVHlwZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSAgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0JHTTsKLSAgICAvKio8IFRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGtub3cgaWYgdGhlIG91dHB1dCBmaWxlIGlzIGFscmVhZHkgY3JlYXRlZCBvciBub3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NyZWF0ZWQ7Ci0gICAgLyoqPCBBZGRyZXNzIG9mIG5leHQgTTR4VlNTX01DU19wYXJhbXMqIGVsZW1lbnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7Ci0KLSAgICAvKkZCOiB0cmFuc2NvZGluZyBwZXIgcGFydHMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbkN1dFRpbWU7ICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgRW5kQ3V0VGltZTsgICAgICAvKio8IEVuZCBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvVGltZXNjYWxlOyAgICAvKk91dHB1dCB0aW1lc2NhbGUqLwotCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOyAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2sgYm9yZGVycyovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvY2xpcG51bWJlcjsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9VSW50MzIgIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00eFZTU19NQ1NfcGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYWxwaGEgbWFnaWMgdHJhbnNpdGlvbiBzZXR0aW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyICAgICAgICAgYmxlbmRpbmd0aHJlc2hvbGQ7ICAgIC8qKjwgQmxlbmRpbmcgUmFuZ2UgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNyZXZlcnNlOyAgICAgICAgICAgIC8qKjwgZGlyZWN0IGVmZmVjdCBvciByZXZlcnNlICovCi0KLX0gTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzbGlkZSB0cmFuc2l0aW9uIHNldHRpbmdzCi0gKiBAbm90ZSAgICBUaGlzIHR5cGUgaGFwcGVucyB0byBtYXRjaCB0aGUgZXh0ZXJuYWwgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUgKGkuZS4gdGhlIG9uZSB3aGljaCBpcyBnaXZlbiBieSB0aGUgYXBwbGljYXRpb24pLCBidXQgYXJlCi0gKiAgICAgICAgICAgIGNvbmNlcHR1YWxseSBkaWZmZXJlbnQgdHlwZXMsIHNvIHRoYXQgaWYgKG9yIHJhdGhlciB3aGVuKSBzb21lIGRheQotICogICAgICAgICAgICB0cmFuc2xhdGlvbiBuZWVkcyB0byBvY2N1ciB3aGVuIGxvYWRpbmcgdGhlIHNldHRpbmdzIGZyb20gdGhlIGFwcCwKLSAqICAgICAgICAgICAgdGhpcyBzZXBhcmF0ZSB0eXBlIHdpbGwgYWxyZWFkeSBiZSByZWFkeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgTTR4VlNTX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsSnBlZ0NodW5rTW9kZQotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGNodW5rIGNhbGxiYWNrIHRvIGRlY29kZQotICogICAgICAgICAgICBhIEpQRUcgYnkgY2h1bmsgbW9kZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIFVURiBjb252ZXJzaW9uIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBVVEYgY29udmVyc2lvbiBpbmZvcm1hdGlvbnMKLSAqICAgICAgICAgICAgbmVlZGVkIGJ5IHRoZSB4VlNTIHRvIG1hbmFnZSB0aGUgZGlmZmVyZW50IGZvcm1hdHMgKFVURjgvMTYvQVNDSUkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX3RvVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udlRvVVRGOEZjdDsKLSAgICAvKkZ1bmN0aW9uIHBvaW50ZXIgb24gYW4gZXh0ZXJuYWwgdGV4dCBjb252ZXJzaW9uIGZ1bmN0aW9uICovCi0gICAgTTR4VlNTX2Zyb21VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252RnJvbVVURjhGY3Q7Ci0gICAgLypUZW1wb3JhcnkgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBlYWNoIGNvbnZlcnNpb24qLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIC8qU2l6ZSBvZiB0aGUgcHJldmlvdXMgYnVmZmVyLCB0aGUgc2l6ZSBpcyBwcmVkZXJtaW5hdGVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIG1fVGVtcE91dENvbnZlcnNpb25TaXplOwotfSBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQ7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfQ29udGV4dAotICogQGJyaWVmICAgIEludGVybmFsIGNvbnRleHQgb2YgdGhlIHhWU1MKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbnRlcm5hbCBpbmZvcm1hdGlvbnMgbmVlZGVkIGJ5IHRoZSB4VlNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOwotICAgIC8qKjwgUG9pbnRlciBvbiBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOwotICAgIC8qKjwgTG9jYWwgY29weSBvZiB2aWRlbyBlZGl0b3Igc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiAgICAgICAgICAgIHBTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgU2V0dGluZ3Mgb2YgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9ucyBmb3IgcHJldmlldy9zYXZlICovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogICAgICAgICAgICBwQ3VycmVudEVkaXRTZXR0aW5nczsKLSAgICAvKio8IEN1cnJlbnQgY29udGV4dCBvZiB2aWRlbyBlZGl0b3IgdG8gdXNlIGluIHN0ZXAgZnVuY3Rpb25zIGZvciBwcmV2aWV3L3NhdmUgKi8KLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgICAgICAgICAgICBwQ3VycmVudEVkaXRDb250ZXh0OwotICAgIC8qKjwgVGhpcyBpcyB0byBrbm93IGlmIGEgcHJldmlvdXMgTTR4VlNTX3NlbmRDb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NsaXBOdW1iZXI7Ci0gICAgLyoqPCBBdWRpbyBtaXhpbmcgc2V0dGluZ3MsIG5lZWRlZCB0byBmcmVlIGl0IGluIE00eFZTU19pbnRlcm5hbENsb3NlQXVkaW9NaXhlZEZpbGUgZnVuY3Rpb24qLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiAgICBwQXVkaW9NaXhTZXR0aW5nczsKLSAgICAvKio8IEF1ZGlvIG1peGluZyBjb250ZXh0ICovCi0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCAgICBwQXVkaW9NaXhDb250ZXh0OwotICAgIC8qKjwgRmlsZSBwYXRoIGZvciBQQ00gb3V0cHV0IGZpbGU6IHVzZWQgZm9yIHByZXZpZXcsIGdpdmVuIHRvIHVzZXIgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBjbVByZXZpZXdGaWxlOwotICAgIC8qKjwgRHVwbGljYXRpb24gb2Ygb3V0cHV0IGZpbGUgcG9pbnRlciwgdG8gYmUgYWJsZSB0byB1c2UgYXVkaW8gbWl4aW5nICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsKLSAgICAvKio8IER1cGxpY2F0aW9uIG9mIHRlbXBvcmFyeSBmaWxlIHBvaW50ZXIsIHRvIGJlIGFibGUgdG8gdXNlIGF1ZGlvIG1peGluZyAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7Ci0gICAgLyoqPCBNaWNybyBzdGF0ZSBmb3IgU2F2aW5nL1ByZXZpZXdpbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUgICAgICAgICAgICBlZGl0aW5nU3RlcDsKLSAgICAvKio8IE1pY3JvIHN0YXRlIGZvciBBbmFseXppbmcgc3RhdGUgKi8KLSAgICBNNHhWU1NfYW5hbHlzZU1pY3JvU3RhdGUgICAgICAgIGFuYWx5c2VTdGVwOwotICAgIC8qKjwgTmIgb2Ygc3RlcCBmb3IgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3LiBVc2VkIHRvIGNvbXB1dGUgcHJvZ3Jlc3Npb24KLSAgICAgICAgIG9mIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJTdGVwVG90YWw7Ci0gICAgLyoqPCBDdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwOwotICAgIC8qKjwgVG8gYmUgYWJsZSB0byBmcmVlIHBFZmZlY3RzIGR1cmluZyBwcmV2aWV3IGNsb3NlICovCi0gICAgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncyogICAgICAgICAgICBwUHJldmlld1NldHRpbmdzOwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgcGF0aDogYWxsIHRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBoZXJlICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBhdGg7Ci0gICAgLyoqPCBDdXJyZW50IHN0YXRlIG9mIHhWU1MgKi8KLSAgICBNNHhWU1NfU3RhdGUgICAgICAgICAgICAgICAgICAgIG1fc3RhdGU7Ci0gICAgLyoqPCBMaXN0IG9mIHN0aWxsIHBpY3R1cmVzIGlucHV0IHRvIGNvbnZlcnQgdG8gM0dQIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogICAgICAgICAgICBwUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgLyoqPCBDdXJyZW50IGVsZW1lbnQgb2YgdGhlIGFib3ZlIGNoYWluZWQgbGlzdCBiZWVpbmcgcHJvY2Vzc2QgYnkgdGhlIFB0bzNHUFAgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgICAgICAgICAgcFBUbzNHUFBjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBQdG8zR1BQIGNvbnRleHQsIG5lZWRlZCB0byBjYWxsIFB0bzNHUFBfc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIE00UFRPM0dQUF9Db250ZXh0ICAgICAgICAgICAgICAgIHBNNFBUTzNHUFBfQ3R4dDsKLSAgICAvKio8IFBvaW50ZXIgb24gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgIE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KiAgICAgICAgcENhbGxCYWNrQ3R4dDsKLSAgICAvKio8IExpc3Qgb2YgZmlsZXMgdG8gdHJhbnNjb2RlIHdpdGggcGFyYW1ldGVycyAqLwotICAgIE00eFZTU19NQ1NfcGFyYW1zKiAgICAgICAgICAgICAgICBwTUNTcGFyYW1zTGlzdDsKLSAgICAvKio8IEN1cnJlbnQgZWxlbWVudCBvZiB0aGUgYWJvdmUgY2hhaW5lZCBsaXN0IGJlZWluZyBwcm9jZXNzZCBieSB0aGUgTUNTICovCi0gICAgTTR4VlNTX01DU19wYXJhbXMqICAgICAgICAgICAgICAgIHBNQ1NjdXJyZW50UGFyYW1zOwotICAgIC8qKjwgQ3VycmVudCBNQ1MgY29udGV4dCwgbmVlZGVkIHRvIGNhbGwgTUNTX3N0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24qLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgICAgICAgICAgIHBNQ1NfQ3R4dDsKLSAgICAvKio8IEluZGV4IHRvIGhhdmUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlbmFtZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVJbmRleDsKLSAgICAvKio8IEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB0YXJnZXRlZCBiaXRyYXRlIHRvIHJlYWNoIG91dHB1dCBmaWxlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZTsKLSAgICAvKio8IElmIHRoZSBzZW5kQ29tbWFuZCBmY3QgaXMgY2FsbGVkIHR3aWNlIG9yIG1vcmUsIHRoZSBmaXJzdCBjb21wdXRlZCB0aW1lc2NhbGUKLSAgICAgICAgcmVjb3JkZWQgaGVyZSBtdXN0IGJlIHJldXNlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ZWRUaW1lc2NhbGU7Ci0KLSAgICAvKlVURiBDb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00eFZTU19VVEZDb252ZXJzaW9uQ29udGV4dCAgICBVVEZDb252ZXJzaW9uQ29udGV4dDsgICAgLypVVEYgY29udmVyc2lvbiBjb250ZXh0IHN0cnVjdHVyZSovCi0KLX0gTTR4VlNTX0NvbnRleHQ7Ci0KLS8qKgotICogSW50ZXJuYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RhcnRUcmFuc2NvZGluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICpyb3RhdGlvbkRlZ3JlZSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVKUEcoTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiogcEltYWdlUGxhbmVzKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLE00T1NBX1VJbnQzMiBoZWlnaHQpOwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUFuZFJlc2l6ZUpQRyhNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcyk7Ci1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCxNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0luaXRpYWxpemF0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0jZWxzZQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRihNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KTsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVByZXZpZXcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBGaWxlUHJvcGVydGllcyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpY0JsZW5kaW5nKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19TbGlkZVRyYW5zaXRpb24oIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFRhcmdldGVkVGltZVNjYWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFRhcmdldGVkVGltZVNjYWxlKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLQotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEJ1ZmZlck91dCwgTTRPU0FfVUludDMyKiBjb252ZXJ0ZWRTaXplKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qIF9fTTRYVlNTX0lOVEVSTkFMX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODk4N2UyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgICBNZWRpYSBDb252ZXJzaW9uIFNlcnZpY2UgcHVibGljIEFQSS4KLSAqIEBub3RlICAgIE1DUyBhbGxvd3MgdHJhbnNjb2RpbmcgYSAzZ3AvbXA0IGZpbGUgaW50byBhIG5ldyAzZ3AvbXA0IGZpbGUgY2hhbmdpbmcgdGhlCi0gKiAgICAgICAgICB2aWRlbyBhbmQgYXVkaW8gZW5jb2Rpbmcgc2V0dGluZ3MuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNE1DU19BUElfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfQVBJX0hfXwotCi0vKioKLSAqICAgIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgICBPU0FMIHR5cGVzIGZvciBmaWxlIGFjY2VzcyAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiBNNF9WZXJzaW9uSW5mbyAqLwotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotLyoqCi0gKiBUbyBlbmFibGUgZXh0ZXJuYWwgYXVkaW8gY29kZWNzIHJlZ2lzdGVyaW5nKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9BdWRpb0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE1DUyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00TUNTX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNE1DU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1Jlc2l6aW5nID0gMCwgICAgLyoqPCBUaGUgbWVkaWEgaXMgcmVzaXplZCwgdGhlIGFzcGVjdCByYXRpbyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgb2YgdGhlIG1lZGlhIGlzIHJlbmRlcmVkICovCi0gICAgTTRNQ1Nfa0Nyb3BwaW5nLCAgICAgICAgLyoqPCBUaGUgbWVkaWEgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtZWRpYSBpcyBub3QgcmVuZGVyZWQgZW50aXJlbHkgKi8KLSAgICBNNE1DU19rQmxhY2tCb3JkZXJzICAgICAvKio8IEJsYWNrIGJvcmRlcnMgYXJlIHJlbmRlcmVkIGluIG9yZGVyIHRvIGtlZXAgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCBhc3BlY3QgcmF0aW8uIEFsbCB0aGUgbWVkaWEgaXMgcmVuZGVyZWQgKi8KLX0gTTRNQ1NfTWVkaWFSZW5kZXJpbmc7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgZXh0ZXJuYWwgRWZmZWN0IGZ1bmN0aW9ucwotICogQG5vdGUgICAgVGhlIHVpUHJvZ3Jlc3MgdmFsdWUgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBjYXNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOyAgICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IGZyb20gMCB0byAxMDAwIChvbmUgdGhvdXNhbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpQ2xpcFRpbWU7ICAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOyAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgb3V0cHV0IGNsaXAgdGltZS1saW5lICovCi0KLX0gTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00TUNTX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX05vbmUgICAgPSAwLAotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dCA9IDE2LCAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbCA9IDI1NgotCi19IE00TUNTX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBBdWRpbyBlZmZlY3QgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgb3JpZ2luYWwgUENNIGRhdGEgYnVmZmVyIGFuZCBpdHMgc2l6ZS4KLSAqICAgICAgICAgICAgICBBdWRpbyBlZmZlY3QgaGF2ZSB0byBiZSBhcHBsaWVkIG9uIGl0LgotICogICAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBvZiB0aGUgZWZmZWN0IGlzIGdpdmVuLCBvbiBhIHNjYWxlIGZyb20gMCB0byAxMDAwLgotICogICAgICAgICAgICAgIFdoZW4gdGhlIGVmZmVjdCBmdW5jdGlvbiBpcyBjYWxsZWQsIGFsbCB0aGUgYnVmZmVycyBhcmUgdmFsaWQgYW5kCi0gKiAgICAgICAgICAgICAgb3duZWQgYnkgdGhlIE1DUy4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwUENNZGF0YSAgICAgICAgICAgIChJTi9PVVQpIHZhbGlkIFBDTSBkYXRhIGJ1ZmZlcgotICogQHBhcmFtICAgdWlQQ01zaXplICAgICAgICAgICAoSU4vT1VUKSBQQ00gZGF0YSBidWZmZXIgY29ycmVzcG9uZGluZyBzaXplCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdWRpbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfRVJSICgqTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUsCi0gICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0ICAgICBFeHRBdWRpb0VmZmVjdEZjdDsgICAgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAqcEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dDsgIC8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNE1DU19BdWRpb0VmZmVjdFR5cGUgICAgICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgICAvKio8IE5vbmUsIEZhZGVJbiwgRmFkZU91dCAqLwotCi19IE00TUNTX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00TUNTX091dHB1dFBhcmFtcwotICogQGJyaWVmICAgIE1DUyBPdXRwdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVUeXBlIChtdXN0IGJlIHNldCB0byBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICogICAgICAgICAgICAgLSBiRGlzY2FyZEV4aWYgbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSBiQWRqdXN0T3JpZW50YXRpb24gbXVzdCBiZSBzZXQgdG8gTTRPU0FfVFJVRSBvciBNNE9TQV9GQUxTRQotICogICAgICAgICAgICAgLSAoTWVkaWFSZW5kZXJpbmcgaXMgbm90IGhhbmRsZWQgOiBvdXRwdXQgaW1hZ2UgcmVzb2x1dGlvbiBpcyBhbHdheXMKLSAgICAgICAgICAgICAgICAgc2V0IGFjY29yZGluZyB0byBCZXN0Rml0IGNyaXRlcmlhKQotICogICAgICAgICAgICBiRGlzY2FyZEV4aWYgYW5kIGJBZGp1c3RPcmllbnRhdGlvbiBhcmUgc3RpbGwgcGljdHVyZSBvbmx5IHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZVR5cGU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBmcmFtZSBzaXplIDogUVFWR0EsIFFDSUYgb3IgU1FDSUYgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgZnJhbWVyYXRlLCBzZWUgZW51bSAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBPdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IFNhbXBsaW5nIGZyZXF1ZW5jeSBvZiB0aGUgYXVkaW8gaW4gdGhlIHN0cmVhbSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICBPdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIC8qKjwgU2V0IHRvIE00T1NBX1RSVUUgaWYgdGhlIG91dHB1dCBhdWRpbyBpcyBtb25vICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdWRpb01vbm87Ci0gICAgLyoqPCBPdXRwdXQgUENNIGZpbGUgaWYgbm90IE5VTEwgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRQQ01maWxlOwotICAgIC8qKjwgVG8gY3JvcCwgcmVzaXplLCBvciByZW5kZXIgYmxhY2sgYm9yZGVycyovCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nOwotICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICpwRWZmZWN0czsKLSAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsKLQotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLSAgICAvKio8IFRSVUU6IEV2ZW4gaWYgdGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gRVhJRiBzZWN0aW9uLAotICAgIHRoZSBvdXRwdXQgZmlsZSB3b24ndCBjb250YWluIGFueSBFWElGIHNlY3Rpb24uKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRpc2NhcmRFeGlmIDsKLQotICAgIC8qKjwgPVRSVUUgOiBwaWN0dXJlIG11c3QgYmUgcm90YXRlZCBpZiBFeGlmIHRhZ3MgaG9sZCBhIHJvdGF0aW9uIGluZm8KLSAgICAoYW5kIHJvdGF0aW9uIGluZm8gaXMgc2V0IHRvIDApKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkanVzdE9yaWVudGF0aW9uIDsKLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyIG91dHB1dFZpZGVvTGV2ZWw7Ci19IE00TUNTX091dHB1dFBhcmFtczsKLQotLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBvdXRwdXQgdGFyZ2V0ZWQgZmlsZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tSZXNTYW1lQXNJbnB1dCAgICAgICA9IDB4MDAsIC8qd2lkdGggeCBoZWlnaHQqLwotICAgIE00TUNTX2tSZXNRVkdBICAgICAgICAgICAgICA9IDB4MDEsIC8qMzIweDI0MCovCi0gICAgTTRNQ1Nfa1Jlc1ZHQSAgICAgICAgICAgICAgID0gMHgwMiwgLyo2NDB4NDgwKi8KLSAgICBNNE1DU19rUmVzV1FWR0EgICAgICAgICAgICAgPSAweDAzLCAvKjQwMHgyNDAqLwotICAgIE00TUNTX2tSZXNXVkdBICAgICAgICAgICAgICA9IDB4MDQsIC8qODAweDQ4MCovCi0gICAgTTRNQ1Nfa1Jlc1hHQSAgICAgICAgICAgICAgID0gMHgwNSwgLyoxMDI0eDc2OCovCi0gICAgTTRNQ1Nfa1Jlc0N1c3RvbSAgICAgICAgICAgID0gMHhGRiAgLypTaXplIGlzIHNldCB2aWEgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0Ki8KLX0gTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uIDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUFN0cmF0ZWd5Ci0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IE1DUyBzdHJhdGVneSB0byBjb25maWd1cmUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa0ZpbGVTaXplT25seUZpeGVkICAgICAgICAgICAgPSAweDAwLCAvKlN0aWxsUGljdHVyZVJlc29sdXRpb24gYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhbGl0eUZhY3RvciBhcmUgaWdub3JlZCovCi0gICAgTTRNQ1Nfa0ZpbGVTaXplQW5kUmVzRml4ZWQgICAgICAgICAgPSAweDAxLCAvKlF1YWxpdHlGYWN0b3IgaXMgaWdub3JlZCovCi0gICAgTTRNQ1Nfa1F1YWxpdHlBbmRSZXNGaXhlZCAgICAgICAgICAgPSAweDAyICAvKk91dHB1dEZpbGVTaXplIGlzIGlnbm9yZWQqLwotfSBNNE1DU19TUFN0cmF0ZWd5IDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICBNNE1DU19TUENyb3AKLSAqIEBicmllZiAgICBTdGlsbCBwaWN0dXJlIHNwZWNpZmljIDogaW5kaWNhdGUgd2hldGhlciBjcm9wcGluZyBzaG91bGQgYmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjaGFuZ2luZyB0aGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rTm9Dcm9wICAgICAgICAgICAgICAgID0gMHgwMCwgLypObyBDcm9wcGluZyBpcyBwZXJmb3JtZWQqLwotICAgIE00TUNTX2tDcm9wQmVmb3JlUmVzaXplICAgICAgPSAweDAxICAvKklucHV0IGltYWdlIGlzIGNyb3BwZWQgKGJlZm9yZSBjaGFuZ2luZyByZXNvbHV0aW9uKSovCi19IE00TUNTX1NQQ3JvcCA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMKLSAqIEBicmllZiAgICBNQ1MgZmlsZSBzaXplLCBiaXRyYXRlIGFuZCBjdXQgcGFyYW1ldGVycwotICogQG5vdGUgICAgIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBzdGlsbCBwaWN0dXJlIGlucHV0cyA6Ci0gKiAgICAgICAgICAgICAtIE91dHB1dEZpbGVTaXplCi0gKiAgICAgICAgICAgICAtIFN0aWxsUGljdHVyZVJlc29sdXRpb24KLSAqICAgICAgICAgICAgIC0gUXVhbGl0eUZhY3RvcgotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVTdHJhdGVneQotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQgKGlmIFN0aWxsUGljdHVyZVJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pCi0gKiAgICAgICAgICAgIFN0aWxsIHBpY3R1cmUgb25seSBwYXJhbWV0ZXJzIDogU3RpbGxQaWN0dXJlUmVzb2x1dGlvbiwgUXVhbGl0eUZhY3RvciwKLSAqICAgICAgICAgICAgU3RpbGxQaWN0dXJlU3RyYXRlZ3kgYW5kIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgT3V0cHV0VmlkZW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRWSURFT0VESVRJTkdfQml0cmF0ZSAgICBPdXRwdXRBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEJlZ2luQ3V0VGltZTsgICAgICAgICAgIC8qKjwgQmVnaW5uaW5nIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIEVuZEN1dFRpbWU7ICAgICAgICAgICAgIC8qKjwgRW5kIGN1dCB0aW1lIGluIGlucHV0IGZpbGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIE91dHB1dEZpbGVTaXplOyAgICAgICAgIC8qKjwgRXhwZWN0ZWQgcmVzdWx0aW5nIGZpbGUgc2l6ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgT3V0cHV0VmlkZW9UaW1lc2NhbGU7ICAgLyoqPCBPcHRpb25hbCBwYXJhbWV0ZXIgdXNlZCB0byBmaXggYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGUgZHVyaW5nIHRyYW5zY29kaW5nICovCi0KLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICBRdWFsaXR5RmFjdG9yIDsgICAgICAgICAvKio8ID0tMSAodW5kZWZpbmVkKSBvciAwKGxvd2VzdCkuLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAoYmVzdCkgOiBUaGlzIHBhcmFtZXRlciBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgaW5kaWNhdGlvbiBmb3IgdGhlIEpQRUcgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIChpZiA9LTEgdGhlIE1DUyB3aWxsIHNldCBxdWFsaXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5KSovCi0gICAgTTRNQ1NfU1BTdHJhdGVneSAgICAgICAgICAgIFN0aWxsUGljdHVyZVN0cmF0ZWd5IDsgLyoqPCBEZWZpbmVzIHdoaWNoIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IGJ5IE1DUyovCi0gICAgTTRNQ1NfU1BPdXRwdXRSZXNvbHV0aW9uICAgIFN0aWxsUGljdHVyZVJlc29sdXRpb247LyoqPCBEZXNpcmVkIG91dHB1dCByZXNvbHV0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGlsbCBwaWN0dXJlIGZpbGUgKi8KLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aDsKLSAgICAvKio8IChvbmx5IGlmIFJlc29sdXRpb249PU00TUNTX2tSZXNDdXN0b20pIDogQ3VzdG9tIG91dHB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3VzdG9tSGVpZ2h0OwotICAgIC8qKjwgSW5kaWNhdGUgd2hldGhlciBDcm9wIHNob3VsZCBiZSBwZXJmb3JtZWQgKi8KLSAgICBNNE1DU19TUENyb3AgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBYIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWDsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBZIGNvb3JkaW5hdGUgb2YgdG9wbGVmdCBjb3JuZXIgb2YgdGhlIGNyb3Agd2luZG93ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfWTsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBXaWR0aCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9XOwotICAgIC8qKjwgKG9ubHkgaWYgY3JvcHBpbmcpIEhlaWdodCBvZiB0aGUgY3JvcCB3aW5kb3cgKGluIHBpeGVscykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3JvcF9IOwotICAgIC8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLX0gTTRNQ1NfRW5jb2RpbmdQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW5pdChNNE1DU19Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIE1DUyAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNQ1MgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2luaXQoTTRNQ1NfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLCBNNE9TQV9Wb2lkKiBwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpTWF4TWV0YWRhdGFTaXplKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiAgICAgICAgICBJbiBjYXNlIG9mIHN0aWxsIHBpY3R1cmUsIGZvdXIgSW5wdXRGaWxlVHlwZSBhcmUgcG9zc2libGUKLSAqICAgICAgICAgIChNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHL0JNUC9HSUYvUE5HCi0gKiAgICAgICAgICBJZiBvbmUgb2YgdGhlbSBpcyBzZXQsIHRoZSBPdXRwdXRGaWxlVHlwZSBTSEFMTCBiZSBzZXQgdG8gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc3RlcChNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9ncmVzcyAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgcGVyY2VudGFnZSAoMCB0byAxMDApIG9mIHRoZSB0cmFuc2NvZGluZwotICogQG5vdGUgICAgcFByb2dyZXNzIG11c3QgYmUgYSB2YWxpZCBhZGRyZXNzLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBPbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOiBUcmFuc2NvZGluZyBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNE1DU19jbG9zZSgpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ6IFRoZSBhdWRpbyBjb252ZXJzaW9uIChBQUMgdG8gQU1SLU5CLCBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICogQHJldHVybiAgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkU6IFBpY3R1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gcmVxdWlyZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19wYXVzZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFBhdXNlIHRoZSB0cmFuc2NvZGluZyBpLmUuIHJlbGVhc2UgdGhlIChleHRlcm5hbCBoYXJkd2FyZSkgdmlkZW8gZGVjb2Rlci4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHBhdXNpbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgdGVtcG9yYXJpbHkgc3VzcGVuZGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24gY2FsbHMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19yZXN1bWUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBSZXN1bWUgdGhlIHRyYW5zY29kaW5nIGFmdGVyIGEgcGF1c2UgKHNlZSBNNE1DU19wYXVzZSkuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCByZXN1bWluZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSBjYWxsaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNQ1MgdHJhbnNjb2RpbmcgYW5kIGZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MKLSAqICAgICAgICAgIHdoYXRldmVyIHRoZSBzdGF0ZSBpcy4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfYWJvcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMqIHBGaWxlUHJvcGVydGllcyk7Ci0gKiBAYnJpZWYgICBSZXRyaWV2ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQcm9wZXJ0aWVzICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiBhbiBhbGxvY2F0ZWQgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi0gICAgICAgICAgICBieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSA6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZQotICogQHJldHVybiAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIDogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCA6IFNwZWNpZmllZCBvdXRwdXQgcGFyYW1ldGVycyBkZWZpbmUgYSBudWxsIGR1cmF0aW9uIHN0cmVhbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19PdXRwdXRQYXJhbXMqIHBQYXJhbXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX0VuY29kaW5nUGFyYW1zKiBwUmF0ZXMpCi0gKiBAYnJpZWYgICBHZXQgdGhlIGV4dGVuZGVkIHZhbHVlcyBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICogQG5vdGUgICAgQ291bGQgYmUgY2FsbGVkIGFmdGVyIE00TUNTX3NldEVuY29kaW5nUGFyYW1zLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoT1VUKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ6IEVuY29kaW5nIHNldHRpbmdzIHdvdWxkIHByb2R1Y2UgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCBkdXJhdGlvbiBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOiBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NNE1DU19BUElfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0Vycm9yQ29kZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA0MmRiYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGVycm9yIGNvZGVzIGRlZmluaXRpb25zIChNZWRpYSBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFbmQgb2YgcHJvY2Vzc2luZywgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKSAqLwotI2RlZmluZSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MSkKLS8qIE1lZGlhdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MikKLS8qIEluZGljYXRlIHRoYXQgcGljdHVyZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzaXplZCB0byBmaXQgaW50byB0aGUgcmVxdWlyZWQKLSAgIHBhcmFtZXRlcnMgKGZpbGUgc2l6ZSkgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX1BJQ1RVUkVfQVVUT19SRVNJWkUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRNQ1MsIDB4MykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9yIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIC0tLS0tIE9QRU4gRVJST1JTIC0tLS0tICovCi0KLS8qIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vIHN1cHBvcnRlZCBzdHJlYW0gKG1heSBiZSBhIGNvcnJ1cHRlZCBmaWxlKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMSkKLS8qIFRoZSBpbnB1dCBmaWxlIGlzIGludmFsaWQvY29ycnVwdGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDAyKQotLyogVGhlIGlucHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMykKLS8qIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBzaXplIGlzIG5vbiBtdWx0aXBsZSBvZiAxNiAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5QVVRfVklERU9fU0laRV9OT05fWDE2ICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwNCkKLQotCi0vKiAtLS0tLSBTRVQgT1VUUFVUIFBBUkFNUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMCkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDExKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTIpCi0vKiBUaGUgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEzKQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE0KQotLyogVGhlIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gICAoSXQgY2FuJ3QgaGFwcGVuIGluIGN1cnJlbnQgdmVyc2lvbiBvZiBNQ1MhKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNSkKLS8qIEEgbnVsbCBjbGlwIGR1cmF0aW9uIGFzIGJlZW4gY29tcHV0ZWQsIHdoaWNoIGlzIHVudmFsaWQgKHNob3VsZCBuZXZlciBoYXBwZW4hKSAqLwotI2RlZmluZSBNNE1DU19FUlJfRFVSQVRJT05fSVNfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNikKLS8qIFRoZSAubXA0IGNvbnRhaW5lciBjYW5ub3QgaGFuZGxlIGgyNjMgY29kZWMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTcpCi0KLQotLyogLS0tLS0gUFJFUEFSRSBERUNPREVSUyBFUlJPUlMgLS0tLS0gKi8KLQotLyogSDI2MyBQcm9maWxlIChvdGhlciB0aGFuIDApIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MjApCi0vKiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBhbiBBQUMgYXVkaW8gdHJhY2sgd2l0aCBhbiBpbnZhbGlkIHNhbXBsaW5nIGZyZXF1ZW5jeQotICAgKHNob3VsZCBuZXZlciBoYXBwZW4pICovCi0jZGVmaW5lIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIxKQotLyogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIsIG9yIE1QMykgZmFpbGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIyKQotCi0KLS8qIC0tLS0tIFNFVCBFTkNPRElORyBQQVJBTVMgRVJST1JTIC0tLS0tICovCi0KLS8qIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwIGR1cmF0aW9uICovCi0jZGVmaW5lIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04gICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMwKQotLyogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVCAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzEpCi0vKiBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lICovCi0jZGVmaW5lIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMyKQotLyogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbiBiaXRyYXRlcyAqLwotI2RlZmluZSBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMykKLS8qIFZpZGVvIGJpdHJhdGUgaXMgdG9vIGxvdyAoYXZvaWQgdWdseSB2aWRlbykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzQpCi0vKiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1cgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNSkKLS8qIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNikKLS8qIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpICovCi0jZGVmaW5lIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0ggICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM3KQotCi0vKiAtLS0tLSBPVEhFUlMgRVJST1JTIC0tLS0tICovCi0jZGVmaW5lIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDUwKQotI2RlZmluZSBNNE1DU19FUlJfTk9NT1JFX1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUxKQotI2RlZmluZSBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00TUNTLCAweDUyKQotI2VuZGlmIC8qIF9fTTRNQ1NfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVmYWYxZTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBpbnRlcm5hbCBjb25zdGFudCB2YWx1ZXMgc2V0dGluZ3MKLSAqIEBub3RlICAgVGhpcyBoZWFkZXIgZmlsZSBpcyBub3QgcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxDT05GSUdfSF9fCi0KLQotLyoqCi0gKiBEZWZpbml0aW9uIG9mIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICA3MTY4IC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhpcyB2YWx1ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFjY29yZGluZ2x5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoKHNpemVvZihNNE9TQV9VSW50OCkqbWF4X2NoYW5uZWxfbnVtYmVyKSszCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGFrZSBhIG1hcmdpbihhZnRlciB0ZXN0cywgMiB3YXMgbm90IGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKk1BWF9QQ01fR1JBTlVMQVJJVFlfU0FNUExFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZWZvcmU6IDQwMDAqLy8qKjwgTWFnaWNhbCAqLwotCi0vKioKLSAqIFZpZGVvIG1heCBBVSBhbmQgZnJhZ21lbnQgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAwLjggLyoqPCBNYWdpY2FsLiBVc2VkIHRvIGRlZmluZSB0aGUgbWF4IEFVIHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfVklERU9fQ0hVTktfQVVfU0laRV9SQVRJTyAgICAgMS4yIC8qKjwgTWFnaWNhbC4gVXNlZCB0byBkZWZpbmUgdGhlIG1heCBjaHVuayBzaXplICovCi0KLS8qKgotICogVmFyaW91cyBNYWdpY2FscyAqLwotI2RlZmluZSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAxCi0jZGVmaW5lIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgIDIKLQotLyoqCi0gKiBHcmFudWxhcml0eSBmb3IgYXVkaW8gZW5jb2RlciAqLwotIC8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFNUiBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUyAxNjAKLS8qKjwgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwYXNzIGluIEFBQyBlbmNvZGluZyBjYXNlICovCi0jZGVmaW5lIE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUyAxMDI0Ci0vKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBNUDMgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVMgNTc2Ci0KLSNkZWZpbmUgTTRNQ1NfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgIDEwMjQgIC8qKjwgYWRkIG1wMyBlbmNvZGVyIGFuZCB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgbm90IHVzZWQgYW55bW9yZSwgbm93IHRoZSBtYXggQVUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHkgYWNjb3JkaW5nIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzLHRoZSBtYXggUENNIGdyYW51bGFyaXR5IHNhbXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGEgbWFyZ2luLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlZm9yZTogMTAyNCovLyoqPCBNYWdpY2FsICovCi0vKioKLSAqIFdyaXRlciBmaWxlIGFuZCBtb292IHNpemUgZXN0aW1hdGlvbiAqLwotI2RlZmluZSBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gICAgMS4wNCAgLyoqPCBtYWdpY2FsIG1vb3Ygc2l6ZSBpcyBsZXNzIHRoYW4gNCUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgZmlsZSBzaXplIGluIGF2ZXJhZ2UgKi8KLQotLyoqCi0gKiBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluIGFuIFNUU1MgdGFibGUgKG5vIHJhcCBmcmFtZXMpLAotICAganVtcCBiYWNrd2FyZCB0byBhIHNwZWNpZmllZCBsaW1pdCAqLwotI2RlZmluZSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQgICAgICAgICAgNDAwMDAgLyoqPCA0MCBzICovCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFjNjc5ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAotICogQGJyaWVmICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGludGVybmFsCi0gKiAgICAgICAgICB0byB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk00VlBQX0FQSS5oIgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUCggTTRWUFBfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgRG8gdGhlIHZpZGVvIHJlbmRlcmluZyBhbmQgdGhlIHJlc2l6ZSAoaWYgbmVlZGVkKQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAoSU4pICAgICBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE1DUwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgcFBsYW5lSW4gICAgKElOKSAgICAgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfTUNTX1ZJREVPX0RFQ09ERV9FUlJPUjogdGhlIHZpZGVvIGRlY29kaW5nIGZhaWxlZAotICogQHJldHVybiAgRVJSX01DU19SRVNJWkVfRVJST1I6ICAgICAgIHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICAgaW4gdGhlIE1DUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgTWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlICpwV3RyR2xvYmFsSW50ZXJmYWNlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgYXVkaW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pICAgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAoSU4pICAgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSAgVGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLG9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgTUNTIHRvIHJlZ2lzdGVyIENvcmUgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSAgICAgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgKElOKSAgICAgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRXcml0ZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFJlYWRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBzdGVwRW5jb2RpbmcgZnVuY3Rpb24KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pICAgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCkKLSAqIEBicmllZiAgICBBcHBseSBhdWRpbyBlZmZlY3QgRmFkZUluIHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTEZVTkNUSU9OU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZTRmMjM2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmgKLSAqIEBicmllZiAgTUNTIGludGVybmFsIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRNQ1NfSU5URVJOQUxUWVBFU19IX18KLQotLyoqCi0gKiAgICBNQ1MgcHVibGljIEFQSSBhbmQgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLS8qKiBEZXRlcm1pbmUgYWJzb2x1dGUgdmFsdWUgb2YgYS4gKi8KLSNkZWZpbmUgTTRNQ1NfQUJTKGEpICAgICAgICAgICAgICAgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLQotCi0jZGVmaW5lIFlfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4MDAKLSNkZWZpbmUgVV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotI2RlZmluZSBWX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0KLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIiAgICAgICAgLyoqPCBSZWFkIDNHUFAgZmlsZSAgICAgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiICAgICAgIC8qKjwgRGVjb2RlIHZpZGVvICAgICAgICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgICAgICAvKio8IFZpZGVvIHJlc2l6ZSAgICAgICAqLwotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiICAgICAgICAgICAgLyoqPCBEZWNvZGVyIGF1ZGlvICAgICAgKi8KLSNpbmNsdWRlICJTU1JDLmgiICAgICAgICAgICAgICAgICAgIC8qKjwgU1NSQyAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiRnJvbTJpVG9Nb25vXzE2LmgiICAgICAgICAvKio8IFN0ZXJlbyB0byBNb25vICAgICAqLwotI2luY2x1ZGUgIk1vbm9UbzJJXzE2LmgiICAgICAgICAgICAgLyoqPCBNb25vIHRvIFN0ZXJlbyAgICAgKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIgIC8qKjwgRW5jb2RlIGF1ZGlvICAgICAgICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiICAgICAgICAvKio8IFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKioKLSAqICBJbnN0ZWFkIG9mIGluY2x1ZGluZyBBQUMgY29yZSBwcm9wZXJ0aWVzLCBpdCBpcyBiZXR0ZXIgdG8gcmVkZWZpbmUgdGhlIG5lZWRlZCB0eXBlCi0gKiAgQUFDX0RFQ19TVFJFQU1fUFJPUFMKLSAqICBJbiBjYXNlIG9mIGV4dGVybmFsIEFBQyBkZWNvZGVyLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyB0eXBlIGFzIHB1YmxpYwotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0IEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiBAYnJpZWYgQUFDIFN0cmVhbSBwcm9wZXJ0aWVzCi0gKiBATm90ZSBhTm9DaGFuIGFuZCBhU2FtcEZyZXEgYXJlIHVzZWQgZm9yIHBhcnNpbmcgZXZlbiB0aGUgdXNlciBwYXJhbWV0ZXJzCi0gKiAgICAgICAgYXJlIGRpZmZlcmVudC4gIFVzZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlucHV0IGZvciB0aGUgb3V0cHV0IGJlaGF2aW91cgotICogICAgICAgIG9mIHRoZSBkZWNvZGVyIHdoZXJlYXMgZm9yIHBhcnNpbmcgYml0c3RyZWFtIHByb3BlcnRpZXMgYXJlIHVzZWQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRPU0FfSW50MzIgYUF1ZGlvT2JqZWN0VHlwZTsgICAgIC8qKjwgQXVkaW8gb2JqZWN0IHR5cGUgb2YgdGhlIHN0cmVhbSAtIGluIGZhY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgZm91bmQgaW4gdGhlIEFjY2VzcyBVbml0IHBhcnNlZCAqLwotICBNNE9TQV9JbnQzMiBhTnVtQ2hhbjsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgKD0xKG1vbm8pIG9yID0yKHN0ZXJlbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSBpbnB1dCBiaXRzdHJlYW0qLwotICBNNE9TQV9JbnQzMiBhU2FtcEZyZXE7ICAgICAgICAgICAgLyoqPCBzYW1wbGluZyBmcmVxdWVuY3kgaW4gSHogKi8KLSAgTTRPU0FfSW50MzIgYUV4dGVuc2lvblNhbXBGcmVxOyAgIC8qKjwgZXh0ZW5kZWQgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCA9IDAgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZXh0ZW5kZWQgZnJlcXVlbmN5ICovCi0gIE00T1NBX0ludDMyIGFTQlJQcmVzZW50OyAgICAgICAgICAvKio8IHByZXNlbmNlPTEvYWJzZW5jZT0wIG9mIFNCUiAqLwotICBNNE9TQV9JbnQzMiBhUFNQcmVzZW50OyAgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBQUyAqLwotICBNNE9TQV9JbnQzMiBhTWF4UENNU2FtcGxlc1BlckNoOyAgLyoqPCBtYXggbnVtYmVyIG9mIFBDTSBzYW1wbGVzIHBlciBjaGFubmVsICovCi19IEFBQ19ERUNfU1RSRUFNX1BST1BTOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgICAgQ29kZWNzIHJlZ2lzdHJhdGlvbiBzYW1lIGFzIGluIFZQUyBhbmQgVkVTLCBzbyBsZXNzIG1hcHBpbmcKLSAqICAgICAgICAgICAgICBpcyByZXF1aXJlZCB0b3dhcmQgTUNTIGFwaSB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcEdsb2JhbEZjdHM7ICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgcERhdGFGY3RzOyAgICAgICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KLX0gTTRNQ1NfV3JpdGVySW50ZXJmYWNlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNE1DU19TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tTdGF0ZV9DUkVBVEVELCAgICAgICAgICAgLyoqPCBNNE1DU19pbml0IGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9PUEVORUQsICAgICAgICAgICAgLyoqPCBNNE1DU19vcGVuIGhhcyBiZWVuIGNhbGxlZCAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9TRVQsICAgICAgICAgICAgICAgLyoqPCBBbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9SRUFEWSwgICAgICAgICAgICAgLyoqPCBBbGwgb3B0aW9ubmFsIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHNldCAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUCwgICAgLyoqPCBNdXN0IGp1bXAgdG8gdGhlIElmcmFtZSBiZWZvcmUgdGhlIGJlZ2luIGN1dCAqLwotICAgIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFLCAgLyoqPCBNdXN0IGRlY29kZSB1cCB0byB0aGUgYmVnaW4gY3V0ICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HLCAgICAgICAgLyoqPCBTdGVwIGNhbiBiZSBjYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdGF0ZV9QQVVTRUQsICAgICAgICAgICAgLyoqPCBQYXVzZWQsIFJlc3VtZSBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfRklOSVNIRUQsICAgICAgICAgIC8qKjwgVHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfQ0xPU0VEICAgICAgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgaGFzIGJlZW4gY3JlYXRlZCAgICAgICAgICAgICovCi19IE00TUNTX1N0YXRlczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRNQ1NfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNICA9IDAsICAgIC8qKjwgTm8gc3RyZWFtIHByZXNlbnQgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgICA9IDEsICAgIC8qKjwgVGhlIHN0cmVhbSBlbmNvZGluZyBpcyBpbiBwcm9ncmVzcyAqLwotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCAgPSAyICAgIC8qKjwgVGhlIHN0cmVhbSBoYXMgZmluaXNoZWQgZW5jb2RpbmcgICAgKi8KLX0gTTRNQ1NfU3RyZWFtU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgYW5vbnltb3VzIGVudW0KLSAqIEBicmllZiAgICAgICAgZW51bSB0byBrZWVwIHRyYWNrIG9mIHRoZSBlbmNvZGVyIHN0YXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLWVudW0KLXsKLSAgICBNNE1DU19rTm9FbmNvZGVyLAotICAgIE00TUNTX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00TUNTX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNE1DU19rRW5jb2RlclJ1bm5pbmcKLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNQ1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTUNTIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIGJpdFBvczsKLSAgICAgICAgICAgICAgICAgLyogYml0IGNvdW50IG9mIG51bWJlciBvZiBiaXRzIHVzZWQgc28gZmFyICovCi0KLSAgICBNNE9TQV9VSW50OCAgICpzdHJlYW1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgLyogQml0c3RyZWFtIEJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIGJ5dGVDbnQ7Ci0gICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIEJ5dGVzIHdyaXR0ZW4gaW4gQml0c3RyZWFtIGJ1ZmZlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgY3VyckJ1ZmY7Ci0gICAgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgaG9sZHMsIDRieXRlcyBvZiBiaXRzdHJlYW0qLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2Qnl0ZTsKLSAgICAgICAgICAgICAgICAvKiBQcmV2aW91cyBieXRlIHdyaXR0ZW4gaW4gdGhlIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDggICBwcmV2UHJldkJ5dGU7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgdG8gcHJldmlvdXMgYnl0ZSB3cml0dGVuIGluIHRoZSBidWZmZXIgKi8KLQotfU5TV0FWQ19iaXRTdHJlYW1fdF9NQ1M7Ci0KLSNkZWZpbmUgX01BWG51bV9zbGljZV9ncm91cHMgIDgKLSNkZWZpbmUgX01BWG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgIDI1NgotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9VSW50MzIgIGxldmVsX2lkY19pbmRleDsKLSAgTTRPU0FfVUludDMyICBNYXhGcmFtZU51bTsKLSAgTTRPU0FfVUludDMyICBleHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKLSAgTTRPU0FfSW50MzIgICBNYXhQaWNPcmRlckNudExzYjsKLSAgTTRPU0FfSW50MzIgICBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKLQotICAvKiAocGljX29yZGVyX2NudF90eXBlID09IDEpICovCi0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3JfcmVmX2ZyYW1lW19NQVhudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlXTsKLQotICBNNE9TQV9VSW50MTYgUGljV2lkdGhJbk1iczsKLSAgTTRPU0FfVUludDE2IEZyYW1lSGVpZ2h0SW5NYnM7Ci0gIE00T1NBX1VJbnQxNiAgcGljX3dpZHRoX2luX21ic19taW51czE7Ci0gIE00T1NBX1VJbnQxNiAgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gIE00T1NBX1VJbnQxNiBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0gIE00T1NBX1VJbnQxNiBNYXhQaWNTaXplSW5NYnM7Ci0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgcHJvZmlsZV9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgcmVzZXJ2ZWRfemVyb180Yml0czsKLSAgTTRPU0FfVUludDggICBsZXZlbF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgTTRPU0FfVUludDggICBwaWNfb3JkZXJfY250X3R5cGU7Ci0gIC8qIGlmKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSAqLwotICBNNE9TQV9VSW50OCAgIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKLQotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7Ci0gIC8qIGZvciggaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKSAqLwotICBNNE9TQV9VSW50OCAgIG51bV9yZWZfZnJhbWVzOwotCi0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQwX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQxX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQyX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX21ic19vbmx5X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwotICBNNE9TQV9Cb29sICAgIGZyYW1lX2Nyb3BwaW5nX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgIEFjdGl2ZTsKLQotICAvKiB2dWlfc2VxX3BhcmFtZXRlcnNfdCB2dWlfc2VxX3BhcmFtZXRlcnM7ICovCi19IENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTOwotCi10eXBlZGVmIHN0cnVjdAotewotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xcF9taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBwaWNfaW5pdF9xc19taW51czI2OwotICBNNE9TQV9JbnQxNiAgICAgICBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0OwotCi0vLyNpZmRlZiBfQ0FQX0ZNT18KLSAgLyogaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAwICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgcnVuX2xlbmd0aF9taW51czFbX01BWG51bV9zbGljZV9ncm91cHNdOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMiApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHRvcF9sZWZ0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgTTRPU0FfVUludDE2ICAgICAgYm90dG9tX3JpZ2h0W19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDYgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICBwaWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOwotICBNNE9TQV9VSW50MTYgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czE7Ci0KLSAgTTRPU0FfVUludDE2IEZpcnN0TWJJblNsaWNlR3JvdXBbX01BWG51bV9zbGljZV9ncm91cHNdOwotICBNNE9TQV9VSW50MTYgTGFzdE1iSW5TbGljZUdyb3VwW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLQotCi0gIE00T1NBX1VJbnQ4ICAqc2xpY2VfZ3JvdXBfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAqTWFwVW5pdFRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDggICpNYlRvU2xpY2VHcm91cE1hcDsKLSAgTTRPU0FfVUludDE2ICBOdW1TbGljZUdyb3VwTWFwVW5pdHM7Ci0KLSAgTTRPU0FfVUludDggICAgICAgc2xpY2VfZ3JvdXBfbWFwX3R5cGU7Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSAzIHx8IDQgfHwgNSAqLwotICBNNE9TQV9Cb29sICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICBtYXBfaW5pdGlhbGl6ZWQ7Ci0vLyAjZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gIE00T1NBX1VJbnQ4ICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgICAgICBzZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICAgICBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOwotICBNNE9TQV9VSW50OCAgICAgIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIHdlaWdodGVkX2JpcHJlZF9pZGM7Ci0gIE00T1NBX1VJbnQ4ICAgICAgIG51bV9zbGljZV9ncm91cHNfbWludXMxOwotCi0gIE00T1NBX0Jvb2wgICAgICAgIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZzsKLSAgLyogaWYoIHBpY19vcmRlcl9jbnRfdHlwZSA8IDIgKSAgaW4gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgcGljX29yZGVyX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgd2VpZ2h0ZWRfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOwotICBNNE9TQV9Cb29sICAgICAgICByZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgQWN0aXZlOwotCi0gIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2FjdGl2ZV9zcHM7Ci19IENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1M7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICBNNE9TQV9VSW50MzIgYml0UG9zOyAgICAgICAgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KLSAgICAgIE00T1NBX1VJbnQzMiB0b3RhbEJpdHM7ICAgICAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgKHRvdGFsIGJpdHMgcmVhZCBzbyBmYXIpICovCi0KLSAgICAgIE00T1NBX1VJbnQzMiBsYXN0VG90YWxCaXRzOyAgICAgICAgIC8qITwgYml0IHBvc2l0aW9uIGluIGZpbGUgb2YgdGhlIGxhc3QgVk9QICovCi0gICAgICBNNE9TQV9VSW50MzIgbnVtQml0c0luQnVmZmVyOyAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAgICAgTTRPU0FfVUludDMyIHJlYWRhYmxlQnl0ZXNJbkJ1ZmZlcjsgLyohPCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBpbiBkZWNvZGVyIGJ1ZmZlciovCi0gICAgICBNNE9TQV9VSW50MzIgbWF4QnVmZmVyU2l6ZTsgICAgICAgICAvKiE8IG1heCBidWZmZXIgc2l6ZSBpbiBiaXQgdW5pdHMgKi8KLSAgICAgIE00T1NBX1VJbnQ4ICAqQnVmZmVyOyAgICAgICAgICAgICAgIC8qITwgY2hhciBidWZmZXIgYXQgcmVhZGluZyBmcm9tIGZpbGUgKi8KLSAgICAgIE00T1NBX0ludDMyICAgICBpOEJpdENudDsKLSAgICAgIE00T1NBX1VJbnQzMiAgICAgdWkzMlRlbXBCdWZmOwotICAgICAgTTRPU0FfSW50OCpwdWk4QmZyUHRyOwotICAgICAgTTRPU0FfVUludDMyICAgIHVpMzJMYXN0VHdvQnl0ZXM7ICAvKiE8IHN0b3JlcyB0aGUgbGFzdCByZWFkIHR3byBieXRlcyAqLwotfSBDb21CaXRTdHJlYW1NQ1NfdDsKLQotCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgTTRPU0FfSW50MzIgcHJldl9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgY3VyX2ZyYW1lX251bTsKLSAgICBNNE9TQV9JbnQzMiBwcmV2X25ld19mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9JbnQzMiBpc19kb25lOwotICAgIE00T1NBX0ludDMyIGlzX2ZpcnN0OwotICAgIE00T1NBX0ludDMyIGZyYW1lX2NvdW50OwotICAgIE00T1NBX0ludDMyIGZyYW1lX21vZF9jb3VudDsKLSAgICBNNE9TQV9JbnQzMiBQT0NfbHNiOwotICAgIE00T1NBX0ludDMyIFBPQ19sc2JfbW9kOwotCi0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvOyAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY3JlYXRlIGEgZGVjb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOy8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24gcG9pbnRlciBhYm92ZSovCi0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRW5jb2RlclNQUzsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BFbmNvZGVyUFBTOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJQUFNTaXplOwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEZpbmFsRFNJOwotICAgIE00T1NBX1VJbnQzMiAgICBtX3BGaW5hbERTSVNpemU7Ci0KLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyX1NQU19DbnQ7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfY2xpcF9zcHM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2Rlcl9QUFNfQ250OwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICpwX2NsaXBfcHBzOwotCi0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBfZW5jb2Rlcl9zcHM7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgKnBfZW5jb2Rlcl9wcHM7Ci0KLQotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICBlbmNvZGVyX3NwczsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAgZW5jb2Rlcl9wcHM7Ci0gICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgIGNsaXBfc3BzOwotCi0gICAgLyogRW5jb2RlciBTUFMgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX1VJbnQzMiBlbmNfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDMyIGVuY19sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBlbmNfcGljX29yZGVyX2NudF90eXBlOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OyAvKiBhcHBsaWNhYmxlIHdoZW4gUE9DIHR5cGUgPSAwICovCi0gICAgTTRPU0FfVUludDMyIGVuY19kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICBNNE9TQV9JbnQzMiBlbmNfb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgLyogcmFuZ2UgMCB0byAyNTUgKi8KLSAgICAvKiBhcnJheSBvZiBzaXplIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgIGVuY19vZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGVuY19nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWc7Ci0KLQotICAgIC8qIElucHV0IGNsaXAgU1BTIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9zZXFfcGFyYW1ldGVyX3NldF9pZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9mcmFtZV9udW1fbWludXM0OwotICAgIE00T1NBX1VJbnQzMiBjbGlwX3BpY19vcmRlcl9jbnRfdHlwZTsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7IC8qIGFwcGxpY2FibGUgd2hlbiBQT0MgdHlwZSA9IDAgKi8KLSAgICBNNE9TQV9VSW50MzIgY2xpcF9kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyAvKiByYW5nZSAwIHRvIDI1NSAqLwotICAgIC8qIGFycmF5IG9mIHNpemUgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSAqLwotICAgIE00T1NBX0ludDMyICBjbGlwX29mZnNldF9mb3JfcmVmX2ZyYW1lWzI1Nl07Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbnVtX3JlZl9mcmFtZXM7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotCi0gICAgTTRPU0FfVUludDMyIGZpbmFsX1BQU19JRDsKLSAgICBNNE9TQV9VSW50MzIgZmluYWxfU1BTX0lEOwotICAgIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgIGVuY2JzOwotCi19IE5TV0FWQ19NQ1NfdDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TUNTX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIE1DUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBNQ1MgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBNQ1MgU3RhdGUgYW5kIHNldHRpbmdzIHN0dWZmICovCi0gICAgTTRNQ1NfU3RhdGVzICAgICAgICAgICAgU3RhdGU7ICAgICAvKio8IE1DUyBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00TUNTX1N0cmVhbVN0YXRlICAgICAgIFZpZGVvU3RhdGU7LyoqPCBTdGF0ZSBvZiB0aGUgdmlkZW8gZW5jb2RpbmcgKi8KLSAgICBNNE1DU19TdHJlYW1TdGF0ZSAgICAgICBBdWRpb1N0YXRlOy8qKjwgU3RhdGUgb2YgdGhlIGF1ZGlvIGVuY29kaW5nICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbm9hdWRpbzsvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhdWRpbyB0cmFuc2NvZGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG5vdmlkZW87LyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggdmlkZW8gdHJhbnNjb2RpbmcgKi8KLQotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICBJbnB1dEZpbGVQcm9wZXJ0aWVzOy8qKjwgSW5wdXQgYXVkaW8vdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBwSW5wdXRGaWxlOyAgICAgICAgICAgICAvKio8IFJlbWVtYmVyIGlucHV0IGZpbGUgcG9pbnRlciBiZXR3ZWVuIGZhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gYW5kIG5vcm1hbCBvcGVuICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZTsgICAgICAgICAgLyoqPCBSZW1lbWJlciBpbnB1dCBmaWxlIHR5cGUgYmV0d2VlbiBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIGFuZCBub3JtYWwgb3BlbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJGaWxlT3BlbmVkSW5GYXN0TW9kZTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIGEgcGFydGljdWxhciByZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIGZhc3Qgb3BlbiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpTWF4TWV0YWRhdGFTaXplOyAgICAgIC8qKjwgTGltaXRhdGlvbiBvbiB0aGUgbWF4IGFjY2VwdGFibGUgbW9vdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiBhIDNncHAgZmlsZSAqLwotCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRW5jb2RpbmdWaWRlb0Zvcm1hdDsgICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVXaWR0aCAgICBFbmNvZGluZ1dpZHRoOyAgICAgICAgICAvKio8IE91dHB1dCB2aWRlbyB3aWR0aCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgRW5jb2RpbmdIZWlnaHQ7ICAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gaGVpZ2h0LCBzZXQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICBFbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOyAvKio8IE91dHB1dCB2aWRlbyBmcmFtZXJhdGUsIHNldCBieSB0aGUgdXNlciovCi0KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUJlZ2luQ3V0VGltZTsgICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpRW5kQ3V0VGltZTsgICAgICAgLyoqPCBCZWdpbiBjdXQgdGltZSwgaW4gbWlsbGlzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlNYXhGaWxlU2l6ZTsgICAgICAvKio8IE1heGltdW0gb3V0cHV0IGZpbGUgc2l6ZSwgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgYXVkaW8gYml0cmF0ZSBpbiBicHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSBpbiBicHMgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgICB1aVByb2dyZXNzOyAgLyoqPCBQcm9ncmVzcyBpbmZvcm1hdGlvbiBzYXZlZCBhdCBlYWNoIHN0ZXAgdG8gYmUgYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQgaW4gY2FzZSBvZiBwYXVzZSAqLwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgcFJlYWRlckNvbnRleHQ7ICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIHJlYWRlciBtb2R1bGUgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICBwUmVhZGVyVmlkZW9TdHJlYW07ICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgdmlkZW8gc3RyZWFtICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgcFJlYWRlckF1ZGlvU3RyZWFtOyAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZFZpZGVvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJVbnN1cHBvcnRlZEF1ZGlvRm91bmQ7ICAgLyoqPCBUcnVlIGlmIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBoYXMgYmVlbiBmb3VuZCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTE7ICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVMjsgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMTsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFBZGRyZXNzMjsgICAgICAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MxOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgIG1fcERhdGFWaWRlb0FkZHJlc3MyOyAgICAgLyoqPCBUZW1wb3JhcnkgYnVmZmVyIGZvciBBY2Nlc3MgVW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fYXVkaW9BVUR1cmF0aW9uOyAgICAgICAgLyoqPCBBdWRpbyBBVSBkdXJhdGlvbiAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIGlBdWRpb0N0c09mZnNldDsgICAgICAgICAgLyoqPCBBdWRpbyBBVSBDVFMgb2Zmc2V0IGR1ZSB0byBiZWdpbiBjdXQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcFZpRGVjQ3R4dDsgICAgICAgICAvKio8IFZpZGVvIGRlY29kZXIgY29udGV4dCAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkVmlEZWNTdGFydGluZ0N0czsgIC8qKjwgVmlkZW8gQ1RTIGF0IHdoaWNoIHRoZSBkZWNvZGUvZW5jb2RlIHdpbGwgc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VkIGZvciBiZWdpbiBjdXQgYW5kIHBhdXNlL3Jlc3VtZSkgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZFZpRGVjQ3VycmVudEN0czsgICAvKio8IFZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgaVZpZGVvQmVnaW5EZWNJbmNyOyAvKio8IENUUyBzdGVwIGZvciB0aGUgYmVnaW4gY3V0IGRlY29kZSAoZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uKSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICBkQ3RzSW5jcmVtZW50OyAgICAgIC8qKjwgQ3RzIGluY3JlbWVudCBmcm9tIG9uZSB2aWRlbyBmcmFtZSB0byBhbm90aGVyKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgaXNSZW5kZXJEdXA7ICAgICAgICAvKio8IFRvIGhhbmRsZSBkdXBsaWNhdGUgZnJhbWUgcmVuZGVyaW5nIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBkZWNvZGluZyAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lKiAgICBsYXN0RGVjb2RlZFBsYW5lOyAgIC8qKjwgTGFzdCBkZWNvZGVkIHBsYW5lICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBWaUVuY0N0eHQ7ICAgICAgICAgLyoqPCBWaWRlbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgcFByZVJlc2l6ZUZyYW1lOyAgICAvKio8IFRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZSByZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBpZiByZXNpemUgbmVlZGVkIG9ubHkpKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgdWlFbmNWaWRlb0JpdHJhdGU7ICAvKio8IEFjdHVhbCB2aWRlbyBiaXRyYXRlIGZvciB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICBvdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgZW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwQXVkaW9EZWNDdHh0OyAgICAgICAgLyoqPCBBdWRpbyAoQUFDKSBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJJbjsgICAgIC8qKjwgSW5wdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00QURfQnVmZmVyICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dDsgICAgLyoqPCBPdXRwdXQgc3RydWN0dXJlIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICBwUG9zSW5EZWNCdWZmZXJPdXQ7ICAgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBkZWNvZGVyIGJ1ZmZlciAqLwotICAgIEFBQ19ERUNfU1RSRUFNX1BST1BTICBBYWNQcm9wZXJ0aWVzOyAgIC8qKjwgU3RydWN0dXJlIGZvciBuZXcgYXBpIHRvIGdldCBBQUMgcHJvcGVydGllcyAqLwotCi0gICAgLyoqCi0gICAgICogU2FtcGxlIFJhdGUgQ29udmVydG9yIChTU1JDKSBzdHVmZiAqLwotICAgIFNTUkNfSW5zdGFuY2VfdCAgICAgICAgU3NyY0luc3RhbmNlOyAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIFNzcmMgKi8KLSAgICBTU1JDX1NjcmF0Y2hfdCogICAgICAgIFNzcmNTY3JhdGNoOyAgICAgICAgLyoqPCBXb3JraW5nIG1lbW9yeSBvZiB0aGUgU3NyYyAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsSW47ICAgICAvKio8IE51bWJlciBvZiBzYW1wbGUgdGhlIFNzcmMgbmVlZHMgYXMgaW5wdXQgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbE91dDsgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG91dHB1dHMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBTc3JjQnVmZmVySW47ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFNzcmNCdWZmZXJPdXQ7ICAgICAvKio8IE91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFBvc0luU3NyY0J1ZmZlckluOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwUG9zSW5Tc3JjQnVmZmVyT3V0Oy8qKjwgUG9zaXRpb24gaW50byB0aGUgU1NSQyBvdXQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgIHBMVkF1ZGlvUmVzYW1wbGVyOwotCi0KLSAgICAvKioKLSAgICAgKiBhdWRpbyBlbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNDdHh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gIHBBdWRpb0VuY0RTSTsgLyoqPCBEZWNvZGVyIHNwZWNpZmljIGluZm8gYnVpbHQgYnkgdGhlIGVuY29kZXIqLwotICAgIE00RU5DT0RFUl9BdWRpb1BhcmFtcyAgICAgICAgICAgQXVkaW9FbmNQYXJhbXM7LyoqPCBDb25maWcgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBBdWRpb0VuY29kZXJCdWZmZXI7ICAgICAgLyoqPCBJbnB1dCBvZiB0aGUgZW5jb2RlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgcFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOyAvKio8IFBvc2l0aW9uIGludG8gdGhlIGVuY29kZXIgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBhdWRpb0VuY29kZXJHcmFudWxhcml0eTsgIC8qKjwgTWluaW11bSBudW1iZXIgb2YgcGNtIHNhbXBsZXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZmVlZCBhdWRpbyBlbmNvZGVyICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgIHBXcml0ZXJDb250ZXh0OyAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSB3cml0ZXIgbW9kdWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICBwT3V0cHV0RmlsZTsgICAgICAgIC8qKjwgT3V0cHV0IGZpbGUgdG8gYmUgY3JlYXRlZCAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgcFRlbXBvcmFyeUZpbGU7ICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgdG8gc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJWaWRlb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICBXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4gYXVkaW8gc3RyZWFtICovCi0gICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyBXcml0ZXJWaWRlb1N0cmVhbUluZm87LyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJWaWRlb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICBXcml0ZXJBdWRpb0FVOyAgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvQVVDb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgdmlkZW8gQVUgd3JpdHRlbiBpbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAgLyoqPCBNYXggYWNjZXNzIHVuaXQgc2l6ZSBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb01heENodW5ja1NpemU7IC8qKjwgTWF4IGNodW5jayBzaXplIGZvciB0aGUgb3V0cHV0IHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQVVDb3VudDsgICAvKio8IE51bWJlciBvZiBhdWRpbyBBVSB3cml0dGVuIGluIG91dHB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAvKio8IE1heCBhY2Nlc3MgdW5pdCBzaXplIGZvciB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICB1aUF1ZGlvQ3RzOyAgICAgICAvKio8IEF1ZGlvIEFVIGN0cyAod2hlbiBhdWRpbyBpcyB0cmFuc2NvZGVkKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYl9pc1Jhd1dyaXRlcjsgICAgLyoqPCBCb29sZWFuIHRvIGtub3cgaWYgdGhlIHJhdyB3cml0ZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICBwT3V0cHV0UENNZmlsZTsgICAvKio8IE91dHB1dCBQQ00gZmlsZSBpZiBub3QgTlVMTCAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIHBPc2FGaWxlUmVhZFB0cjsgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgcE9zYUZpbGVXcml0UHRyOyAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotCi0gICAgLyoqCi0gICAgICAqIE1lZGlhIGFuZCBDb2RlYyByZWdpc3RyYXRpb24gKi8KLSAgICAvKio8IFRhYmxlIG9mIE00VkVTX1dyaXRlckludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgV3JpdGVycyBsaXN0ICovCi0gICAgTTRNQ1NfV3JpdGVySW50ZXJmYWNlICAgICAgICAgICAgICAgV3JpdGVySW50ZXJmYWNlW000V1JJVEVSX2tUeXBlX05CXTsKLSAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzOwotICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIG9mIHRoZSB1c2VkIHdyaXRlciAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0czsKLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEk7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICAgcEF1ZGlvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IFRhYmxlIG9mIGludGVybmFsL2V4dGVybmFsIGZsYWdzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJGbGFnW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgRnVuY3Rpb25zIG9mIHRoZSB1c2VkIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0czsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgbV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBtX3BSZWFkZXI7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0OwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzOwotCi0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVfTkJdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWM7Ci0KLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICBtX3BBdWRpb0RlY29kZXI7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgbV9wQXVkaW9EZWNvZGVySXRUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbTTRBRF9rVHlwZV9OQl07IC8qKjwgc3RvcmUgaW5kaWNlcyBvZiBleHRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJzICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBtX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGE7Ci0KLSAgICBNNE1DU19NZWRpYVJlbmRlcmluZyAgICBNZWRpYVJlbmRlcmluZzsgICAgIC8qKjwgRkI6IHRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkV4dE9NWEF1ZERlY29kZXI7ICAvKiBFeHRlcm5hbCBPTVggQXVkaW8gZGVjb2RlciAqLwotCi0gICAgLyoqPCBGbEIgMjAwOS4wMy4wNDogQXVkaW8gZWZmZWN0cyovCi0gICAgTTRNQ1NfRWZmZWN0U2V0dGluZ3MgICAgKnBFZmZlY3RzOyAgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIGVmZmVjdHMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICBuYkVmZmVjdHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlZmZlY3RzIGluIHRoZSBhYm92ZSBsaXN0ICovCi0gICAgTTRPU0FfSW50OCAgICAgICAgICAgICAgcEFjdGl2ZUVmZmVjdE51bWJlcjsgICAgLyoqPCBFZmZlY3QgSUQgdG8gYmUgYXBwbGllZCwgaWYgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IGhhcyB0byBiZSBhcHBsaWVkIGN1cnJlbnRseSovCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JJc1N0aWxsUGljdHVyZTsgICAgICAgLyoqPCA9VFJVRSBpZiBpbnB1dCBmaWxlIGlzIGEgc3RpbGwgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSlBFRywgUE5HLCBCTVAsIEdJRikqLwotICAgIE00TUNTX0NvbnRleHQgICAgICAgICAgIG1fcFN0aWxsUGljdHVyZUNvbnRleHQ7IC8qKjwgQ29udGV4dCBvZiB0aGUgc3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotICAgIE5TV0FWQ19NQ1NfdCAgICAgICAgICAgICptX3BJbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAqSDI2NE1DU1RlbXBCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgSDI2NE1DU1RlbXBCdWZmZXJTaXplOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkgyNjRUcmltOwotICAgIC8qIEZsYWcgd2hlbiB0byBnZXQgIGxhc3RkZWNvZGVkZnJhbWVDVFMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiTGFzdERlY29kZWRGcmFtZUNUUzsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBlbmNvZGluZ1ZpZGVvTGV2ZWw7Ci0KLX0gTTRNQ1NfSW50ZXJuYWxDb250ZXh0OwotCi0KLSNlbmRpZiAvKiBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDcwZTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2VkaXRvcl9tY3MKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX21jcwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNE1DU19BUEkuYyBcCi0gICAgICBNNE1DU19BdWRpb0VmZmVjdHMuYyBcCi0gICAgICBNNE1DU19Db2RlY3MuYyBcCi0gICAgICBNNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNTZlZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQVBJLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24gKFZpZGVvIENvbXByZXNzb3IgU2VydmljZSkKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFQSSBhbmQgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIE1DUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qIFBDTSBzYW1wbGVzICovCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICogRGVjb2RlciBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNERFQ09ERVJfQ29tbW9uLmgiCi0KLS8qIEVuY29kZXIgaW50ZXJmYWNlKi8KLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qIEVuYWJsZSBmb3IgREVCVUcgbG9nZ2luZyAqLwotLy8jZGVmaW5lIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLSNpbmNsdWRlIDxzdGRpby5oPgotRklMRSAqZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci1GSUxFICpmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSNlbmRpZgotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotI2luY2x1ZGUgIk00TUNTX1N0aWxsUGljdHVyZS5oIgotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0KLS8qIFZlcnNpb24gKi8KLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9NQUpPUiAzCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUlOT1IgNAotI2RlZmluZSBNNE1DU19WRVJTSU9OX1JFVklTSU9OICAzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwVHJhbnNjb2RlZFRpbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgICAqcENvbnRleHQgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICk7Ci1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50OCBtb2RlICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyk7Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMqIEVuY1BhcmFtcyk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2M0VuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSk7Ci1zdGF0aWMgTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFeHRlcm5hbCBmdW5jdGlvbiB1c2VkIG9ubHkgYnkgVmlkZW9FZGl0b3IgYW5kIHRoYXQgZG9lcyBub3QgYXBwZWFyCi0gKiBpbiB0aGUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICk7Ci0KLS8qIEFsbCBlcnJvcnMgYXJlIGZhdGFsIGluIHRoZSBNQ1MgKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycikgaWYoTTROT19FUlJPUiE9ZXJyKSByZXR1cm4gZXJyOwotCi0vKiBBIGRlZmluZSB1c2VkIHdpdGggU1NSQyAxLjA0IGFuZCBhYm92ZSB0byBhdm9pZCB0YWtpbmcgYmxvY2tzIHNtYWxsZXIKLSAqIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZQotICovCi0jZGVmaW5lIE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICAxMDAKLQotc3RhdGljIE00T1NBX1VDaGFyIFRhYl9NQ1NbOF0gPQotewotICAgIDE3LCA1LCAzLCAzLCAxLCAxLCAxLCAxCi19OwotCi1NNE9TQV9FUlIgSDI2NE1DU19HZXRpbnN0YW5jZSggTlNXQVZDX01DU190ICoqIGluc3RhbmNlICkKLXsKLSAgICBOU1dBVkNfTUNTX3QgKnBfYnMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIHBfYnMgPSAoTlNXQVZDX01DU190ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihOU1dBVkNfTUNTX3QpLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiTlNXQVZDX01DU190Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwX2JzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX0dldGluc3RhbmNlOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwX2JzLT5wcmV2X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+Y3VyX2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IDA7Ci0gICAgcF9icy0+cHJldl9uZXdfZnJhbWVfbnVtID0gMDsKLSAgICBwX2JzLT5pc19kb25lID0gMDsKLSAgICBwX2JzLT5pc19maXJzdCA9IDE7Ci0KLSAgICBwX2JzLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJTUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclNQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRW5jb2RlclBQUyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9lbmNvZGVyUFBTU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9wRmluYWxEU0lTaXplID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9TUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfY2xpcF9wcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2Rlcl9QUFNfQ250ID0gMDsKLQotICAgIHBfYnMtPnBfZW5jb2Rlcl9zcHMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icy0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgPSBNNE9TQV9OVUxMOwotCi0gICAgKmluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKXBfYnM7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfZ2V0Qml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWkzMlJldEJpdHM7Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9JbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgLyogTWVhc3VyZSB0aGUgcXVhbnRpdHkgb2YgYml0cyB0byBiZSByZWFkIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHVpMzJSZXRCaXRzID0gcF9icy0+dWkzMlRlbXBCdWZmID4+ICgzMiAtIG51bUJpdHMpOwotCi0gICAgLyogUmVhZCBudW1CaXRzIGluIHVpMzJUZW1wQnVmZiAqLwotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChpbnQpKHBfYnMtPm51bUJpdHNJbkJ1ZmZlciAtIHBfYnMtPmJpdFBvcykgKQotICAgICAgICB7IC8qIG5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmx5IGRldGVjdGlvbiBvZiBFUEIgYnl0ZSAqLwotICAgICAgICAgICAgICAgIGlmKCAoICoocGJzKSA9PSAweDAzKQotICAgICAgICAgICAgICAgICAgICAmJiAoISgoIHBic1stMV0pCi0gICAgICAgICAgICAgICAgICAgIHwgKHBic1stMl0pKSkpIC8vKHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgJiAweDAwMDBGRkZGKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnMtPmJpdFBvcyArPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgfD0gKihwYnMpKysgPDwgKDI0IC0gYmNudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwX2JzLT5iaXRQb3MgPD0gcF9icy0+bnVtQml0c0luQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKDApOwotICAgIH0KLX0KLQotTTRPU0FfVm9pZCBIMjY0TUNTX2ZsdXNoQml0cyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIE00T1NBX1VJbnQzMiBudW1CaXRzICkKLXsKLSAgICBNNE9TQV9VSW50OCAqcGJzOwotICAgIE00T1NBX1VJbnQzMiBiY250OwotICAgIHBfYnMtPmk4Qml0Q250IC09IG51bUJpdHM7Ci0gICAgYmNudCA9IHBfYnMtPmk4Qml0Q250OwotCi0gICAgcF9icy0+dWkzMlRlbXBCdWZmIDw8PSBudW1CaXRzOwotICAgIHBfYnMtPmJpdFBvcyArPSBudW1CaXRzOwotCi0gICAgaWYoIGJjbnQgPiAyNCApCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7IC8qIGF0IGxlYXN0IG9uZSBieXRlIGNhbiBiZSBidWZmZXJlZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICAgICAgcGJzID0gKE00T1NBX1VJbnQ4ICopcF9icy0+cHVpOEJmclB0cjsKLQotICAgICAgICBpZiggYmNudCA8IChwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAgIC8qIE5vdCBlbm91Z2ggcmVtYWluaW5nIGJpdHMgaW4gdWkzMlRlbXBCdWZmOiBuZWVkIHRvIGJlIGZpbGxlZCAqLwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiAgT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykgJiYgKCEoKCBwYnNbLTFdKSB8IChwYnNbLTJdKSkpICkKLSAgICAgICAgICAgICAgICB7IC8qIEpDOiBFUEIgYnl0ZSBmb3VuZDogc2tpcCBpdCBhbmQgdXBkYXRlIGJpdFBvcyBhY2NvcmRpbmdseSAqLwotICAgICAgICAgICAgICAgICAgICAocGJzKSsrOwotICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgIGJjbnQgKz0gODsKLSAgICAgICAgICAgIH0gd2hpbGUgKCBiY250IDw9IDI0ICk7Ci0KLSAgICAgICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBiczsKLSAgICAgICAgICAgIHBfYnMtPmk4Qml0Q250ID0gYmNudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotTTRPU0FfVUludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgbDAgPSAwLCBsMTsKLSAgICAvKiBSZWFkaW5nIDMyIEJpdHMgZnJvbSBsb2NhbCBjYWNoZSBidWZmZXIgb2YgQml0c3RyZWFtIHN0cnVjdHVyZSovCi0gICAgY29kZSA9IHBfYnMtPnVpMzJUZW1wQnVmZjsKLQotICAgIC8qIENoZWNraW5nIGluIGZpcnN0IDMgYml0cyovCi0gICAgaWYoIGNvZGUgPj4gMjkgKQotICAgIHsKLSAgICAgICAgbDAgPSBUYWJfTUNTWyhjb2RlID4+IDI5KV07Ci0gICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMiAtIGwwKTsKLSAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgbDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjb2RlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlIDw8PSAzOwotCi0gICAgICAgICAgICAgICAgZm9yICggbDAgPSAzOyBjb2RlIDwgMHg4MDAwMDAwMDsgY29kZSA8PD0gMSwgbDArKyApOwotCi0gICAgICAgICAgICAgICAgaWYoIGwwIDwgMTYgKSAvKmFsbCB1c2VmdWwgYml0cyBhcmUgaW5zaWRlIHRoZSAzMiBiaXRzIHJlYWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlID4+ICgzMSAtIGwwKTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMiAqIGwwICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgLyogUmVhZCB0aGUgdXNlZnVsIGJpdHMgaW4gMiBwYXJ0cyAqLwotICAgICAgICAgICAgICAgICAgICBsMSA9ICggbDAgPDwgMSkgLSAzMTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA+Pj0gbDA7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDMyKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZSA9ICggY29kZSA8PCBsMSkgfCBIMjY0TUNTX2dldEJpdHMocF9icywgbDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGlmIG51bWJlciBvZiBsZWFkaW5nIDAncyBpcyAzMiwgdGhlIG9ubHkgY29kZSBhbGxvd2VkIGlzIDEgZm9sbG93ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgMzIgMCdzICovCi0KLSAgICAgICAgICAgICAgICAgICAgLypyZWFkaW5nIDMyIG1vcmUgYml0cyBmcm9tIGJpdHN0cmVhbSBidWZmZXIqLwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDMyKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY29kZSA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyppZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgPjMyLCB0aGVuIHN5bWJvbCBpcyA+MzIgYml0cywKLSAgICAgICAgICAgICAgICB3aGljaCBpcyBhbiBlcnJvciAqLwotICAgICAgICAgICAgICAgIC8vcF9icy0+c3RhdGUgPSBfQlNfRVJSOwotICAgICAgICAgICAgICAgIC8vcF9icy0+ZmxhZ3MgfD0gX0JGX1NZTV9FUlI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAxICkgLy8ocF9icy0+c3RhdGUgPT0gX0JTX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGNvZGUgLSAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLU00T1NBX0ludDMyIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBjb2RlTm8sIHJldDsKLQotICAgIC8qIHJlYWQgdGhlIHVuc2lnbmVkIGNvZGUgbnVtYmVyICovCi0gICAgY29kZU5vID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIG1hcCB0byB0aGUgc2lnbmVkIHZhbHVlLCBpZiB2YWx1ZSBpcyBvZGQgdGhlbiBpdCdzIHBvc2l0aXZlLAotICAgIGlmIGV2ZW4gdGhlbiBpdCdzIG5lZ2F0aXZlLCBmb3JtdWxhIGlzICgtMSleKGsrMSkqQ0VJTChrLzIpICovCi0KLSAgICByZXQgPSAoY29kZU5vICYgMHgwMSkgPyAoKCBjb2RlTm8gKyAxKSA+PiAxKSA6ICgoIC1jb2RlTm8pID4+IDEpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotTTRPU0FfVm9pZCBEZWNCaXRTdHJlYW1SZXNldF9NQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGJ5dGVzX3JlYWQgKQotewotICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0KLSAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSBieXRlc19yZWFkIDw8IDM7Ci0gICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gYnl0ZXNfcmVhZDsKLSAgICAvL3BfYnMtPnN0YXRlID0gTTROT19FUlJPUjsvL19CU19PSzsKLSAgICAvL3BfYnMtPmZsYWdzID0gMDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLSAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMgKQotewotICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIGJTLT5ieXRlQ250ID0gMDsKLSAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotICAgIGJTLT5wcmV2Qnl0ZSA9IDB4ZmY7Ci0gICAgYlMtPnByZXZQcmV2Qnl0ZSA9IDB4ZmY7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU19wdXRCaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxlbmd0aCApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIE00T1NBX1VJbnQzMiBsZW4xID0gKGxlbmd0aCA9PSAzMikgPyAzMSA6IGxlbmd0aDsKLQotICAgIGlmKCAhKGxlbmd0aCkgKQotICAgIHsKLSAgICAgICAgLyogTGVuZ3RoID0gMCwgcmV0dXJuIE9LKi8KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgbWFza2VkVmFsdWUgPSAoTTRPU0FfVUludDMyKSh2YWx1ZSAmKCggMSA8PCBsZW4xKSAtIDEpKTsKLQotICAgIGlmKCAzMiA+IChsZW5ndGggKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IGxlbmd0aDsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gKCggYlMtPmJpdFBvcyArIGxlbmd0aCkgLSAzMik7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSA+PiAodGVtcCkpOwotCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKChiUy0+Y3VyckJ1ZmYpICYweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9ICggbWFza2VkVmFsdWUgJigoIDEgPDwgdGVtcCkgLSAxKSkgPDwgKDMyIC0gdGVtcCk7Ci0KLSAgICAgICAgYlMtPmJpdFBvcyA9IHRlbXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0KCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfVUludDMyIHZhbHVlICkKLXsKLSAgICBNNE9TQV9VSW50MzIgbWFza2VkVmFsdWUgPSAwLCB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlT25lOwotCi0gICAgbWFza2VkVmFsdWUgPSAodmFsdWUgPyAxIDogMCk7Ci0KLSAgICBpZiggMzIgPiAoMSArIGJTLT5iaXRQb3MpICkKLSAgICB7Ci0gICAgICAgIGJTLT5iaXRQb3MgKz0gMTsKLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IG1hc2tlZFZhbHVlIDw8ICgzMiAtIGJTLT5iaXRQb3MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0ZW1wID0gMDsKLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgfD0gKG1hc2tlZFZhbHVlKTsKLQotICAgICAgICAvKiB3cml0aW5nIGl0IHRvIG1lbW9yeSovCi0gICAgICAgIGJ5dGVPbmUgPQotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICAgICAgYlMtPmJpdFBvcyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBNNE9TQV9VSW50OCB0cmFpbEJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVDbnQgPSAwOwotCi0gICAgdHJhaWxCaXRzID0gKE00T1NBX1VJbnQ4KShiUy0+Yml0UG9zICUgOCk7Ci0KLSAgICAvKiBBbHJlYWR5IGluIHRoZSBieXRlIGFsaWduZWQgcG9zaXRpb24sCi0gICAgUkJTUCB0cmFpbGluZyBiaXRzIHdpbGwgYmUgMTAwMCAwMDAwICovCi0gICAgaWYoIDAgPT0gdHJhaWxCaXRzICkKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICgxIDw8IDcpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgdHJhaWxCaXRzLCA4KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdHJhaWxCaXRzID0gKDggLSB0cmFpbEJpdHMpOwotICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0KGJTLCAxKTsKLSAgICAgICAgdHJhaWxCaXRzLS07Ci0KLSAgICAgICAgaWYoIHRyYWlsQml0cyApCi0gICAgICAgIHsgLyogcHV0IHRyYWlsQml0cyB0aW1lcyB6ZXJvcyAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIDAsIHRyYWlsQml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGb3Igd3JpdHRpbmcgdGhlIGN1cnJCdWZmIGluIHN0cmVhbUJ1ZmYgNGJ5dGUgYWxpZ25tZW50IGlzIHJlcXVpcmVkKi8KLSAgICBieXRlQ250ID0gKE00T1NBX1VJbnQ4KSgoIGJTLT5iaXRQb3MgKyA0KSAvIDgpOwotCi0gICAgc3dpdGNoKCBieXRlQ250ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogSXQgd2lsbCBub3QgY29tZSBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyAgICBiUy0+Yml0UG9zID0wOwotICAgIC8vICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE5TV0FWQ01DU191RXhwVkxDKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUywgTTRPU0FfSW50MzIgY29kZU51bSApCi17Ci0KLSAgICBNNE9TQV9JbnQzMiBsb29wLCB0ZW1wOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwOwotCi0gICAgLyogVGhlIGNvZGVOdW0gY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIGZvciB0aGlzIHVlKHYpICovCi0gICAgaWYoIGNvZGVOdW0gPCAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIEltcGxlbWVudGF0aW9uIGZvciBFbmNvZGluZyBvZiB0aGUgVGFibGUgOS0xIGluIHRoZSBTdGFuZGFyZCAqLwotICAgIHRlbXAgPSBjb2RlTnVtICsgMTsKLQotICAgIGZvciAoIGxvb3AgPSAwOyB0ZW1wICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wIC89IDI7Ci0gICAgfQotCi0gICAgY29kZUxlbiA9ICgoIGxvb3AgKiAyKSAtIDEpOwotCi0gICAgZGF0YSA9IGNvZGVOdW0gKyAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1Nfc0V4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDEsIHRlbXAyOwotICAgIE00T1NBX0ludDMyIGRhdGEgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvZGVMZW4gPSAwLCBpc1Bvc2l0aXZlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgYWJzY29kZU51bTsKLQotICAgIGlmKCBjb2RlTnVtID4gMCApCi0gICAgewotICAgICAgICBpc1Bvc2l0aXZlID0gMTsKLSAgICB9Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgYWJzY29kZU51bSA9IGNvZGVOdW07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSAtY29kZU51bTsKLSAgICB9Ci0KLSAgICB0ZW1wMSA9ICggKCAoIGFic2NvZGVOdW0pIDw8IDEpIC0gaXNQb3NpdGl2ZSkgKyAxOwotICAgIHRlbXAyID0gdGVtcDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgbG9vcCA8IDE2ICYmIHRlbXAyICE9IDA7IGxvb3ArKyApCi0gICAgewotICAgICAgICB0ZW1wMiAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoIGxvb3AgKiAyKSAtIDE7Ci0KLSAgICBkYXRhID0gdGVtcDE7Ci0KLSAgICBOU1dBVkNNQ1NfcHV0Qml0cyhiUywgZGF0YSwgY29kZUxlbik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKCAgIE00T1NBX1ZvaWQgKmFpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDggKnBUbXBCdWZmMiA9IE00T1NBX05VTEw7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAiSW4gIEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVIHdpdGggRnJhbWVTaXplID0gJWQgIGluQnVmX1NpemU9JWQiLAotICAgICAgICBmcmFtZV9zaXplLCBpbmJ1Zl9zaXplKTsKLQotICAgIC8vIFN0YWdlRnJpZ2h0IGNvZGVjcyBtYXkgYWRkIGEgc3RhcnQgY29kZSwgbWFrZSBzdXJlIGl0IGlzIG5vdCBwcmVzZW50Ci0KLSAgICBpZiggIW1lbWNtcCgodm9pZCAqKWluYnVmZiwKLSAgICAgICAgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogTkFMVSBzdGFydCBjb2RlIGhhcyBub3QgYmVlbiByZW1vdmVkICVkICIKLSAgICAgICAgICAgICIweCVYIDB4JVgiLCBpbmJ1Zl9zaXplLCAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMF0sCi0gICAgICAgICAgICAoKE00T1NBX1VJbnQzMiAqKWluYnVmZilbMV0pOwotCi0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgcFRtcEJ1ZmYxID0gKE00T1NBX0ludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5idWZfc2l6ZSArIDQsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJ0bXBOQUxVIik7Ci0gICAgbWVtY3B5KCh2b2lkICopKHBUbXBCdWZmMSArIDQpLCAodm9pZCAqKWluYnVmZiwKLSAgICAgICAgaW5idWZfc2l6ZSk7Ci0gICAgcFRtcEJ1ZmYxWzNdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMl0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiA4KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzFdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMTYpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjFbMF0gPSAoIChNNE9TQV9VSW50MzIpaW5idWZfc2l6ZSA+PiAyNCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMiA9IChNNE9TQV9JbnQ4ICopaW5idWZmOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMTsKLSAgICBpbmJ1Zl9zaXplICs9IDQ7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGF2YWlsYWJsZSBzaXplIHdhcyBzZXQKLSAgICBpZiggaW5idWZfc2l6ZSA+PSAqb3V0YnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiISEhIEgyNjRNQ1NfUHJvY2Vzc05BTFUgRVJST1IgOiBzcGVjaWZpZWQgYXZhaWxhYmxlIHNpemUgaXMgaW5jb3JyZWN0ICVkICIsCi0gICAgICAgICAgICAqb3V0YnVmX3NpemUpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotICAgICAgICAvLyBVc2UgdW5zaWduZWQgdmFsdWUgdG8gZml4IGVycm9ycyBkdWUgdG8gYml0IHNpZ24gZXh0ZW5zaW9uLCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzBdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzFdOwotICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggKCAoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzJdIDw8IDgpCi0gICAgICAgICAgICArICgoTTRPU0FfVUludDggKilwX2JzLT5CdWZmZXIpWzNdOwotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzRdOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgcF9icy0+Yml0UG9zID0gMDsKLSAgICAgICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgICAgIHBfYnMtPm51bUJpdHNJbkJ1ZmZlciA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1KSA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPSBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDU7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBuYWxfc2l6ZSA9ICggbmFsX3NpemVfaGlnaDE2IDw8IDE2KSArIG5hbF9zaXplX2xvdzE2OwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgMTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIDogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAvKiBGaXJzdCBNQiBpbiBzbGljZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICAvKiBTbGljZSBUeXBlICovCi0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBzbGljZV90eXBlKTsKLQotICAgICAgICAgICAgLyogUGljdHVyZSBQYXJhbWV0ZXIgc2V0IElkICovCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfcGFyYW1ldGVyX3NldF9pZDsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+Y2xpcF9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSA6IDEzIHRlbXAgPSAwIHRyYWlsaW5nIGJpdHMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotCi0gICAgZnJlZShwVG1wQnVmZjEpOwotICAgIHBUbXBCdWZmMSA9IE00T1NBX05VTEw7Ci0gICAgaW5idWZmID0gKE00T1NBX1VJbnQ4ICopcFRtcEJ1ZmYyOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0ludDMyIERlY1NQU01DUyggQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsCi0gICAgICAgICAgICAgICAgICAgICAgQ29tU2VxdWVuY2VQYXJhbWV0ZXJTZXRfdF9NQ1MgKnNwcyApCi17Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9tYXhfZHBiX3NpemU7Ci0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDggcHJvZmlsZV9pZGMsIGxldmVsX2lkYywgcmVzZXJ2ZWRfemVyb180Yml0cywKLSAgICAgICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggY29uc3RyYWludF9zZXQwX2ZsYWcsIGNvbnN0cmFpbnRfc2V0MV9mbGFnLAotICAgICAgICBjb25zdHJhaW50X3NldDJfZmxhZywgY29uc3RyYWludF9zZXQzX2ZsYWc7Ci0KLSAgICBzcHMtPnByb2ZpbGVfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQxX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDJfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0M19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHJlc2VydmVkX3plcm9fNGJpdHMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDQpOwotICAgIHNwcy0+bGV2ZWxfaWRjID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICBzcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5NYXhGcmFtZU51bSA9IDEgPDwgKHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgIHNwcy0+cGljX29yZGVyX2NudF90eXBlID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBpZiAoc3BzLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPk1heFBpY09yZGVyQ250THNiID0KLSAgICAgICAgICAgIDEgPDwgKHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEgKQotICAgIHsKLSAgICAgICAgc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLQotICAgICAgICBzcHMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotCi0gICAgICAgIC8qbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSBtdXN0IGJlIGluIHRoZSByYW5nZSAwLCAyNTUqLwotCi0gICAgICAgIHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAvKiBjb21wdXRlIGRlbHRhUE9DICovCi0gICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgPSAwOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc3BzLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYyB0byByZW1vdmUgY29kZWMgZGVwZW5kZW5jeQotICAgICAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgc3BzLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSArPQotICAgICAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBudW1fcmVmX2ZyYW1lcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLDE2ICovCi0gICAgc3BzLT5udW1fcmVmX2ZyYW1lcyA9IChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmICghc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0KLSAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3BzLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPlBpY1dpZHRoSW5NYnMgPSBzcHMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMTsKLSAgICBzcHMtPkZyYW1lSGVpZ2h0SW5NYnMgPSAoIDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICogXAotICAgICAgICAoc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKTsKLSNpZmRlZiBfQ0FQX0ZNT18KLQotICAgIHNwcy0+TnVtU2xpY2VHcm91cE1hcFVuaXRzID0KLSAgICAgICAgc3BzLT5QaWNXaWR0aEluTWJzICogKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0gICAgc3BzLT5NYXhQaWNTaXplSW5NYnMgPSBzcHMtPlBpY1dpZHRoSW5NYnMgKiBzcHMtPkZyYW1lSGVpZ2h0SW5NYnM7Ci0KLSNlbmRpZiAvKl9DQVBfRk1PXyovCi0KLSAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiggc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID09IDAgKQotICAgICAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAxOwotCi0gICAgc3BzLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyApCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gMDsKLSAgICB9Ci0KLSAgICBzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmIChzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewotICAgICAgICAvKiBubyBlcnJvciBtZXNzYWdlIGFzIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IFZVSSBtZXNzYWdlcyAqLwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNQUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgKnBwcyApCi17Ci0gICAgTTRPU0FfSW50MzIgZXJyb3I7Ci0gICAgTTRPU0FfVUludDMyIHBpY19wYXJhbWV0ZXJfc2V0X2lkOwotCi0jaWZkZWYgX0NBUF9GTU9fCi0gICAgTTRPU0FfVUludDMyIGksIGxlbmd0aCwgdjsKLSNlbmRpZgotCi0gICAgTTRPU0FfSW50MzIgbmJfaWdub3JlX2JpdHM7Ci0KLSAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IChNNE9TQV9VSW50OClwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotICAgIHBwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyBtdXN0IGJlIDAgb3IgMSAqLwotICAgIHBwcy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHBwcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIC8qIEZNTyBzdHVmZiBiZWdpbnMgaGVyZSAqLwotCi0gICAgcHBzLT5tYXBfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQotICAgIGlmKCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCApCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgICAgIHN3aXRjaCggcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT5ydW5fbGVuZ3RoX21pbnVzMVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHBzLT50b3BfbGVmdFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tX3JpZ2h0W2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWQgPSAoSDI2NFVJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICopTTRIMjY0RGVjX21hbGxvYygocHBzLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxCi0gICAgICAgICAgICAgICAgICAgICsgMSksIE00SDI2NF9DT1JFSUQsIChNNE9TQV9DaGFyICopIlBQUyIpOwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcHBzLT5zbGljZV9ncm91cF9pZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJEZWNQUFNNQ1M6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoIGxlbmd0aCA9IDAsIHYgPSBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxICsgMTsgdiAhPSAwOwotICAgICAgICAgICAgICAgICAgICB2ID4+PSAxLCBsZW5ndGgrKyApOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9pZFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KWdldEJpdHMocF92bGNfZW5naW5lLT5wX2JzLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSAwOwotICAgIH0KLSAgICAvKiBFbmQgb2YgRk1PIHN0dWZmICovCi0KLSNlbHNlCi0KLSNlbmRpZiAvKiBfQ0FQX0ZNT18gKi8KLQotICAgIC8qIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLQotICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIC8qIG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMzEgKi8KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPndlaWdodGVkX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIC8qIHdlaWdodGVkX2JpcHJlZF9pZGMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwyICovCi0gICAgcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDIpOwotCi0gICAgLyogcGljX2luaXRfcXBfbWludXMyNiBtdXN0IGJlIGluIHRoZSByYW5nZSAtMjYsMjUgKi8KLSAgICBwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgIC8qIHBpY19pbml0X3FzX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xc19taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0xMiwrMTIgKi8KLSAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPQotICAgICAgICAoTTRPU0FfSW50MTYpSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0KLSAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKCBOU1dBVkNfTUNTX3QgKmluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzMSwgYnMxOwotCi0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvID0gMDsKLSAgICBNNE9TQV9JbnQzMiBmb3JiaWRkZW5fYml0LCBuYWxfcmVmX2lkYywgbmFsX3VuaXRfdHlwZTsKLSAgICBNNE9TQV9JbnQzMiBmaXJzdF9tYl9pbl9zbGljZSwgc2xpY2VfdHlwZSwgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSAwLAotICAgICAgICBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY250LCBjbnQxOwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4ICpsQ2xpcERTSTsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0lfUFBTX3N0YXJ0OwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gMDsKLQotICAgIE00T1NBX1VJbnQ4ICpsUFBTX0J1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGxQUFNfQnVmZmVyX1NpemUgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxTaXplLCBsU2l6ZTE7Ci0gICAgTTRPU0FfVUludDMyIGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIE00T1NBX1VJbnQzMiBsQ2xpcFBQU1JlbUJpdHMgPSAwOwotCi0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1NQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJfUFBTSUQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRW5jb2RlclBQU1JlbUJpdHMgPSAwOwotICAgIE00T1NBX1VJbnQzMiBsRm91bmQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplOwotCi0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1VzZWRTUFNJRFszMl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1BQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9VSW50OCBDbGlwX1NQU0lEX2luX1BQU1syNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkUFBTSURbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBwX2JzMSA9ICZiczE7Ci0KLSAgICAvKiBGaW5kIHRoZSBhY3RpdmUgU1BTIElEICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUzogaW5zdGFuY2UgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggPQotICAgICAgICAgICAgKGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzRdICYgMHgwMykgKyAxOwotCi0gICAgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250ID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm9bNV0gJiAweDFGOwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDQpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSA0KTsKLQotICAgICAgICBDbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICBDbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSBsQ2xpcERTSV9QUFNfb2Zmc2V0ICsgMiArIGxTaXplOwotICAgIH0KLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudCA9IGxDbGlwRFNJWzBdOwotICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAxOwotCi0gICAgbENsaXBEU0lfUFBTX3N0YXJ0ID0gbENsaXBEU0k7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9QUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgIENsaXBfU1BTSURfaW5fUFBTW0NsaXBfUFBTSURbY250XV0gPQotICAgICAgICAgICAgSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgY2xpcCBTUFMgSUQgdXNlZCBhdCB0aGUgY3V0IHN0YXJ0IGZyYW1lICovCi0gICAgd2hpbGUoICggKE00T1NBX0ludDMyKWZyYW1lX3NpemUpIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgc3dpdGNoKCBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgMjsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemVfaGlnaDE2ID0gKCBwX2JzLT5CdWZmZXJbMF0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzJdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDM7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplX2xvdzE2ID0gKCBwX2JzLT5CdWZmZXJbMl0gPDwgOCkgKyBwX2JzLT5CdWZmZXJbM107Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLSAgICAgICAgICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0gICAgICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbF9zaXplID09IDApIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCIwIHNpemUgbmFsIHVuaXQgYXQgbGluZSAlZCIsIF9fTElORV9fKTsKLSAgICAgICAgICAgIGZyYW1lX3NpemUgKz0gaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPQotICAgICAgICAgICAgKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMSkKLSAgICAgICAgICAgIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9Ci0gICAgICAgICAgICBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoIC0gMTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDggKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBQUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19Qcm9jZXNzU1BTX1BQUygpIEVycm9yOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBuYWxfdW5pdF90eXBlID09IDEpIHx8IChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgc2xpY2VfdHlwZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxBY3RpdmVTUFNJRF9DbGlwID0gQ2xpcF9TUFNJRF9pbl9QUFNbcGljX3BhcmFtZXRlcl9zZXRfaWRdOwotCi0gICAgaW5zdGFuY2UtPmZpbmFsX1NQU19JRCA9IGxBY3RpdmVTUFNJRF9DbGlwOwotICAgIC8qIERvIHdlIG5lZWQgdG8gYWRkIGVuY29kZXIgUFBTIHRvIGNsaXAgUFBTICovCi0KLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJX1BQU19zdGFydDsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfUFBTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBsQWN0aXZlU1BTSURfQ2xpcCA9PSBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dICkKLSAgICAgICAgewotICAgICAgICAgICAgbFBQU19CdWZmZXIgPSBsQ2xpcERTSSArIDE7Ci0gICAgICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gbFNpemUgLSAxOwotCi0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyAxKTsKLSAgICAgICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgICAgICBDbGlwX1BQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgQ2xpcF9Vc2VkUFBTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0gICAgICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyA9ICggbFNpemUgLSAxKSA8PCAzOwotICAgICAgICAgICAgbENsaXBQUFNSZW1CaXRzIC09IHBfYnMtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGxDbGlwRFNJW2xTaXplIC0gMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBsU2l6ZTEgPSBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSAtIDE7Ci0gICAgICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgICAgIGxFbmNvZGVyX1BQU0lEID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzMSk7Ci0gICAgICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBwX2JzMS0+Yml0UG9zOwotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IGNudDE7Ci0KLSAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPT0gbENsaXBQUFNSZW1CaXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSAhPSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyA8IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRlbXAxID09IHRlbXAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsRm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICAvKiBGb3JtIHRoZSBmaW5hbCBTUFMgYW5kIFBQUyBkYXRhICovCi0KLSAgICBpZiggbEZvdW5kID09IDEgKQotICAgIHsKLSAgICAgICAgLyogTm8gbmVlZCB0byBhZGQgUFBTICovCi0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBDbGlwX1BQU0lEW2NudF07Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKWluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICh2b2lkICopaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICBpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFERCBQUFMgKi8KLSAgICAgICAgLyogZmluZCB0aGUgZnJlZSBQUFMgSUQgKi8KLQotICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgIHdoaWxlKCBDbGlwX1VzZWRQUFNJRFtjbnRdICkKLSAgICAgICAgewotICAgICAgICAgICAgY250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCA9IGNudDsKLQotICAgICAgICBzaXplID0gaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyBpbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZQotICAgICAgICAgICAgKyAxMDsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICBpZiggaW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+bV9wRmluYWxEU0lbbENsaXBEU0lfUFBTX29mZnNldF07Ci0gICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdID0gdGVtcDsKLQotICAgICAgICAvL3RlbXAgPSBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLSAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICBwX2JzMS0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzMSwgbFNpemUxKTsKLQotICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICBsRW5jb2Rlcl9TUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotCi0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9ICggbFNpemUxKSA8PCAzOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbbFNpemUxXTsKLQotICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgfQotICAgICAgICBjbnQxKys7Ci0gICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDJdID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTWzBdOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyID0KLSAgICAgICAgICAgICYoaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgM10pOwotICAgICAgICBsUFBTX0J1ZmZlciA9IGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXI7Ci0KLSAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZpbmFsX1BQU19JRCk7Ci0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9TUFNfSUQpOwotCi0gICAgICAgIHdoaWxlKCBsRW5jb2RlclBQU1JlbUJpdHMgPiA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgOCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyA9IGxFbmNvZGVyUFBTUmVtQml0cyAtIDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzMSwgbEVuY29kZXJQUFNSZW1CaXRzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgIGxQUFNfQnVmZmVyX1NpemUgPSB0ZW1wOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplXSA9Ci0gICAgICAgICAgICAoIHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAxXSA9Ci0gICAgICAgICAgICAodGVtcCkgJjB4RkY7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyICsgdGVtcDsKLSAgICB9Ci0KLSAgICAvKiBEZWNvZGUgdGhlIGNsaXAgU1BTICovCi0KLSAgICBsQ2xpcERTSSA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvICsgNjsKLQotICAgIGxDbGlwRFNJX1BQU19vZmZzZXQgPSA2OwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9TUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgaWYoIENsaXBfU1BTSURbY250XSA9PSBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEICkKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+Y2xpcF9zcHMpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0NsaXBfU1BTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAvL0NsaXBfVXNlZFNQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIGVuY29kZXIgU1BTICovCi0gICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluc3RhbmNlLT5tX3BFbmNvZGVyU1BTICsgMSk7Ci0gICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplIC0gMSk7Ci0gICAgZXJyID0gRGVjU1BTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5udW1fcmVmX2ZyYW1lcwotICAgID4gaW5zdGFuY2UtPmNsaXBfc3BzLm51bV9yZWZfZnJhbWVzICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxMDA7IC8vbm90IHN1cHBvcnRlZAotICAgIH0KLQotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKWxQUFNfQnVmZmVyOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsUFBTX0J1ZmZlcl9TaXplKTsKLSAgICBEZWNQUFNNQ1MocF9icywgJmluc3RhbmNlLT5lbmNvZGVyX3Bwcyk7Ci0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIGluc3RhbmNlLT5QT0NfbHNiX21vZCA9Ci0gICAgICAgIDEgPDwgKGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzTkFMVSggTlNXQVZDX01DU190ICphaW5zdGFuY2UsIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaW5idWZfc2l6ZSwgTTRPU0FfVUludDggKm91dGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKm91dGJ1Zl9zaXplICkKLXsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywgYnM7Ci0gICAgTlNXQVZDX01DU190ICppbnN0YW5jZTsKLSAgICBNNE9TQV9VSW50OCBuYWx1X2luZm87Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkLCBmcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDggdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7Ci0gICAgTTRPU0FfSW50MzIgdGVtcF9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgYml0c3RvRGlhY2FyZCwgYnl0ZXM7Ci0gICAgTTRPU0FfVUludDMyIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgTTRPU0FfSW50MzIgbmV3X2J5dGVzLCBpbml0X2JpdF9wb3M7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplOwotICAgIE00T1NBX1VJbnQzMiBjbnQ7Ci0gICAgTTRPU0FfVUludDMyIG91dGJ1ZmZwb3MgPSAwOwotICAgIC8vI2lmbmRlZiBER1JfRklYIC8vICsgbmV3Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgLy8jZW5kaWYgLy8gKyBlbmQgbmV3Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgaW5zdGFuY2UgPSAoTlNXQVZDX01DU190ICopYWluc3RhbmNlOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc05BTFU6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBpbnN0YW5jZS0+aXNfZG9uZSApCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpbmJ1ZmZbMF0gPSAweDAwOwotICAgIGluYnVmZlsxXSA9IDB4MDA7Ci0gICAgaW5idWZmWzJdID0gMHgwMDsKLSAgICBpbmJ1ZmZbM10gPSAweDAxOwotCi0KLSAgICB3aGlsZSggKE00T1NBX0ludDMyKWZyYW1lX3NpemUgPCBpbmJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIG1hc2tfYml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbmJ1ZmYgKyBmcmFtZV9zaXplKTsKLQotCi0gICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gcF9icy0+QnVmZmVyWzBdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSBwX2JzLT5CdWZmZXJbMl07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDNdID0gcF9icy0+QnVmZmVyWzNdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyA0XSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLQotCi0gICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0OwotICAgICAgICBidWZmID0gaW5idWZmICsgZnJhbWVfc2l6ZSArIDQ7Ci0KLSAgICAgICAgd2hpbGUoIG5hbF9zaXplID4gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIGJ1ZmZbMF0gPT0gMHgwMCkgJiYgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYgKGJ1ZmZbMl0gPT0gMHgwMCkKLSAgICAgICAgICAgICAgICAmJiAoYnVmZlszXSA9PSAweDAxKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmID0gYnVmZiArIDE7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfc2l6ZSA8PSA0ICkKLSAgICAgICAgewotICAgICAgICAgICAgbmFsX3NpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG5hbF9zaXplID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDQpIC0gbmFsX3NpemU7Ci0KLSAgICAgICAgLy8gICAgICBNNE9TQV9UUkFDRTFfMygiSDI2NE1DU19Qcm9jZXNzTkFMVSBmcmFtZSAgaW5wdXQgYnVmZiBzaXplID0gJWQgIGN1cnJlbnQgcG9zaXRpb24KLSAgICAgICAgLy89ICVkICAgbmFsIHNpemUgPSAlZCIsCi0gICAgICAgIC8vICBpbmJ1Zl9zaXplLCBmcmFtZV9zaXplLCAgbmFsX3NpemUgKyA0KTsKLSAgICAgICAgZnJhbWVfc2l6ZSArPSBuYWxfc2l6ZSArIDQ7Ci0KLQotCi0gICAgICAgIGZvcmJpZGRlbl9iaXQgPSAoIG5hbHVfaW5mbyA+PiA3KSAmIDE7Ci0gICAgICAgIG5hbF9yZWZfaWRjID0gKCBuYWx1X2luZm8gPj4gNSkgJiAzOwotICAgICAgICBuYWxfdW5pdF90eXBlID0gKG5hbHVfaW5mbykgJjB4MWY7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qSURSL1BQUyBQYWNrZXQgLSBEbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGluc3RhbmNlLT5pc19kb25lID0gMTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9IG91dGJ1ZmYgKyBvdXRidWZmcG9zICsgNTsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc05BTFUoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gMSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBmaXJzdF9tYl9pbl9zbGljZSk7Ci0KLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgICAgICAgICAgLy8gSW4gQmFzZWxpbmUgUHJvZmlsZTogZnJhbWVfbWJzX29ubHlfZmxhZyBzaG91bGQgYmUgT04KLQotICAgICAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNAotICAgICAgICAgICAgICAgICAgICArIDQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5QT0NfbHNiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgdGVtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyAmIDB4NzsKLQotICAgICAgICAgICAgaWYoIGNudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gOCAtIGNudDsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIGNudCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgY250KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0KLSAgICAgICAgICAgIHdoaWxlKCBjbnQgPCAobmFsX3NpemUgLSAyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCA4KTsKLSAgICAgICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA4KTsKLQotICAgICAgICAgICAgaWYoIHRlbXAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250ID0gMDsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCAoIHRlbXAgJiAweDEpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiggOCAtIGNudCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCAoOCAtIGNudCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoOCAtIGluc3RhbmNlLT5lbmNicy5iaXRQb3MgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPmVuY2JzLmJ5dGVDbnQ7Ci0gICAgICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0KLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvc10gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAyXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDgpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKHRlbXApICYweEZGKTsKLSAgICAgICAgICAgIG91dGJ1ZmZwb3MgPSBvdXRidWZmcG9zICsgdGVtcCArIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgLSA1OwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZvdXRidWZmW291dGJ1ZmZwb3NdLAotICAgICAgICAgICAgICAgICh2b2lkICopcF9icy0+QnVmZmVyLCBuYWxfc2l6ZSArIDQpOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAxNikmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7OwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplKSYgMHhGRik7OwotCi0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIG5hbF9zaXplICsgNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRidWZfc2l6ZSA9IG91dGJ1ZmZwb3M7Ci0KLSAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IGluc3RhbmNlLT5QT0NfbHNiICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+UE9DX2xzYiA9PSBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgIH0KLSAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSBpbnN0YW5jZS0+ZnJhbWVfY291bnQgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9PSBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKCAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5idWZfc2l6ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplID0wOwotICAgIE00T1NBX1VJbnQ4ICpidWZmOwotCi0KLSAgICB3aGlsZShmcmFtZXNpemUgPCBpbmJ1Zl9zaXplKQotICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gaW5idWZfc2l6ZSAtIGZyYW1lc2l6ZSAtIDQ7Ci0gICAgICAgICAgICBidWZmID0gIGluYnVmZiArIGZyYW1lc2l6ZSArIDQ7Ci0KLSAgICAgICAgICAgIHdoaWxlKG5hbF9zaXplID4gNCl7Ci0gICAgICAgICAgICAgICAgaWYoKGJ1ZmZbMF0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsxXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzJdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbM10gPT0gMHgwMSkpewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemUgLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKG5hbF9zaXplIDw9IDQpewotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbF9zaXplID0gKGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAwXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiAyNCkmIDB4RkYpOwotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMV0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDJdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDgpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDNdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplICkmIDB4RkYpOwotICAgICAgICBmcmFtZXNpemUgKz0gbmFsX3NpemUgKyA0OwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtIGZyYW1lc2l6ZSA9ICV4IG5hbHNpemUgPSAleCIsCi0gICAgICAgICAgICBmcmFtZXNpemUsIG5hbF9zaXplKQotICAgIH0KLQotICAgIHJldHVybiAgZXJyOwotfQotCi0KLU00T1NBX0VSUiBIMjY0TUNTX0ZyZWVpbnN0YW5jZSggTlNXQVZDX01DU190ICppbnN0YW5jZSApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGluc3RhbmNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiSDI2NE1DU19GcmVlaW5zdGFuY2U6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5zbGljZV9ncm91cF9pZCk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Nwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+cF9lbmNvZGVyX3BwcyApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5wX2VuY29kZXJfcHBzKTsKLSAgICAgICAgaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5tX3BGaW5hbERTSSApCi0gICAgewotICAgICAgICBmcmVlKGluc3RhbmNlLT5tX3BGaW5hbERTSSk7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZSk7Ci0gICAgICAgIGluc3RhbmNlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLSAqIEBicmllZiAgICBHZXQgdGhlIE1DUyB2ZXJzaW9uLgotICogQG5vdGUgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKCBNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb25JbmZvICkKLXsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsCi0gICAgICAgIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFZlcnNpb25JbmZvKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00TUNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRNQ1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNE1DU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19nZXRWZXJzaW9uKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNQ1MgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTUNTIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00TUNTX2luaXQoIE00TUNTX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18zKAotICAgICAgICAiTTRNQ1NfaW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZVJlYWRQdHJGY3Q9MHgleCwgcEZpbGVXcml0ZVB0ckZjdD0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlUmVhZFB0ckZjdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2luaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVdyaXRlUHRyRmN0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGhlIE1DUyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00TUNTX0ludGVybmFsQ29udGV4dCksCi0gICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJNNE1DU19JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00TUNTX0ludGVybmFsQ29udGV4dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwKLSAgICAqIGJlY2F1c2UgQ2xlYW5VcCgpIGNhbiBiZSBjYWxsZWQganVzdCBhZnRlciBJbml0KCkuICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPnBPc2FGaWxlUmVhZFB0ciA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYUZpbGVXcml0UHRyID0gcEZpbGVXcml0ZVB0ckZjdDsKLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bm9hdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnVpUHJvZ3Jlc3MgPSAwOwotCi0gICAgLyoqCi0gICAgKiBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSAwOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3N0cnVjdFNpemUgPSAwOwotICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9IDA7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0gICAgLyogRmlyc3QgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICAvKiBTZWNvbmQgdGVtcG9yYXJ5IHZpZGVvIEFVIGRhdGEgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogVmlkZW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDA7Ci0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAwLjA7Ci0gICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAwLjA7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGVuY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpRW5jVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJJbi5tX2J1ZmZlclNpemUgPSAwOwotICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKioKLSAgICAqIFNzcmMgc3R1ZmYgKi8KLSAgICBwQy0+cFNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gMDsKLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gMDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBBdWRpbyBlbmNvZGVyICovCi0gICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemUgPSAwOwotICAgIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSAwOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBwQy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlWaWRlb0FVQ291bnQgPSAwOwotICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAwOwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCA9IDA7Ci0gICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotCi0gICAgcEMtPnVpQXVkaW9DdHMgPSAwOwotICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPnBPdXRwdXRQQ01maWxlID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIEVuY29kaW5nIGNvbmZpZyAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tOVUxMOyAvKio8IE5vIGZvcm1hdCBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nV2lkdGggPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gc2l6ZSBzZXQgeWV0ICovCi0gICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSAwOyAgICAgICAgICAgIC8qKjwgTm8gZnJhbWVyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT51aUJlZ2luQ3V0VGltZSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGJlZ2luIGN1dCAqLwotICAgIHBDLT51aUVuZEN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIGVuZCBjdXQgKi8KLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBsaW1pdCAqLwotICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotICAgIHBDLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOyAvKio8IE5vIGJpdHJhdGUgc2V0IHlldCAqLwotCi0gICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLQotICAgIHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZSA9IDA7Ci0KLSAgICAvKkZCIDIwMDgvMTAvMjA6IGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGFuZCBBSVIgY29udGV4dCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgcEMtPk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa1Jlc2l6aW5nOwotICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAvKiovCi0KLSAgICAvKioKLSAgICAqIEZsQiAyMDA5LjAzLjA0OiBhZGQgYXVkaW8gRWZmZWN0cyovCi0gICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotICAgIC8qKi8KLQotICAgIC8qCi0gICAgKiBSZXNldCBwb2ludGVycyBmb3IgbWVkaWEgYW5kIGNvZGVjcyBpbnRlcmZhY2VzICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYXJJbnRlcmZhY2VUYWJsZXMocEMpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZSB0aGUgU3RpbGwgcGljdHVyZSBwYXJ0IG9mIE1DUyovCi0KLSAgICBlcnIgPSBNNE1DU19zdGlsbFBpY0luaXQocEMsIHBGaWxlUmVhZFB0ckZjdCwgcEZpbGVXcml0ZVB0ckZjdCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0gMDsKLSAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IDA7Ci0gICAgcEMtPmJIMjY0VHJpbSA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyogRmxhZyB0byBnZXQgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSBjdHMgKi8KLSAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0dldGluc3RhbmNlKCZwQy0+bV9wSW5zdGFuY2UpOwotICAgIH0KLSAgICBwQy0+YkV4dE9NWEF1ZERlY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwRmlsZU91dCwgTTRPU0FfVm9pZCogcFRlbXBGaWxlKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtcixtcDMgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6ICAgVGhlIGlucHV0IGZpbGUgaGFzIG5vdCBiZWVuIGZvdW5kCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOiAgIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGUsIG9yIGlzIGNvcnJ1cHRlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTogIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIG5vCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3BlbiggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsIE00T1NBX1ZvaWQgKnBGaWxlT3V0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcFRlbXBGaWxlICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICJNNE1DU19vcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCwgcEZpbGVPdXQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZUluLCBwRmlsZU91dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19vcGVuOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKCAoIElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BORykKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwgKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkgKQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5kaWNhdGUgdGhhdCB3ZSBtdXN0IHVzZSB0aGUgc3RpbGwgcGljdHVyZSBmdW5jdGlvbnMqLwotCi0gICAgICAgIHBDLT5tX2JJc1N0aWxsUGljdHVyZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb25zKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljT3BlbihwQywgcEZpbGVJbiwgSW5wdXRGaWxlVHlwZSwgcEZpbGVPdXQpOwotCi0jZWxzZQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW46IFN0aWxsIHBpY3R1cmUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBNQ1MiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ1JFQVRFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlID0gcEZpbGVJbjsKLSAgICBwQy0+SW5wdXRGaWxlVHlwZSA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgd2l0aCB0aGUgcmVhZGVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFJlYWRlcihwQ29udGV4dCwgcEMtPklucHV0RmlsZVR5cGUpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCByZWFkZXIgcmVsYXRlZCB2YXJpYWJsZXMgKi8KLSAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICovCi0gICAgcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0gcEMtPnBSZWFkZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHJlYWRlciBzaGVsbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIHRydWVWYWx1ZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgLyogRm9yIGZpcnN0IGNhbGwgdXNlIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSwgJnRydWVWYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgIGlmKCAoICggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCggKE00T1NBX1VJbnQzMilNNEVSUl9QQVJBTUVURVIpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdCBmYXRhbCwgc29tZSByZWFkZXJzIG1heSBub3Qgc3VwcG9ydCBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX0Jvb2wgZmFsc2VWYWx1ZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qIEZvciBzZWNvbmQgY2FsbCB1c2Ugbm9ybWFsIG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZmYWxzZVZhbHVlKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBNNE1DU19XSVRIX0ZBU1RfT1BFTiAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBpbnB1dCBmaWxlICovCi0KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIGVycm9yIGlzIGZyb20gdGhlIGNvcmUgcmVhZGVyLCB3ZSBjaGFuZ2UgaXQgdG8gYSBwdWJsaWMgVlhTIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgewotICAgICAgICBlcnIgPQotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSggcEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIgKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlciwgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiArQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNQUyBhbmQgUFBTIGFyZSBzdG9yZWFkIGFzIHBlciB0aGUgM2dwIGZpbGUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIC1DUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICBlbHNlIGlmKCAoIE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb01wMwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogRm91bmQgYW4gdW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtICgweCV4KSBpbiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pCi0gICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogcmV0dXJuaW5nIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYoIHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAvKkZCIDIwMDktMDItMDk6IHRoZSBlcnJvciBpcyBjaGVjayBhbmQgcmV0dXJuZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkLAotICAgICAgICBlbHNlIG9ubHkgYXVkaW8gaXMgdXNlZCwgdGhhdCBpcyB3aHkgdGhlIGVkaXRpbmcgcHJvY2VzcyBjYW4gY29udGludWUqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLQotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotI2Vsc2UKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgIH0KLQotICAgIGlmKCBwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgIT0gcFN0cmVhbUhhbmRsZXItPgotICAgICAgICAgICAgbV9zdHJlYW1UeXBlICkgLyogZGVjb2RlciBub3Qgc3VwcG9ydGVkIHlldCwgYnV0IGFsbG93IHRvIGRvIG51bGwgZW5jb2RpbmcgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYoIDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlICkgLyoqPCBzYW5pdHkgY2hlY2sgKi8KLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAoTTRPU0FfSW50MzIpKDMwMDAuCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgZkF2ZXJhZ2VGcmFtZVJhdGUpOyAvKio8IGFib3V0IDMgZnJhbWVzICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPQotICAgICAgICAgICAgMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgdHJhbnNjb2RpbmcKLSAqIEBub3RlICAgIHBQcm9ncmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORTogVHJhbnNjb2RpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiBvciBNUDMpIGZhaWxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWTogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kgKHNob3VsZCBuZXZlciBoYXBwZW4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zdGVwKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1Nfc3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUHJvZ3Jlc3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1N0ZXAocEMsIHBQcm9ncmVzcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1JFQURZOgotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcFNldChwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDoKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0RFQ09ERToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSBwQy0+dWlQcm9ncmVzczsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZShwQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFN0ZXBFbmNvZGluZyhwQywgcFByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAvKiBTYXZlIHByb2dyZXNzIGluZm8gaW4gY2FzZSBvZiBwYXVzZSAqLwotICAgICAgICAgICAgICAgIHBDLT51aVByb2dyZXNzID0gKnBQcm9ncmVzczsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQYXVzZSB0aGUgdHJhbnNjb2RpbmcgaS5lLiByZWxlYXNlIHRoZSAoZXh0ZXJuYWwgaGFyZHdhcmUpIHZpZGVvIGRlY29kZXIuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCBwYXVzaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IHRlbXBvcmFyaWx5IHN1c3BlbmRpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uIGNhbGxzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19wYXVzZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcGF1c2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3BhdXNlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1BhdXNlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6IC8qKjwgdGhlIHZpZGVvIGRlY29kZXIgaGFzIGJlZW4gY3JlYXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6IC8qKjwgdGhlIHZpZGVvIGlzIGJlaW5nIHVzZWQsIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IFN0YXRlIGVycm9yICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBDVFMgYXQgd2hpY2ggd2Ugd2lsbCByZXN1bWUgdGhlIGRlY29kaW5nICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTLCBzbyB0aGUgcmVzdW1lIHRhcmdldCBpcyB0aGUgY3VycmVudCBDVFMgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBoYXZlbid0IHBhc3NlZCB0aGUgc3RhcnRpbmcgQ1RTIHlldCwgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgc3RpbGwgdGhlIHN0YXJ0aW5nIENUUwotICAgICAgICAqIC0tPiBub3RoaW5nIHRvIGRvIGluIHRoZSBlbHNlIGJsb2NrICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19wYXVzZTogbV9wVmlkZW9EZWNvZGVyLT5wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QQVVTRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcGF1c2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUmVzdW1lIHRoZSB0cmFuc2NvZGluZyBhZnRlciBhIHBhdXNlIChzZWUgTTRNQ1NfcGF1c2UpLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcmVzdW1pbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3Jlc3VtZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRNQ1NfcmVzdW1lIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19yZXN1bWU6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljUmVzdW1lKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgc3dpdGNoKCBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUEFVU0VEOiAvKio8IE9LLCBub3RoaW5nIHRvIGRvIGhlcmUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3Jlc3VtZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgaWYoIDAuMCA9PSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIHN0aWxsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRlY29kZWQgc3RyZWFtLCBubyBuZWVkIHRvIGp1bXAsIHdlIGNhbiBwcm9jZWVkICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfcmVzdW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Nsb3NlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nLgotICogQG5vdGUgVGhlIG91dHB1dCAzR1BQIGZpbGUgaXMgcmVhZHkgdG8gYmUgcGxheWVkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xvc2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyIHN0cmVhbUhlYWRlcjsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SLCBlcnIyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19jbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgY3VycmVudCBmaWxlIGlzIG5vIGxvbmdlciBhIHN0aWxsIHBpY3R1cmUqLwotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2xvc2UocEMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xvc2UoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDbG9zZSB0aGUgZW5jb2RlciBiZWZvcmUgdGhlIHdyaXRlciB0byBiZSBjZXJ0YWluIGFsbCB0aGUgQVVzIGhhdmUgYmVlbiB3cml0dGVuIGFuZCB3ZSBjYW4KLSAgICBnZXQgdGhlIERTSS4gKi8KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIHN0YXJ0ZWQ/IERvbid0IHN0b3AgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJSdW5uaW5nID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmKCBNNE1DU19rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmVuY29kZXJTdGF0ZSApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZShwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogQ2xvc2UgdGhlIHdyaXRlciAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFdyaXRlckNvbnRleHQgKSAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLQotICAgICAgICBpZiggcEMtPm5vdmlkZW8gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoIE00RU5DT0RFUl9rTVBFRzQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgfHwgKE00RU5DT0RFUl9rSDI2NCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEdldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIGdldCB0aGUgZW5jb2RlciBoZWFkZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4KLSAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhpcyBoZWFkZXIgaW4gdGhlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc2l6ZSA9IGVuY0hlYWRlci0+U2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0pCi0gICAgICAgICAgICAgICAgJiYgKE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRGVjb2RlciBzcGVjaWZpYyBpbmZvIHBvaW50ZXIgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcEluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bV9wSW5zdGFuY2UtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCBNNE1DUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopImluc3RhbmNlLT5tX3BGaW5hbERTSSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiaW5zdGFuY2UtPm1fcEZpbmFsRFNJOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBwQy0+bV9wSW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuYWRkciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiY2FsbGluZyBzZXQgb3B0aW9uIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoInNldCBvcHRpb24gZG9uZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gc2V0IHRoZSBEU0kgaW4gdGhlIHdyaXRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFdyaXRlIGFuZCBjbG9zZSB0aGUgM0dQIG91dHB1dCBmaWxlICovCi0gICAgICAgIGVycjIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKHBDLT5wV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyMik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgICAgIC8qKjwgbm8gcmV0dXJuIGhlcmUsIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZGVhbGxvY2F0ZSBhZnRlciBjbG9zZSwgZXZlbiBpZiBpdCBmYWlscy4qLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2xvc2Ugb3V0cHV0IFBDTSBmaWxlIGlmIG5lZWRlZCAqLwotICAgIGlmKCBwQy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5jbG9zZVdyaXRlKHBDLT5wT3V0cHV0UENNZmlsZSk7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIGVmZmVjdHMsCi0gICAgZnJlZSBlZmZlY3RzIGxpc3QqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wRWZmZWN0cyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wRWZmZWN0cyk7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgIHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyID0gLTE7Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xvc2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbGVhblVwKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNQ1MuCi0gKiBAbm90ZSBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKiBAcmV0dXJuICAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBpZiggZmlsZV9hdV9yZWFkZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfYXVfcmVhZGVyKTsKLSAgICAgICAgZmlsZV9hdV9yZWFkZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9kZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9kZWNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZGVjb2RlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIGZpbGVfcGNtX2VuY29kZXIgKQotICAgIHsKLSAgICAgICAgZmNsb3NlKGZpbGVfcGNtX2VuY29kZXIpOwotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyID0gTlVMTDsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwsIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfQ0xPU0VEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fcEluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGVyciA9IEgyNjRNQ1NfRnJlZWluc3RhbmNlKHBDLT5tX3BJbnN0YW5jZSk7Ci0gICAgICAgIHBDLT5tX3BJbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBlbmNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPnBWaUVuY0N0eHQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cykgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cChwQy0+cFZpRW5jQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlFbmNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhbnVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rTm9FbmNvZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW4gdGhlIEgyNjMgY2FzZSwgd2UgYWxsb2NhdGVkIG91ciBvd24gRFNJIGJ1ZmZlciAqLwotICAgIGlmKCAoIE00RU5DT0RFUl9rSDI2MyA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgIT0gcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZikgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lKTsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgc3NyYyBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlck91dCk7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTFZEZXN0cm95KHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZW5jb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAocEMtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSBhbGwgb3RoZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgcmVhZGVycyBhbmQgdGhlIGRlY29kZXJzICovCi0gICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzdGlsbCBwaWN0dXJlIHJlc291cmNlcyAqLwotCi0gICAgTTRNQ1Nfc3RpbGxQaWNDbGVhblVwKHBDKTsKLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLQotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMocENvbnRleHQpOwotICAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMocENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19jbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTCi0gKiAgICAgICAgICB3aGF0ZXZlciB0aGUgc3RhdGUgaXMuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Fib3J0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgZXJyMSA9IE00Tk9fRVJST1I7Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DUkVBVEVEKQotICAgICAgICB8fCAocEMtPlN0YXRlID09IE00TUNTX2tTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2FuY2VsIHRoZSBvbmdvaW5nIHByb2Nlc3NlcyBpZiBhbnkqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNDYW5jZWwocEMpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfYWJvcnQgOiBNNE1DU19zdGlsbFBpY0NhbmNlbCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qU3RpbGwgcGljdHVyZSBwcm9jZXNzIGlzIG5vdyBzdG9wcGVkOyBDYXJyeSBvbiB3aXRoIGNsb3NlIGFuZCBjbGVhbnVwKi8KLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICBlcnIgPSBNNE1DU19jbG9zZShwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xvc2UgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICBlcnIxID0gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xlYW5VcChwQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Fib3J0IDogTTRNQ1NfY2xlYW5VcCBmYWlscyBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlcnIgPSAoZXJyMSA9PSBNNE5PX0VSUk9SKSA/IGVyciA6IGVycjE7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKiBwRmlsZVByb3BlcnRpZXMpOwotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvcGVydGllcyAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gYW4gYWxsb2NhdGVkIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi1zdHJ1Y3R1cmUgd2hpY2ggaXMgZmlsbGVkIHdpdGggdGhlIGlucHV0IHN0cmVhbSBwcm9wZXJ0aWVzLgotICogQG5vdGUgICAgVGhlIHN0cnVjdHVyZSBwUHJvcGVydGllcyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgZnVydGhlciBkZS1hbGxvY2F0ZWQKLWJ5IHRoZSBhcHBsaWNhdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBvcGVuZWQgc3RhdGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICBwRmlsZVByb3BlcnRpZXM9MHgleCIsIHBDb250ZXh0LCBwRmlsZVByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiBwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldElucHV0RmlsZVByb3BlcnRpZXMocEMsIHBGaWxlUHJvcGVydGllcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHByZXZpb3VzbHkgY29tcHV0ZWQgcHJvcGVydGllcyBpbnRvIGdpdmVuIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBGaWxlUHJvcGVydGllcywKLSAgICAgICAgKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLAotICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTUNTIHZpZGVvIG91dHB1dCBwYXJhbWV0ZXJzLgotICogQG5vdGUgICAgTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfb3Blbi4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIE00TUNTX3N0ZXAuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBQYXJhbXMgICAgICAgICAgICAgKElOL09VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzIDogT3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCA6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgOiBTcGVjaWZpZWQgb3V0cHV0IHBhcmFtZXRlcnMgZGVmaW5lIGEgbnVsbCBkdXJhdGlvbiBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm8gYXVkaW8gYW5kIHZpZGVvKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19PdXRwdXRQYXJhbXMgKnBQYXJhbXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZVdpZHRoOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lSGVpZ2h0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUGFyYW1zPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFBhcmFtcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtczogcFBhcmFtIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0T3V0cHV0UGFyYW1zKHBDLCBwUGFyYW1zKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9PUEVORUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIElnbm9yZSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gaWYgdGhlIG91dHB1dCBkbyBub3QgbmVlZCBpdCwgKi8KLSAgICAvKiBvciBpZiB0aGUgaW5wdXQgZmlsZSBkb2VzIG5vdCBoYXZlIGFueSBhdWRpbyBvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvKQotICAgICAgICB8fCAocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKQotICAgICAgICB8fCAocFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUikKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMpICkKLSAgICB7Ci0gICAgICAgIHBDLT5ub3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICB8fCAocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNKSApCi0gICAgewotICAgICAgICBwQy0+bm9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICYmIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIiEhISBNNE1DU19zZXRPdXRwdXRQYXJhbXMgOiBjbGlwIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGF1ZGlvLCBubyB2aWRlbyIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEw7Ci0gICAgfQotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRXcml0ZXIocENvbnRleHQsIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qIFNldCB2aWRlbyBwYXJhbWV0ZXJzICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZvcm1hdCBjb3JyZWN0bmVzcyAqLwotCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0ICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW86Ci0gICAgICAgICAgICAgICAgaWYoICggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rSDI2MykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfRk9SQklEREVOX0lOX01QNF9GSUxFOwotCi0KLSAgICAgICAgICAgICAgICAvKiBFbmNvZGVyIG5lZWRlZCBmb3IgYmVnaW4gY3V0IHRvIGdlbmVyYXRlIGFuIEktZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgVmlkZW8gZnJhbWUgc2l6ZSBjb3JyZWN0bmVzcyAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa051bGxWaWRlbyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICAvKiogU2V0IHRoZSB0YXJnZXQgdmlkZW8gbGV2ZWwsIGJlY2F1c2UgaW5wdXQgM2dwIGZpbGUgbWF5Ci0gICAgICAgICAgICAgKiAgaGF2ZSB3cm9uZyB2aWRlbyBsZXZlbCB2YWx1ZSAoc29tZSBlbmNvZGVycyBkbyBub3QgcmVzcGVjdAotICAgICAgICAgICAgICogIGxldmVsIHJlc3RyaWN0aW9ucyBsaWtlIHZpZGVvIHJlc29sdXRpb24gd2hlbiBjb250ZW50IGlzIGNyZWF0ZWQpLgotICAgICAgICAgICAgICoqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIC8vIENsaXAncyBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IG1heSBub3QgYmUKLSAgICAgICAgICAgIC8vIG11bHRpcGxlIG9mIDE2LgotICAgICAgICAgICAgLy8gRW5zdXJlIGVuY29kaW5nIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG11bHRpcGxlIG9mIDE2Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ1dpZHRoICUgMTY7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyID49IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBmb3J3YXJkCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlbWFpbmRlciA9IHBDLT5FbmNvZGluZ0hlaWdodCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ICsgKDE2LXJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUm9sbCBiYWNrd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0IC0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogU2V0IG91dHB1dCB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlID0gcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgcEMtPmVuY29kaW5nVmlkZW9MZXZlbCA9IHBQYXJhbXMtPm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9TUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FRVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1FWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9DSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1ZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9WR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogK1BSIExWNTgwNyAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX1dWR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfTlRTQ19XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9OVFNDX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcqLwotICAgICAgICAgICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfMTI4MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMDgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzk2MF83MjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qIC1DUiBHb29nbGUgKi8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB2aWRlbyBtYXggYXUgc2l6ZSBhbmQgbWF4IGNodW5jayBzaXplLgotICAgICAgICAqIFdlIGRvIGl0IGhlcmUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBmcmFtZSBzaXplIG9ubHksIGFuZAotICAgICAgICAqIGJlY2F1c2Ugd2UgbmVlZCBpdCBmb3IgdGhlIGZpbGUgc2l6ZS92aWRlbyBiaXRyYXRlIGVzdGltYXRpb25zICovCi0gICAgICAgIHBDLT51aVZpZGVvTWF4QXVTaXplID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKDEuNUYgKihNNE9TQV9GbG9hdCkodWlGcmFtZVdpZHRoICogdWlGcmFtZUhlaWdodCkgXAotICAgICAgICAgICAgKk00TUNTX1ZJREVPX01JTl9DT01QUkVTU0lPTl9SQVRJTyk7Ci0gICAgICAgIHBDLT51aVZpZGVvTWF4Q2h1bmNrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHBDLT51aVZpZGVvTWF4QXVTaXplICAgICAgIFwKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgIE00TUNTX1ZJREVPX0NIVU5LX0FVX1NJWkVfUkFUSU8pOyAvKio8IGZyb20gbWF4IEFVIHNpemUgdG8gbWF4IENodW5jayBzaXplICovCi0KLSAgICAgICAgaWYoIDAgPT0gcEMtPnVpVmlkZW9NYXhBdVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTaXplIG1heSBiZSB6ZXJvIGluIGNhc2Ugb2YgbnVsbCBlbmNvZGluZyB3aXRoIHVucmVjb2duaXplZCBzdHJlYW0gKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHZpZGVvIGZyYW1lIHNpemUgaXMgMCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgLyogT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIEZyYW1lIHJhdGUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s3XzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMl81X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazEyXzVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazE1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2syMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjVfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazMwX0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGcmFtZSByYXRlIGNoZWNrIGZvciBIMjYzIChvbmx5IGRpdmlkZXJzIG9mIDMwIGZwcyAoMjkuOTcgYWN0dWFsbHkpKSAqLwotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgYXVkaW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBBdWRpbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0gTTRFTkNPREVSX2tBbXJOb1NJRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMTAyNV9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgIC8qIHVudXNlZCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJQTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYkhpZ2hTcGVlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPmJBdWRpb01vbm8gPT0gTTRPU0FfVFJVRSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa01vbm8gOiBNNEVOQ09ERVJfa1N0ZXJlbzsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazExMDI1SHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyMDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tEZWZhdWx0X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCB8fCBwUGFyYW1zLT5uYkVmZmVjdHMgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGVuY29kZXIgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBdWRpb05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIEFNUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQW1yU0lEID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBQUMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLlJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tBYWNSZWd1bE5vbmU7IC8vTTRFTkNPREVSX2tBYWNCaXRSZXNlcnZvaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYklTID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJNUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJUTlMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIgTTRWSURFT0VESVRJTkdfa051bGwsIE1QMyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2sxNjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazI0MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2szMjAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IE91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSBpc1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21wYXRpYmxlIHdpdGggYXVkaW8gZWZmZWN0cywgcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiBFVlJDCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwgcFBhcmFtcy0+XAotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYnJlYWs7ICovCi0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IHBQYXJhbXMtPnBPdXRwdXRQQ01maWxlOwotCi0gICAgICAgIC8qIE9wZW4gb3V0cHV0IFBDTSBmaWxlICovCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHItPm9wZW5Xcml0ZSgmKHBDLT5wT3V0cHV0UENNZmlsZSksCi0gICAgICAgICAgICBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZSwgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLypTdG9yZSBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyIGludG8gdGhlIGludGVybmFsIGNvbnRleHQqLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyogQWRkIGF1ZGlvIGVmZmVjdHMqLwotICAgIC8qQ29weSBNQ1MgZWZmZWN0cyBzdHJ1Y3R1cmUgaW50byBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBpZiggcFBhcmFtcy0+bmJFZmZlY3RzID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSBwUGFyYW1zLT5uYkVmZmVjdHM7Ci0gICAgICAgIHBDLT5wRWZmZWN0cyA9IChNNE1DU19FZmZlY3RTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bmJFZmZlY3RzIFwKLSAgICAgICAgICAgICpzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIkFsbG9jYXRpb24gb2YgZWZmZWN0cyBsaXN0Iik7Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHBDLT5uYkVmZmVjdHM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgICh2b2lkICopICYocFBhcmFtcy0+cEVmZmVjdHNbal0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNE1DU19FZmZlY3RTZXR0aW5ncykpOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5wRWZmZWN0c1tqXS5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgTm9uZSIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbjoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVJbiIsIGopOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlT3V0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRmFkZU91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgJWkgaXMgRXh0ZXJuYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IG5vIGV4dGVybmFsIGVmZmVjdCBmdW5jdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHRvIGV4dGVybmFsIGVmZmVjdCBudW1iZXIgJWkiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5FeHRBdWRpb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSBub3QgcmVjb2duaXplZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9TRVQ7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgU2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCkuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChJTikgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOiBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsIDEyLjIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGNsaXAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQgZmlsZSBhdCBnaXZlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRyYXRlcwotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDogVmlkZW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gODAwIGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c6ICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldEVuY29kaW5nUGFyYW1zKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9VSW50MzIgaiA9IDA7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgIk00TUNTX3NldEVuY29kaW5nUGFyYW1zIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBSYXRlcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUmF0ZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogcFJhdGVzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljU2V0RW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFNldCBnaXZlbiB2YWx1ZXMgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gcFJhdGVzLT5FbmRDdXRUaW1lOwotICAgIHBDLT51aU1heEZpbGVTaXplID0gcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgYmVnaW4gY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpQmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBjdXQgbGFyZ2VyIHRoYW4gZHVyYXRpb24gKCVkPiVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCB0aW1lIGlzIHRvbyBsYXJnZSwgd2Ugc2V0IGl0IHRvIHRoZSBjbGlwIGR1cmF0aW9uICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+dWlFbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBlbmQgY3V0IHRpbWUgdmFsaWRpdHkgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA+IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGdyZWF0ZXIgdGhhbiBlbmQgY3V0ICglZCwlZCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBCZWdpbiBhbmQgRW5kIGN1dHMgYXJlIGVxdWFsICglZCwlZCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnVpQmVnaW5DdXRUaW1lLCBwQy0+dWlFbmRDdXRUaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogY2hlY2sgYXVkaW8gZWZmZWN0cyBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiB2YWxpZGl0eSovCi0gICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dEVuZEN1dCA9IHBDLT51aUVuZEN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEVuZEN1dCA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSA+IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEVmZmVjdHMgc3RhcnQgdGltZSBpcyBsYXJnZXIgdGhhblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uICglZCwlZCksIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lICsgcEMtPnBFZmZlY3RzW2pdLnVpRHVyYXRpb24gPiBcCi0gICAgICAgICAgICAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlLWFkanVzdCB0aGUgZWZmZWN0IGR1cmF0aW9uIHVudGlsIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBjbGlwKi8KLSAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID0gKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgLSBcCi0gICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBjb25zaXN0ZW5jeSAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZWxzZSBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYocEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTKQotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0LCBhZGQgbXAzIGVuY29kZXIqLwotICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2szMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAxKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDMyMDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgMzIwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA+PSBNNEVOQ09ERVJfazE2MDAwSHogKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNcGVnIGxheWVyIDIqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gMTYwMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rODAwMEh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMTAyNUh6Ci0gICAgICAgICAgICAgICAgICAgIHx8IHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPT0gTTRFTkNPREVSX2sxMjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyLjUqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gNjQwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpQXVkaW9CaXRyYXRlIDwgODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT51aUF1ZGlvQml0cmF0ZSA8IDE2MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRFTkNPREVSX2tTdGVyZW8pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtczogTVAzIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSBlcnJvclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSIsIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tNb25vICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazMyX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogTlVMTCBhdWRpbyA6IGNvcHkgaW5wdXQgZmlsZSBiaXRyYXRlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICE9IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxNl9LQlBTICkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgdmlkZW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA8PSAzMDAwMAotICAgICAgICAmJiBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID4gMCApCi0gICAgewotICAgICAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSBwUmF0ZXMtPk91dHB1dFZpZGVvVGltZXNjYWxlOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZpbGUgc2l6ZSAqLwotICAgIHJldHVybiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKHBDKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgR2V0IHRoZSBleHRlbmRlZCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIENvdWxkIGJlIGNhbGxlZCBhZnRlciBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKE9VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBFbmNvZGluZyBzZXR0aW5ncyB3b3VsZCBwcm9kdWNlIGEgbnVsbCBkdXJhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwID0gZW5jb2RpbmcgaXMgaW1wb3NzaWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VuY29kaW5nUGFyYW1zICpwUmF0ZXMgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX0ludDMyIG1pbmF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBtaW52aWRlb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWF4Y29tYmluZWRiaXRyYXRlOwotCi0gICAgTTRPU0FfSW50MzIgY2FsY2JpdHJhdGU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbWF4ZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGNhbGNkdXJhdGlvbjsKLQotICAgIE00T1NBX0Jvb2wgZml4ZWRfYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGZpeGVkX3ZpZGVvID0gTTRPU0FfRkFMU0U7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMocEMsIHBSYXRlcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShwQy0+dWlWaWRlb0JpdHJhdGUsIDApOwotICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpQXVkaW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSBwQy0+dWlFbmRDdXRUaW1lOwotICAgIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19nZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKCk6IFdyb25nIFN0YXRlICglZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgewotICAgICAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgfQotICAgICAgICAvL0VWUkMKLSAgICAgICAgLy8gICAgICAgIGlmKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tFVlJDKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgLy8gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgLy8gICAgICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICBlbHNlIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsgLypEZWZhdWx0IG1pbiBhdWRpbyBiaXRyYXRlIGZvciBNUEVHIGxheWVyIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYm90aCBtb25vIGFuZCBzdGVyZW8gY2hhbm5lbHMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2sxNl9LQlBTIDogTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBhdWRpbyBiaXRyYXRlIGlzIGluIHRoZSBjb3JyZWN0IHJhbmdlICovCi0gICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDApCi0gICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSAwOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfdmlkZW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICBtaW52aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazE2X0tCUFM7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdmlkZW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlWaWRlb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotICAgICAgICB9Ci0gICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICB9Ci0gICAgICAgIC8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgIH0KLQotICAgIC8qIENoZWNrIGN1dCB0aW1lcyBhcmUgaW4gY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCAoIHBSYXRlcy0+QmVnaW5DdXRUaW1lID49IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uKQotICAgICAgICB8fCAoKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwUmF0ZXMtPkVuZEN1dFRpbWUpCi0gICAgICAgICYmIChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUmF0ZXMtPkVuZEN1dFRpbWUgPSAwOwotICAgIH0KLQotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIGNhbGNkdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgZWxzZQotICAgICAgICBjYWxjZHVyYXRpb24gPSBwUmF0ZXMtPkVuZEN1dFRpbWUgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLQotICAgIC8qIHByaW9yaXR5IDEgOiBtYXggZmlsZSBzaXplICovCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0RmlsZVNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKiB3ZSBjYW4gcHV0IG1heGltdW0gdmFsdWVzIGZvciBhbGwgdW5kZWZpbmVkIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICYmIChmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0gICAgICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgICAgICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcHJpb3JpdHkgMiA6IGN1dCB0aW1lcyAqLwotICAgICAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IDApIHx8IChwUmF0ZXMtPkVuZEN1dFRpbWUgPiAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTyAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgLyogYXVkaW8gYW5kIHZpZGVvIGJpdHJhdGVzICovCi0gICAgICAgICAgICBpZiggKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlIC8gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPj0gbWluYXVkaW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1pbnZpZGVvYml0cmF0ZSA+IG1heGNvbWJpbmVkYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s4X01CUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+PSBtaW52aWRlb2JpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW5hdWRpb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOTZfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPiBjYWxjYml0cmF0ZSkpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogcHJpb3JpdHkgMyA6IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSAhPSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIG1pbiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBzZWFyY2ggbWF4IHBvc3NpYmxlIHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8IE00VklERU9FRElUSU5HX2s4X01CUFMpICkgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsICsxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8PSBtYXhjb21iaW5lZGJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gY2FsY2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgNCA6IHZpZGVvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOTZfS0JQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKG1pbnZpZGVvYml0cmF0ZSArIG1pbmF1ZGlvYml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IGF1ZGlvID0gMS8zIGFuZCB2aWRlbyA9IDIvMyAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIDMsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFM7IC8qKyBOZXcgRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlY29tcHV0ZSBtYXggZHVyYXRpb24gd2l0aCBmaW5hbCBiaXRyYXRlcyAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAgICAgKiA4MDAwLjApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIGlmKCBtYXhkdXJhdGlvbgotICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKyBtYXhkdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4gOiBjb25zdHJhaW50cyBhcmUgdG9vIHN0cm9uZyAqLwotICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gcFJhdGVzLT5CZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgfQotCi0gICAgLyogZXN0aW1hdGVkIHJlc3VsdGluZyBmaWxlIHNpemUgKi8KLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpCi0gICAgICAgICogKCggcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWUpIC8gODAwMC4wKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgQ2hlY2sgcGFyYW1ldGVycyB0byBzdGFydAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGlucHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBsb3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyBWZXJpZnlSYXRlczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNDaGVja1BhcmFtc0FuZFN0YXJ0KHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9TRVQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBBdWRpbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCAhPSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCkKLSAgICAgICAgJiYgKHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiB1bmRlZmluZWQgYXVkaW8gYml0cmF0ZSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgIH0KLQotICAgIC8qIFZpZGVvIGJpdHJhdGUgc2hvdWxkIG5vdCBzdGF5IHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+dWlWaWRlb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIHZpZGVvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZW5kIGN1dCB0aW1lIGlmIG5lY2Vzc2FyeSAobm90IGFuIGVycm9yKSAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qIEZvcmNlIGEgcmUtc2V0IHRvIGNoZWNrIHZhbGlkaXR5IG9mIHBhcmFtZXRlcnMgKi8KLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0QXVkaW9CaXRyYXRlID0gcEMtPnVpQXVkaW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLkJlZ2luQ3V0VGltZSA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgZXJyID0gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMocENvbnRleHQsICZWZXJpZnlSYXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHBhcmFtZXRlcnMgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBpbnZhbGlkIHBhcmFtZXRlciBmb3VuZCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQWxsIGlzIE9LIDogdXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IHBDLT51aVZpZGVvQml0cmF0ZTsKLSAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLQotI2lmZGVmIE00TUNTX1dJVEhfRkFTVF9PUEVOCi0gICAgLyoqCi0gICAgKiBSZW1ha2UgdGhlIG9wZW4gaWYgaXQgd2FzIGRvbmUgaW4gZmFzdCBtb2RlICovCi0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlICkKLSAgICB7Ci0gICAgICAgIC8qIENsb3NlIHRoZSBmaWxlIG9wZW5lZCBpbiBmYXN0IG1vZGUgKi8KLSAgICAgICAgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMocEMpOwotCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotCi0gICAgICAgIC8qIFJlb3BlbiBpdCBpbiBub3JtYWwgbW9kZSAqLwotICAgICAgICBlcnIgPSBNNE1DU19vcGVuKHBDb250ZXh0LCBwQy0+cElucHV0RmlsZSwgcEMtPklucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICBwQy0+cE91dHB1dEZpbGUsIHBDLT5wVGVtcG9yYXJ5RmlsZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQgOiBNNE1DU19PcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9SRUFEWTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICplbmNIZWFkZXI7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGRlY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT51aUJlZ2luQ3V0VGltZSAhPSAwKQotICAgICAgICAmJiAocEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5tX3BJbnN0YW5jZSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFN0ZXRTZXQgOnBGY3RTZXRPcHRpb24gZmFpbGVkICAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0ciwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhbmRsZSBEU0kgZmlyc3QgYml0cwotI2RlZmluZSBTUFNfU1RBUlRfUE9TIDYKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyAxXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclNQUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopKGVuY0hlYWRlci0+cEJ1ZikgKyBTUFNfU1RBUlRfUE9TICsgMjsKLQotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplID0KLSAgICAgICAgICAgICAgICAoIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMwotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXSA8PCA4KQotICAgICAgICAgICAgICAgICsgZW5jSGVhZGVyLT5wQnVmW1NQU19TVEFSVF9QT1MgKyA0Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemVdOwotICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BFbmNvZGVyUFBTID0gKE00T1NBX1VJbnQ4ICopZW5jSGVhZGVyLT5wQnVmICsgU1BTX1NUQVJUX1BPUyArIDUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZTsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIERTSSBpbnRlZ3JpdHkgKi8KLSAgICAgICAgICAgIGlmKCBlbmNIZWFkZXItPlNpemUgIT0gKHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZQotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplICsgNSArIFNQU19TVEFSVF9QT1MpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRTdGVwU2V0IEVSUk9SIDogaW52YWxpZCBTUFMgLyBQUFMgJWQgJWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBlbmNIZWFkZXItPlNpemUsIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIGF1ZGlvIHByb2Nlc3NpbmcgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVXcml0ZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBTZXQoKTogTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBKdW1wIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIGJlZ2luIGN1dCB0aW1lIChhbGwgQVVzIGFyZSBSQVApCi0gICAgKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIDNncHAgd3JpdGVyIGluaXQsIGJlY2F1c2UgaXQgbWF5IHdyaXRlIHRoZSBmaXJzdAotICAgICogYXVkaW8gQVUgaW4gc29tZSBjYXNlcyAqLwotICAgIGVyciA9IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYoIDAgPT0gcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IDAuMDsKLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gYmVnaW4gY3V0LCBkbyB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJlbWVtYmVyIHRoYXQgd2UgbXVzdCBzdGFydCB0aGUgZGVjb2RlL2VuY29kZSBwcm9jZXNzIGF0IHRoZSBiZWdpbiBjdXQgdGltZSAqLwotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAoTTRPU0FfRG91YmxlKXBDLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBKdW1waW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPSlVNUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBTZXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVm9pZCAqZGVjb2RlclVzZXJEYXRhOwotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgRmlsdGVyT3B0aW9uOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgZGVjb2RlciwgaWYgaXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0ICh0byBnZXQgdmlkZW8gcHJvcGVydGllcyBmb3IgZXhhbXBsZSkgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgZGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyA/ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKCZwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICZwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywgcEMtPm1fcFJlYWRlciwKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQsICZwQy0+UmVhZGVyVmlkZW9BVSwgZGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggKE00T1NBX1VJbnQzMikoTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCkgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE91ciBkZWNvZGVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggSDI2MyBwcm9maWxlIG90aGVyIHRoYW4gMC4KLSAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAqIFdlIHRyYW5zbGF0ZSBpdCB0byBvdXIgb3duIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyRnVuY3Rpb24gPQotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZGaWx0ZXJPcHRpb24pOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB2aWRlbyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zIEVuY1BhcmFtczsgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNEVOQ09ERVJfUGFyYW1zIEVuY1BhcmFtczE7Ci0gICAgTTRPU0FfRG91YmxlIGRGcmFtZVJhdGU7ICAgICAgICAgICAgLyoqPCB0bXAgdmFyaWFibGUgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICAvKiBBcHByb3hpbWF0aXZlIGN0cyBpbmNyZW1lbnQgKi8KLSAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTnVsbCBlbmNvZGluZywgSS1mcmFtZSBkZWZhdWx0cy4iKTsKLQotICAgICAgICAgICAgLyogU2V0IHVzZWZ1bCBwYXJhbWV0ZXJzIHRvIGVuY29kZSB0aGUgZmlyc3QgSS1mcmFtZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSA9IHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmb3JtYXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCksIHJldHVybmluZyBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIGRvIG5vdCBjb25zdHJhaW4gdGhlIEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLQotICAgICAgICAgICAgLyogT3RoZXIgZW5jb2Rpbmcgc2V0dGluZ3MgKHF1aXRlIGFsbCBkdW1teS4uLikgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiA9IE00T1NBX1RSVUU7ICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDU7ICAgLyogaW5pdGlhbCBRUCA9IDUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLSAgICAgICAgICAgIC8qIFJhdGUgZmFjdG9yICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBOb3JtYWwgZW5jb2RpbmcsIHNldCBmdWxsIGNvbmZpZy4iKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNQ1Mgc2V0dGluZ3MgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0OwotICAgICAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtcy52aWRlb0xldmVsPSBwQy0+ZW5jb2RpbmdWaWRlb0xldmVsOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGJpdHJhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjb21wdXRlZCAqLwotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgdXNlIHRoZSAidHJ1ZSIgY29yZSBpbnRlcm5hbCBiaXRyYXRlIHJlZ3VsYXRpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKi8KLQotICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlWZXJ0aWNhbFNlYXJjaFJhbmdlID0gMDsgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX0ZBTFNFOyAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyA9Ci0gICAgICAgICAgICAwOyAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOyAgLyogaW5pdGlhbCBRUCA9IDEwICovCi0gICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgICAgICBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFZpZGVvIGVuY29kZXIgZnJhbWUgcmF0ZSBhbmQgcmF0ZSBmYWN0b3IgKi8KLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlOwotICAgICAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rN181X0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gNy41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDE1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syMF9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI1X0ZQUzogLyoqPCBNUEVHLTQgb25seSAqLwotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAyNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogdW5rbm93biBlbmNvZGluZyB2aWRlbyBmcmFtZSByYXRlXAotICAgICAgICAgICAgICAgICAgICAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHR3byBmcmFtZXMgKi8KLSAgICAgICAgaWYoIE00RU5DT0RFUl9rSDI2MyA9PSBFbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAxLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyoqPCBNUEVHNCBvciBILjI2NCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZEN0c0luY3JlbWVudCA9IDEwMDAuMCAvIGRGcmFtZVJhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaW1pdCB0aGUgdmlkZW8gYml0cmF0ZSBhY2NvcmRpbmcgdG8gZW5jb2RlciBwcm9maWxlCi0gICAgICogYW5kIGxldmVsICovCi0gICAgZXJyID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWwoJkVuY1BhcmFtcyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IGxpbWl0IGJpdHJhdGUgcmV0dXJuZWQgZXJyIFwKLSAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB2aWRlbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcEMtPnBWaUVuY0N0eHQsCi0gICAgICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMsIFwKLSAgICAgICAgTTRNQ1NfaW50QXBwbHlWUFAsIHBDLCBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwgXAotICAgICAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAvKio8IFdlIHB1dCB0aGUgTUNTIGNvbnRleHQgaW4gcGxhY2Ugb2YgdGhlIFZQUCBjb250ZXh0ICovCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAvL2lmKChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgIC8vICAgICYmIChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpKQotICAgIHsKLSAgICAgICAgRW5jUGFyYW1zMS5JbnB1dEZvcm1hdCA9IEVuY1BhcmFtcy5JbnB1dEZvcm1hdDsKLSAgICAgICAgLy9FbmNQYXJhbXMxLklucHV0RnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lV2lkdGg7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLklucHV0RnJhbWVIZWlnaHQ7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVXaWR0aCA9IEVuY1BhcmFtcy5GcmFtZVdpZHRoOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lSGVpZ2h0ID0gRW5jUGFyYW1zLkZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZT0gRW5jUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb0xldmVsPSBFbmNQYXJhbXMudmlkZW9MZXZlbDsKLSAgICAgICAgRW5jUGFyYW1zMS5CaXRyYXRlID0gRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRnJhbWVSYXRlID0gRW5jUGFyYW1zLkZyYW1lUmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zMS5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7IC8vRW5jUGFyYW1zLkZvcm1hdDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIm1jcyBlbmNvZGVyIG9wZW4gcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtczEudmlkZW9Qcm9maWxlLCBFbmNQYXJhbXMxLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIEFkdiBwcm9maWxlIDolZCwgbGV2ZWwgJWQiLAotICAgICAgICAgICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zLnZpZGVvTGV2ZWwpOwotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICB9Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0KHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcjogRW5jb2RlckludC0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJSdW5uaW5nOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBWaWRlbyByZXNpemUgbWFuYWdlbWVudCAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqCi0gICAgKiBDb21wYXJlIHZpZGVvIGlucHV0IHNpemUgYW5kIHZpZGVvIG91dHB1dCBzaXplIHRvIGNoZWNrIGlmIHJlc2l6ZSBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCAoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZVdpZHRoCi0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCkKLSAgICAgICAgfHwgKChNNE9TQV9VSW50MzIpRW5jUGFyYW1zLkZyYW1lSGVpZ2h0Ci0gICAgICAgICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgdmlkZW8gcGxhbmUgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlCi0gICAgICAgICByZXNpemluZyAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lID0KLSAgICAgICAgICAgIChNNFZJRklfSW1hZ2VQbGFuZSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoID0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICBtX3ZpZGVvV2lkdGg7IC8qKjwgaW5wdXQgd2lkdGggKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb0hlaWdodDsgLyoqPCBpbnB1dCBoZWlnaHQgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9IHBDLT4KLSAgICAgICAgICAgIHBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOyAvKio8IHNpbXBsZSBjYXNlOiBzdHJpZGUgZXF1YWxzIHdpZHRoICovCi0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgXAotICAgICAgICAgICAgKnBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFUgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgKLSAgICAgICAgICAgID4+IDE7IC8qKjwgVSB3aWR0aCBpcyBoYWxmIHRoZSBZIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0Ci0gICAgICAgICAgICA+PiAxOyAvKio8IFUgaGVpZ2h0IGlzIGhhbGYgdGhlIFkgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgdGhlIFYgcGxhbmUgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsgLyoqPCBWIHdpZHRoIGVxdWFscyBVIHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7IC8qKjwgViBoZWlnaHQgZXF1YWxzIFUgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgQUFDIGRlY29kZXIsIHRoZSBTUkMgYW5kIHRoZSBBTVItTkIgZW5jb2RlciBhbmQgdGhlIE1QMyBlbmNvZGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBTU1JDX1JldHVyblN0YXR1c19lbgotICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2IE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIDA7IC8qIE1pbmltYWwgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIG9uIHRoZSBvdXRwdXQgKi8KLSAgICBMVk1fSU5UMzIgU2NyYXRjaFNpemU7IC8qIFRoZSBzaXplIG9mIHRoZSBzY3JhdGNoIG1lbW9yeSAgICAgICAgICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgTFZNX0lOVDE2Ci0gICAgICAgICpwT3V0cHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAqLwotICAgIFNTUkNfUGFyYW1zX3Qgc3NyY1BhcmFtczsgICAgICAgICAgLyogTWVtb3J5IGZvciBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZmlsZV9hdV9yZWFkZXIgPSBmb3BlbigibWNzX1JlYWRlck91dHB1dC5yYXciLCAid2IiKTsKLSAgICBmaWxlX3BjbV9kZWNvZGVyID0gZm9wZW4oIm1jc19EZWNvZGVyT3V0cHV0LnBjbSIsICJ3YiIpOwotICAgIGZpbGVfcGNtX2VuY29kZXIgPSBmb3BlbigibWNzX0VuY29kZXJJbnB1dC5wY20iLCAid2IiKTsKLQotI2VuZGlmCi0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogTnVsbCBlbmNvZGluZywgZG8gbm90aGluZy4iKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBDcmVhdGUgYW5kICJzdGFydCIgdGhlIGRlY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5tX3BBdWRpb0RlY29kZXIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZygpOiBGYWlscyB0byBpbml0aWF0ZSB0aGUgYXVkaW8gZGVjb2Rlci4iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBBTVIgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIEVWUkMgREVDT0RFUiBDT05GSUdVUkFUSU9OICovCi0KLSAgICAgICAgLyogbm90aGluZyBzcGVjaWZpYyB0byBkbyAqLwotICAgIH0KLSAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rTVAzID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQUFDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotICAgICAgICBNNF9BYWNEZWNvZGVyQ29uZmlnIEFhY0RlY1BhcmFtOwotCi0gICAgICAgIEFhY0RlY1BhcmFtLm1fQUFDRGVjb2RlclByb2ZpbGUgPSBBQUNfa0FBQzsKLSAgICAgICAgQWFjRGVjUGFyYW0ubV9Eb3duU2FtcGxpbmdNb2RlID0gQUFDX2tEU19PRkY7Ci0KLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvciB0aGlzIHZlcnNpb24sIHdlIGVuY29kZSBvbmx5IGluIEFBQyAqLwotICAgICAgICAgICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWFjRGVjUGFyYW0ubV9PdXRwdXRNb2RlID0gQUFDX2tNb25vOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rU3RlcmVvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0sIChNNE9TQV9EYXRhT3B0aW9uKSAmQWFjRGVjUGFyYW0pOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLyogTm90IGltcGxlbWVudGVkIGluIGFsbCBkZWNvZGVycyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID4gMCApCi0gICAgewotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemU7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSBcCi0gICAgICAgICAgICAqc2l6ZW9mKHNob3J0KSwgTTRNQ1MsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgU2V0IHRoZSBTU1JDIHBhcmFtZXRlcnMgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjQwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IGludmFsaWQgaW5wdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSAoJWQgSHopLFwKLSAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1kiLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgfQotCi0gICAgaWYoIDEgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyA9IExWTV9TVEVSRU87Ci0gICAgfQotCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FBQwotICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rTVAzICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTEwMjVIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTYwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjIwNTBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjQwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzIwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDQxMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNDgwMDBIejoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogaW52YWxpZCBvdXRwdXQgQUFDIHNhbXBsaW5nIGZyZXF1ZW5jeSBcCi0gICAgICAgICAgICAgICAgICAgICglZCBIeiksIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgIH0KLQotCi0KLSAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMTAyNToKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxMjgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgKQotICAgIHsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDQ0MTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDg4MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfNDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDE5MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgUmV0dXJuU3RhdHVzID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLQotCi0gICAgaWYoIFJldHVyblN0YXR1cyAhPSBTU1JDX09LICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6XAotICAgICAgICAgICAgIEVycm9yIGNvZGUgJWQgcmV0dXJuZWQgYnkgdGhlIFNTUkNfR2V0TnJTYW1wbGVzIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgTnJTYW1wbGVzTWluID0KLSAgICAgICAgKExWTV9JTlQxNikoKHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPiBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCkKLSAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgd2hpbGUoIE5yU2FtcGxlc01pbiA8IE00TUNTX1NTUkNfTUlOQkxPQ0tTSVpFICkKLSAgICB7IC8qIERvbid0IHRha2UgYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0gICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IChMVk1fSU5UMTYpKHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0IDw8IDEpOwotICAgICAgICBOclNhbXBsZXNNaW4gPSAoTFZNX0lOVDE2KShOclNhbXBsZXNNaW4gPDwgMSk7Ci0gICAgfQotCi0KLSAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgc3NyY1BhcmFtcy4KLSAgICAgICAgTnJTYW1wbGVzSW4pOyAvKiBtdWx0aXBsaWNhdGlvbiBieSBOck9mQ2hhbm5lbHMgaXMgZG9uZSBiZWxvdyAqLwotICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIGlucHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcigpOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBTU1JDICovCi0gICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSBcCi0gICAgICAgICpwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMsIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVyT3V0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyID0gTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZSgKLSAgICAgICAgMTYsIC8qZ0lucHV0UGFyYW1zLmx2QlRDaGFubmVsQ291bnQqLwotICAgICAgICAoTTRPU0FfSW50MTYpcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzLypzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzKi8sCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSkvKnNzcmNQYXJhbXMuU1NSQ19Gc19PdXQqLywgMSk7Ci0KLSAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLQotICAgIExWQXVkaW9zZXRTYW1wbGVSYXRlKHBDLT5wTFZBdWRpb1Jlc2FtcGxlciwKLSAgICAgICAgLypnSW5wdXRQYXJhbXMubHZJblNhbXBsZVJhdGUqLwotICAgICAgICAvKnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ki8KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeS8qc3NyY1BhcmFtcy5TU1JDX0ZzX0luKi8pOwotCi0gICAgTFZBdWRpb3NldFZvbHVtZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsIChNNE9TQV9JbnQxNikoMHgxMDAwIC8qIDB4N2ZmZiAqLyksCi0gICAgICAgIChNNE9TQV9JbnQxNikoMHgxMDAwLyoweDdmZmYqLykpOwotCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgSW5pdCB0aGUgYXVkaW8gZW5jb2RlciB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIEluaXRpYWxpc2UgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIE9wZW4gdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAmcEMtPkF1ZGlvRW5jUGFyYW1zLCAmcEMtPnBBdWRpb0VuY0RTSSwKLSAgICAgICAgTTRPU0FfTlVMTCAvKiBubyBncmFiYmluZyAqLyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZzogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBpbnB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQUFDX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBkZWZhdWx0OgotICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYoIE00RU5DT0RFUl9rTW9ubyA9PSBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSApCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpOwotICAgIGVsc2UKLSAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ICo9IHNpemVvZihzaG9ydCkgKiAyOwotCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyIik7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlcihNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSB3cml0ZXIuCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgKElOKSBNQ1MgcHJpdmF0ZSBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZVdyaXRlciggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlWZXJzaW9uOyAvKio8IFRvIHdyaXRlIGNvbXBvbmVudCB2ZXJzaW9uIGluIDNncCB3cml0ZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwRFNJID0gTTRPU0FfTlVMTDsgLyoqPCBUbyBjcmVhdGUgdGhlIERlY29kZXIgU3BlY2lmaWMgSW5mbyAqLwotICAgIE00U1lTX1N0cmVhbUlEVmFsdWUgb3B0aW9uVmFsdWU7IC8qKjwgRm9yIHRoZSBzZXRvcHRpb24gY2FsbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgVGFyZ2V0ZWRGaWxlU2l6ZTsKLSAgICBNNE9TQV9Cb29sIGJNVUxQUFNTUFMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbigmcEMtPnBXcml0ZXJDb250ZXh0LCBwQy0+cE91dHB1dEZpbGUsCi0gICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBDLT5wVGVtcG9yYXJ5RmlsZSwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0byB0aGUgd3JpdGVyIGNvbnRleHQgaW4gdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IHBDLT5wV3JpdGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IGRlc2NyaXB0aW9uIHN0cmluZyBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogTUNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBwcm9kdWN0IHZlcnNpb24gaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIHVpVmVyc2lvbiA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUFKT1IgKiAxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SICogMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24sIChNNE9TQV9EYXRhT3B0aW9uKSAmdWlWZXJzaW9uKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGVyZSBpcyBhIHZpZGVvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgdmlkZW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBwcm9wZXJ0aWVzIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5oZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5mcHMgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFdpbGwgYmUgdXBkYXRlZCBsYXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gMDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IGNhc2UgaW5wdXQ9TTRFTkNPREVSX2tOVUxMLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIHZhbHVlIHdpbGwgYmUgdGhlIHJlYWwgdmFsdWUgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gKE00T1NBX0ludDMyKXBDLT51aUVuY1ZpZGVvQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBtb3N0IG90aGVyIHBhcmFtZXRlcnMgYXJlICJkdW1teSIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnRpbWVTY2FsZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBFbmNvZGVyIEhlYWRlciBwcm9wZXJ0aWVzIGZvciBWaWRlbyBzdHJlYW0gaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgSDI2MyBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIDc7IC8qKjwgSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgICAgICBwRFNJID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyg3LCBNNE1DUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmIChEU0kgSDI2MykiKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcERTSSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBEU0kgKEgyNjMpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBWZW5kb3IgaXMgTlhQIFNvZnR3YXJlOiBOLCBYLCBQLCBTLiAqLwotICAgICAgICAgICAgcERTSVswXSA9ICdOJzsKLSAgICAgICAgICAgIHBEU0lbMV0gPSAnWCc7Ci0gICAgICAgICAgICBwRFNJWzJdID0gJ1AnOwotICAgICAgICAgICAgcERTSVszXSA9ICdTJzsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZXIgdmVyc2lvbiBpcyAwICovCi0gICAgICAgICAgICBwRFNJWzRdID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExldmVsIGlzIHRoZSBzaXh0aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1dpZHRoICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9TUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9RQ0lGX1dpZHRoOgotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2s2NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX0NJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMTI4X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2sxNV9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDIwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rMzg0X0tCUFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDMwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSBNNEVOQ09ERVJfazgwMF9LQlBTLyoyMDQ4Ki8pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPD0gTTRFTkNPREVSX2szMF9GUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERTSVs1XSA9IDQwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIG9mIHRoZSBEU0kuICovCi0gICAgICAgICAgICBwRFNJWzZdID0gMDsKLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9IHBEU0k7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLQotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLQotICAgICAgICB9Ci0gICAgICAgIC8qIG90aGVyd2lzZSAoTVBFRzQpLCB0aGUgRFNJIHdpbGwgYmUgcmVjb3ZlcmVkIGZyb20gdGhlIGVuY29kZXIgbGF0ZXIgb24uICovCi0KLSAgICAgICAgLyorQ1JMVjY3NzUgLSBILjI2NCBUcmltbWluZyAgKi8KLSAgICAgICAgaWYoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJNVUxQUFNTUFMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNVUxfUFBTX1NQUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmJNVUxQUFNTUFMpOwotCi0gICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOlwKLSAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNVUxfUFBTX1NQUykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qLUNSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBBVSBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heEF1U2l6ZTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgdmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIGNodW5rIHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBwQy0+dWlWaWRlb01heENodW5ja1NpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zIHN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJCaXRzUGVyU2FtcGxlID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBzdHJlYW1BdWRpb0luZm8ubmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgQXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVAzOgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0F1ZGlvTlVMTDoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1BDTToKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOdWxsQXVkaW86Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBcCi0gICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBNQ1MgcHJvZHVjZXMgb25seSBBTVItTkIgb3V0cHV0ICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGUgPSBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5OwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNEU0kucEluZm8gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgZ2l2ZW4gYnkgdGhlIGVuY29kZXIgb3BlbigpICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcEMtPnBBdWRpb0VuY0RTSS5pbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgUGhpbGlwcyBEU0kgKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSAwOwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSB0byB0aGUgd3JpdGVyICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAmcEMtPldyaXRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zdHJlYW0gPSAmKHBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyA9IDA7IC8qKiBSZXNldCB0aW1lICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmF0dHJpYnV0ZSA9IDA7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBhdWRpbyBtYXggQVUgc2l6ZSAqLwotICAgICAgICAvKiBBcyBtYXggYml0cmF0ZSBpcyBub3cgMzIwa2JwcyBpbnN0ZWFkIG9mIDEyOGticHMsIG1heCBBVQotICAgICAgICAgKiBzaXplIGhhcyB0byBiZSBpbmNyZWFzZWQgYWRhcHQgdGhlIG1heCBBVSBzaXplIGFjY29yZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZQotICAgICAgICAgKiBjaGFubmVscyBudW1iZXJzKi8KLSAgICAgICAgLyogQWZ0ZXIgdGVzdHMsIGEgbWFyZ2luIG9mIDMgaXMgdGFrZW4gKDIgd2FzIG5vdCBlbm91Z2ggYW5kIHJhaXNlcyB0byBtZW1vcnkgb3ZlcndyaXRlKQotICAgICAgICAgKi8KLSAgICAgICAgLy9wQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICBzd2l0Y2goIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FNUl9HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rTVAzOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX01QM19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTCi0gICAgICAgICAgICAgICAgICAgICogKCggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHNob3J0KSkgKyAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvKmNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19QQ01fRVZSQ19HUkFOVUxBUklUWV9TQU1QTEVTKgotICAgICAgICAgICAgICAgICgocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzICogc2l6ZW9mKHNob3J0KSkrMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ki8KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qKjwgSXQgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYWxyZWFkeSB0ZXN0ZWQgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00TUNTX0FVRElPX01BWF9DSFVOS19TSVpFOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBTZXQgdGhlIGxpbWl0YXRpb24gc2l6ZSBvZiB0aGUgd3JpdGVyICovCi0gICAgVGFyZ2V0ZWRGaWxlU2l6ZSA9IHBDLT51aU1heEZpbGVTaXplOwotICAgIC8qIGFkZCAxIGtCIG1hcmdpbiAqLwotICAgIGlmKCBUYXJnZXRlZEZpbGVTaXplID4gODE5MiApCi0gICAgICAgIFRhcmdldGVkRmlsZVNpemUgLT0gMTAyNDsKLQotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEZpbGVTaXplLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJlRhcmdldGVkRmlsZVNpemUpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkKLSAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvblwKLSAgICAgICAgICAgIChNNFdSSVRFUl9rTWF4RmlsZVNpemUpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIHRoZSBzdHJlYW0gcmVnaXN0ZXJpbmcgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gd3JpdGUgZGF0YSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyhwQy0+cFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnRXcml0aW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgICBETyB0aGUgYXVkaW8gYmVnaW4gY3V0LgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVTaXplOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIGFuIGF1ZGlvIGJlZ2luIGN1dCBpcyBuZWVkZWQgKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pIHx8ICgwID09IHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGEpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICBpQ3RzID0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dDogbV9wRmN0SnVtcChBdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmVtZW1iZXIgYXVkaW8gYmVnaW4gY3V0IG9mZnNldCAqLwotICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotCi0gICAgLyoqCi0gICAgKiBBTVItTkIgJiBFVlJDOiB0aGVyZSBtYXkgYmUgbWFueSBmcmFtZXMgcGVyIEFVLgotICAgICogSW4gdGhhdCBjYXNlIHdlIG5lZWQgdG8gc2xpY2UgdGhlIGZpcnN0IEFVIHRvIGtlZXAgdGhlIDIwIG1zIGN1dCBwcmVjaXNpb24gKi8KLSAgICBpZiggKCBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlIG5leHQgZnJhbWUgQ1RTIGlzIGxvd2VyIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLAotICAgICAgICAqIHdlIG11c3QgcmVhZCB0aGUgQVUgYW5kIHBhcnNlIGl0cyBmcmFtZXMgdG8gcmVhY2ggdGhlCi0gICAgICAgICogbmVhcmVzdCB0byB0aGUgYmVnaW4gY3V0ICovCi0gICAgICAgIGlmKCAoIGlDdHMgKyAyMCkgPCAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFJlYWQgdGhlIGZpcnN0IGF1ZGlvIEFVIGFmdGVyIHRoZSBqdW1wICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV2hpbGUgdGhlIG5leHQgQVUgaGFzIGEgbG93ZXIgQ1RTIHRoYW4gdGhlIGJlZ2luIGN1dCB0aW1lLCB3ZSBhZHZhbmNlIHRvCi0gICAgICAgICAgICB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgd2hpbGUoICggaUN0cyArIDIwKSA8PSAoTTRPU0FfSW50MzIpcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHVpRnJhbWVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcnJ1cHRlZCBmcmFtZSEgV2UgZ2V0IG91dCBvZiB0aGlzIG1lc3MhCi0gICAgICAgICAgICAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldEZyYW1lU2l6ZV94eHggcmV0dXJucyAwISBSZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00Tk9fRVJST1I7IC8qKjwgbm8gZmF0YWwgZXJyb3IgaGVyZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcHVyc3VlICovCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgKz0gdWlGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplIC09IHVpRnJhbWVTaXplOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIENUUyBvZiB0aGUgbmV4dCBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGlDdHMgKz0gMjA7IC8qKjwgQU1SLCBFVlJDIGZyYW1lIGR1cmF0aW9uIGlzIGFsd2F5cyAyMCBtcyAqLwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID0gaUN0czsKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0RUUyA9IGlDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICAgICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgPSBpQ3RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQywgTTRPU0FfVUludDgqIHBQcm9ncmVzcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvU3RlcENvdW50ID0gMDsKLQotICAgIC8qIC0tLS0tLS0tLS0gVklERU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+VmlkZW9TdGF0ZSkgKSAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiAqLwotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKHBDKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcocEMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTm8gbW9yZSBzcGFjZSwgcXVpdCBwcm9wZXJseSAqLwotICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5kVmlEZWNDdXJyZW50Q3RzCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotCi0gICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgIC8qIGNsZWFuIEFJUiBjb250ZXh0IG5lZWRlZCB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX05PTU9SRV9TUEFDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgaW1hZ2Ugd2lsbCBiZSBvYnRhaW5lZCBieSB0aGUKLSAgICAgICAgVlBQIGZpbHRlciBmcm9tIHRoZSBjb250ZXh0ICovCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiB2aWRlbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gQVVESU8gVFJBTlNDT0RJTkcgLS0tLS0tLS0tLSAqLwotCi0gICAgaWYoICggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UpICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRAotICAgICAgICA9PSBwQy0+QXVkaW9TdGF0ZSkgKSAvKio8IElmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgd2hpbGUoCi0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBydW5uaW5nLCBlbmNvZGUgYXVkaW8gdW50aWwgd2UgcmVhY2ggdmlkZW8gdGltZSAqLwotICAgICAgICAgICAgKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgJiYgKE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5WaWRlb1N0YXRlKQotICAgICAgICAgICAgJiYgKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICArIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA8IHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTKSkgfHwKLSAgICAgICAgICAgIC8qKjwgSWYgdGhlIHZpZGVvIGVuY29kaW5nIGlzIG5vdCBydW5uaW5nLCBwZXJmb3JtIDEgc3RlcCBvZiBhdWRpbyBlbmNvZGluZyAqLwotICAgICAgICAgICAgKCggTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPkF1ZGlvU3RhdGUpCi0gICAgICAgICAgICAmJiAodWlBdWRpb1N0ZXBDb3VudCA8IDEpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQXVkaW9TdGVwQ291bnQrKzsKLQotICAgICAgICAgICAgLyoqPCBjaGVjayBpZiBhbiBhZGlvIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCovCi0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQXVkaW9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qKjwgQXVkaW8gdHJhbnNjb2RpbmcgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgICAgIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLQotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgIC8qIGJhZCBmaWxlIHByb2R1Y2VkIG9uIHZlcnkgc2hvcnQgM2dwIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBOb3RoaW5nIGhhcyBiZWVuIGVuY29kZWQgLT4gYmFkIHByb2R1Y2VkIGZpbGUgLT4gZXJyb3IgcmV0dXJuZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9OT01PUkVfU1BBQ0UiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IGF1ZGlvIHRyYW5zY29kaW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIGZvciBlbmQgY3V0ICovCi0gICAgICAgICAgICAvKiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgYXVkaW8gZHVyYXRpb24gYXMgdmlkZW8gLT4KLSAgICAgICAgICAgICgyKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgKyAoMiAqcEMtPm1fYXVkaW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLSBQUk9HUkVTUyBNQU5BR0VNRU5UIC0tLS0tLS0tLS0gKi8KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpKCggKCAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgIC8gKHBDLT51aUVuZEN1dFRpbWUgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKTsKLSAgICAgICAgfQotICAgICAgICAvL3ByaW50ZigiOiAlNi4wZlxiXGJcYlxiXGJcYlxiXGIiLCBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyk7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoICpwUHJvZ3Jlc3MgPiA5OSApCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gOTk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgQ1RTIGZvciBuZXh0IHN0ZXAgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSBwQy0+ZEN0c0luY3JlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogVGhlIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkIHdoZW4gbm8gc3RyZWFtIGlzIGJlaW5nIGVuY29kZWQgYW55bW9yZSAqLwotICAgIGlmKCAoICggcEMtPm5vdmlkZW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPlZpZGVvU3RhdGUpKQotICAgICAgICAmJiAoKCBwQy0+bm9hdWRpbykgfHwgKE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRCA9PSBwQy0+QXVkaW9TdGF0ZSkpICkKLSAgICB7Ci0gICAgICAgIC8qIHRoZSBBSVIgcGFydCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCovCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX2Fpcl9jb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGNsZWFuaW5nIEFJUjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX2Fpcl9jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotICAgICAgICAvKiovCi0KLSAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0ZJTklTSEVEOwotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdHJhbnNjb2RpbmcgZmluaXNoZWQsIHJldHVybmluZyBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGluIHRoZSBjbGlwIChmaXJzdCBnZXQgdGhlIHRpbWUsIHRoZW4ganVtcCkgKi8KLSAgICBpQ3RzID0gKE00T1NBX0ludDMyKXBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRQcmV2UmFwVGltZShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgaWYoIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgLyogTm8gUkFQIHRhYmxlLCBqdW1wIGJhY2t3YXJkIGFuZCBwcmVkZWNvZGUgKi8KLSAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBNNE1DU19OT19TVFNTX0pVTVBfUE9JTlQ7Ci0KLSAgICAgICAgaWYoIGlDdHMgPCAwICkKLSAgICAgICAgICAgIGlDdHMgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEdldFByZXZSYXBUaW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiArIENSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgewotCi0gICAgICAgIC8vIFNhdmUganVtcCB0aW1lIGZvciBzYWZldHksIHRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljCi0KLSAgICAgICAgTTRPU0FfSW50MzIgaUN0c09yaSA9IGlDdHM7Ci0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBIMjY0TUNTX1Byb2Nlc3NTUFNfUFBTIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBSZXN0b3JlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIGlDdHMgPSBpQ3RzT3JpOwotCi0KLSAgICB9Ci0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIC8qKgotICAgICogRGVjb2RlIG9uZSBzdGVwICovCi0gICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSAoTTRPU0FfRG91YmxlKShpQ3RzICsgcEMtPmlWaWRlb0JlZ2luRGVjSW5jcik7Ci0KLSAgICAvKioKLSAgICAqIEJlIHN1cmUgd2UgZG9uJ3QgZGVjb2RlIHRvbyBmYXIgKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgYXQgbGVhc3Qgb25jZSB3aXRoIHRoZSBiSnVtcCBmbGFnIHRvIHRydWUgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBEZWNvZGluZyB1cFRvIENUUyAlLjNmIiwKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJnBDLT5kVmlEZWNDdXJyZW50Q3RzLAotICAgICAgICBNNE9TQV9UUlVFLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMSIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZSggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNF9NZWRpYVRpbWUgZERlY1RhcmdldDsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgKi8KLSAgICBkRGVjVGFyZ2V0ID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludFN0ZXBCZWdpbkRlY29kZTogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZkRGVjVGFyZ2V0LAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0RlY29kZTogbV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMiIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IGRlY29kaW5nIGN0cyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9IChNNE9TQV9Eb3VibGUpcEMtPmlWaWRlb0JlZ2luRGVjSW5jcjsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiwgaWYgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgfHwgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSlwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFNUiBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSAxMwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDE2MAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhbCi0gICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgewotICAgICAgICAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybgotY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV07Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQUFDIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRSAgICAgIDQKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1sKLSAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDAwLCAweEM4LCAweDIwLCAweDA3Ci0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OAotTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV07Ci0KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRSAgICAgICAgNgotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi0KLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXSA9Ci0gICAgewotICAgICAgICAweDIxLCAweDEwLCAweDAzLCAweDIwLCAweDU0LCAweDFDCi0gICAgfTsKLSNlbHNlCi0KLWV4dGVybiBjb25zdAotTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXTsKLQotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGlmIGFsbCBhdWRpbyBmcmFtZSBoYXMgYmVlbiB3cml0dGVuIChoYXBwZW5zIGF0IGJlZ2luIGN1dCkgKi8KLSAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUsCi0gICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQiAyMDA5LjA0LjAyOiBQUiBzdXJueHAjNjE2OiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICBtYXhpbXVtIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4KLSAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MyKSwgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogcEMtPm1fcERhdGFBZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczEsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIEFVIGluIHRoZSBpbnB1dCBmaWxlICovCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qICAgcEMtPm1fcERhdGFBZGRyZXNzMQotICAgICAgICAgICAgICAgICAqIGFuZCBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlCi0gICAgICAgICAgICAgICAgICogbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICoKLSAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX0NUUyAtIHBDLT5SZWFkZXJBdWRpb0FVMi5tX0NUUzsKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YUFkZHJlc3MyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMik7Ci0gICAgICAgICAgICAvKiBDcmFzaCBpbiBNQ1Mgd2hpbGUgQXVkaW8gQVUgY29weWluZyAsCi0gICAgICAgICAgICAgKiBjb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgICogcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bQotICAgICAgICAgICAgICAgICAqIHZhbHVlLiBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyQXVkaW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICogbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBbIEVORCBdIDIwMDkxMDA4ICBKRlYgUFIgZml4IHN1cm54cHN3IzEwNzE6IHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMiwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMi5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBcCi0gICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT51aUF1ZGlvQVVDb3VudAotICAgICAgICA9PSAwICkgLyogSWYgaXQgaXMgdGhlIGZpcnN0IEFVLCB3ZSBzZXQgaXQgdG8gc2lsZW5jZQotICAgICAgICAoZWxzZSwgZXJyb3JzIDB4Mzg0MSwgMHgzODQ3IGluIG91ciBBQUMgZGVjb2RlcikgKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDcGx1cwotICAgICAgICAgICAgfHwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE11c3QgbmV2ZXIgaGFwcGVuIC4uLiovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZzogQmFkIG51bWJlciBvZiBjaGFubmVscyBpbiBhdWRpbyBpbnB1dCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDgsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAvKiBTb21lIHJlbWFpbmluZyBBTVIgQVUgbmVlZHMgdG8gYmUgY29waWVkICovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBXcml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplICs9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikocEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgKyBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKk1QMyBjYXNlOiBjb3B5IHRoZSBBVSovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb3B5IGF1ZGlvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAoTTRPU0FfVGltZSkoKCggcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgLSBwQy0+aUF1ZGlvQ3RzT2Zmc2V0KQotICAgICAgICAqIChwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotCi0gICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICYmIHBDLT51aUF1ZGlvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5pQXVkaW9DdHNPZmZzZXQgLT0KLSAgICAgICAgICAgIDIwOyAvKiBEdXJhdGlvbiBvZiBhIHNpbGVuY2UgQU1SIEFVLCB0byBoYW5kbGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBhZGRlZAotICAgICAgICAgICAgICAgIHNpbGVuY2UgZnJhbWUgKi8KLSAgICB9Ci0gICAgcEMtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyk7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogQWxsIHRoZSBhdWRpbyBoYXMgYmVlbiB3cml0dGVuICovCi0gICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplID0gMDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdCBBdWRpbyBUcmFuc2NvZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR2VuZXJhbCBlcnJvciAqLwotCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNEZWM7IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBkZWNvZGVyIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsgLyoqPCBOYiBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgc3NyYyBJTiBidWZmZXIgKi8KLQotICAgIGludCBzc3JjRXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjSW5TaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBpbnRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyY0luUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgcFNzcmNJbnB1dDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3Igc3NyYyBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aVNzcmNPdXRTaXplOyAvKio8IFNpemUgaW4gYnl0ZXMgb2Ygc3NyYyBvdXRwdXQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpQnl0ZXNTc3JjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgc3NyYyBPVVQgYnVmZmVyICovCi0KLSAgICBNNE9TQV9VSW50OAotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb247IC8qKjwgRmxhZyB0byBpbmRpY2F0ZSBpZiBhIHN0ZXJlbyA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZjsgLyoqPCBNdWx0aXBsaWNhdGl2ZSBjb2VmZmljaWVudCBpZiBzdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtPiBtb25vIGNvbnZlcnNpb24gaXMgYXBwbGllZCAqLwotICAgIE00T1NBX01lbUFkZHI4IHBDaGFubmVsQ29udmVydG9ySW5wdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBpbnB1dCAqLwotICAgIE00T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAwOyAvKio8IE5iIG9mIHBjbSBzYW1wbGVzIHRvIGNvbnZlcnQgaW4gY2hhbm5lbCBjb252ZXJ0b3IgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvck91dHB1dCA9Ci0gICAgICAgIE00T1NBX05VTEw7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGNoYW5uZWwgY29udmVydG9yIG91dHB1dCAqLwotCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRW5jb2RlckluUm9vbTsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGVuY29kZXIgSU4gYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGZyb20gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBFbmNvZGVySW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIGVuY29kZXIgaW5wdXQgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAgLyoqPCBFbmNvZGVyIG91dHB1dCBidWZmZXIgZm9yIGFwaSAqLwotCi0gICAgTTRPU0FfSW50MTYgKnRlbXBCdWZmT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIE00T1NBX0ludDggKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAmKHBDLT5wQWN0aXZlRWZmZWN0TnVtYmVyKTsKLQotICAgIHVpbnQzMl90IGVyckNvZGUgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFJFQUQgQU5EIERFQ09ERSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZmVlZF9yZXNhbXBsZXI7Ci0gICAgfQotCi0gICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMLCAmcEMtPkF1ZGlvRGVjQnVmZmVyT3V0LCBNNE9TQV9GQUxTRSk7Ci0KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsIDEsIGZpbGVfcGNtX2RlY29kZXIpOwotCi0jZW5kaWYKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZSwgKE00T1NBX0RhdGFPcHRpb24pICZlcnJDb2RlKTsKLQotICAgIGlmICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnJDb2RlICkgewotICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyQ29kZTsKLSAgIH0KLQotICAgIC8qIFNldCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgLyogX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRkVFRCBSRVNBTVBMRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOgotCi0gICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBlbXB0eSB0aGUgc3NyYyBvdXQgYnVmZmVyIGZpcnN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgZGVjb2RlciBidWZmZXIgKi8KLSAgICB1aVNzcmNJblNpemUgPSBwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHVpQnl0ZXNEZWMgPSAoIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzCi0gICAgICAgICsgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSkgLSBwQy0+cFBvc0luRGVjQnVmZmVyT3V0OwotCi0gICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIFNzcmMgd2l0aCB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9PSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgJiYgKHVpQnl0ZXNEZWMgPj0gdWlTc3JjSW5TaXplKSApCi0gICAgewotICAgICAgICBwU3NyY0lucHV0ID0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGRlY29kZXIgYnVmZmVyIGFmdGVyIHJlc2FtcGxpbmcgKi8KLSAgICAgICAgaWYoIHVpQnl0ZXNEZWMgPT0gdWlTc3JjSW5TaXplICkKLSAgICAgICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ICs9IHVpU3NyY0luU2l6ZTsKLQotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIFNzcmMgYnVmZmVyIGluICovCi0gICAgdWlTc3JjSW5Sb29tID0gKCBwQy0+cFNzcmNCdWZmZXJJbiArIHVpU3NyY0luU2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlckluOwotCi0gICAgLyoqCi0gICAgKiBOYiBvZiBieXRlcyBjb3BpZWQgaXMgdGhlIG1pbmltdW0gYmV0d2VlbiBuYiBvZiBieXRlcyByZW1haW5pbmcgaW4KLSAgICAqIGRlY29kZXIgb3V0IGJ1ZmZlciBhbmQgc3BhY2UgcmVtYWluaW5nIGluIHNzcmMgaW4gYnVmZmVyICovCi0gICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyA9Ci0gICAgICAgICh1aVNzcmNJblJvb20gPCB1aUJ5dGVzRGVjKSA/IHVpU3NyY0luUm9vbSA6IHVpQnl0ZXNEZWM7Ci0KLSAgICAvKioKLSAgICAqIENvcHkgZnJvbSB0aGUgZGVjb2RlciBvdXQgYnVmZmVyIGludG8gdGhlIFNzcmMgaW4gYnVmZmVyICovCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwgKHZvaWQgKilwQy0+cFBvc0luRGVjQnVmZmVyT3V0LAotICAgICAgICB1aURlY29kZXIyU3NyY19OYkJ5dGVzKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGVjb2RlciBvdXQgYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aURlY29kZXIyU3NyY19OYkJ5dGVzOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGhlIHBvc2l0aW9uIGluIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgdGhlIGRlY29kZXIgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgLSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcykKLSAgICAgICAgPT0gKE00T1NBX0ludDMyKXBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIFNzcmMgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHBDLT5wU3NyY0J1ZmZlckluKQotICAgICAgICA8IChNNE9TQV9JbnQzMil1aVNzcmNJblNpemUgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICBwU3NyY0lucHV0ID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIHNzcmMgYnVmZmVyIGluIGFmdGVyIHJlc2FtcGxpbmcgKGVtcHR5KSAqLwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IERPIFRIRSBSRVNBTVBMSU5HIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19kb19yZXNhbXBsaW5nOgotCi0gICAgLyoqCi0gICAgKiBObyBuZWVkIGZvciBtZW1jb3B5LCB3ZSBjYW4gZmVlZCBTc3JjIGRpcmVjdGx5IHdpdGggdGhlIGRhdGEgaW4gdGhlIGF1ZGlvCi0gICAgZGVjb2RlciBvdXQgYnVmZmVyKi8KLQotICAgIHNzcmNFcnIgPSAwOwotCi0gICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAxICkKLSAgICB7Ci0gICAgICAgIHRlbXBCdWZmT3V0ID0KLSAgICAgICAgICAgIChzaG9ydCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpLAotICAgICAgICAgICAgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJ0ZW1wQnVmZk91dCIpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKil0ZW1wQnVmZk91dCwgMCwocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiAyCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKil0ZW1wQnVmZk91dCwgKHNob3J0ICopcFNzcmNJbnB1dCwKLSAgICAgICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQsIHBDLT5wTFZBdWRpb1Jlc2FtcGxlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlck91dCwgMCwgKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAqICgoKnBDKS5JbnB1dEZpbGVQcm9wZXJ0aWVzKS51aU5iQ2hhbm5lbHMpKTsKLQotICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQgKilwU3NyY0lucHV0LCBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIChzaG9ydClwQy0+aVNzcmNOYlNhbXBsT3V0KTsKLSAgICAgICAgZnJlZSh0ZW1wQnVmZk91dCk7Ci0gICAgfQotCi0KLSAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2Rpbmc6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQiLAotICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBQUkVQQVJFIElOUFVUIEJVRkZFUiB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfcHJlcGFyZV9pbnB1dF9idWZmZXI6Ci0KLSAgICAvKiBTZXQgdGhlIGZsYWcgZm9yIGNoYW5uZWwgY29udmVyc2lvbiByZXF1aXJlbWVudCAqLwotICAgIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgJiYgKHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9PSAyKSApCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAxOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYoICggcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPT0gTTRFTkNPREVSX2tTdGVyZW8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSkgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPSAwOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiA9IDI7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBTc3JjIGJ1ZmZlciAqLwotICAgIHVpU3NyY091dFNpemUgPSBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzU3NyYyA9Ci0gICAgICAgICggcEMtPnBTc3JjQnVmZmVyT3V0ICsgdWlTc3JjT3V0U2l6ZSkgLSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHRoZSBzc3JjIGJ1ZmZlciBpcyBmdWxsICovCi0gICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMjsKLQotICAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gZmVlZCBkaXJlY3RseSB0aGUgZW5jb2RlciB3aXRoIHRoZSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgJiYgKHVpQnl0ZXNTc3JjID49IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogdXBkYXRlIHBvc2l0aW9uIGluIHNzcmMgb3V0IGJ1ZmZlciBhZnRlciBlbmNvZGluZyAqLwotICAgICAgICAgICAgaWYoIHVpQnl0ZXNTc3JjID09IHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKQotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgICAgICAgICAvKiBtYXJrIHRoZSBlbmNvZGVyIGJ1ZmZlciByZWFkeSAoPSBmdWxsKSAqLwotICAgICAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0KLSAgICAgICAgICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgICAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAgICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBlbmNvZGUgZGlyZWN0bHkgZnJvbSBzc3JjIG91dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgICAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcmVtYWluaW5nIHNwYWNlIGluIGVuY29kZXIgYnVmZmVyIGluICovCi0gICAgaWYoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgfQotCi0gICAgdWlFbmNvZGVySW5Sb29tID0gKCBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciArIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSkKLSAgICAgICAgLSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIHBFbmNvZGVySW5wdXQgPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlcjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgPQotICAgICAgICAoKCB1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDwgdWlCeXRlc1NzcmMpCi0gICAgICAgID8gKHVpRW5jb2RlckluUm9vbSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikgOiB1aUJ5dGVzU3NyYzsKLQotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIC8qIGNoYW5uZWwgY29udmVydG9yIHdyaXRlcyBkaXJlY3RseSBpbnRvIGVuY29kZXIgYnVmZmVyICovCi0gICAgICAgIHBDaGFubmVsQ29udmVydG9ySW5wdXQgPSBwQy0+cFBvc0luU3NyY0J1ZmZlck91dDsKLSAgICAgICAgcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPSBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgICAgICB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzIC8gc2l6ZW9mKHNob3J0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29weSBmcm9tIHRoZSBzc3JjIG91dCBidWZmZXIgaW50byB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciwgKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMpOwotICAgIH0KLQotICAgIC8qIFVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOwotCi0gICAgLyogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgZW5jb2RlciBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyICs9Ci0gICAgICAgIHVpU3NyYzJFbmNvZGVyX05iQnl0ZXMgKiAyIC8gdWlDaGFubmVsQ29udmVydG9yQ29lZmY7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgb3V0IGlzIGVtcHR5ICovCi0gICAgaWYoICggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQpCi0gICAgICAgID09IChNNE9TQV9JbnQzMil1aVNzcmNPdXRTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBnbyB0byBuZXh0IHN0YXRlbWVudCAqLwotICAgIGlmKCBuZWVkQ2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOwotICAgIGVsc2UKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNURVJFTyA8LT4gTU9OTyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2NoYW5uZWxfY29udmVydG9yOgotCi0gICAgLyogY29udmVydCB0aGUgaW5wdXQgcGNtIHN0cmVhbSB0byBtb25vIG9yIHRvIHN0ZXJlbyAqLwotICAgIHN3aXRjaCggbmVlZENoYW5uZWxDb252ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGNhc2UgMTogLyogc3RlcmVvIHRvIG1vbm8gKi8KLSAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvcklucHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9yT3V0cHV0LAotICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzIC8gMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAvKiBtb25vIHRvIHN0ZXJlbyAqLwotICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBFTkNPREUgQU5EIFdSSVRFIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuY29kZV9hbmRfd3JpdGU6Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgZW5jb2RlciBpbiBidWZmZXIgaXMgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyIC0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIpCi0gICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSApCi0gICAgewotICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9IHBFbmNvZGVySW5wdXQ7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclsxXSA9IE00T1NBX05VTEw7Ci0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgZnJhbWVUaW1lRGVsdGEgPQotICAgICAgICAoIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKQotICAgICAgICAvIHNpemVvZihzaG9ydCkgLyBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFwcGx5IGF1ZGlvIGVmZmVjdHMgaWYgYW4gZWZmZWN0IGlzIGFjdGl2ZSovCi0gICAgaWYoICpwQWN0aXZlRWZmZWN0TnVtYmVyID49IDAgJiYgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPCBwQy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzIHBQcm9ncmVzczsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpQ2xpcFRpbWUgPSAoTTRPU0FfVUludDMyKXBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTOwotCi0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKCBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgKiAxMDAwKQotICAgICAgICAgICAgICAgIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLSAgICAgICAgICAgIHRlbXBQcm9ncmVzcyA9ICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS51aVN0YXJ0VGltZQotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMDA7Ci0gICAgICAgICAgICBwUHJvZ3Jlc3MudWlQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikodGVtcFByb2dyZXNzIC8gKE00T1NBX1VJbnQzMilwQy0+cEVmZmVjdHNbCi0gICAgICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyXS51aUR1cmF0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEVmZmVjdHNbKnBBY3RpdmVFZmZlY3ROdW1iZXJdLkV4dEF1ZGlvRWZmZWN0RmN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDE2ICopcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAmcFByb2dyZXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBFeHRBdWRpb0VmZmVjdEZjdCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0KLSAgICBmd3JpdGUocEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSwgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0sIDEsCi0gICAgICAgIGZpbGVfcGNtX2VuY29kZXIpOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+Yl9pc1Jhd1dyaXRlciApCi0gICAgewotICAgICAgICAvKiBUaGlzIGFsbG93IHRvIHdyaXRlIFBDTSBkYXRhIHRvIGZpbGUgYW5kIHRvIGVuY29kZSBBTVIgZGF0YSwKLSAgICAgICAgIHdoZW4gb3V0cHV0IGZpbGUgaXMgbm90IFJBVyAqLwotICAgICAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPnBPdXRwdXRQQ01maWxlLAotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAocEMtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgZGF0YSBjb25zdW1lZCBpbnRvIGVuY29kZXIgYnVmZmVyIGluIGFmdGVyIGVuY29kaW5nIChlbXB0eSkgKi8KLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IEFVIGN0cyBhbmQgc2l6ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTICs9IGZyYW1lVGltZURlbHRhOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBkdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCBBVSAqLwotICAgICAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPQotICAgICAgICAgICAgKCBmcmFtZVRpbWVEZWx0YSAqIDEwMDApIC8gcEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgZW5jb2RlZCBBVSB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpQXVkaW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICBwRW5jb2RlcklucHV0OyAvKiB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIHU4KiBpbiBmaWxlIHdyaXRlICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7Ci0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgT05FIFBBU1MgRE9ORSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ6Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKE00T1NBX01lbUFkZHI4KiBhZGRyLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKLSAqIFVzZWQgb25seSBpbiBjYXNlIG9mIDNHUCBjb25zdGFudCBtZW1vcnkgcmVhZGVyLCB0byBiZSBhYmxlIHRvIHJlYWxsb2MgdGVtcG9yYXJ5IEFVCi0gKiBiZWNhdXNlIG1heCBBVSBzaXplIGNhbiBiZSByZWV2YWx1YXRlZCBkdXJpbmcgcmVhZGluZwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoIE00T1NBX01lbUFkZHI4ICphZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5ld1NpemUgKQotewotICAgIGlmKCAqYWRkciAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUoKmFkZHIpOwotICAgICAgICAqYWRkciA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJSZWFsbG9jYXRpb24gb2YgdGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmKCAqYWRkciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgLyogRHVyYXRpb24gb2YgdGhlIEFVIChmaW5kIHRoZSBuZXh0IEFVIGR1cmF0aW9uCi0gICAgICogdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQpCi0gICAgICovCi0gICAgTTRPU0FfVUludDMyIHZpZGVvQVVEdXJhdGlvbiA9IDA7Ci0KLSAgICBNNE9TQV9NZW1BZGRyOCBXcml0ZWJ1ZmZlckFkZCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgbGFzdGRlY29kZWRDVFMgPSAwOwotICAgIE00X0FjY2Vzc1VuaXQgbFJlYWRlclZpZGVvQVU7IC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBILjI2NCBUcmltbWluZyAqLwotICAgIGlmKCAoICggcEMtPmJIMjY0VHJpbSA9PSBNNE9TQV9UUlVFKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9BVUNvdW50IDwgcEMtPm1fcEluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcykKLSAgICAgICAgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKQotICAgICAgICB8fCAoKCBwQy0+dWlWaWRlb0FVQ291bnQgPT0gMCkgJiYgKHBDLT51aUJlZ2luQ3V0VGltZSA+IDApKSApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGlmKChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICB7Ci0gICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBwcmVmZXRjaCwgdGhlIG9uZSBmcmFtZSB3ZSByZXF1ZXN0ZWQgd2lsbCBub3QgYmUgd3JpdHRlbiB1bnRpbAotICAgICAgICAvLyB0aGUgZW5jb2RlciBpcyBjbG9zZWQsIHNvIGRvIGl0IG5vdyByYXRoZXIgdGhhbiBpbiBNQ1NfY2xvc2UKLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB8fCAoTTRNQ1Nfa0VuY29kZXJSdW5uaW5nICE9IHBDLT5lbmNvZGVyU3RhdGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IE00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcgIgotICAgICAgICAgICAgICAgICJyZXR1cm5zIDB4JVggdy8gZW5jU3RhdGU9JWQiLCBlcnIsIHBDLT5lbmNvZGVyU3RhdGUpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU3RvcCBhbmQgY2xvc2UgdGhlIGVuY29kZXIgbm93IHRvIGZsdXNoIHRoZSBmcmFtZSAocHJlZmV0Y2gpICovCi0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIiEhISBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyBFUlJPUiA6IGVuY29kZXIgc3RvcCByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIGNsb3NlIHJldHVybnMgMHglWCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotCi0gICAgaWYgKChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwpCi0gICAgICAgICYmIChwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgewotCi0gICAgICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUywgJmxhc3RkZWNvZGVkQ1RTKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gbm90IG5lZWQgdmlkZW8gZGVjb2RlciBhbnkgbW9yZSwgbmVlZCB0byBkZXN0cm95IGl0LiBPdGhlcndpc2UgaXQKLSAgICAgICAgICogd2lsbCBjYWxsIHJlYWRlciBmdW5jdGlvbiB3aGljaCB3aWxsIGNhdXNlIGZyYW1lIGxvc3QgZHVyaW5nIHRyaW1pbmcsCi0gICAgICAgICAqIHNpbmNlIHRoZSAzZ3AgcmVhZGVyIGlzIHNoYXJlZCBiZXR3ZWVuIE1DUyBhbmQgZGVjb2Rlci4qLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCkgewotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IGRlY29kZXIgcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcEZjdEp1bXAoVikgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZzptX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbylcCi0gICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbFJlYWRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAvKiBUaGUgYXVkaW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6XAotICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiMjIyBbVFNfQ0hFQ0tdIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nICB2aWRlbyBBVSBDVFM6ICVkICIsCi0gICAgICAgICAgICBsUmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0KLQotICAgIH0KLQotCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfVFJVRTsKLQotCi0gICAgLyogRmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbiB0byBvYnRhaW4gYSBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCovCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplcyBhIG5ldyBBVSBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChwQy0+UmVhZGVyVmlkZW9BVTEubV9zdHJ1Y3RTaXplID09IDApIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVTEgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYgKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTEpOwotCi0gICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pXAotICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMQotICAgICAgICAgICAgYW5kIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplLCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlRlbXBvcmFyeSB2aWRlbyBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmVhZCB0aGUgbmV4dCB2aWRlbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFMgPiBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVSwKLSAgICAgICAgICAgICh2b2lkICopICZwQy0+UmVhZGVyVmlkZW9BVTIsIHNpemVvZihNNF9BY2Nlc3NVbml0KSk7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogYmVjYXVzZSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0gdmFsdWUuCi0gICAgICAgICAgICAgVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlclZpZGVvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqLwotICAgICAgICAgICAgLyogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3NpemUpOwotICAgICAgICB2aWRlb0FVRHVyYXRpb24gPSBwQy0+UmVhZGVyVmlkZW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyVmlkZW9BVTIubV9DVFM7Ci0gICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgPSBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUxLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUyLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxOwotICAgIH0KLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSh2aWRlbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgIC8qIFRoZSB2aWRlbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShWaWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvcHkgdmlkZW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBDb3B5aW5nIHZpZGVvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSArIDIwNDgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikicEMtPkgyNjRNQ1NUZW1wQnVmZmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIGVyciA9IEgyNjRNQ1NfUHJvY2Vzc05BTFUocEMtPm1fcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUsIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyICopJnBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE1DU19jb252ZXRGcm9tQnl0ZVN0cmVhbXRvTkFMU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyAsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNCk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyICsgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0OwotICAgICAgICAgICAgICAgICAgICBXcml0ZWJ1ZmZlckFkZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUpOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSBwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ29udmVydCBDVFMgdW5pdCBmcm9tIG1pbGxpc2Vjb25kcyB0byB0aW1lc2NhbGUgKi8KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzKQotICAgICAgICAgICAgICAgICogKHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgLyAxMDAwLjApKSk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPlJlYWRlclZpZGVvQVUubV9hdHRyaWJ1dGU7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiB2aWRlbyBBVTogQ1RTPSVkIG1zIiwKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBwQy0+dWlWaWRlb0FVQ291bnQrKzsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPldyaXRlclZpZGVvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJIMjY0VHJpbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+bV9wSW5zdGFuY2UtPmlzX2RvbmUgPT0gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MpLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoV3JpdGVidWZmZXJBZGQgLSA0KSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPkgyNjRNQ1NUZW1wQnVmZmVyKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBDaGVjayBmb3IgZW5kIGN1dC4gKi8KLSAgICAvKiBCdWcgZml4IDExLzEyLzIwMDg6IFdlIGFic29sdXRlbHkgd2FudCB0byBoYXZlIGxlc3Mgb3Igc2FtZSB2aWRlbyBkdXJhdGlvbiAtPgotICAgICgyKnZpZGVvQVVEdXJhdGlvbikgdG8gaGF2ZSBhIG1vcmUgcHJlY2lzZSBlbmQgY3V0Ki8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUubV9DVFMgKyAoMiAqdmlkZW9BVUR1cmF0aW9uKSA+IHBDLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKiBAYXV0aG9yICAgQWxleGlzIFZhcGlsbG9uIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgbXRUcmFuc2NvZGVkVGltZSA9IDAuMDsKLSAgICBNNEVOQ09ERVJfRnJhbWVNb2RlIEZyYW1lTW9kZTsKLSAgICBNNE9TQV9JbnQzMiBkZXJpdmUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBHZXQgdmlkZW8gQ1RTIHRvIGRlY29kZSAqLwotICAgIG10VHJhbnNjb2RlZFRpbWUgPSBwQy0+ZFZpRGVjQ3VycmVudEN0czsKLSAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa05vcm1hbEZyYW1lOwotCi0gICAgLyoqCi0gICAgKiBEZWNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBtX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZSglLjJmKSIsCi0gICAgICAgIG10VHJhbnNjb2RlZFRpbWUpOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQy0+cFZpRGVjQ3R4dCwgJm10VHJhbnNjb2RlZFRpbWUsCi0gICAgICAgIE00T1NBX0ZBTFNFLCAwKTsKLQotICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgewotICAgICAgICBGcmFtZU1vZGUgPQotICAgICAgICAgICAgTTRFTkNPREVSX2tMYXN0RnJhbWU7IC8qKjwgV2Ugd2lsbCBnaXZlIHRoaXMgdmFsdWUgdG8gdGhlIGVuY29kZXIgdG8KLSAgICAgICAgICAgIGFzayBmb3IgdGhlIGVuZCBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgfQotICAgIGVsc2UgaWYoIGVyciA9PSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRGVjb2Rpbmcgb3V0cHV0IHRoZSBzYW1lIGZyYW1lIGFzIGJlZm9yZSAzIik7Ci0gICAgICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuCi0gICAgKiBXZSBtdXN0IGNoZWNrIGhlcmUgaWYgdGhlIGVuZCBjdXQgaXMgcmVhY2hlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2Ugd2UgbXVzdAotICAgICogY2FsbCB0aGUgbGFzdCBlbmNvZGUgc3RlcCAoLT4gYkxhc3RGcmFtZSBzZXQgdG8gdHJ1ZSkgKi8KLSAgICBpZiggKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyArIHBDLT5kQ3RzSW5jcmVtZW50ICkgPj0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgKyBNNE1DU19BQlMocEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSkgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICBkZXJpdmUgPSAoTTRPU0FfSW50MzIpKCggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCArIDAuNSkKLSAgICAgICAgICAgIC0gKHBDLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgc3RhcnRpbmcgQ1RTIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgdmFsdWUgKAotICAgIHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBpZiggcEMtPnVpVmlkZW9BVUNvdW50ID09IDAgKQotICAgIHsKLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gbXRUcmFuc2NvZGVkVGltZTsKLSAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgPSBwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBFbmNvZGUgdmlkZW8gKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00TUNTX2ludFZpZGVvVHJhbnNjb2RpbmcoKTogQ2FsbGluZyBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzXAotICAgICAgICAgPSAlLjJmIixwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyk7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgLyogdXBkYXRlIHRoZSBnaXZlbiBkdXJhdGlvbiAodGhlIGJlZ2luIGN1dCBpcyBub3QgYSByZWFsIENUUykqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+cFZpRW5jQ3R4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgKHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gKGRlcml2ZSA+PiAxKSksCi0gICAgICAgIEZyYW1lTW9kZSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKE00TUNTX0ludGVybmFsQ29udGV4dCogcENvbnRleHQpCi0gKiBAYXV0aG9yICAgRG91bnlhIE1hbmFpIChOWFAgU29mdHdhcmUgVmlzaW9uKQotICogQGJyaWVmICAgIFJldHJpZXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZJbmZvOwotICAgIE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllcyBIMjYzcHJvcDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0JpdHJhdGU7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemU7Ci0gICAgTTRfQUFDVHlwZSBpQWFjVHlwZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQywgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogcEMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBjb21tb24gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZnR5cCwKLSAgICAgICAgMCwgc2l6ZW9mKE00VklERU9FRElUSU5HX0Z0eXBCb3gpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0IChub3QgdXNlZCBpbiBNQ1MpICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBpZiBiaXRyYXRlIG5vdCBhdmFpbGFibGUgcmV0cmlldmUgYW4gZXN0aW1hdGlvbiBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmdmlkZW9CaXRyYXRlKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgLT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlID0gdmlkZW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0cmlldmUgdGhlIFByb2ZpbGUgJiBMZXZlbCAqLwotICAgICAgICBpZiggKCBNNFZJREVPRURJVElOR19rSDI2MyAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQKLSAgICAgICAgICAgICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBVc2UgdGhlIERTSSBwYXJzaW5nIGZ1bmN0aW9uIGZyb20gdGhlIGV4dGVybmFsIHZpZGVvIHNoZWxsIGRlY29kZXIuCi0gICAgICAgICAgICBTZWUgdGhlIGNvbW1lbnRzIGluIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYywgaXQncyBwcmV0dHkgbXVjaCB0aGUKLSAgICAgICAgICAgIHNhbWUgaXNzdWUuICovCi0KLSAgICAgICAgICAgIGVyciA9IE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmRGVjQ29uZkluZm8sICZ2aWRlb1NpemUpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJIHJldHVybnMgMHglMDhYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGggPSB2aWRlb1NpemUubV91aVdpZHRoOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodCA9IHZpZGVvU2l6ZS5tX3VpSGVpZ2h0OwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IERlY0NvbmZJbmZvLnVpVGltZVNjYWxlOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0ZGF0YVBhcnRpdGlvbiA9Ci0gICAgICAgICAgICAgICAgRGVjQ29uZkluZm8uYkRhdGFQYXJ0aXRpb247Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRydmxjID0gRGVjQ29uZkluZm8uYlVzZU9mUlZMQzsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLnVpVXNlT2ZSZXN5bmNoTWFya2VyOwotCi0gICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25mSW5mby51aVByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rSDI2MyA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRIMjYzUHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogRm9yIGgyNjMgc2V0IGRlZmF1bHQgdGltZXNjYWxlIDogMzAwMDA6MTAwMSAqLwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBNNFZJREVPRURJVElOR19rSDI2NCA9PQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkgewotCi0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0gICAgICAgICAgICBlcnIgPSBnZXRBVkNQcm9maWxlQW5kTGV2ZWwocEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhlcmUgYmVjYXVzZSB3aWR0aCB4IGhlaWdodCBpcyBjb3JyZWN0IG9ubHkgYWZ0ZXIgZHNpIHBhcnNpbmcKLSAgICAgICAgKGRvbmUgaW4gY3JlYXRlIGRlY29kZXIpICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+dmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRWaWRlbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rRVZSQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVVbmtub3duOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvRGVjb2RlcikKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wQXVkaW9EZWNDdHh0KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBjYWxsaW5nIENyZWF0ZUF1ZGlvRGVjb2RlciwgdXNlckRhdGE9IDB4JXgiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJFeHRPTVhBdWREZWNvZGVyICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKHBDKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBBQUMgcHJvcGVydGllcyovCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IGZyb20gUmVhZGVyOyB0ZW1wb3JhcnksIHRpbGwgQXVkaW8gZGVjb2RlciBzaGVsbCBBUEkgYXZhaWxhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBBQUMgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmlBYWNUeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlID0gTTRfa0FBQzsgLy9zZXQgdG8gZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyByZXR1cm5zIHN0cmVhbVR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggaUFhY1R5cGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zYW1wbGluZ0ZyZXF1ZW5jeTsgLy9UT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRfa1Vua25vd246Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBBQUMgTkJDaGFucz0lZCwgU2FtcGxGcmVxPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogZGVjb2RlciBub3QgaW1wbGVtZW50ZWQgeWV0LCBwcm92aWRlIHNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBudWxsIGVuY29kaW5nICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBCdWdmaXggUDRNRTAwMDAxMTI4OiBXaXRoIHNvbWUgSU1UQyBmaWxlcywgdGhlIEFNUiBiaXQgcmF0ZSBpcyAwIGticHMgYWNjb3JkaW5nCi0gICAgICAgICB0aGUgR2V0UHJvcGVydGllcyBmdW5jdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tBTVJfTkIKLSAgICAgICAgICAgICAgICA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDguNSBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlCi0gICAgICAgICAgICAgICAgMCBrYnBzIHZhbHVlISAqLwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlQml0cmF0ZTsKLQotICAgICAgICAgICAgICAgIC8qIENhbiBoYXBwZW4gYWxzbyBmb3IgYWFjLCBpbiB0aGlzIGNhc2Ugd2UgY2FsY3VsYXRlIGFuIGFwcHJveGltYXRpdmUgKi8KLSAgICAgICAgICAgICAgICAvKiB2YWx1ZSBmcm9tIGdsb2JhbCBiaXRyYXRlIGFuZCB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsZUJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVCaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgIC0gcEMtPgotICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZSAvKiBub3JtYWxseSBzZXR0ZWQgdG8gMCwgaWYgbm8gdmlkZW8gKi87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb247Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0KLSAgICAgICAgLyogQnVnOiB3aXRoIGFhYywgdmFsdWUgaXMgMCB1bnRpbCBkZWNvZGVyIHN0YXJ0KCkgaXMgY2FsbGVkICovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlRnJhbWVMZW5ndGgKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICAgICAgLyogTmV3IGFhYyBwcm9wZXJ0aWVzICovCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYwotICAgICAgICAgICAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW47Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rVW5zdXBwb3J0ZWRBdWRpbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXApOwotCi0gICAgLyogQW5hbHlzaXMgaXMgc3VjY2Vzc2Z1bCAqLwotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbiApCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0KLSAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLQotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gcEMtPklucHV0RmlsZVR5cGU7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfVFJVRTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ3BBdWRpb0ZyYW1lICAgKElOKSBBTVJOQiBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpOiBDb3JydXB0ZWQgQU1SIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyhNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKCk6IENvcnJ1cHRlZCBFVlJDIGZyYW1lISByZXR1cm5pbmcgMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAoMSArICgoIGZyYW1lU2l6ZSArIDcpIC8gOCkpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgbWF4IGZpbGUgc2l6ZSBpcyBncmVhdGVyIGVub3VnaCB0byBlbmNvZGUgYSBmaWxlIHdpdGggdGhlCi0gKiAgICAgICAgICAgY3VycmVudCBzZWxlY3RlZCBiaXRyYXRlcyBhbmQgZHVyYXRpb24uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUgotICogQHJldHVybiAgIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja01heEZpbGVTaXplKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9VSW50MzIgZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGF1ZGlvYml0cmF0ZTsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9iaXRyYXRlOwotCi0gICAgLyogZnJlZSBmaWxlIHNpemUgOiBPSyAqLwotICAgIGlmKCBwQy0+dWlNYXhGaWxlU2l6ZSA9PSAwICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZHVyYXRpb24gPSBwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lOwotICAgIH0KLQotICAgIC8qIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBhdWRpb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8vRVZSQwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0VWUkM6Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKiBBQUMgYW5kIE1QMyovCi0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgKHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiB2aWRlbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICB7Ci0gICAgICAgIHZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCAoTTRPU0FfVUludDMyKXBDLT51aU1heEZpbGVTaXplCi0gICAgICAgIDwgKE00T1NBX1VJbnQzMikoTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICogKGF1ZGlvYml0cmF0ZSArIHZpZGVvYml0cmF0ZSkgKiAoZHVyYXRpb24gLyA4MDAwLjApKSApCi0gICAgICAgIHJldHVybiBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSURFT0VESVRJTkdfQml0cmF0ZSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShNNE9TQV9VSW50MzIgZnJlZWJpdHJhdGUsIE00T1NBX0ludDggbW9kZSkKLSAqIEBicmllZiAgICBSZXR1cm5zIHRoZSBjbG9zZXN0IGJpdHJhdGUgdmFsdWUgZnJvbSB0aGUgZW51bSBsaXN0IG9mIHR5cGUgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICogQHBhcmFtICAgIGZyZWViaXRyYXRlOiB1bnNpZ25lZCBpbnQgdmFsdWUKLSAqIEBwYXJhbSAgICBtb2RlOiAtMTpwcmV2aW91cywwOmN1cnJlbnQsMTpuZXh0Ci0gKiBAcmV0dXJuICAgYml0cmF0ZSB2YWx1ZSBpbiBlbnVtIGxpc3QgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRWSURFT0VESVRJTkdfQml0cmF0ZQotTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoIE00T1NBX0ludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUgKQotewotICAgIE00T1NBX0ludDMyIGJpdGFycmF5IFtdID0KLSAgICB7Ci0gICAgICAgIDAsIE00VklERU9FRElUSU5HX2sxNl9LQlBTLCBNNFZJREVPRURJVElOR19rMjRfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFMsIE00VklERU9FRElUSU5HX2s0OF9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUywgTTRWSURFT0VESVRJTkdfazk2X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUywgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMjU2X0tCUFMsIE00VklERU9FRElUSU5HX2syODhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTLCBNNFZJREVPRURJVElOR19rNTEyX0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4MDBfS0JQUywgTTRWSURFT0VESVRJTkdfazJfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazVfTUJQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazhfTUJQUywgLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIE00T1NBX0lOVDMyX01BWAotICAgIH07Ci0KLSAgICBjb25zdCBNNE9TQV9VSW50MzIgbmJiaXRyYXRlcyA9IDE0OwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgZm9yICggaSA9IDA7IGZyZWViaXRyYXRlID49IGJpdGFycmF5W2ldOyBpKysgKTsKLQotICAgIHN3aXRjaCggbW9kZSApCi0gICAgewotICAgICAgICBjYXNlIC0xOiAvKiBwcmV2aW91cyAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMiApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAyXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMDogLyogY3VycmVudCAqLwotICAgICAgICAgICAgaWYoIGkgPD0gMSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2kgLSAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogLyogbmV4dCAqLwotICAgICAgICAgICAgaWYoIGkgPj0gbmJiaXRyYXRlcyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00T1NBX0lOVDMyX01BWDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gYml0YXJyYXlbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBNNE1DU19vcGVuKCkKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2xlYW5VcF9SZWFkZXJzRGVjb2RlcnMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzIGNhbGxlZCB3aXRoIHBDPTB4JXgiLCBwQyk7Ci0KLSAgICAvKiovCi0gICAgLyogLS0tLS0gRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogLS0tLS0gRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBzdHVmZiAtLS0tLSAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgcEMtPnBBdWRpb0RlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgcmVhZGVyIHN0dWZmLCBpZiBuZWVkZWQgLS0tLS0gKi8KLSAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcmVhZGVyIGJlZm9yZSBkZWNvZGVycyBiZWNhdXNlIHRoZSBkZWNvZGVycyBtYXkgcmVhZAotICAgIC8vIGZyb20gdGhlIHJlYWRlciAoaW4gYW5vdGhlciB0aHJlYWQpIGJlZm9yZSBiZWluZyBzdG9wcGVkLgotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPgotICAgICAgICBwUmVhZGVyQ29udGV4dCApIC8qKjwgbWF5IGJlIE00T1NBX05VTEwgaWYgTTRNQ1Nfb3BlbiB3YXMgbm90IGNhbGxlZCAqLwotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0Q2xvc2UocEMtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfY2xlYW5VcDogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5wUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczEpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFBZGRyZXNzMik7Ci0gICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKkJ1ZyBmaXggMTEvMTIvMjAwOCAodG8gb2J0YWluIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KSovCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLiBJdCBpcyB0aGUgc2FtZSBhcyBNNE1DU19vcGVuIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19XSVRIX0ZBU1RfT1BFTiBmbGFnCi1JdCBpcyB1c2VkIGluIFZpZGVvQXJ0aXN0Ci0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBpcyBub3QgY3JlYXRlZCB5ZXQuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBGaWxlSW4gICAgICAgICAgICAgKElOKSBJbnB1dCBmaWxlIHRvIHRyYW5zY29kZSAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBtZWRpYVR5cGUgICAgICAgICAgIChJTikgQ29udGFpbmVyIHR5cGUgKC4zZ3AsLmFtciwgLi4uKSBvZiBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcEZpbGVPdXQgICAgICAgICAgICAoSU4pIE91dHB1dCBmaWxlIHRvIGNyZWF0ZSAgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBwVGVtcEZpbGUgICAgICAgICAgIChJTikgVGVtcG9yYXJ5IGZpbGUgZm9yIHRoZSBjb25zdGFudCBtZW1vcnkgd3JpdGVyIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBGaWxlSW49MHgleCxcCi0gICAgIHBGaWxlT3V0PTB4JXgiLCBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlSW4pICwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBwRmlsZUluIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmICgoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRikKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQk1QKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGU6IFN0aWxsIHBpY3R1cmUgaXMgbm90XAotICAgICAgICAgICAgIHN1cHBvcnRlZCB3aXRoIHRoaXMgZnVuY3Rpb24iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMgaW50byBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wSW5wdXRGaWxlICAgICA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgID0gSW5wdXRGaWxlVHlwZTsKLSAgICBwQy0+cE91dHB1dEZpbGUgICAgPSBwRmlsZU91dDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBwVGVtcEZpbGU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgICAgICAgICAgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemVzIHRoZSByZWFkZXIgc2hlbGwgYW5kIG9wZW4gdGhlIGRhdGEgZmlsZSAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBSZWFkZXJDb250ZXh0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdE9wZW4ocEMtPnBSZWFkZXJDb250ZXh0LCBwQy0+cElucHV0RmlsZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVpRHVtbXksIHVpQ29yZUlkOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIGlmIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00TUNTX0VSUl9GSUxFX0RSTV9QUk9URUNURUQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfRVJSX1NQTElUKGVyciwgdWlEdW1teSwgdWlDb3JlSWQsIHVpRHVtbXkpOwotICAgICAgICAgICAgaWYgKE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+cFJlYWRlckNvbnRleHQsICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpCi0gICAgICAgICAgICB8fCAoZXJyID09ICgoTTRPU0FfVUludDMyKU00V0FSX1RPT19NVUNIX1NUUkVBTVMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8gPT0gbWVkaWFGYW1pbHkpIFwKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZVZpZGVvSDI2Mz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLSAgICAgICAgICAgICAgICAgICAgfHwoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkpCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICB8fCgoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2Yz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgJiYocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbTTRERUNPREVSX2tWaWRlb1R5cGVBVkNdICE9IE00T1NBX05VTEwpKSkKLSNlbmRpZgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGEgSDI2MyBvciBNUEVHLTQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZFZpZGVvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXQgb3VyIHZpZGVvIHN0cmVhbSBzdGF0ZSB2YXJpYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0gcmVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm90IEgyNjMgb3IgTVBFRy00IChIMjY0LCBldGMuKSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb01wMz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYz09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiBBTVItTkIsIEFBQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBNUDMgYXVkaW8gc3RyZWFtIGluIGlucHV0IGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciBhdWRpbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChhdWRpbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBPdXRwdXQgbWF4IEFVIHNpemUgaXMgZXF1YWwgdG8gaW5wdXQgbWF4IEFVIHNpemUgKHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIGNoYW5nZWQgaWYgdGhlcmUgaXMgYXVkaW8gdHJhbnNjb2RpbmcpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IEFNUi1OQiwgQUFDLCBNUDMgbm9yIEVWUkMgKEFNUi1XQiwgV0FWLi4uKSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyoqPCBlbmQgb2Ygd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKSAqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIHN0cmVhbSAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pICYmIChNNE9TQV9OVUxMID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgXAotICAgICAgICAgICAgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTSIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTTsKLSAgICB9Ci0KLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgaWYocEMtPlZpZGVvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZihwQy0+QXVkaW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCkKLSAgICB7Ci0gICAgICAgIC8vRVZSQwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMgIT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKHBDKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgYmVnaW4gY3V0IGRlY29kaW5nIGluY3JlbWVudCBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGZyYW1lIHJhdGUgKi8KLSAgICBpZiAoMC4gIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUpIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLiBcCi0gICAgICAgICAgICAvIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gMjAwOyAvKio8IGRlZmF1bHQgdmFsdWU6IDIwMCBtaWxsaXNlY29uZHMgKDMgZnJhbWVzIEAgMTVmcHMpKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBRF9CdWZmZXIgb3V0cHV0QnVmZmVyOwotICAgIHVpbnQzMl90IG9wdGlvblZhbHVlID0wOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzIDpzdGFydCIpOwotCi0gICAgLy8gRGVjb2RlIGZpcnN0IGF1ZGlvIGZyYW1lIGZyb20gY2xpcCB0byBnZXQgcHJvcGVydGllcyBmcm9tIGNvZGVjCi0KLSAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICAgICAmcEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sICYocEMtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6IG1fcEZjdENyZWF0ZUF1ZGlvRGVjIFwKLSAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UsIChNNE9TQV9EYXRhT3B0aW9uKSBwQy0+bV9wUmVhZGVyRGF0YUl0KTsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLCAoTTRPU0FfRGF0YU9wdGlvbikgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgIGlmKCBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICE9IE00T1NBX05VTEwgKSB7Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RTdGFydEF1ZGlvRGVjIFwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJm91dHB1dEJ1ZmZlciwgTTRPU0FfRkFMU0UpOwotCi0gICAgaWYgKCBlcnIgPT0gTTRXQVJfSU5GT19GT1JNQVRfQ0hBTkdFICkgewotCi0gICAgICAgIC8vIEdldCB0aGUgcHJvcGVydGllcyBmcm9tIGNvZGVjIG5vZGUKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscywgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICAvLyBSZXNldCBSZWFkZXIgc3RydWN0dXJlIHZhbHVlIGFsc28KLSAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKSB7Ci0KLSAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXM6XAotICAgICAgICAgICAgbV9wRmN0U3RlcEF1ZGlvRGVjIHJldHVybnMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgZnJlZShvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyk7Ci0KLSAgICAvLyBSZXNldCB0aGUgc3RyZWFtIHJlYWRlcgotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc3dpdGNoIChFbmNQYXJhbXMtPkZvcm1hdCkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9yTXBlZzRFbmMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jUGFyYW1zLT52aWRlb0xldmVsLCBFbmNQYXJhbXMtPkJpdHJhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50TGltaXRCaXRyYXRlUGVyQ29kZWNQcm9maWxlTGV2ZWw6IFwKLSAgICAgICAgICAgICAgICBXcm9uZyBlbmMgZm9ybWF0ICVkIiwgRW5jUGFyYW1zLT5Gb3JtYXQpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLQotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjY0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjoKLQotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTkyMDAwKSA/IDE5MjAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNzY4MDAwKSA/IDc2ODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyMDAwMDAwKSA/IDIwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDAwMDAwMCkgPyA0MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEwMDAwMDAwKSA/IDEwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNDAwMDAwMCkgPyAxNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMDApID8gMjAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDAwKSA/IDUwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMzUwMDAwMDApID8gMTM1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDAwMDApID8gMjQwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDoKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDgwMDAwKSA/IDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDFiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjAwMDApID8gMTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDExOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNDAwMDApID8gMjQwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0ODAwMDApID8gNDgwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDEzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA5NjAwMDApID8gOTYwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDI1MDAwMDApID8gMjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwKSA/IDUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI1MDAwMDApID8gMTI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE3NTAwMDAwKSA/IDE3NTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwMCkgPyAyNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjI1MDAwMDApID8gNjI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDU6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE2ODc1MDAwMCkgPyAxNjg3NTAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDMwMDAwMDAwMCkgPyAzMDAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBBVkMgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMGI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgTVBFRzQgcHJvZmlsZSBmb3Igbm93LgotICAgICAgICAgICAgLy8gUmV0dXJuIGlucHV0IGJpdHJhdGUKLSAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZEJpdHJhdGU7Ci19Ci0KLU00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKSB7Ci0KLSAgICBNNE9TQV9JbnQzMiB2aWRCaXRyYXRlID0gMDsKLQotICAgIHN3aXRjaCAocHJvZmlsZSkgewotICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgc3dpdGNoIChsZXZlbCkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMTA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDY0MDAwKSA/IDY0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWwyMDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTI4MDAwKSA/IDEyODAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMzA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciBIMjYzIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDg4ZGU2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BdWRpb0VmZmVjdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbEZ1bmN0aW9ucy5oIgotCi0vKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIGFuIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgc3RlcEVuY29kaW5nIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBNQ1MgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQykKLXsKLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICAqcEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgaWYocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPiBwQy0+dWlCZWdpbkN1dFRpbWUKLSAgICAmJiBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA8IHBDLT51aUVuZEN1dFRpbWUpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgb3V0cHV0UmVsYXRlZFRpbWUgPSAwOwotICAgICAgICBNNE9TQV9VSW50OCB1aUVmZmVjdEluZGV4ID0gMDsKLSAgICAgICAgb3V0cHV0UmVsYXRlZFRpbWUgPQotICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyAgLSBwQy0+dWlCZWdpbkN1dFRpbWUgKyAwLjUpOwotCi0gICAgICAgIGZvcih1aUVmZmVjdEluZGV4PTA7IHVpRWZmZWN0SW5kZXg8cEMtPm5iRWZmZWN0czsgdWlFZmZlY3RJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG91dHB1dFJlbGF0ZWRUaW1lID49Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPnBFZmZlY3RzW3VpRWZmZWN0SW5kZXhdLnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAob3V0cHV0UmVsYXRlZFRpbWUgPAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSArXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aUR1cmF0aW9uKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSB1aUVmZmVjdEluZGV4OwotICAgICAgICAgICAgICAgIHVpRWZmZWN0SW5kZXggPSBwQy0+bmJFZmZlY3RzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgKElOKSAgICAgRWZmZWN0IHByb2dyZXNzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZUluKCAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dCggTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MpCi17Ci0gICAgLyogd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGkzMnNhbXBsZTsKLQotICAgIC8qKgotICAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+IDEwMDApCi0gICAgewotICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwOwotICAgIH0KLSAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotCi0gICAgLyoqCi0gICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgIC8qKgotICAgICAqIExvb3Agb24gc2FtcGxlcyAqLwotICAgIHdoaWxlICh1aVBDTXNpemUtLT4wKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgIHsKLSAgICAgICAgaTMyc2FtcGxlID0gKnBQQ01kYXRhOwotICAgICAgICBpMzJzYW1wbGUgKj0gcFByb2dyZXNzLT51aVByb2dyZXNzOwotICAgICAgICBpMzJzYW1wbGUgLz0gMTAwMDsKLSAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19lZGl0QXVkaW9FZmZlY3RGY3RfRmFkZU91dDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTU0NDkyYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19Db2RlY3MuYwotICogQGJyaWVmICBNQ1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAvKiBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAvKiBJbnRlcm5hbCB0eXBlcyBvZiB0aGUgTUNTICovCi0KLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfVklERUNfM0dQCi0jaW5jbHVkZSAiTTRfTVBFRzRWSV9WaWRlb0hhbmRsZXIuaCIgIC8qbmVlZGVkIGZvciByZW5kZXJlciBlcnJvciBjb2RlcyovCi0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKCkKLSAqIEBicmllZiAgICBDbGVhciBlbmNvZGVycywgZGVjb2RlcnMsIHJlYWRlciBhbmQgd3JpdGVycyBpbnRlcmZhY2VzIHRhYmxlcwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBUaGUgY29udGV4dCBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tBdWRpb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGlzYXRpb24gdGhhdCB3aWxsIGFsbG93IHRvIGNoZWNrIGlmIHJlZ2lzdGVyaW5nIHR3aWNlICovCi0gICAgcEMtPm1fcFJlYWRlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gICA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgcEMtPm1fcEN1cnJlbnRWaWRlb0RlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYyA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbaV0gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICB0aGUgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCxwV3RyR2xvYmFsSW50ZXJmYWNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyV3JpdGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00V1JJVEVSX091dHB1dEZpbGVUeXBlIE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyV3JpdGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwV3RyRGF0YUludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk1DUzogTTRNQ1NfcmVnaXN0ZXJXcml0ZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCwgcFd0ckRhdGFJbnRlcmZhY2U9MHgleCIsIHBDLHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotICAgIGlmKChNZWRpYVR5cGUgPT0gTTRXUklURVJfa1Vua25vd24pIHx8IChNZWRpYVR5cGUgPj0gTTRXUklURVJfa1R5cGVfTkIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgbWVkaWEgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucEdsb2JhbEZjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBhIHdyaXRlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0gICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiVGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckVuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgKAotICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rVmlkZW9fTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGU6ICAgICAgICAgICAgICAgIChJTikgVGhlIG1lZGlhIHR5cGUuCi0gKiBAcGFyYW0gICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgdGhlIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBDID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNQ1M6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTUNTOiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LFwKLSAgICAgICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U9MHgleCIsIHBDLCBwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotICAgIGlmIChNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIGF1ZGlvIGVuY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSk7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0pOwotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckZsYWdbTWVkaWFUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBlbmNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckdsb2JhbEludGVyZmFjZSksCi0gICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE1DU19yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGdsb2JhbCBpbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJkckRhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBkYXRhIGludGVyZmFjZSIpOwotCi0gICAgaWYgKG1lZGlhVHlwZSA9PSBNNFJFQURFUl9rTWVkaWFUeXBlVW5rbm93biB8fCBtZWRpYVR5cGUgPj0gTTRSRUFERVJfa01lZGlhVHlwZV9OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogYSByZWFkZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gICA9IHBSZHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgdmlkZW8gZGVjb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSksIG9yIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlcjogaW52YWxpZCBwb2ludGVyIG9uIGRlY29kZXIgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiAoZGVjb2RlclR5cGUgPj0gTTRERUNPREVSX2tWaWRlb1R5cGVfTkIpCi0gICAgewotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgdmlkZW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgICAgICAvKiBhIGRlY29kZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiRGVjb2RlciBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSNlbHNlIC8qIGV4dGVybmFsIGRlY29kZXJzIGFyZSBwb3NzaWJsZSAqLwotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZGVjb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGRlY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGRlY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIC8qIG9oLCBhbmQgZG9uJ3QgZm9yZ2V0IHRoZSB1c2VyIGRhdGEsIHRvby4gKi8KLSAgICAgICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IHBEZWNvZGVySW50ZXJmYWNlOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgLyogVGhlIGFjdHVhbCB1c2VyRGF0YSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZGVjb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjKys7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIE1DUyB0bwotICogICAgICAgICAgICAgIHJlZ2lzdGVyIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgQXVkaW8gZGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyApOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa1ZpZGVvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSApOwotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFJFQURFUl9rTWVkaWFUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFJlYWRlcnMgPSAwOwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRGVjb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRBRF9rVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qRG9uJ3QgZnJlZSBleHRlcm5hbCBhdWRpbyBkZWNvZGVycyBpbnRlcmZhY2VzKi8KLSAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCB3cml0ZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSB3cml0ZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICB3cml0ZXJUeXBlID0gTTRXUklURVJfazNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcEMtPmJfaXNSYXdXcml0ZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2tQQ007Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucEdsb2JhbEZjdHM7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IHBDLT5Xcml0ZXJJbnRlcmZhY2Vbd3JpdGVyVHlwZV0ucERhdGFGY3RzOwotCi0gICAgaWYgKHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMIHx8IHBDLT5wV3JpdGVyRGF0YUZjdHMgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEVOQ09ERVJfRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0gcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGVuY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLS8vICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0VWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoKQotICogQGJyaWVmICAgIFNldCBjdXJyZW50IHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlICAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00UkVBREVSX01lZGlhVHlwZSByZWFkZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVBTVI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgICAgICAgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJSZWFkZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgaWYgKHBDLT5tX3BWaWRlb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoIChtZWRpYVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0vL0VWUkMKLS8vICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLS8vICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlRVZSQzsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiQXVkaW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMxY2E4Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCi0gKiBAYnJpZWYgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHN1YnNjcmlwdGlvbiBvZiBzdXBwb3J0ZWQgbWVkaWEKLSAqICAgICAgICAgcmVhZGVycyBhbmQgZGVjb2RlcnMgZm9yIHRoZSBNQ1MuIFBvdGVudGlhbCBzdXBwb3J0IGNhbgotICogICAgICAgICBiZSBhY3RpdmF0ZWQgb3IgZGUtYWN0aXZhdGVkCi0gKiAgICAgICAgIHVzaW5nIGNvbXBpbGF0aW9uIGZsYWdzIHNldCBpbiB0aGUgcHJvamVjdHMgc2V0dGluZ3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgTUNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBtb2R1bGUgKi8KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogUmVhZGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSByZWFkZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHJlYWRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpbmNsdWRlICJWaWRlb0VkaXRvcjNncFJlYWRlci5oIgotI2VuZGlmCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jZW5kaWYKLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfUENNCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX01QMwotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00gKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfQU1SICovCi0KLS8qIEluY2x1ZGUgZmlsZXMgZm9yIGVhY2ggd3JpdGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9QQ01fZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfTVAzX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHZpZGVvIGVuY29kZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0vLyNpbmNsdWRlICJNNE1QNEVfaW50ZXJmYWNlLmgiCi0jZW5kaWYKLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgXAotICAgIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcmVhZGVyLCBkZWNvZGVycywgd3JpdGVycyBhbmQgZW5jb2RlcnMKLSAqICAgICAgICAgIGluIHRoZSBNQ1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgICAgIHJlYWRlck1lZGlhVHlwZTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSAgICAgd3JpdGVyTWVkaWFUeXBlOwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgICBwV3JpdGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICBhdWRpb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCAgICAgICBhdWRpb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqIHBBdWRpb0NvZGVjSW50ZXJmYWNlOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSAgICAgICAgIHZpZGVvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgIHZpZGVvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICBwVmlkZW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgcFZpZGVvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgcmVhZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSAzR1AgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSAgICBlcnIgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotICAgIGVyciA9IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKCAgICZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoJnJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVAzIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgJiBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNERFQ09ERVJfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUEVHNCBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFQ18zR1AgKi8KLQotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFT19BVkMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCAmdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKikmcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0FWQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciggICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIEFWQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9WSURFT19BVkMgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgQU1STkIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFNUk5CIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMKLQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFBQyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRGVjb2RlciggICBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBISUxJUFMgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIE1QMyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzICovCi0KLSAgICAvKiAtLS0gRVZSQyAtLS0gKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLQotICAgIC8qIC0tLSAzR1BQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotICAgIC8qIHJldHJpZXZlcyB0aGUgM0dQUCB3cml0ZXIgbWVkaWEgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCAgICZ3cml0ZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRXUklURVJfM0dQIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gTVBFRzQgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIE1QRUc0IGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggICBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgIC8qIHJldHJpZXZlcyB0aGUgSDI2MyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgmdmlkZW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00SDI2NEUgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gSDI2NCBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQyAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUgotICAgICAgIC8qIHJldHJpZXZlcyB0aGUgQU1SIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggICBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgYXVkaW8gQU1SIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SICovCi0KLSAgICAvKiAtLS0gQUFDIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQwotICAgIC8qIHJldHJpZXZlcyB0aGUgQUFDIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMwotICAgIC8qIHJldHJpZXZlcyB0aGUgTVAzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDNFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIE1QMyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QMyAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ5ZjY4ZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBlbmNvZGVyIGNhbGxiYWNrIG9mIHRoZSBNQ1MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgICAgICAgLyogT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAvKiBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0vKiBDb3JlIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIFZpZGVvIHByZXByb2Nlc3NpbmcgaW50ZXJmYWNlIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLQotLyoqCi0gKiBWaWRlbyBmaWx0ZXJzICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIgLyoqPCBmb3IgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAoKSAqLwotCi0jaWZuZGVmIE00TUNTX0FVRElPT05MWQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLS8qKi8KLQotCi0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIERvIHRoZSB2aWRlbyByZW5kZXJpbmcgYW5kIHRoZSByZXNpemUgKGlmIG5lZWRlZCkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNQ1MgaW50ZXJuYWwgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9WSURFT19ERUNPREVfRVJST1I6IHRoZSB2aWRlbyBkZWNvZGluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRNQ1NfRVJSX1JFU0laRV9FUlJPUjogdGhlIHJlc2l6aW5nIGZhaWxlZAotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRBcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0vKiBUaGlzIHBhcnQgaXMgdXNlZCBvbmx5IGlmIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAvKioKLSAgICAgKiBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE1DUyBjb250ZXh0ISAqLwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgTTRfTWVkaWFUaW1lIG10Q3RzID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIENsb3NpbmcgYWZ0ZXIgYW4gZXJyb3Igb2NjdXJlZCwgaXQgbWF5IGhhcHBlbiB0aGF0IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGhhcwotICAgICAqIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQuIFdoZW4gY2xvc2luZyBpbiBwYXVzZSBtb2RlLCB0aGUgZGVjb2RlciBjYW4gYmUgbnVsbC4KLSAgICAgKiBXZSBkb24ndCB3YW50IGFuIGVycm9yIHRvIGJlIHJldHVybmVkIGJlY2F1c2UgaXQgd291bGQgaW50ZXJydXB0IHRoZSBjbG9zZSBwcm9jZXNzIGFuZAotICAgICAqIHRodXMgc29tZSByZXNvdXJjZXMgd291bGQgYmUgbG9ja2VkLiBTbyB3ZSByZXR1cm4gTTROT19FUlJPUi4KLSAgICAgKi8KLSAgICAvKiBJbml0aWFsaXplIHRvIGJsYWNrIHBsYW5lIHRoZSBvdXRwdXQgcGxhbmUgaWYgdGhlIG1lZGlhIHJlbmRlcmluZwotICAgICBpcyBibGFjayBib3JkZXJzICovCi0gICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMV0ucGFjX2RhdGEsVV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0KnBQbGFuZU91dFsxXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0KnBQbGFuZU91dFsyXS51X3N0cmlkZSkpOwotICAgIH0KLSAgICBlbHNlIGlmICgoTTRPU0FfTlVMTCA9PSBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSB8fAotICAgICAgICAgICAgIChNNE9TQV9OVUxMID09IHBDLT5wVmlEZWNDdHh0KSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAgKiBlbmNvZGluZyBub2lzZSBsZWFkcyB0byBhIGh1Z2UgdmlkZW8gQVUsIGFuZCB0aHVzIGEgd3JpdGVyIGJ1ZmZlciBvdmVyZmxvdy4gKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfc3RyaWRlICogcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfc3RyaWRlICogcFBsYW5lT3V0WzJdLnVfaGVpZ2h0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHBSZWFkZXJWaWRlb0FVLT5tX2RhdGFBZGRyZXNzIGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZihwQy0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogICAgbV9wUHJlUmVzaXplRnJhbWUgZGlmZmVyZW50IHRoYW4gTTRPU0FfTlVMTCBtZWFucyB0aGF0IHJlc2l6aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiogRkIgMjAwOC8xMC8yMDoKLSAgICAgICAgICAgIFVzZWQgZm9yIGNyb3BwaW5nIGFuZCBibGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgIE00QUlSX1BhcmFtcyBQYXJhbXM7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBcHBseVZQUDogTmVlZCB0byByZXNpemUiKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwgJm10Q3RzLAotICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogbV9wRmN0UmVuZGVyIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rUmVzaXppbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLiBGcm9tIHRoZSBpbnRlcm1lZGlhdGUgZnJhbWUgdG8gdGhlIGVuY29kZXIKLSAgICAgICAgICAgICAgICAgKiBpbWFnZSBwbGFuZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUsIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBNNFZpRmlsUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZVRlbXA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lVSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVWID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lViA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGkgPSAwOwotCi0gICAgICAgICAgICAgICAgLypGQiAyMDA4LzEwLzIwOiB0byBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgICAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlcyBwbGFuIGluIGxvY2FsIGltYWdlIHBsYW5lIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMF1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyWSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyVSIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBJbWFnZVBsYW5lc1RlbXBbMl1cCi0gICAgICAgICAgICAgICAgICAgICAgICAudV93aWR0aCAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJWIikgOwotICAgICAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBNNE1DU19pbnRBcHBseVZQUCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVYgPSBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhIDsKLQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgpIDw9IHBQbGFuZU91dC0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgd2lkdGggc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwUGxhbmVPdXQtPnVfaGVpZ2h0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKT4+MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoLVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPT0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQ3JvcHBpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9jb25maWd1cmUocEMtPm1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEFJUl9nZXQocEMtPm1fYWlyX2NvbnRleHQsIHBDLT5wUHJlUmVzaXplRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXApOwotICAgICAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBnZXR0aW5nIEFJUiBwbGFuZTogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMF0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVZICs9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lVSArPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lViArPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IERvbid0IG5lZWQgcmVzaXppbmciKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcihwQy0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXRDdHMsIHBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5sYXN0RGVjb2RlZFBsYW5lID0gcFBsYW5lT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzBdLnVfd2lkdGgpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCAqIHBQbGFuZU91dFsxXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMl0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMl0udV93aWR0aCkpOwotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjYWExNWIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidnNzCi0jCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfY29yZQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFBUTzNHUFBfQVBJLmMgXAotICAgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIFwKLSAgICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTR4VlNTX0FQSS5jIFwKLSAgICAgIE00eFZTU19pbnRlcm5hbC5jIFwKLSAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZy5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwLmMgXAotICAgICAgTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIFwKLSAgICAgIE00VlNTM0dQUF9Db2RlY3MuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdC5jIFwKLSAgICAgIE00VlNTM0dQUF9FZGl0QXVkaW8uYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdFZpZGVvLmMgXAotICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYyBcCi0gICAgICBNNENoYW5uZWxDb252ZXJ0ZXIuYyBcCi0gICAgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jIFwKLSAgICAgIE00QUlSX0FQSS5jIFwKLSAgICAgIE00UkVBREVSX1BjbS5jIFwKLSAgICAgIE00UENNUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRBRF9OdWxsLmMgXAotICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuYyBcCi0gICAgICBNNFJFQURFUl9BbXIuYyBcCi0gICAgICBNNFZEX1Rvb2xzLmMgXAotICAgICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIuY3BwIFwKLSAgICAgIE00REVDT0RFUl9OdWxsLmMKLQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJhdWRpb2ZsaW5nZXIgICAgICAgICAgICAgXAotICAgIGxpYmF1ZGlvdXRpbHMgICAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3JfdmlkZW9maWx0ZXJzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgICAgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9tY3MgXAotICAgIGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl8zZ3B3cml0ZXIgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9zeXN0ZW0vbWVkaWEvYXVkaW9fZWZmZWN0cy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUKLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0KLSMgQWxsIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHdlIGxpbmsgYWdhaW5zdC4KLUxPQ0FMX0xETElCUyA6PSBcCi0gICAgLWxwdGhyZWFkIC1sZGwKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIFwKLSAgICAtRE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0VubyBcCi0gICAgLURERUNPREVfR0lGX09OX1NBVklORwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2QxZWM3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QURfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNEFEX051bGwuYwotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE1QMyBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgIm51bGwiIGF1ZGlvIGRlY29kZXIsIHRoYXQgaXMgYSBkZWNvZGVyCi0gKiAgICAgICAgICB0aGF0IGRvIG5vdGhpbmcgZXhjZXB0IGdldHRpbmcgQVUgZnJvbSB0aGUgcmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRBRF9OdWxsLmgiCi0KLSNkZWZpbmUgTTRBRF9GT1JDRV8xNkJJVFMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOVUxMIEF1ZGlvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRBRF9OVUxMX01BSk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX01JTk9SICAgIDEKLSNkZWZpbmUgTTRBRF9OVUxMX1JFVklTSU9OIDQKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9OdWxsQ29udGV4dAotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBudWxsIGRlY29kZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciBwcm92aWRlZCBieSB0aGUgdXNlciAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgbV9wQXVkaW9TdHJlYW1oYW5kbGVyOwotfSBNNEFEX051bGxDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlhQIE1QMyBkZWNvZGVyIGZ1bmN0aW9ucyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKE9VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhOiAgICAgICAgKElOKSAgICBQb2ludGVyIHRvIFVzZXIgZGF0YQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9jcmVhdGUoICBNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEM7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QURfTlVMTF9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIHBvaW50ZXIgcFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHBDID0gKE00QURfTnVsbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBRF9OdWxsQ29udGV4dCksCi0gICAgICAgICAgICAgICAgIE00REVDT0RFUl9BVURJTywgKE00T1NBX0NoYXIgKikiTTRBRF9OdWxsQ29udGV4dCIpOwotICAgIGlmIChwQyA9PSAoTTRBRF9OdWxsQ29udGV4dCopMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJDYW4gbm90IGFsbG9jYXRlIG51bGwgZGVjb2RlciBjb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIHBDLT5tX3BBdWRpb1N0cmVhbWhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZXN0cm95cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIG51bGwgZGVjb2RlcgotICogQG5vdGUgICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9kZXN0cm95KE00QURfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDID0gKE00QURfTnVsbENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKGNvbnRleHQgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwgIk00QURfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQiKTsKLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2ltcGx5IG91dHB1dCB0aGUgZ2l2ZW4gYXVkaW8gZGF0YQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIHBJbnB1dEJ1ZmZlcjogICAgIChJTi9PVVQpSW5wdXQgRGF0YSBidWZmZXIuIEl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBhdWRpbyBmcmFtZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIHVwZGF0ZWQgaW5zaWRlIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZWZsZWN0IHRoZSBzaXplIG9mIHRoZSBhY3R1YWxseSBkZWNvZGVkIGRhdGEuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRoZSBmaXJzdCBmcmFtZSBpbiBwSW5wdXRCdWZmZXIpCi0gKiBAcGFyYW0gICBwRGVjb2RlZFBDTUJ1ZmZlcjogKE9VVCkgIE91dHB1dCBQQ00gYnVmZmVyIChkZWNvZGVkIGRhdGEpLgotICogQHBhcmFtICAganVtcGluZzogICAgICAgICAgIChJTikgICBNNE9TQV9UUlVFIGlmIGEganVtcCB3YXMganVzdCBkb25lLCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfc3RlcChNNEFEX0NvbnRleHQgY29udGV4dCwgTTRBRF9CdWZmZXIgKnBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0J1ZmZlciAqcERlY29kZWRQQ01CdWZmZXIsIE00T1NBX0Jvb2wganVtcGluZykKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQyA9IChNNEFEX051bGxDb250ZXh0Kiljb250ZXh0OwotCi0gICAgLypUaGUgVlBTIHNlbmRzIGEgemVybyBidWZmZXIgYXQgdGhlIGVuZCovCi0gICAgaWYgKDAgPT0gcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBpZiAocElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPiBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9idWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0jaWZkZWYgTTRBRF9GT1JDRV8xNkJJVFMKLSAgICAvKmlmIHJlYWQgc2FtcGxlcyBhcmUgOCBiaXRzLCBjb21wbGV0ZSB0aGVtIHRvIDE2IGJpdHMqLwotICAgIGlmIChwQy0+bV9wQXVkaW9TdHJlYW1oYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID09IDEpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAgICAgTTRPU0FfSW50MTYgIHZhbDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsID0gKE00T1NBX0ludDE2KSgoTTRPU0FfVUludDgpKHBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpXSkgLSAxMjgpOwotCi0gICAgICAgICAgICBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpKjJdICAgPSAoTTRPU0FfSW50OCkodmFsPj44KTsKLSAgICAgICAgICAgIHBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzW2kqMisxXSA9IChNNE9TQV9JbnQ4KSh2YWwmMHgwMGZmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzcywgKHZvaWQgKilwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplICk7Ci0gICAgfQotI2Vsc2UgLypNNEFEX0ZPUkNFXzE2QklUUyovCi0gICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwotI2VuZGlmIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyB0aGUgZGVjb2RlciB2ZXJzaW9uCi0gKiBAbm90ZSAgICBUaGUgdmVyc2lvbiBpcyBnaXZlbiBpbiBhIE00X1ZlcnNpb25JbmZvIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChPVVQpICAgICAgIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gc3RydWN0dXJlCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIHBWZXJzaW9uSW5mbyBwb2ludGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgIE00QURfTlVMTF9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVmVyc2lvbkluZm8gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00QURfTlVMTF9nZXRWZXJzaW9uOiBpbnZhbGlkIHBvaW50ZXIgcFZlcnNpb25JbmZvIik7Ci0KLSAgICAvKiBVcCB1bnRpbCBub3csIHRoZSBudWxsIGRlY29kZXIgdmVyc2lvbiBpcyBub3QgYXZhaWxhYmxlICovCi0KLSAgICAvKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgICA9IE00QURfTlVMTF9NQUpPUjsgICAgICAvKm1ham9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgICA9IE00QURfTlVMTF9NSU5PUjsgICAgICAvKm1pbm9yIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgID0gTTRBRF9OVUxMX1JFVklTSU9OOyAgICAvKnJldmlzaW9uIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudCovCi0gICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBnZXRJbnRlcmZhY2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgb2YgTlhQIE1QMyBkZWNvZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBwb2ludGVyIG9uIGFuIE00QURfVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlIHN1cHBvcnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogYWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgaWYgT0sKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBRF9OVUxMX2dldEludGVyZmFjZSggTTRBRF9UeXBlICpwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgKnBEZWNvZGVySW50ZXJmYWNlID0gKCAgTTRBRF9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00QURfSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfSW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwRGVjb2RlckludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gTTRBRF9rVHlwZVBDTTsKLQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyAgICAgICA9IE00QURfTlVMTF9jcmVhdGU7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgICAgID0gTTRBRF9OVUxMX2Rlc3Ryb3k7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgICAgID0gTTRBRF9OVUxMX3N0ZXA7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldFZlcnNpb25BdWRpb0RlYyAgID0gTTRBRF9OVUxMX2dldFZlcnNpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0YXJ0QXVkaW9EZWMgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjICAgID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjI4OTdiMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QUlSX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNEFJUl9BUEkuYwotICogQGJyaWVmICBBcmVhIG9mIEludGVyZXN0IFJlc2l6ZXIgIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jZGVmaW5lIE00QUlSX1lVVjQyMF9GT1JNQVRfU1VQUE9SVEVECi0jZGVmaW5lIE00QUlSX1lVVjQyMEFfRk9STUFUX1NVUFBPUlRFRAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QSUxBVElPTiBDSEVDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I1NjVfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9CR1I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9SR0I4ODhfRk9STUFUX1NVUFBPUlRFRAotI2lmbmRlZiBNNEFJUl9KUEdfRk9STUFUX1NVUFBPUlRFRAotCi0jZXJyb3IgIlBsZWFzZSBkZWZpbmUgYXQgbGVhc3Qgb25lIGlucHV0IGZvcm1hdCBmb3IgdGhlIEFJUiBjb21wb25lbnQiCi0KLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5DTFVERVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIElOVEVSTkFMIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICBNNEFJUl9TdGF0ZXMKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFJUl9rQ3JlYXRlZCwgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY3JlYXRlIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIE00QUlSX2tDb25maWd1cmVkICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jb25maWd1cmUgaGFzIGJlZW4gY2FsbGVkICovCi19TTRBSVJfU3RhdGVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX1N0YXRlcyAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAvKio8IEludGVybmFsIHN0YXRlICovCi0gICAgTTRBSVJfSW5wdXRGb3JtYXRUeXBlICAgbV9pbnB1dEZvcm1hdDsgIC8qKjwgSW5wdXQgZm9ybWF0IGxpa2UgWVVWNDIwUGxhbmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgIC8qKjwgQ3VycmVudCBpbnB1dCBQYXJhbWV0ZXIgb2YgIHRoZSBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfaW5jWzRdOyAgIC8qKjwgcmF0aW8gYmV0d2VlbiBpbnB1dCBhbmQgb3VwdXQgd2lkdGggZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2luY1s0XTsgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgaG9yaXpvbnRhbCBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnRbNF07ICAgIC8qKjwgVmVydGljYWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtWzRdOyAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgLyoqPCBTYXZlIG9mIGlucHV0IHBsYW5lIHBvaW50ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAvKio8IE51bWJlciBvZiBwcm9jZXNzZWQgcm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzdHJpcGUgbW9kZSBvbmx5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JPbmx5Q29weTsgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JGbGlwWDsgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYkZsaXBZOyAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgcHJvY2Vzc2luZyBvcmRlciBpbiBZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iUmV2ZXJ0WFk7ICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBYIGFuZCBZIHByb2Nlc3Npbmcgb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKy05MLAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpXAotICAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgUFVCTElDIEFQSSBJTVBMRU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgKElOL09VVCkgQWRkcmVzcyBvZiB0aGUgY29udGV4dCB0byBjcmVhdGUKLSAqIEBwYXJhbSAgICBpbnB1dEZvcm1hdDogICAoSU4pIGlucHV0IGZvcm1hdCB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLiBJbnZhbGlkIGZvcm1hdFR5cGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiA7Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IE00T1NBX05VTEwgOwotCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgYWRkcmVzcyBvbiB0aGUgY29udGV4dCBpcyBub3QgTlVMTCAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgLyogSW50ZXJuYWwgQ29udGV4dCBjcmVhdGlvbiAqLwotICAgIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNEFJUl9JbnRlcm5hbENvbnRleHQpLAotICAgICAgICAgTTRBSVIsKE00T1NBX0NoYXIgKikiQUlSIGludGVybmFsIGNvbnRleHQiKSA7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIHBDKSA7Ci0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBmb3JtYXQgaXMgc3VwcG9ydGVkICovCi0gICAgc3dpdGNoKGlucHV0Rm9ybWF0KQotICAgIHsKLSNpZmRlZiBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00QUlSX2tZVVY0MjBQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSNpZmRlZiBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwQVA6Ci0gICAgICAgIGJyZWFrIDsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOwotICAgICAgICAgICAgZ290byBNNEFJUl9jcmVhdGVfY2xlYW51cCA7Ci0gICAgfQotCi0gICAgLyoqPCBTYXZlIGlucHV0IGZvcm1hdCBhbmQgdXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1faW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKLSAgICBwQy0+bV9zdGF0ZSA9IE00QUlSX2tDcmVhdGVkOwotCi0gICAgLyogUmV0dXJuIHRoZSBjb250ZXh0IHRvIHRoZSBjYWxsZXIgKi8KLSAgICAqcENvbnRleHQgPSBwQyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLU00QUlSX2NyZWF0ZV9jbGVhbnVwOgotICAgIC8qIEVycm9yIG1hbmFnZW1lbnQgOiB3ZSBkZXN0cm95IHRoZSBjb250ZXh0IGlmIG5lZWRlZCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMpCi0gICAgewotICAgICAgICBmcmVlKHBDKSA7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gZXJyIDsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLgotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dCA7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoKE00QUlSX2tDcmVhdGVkICE9IHBDLT5tX3N0YXRlKSYmKE00QUlSX2tDb25maWd1cmVkICE9IHBDLT5tX3N0YXRlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0gICAgZnJlZShwQykgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgIGFuZCBpbmRpY2F0ZXMgaWYgd2Ugd2lsbCBwcm9jZWVkIGluIHN0cmlwZSBvciBub3QuCi0gKiAgICAgICAgICBJbiBjYXNlIGEgTTRBSVJfZ2V0IGluIHN0cmlwZSBtb2RlIHdhcyBvbiBnb2luZywgaXQgd2lsbCBjYW5jZWwgdGhpcyBwcmV2aW91cwotICogICAgICAgICAgcHJvY2Vzc2luZyBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgIGlmKCAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpICAgIHx8Ci0gICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotICAgIGlmKCgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAmJigocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpKQotICAgIHsKLSAgICAgICAgLyoqPCBObyByZXNpemUgaW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGp1c3QgY29weSBpbnB1dCBpbiBvdXRwdXQgKi8KLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm1fYk9ubHlDb3B5ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGludGVybmFsIHZhcmlhYmxlcyB1c2VkIGZvciByZXNpemUgZmlsdGVyICovCi0gICAgICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHUzMl93aWR0aF9pbiA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl9oZWlnaHRfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLQotICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIDB4MTAwMDApIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9pbmNbaV0gICA9ICh1MzJfd2lkdGhfaW4gKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogMHgxMDAwMCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9pbmNbaV0gPSAodTMyX2hlaWdodF9pbiAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9pbmNbaV0gPj0gMHgxMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl95X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFkgY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgMCBhbmQgMC41Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3hfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSBwQy0+dTMyX3hfaW5jW2ldICYgMHhmZmZmOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAweDEwMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID4+PSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IFRha2UgaW50byBhY2NvdW50IHRoYXQgWCBjb29yZGluYXRlIGNhbiBiZSBvZGQKLSAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gcHV0IGEgMC41IG9mZnNldAotICAgICAgICAgICAgICAgICAgICBmb3IgVSBhbmQgViBwbGFuZSBhcyB0aGVyZSBhIDIgdGltZXMgc3ViLXNhbXBsZWQgdnMgWSovCi0gICAgICAgICAgICAgICAgaWYoKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94JjB4MSkmJigoaT09MSl8fChpPT0yKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV0gKz0gMHg4MDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgUmVzZXQgdmFyaWFibGUgdXNlZCBmb3Igc3RyaXBlIG1vZGUgKi8KLSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0KLSAgICAvKio8IEluaXRpYWxpemUgdmFyIGZvciBYL1kgcHJvY2Vzc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gKi8KLSAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9GQUxTRTsKLSAgICBzd2l0Y2gocFBhcmFtcy0+bV9vdXRwdXRPcmllbnRhdGlvbikKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8KLSAqICAgICAgICAgIHNldHRpbmdzICBwcm92aWRlZCBpbiBNNEFJUl9jb25maWd1cmUuCi0gKiBAbm90ZSAgICBJbiBjYXNlIHRoZSBpbnB1dCBmb3JtYXQgdHlwZSBpcyBKUEVHLCBpbnB1dCBwbGFuZShzKQotICogICAgICAgICAgaW4gcEluIGlzIG5vdCB1c2VkLiBJbiBub3JtYWwgbW9kZSwgZGltZW5zaW9uIHNwZWNpZmllZCBpbiBvdXRwdXQgcGxhbmUocykgc3RydWN0dXJlCi0gKiAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seSB0aGUKLSAqICAgICAgICAgIHdpZHRoIHdpbGwgYmUgdGhlIHNhbWUsIGhlaWdodCB3aWxsIGJlIHRha2VuIGFzIHRoZSBzdHJpcGUgaGVpZ2h0ICh0eXBpY2FsbHkgMTYpLgotICogICAgICAgICAgSW4gbm9ybWFsIG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBvbmNlIHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgcGljdHVyZS4KLSAqICAgICAgICAgIEluIHN0cmlwZSBtb2RlLCBpdCBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4KLSAqICAgICAgICAgIHJldHJpZXZlZCxhbmQgIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3V0cHV0IHN0cmlwZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUKLSAqICAgICAgICAgIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgQW55IGNhbGwgdG8gTTRBSVJfY29uZmlndXJlIGR1cmluZyBzdHJpcGUgcHJvY2VzcyB3aWxsIHJlc2V0IHRoaXMgb25lIHRvIHRoZQotICogICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgIHBPdXQ6ICAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiAgICBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSlcCi0gICAgICAgICAgICB8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgXAotICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV94Pj51MzJfc2hpZnQpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feSA+PiB1MzJfc2hpZnQpICogcEluW2ldLnVfc3RyaWRlOwotCi0gICAgICAgICAgICAvKiogR28gYXQgZW5kIG9mIGxpbmUvY29sdW1uIGluIGNhc2UgWC9ZIHNjYW5uaW5nIGlzIGZsaXBwZWQgKi8KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj51MzJfc2hpZnQpIC0xIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9ICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj51MzJfc2hpZnQpIC0xKVwKLSAgICAgICAgICAgICAgICAgICAgICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQKLSAgICAgICAgICAgICAgICAgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucwotICAgICAgICAgICAgYXJlIHRoZSBzYW1lICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwSW5baV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gLT0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHBpeGVsIG9mIDEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAqcHU4X2RhdGFfaW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luICs9IHBPdXRbaV0udV93aWR0aCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IEhlcmUgd2UgaGF2ZSBhICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAgIC8qKjwgb3RoZXIgdGhhbiBhbHBoYSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtICh1MzJfeF9hY2N1bSA+PiAxNikpIC0xIDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl95X2FjY3VtW2ldPj4xNikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3lfYWNjdW1baV0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gKz0gcEMtPnUzMl94X2luY1tpXTsKLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luX29yZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0vKiogMyAhPSBpICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvKipObyArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8qKjwgTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZAotICAgICAgICAgd2l0aCB0aGUgd2hvbGUgcHJvY2Vzc2luZyAqLwotICAgIHBDLT5tX3Byb2NSb3dzICs9IHBPdXRbMF0udV9oZWlnaHQ7Ci0gICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA8PSBwQy0+bV9wcm9jUm93cykgICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBTVJSX0NvcmVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjMwZjlkYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMKLSAqIEBicmllZiAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBBTVIgcGFyc2VyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgSW1wbGVtZW50YXRpb24gZm9yCi0gKiAgICAgICAgICAgICAgQU1SIFBhcnNlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE1heGltdW0gYml0cmF0ZSBwZXIgYW1yIHR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9OQl9NQVhfQklUX1JBVEUgICAgMTIyMDAKLSNkZWZpbmUgTTRBTVJSX1dCX01BWF9CSVRfUkFURSAgICAyMzg1MAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgY29udGV4dCBJRAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRBTVJSX0NPTlRFWFRJRCAgICAweDQxNGQ1MjUyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQW4gQU1SIGZyYW1lIGlzIDIwbXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9GUkFNRV9MRU5HVEggICAgIDIwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRm9yIHRoZSBzZWVrLCB0aGUgZmlsZSBpcyBzcGxpdHRlZCBpbiA0MCBzZWdtZW50cyBmb3IgZmFzdGVyIHNlYXJjaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgICAgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgNDAKLQotI2RlZmluZSBNNEFNUlJfTkJfU0FNUExFX0ZSRVFVRU5DWSA4MDAwICAgICAgICAvKio8IE5hcnJvdyBiYW5kIHNhbXBsaW5nIHJhdGUgKi8KLSNkZWZpbmUgTTRBTVJSX1dCX1NBTVBMRV9GUkVRVUVOQ1kgMTYwMDAgICAgLyoqPCBXaWRlIGJhbmQgc2FtcGxpbmcgcmF0ZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgdmVyc2lvbiBudW1iZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX01JTk9SIDExCi0jZGVmaW5lIE00QU1SUl9WRVJTSU9OX1JFVklTSU9OIDMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQU1SUl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIEFNUiByZWFkZXIgY29udGV4dCBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX2NvbnRleHRJZCA7ICAgICAgLyogRml4ZWQgSWQuIHRvIGNoZWNrIGZvciB2YWxpZCBDb250ZXh0Ki8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgbV9wT3NhRmlsZVB0ckZjdDsgIC8qIEZpbGUgZnVuY3Rpb24gcG9pbnRlciAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBtX3BTdHJlYW1IYW5kbGVyOyAgLyogU3RyZWFtIERlc2NyaXB0aW9uICovCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgIG1fcFNlZWtJbmRleDsgICAgICAvKiBTZWVrIEluZGV4IFRhYmxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIG1fc2Vla0ludGVydmFsOyAgICAvKiBTdG9yZXMgdGhlIHNlZWsgSW50ZXJ2YWwgc3RvcmVkIGluIHRoZSBJbmRleCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX21heEF1U2l6ZTsgICAgICAgLyogU3RvcmVzIHRoZSBtYXggQXUgU2l6ZSAqLwotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICBtX3BkYXRhQWRkcmVzczsgICAgLyogUG9pbnRlciB0byBzdG9yZSBBVSBkYXRhICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgIG1fc3RyZWFtVHlwZTsgICAgICAvKiBTdG9yZXMgdGhlIHN0cmVhbSB0eXBlIEFNUiBOQiBvciBXQiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX3BBTVJGaWxlOyAgICAgICAgLyogRGF0YSBzdG9yYWdlICovCi0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgIG1fc3RhdHVzOyAgICAgICAgICAvKiBBTVIgUmVhZGVyIFN0YXR1cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUqLwotfSBNNF9BTVJSX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGFyc2VyIGludGVybmFsIGZ1bmN0aW9ucywgbm90IHVzYWJsZSBmcm9tIG91dHNpZGUgdGhlIHJlYWRlciBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQVUgc2l6ZSBvZiB0aGUgRnJhbWUKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzdHJlYW0gdHlwZSBhbmQgdGhlIGZyYW1ldHlwZSBhbmQgcmV0dXJucyB0aGUKLSAqICAgICAgICAgICBmcmFtZSBsZW5naHQKLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSBzaXplIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEF1U2l6ZShNNE9TQV9VSW50MzIgZnJhbWVUeXBlLCAgTTRTWVNfU3RyZWFtVHlwZSBzdHJlYW1UeXBlKQotewotICAgIGNvbnN0IE00T1NBX1VJbnQzMiAgICBNNEFNUlJfTkJfQVVTSVpFW109ezEzLDE0LDE2LDE4LDIwLDIxLDI3LDMyLDYsNiw2fTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0FVU0laRVtdPXsxOCwyNCwzMywzNyw0MSw0Nyw1MSw1OSw2MSw2fTsKLQotICAgIGlmICggc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX05CX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLSAgICBlbHNlIC8qIE00U1lTX2tBTVJfV0IgKi8KLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX1dCX0FVU0laRVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLSAqIEBicmllZiAgICBJbnRlcm5hbCBmdW5jdGlvbiB0byB0aGUgQU1SIFBhcnNlciwgcmV0dXJucyB0aGUgQml0IHJhdGUgb2YgdGhlIEZyYW1lCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZSBmcmFtZXR5cGUgYW5kIHJldHVybnMgdGhlCi0gKiAgICAgICAgICAgYml0IHJhdGUgZm9yIHRoZSBnaXZlbiBmcmFtZS4KLSAqIEBwYXJhbSAgICBmcmFtZVR5cGUoSU4pICAgIDogQU1SIGZyYW1lIHR5cGUKLSAqIEBwYXJhbSAgICBzdHJlYW1UeXBlKElOKSAgICA6IEFNUiBzdHJlYW0gdHlwZSBOQiBvciBXQgotICogQHJldHVybnMgIFRoZSBmcmFtZSdzIGJpdCByYXRlIGJhc2VkIG9uIHRoZSBmcmFtZSB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9VSW50MzIgICAgTTRBTVJSX2dldEJpdHJhdGUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLXsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX05CX0JJVFJBVEVbXT0KLSAgICAgICAgezQ3NTAsNTE1MCw1OTAwLDY3MDAsNzQwMCw3OTUwLDEwMjAwLDEyMjAwLDEyMjAwLDEyMjAwLDEyMjAwfTsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX1dCX0JJVFJBVEVbXT0KLSAgICAgICAgezY2MDAsODg1MCwxMjY1MCwxNDI1MCwxNTg1MCwxODI1MCwxOTg1MCwyMzA1MCwyMzg1MCwxMjIwMH07Ci0KLSAgICBpZiAoIHN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9OQl9CSVRSQVRFW2ZyYW1lVHlwZV07Ci0gICAgfQotICAgIGVsc2UgLyogTTRTWVNfa0FNUl9XQiAqLwotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfV0JfQklUUkFURVtmcmFtZVR5cGVdOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTRFUlJfRklMRV9OT1RfRk9VTkQgOwotICAgIE00T1NBX1VJbnQzMiBzaXplIDsKLSAgICBNNE9TQV9VSW50MzIgZGF0YSA7Ci0gICAgTTRPU0FfQ2hhciAqTTRfVG9rZW47Ci0gICAgTTRPU0FfVUludDMyICp0b2tlblB0cjsKLQotICAgIC8qIEhlYWRlciBmb3IgQU1SIE5CICovCi0gICAgTTRPU0FfVUludDMyIE00X0FNUl8xICAgICAgID0gMHg0ZDQxMjEyMzsKLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX05CXzIgICAgPSAweDAwMDAwYTUyOwotCi0gICAgLyogSGVhZGVyIGZvciBBTVIgV0IgKi8KLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX1dCXzIgICAgPSAweDQyNTcyZDUyOwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfV0JfMyAgICA9IDB4MDAwMDAwMGE7Ci0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksTTRFUlJfUEFSQU1FVEVSLCJGaWxlIERlc2MuIE00T1NBX05VTEwiKTsKLQotICAgIE00X1Rva2VuID0gKE00T1NBX0NoYXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTWVtQWRkcjMyKSozLCBNNEFNUl9SRUFERVIsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopKCJNNF9Ub2tlbiIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IE00X1Rva2VuKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IE00X1Rva2VuKSxNNEVSUl9BTExPQywiTWVtIEFsbG9jIGZhaWxlZCAtIE00X1Rva2VuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgcFN0cmVhbUNvbnRleHQ9IChNNF9BTVJSX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQU1SUl9Db250ZXh0KSwgTTRBTVJfUkVBREVSLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0IikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpCi0gICAgewotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQyA7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCA9IE00QU1SUl9DT05URVhUSUQ7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfQU1SUl9Db250ZXh0KTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdD1wRmlsZUZ1bmN0aW9uIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tPcGVuaW5nIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4ID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsID0gMDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIGVycj1wU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+b3BlblJlYWQoJnBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLE00T1NBX2tGaWxlUmVhZCApOwotICAgIGlmICggZXJyICE9IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgLyogTTRPU0FfREVCVUdfSUYzKChlcnIgIT0gTTROT19FUlJPUiksZXJyLCJGaWxlIG9wZW4gZmFpbGVkIik7ICovCi0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotICAgICAgICBmcmVlKE00X1Rva2VuKTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0gICAgICAgIHJldHVybiBlcnIgOwotICAgIH0KLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmluZyA7Ci0KLSAgICBzaXplID0gNjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00X1Rva2VuLCAmc2l6ZSk7Ci0gICAgaWYoc2l6ZSAhPSA2KQotICAgIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHRva2VuUHRyID0gKE00T1NBX1VJbnQzMiopTTRfVG9rZW4gOwotICAgIC8qIENoZWNrIGZvciB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgaGVhZGVyIGNvbW1vbiB0byBXQiBhbmQgTkIqLwotICAgIGlmICgqdG9rZW5QdHIgIT0gTTRfQU1SXzEpCi0gICAgewotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgdG9rZW5QdHIrKzsKLSAgICBkYXRhID0gKnRva2VuUHRyICYgMHgwMDAwRkZGRiA7Ci0gICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgcGFydCBpcyBOYXJyb3cgYmFuZCBoZWFkZXIgKi8KLSAgICBpZiAoZGF0YSE9IE00X0FNUl9OQl8yKQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIEFNUiBXaWRlIEJhbmQgKi8KLSAgICAgICAgZmlsZVBvcyA9IDQ7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgICAgICBzaXplID0gNTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNF9Ub2tlbiwgJnNpemUpOwotICAgICAgICBpZihzaXplICE9IDUpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHRva2VuUHRyPShNNE9TQV9VSW50MzIqKU00X1Rva2VuOwotICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFdpZGUgYmFuZCBoYWRlciAqLwotICAgICAgICBpZigqdG9rZW5QdHIhPSBNNF9BTVJfV0JfMikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgdG9rZW5QdHIrKzsKLSAgICAgICAgZGF0YSA9ICp0b2tlblB0ciAmIDB4MDAwMDAwRkYgOwotICAgICAgICBpZihkYXRhIT0gTTRfQU1SX1dCXzMpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SX1dCIDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU3RyZWFtIGlzIGEgTmFycm93IGJhbmQgc3RyZWFtICovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPSBNNFNZU19rQU1SIDsKLSAgICB9Ci0gICAgLyogIE5vIFByb2ZpbGUgbGV2ZWwgZGVmaW5lZCAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmVkOwotCi0gICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgKnBDb250ZXh0ID0gcFN0cmVhbUNvbnRleHQgOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSkKLSAgICB7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotICAgIH0KLQotICAgIGZyZWUoTTRfVG9rZW4pOwotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfTk9UX0NPTVBMSUFOVDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0NoYXIgICAgICAgICAgICBmcmFtZUhlYWRlciwgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHNpemUsIGF1Q291bnQ9MDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2MpLE00RVJSX1BBUkFNRVRFUiwiU3RyZWFtIERlc2MuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU0gOwotICAgIH0KLQotICAgIHNpemUgPSAxOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLQotICAgIC8qIFhGRkYgRlhYWCAtPiBGIGlzIHRoZSBGcmFtZSB0eXBlICovCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICggZnJhbWVUeXBlID09IDE1ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19EQVRBX1lFVCA7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkgJiYgKCBmcmFtZVR5cGUgPiAxMSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgLyogQXZlcmFnZSBiaXQgcmF0ZSBpcyBhc3NpZ25lZCB0aGUgYml0cmF0ZSBvZiB0aGUgZmlyc3QgZnJhbWUgKi8KLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBNNEFNUlJfZ2V0Qml0cmF0ZShmcmFtZVR5cGUscFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICBmaWxlUG9zID0gLTE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsCi0gICAgICAgICAmZmlsZVBvcyk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBTdHJlYW1EZXNjICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDAgOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbURlc2MtPm1heEJpdHJhdGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PQotICAgICAgICBNNFNZU19rQU1SICk/TTRBTVJSX05CX01BWF9CSVRfUkFURTpNNEFNUlJfV0JfTUFYX0JJVF9SQVRFOwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZTsKLQotICAgIC8qIFRpbWVzY2FsZSBlcXVhbHMgU2FtcGxpbmcgRnJlcXVlbmN5OiBOQi04MDAwIEh6LCBXQi0xNjAwMCBIeiAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAocFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICk/ODAwMDoxNjAwMDsKLSAgICBwU3RyZWFtRGVzYy0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLAotICAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyIikpOwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgU3RyZWFtIERlc2MuIGludG8gdGhlIENvbnRleHQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+YXZlcmFnZUJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBNNE9TQV9USU1FX1VOS05PV047Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnByb2ZpbGVMZXZlbCA9IDB4RkYgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1JRCA9IDE7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnN0cmVhbVR5cGUgPSBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPnRpbWVTY2FsZSA9IHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgOwotCi0gICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgRmlsZSB0byBnZXQgdGhlICovCi0gICAgLyogZHVyYXRpb24gb2YgdGhlIHN0cmVhbSA9IDIwIG1zICogbnVtYmVyIG9mIGFjY2VzcyB1bml0ICovCi0gICAgd2hpbGUoMSkKLSAgICB7Ci0gICAgICAgIHNpemUgPSAxOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICBpZiAoIHNpemUgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgIC8qIEdldCB0aGUgZnJhbWUgc2l6ZSBhbmQgc2tpcCBzbyBtYW55IGJ5dGVzICovCi0gICAgICAgIGlmKGZyYW1lVHlwZSAhPSAxNSl7Ci0gICAgICAgICAgICAvKiBHTEEgMjAwNTA2Mjggd2hlbiBmcmFtZXR5cGUgaXMgPjEwIHdlIHJlYWQgb3ZlciBhIHRhYmxlICovCi0gICAgICAgICAgICBpZihmcmFtZVR5cGUgPiAxMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZSA7Ci0KLSAgICAgICAgICAgIHNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBpZihzaXplID4gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgPSBzaXplIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGVQb3MgPSBzaXplLTE7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRWFjaCBGcmFtZSBpcyAyMCBtIFNlYy4gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24gPSBhdUNvdW50ICogTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uIDsKLQotICAgIC8qIFB1dCB0aGUgZmlsZSBwb2ludGVyIGJhY2sgYXQgdGhlIGZpcnN0IEFjY2VzcyB1bml0ICovCi0gICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgfQotICAgIGlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcyApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9JbnQzMiBzaXplID0gMCA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcyksTTRFUlJfUEFSQU1FVEVSLCJTdHJlYW0gSWRzLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIHdoaWxlKCBwU3RyZWFtSURzW3NpemVdICE9IDAgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1JRHNbc2l6ZSsrXSAhPSAxICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkYXRhIEFkZHJlc3MgZm9yIHVzZSBpbiBOZXh0QVUoKSAqLwotICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSA7Ci0gICAgICAgIC8qIGRhdGFBZGRyZXNzIGlzIG93bmVkIGJ5IFBhcnNlciwgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBkZWxldGUgb3IgZnJlZSBpdCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgPShNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUgKyAoNCAtIHNpemUgJSA0KSwKLSAgICAgICAgICAgIE00QU1SX1JFQURFUiwgKE00T1NBX0NoYXIgKikoInBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyIpKTsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVR19JRjMoKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKSxNNEVSUl9BTExPQywKLSAgICAgICAgICAgICAgICAgICAgIk1lbSBBbGxvYyBmYWlsZWQgLSBkYXRhQWRkcmVzcyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgc3RhdGUgb2YgY29udGV4dCB0byBSZWFkaW5nICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBTdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEF1KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgICAgIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgIGF1U2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgc2l6ZSA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBBdSksTTRFUlJfUEFSQU1FVEVSLCJBY2Nlc3MgVW5pdCAuIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa1JlYWRpbmcpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICggU3RyZWFtSUQgIT0gMSApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCB0aGUgZnJhbWUgaGVhZGVyIGJ5dGUgKi8KLSAgICBzaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MsICZzaXplKTsKLSAgICBpZihzaXplICE9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIGZyYW1lSGVhZGVyID0gKChNNE9TQV9NZW1BZGRyOClwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpWzBdOwotCi0gICAgZnJhbWVUeXBlID0gKCBmcmFtZUhlYWRlciAmIDB4NzggKSA+PiAzIDsKLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmCi0gICAgICAgICggZnJhbWVUeXBlID4gMTEgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJgotICAgICAgICAoIGZyYW1lVHlwZSA+IDkgKSAmJiAoIGZyYW1lVHlwZSAhPSAxNSApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICB9Ci0KLSAgICAvKiBHZXQgdGhlIGZyYW1lIHNpemUgKi8KLSAgICBpZihmcmFtZVR5cGUgPT0gMTUpCi0gICAgewotICAgICAgICBhdVNpemUgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgfQotCi0gICAgc2l6ZSAtPSBhdVNpemUgOwotICAgIGlmKHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICAgIGZpbGVQb3MgPSAtKChNNE9TQV9GaWxlUG9zaXRpb24pc2l6ZSk7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICB9Ci0KLSAgICBwQXUtPnNpemUgPSBhdVNpemUgOwotCi0gICAgLyogZXZlbiB3aGVuIGZyYW1lVHlwZSA9PSAxNSAobm8gZGF0YSBmcmFtZSksIEFSTSBjb3JlIGRlY29kZXIgb3V0cHV0cyBmdWxsIFBDTSBidWZmZXIgKi8KLSAgICAvKmlmKGZyYW1lVHlwZSA9PSAxNSApCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSAwOwotICAgIH0qLwotICAgIC8qZWxzZSovCi0gICAgewotICAgICAgICBwQXUtPkNUUyArPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICB9Ci0KLQotICAgIHBBdS0+RFRTID0gcEF1LT5DVFMgOwotICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0KLSAgICBwQXUtPnN0cmVhbSA9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyOwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MgOwotCi0gICAgaWYoZnJhbWVIZWFkZXIgJiAweDgwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHRoZSBzdGF0ZSB0byBpbXBsZW1lbnQgTmV4dEF1LT5mcmVlQXUtPk5leHRBdSBGU00gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZnJlZUFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQXUpLE00RVJSX1BBUkFNRVRFUiwiQWNjZXNzIFVuaXQgLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nX25leHRBVSksIE00RVJSX1NUQVRFLAotICAgICAgICAgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmICgoIFN0cmVhbUlEICE9IDEgKSAmJiAoIFN0cmVhbUlEICE9IDApKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gUmVhZGluZyBzbyBhcyB0byBhbGxvdyBhY2Nlc3MgdG8gbmV4dCBBVSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgY291bnQsIHByZXZBVSwgbmV4dEFVIDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIGF1U2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIHBvc2l0aW9uLCBwYXJ0U2Vla1RpbWU7Ci0gICAgTTRPU0FfVUludDMyIGF1Q291bnQgPSAwLCBza2lwQXVDb3VudCA9IDAgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVIZWFkZXIgOwotICAgIE00T1NBX0NoYXIgICAgZnJhbWVUeXBlIDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gIGZpbGVQb3M7Ci0gICAgTTRPU0FfRG91YmxlIHRpbWVfZG91YmxlOwotCi0gICAgLypNYWtlIGV4cGxpY2l0IHRpbWUgY2FzdCwgYnV0IHRha2UgY2FyZSB0aGF0IHRpbWVzY2FsZSBpcyBub3QgdXNlZCAhISEqLwotICAgIE00T1NBX1RJTUVfVE9fTVModGltZV9kb3VibGUsIHRpbWUsIDEwMDApOwotCi0gICAgKnBPYnRhaW5DVFMgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nKSAmJiBcCi0gICAgICAgICggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCh0aW1lX2RvdWJsZSA8IDApLE00RVJSX1BBUkFNRVRFUiwibmVnYXRpdmUgdGltZSIpOwotCi0gICAgLyogQ29taW5nIHRvIHNlZWsgZm9yIHRoZSBmaXJzdCB0aW1lLCBuZWVkIHRvIGJ1aWxkIHRoZSBzZWVrSW5kZXggVGFibGUgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBNNE9TQV9Eb3VibGUgZHVyYXRpb25fZG91YmxlOwotCi0gICAgICAgIGNvdW50ID0gMCA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXggPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4IikpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpLE00RVJSX0FMTE9DLAotICAgICAgICAgICAgICAgICJNZW0gQWxsb2MgRmFpbGVkIC0gU2Vla0luZGV4Iik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogcG9pbnQgdG8gdGhlIGZpcnN0IEFVICovCi0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICB9Ci0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBwb3N0aW9uIHRvIGJlZ2luaW5nIG9mIGZpcnN0IEFVICovCi0gICAgICAgIHBvc2l0aW9uID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgIT0gTTRTWVNfa0FNUik/OTo2OwotCi0gICAgICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KLSAgICAgICAgTTRPU0FfVElNRV9UT19NUyhkdXJhdGlvbl9kb3VibGUsIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiwgMTAwMCk7Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzZWVrIEludGVydmFsIGR1cmF0aW9uIGJhc2VkIG9uIHRvdGFsIGR1dGF0aW9uICovCi0gICAgICAgIC8qIEludGVydmFsID0gKGR1cmF0aW9uIC8gRU5UUklFUykgaW4gbXVsdGlwbGVzIG9mIEFVIGZyYW1lIGxlbmd0aCAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgPQotICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKGR1cmF0aW9uX2RvdWJsZSAvIE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKSA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsICo9IE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICBza2lwQXVDb3VudCA9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbY291bnQrK109cG9zaXRpb247Ci0gICAgICAgIHdoaWxlKGNvdW50IDwgTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplID0gMTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KSZmcmFtZUhlYWRlciwgJnNpemUpOwotICAgICAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWsgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgICAgICBpZihmcmFtZVR5cGUgIT0gMTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBidWdmaXggUm9uYW4gQ291c3luIDA1LzA0LzIwMDY6IEluIHRoZSBjb3JlIHJlYWRlciBBTVIsIHRoZQotICAgICAgICAgICAgICAgICAqIGZ1bmN0aW9uIE00QU1SUl9zZWVrIGRvZXNuJ3QgY2hlY2sgdGhlIGZyYW1lVHlwZSAqLwotICAgICAgICAgICAgICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmICggZnJhbWVUeXBlID4gMTAgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSAmJiAoIGZyYW1lVHlwZSA+IDkgKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gYXVTaXplIDsKLSAgICAgICAgICAgICAgICBmaWxlUG9zID0gYXVTaXplLTE7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICAgICAgYXVDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2tpcCB0aGUgbnVtYmVyIG9mIEFVJ3MgYXMgcGVyIGludGVydmFsIGFuZCBzdG9yZSBpbiB0aGUgSW5kZXggdGFibGUgKi8KLSAgICAgICAgICAgIGlmICggKHNraXBBdUNvdW50ICE9IDApICYmICEoYXVDb3VudCAlIHNraXBBdUNvdW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W2NvdW50KytdID0gcG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LyogRW5kIG9mIEJ1aWxkaW5nIHRoZSBzZWVrIHRhYmxlICovCi0KLSAgICAvKiBVc2UgdGhlIHNlZWsgdGFibGUgdG8gc2VlayB0aGUgcmVxdWlyZWQgdGltZSBpbiB0aGUgc3RyZWFtICovCi0KLSAgICAvKiBJZiB3ZSBhcmUgc2Vla2luZyB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUgcG9pbnQgdG8gZmlyc3QgQVUgKi8KLSAgICBpZiAoIHNlZWtNb2RlID09IE00U1lTX2tCZWdpbm5pbmcgKQotICAgIHsKLSAgICAgICAgaWYoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyppZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApKi8KLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDk7Ci0gICAgICAgIH0KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyApOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUiA7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBOZWFyZXN0IFNlY29uZCAqLwotICAgIGlmICgwICE9IHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCkKLSAgICB7Ci0gICAgICAgIHBvc2l0aW9uID0gKE00T1NBX1VJbnQzMikodGltZV9kb3VibGUgLyBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKmF2b2lkIGRpdmlzaW9uIGJ5IDAqLwotICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSBvbmx5IDQwIHNlZWsgSW5kZXguICovCi0gICAgcG9zaXRpb249KHBvc2l0aW9uID49IE00QU1SUl9OVU1fU0VFS19FTlRSSUVTKT9NNEFNUlJfTlVNX1NFRUtfRU5UUklFUy0xOnBvc2l0aW9uOwotCi0gICAgLyogU2Vla0luZGV4IHdpbGwgcG9pbnQgdG8gbmVhcmVzdCBBdSwgd2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZQotICAgIHJlcXVpcmVkIHRpbWUgZm9ybSB0aGF0IHBvc2l0aW9uICovCi0gICAgcGFydFNlZWtUaW1lID0gKE00T1NBX1VJbnQzMil0aW1lX2RvdWJsZSAtIHBvc2l0aW9uICogcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsOwotCi0gICAgcG9zaXRpb24gPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W3Bvc2l0aW9uXTsKLQotICAgIGlmKCFwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgIH0KLQotICAgIC8qIHBvaW50IHRoZSBmaWxlIHBvaW50ZXIgdG8gbmVhcmVzdCBBVSAqLwotICAgIGZpbGVQb3MgPSBwb3NpdGlvbjsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgJmZpbGVQb3MgKTsKLQotICAgIGlmICggcGFydFNlZWtUaW1lID09IDApCi0gICAgewotICAgICAgICAqcE9idGFpbkNUUyA9IHRpbWU7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgICpwT2J0YWluQ1RTID0gKE00T1NBX1RpbWUpKHRpbWVfZG91YmxlIC0gKE00T1NBX0RvdWJsZSlwYXJ0U2Vla1RpbWUpOwotCi0gICAgc3dpdGNoKHNlZWtNb2RlKQotICAgIHsKLSAgICAgICAgLyogR2V0IHRoZSBBVSBiZWZvcmUgdGhlIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa1ByZXZpb3VzUkFQOgotICAgICAgICBjYXNlIE00U1lTX2tOb1JBUHByZXZpb3VzOgotICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIGlmICggIShwYXJ0U2Vla1RpbWUgJSBNNEFNUlJfRlJBTUVfTEVOR1RIKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gLS0gOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgLyogR2V0IHRoZSBDbG9zZXN0IEFVIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rTmV4dFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBuZXh0OgotICAgICAgICAgICAgcG9zaXRpb24gPSAocGFydFNlZWtUaW1lICsgTTRBTVJSX0ZSQU1FX0xFTkdUSCApLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qICBHZXQgdGhlIGNsb3Nlc3QgQVUgdG8gdGFyZ2V0IHRpbWUgKi8KLSAgICAgICAgY2FzZSBNNFNZU19rQ2xvc2VzdFJBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBjbG9zZXN0OgotICAgICAgICAgICAgcHJldkFVID0gcGFydFNlZWtUaW1lLShwYXJ0U2Vla1RpbWUvTTRBTVJSX0ZSQU1FX0xFTkdUSCkqTTRBTVJSX0ZSQU1FX0xFTkdUSDsKLSAgICAgICAgICAgIG5leHRBVSA9Ci0gICAgICAgICAgICAgICAgICgocGFydFNlZWtUaW1lK000QU1SUl9GUkFNRV9MRU5HVEgpL000QU1SUl9GUkFNRV9MRU5HVEgpKk00QU1SUl9GUkFNRV9MRU5HVEggLVwKLSAgICAgICAgICAgICAgICAgICAgIHBhcnRTZWVrVGltZSA7Ci0gICAgICAgICAgICBpZihwcmV2QVUgPCBuZXh0QVUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwYXJ0U2Vla1RpbWUgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IChwYXJ0U2Vla1RpbWUgKyBNNEFNUlJfRlJBTUVfTEVOR1RIICkvIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjb3VudCA9IDAgOwotICAgIC8qIFNraXAgdGhlIEFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gdG8gc2tpcCB0aGUgcGFydCBzZWVrIHRpbWUsCi0gICAgICAgdG8gcmVhY2ggdGhlIHJlcXVpcmVkIHRhcmdldCB0aW1lICovCi0gICAgd2hpbGUoY291bnQgPCBwb3NpdGlvbiApCi0gICAgewotICAgICAgICBzaXplID0gMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHRoZSB0YXJnZXQgdGltZSBpcyBpbnZhbGlkLCBwb2ludCB0byBiZWdpbmluZyBhbmQgcmV0dXJuICovCi0gICAgICAgICAgICAqcE9idGFpbkNUUyA9IDA7Ci0gICAgICAgICAgICBmaWxlUG9zID0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFswXTsKLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUUgOwotICAgICAgICB9Ci0gICAgICAgICpwT2J0YWluQ1RTICs9IE00QU1SUl9GUkFNRV9MRU5HVEg7IC8qU2hvdWxkIHVzZSBNNE9TQV9JTlQ2NF9BREQgISEqLwotICAgICAgICBjb3VudCsrOwotICAgICAgICBmcmFtZVR5cGUgPSAoZnJhbWVIZWFkZXIgJiAweDc4KSA+PiAzIDsKLSAgICAgICAgaWYoZnJhbWVUeXBlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBhdVNpemUgPSAxIDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF1U2l6ZSA9IE00QU1SUl9nZXRBdVNpemUoZnJhbWVUeXBlLCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGVQb3MgPSBhdVNpemUtMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBDbG9zZSB0aGUgQU1SIHN0cmVhbSAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5jbG9zZVJlYWQocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzPU00QU1SUl9rQ2xvc2VkIDsKLQotICAgIC8qIENoZWNrIGlmIEFVIGRhdGEgQWRkcmVzcyBpcyBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBmcmVlIGl0ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHN0cmVhbSBoYW5kbGVyIGlzIGFsbG9jYXRlZCBtZW1vcnkgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcik7Ci0gICAgfQotCi0gICAgLyogU2VlayB0YWJsZSBpcyBjcmVhdGVkIG9ubHkgd2hlbiBzZWVrIGlzIHVzZWQsIHNvIGNoZWNrIGlmIG1lbW9yeSBpcyBhbGxvY2F0ZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgewotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpOwotICAgIH0KLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBTdHJlYW1Db250ZXh0LT5tX2NvbnRleHRJZCAhPSBNNEFNUlJfQ09OVEVYVElEKSxNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICJCYWQgQ29udGV4dCIpOwotCi0gICAgaWYgKCggc3RyZWFtSWQgIT0gMSApICYmICggc3RyZWFtSWQgIT0gMCkpCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgKnBTdGF0ZSA9IHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRBTVJSX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb246IDB4JXhcbiIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00QU1SUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00QU1SUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uLT5tX21pbm9yID0gTTRBTVJSX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNEFNUlJfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9nZXRtYXhBVXNpemUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gQ29udGV4dCksICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwTWF4QXVTaXplKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00QU1SUl9nZXRtYXhBVXNpemU6IHBNYXhBdVNpemUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgKnBNYXhBdVNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjYTU1NTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNENoYW5uZWxDb252ZXJ0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNENoYW5uZWxDb3ZlcnRlci5jCi0gKiBAYnJpZWYKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotdm9pZCBNb25vVG8ySV8xNiggY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKQotewotICAgIHNob3J0IGlpOwotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IChuKjIpLTE7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICpkc3QtLSA9ICpzcmM7Ci0gICAgICAgICpkc3QtLSA9ICpzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCBjb25zdCBzaG9ydCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbikKLXsKLSAgICBzaG9ydCBpaTsKLSAgICBsb25nIFRlbXA7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wID0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgIFRlbXAgKz0gKGxvbmcpKihzcmMrKyk7Ci0gICAgICAgICooZHN0KyspID0gKHNob3J0KShUZW1wID4+MSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000REVDT0RFUl9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwZGFkMzAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qDQotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QNCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLyoqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBmaWxlICAgIE00REVDT0RFUl9OdWxsLmMNCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTnVsbCBkZWNvZGVyIHB1YmxpYyBpbnRlcmZhY2UNCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiB2aWRlbyBkZWNvZGVyLCBpLmUuIGEgZGVjb2Rlcg0KLSAqICAgICAgICAgIHRoYXQgZG9lcyBub3RoaW5nDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCINCi0NCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCINCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiDQotI2luY2x1ZGUgIk00REFfVHlwZXMuaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIg0KLSNpbmNsdWRlICJNNERFQ09ERVJfTnVsbC5oIg0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBOVUxMIFZpZGVvIERlY29kZXIgdmVyc2lvbiBpbmZvcm1hdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8NCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01BSk9SICAgIDENCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX01JTk9SICAgIDANCi0jZGVmaW5lIE00REVDT0RFUl9OVUxMX1JFVklTSU9OIDANCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogc3RydWN0dXJlICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0DQotICogQGJyaWVmICAgICAgIERlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSB2aWRlbyBkZWNvZGVyIGluc3RhbmNlDQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZnJlZWQgYnkgdGhlIHZpZGVvIGRlY29kZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BMaWJyYXJ5OyAgICAgICAgICAgIC8vIENvcmUgbGlicmFyeSBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX0RlY29kZXJJZDsgICAgICAgICAgIC8vIENvcmUgZGVjb2RlciBpZGVudGlmaWVyDQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICBtX1JlbmRlcmVySWQ7ICAgICAgICAgIC8vIENvcmUgcmVuZGVyZXIgaWRlbnRpZmllcg0KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICAgbV9wVmlkZW9TdHJlYW1oYW5kbGVyOyAvLyBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gICAgTTRfQWNjZXNzVW5pdCogICAgICAgICAgIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7IC8vIEFjY2VzcyB1bml0IHVzZWQgdG8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYW5kIGRlY29kZSBvbmUgZnJhbWUNCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgIG1fcFVzZXJEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBhbnkgdXNlciBkYXRhDQotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICBtX3BSZWFkZXI7ICAgICAgICAgICAgIC8vIFJlYWRlciBkYXRhIGludGVyZmFjZQ0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgbV9iRG9SZW5kZXJpbmc7ICAgICAgICAvLyBEZWNpZGVzIGlmIHJlbmRlciByZXF1aXJlZA0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgICAgICAvLyBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciogbV9wVmlkZW9GaWx0ZXI7ICAgICAgICAgLy8gQ29sb3IgY29udmVyc2lvbiBmaWx0ZXINCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZEYXRhOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBZdXYgZGF0YSBwbGFuZQ0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAqcERlY1l1dldpdGhFZmZlY3Q7ICAgICAvLyBQb2ludGVyIHRvIFl1diBwbGFuZSB3aXRoIGNvbG9yIGVmZmVjdA0KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgYll1dldpdGhFZmZlY3RTZXQ7ICAgICAvLyBPcmlnaW5hbCBZdXYgZGF0YSBPUiBZdXYgd2l0aCBjb2xvciBlZmZlY3QNCi0NCi19IE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKiogTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWxsb2NhdGVzIHRoZSBjb250ZXh0DQotICoNCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgKE9VVCkgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgUG9pbnRlciB0byBhIHZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbg0KLSAqIEBwYXJhbSAgIHBTcmNJbnRlcmZhY2U6ICAoSU4pICAgIFBvaW50ZXIgdG8gdGhlIE00UkVBREVSX0RhdGFJbnRlcmZhY2UNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBtdXN0IGJlIHVzZWQgYnkgdGhlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtDQotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgd2hlcmUgZGVjb2RlZCBkYXRhDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXINCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQgPSAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoDQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KSwgTTRERUNPREVSX01QRUc0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Iik7DQotICAgIGlmIChwU3RyZWFtQ29udGV4dCA9PSAwKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCk7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcExpYnJhcnkgICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciAgID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fRGVjb2RlcklkICAgICAgICAgICAgID0gLTE7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX1JlbmRlcmVySWQgICAgICAgICAgICA9IC0xOw0KLQ0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVXNlckRhdGEgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9iRG9SZW5kZXJpbmcgPSBNNE9TQV9UUlVFOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wVmlkZW9GaWx0ZXIgPSBNNE9TQV9OVUxMOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSBNNE9TQV9GQUxTRTsNCi0NCi0gICAgKnBDb250ZXh0PXBTdHJlYW1Db250ZXh0Ow0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIERlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyDQotICogQG5vdGUgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9kZXN0cm95KE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilwQ29udGV4dDsNCi0NCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KSwNCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00REVDT0RFUl9OVUxMX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7DQotDQotICAgIGZyZWUocFN0cmVhbUNvbnRleHQpOw0KLQ0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIEdldCBhbiBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSB3aGVyZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkNCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBXaGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgRnVuY3Rpb24gbm90IGltcGxlbWVudGVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gIHBWYWx1ZSkgew0KLQ0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgU2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldA0KLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsNCi0NCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciAqcEZpbHRlck9wdGlvbjsNCi0NCi0gICAgTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQgKnBTdHJlYW1Db250ZXh0ID0NCi0gICAgICAgIChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopY29udGV4dDsNCi0NCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7DQotICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPSAwOw0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFRlbXBEZWNZdXZEYXRhID0gTTRPU0FfTlVMTDsNCi0NCi0gICAgc3dpdGNoIChvcHRpb25JZCkgew0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGE6DQotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhID0gKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3RDb250aWd1b3VzOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdCA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0Og0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5iWXV2V2l0aEVmZmVjdFNldCA9IChNNE9TQV9Cb29sKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91czoNCi0gICAgICAgICAgICBwVGVtcERlY1l1dkRhdGEgPSAgKE00VklGSV9JbWFnZVBsYW5lICopcFZhbHVlOw0KLQ0KLSAgICAgICAgICAgIHBfZGVzID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzBdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzFdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgICAgIHBfc3JjID0gcFRlbXBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICAgICAgcFRlbXBEZWNZdXZEYXRhWzJdLnVfdG9wbGVmdDsNCi0NCi0gICAgICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9oZWlnaHQ7DQotICAgICAgICAgICAgIGhlaWdodCsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLA0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICBwX2RlcyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgICAgIHBfc3JjICs9IHBUZW1wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyOg0KLSAgICAgICAgICAgIHBGaWx0ZXJPcHRpb24gPSAoTTRERUNPREVSX091dHB1dEZpbHRlciopcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgRGVjb2RlIHZpZGVvIEFjY2VzcyBVbml0cyB1cCB0byBhIHRhcmdldCB0aW1lDQotICogQG5vdGUgICAgUGFyc2UgYW5kIGRlY29kZSB0aGUgdmlkZW8gdW50aWwgaXQgY2FuIG91dHB1dCBhIGRlY29kZWQgaW1hZ2UNCi0gKiAgICAgICAgICBmb3Igd2hpY2ggdGhlIGNvbXBvc2l0aW9uIHRpbWUgaXMgZXF1YWwgb3IgZ3JlYXRlciB0byB0aGUNCi0gKiAgICAgICAgICBwYXNzZWQgdGFyZ2V0ZWQgdGltZS4NCi0gKiAgICAgICAgICBUaGUgZGF0YSBhcmUgcmVhZCBmcm9tIHRoZSByZWFkZXIgZGF0YSBpbnRlcmZhY2UgcGFzc2VkIHRvDQotICogICAgICAgICAgTTRERUNPREVSX01QRUc0X2NyZWF0ZS4NCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAoSU4vT1VUKSAgICBJTjogVGltZSB0byBkZWNvZGUgdXAgdG8gKGluIG1zZWMpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIGxhc3QgZGVjb2RlZCBmcmFtZSAoaW4gbXNlYykNCi0gKiBAcGFyYW0gICBiSnVtcDogICAgICAoSU4pICAgICAgICAwIGlmIG5vIGp1bXAgb2NjdXJlZCBqdXN0IGJlZm9yZSB0aGlzIGNhbGwNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQ0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0DQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKEVPUykNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLQ0KLSAgICAvLyBEbyBub3RoaW5nOyBpbnB1dCB0aW1lIHN0YW1wIGl0c2VsZiByZXR1cm5lZA0KLSAgICByZXR1cm4gTTROT19FUlJPUjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFJlbmRlcnMgdGhlIHZpZGVvIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4NCi0gKiBAbm90ZQ0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAoSU4pICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBwVGltZTogICAgICAgKElOL09VVCkgICBJTjogVGltZSB0byByZW5kZXIgdG8gKGluIG1zZWNzKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpDQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgT3V0cHV0IHBsYW5lIGZpbGxlZCB3aXRoIGRlY29kZWQgZGF0YQ0KLSAqIEBwYXJhbSAgIGJGb3JjZVJlbmRlcjooSU4pICAgICAgIDEgaWYgdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgZXZlbiBpdA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbmRlcmVkIGFscmVhZHkNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIGlmIG5vdA0KLSAqDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkNCi0gKiBAcmV0dXJuICBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAgICBJZiB0aGUgZnJhbWUgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9NZWRpYVRpbWUqIHBUaW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwdXRQbGFuZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0Ow0KLSAgICBNNE9TQV9VSW50OCAqcF9zcmMsKnBfZGVzOw0KLSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQgPQ0KLSAgICAgICAgKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0Kiljb250ZXh0Ow0KLQ0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID09IE00T1NBX1RSVUUpIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfSBlbHNlIHsNCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzBdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzFdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCAodm9pZCAqKXBfc3JjLCBwT3V0cHV0UGxhbmVbMV0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHBfZGVzID0gcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhICsgcE91dHB1dFBsYW5lWzJdLnVfdG9wbGVmdDsNCi0gICAgICAgIHBfc3JjID0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzJdLnBhY19kYXRhICsNCi0gICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgZm9yIChoZWlnaHQgPSAwOyBoZWlnaHQ8cE91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0OyBoZWlnaHQrKykgew0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfZGVzLCh2b2lkICopcF9zcmMscE91dHB1dFBsYW5lWzJdLnVfd2lkdGgpOw0KLSAgICAgICAgICAgIHBfZGVzICs9IHBPdXRwdXRQbGFuZVsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICBwX3NyYyArPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0udV9zdHJpZGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIGVycjsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogUG9pbnRlciB0byBhIE00REVDT0RFUl9WaWRlb1R5cGUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZQ0KLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0bw0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZCBieQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBhbmQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLg0KLSAqDQotICogQHJldHVybnMgOiBNNE5PX0VSUk9SICBpZiBPSw0KLSAqICAgICAgICAgICAgTTRFUlJfQUxMT0MgaWYgYWxsb2NhdGlvbiBmYWlsZWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlIChNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotDQotICAgICpwRGVjb2RlckludGVyZmFjZSA9DQotICAgICAgICAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoDQotICAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksDQotICAgICAgICAgTTRERUNPREVSX01QRUc0LCAoTTRPU0FfQ2hhciAqKSJNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UiKTsNCi0NCi0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBEZWNvZGVySW50ZXJmYWNlKSB7DQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7DQotICAgIH0NCi0NCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlWVVWNDIwUDsNCi0NCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICA9IE00REVDT0RFUl9OVUxMX2NyZWF0ZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICA9IE00REVDT0RFUl9OVUxMX2Rlc3Ryb3k7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gPSBNNERFQ09ERVJfTlVMTF9zZXRPcHRpb247DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZWNvZGUgICAgPSBNNERFQ09ERVJfTlVMTF9kZWNvZGU7DQotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RSZW5kZXIgICAgPSBNNERFQ09ERVJfTlVMTF9yZW5kZXI7DQotDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzNDMyNTQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBDTVJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBDTV9QQ01SZWFkZXIuYwotICogQGJyaWVmICAgUENNIHJlYWRlciBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00UENNUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQQ00gcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTiAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIG9wZW5zIGEgUENNIGZpbGUKLSAqICAgICAgICAgIC0gaW5pdGlhbGl6ZXMgUENNIGNvbnRleHQsCi0gKiAgICAgICAgICAtIHZlcmlmaWVzIFBDTSBmaWxlIGZvcm1hdAotICogICAgICAgICAgLSBGaWxsIGRlY29kZXIgY29uZmlnIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2VzIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ09wZW5pbmcnCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKE9VVCkgUG9pbnRlciBvbiB0aGUgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwVXJsOiAoSU4pIE5hbWUgb2YgdGhlIFBDTSBmaWxlCi0gKiBAcGFyYW0gICBwRmlsZUZ1bmN0aW9uczogKElOKSBQb2ludGVyIG9uIHRoZSBmaWxlIGFjY2VzcyBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IgZHVyaW5nIHRoZSBvcGVuaW5nCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgIHBDb250ZXh0IGFuZC9vciBwVXJsIGFuZC9vciBwRmlsZUZ1bmN0aW9uIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgICAgIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICB0aGUgZmlsZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGNvbXBsaWFudCwgbm8gUklGRiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGFjayBvZiBhbnkgbWFuZGF0b3J5IGNodW5rLgotICogQHJldHVybiAgTTRQQ01DX0VSUl9QQ01fTk9UX1NVUFBPUlRFRCAgICB0aGUgUENNIGZvcm1hdCBvZiB0aGlzIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcgotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgZXJyb3JzICAgICAgICAgICBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi17Ci0gICAgTTRPU0FfRVJSICAgICAgIGVycjsKLSAgICBNNFBDTVJfQ29udGV4dCAqY29udGV4dDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgcFRlbXBVUkw7Ci0gICAgTTRPU0FfQ2hhciAgICAgICAgdmFsdWVbNl07Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gcENvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFVybCkgfHwoTTRPU0FfTlVMTCA9PSBwRmlsZUZ1bmN0aW9uKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dCA9IChNNFBDTVJfQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRQQ01SX0NvbnRleHQpLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfb3BlblJlYWQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCljb250ZXh0OwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCAqLwotICAgIGNvbnRleHQtPm1fb2Zmc2V0ID0gMDsKLQotICAgIGNvbnRleHQtPm1fc3RhdGUgICAgICAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX21pY3JvU3RhdGUgICAgICAgPSBNNFBDTVJfa0luaXQ7Ci0gICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX2ZpbGVDb250ZXh0ICAgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9wRGVjb2RlclNwZWNJbmZvID0gTTRPU0FfTlVMTDsKLQotICAgIC8qIFNldCBzYW1wbGUgZnJlcXVlbmN5ICovCi0gICAgcFRlbXBVUkwgPSAoTTRPU0FfQ2hhciopcFVybCArIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKS0xMSk7Ci0gICAgTTRPU0FfY2hyTkNvcHkodmFsdWUsIHBUZW1wVVJMLCA1KTsKLSAgICBNNE9TQV9jaHJHZXRVSW50MzIocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSksCi0gICAgICAgICBNNE9TQV9OVUxMLCBNNE9TQV9rY2hyRGVjKTsKLQotICAgIC8qIFNldCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICBwVGVtcFVSTCArPSA2OwotICAgIE00T1NBX2Nock5Db3B5KHZhbHVlLCBwVGVtcFVSTCwgMSk7Ci0gICAgTTRPU0FfY2hyR2V0VUludDE2KHBUZW1wVVJMLCAmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKSwKLSAgICAgICAgIE00T1NBX05VTEwsIE00T1NBX2tjaHJEZWMpOwotCi0gICAgTTRPU0FfY2hyTkNvcHkocFVybCxwVXJsLCAoc3RybGVuKChjb25zdCBjaGFyICopcFVybCktMTIpKTsKLSAgICAvKiBPcGVuIHRoZSBmaWxlICovCi0gICAgY29udGV4dC0+bV9maWxlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+b3BlblJlYWQoJihjb250ZXh0LT5tX2ZpbGVDb250ZXh0KSwgcFVybCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlID0gMTY7Ci0gICAgY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjID0gY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSAqIDIgXAotICAgICAgICAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOwotICAgIGVyciA9IHBGaWxlRnVuY3Rpb24tPmdldE9wdGlvbihjb250ZXh0LT5tX2ZpbGVDb250ZXh0LCBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsgIC8vIFJhdyBQQ00uICBIZW5jZSwgZ2V0IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNodW5rIG9mIGRhdGEKLQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlLCBubyBwYiAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzICpcCi0gICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgLyA1MCkgKiBcCi0gICAgICAgICAgICAgICAgKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlIC8gOCk7Ci0gICAgfQotICAgIGlmKGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5TYW1wbGVGcmVxdWVuY3kgPT0gMTYwMDApCi0gICAgewotICAgICAgICAvKiBBQUMgY2FzZSwgd2UgY2FuJ3QgcmVhZCBvbmx5IDIwIG1zIGJsb2NrcyAqLwotICAgICAgICBjb250ZXh0LT5tX2Jsb2NrU2l6ZSA9IDIwNDggKiBjb250ZXh0LT5tX2RlY29kZXJDb25maWcubmJDaGFubmVsczsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9kYXRhU3RhcnRPZmZzZXQgPSAwOwotICAgIGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyA9IHBGaWxlRnVuY3Rpb247Ci0KLSAgICBjb250ZXh0LT5tX3BBdUJ1ZmZlciA9IChNNE9TQV9NZW1BZGRyMzIpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGNvbnRleHQtPm1fYmxvY2tTaXplLCBNNFdBVl9SRUFERVIsCi0gICAgICAgICAoTTRPU0FfQ2hhciAqKSJDb3JlIFBDTSByZWFkZXIgQWNjZXNzIFVuaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBjb250ZXh0LT5tX3BBdUJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHN0YXRlICovCi0gICAgY29udGV4dC0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi1jbGVhbnVwOgotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZihjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jLT5jbG9zZVJlYWQoY29udGV4dC0+bV9maWxlQ29udGV4dCk7Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBmcmVlKGNvbnRleHQpOwotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYykKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSAodW5pcXVlKSBzdHJlYW0gb2YgYSBQQ00gZmlsZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIEFsbG9jYXRlcyBhbmQgZmlsbHMgdGhlIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgZGVjb2RlciBzcGVjaWZpYyBpbmZvcyBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gRmlsbHMgcFN0cmVhbURlc2Mgc3RydWN0dXJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTdHJlYW1EZXNjOiAoSU4pIFN0cmVhbSBEZXNjcmlwdGlvbiBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgQW55IE00T1NBX0ZJTEUgICAgICBlcnJvcnMgc2VlIE9TQUwgRmlsZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxlZCBlcnJvcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KXx8IChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKGMtPm1fc3RhdGUgPT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgUmVhZGVyJ3MgbV9zdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIE9ubHkgb25lIHN0cmVhbSBpcyBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtSUQgPSAxOwotICAgIC8qIE5vdCB1c2VkICovCi0gICAgcFN0cmVhbURlc2MtPnByb2ZpbGVMZXZlbCA9IDA7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgIC8qIEFsbG9jYXRlcyBkZWNvZGVyIHNwZWNpZmljIGluZm8gc3RydWN0dXJlICovCi0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgIHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyksIE00V0FWX1JFQURFUiwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBDTVJfZ2V0TmV4dFN0cmVhbSIpOwotICAgIGlmKHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qIEZpbGwgZGVjb2RlclNwZWNpZmljSW5mbyBzdHJ1Y3R1cmUsIHdpdGggZGVjb2RlciBjb25maWcgc3RydWN0dXJlIGZpbGxlZCBpbiAnb3BlbnJlYWQnCi0gICAgICAgICBmdW5jdGlvbiAqLwotICAgIG1lbWNweSgodm9pZCAqKXBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgKHZvaWQgKikmYy0+bV9kZWNvZGVyQ29uZmlnLCBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pKTsKLQotICAgIC8qIEZpbGwgb3RoZXIgZmllbGRzIG9mIHBTdHJlYW1EZXNjIHN0cnVjdHVyZSAqLwotICAgIHBTdHJlYW1EZXNjLT50aW1lU2NhbGUgPSAxMDAwOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKSgoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpXAotICAgICAgICAgLyAoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpKSpwU3RyZWFtRGVzYy0+dGltZVNjYWxlKTsKLSAgICBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGUgPSBjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMgKiA4Oy8qIGluIGJpdHMsIG11bHRpcGx5IGJ5IDgqLwotICAgIHBTdHJlYW1EZXNjLT5tYXhCaXRyYXRlID0gcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlOyAvKiBQQ00gc3RyZWFtIGhhcyBjb25zdGFudCBiaXRyYXRlICovCi0KLSAgICAvKiBEZXRlcm1pbmVzIFN0cmVhbSB0eXBlICovCi0gICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5CaXRzUGVyU2FtcGxlKQotICAgIHsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzVTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICAgICAgICBjYXNlIDI6Ci0vLyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzhiaXRzUzsgLyogPz8/IDhiaXRzIHN0ZXJlbyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGVmaW5lZCA/ICovCi0vLyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHN3aXRjaChjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNVOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa1BDTV8xNmJpdHNTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIH0KLQotICAgIGMtPm1fcERlY29kZXJTcGVjSW5mbyA9IHBTdHJlYW1EZXNjLT5kZWNvZGVyU3BlY2lmaWNJbmZvOwotCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzdGFydHMgcmVhZGluZyB0aGUgdW5pcXVlIHN0cmVhbSBvZiBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gc3RhcnQgcmVhZGluZyBhIHN0cmVhbQotICogICAgICAgICAgLSBDaGVjayB0aGF0IHByb3ZpZGVkIFN0cmVhbUlkIGlzIGNvcnJlY3QgKGFsd2F5cyB0cnVlLCBvbmx5IG9uZSBzdHJlYW0uLi4pCi0gKiAgICAgICAgICAgIEluIHRoZSBwbGF5ZXIgYXBwbGljYXRpb24sIGEgU3RyZWFtSWQgdGFibGUgaXMgaW5pdGlhbGl6ZWQgYXMgZm9sbG93OgotICogICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHBTdHJlYW1JRFsyXT17MSwwfTsKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICogICAgICAgICAgKHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGFibGUgcFN0cmVhbUlEIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZCBhcyBhYm92ZSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zdGFydFJlYWRpbmcoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlEcykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEcykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBTdHJlYW1JRCBhbmQgaWYgdGhleSdyZSBPSywgY2hhbmdlIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYocFN0cmVhbUlEc1swXSA9PSAxIHx8IHBTdHJlYW1JRHNbMF0gPT0gMCkKLSAgICAvKiBGaXJzdCBhbmQgdW5pcXVlIHN0cmVhbSBjb250YWluZWQgaW4gUENNIGZpbGUgKi8KLSAgICB7Ci0gICAgICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7Ci0gICAgICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9uZXh0QVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbmV4dCBBVSBjb250YWluZWQgaW4gdGhlIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gcmVhZCBhbiBBVQotICogICAgICAgICAgLSBBbGxvY2F0ZXMgbWVtb3J5IHRvIHN0b3JlIHJlYWQgQVUKLSAqICAgICAgICAgIC0gUmVhZCBkYXRhIGZyb20gZmlsZSBhbmQgc3RvcmUgdGhlbSBpbnRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeQotICogICAgICAgICAgLSBGaWxsIEFVIHN0cnVjdHVyZSBmaWxlZHMgKENUUy4uLikKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZ19uZXh0QVUKLSAqICAgICAgICAgICAgKEFVIGlzIHJlYWQgYW5kIGNhbiBiZSBkZWxldGVkKQotICogICAgICAgICAgLSBDaGVjayBpZiB0aGUgbGFzdCBBVSBoYXMgYmVlbiByZWFkIG9yIGlmIHdlJ3JlIGFib3V0IHRvIHJlYWQgaXQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4vT1VUKSBBY2NlcyBVbml0IFN0cnVjdHVyZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00TTRXQVJfTk9fREFUQV9ZRVQgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgaW4gdGhlIGZpbGUgdG8gcHJvdmlkZSBhIG5ldyBhY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gIE00V0FSX0VORF9PRl9TVFJFQU0gVGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgc2FtcGxlIG51bWJlciBpcyBiaWdnZXIgdGhlIG1heGltdW0gb25lLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcEFVKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZyAmJiBjLT5tX21pY3JvU3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlcyBBVSBkYXRhQWRyZXNzICovCi0gICAgcEFVLT5kYXRhQWRkcmVzcyA9IGMtPm1fcEF1QnVmZmVyOwotICAgIHNpemVfcmVhZCAgICAgICAgPSBjLT5tX2Jsb2NrU2l6ZTsKLQotICAgIGlmKChjLT5tX29mZnNldCArIHNpemVfcmVhZCkgPj0gYy0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpCi0gICAgewotICAgICAgICBzaXplX3JlYWQgPSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCAtIGMtPm1fb2Zmc2V0OwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSBpbiBmaWxlLCBhbmQgY29weSBpdCB0byBBVSBTdHJ1Y3R1cmUgKi8KLSAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPnJlYWREYXRhKGMtPm1fZmlsZUNvbnRleHQsIChNNE9TQV9NZW1BZGRyOClwQVUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgKE00T1NBX1VJbnQzMiAqKSZzaXplX3JlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGVzIHRoZSBuZXcgbV9vZmZzZXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UncmUgYXQgZW5kIG9mIHJlYWRpbmcgb3Igbm90ICovCi0gICAgYy0+bV9vZmZzZXQgPSBjLT5tX29mZnNldCArIHNpemVfcmVhZDsKLQotICAgIC8qIEZpbGwgb3RoZXJzIHBhcmFtZXRlcnMgb2YgQVUgc3RydWN0dXJlICovCi0gICAgcEFVLT5DVFMgPQotICAgICAgICAgKE00T1NBX1RpbWUpKCgoTTRPU0FfRG91YmxlKWMtPm1fb2Zmc2V0LyhNNE9TQV9Eb3VibGUpYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKVwKLSAgICAgICAgICAgICoxMDAwKTsKLSAgICBwQVUtPkRUUyA9IHBBVS0+Q1RTOwotCi0gICAgcEFVLT5hdHRyaWJ1dGUgID0gMDsKLSAgICBwQVUtPmZyYWcgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBBVS0+bmJGcmFnICAgICA9IDA7Ci0gICAgcEFVLT5zdHJlYW0gICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQVUtPnNpemUgICAgICAgPSBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGVzICovCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogTm90IGNoYW5nZWQgLi4uICovCi0gICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nX25leHRBVTsgLyogQVUgaXMgcmVhZCBhbmQgY2FuIGJlIGRlbGV0ZWQgKi8KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgQVUgdG8gcmVhZCAqLwotICAgIC8qIGllOiBpZiBkZWNvZGVkIG5iIG9mIGJ5dGVzID0gbmIgb2YgYnl0ZXMgdG8gZGVjb2RlLAotICAgICAgICAgaXQgbWVhbnMgdGhlcmUgaXMgbm8gbW9yZSBBVSB0byBkZWNvZGUgKi8KLSAgICBpZihjLT5tX29mZnNldCA+PSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIEFVIHByb3ZpZGVkIGluIHBhcmFtZXRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGZyZWUgYW4gQVUKLSAqICAgICAgICAgIC0gRnJlZSBkYXRhQWRkcmVzcyBmaWVsZCBvZiBBVSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgIC0gQ2hhbmdlIHN0YXRlIG9mIHRoZSByZWFkZXIgaW4gJ1JlYWRpbmcnIChub3QgdXNlZnVsLi4uKQotICogICAgICAgICAgLSBDaGFuZ2UgTWljcm8gc3RhdGUgJ1JlYWRpbmcnIGluIE00UENNUl9rUmVhZGluZyAoYW5vdGhlciBBVSBjYW4gYmUgcmVhZCkKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHBhcmFtICAgcEFVOiAoSU4pIEFjY2VzIFVuaXQgU3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQgKSB8fCAoTTRPU0FfTlVMTCA9PSBwQVUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nICYmIGMtPm1fbWljcm9TdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIHBBVS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ2hhbmdlIHN0YXRlcyAqLwotICAgIGMtPm1fc3RhdGUgPSBNNFBDTVJfa1JlYWRpbmc7IC8qIE5vdCBjaGFuZ2VkIC4uLiAqLwotICAgIGMtPm1fbWljcm9TdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogQVUgaXMgZGVsZXRlZCwgYW5vdGhlciBBVSBjYW4gYmUgcmVhZCAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIHRpbWUsIE00U1lTX3NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUqIHBPYnRhaW5DVFNbXSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgaW50byB0aGUgUENNIGZpbGUgYXQgdGhlIHByb3ZpZGVkIHRpbWUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZWVrCi0gKiAgICAgICAgICAtIERldGVybWluZXMgZnJvbSBwcm92aWRlZCB0aW1lIG1fb2Zmc2V0IHRvIHNlZWsgaW4gZmlsZQotICogICAgICAgICAgLSBJZiBtX29mZnNldCBpcyBjb3JyZWN0LCBzZWVrIGluIGZpbGUKLSAqICAgICAgICAgIC0gVXBkYXRlIG5ldyBtX29mZnNldCBpbiBQQ00gcmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFN0cmVhbUlEOiAoSU4pIFN0cmVhbSBzZWxlY3Rpb24gKG5vdCB1c2VkLCBvbmx5IDEgc3RyZWFtKQotICogQHBhcmFtICAgdGltZTogKElOKSBUYXJnZXRlZCB0aW1lCi0gKiBAcGFyYW0gICBzZWVrTW9kZTogKElOKSBTZWxlY3RzIHRoZSBzZWVrIGFjY2VzcyBtb2RlCi0gKiBAcGFyYW0gICBwT2J0YWluQ1RTW106IChPVVQpIFJldHVybmVkIFRpbWUgKG5vdCB1c2VkKQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICBTcGVjaWZpZWQgdGltZSBpcyBub3QgcmVhY2hhYmxlCi0gKiBAcGFyYW0gICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICBUaGlzIHNlZWsgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2VlayhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSBzZWVrQWNjZXNzTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUykKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIG9mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgYWxpZ25tZW50OwotICAgIE00T1NBX1VJbnQzMiBzaXplX3JlYWQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCkgfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQgJiYgYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgc3dpdGNoKHNlZWtBY2Nlc3NNb2RlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rQmVnaW5uaW5nOgotICAgICAgICAgICAgLyogRGV0ZXJtaW5lIG1fb2Zmc2V0IGZyb20gdGltZSovCi0gICAgICAgICAgICBvZmZzZXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRpbWUgKiAoKE00T1NBX0RvdWJsZSkoYy0+bV9kZWNvZGVyQ29uZmlnLkF2Z0J5dGVzUGVyU2VjKSAvIDEwMDApKTsKLSAgICAgICAgICAgIC8qKiBjaGVjayB0aGUgYWxpZ25tZW50IG9uIHNhbXBsZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgYWxpZ25tZW50ID0gYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMqYy0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUvODsKLSAgICAgICAgICAgIGlmIChvZmZzZXQlYWxpZ25tZW50ICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0IC09IG9mZnNldCVhbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmFkZCB0aGUgaGVhZGVyIG9mZnNldCovCi0gICAgICAgICAgICBvZmZzZXQgKz0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICAvKiBJZiBtX29mZnNldCBpcyBvdmVyIGZpbGUgc2l6ZSAtPiBJbnZhbGlkIHRpbWUgKi8KLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiAoYy0+bV9kYXRhU3RhcnRPZmZzZXQgKyBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTZWVrIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBzaXplX3JlYWQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZXJyID0gYy0+bV9wRmlsZVJlYWRGdW5jLT5zZWVrKGMtPm1fZmlsZUNvbnRleHQsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVQb3NpdGlvbiAqKSAmc2l6ZV9yZWFkKTsKLSAgICAgICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBtX29mZnNldCBpbiBNNFBDTVJfY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGMtPm1fb2Zmc2V0ID0gb2Zmc2V0IC0gYy0+bV9kYXRhU3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX2Nsb3NlUmVhZChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBQQ00gZmlsZSwgYW5kIGZyZWVzIGNvbnRleHQKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyBjbG9zZSB0aGUgUENNIGZpbGUKLSAqICAgICAgICAgIC0gQ2xvc2VzIHRoZSBmaWxlCi0gKiAgICAgICAgICAtIEZyZWUgc3RydWN0dXJlcwotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihjLT5tX3BEZWNvZGVyU3BlY0luZm8gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoYy0+bV9wRGVjb2RlclNwZWNJbmZvKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLSAgICBlbHNlIGlmKGMtPm1fbWljcm9TdGF0ZSA9PSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEF1QnVmZmVyKQotICAgIHsKLSAgICAgICAgZnJlZShjLT5tX3BBdUJ1ZmZlcik7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGZpbGUgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjLT5tX3BGaWxlUmVhZEZ1bmMpCi0gICAgewotICAgICAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjLT5tX2ZpbGVDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKiBGcmVlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBjKQotICAgIHsKLSAgICAgICAgZnJlZShjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gZ2V0IG9wdGlvbiBvZiB0aGUgUENNIFJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIGdldCBhbiBvcHRpb24KLSAqICAgICAgICAgIC0gUmV0dXJuIGNvcnJlc3BvbmRpbmcgb3B0aW9uIHZhbHVlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6IChPVVQpIFZhcmlhYmxlIHdoZXJlIHRoZSBvcHRpb24gdmFsdWUgaXMgcmV0dXJuZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiBwVmFsdWUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPShNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZClcCi0gICAgICAgICAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIERlcGVuZCBvZiB0aGUgT3B0aW9uSUQsIHRoZSB2YWx1ZSB0byByZXR1cm4gaXMgZGlmZmVyZW50ICovCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFBDTVJfa1BDTWJsb2NrU2l6ZToKLSAgICAgICAgICAgICpwVmFsdWUgPSAmYy0+bV9ibG9ja1NpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHNldCBvcHRpb24gb2YgdGhlIFBDTSBSZWFkZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzZXQgYW4gb3B0aW9uCi0gKiAgICAgICAgICAtIFNldCBjb3JyZXNwb25kaW5nIG9wdGlvbiB2YWx1ZQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgVmFsdWU6IChJTikgVmFyaWFibGUgd2hlcmUgdGhlIG9wdGlvbiB2YWx1ZSBpcyBzdG9yZWQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMLgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZS4KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgbm93LgotICogQHJldHVybiAgTTRFUlJfTk9UX0lNUExFTUVOVEVEICAgdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRQQ01SX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIFZhbHVlKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0oTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKGNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZigoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpXAotICAgICAgICAgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBEZXBlbmQgb2YgdGhlIE9wdGlvbklELCB0aGUgdmFsdWUgdG8gc2V0IGlzIGRpZmZlcmVudCAqLwotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRQQ01SX2tQQ01ibG9ja1NpemU6Ci0gICAgICAgICAgICBjLT5tX2Jsb2NrU2l6ZSA9IChNNE9TQV9VSW50MzIpVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQQ01SX2dldFZlcnNpb24gKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UENNUl9nZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uOiAweCV4IiwgcFZlcnNpb24pOwotICAgIE00T1NBX0RFQlVHX0lGMSgoKE00T1NBX1VJbnQzMikgcFZlcnNpb24gPT0gMCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBWZXJzaW9uIGlzIE5VTEwgaW4gTTRQQ01SX2dldFZlcnNpb24iKTsKLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRQQ01SX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb24tPm1fbWlub3IgPSBNNFBDTVJfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbi0+bV9yZXZpc2lvbiA9IE00UENNUl9WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDJmZmI3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0FQSS5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKjE2IGJ5dGVzIHNpZ25hdHVyZSB0byBiZSB3cml0dGVuIGluIHRoZSBnZW5lcmF0ZWQgM2dwIGZpbGVzICovCi0jZGVmaW5lIE00UFRPM0dQUF9TSUdOQVRVUkUgICAgICJOWFAtU1cgOiBQVE8zR1BQIgotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgT3VyIGVycm9ycyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIgotI2VuZGlmCi0KLQotLyoqCi0gKiAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogVmFyaW91cyBNYWdpY2FscyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8qKjwgUXVhbnRpemVyIHN0ZXAgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19QUk9GSUxFX0xFVkVMICAgICAgICAgICAgMHhGRiAgICAvKio8IE5vIHNwZWNpZmljIHByb2ZpbGUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFICAgICAgICAgICA4MDAwICAgIC8qKjwgQU1SICovCi0jZGVmaW5lIE00UFRPM0dQUF9CSVRSQVRFX1JFR1VMQVRJT05fQ1RTX1BFUklPRF9JTl9NUyAgIDUwMCAgICAgLyoqPCBNQUdJQ0FMICovCi0jZGVmaW5lIE00UFRPM0dQUF9NQVJHRV9PRl9GSUxFX1NJWkUgICAgICAgICAgICAgICAgICAgIDI1MDAwICAgLyoqPCBNQUdJQ0FMICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlZmluZSAgIEFNUiAxMi4yIGticHMgc2lsZW5jZSBmcmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFICAgICAzMgotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX0RVUkFUSU9OIDIwCi1jb25zdCBNNE9TQV9VSW50OCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMTIyX0ZSQU1FW000UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRV09Ci17IDB4M0MsIDB4OTEsIDB4MTcsIDB4MTYsIDB4QkUsIDB4NjYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4RTcsIDB4QUYsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT04gMjAKLWNvbnN0IE00T1NBX1VJbnQ4IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUVbTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci17IDB4MDQsIDB4RkYsIDB4MTgsIDB4QzcsIDB4RjAsIDB4MEQsIDB4MDQsIDB4MzMsIDB4RkYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIlByaXZhdGUiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiRXh0ZXJuYWwiIGZ1bmN0aW9ucyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIHBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLWV4dGVybiBNNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotZXh0ZXJuIE00T1NBX0VSUiBNNFJFQURFUl8zR1BfZ2V0SW50ZXJmYWNlcyhNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiAiU3RhdGljIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICBHZXQgdGhlIE00UFRPM0dQUCB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfR2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbkluZm89MHgleCIsIHBWZXJzaW9uSW5mbyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cFZlcnNpb25JbmZvKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiTTRQVE8zR1BQX0dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fbWlub3IgICAgICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gICAgPSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdChNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQpOwotICogQGJyaWVmICAgSW5pdGlhbGl6ZXMgdGhlIE00UFRPM0dQUCAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9Jbml0KCAgIE00UFRPM0dQUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00UFRPM0dQUF9Jbml0OiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgdGhlIE00UFRPM0dQUCBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQpLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfU3RlcCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEluaXQgdGhlIGNvbnRleHQuIEFsbCBwb2ludGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHRvIE00T1NBX05VTEwgYmVjYXVzZSBDbGVhblVwKCkKLSAgICAgICAgY2FuIGJlIGNhbGxlZCBqdXN0IGFmdGVyIEluaXQoKS4gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLSAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTTsKLQotICAgIC8qKgotICAgICAqICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPm1fcEVuY29kZXJIZWFkZXIgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbz0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIENvbnRleHRzIG9mIHRoZSB1c2VkIG1vZHVsZXMgICovCi0gICAgcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa05vRW5jb2RlcjsKLQotICAgIC8qKgotICAgICAqICBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBwQy0+bV9wUmVhZGVyR2xvYkludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyRGF0YUludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcEVuY29kZXJJbnQgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogRmlsbCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9uIHNldCAqLwotICAgIHBDLT5wT3NhbEZpbGVSZWFkID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhbEZpbGVXcml0ZSA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKioKLSAgICAgKiAgVmlkZW8gcmF0ZSBjb250cm9sIHN0dWZmICovCi0gICAgcEMtPm1fbXRDdHMgICAgICAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX210TmV4dEN0cyAgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9tdEF1ZGlvQ3RzICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fQXVkaW9PZmZTZXQgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX2RMYXN0VmlkZW9SZWd1bEN0cz0gMC4wRjsKLSAgICBwQy0+bV9QcmV2QXVkaW9DdHMgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fRGVsdGFBdWRpb0N0cyAgICAgPSAwLjBGOwotCi0gICAgcEMtPm1fTWF4RmlsZVNpemUgICAgICAgPSAwOwotICAgIHBDLT5tX0N1cnJlbnRGaWxlU2l6ZSAgID0gMDsKLQotICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgICAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlICA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5tX05iQ3VycmVudEZyYW1lICAgICAgICA9IDA7Ci0KLSAgICBwQy0+cFNhdmVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aVNhdmVkRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9Jbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgIFNldCB0aGUgTTRQVE8zR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCi0gKiBAbm90ZSAgICBJdCBvcGVucyB0aGUgaW5wdXQgZmlsZSwgYnV0IHRoZSBvdXRwdXQgZmlsZSBtYXkgbm90IGJlIGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgaXQgaXMgaW50ZXJuYWxseSBjb3BpZWQgYnkgdGhlIFBUTzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICBUaGUgb3V0cHV0IHZpZGVvIGJpdC1yYXRlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORyAgICAgICAgICAgICBUaGUgb3V0cHV0IGF1ZGlvIHBhZGRpbmcgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFICAgIFRoZSBpbnB1dCBhdWRpbyBmaWxlIGNvbnRhaW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHRyYWNrIGZvcm1hdCBub3QgaGFuZGxlZCBieSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAgICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgICAgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlICAgICAgcmVhZGVyTWVkaWFUeXBlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00UFRPM0dQUF9PcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBQYXJhbXM9MHgleCIsIHBDb250ZXh0LCBwUGFyYW1zKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLCBcCi0gICAgICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zKSwgIE00RVJSX1BBUkFNRVRFUiwgXAotICAgICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBQYXJhbXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHBhcmFtZXRlcnMgY29ycmVjdG5lc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFBpY3R1cmVDYWxsYmFja0ZjdCksCi0gICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfT3BlbjogcEMtPm1fUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBPdXRwdXQzZ3BwRmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wT3V0cHV0M2dwcEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wVGVtcG9yYXJ5RmlsZSksCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wVGVtcG9yYXJ5RmlsZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBGb3JtYXQgKi8KLSAgICBpZiggKE00VklERU9FRElUSU5HX2tIMjYzICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa01QRUc0ICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICB9Ci0KLSAgICAgLyoqCi0gICAgICogVmlkZW8gQml0cmF0ZSAqLwotICAgIGlmKCEoKE00VklERU9FRElUSU5HX2sxNl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazMyX0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s0OF9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNjRfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazk2X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMjhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syODhfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMzg0X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazUxMl9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s4MDBfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgKE00VklERU9FRElUSU5HX2syX01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNV9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazhfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgc2l6ZSAqLwotICAgIGlmICghKChNNFZJREVPRURJVElOR19rU1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRUVZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa1ZHQSAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0KLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa05UU0MgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tXVkdBID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotCi0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s2NDBfMzYwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rODU0XzQ4MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazEyODBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTA4MF83MjAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2s5NjBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rMTkyMF8xMDgwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiAoISgoTTRQVE8zR1BQX2s1MF9LQiAgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNzVfS0IgICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazEwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2sxNTBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMjAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazMwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2s0MDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNTAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfa1VOTElNSVRFRCA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCAzR1BQIGZpbGUgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gcGFkZGluZyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBQYXJhbXMtPnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIGlmICgoISggKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lICAgPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkgfHwKLSAgICAgICAgICAgICAgICAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX1NpbGVuY2U9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSB8fAotICAgICAgICAgICAgICAgIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcCAgID09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpKSkpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIGF1ZGlvIHBhZGRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfQVVESU9fUEFERElORzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgU2l6ZSBjaGVjayBmb3IgSDI2MyAob25seSB2YWxpZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIGFuZCBTUUNJRikgKi8KLSAgICBpZiAoKE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1NRQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa1FDSUYgIT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpICYmCi0gICAgICAgIChNNFZJREVPRURJVElOR19rQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTpcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5tX1N0YXRlKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZSAqLwotICAgIG1lbWNweSgodm9pZCAqKSgmcEMtPm1fUGFyYW1zKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBQYXJhbXMsIHNpemVvZihNNFBUTzNHUFBfUGFyYW1zKSk7Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuOiBvdXRwdXRWaWRlb0JpdHJhdGUgPSAlZCIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHJlYWRlciBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBhdWRpbyBmaWxlIHR5cGUgKi8KLSAgICAgICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5BdWRpb0ZpbGVGb3JtYXQpCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SOgotICAgICAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBDLT5tX3BSZWFkZXJHbG9iSW50LAotICAgICAgICAgICAgICAgICZwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgQUFDX1NVUFBPUlRFRAotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgZXJyID0gTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwQy0+bV9wUmVhZGVyR2xvYkludCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOSEFORExFRF9BVURJT19UUkFDS19JTlBVVF9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDcmVhdGUoJnBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQ7Ci0gICAgICAgIC8qKjwgTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0U2V0T3B0aW9uKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYWxGaWxlUmVhZCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIE9wZW4gdGhlIGlucHV0IGF1ZGlvIGZpbGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdE9wZW4ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0RGVzdHJveShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgR2V0IHRoZSBhdWRpbyBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgd2hpbGUgKE00Tk9fRVJST1IgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0R2V0TmV4dFN0cmVhbShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwgJnBTdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgaWYoKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGlmICgoTTRSRUFERVJfa01lZGlhRmFtaWx5QXVkaW8gPT0gbWVkaWFGYW1pbHkpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0gPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBLZWVwIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogRm91bmQgYW4gYXVkaW8gc3RyZWFtIGluIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIEFsbG9jYXRlIGF1ZGlvIEFVIHVzZWQgZm9yIHJlYWQgb3BlcmF0aW9ucyAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVSA9IChNNF9BY2Nlc3NVbml0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FjY2Vzc1VuaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQLChNNE9TQV9DaGFyICopInBSZWFkZXJBdWRpb0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW4oKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBSZWFkZXJBdWRpb0FVLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCBwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iSW50LT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChNNFdBUl9OT19NT1JFX1NUUkVBTSAhPSBlcnIpIC8qKjwgVW5leHBlY3RlZCBlcnJvciBjb2RlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JJbnQtPm1fcEZjdEdldE5leHRTdHJlYW0gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIHdoaWxlKi8KLSAgICB9IC8qaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlKSovCi0KLSAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEOwotCi0gICAgLyoqCi0gICAgICogSW5pdCB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdFJlc2V0KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckRhdGFJbnQtPm1fcEZjdFJlc2V0KGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtYXggRmlsZSBzaXplICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRGaWxlTWF4U2l6ZSkKLSAgICB7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazUwX0tCOiAgcEMtPm1fTWF4RmlsZVNpemUgPSA1MDAwMDsgIGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s3NV9LQjogIHBDLT5tX01heEZpbGVTaXplID0gNzUwMDA7ICBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMTAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDEwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazE1MF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAxNTAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2syMDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMjAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMzAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDMwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazQwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSA0MDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s1MDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gNTAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rVU5MSU1JVEVEOgotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcgRW5jb2RpbmcgY29tcGxldGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfU3RlcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgbF91aUF1ZGlvU3RlcENvdW50ID0gMDsKLSAgICBNNE9TQV9JbnQzMiAgSnVtcFRvVGltZSA9IDA7Ci0gICAgTTRPU0FfVGltZSAgbXRJbmNDdHM7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UFRPM0dQUF9TdGVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKCAhKChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkgfHwgKE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgPT0gcEMtPm1fU3RhdGUpKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioKLSAgICAgKiAgSW4gY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBzdGVwLCB3ZSBwcmVwYXJlIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciBhbmQgdGhlIHdyaXRlciAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCA9PSBwQy0+bV9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOiBUaGlzIGlzIHRoZSBmaXJzdCBzdGVwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmciKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogIFByZXBhcmUgdGhlIHJlYWRlciwgdGhlIGRlY29kZXIsIHRoZSBlbmNvZGVyLCB0aGUgd3JpdGVyLi4uICovCi0gICAgICAgIGVyciA9IE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKHBDKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfUkVBRFk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCB3ZSBvbmx5IGRvIHRoYXQgaW4gdGhlIGZpcnN0IHN0ZXAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IFJFQUwgc3RlcCB3aWxsIGJlIHRoZSBuZXh0IG9uZSAqLwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSB0YXJnZXRlZCBmaWxlIHNpemUuCi0gICAgICogV2UgZG8gdGhhdCBiZWZvcmUgdGhlIGVuY29kaW5nLCBiZWNhdXNlIHRoZSBjb3JlIGVuY29kZXIgaGFzIHRvIGtub3cgaWYgdGhpcyBpcwotICAgICAqIHRoZSBsYXN0IGZyYW1lIHRvIGVuY29kZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZCwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+bV9DdXJyZW50RmlsZVNpemUpOwotICAgIGlmICgoMCAhPSBwQy0+bV9NYXhGaWxlU2l6ZSkgJiYKLSAgICAgICAgLyoqPCBBZGQgYSBtYXJnZSB0byB0aGUgZmlsZSBzaXplIGluIG9yZGVyIHRvIG5ldmVyIGV4Y2VlZCB0aGUgbWF4IGZpbGUgc2l6ZSAqLwotICAgICAgICgocEMtPm1fQ3VycmVudEZpbGVTaXplICsgTTRQVE8zR1BQX01BUkdFX09GX0ZJTEVfU0laRSkgPj0gcEMtPm1fTWF4RmlsZVNpemUpKQotICAgIHsKLSAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICogIEF0IHRoYXQgcG9pbnQgd2UgYXJlIGluIE00UFRPM0dQUF9rU3RhdGVfUkVBRFkgc3RhdGUKLSAgICAqICBXZSBwZXJmb3JtIG9uZSBzdGVwIG9mIHZpZGVvIGVuY29kaW5nCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKiogVklERU8gRU5DT0RJTkcgKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkgLyoqPElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBnb2luZyBvbiovCi0gICAgeyAgIC8qKgotICAgICAgICAgKiBDYWxsIHRoZSBlbmNvZGVyICAqLwotICAgICAgICBwQy0+bV9OYkN1cnJlbnRGcmFtZSsrOwotCi0gICAgICAgIC8qIENoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGZyYW1lIHRoZSB0byBlbmNvZGUgKi8KLSAgICAgICAgaWYoKHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzID4gMCkgXAotICAgICAgICAgICAgJiYgKHBDLT5tX05iQ3VycmVudEZyYW1lID49IHBDLT5tX1BhcmFtcy5OYlZpZGVvRnJhbWVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMigiTTRQVE8zR1BQX1N0ZXAoKTogQ2FsbGluZyBwRW5jb2RlckludC0+cEZjdEVuY29kZSB3aXRoIHZpZGVvQ3RzID0gJS4yZlwKLSAgICAgICAgICAgICAgICAgICAgICAgbmIgPSAlbHUiLCBwQy0+bV9tdEN0cywgcEMtPm1fTmJDdXJyZW50RnJhbWUpOwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0RW5jb2RlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgTTRPU0FfTlVMTCwKLSAgICAgICAgICAgIC8qKjwgVGhlIGlucHV0IHBsYW5lIGlzIG51bGwgYmVjYXVzZSB0aGUgaW5wdXQgUGljdHVyZSB3aWxsIGJlIG9idGFpbmVkIGJ5IHRoZVwKLSAgICAgICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX210Q3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9Jc0xhc3RQaWN0dXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZSA6IE00RU5DT0RFUl9rTm9ybWFsRnJhbWUpICk7Ci0gICAgICAgIC8qKjwgTGFzdCBwYXJhbSBzZXQgdG8gTTRPU0FfVFJVRSBzaWduYWxzIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSB0byBiZSBlbmNvZGVkLFwKLSAgICAgICAgTTRPU0FfRkFMU0UgZWxzZSAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFM18yKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgsIHZpZEZvcm1hdCA9MHgleCIsCi0gICAgICAgICAgICBlcnIsIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgIGlmKChNNE5PX0VSUk9SID09IGVycikgJiYgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENoZWNrIGlmIGxhc3QgZnJhbWUuKgotICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX0lzTGFzdFBpY3R1cmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IExhc3QgcGljdHVyZSIpOwotICAgICAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIC8qKjwgVGhlIHZpZGVvIGVuY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIHBDLT5tX1ZpZGVvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSAgICAgLyoqPCBVbmV4cGVjdGVkIGVycm9yIGNvZGUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoICgoKE00T1NBX1VJbnQzMilNNFdBUl9XUklURVJfU1RPUF9SRVEpID09IGVycikgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1N0ZXA6IHJldHVybmluZyBFUlJfUFRPM0dQUF9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwRW5jb2RlckludC0+cEZjdEVuY29kZShsYXN0KSAoYSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IEVuZCBvZiB2aWRlbyBlbmNvZGluZyAqLwotCi0KLSAgICAvKioqKioqIEFVRElPIFRSQU5TQ09ESU5HIChyZWFkICsgbnVsbCBlbmNvZGluZyArIHdyaXRlKSAqKioqKiovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9BdWRpb1N0YXRlKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX0F1ZGlvU3RhdGUpICYmCi0gICAgICAgICAgICAgICAgKHBDLT5tX210QXVkaW9DdHMgPCBwQy0+bV9tdE5leHRDdHMpKQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxfdWlBdWRpb1N0ZXBDb3VudCsrOwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgQXVkaW8gZmlsZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMgKyBwQy0+bV9BdWRpb09mZlNldDsKLQotICAgICAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVycikgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuQXVkaW9QYWRkaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEbyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhdWRpbyBmaWxlIGZvcm1hdCBpcyBub3QgQU1SICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTG9vcDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSnVtcCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdWRpbyBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEp1bXAocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSwgJkp1bXBUb1RpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyRGF0YUludC0+bV9wRmN0UmVzZXQoYXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fbXRBdWRpb0N0cyArPSAyMDsgLyo8IFNFTUMgYnVnIGZpeGVkIGF0IEx1bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9PZmZTZXQgPSBwQy0+bV9tdEF1ZGlvQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAnQlpaWicgYnVnIGZpeDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdEluY0N0cyA9IChNNE9TQV9UaW1lKSgocEMtPm1fbXRBdWRpb0N0cykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LyoqPCBBZGQgPT4gbm8gYXVkaW8gY3RzIGluY3JlbWVudC4uLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ID0gcEMtPm1fbXRBdWRpb0N0cyArIHBDLT5tX0RlbHRhQXVkaW9DdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZjogc3dpdGNoICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogU2F2ZSB0aGUgZGVsdGEgQ3RzIChBQUMgb25seSkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fRGVsdGFBdWRpb0N0cyA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyAtIHBDLT5tX1ByZXZBdWRpb0N0czsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fUHJldkF1ZGlvQ3RzICA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUzsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIFByZXBhcmUgdGhlIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPm1fV3JpdGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogQ29weWluZyBhdWRpbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyAgPSAoTTRPU0FfVGltZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX0F1ZGlvT2ZmU2V0ICsgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgLyAxMDAwLjApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgPSAoTTRPU0FfVGltZSkocEMtPm1fbXRBdWRpb0N0cyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRQVE8zR1BQX1N0ZXAoKTogYXVkaW8gQVU6IENUUz0lZCBtcyIsIHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTKi8pOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAgV3JpdGUgaXQgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5tX1dyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYkF1ZGlvUGFkZGluZ1NpbGVuY2UgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZpbGwgaW4gYXVkaW8gYXUgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgKz0gMjA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFBhZGQgd2l0aCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICAgICAgIG10SW5jQ3RzID0gKE00T1NBX1RpbWUpKHBDLT5tX210QXVkaW9DdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyQXVkaW9BVSwgbXRJbmNDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IE00UFRPM0dQUF9BZGRBbXJTaWxlbmNlU2lkIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IERvIG5vdGhpbmcgaWYgdGhlIGlucHV0IGF1ZGlvIGZpbGUgZm9ybWF0IGlzIG5vdCBBTVIgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IC8qKjwgd2hpbGUgKi8KLSAgICB9IC8qKjwgRW5kIG9mIGF1ZGlvIGVuY29kaW5nICovCi0KLSAgICBwQy0+bV9tdEN0cyA9IHBDLT5tX210TmV4dEN0czsKLQotICAgIC8qKgotICAgICAqICBUaGUgdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgd2hlbiBubyBzdHJlYW0gaXMgYmVpbmcgZW5jb2RlZCBhbnltb3JlICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPm1fVmlkZW9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKGIpIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbG9zZShNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSICAgIG9zYUVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGxhc3RDVFM7Ci0gICAgTTRFTkNPREVSX0hlYWRlciogZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09cENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xvc2U6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmICgocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQpICYmCi0gICAgICAgIChwQy0+bV9TdGF0ZSAhPSBNNFBUTzNHUFBfa1N0YXRlX1JFQURZKSAmJgotICAgICAgICAocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBGaW5pc2ggdGhlIGVuY29kaW5nICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgIHsKLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJSdW5uaW5nID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdG9wICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RvcChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IG1fcEVuY29kZXJJbnQtPnBGY3RTdG9wIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgfQotCi0gICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgIGlmIChNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkID09IHBDLT5tX2VFbmNvZGVyU3RhdGUpCi0gICAgewotICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdENsb3NlKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogbV9wRW5jb2RlckludC0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiBDbG9zZSAzR1Agb3V0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcDNncFdyaXRlckNvbnRleHQpICAvKiBoYXBwZW5zIGluIHN0YXRlIF9TRVQgKi8KLSAgICB7Ci0gICAgICAgIC8qIEhXIGVuY29kZXI6IGZldGNoIHRoZSBEU0kgZnJvbSB0aGUgc2hlbGwgdmlkZW8gZW5jb2RlciwgYW5kIGZlZWQgaXQgdG8gdGhlIHdyaXRlciBiZWZvcmUKLSAgICAgICAgY2xvc2luZyBpdC4gKi8KLSAgICAgICAgaWYgKChNNFZJREVPRURJVElOR19rTVBFRzQgPT0gcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgICAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tIMjY0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9zYUVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0R2V0T3B0aW9uKHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0VuY29kZXJIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmZW5jSGVhZGVyKTsKLSAgICAgICAgICAgIGlmICggKE00Tk9fRVJST1IgIT0gb3NhRXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgXAotICAgICAgICAgICAgICAgIGl0IGZhaWxzLiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCB0aGlzIGhlYWRlciBpbiB0aGUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKWVuY0hlYWRlci0+cEJ1ZjsKLSAgICAgICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa0RTSSwgJnN0cmVhbUhlYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyIDB4JXgpICAgIiwgb3NhRXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBVcGRhdGUgbGFzdCBWaWRlbyBDVFMgKi8KLSAgICAgICAgbGFzdENUUyA9IChNNE9TQV9VSW50MzIpcEMtPm1fbXRDdHM7Ci0KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBTZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBvc2FFcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogV3JpdGUgYW5kIGNsb3NlIHRoZSAzR1Agb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RDbG9zZVdyaXRlKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gb3NhRXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0Nsb3NlOiBwV3JpdGVyR2xvYkludC0+cEZjdENsb3NlV3JpdGUgcmV0dXJucyAweCV4Iiwgb3NhRXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuIHlldCwgd2UgaGF2ZSB0byBjbG9zZSBvdGhlciB0aGluZ3MgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9DTE9TRUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0Nsb3NlKCk6IHJldHVybmluZyAweCV4Iiwgb3NhRXJyKTsKLSAgICByZXR1cm4gb3NhRXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9DbGVhblVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBNNFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfQ2xlYW5VcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsICJNNFBUTzNHUFBfQ2xlYW5VcDogcENvbnRleHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIEZpcnN0IGNhbGwgQ2xvc2UsIGlmIG5lZWRlZCwgdG8gY2xlYW4gdGhlIHZpZGVvIGVuY29kZXIgKi8KLQotICAgIGlmICgoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpIHx8IChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKQotICAgICAgICB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRCA9PSBwQy0+bV9TdGF0ZSkpCi0gICAgewotICAgICAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UocENvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogTTRQVE8zR1BQX0Nsb3NlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIEF1ZGlvIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkICovCi0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00UFRPM0dQUF9PcGVuIHdhcyBub3RcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkICovCi0gICAgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZShwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvQVUpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHZpZGVvIGVuY29kZXIgc3R1ZmYsIGlmIG5lZWRlZCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0Q2xlYW51cChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xlYW5VcDogcEVuY29kZXJJbnQtPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckRhdGFJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSW50KTsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEVuY29kZXJJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BFbmNvZGVySW50KTsKLSAgICAgICAgcEMtPm1fcEVuY29kZXJJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJHbG9iSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyR2xvYkludCk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJHbG9iSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyRGF0YUludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckRhdGFJbnQpOwotICAgICAgICBwQy0+bV9wV3JpdGVyRGF0YUludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKjwgRG8gbm90IGZyZWUgcEMtPnBPc2FNZW1vcnlQdHJGY3QgYW5kIHBDLT5wT3NhTWVtb3J5UHRyRmN0LCBiZWNhdXNlIGl0J3Mgb3duZWQgYnkgdGhlIFwKLSAgICBhcHBsaWNhdGlvbiAqLwotCi0gICAgLyoqCi0gICAgICogIEZyZWUgdGhlIGNvbnRleHQgaXRzZWxmICovCi0gICAgZnJlZShwQyk7Ci0gICAgcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9DbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKiogSU5URVJOQUwgRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgUHJlcGFyZSBhbGwgcmVzb3VyY2VzIGFuZCBpbnRlcmZhY2VzIGZvciB0aGUgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIGZpcnN0IE00T1NBX1N0ZXAoKSBjYWxsCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAoSU4pIE00UFRPM0dQUCBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KiBwQykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBvdXRwdXRGaWxlVHlwZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aVZlcnNpb247Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgZW5jRm9ybWF0OwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyAgIEVuY1BhcmFtczsgICAgLyoqPCBFbmNvZGVyIGFkdmFuY2VkIHBhcmFtZXRlcnMgKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlICAgICBvcHRpb25WYWx1ZTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBQYXJhbWVzIGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKgotICAgICAqICBHZXQgdGhlIGNvcnJlY3QgZW5jb2RlciBpbnRlcmZhY2UgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgTVBFRzQgZW5jb2RlciBub3QgYXZhaWxhYmxlISAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJObyBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIE1QRUc0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjYzIGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gSDI2MyBlbmNvZGVyIGF2YWlsYWJsZSEgRGlkIHlvdSBmb3JnZXQgdG8gcmVnaXN0ZXIgb25lPyIpOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1NUQVRFOwotI2VuZGlmIC8qIHNvZnR3YXJlIEgyNjMgZW5jb2RlciBhdmFpbGFibGU/ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDCi0gICAgICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJmVuY0Zvcm1hdCwgJnBDLT5tX3BFbmNvZGVySW50LAotICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0jZWxzZSAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IE5vIEgyNjQgZW5jb2RlciBhdmFpbGFibGUhXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBIMjY0IGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoInN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOiBnZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEZpbGwgZW5jb2RlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBNNFBUTzNHUFAgc2V0dGluZ3MgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1NRQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9TUUNJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVFWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FRVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfUVZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUYgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQSA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfV1ZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX05UU0NfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLS8qIC1QUiBMVjU4MDcgKi8KLS8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl82NDBfMzYwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl82NDBfMzYwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTI4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiAtQ1IgR29vZ2xlICovCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBiaXRyYXRlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syODhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzg0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDBfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syX01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazVfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOF9NQlBTOgotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s4X01CUFM7Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MyA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ICAgID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSByYXRlIChzZXQgaXQgdG8gbWF4ID0gMzAgZnBzKSAqLwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IDMwOwotICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotCi0gICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IE00RU5DT0RFUl9rMzBfRlBTOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAzR1Agb3V0IGluaXQgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIEdldCB0aGUgM0dQUCB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoJm91dHB1dEZpbGVUeXBlLCAmcEMtPm1fcFdyaXRlckdsb2JJbnQsICZwQy0+bV9wV3JpdGVyRGF0YUludCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEluaXQgdGhlIDNHUFAgd3JpdGVyICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RPcGVuKCZwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fUGFyYW1zLnBPdXRwdXQzZ3BwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FsRmlsZVdyaXRlLCBwQy0+bV9QYXJhbXMucFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhbEZpbGVSZWFkKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBMaW5rIHRvIHRoZSB3cml0ZXIgY29udGV4dCBpbiB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5tX3BXcml0ZXJEYXRhSW50LT5wV3JpdGVyQ29udGV4dCA9IHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00UFRPM0dQUF9TSUdOQVRVUkUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogXAotICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SKjEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IqMTAKLSAgICAgICAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmdWlWZXJzaW9uKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbikgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtID0KLSAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyVmlkZW9TdHJlYW0iKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbSwgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvID0KLSAgICAgICAgKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtSW5mbyIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJWaWRlb1N0cmVhbUluZm8sXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+aGVpZ2h0ICAgICAgICA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aCAgICAgICAgID0gRW5jUGFyYW1zLkZyYW1lV2lkdGg7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+ZnBzICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmICAgPSBNNE9TQV9OVUxMOwotICAgIC8qKiBObyBoZWFkZXIsIHdpbGwgYmUgc2V0IGJ5IHNldE9wdGlvbiAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPkhlYWRlci5TaXplICAgPSAwOwotCi0gICAgLyoqCi0gICAgICogIEZpbGwgVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIEFkZFN0cmVhbSBtZXRob2QgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbUlEID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmb3JtYXQgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rTVBFR180OyAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0gyNjM7ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OyAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gYml0cmF0ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjg4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1MTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMl9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazhfTUJQUzoKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZSA9IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTIDoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVua25vd24gZm9ybWF0IDB4JXggcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZHVyYXRpb24gICAgICAgICAgICAgICAgICA9IDA7ICAgICAgICAvKio8IER1cmF0aW9uIGlzIG5vdCBrbm93biAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+dGltZVNjYWxlICAgICAgICAgICAgICAgICA9IDA7ICAgIC8qKjwgTm90IHVzZWQgYnkgdGhlIGNvcmUgd3JpdGVyICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSAwOyAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mbyAgICAgICA9IChNNE9TQV9NZW1BZGRyMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAgID0gc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIHZpZGVvIHN0cmVhbSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJWaWRlb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuc2l6ZSAgICAgICAgPSAwOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuZnJhZyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLnN0cmVhbSAgICAgID0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuYXR0cmlidXRlICAgPSBBVV9SQVA7Ci0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiAgSWYgdGhlcmUgaXMgYW4gYXVkaW8gaW5wdXQsIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBhdWRpbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtID0KLSAgICAgICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJBdWRpb1N0cmVhbSIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFdyaXRlckF1ZGlvU3RyZWFtLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvID0KLSAgICAgICAgICAgIChNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MpLCBNNFBUTzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyQXVkaW9TdHJlYW1JbmZvIik7Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZygpOiB1bmFibGUgdG8gYWxsb2NhdGUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvU3RyZWFtSW5mbywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJDaGFubmVscyA9IDE7ICAgICAgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotCi0gICAgICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pICYmIC8qIGF1ZGlvIGNvdWxkIGhhdmUgYmVlbiBkaXNjYXJkZWQgKi8KLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+SGVhZGVyLlNpemUgPQotICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2ggKHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYzoKLSAgICAgICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5oYW5kbGVkIGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtSUQgICAgICAgICAgICAgICAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmR1cmF0aW9uICAgICAgICAgICAgICAgICAgPSAwOy8qKjwgRHVyYXRpb24gaXMgbm90IGtub3duIHlldCAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAgICAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX0FNUl9USU1FX1NDQUxFOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnByb2ZpbGVMZXZlbCAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1BST0ZJTEVfTEVWRUw7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgICAgICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5tYXhCaXRyYXRlICAgICAgICAgICAgICAgID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5hdmVyYWdlQml0cmF0ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBcCi0gICAgICAgICAgICBpbiB0aGUgRFNJIHBvaW50ZXIuLi4gKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMilwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgYXVkaW8gc3RyZWFtICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTICAgICAgICAgPSBwQy0+bV9Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7ICAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLnNpemUgICAgICAgID0gMDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5mcmFnICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUubmJGcmFnICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zdHJlYW0gICAgICA9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbTsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgICA9IEFVX1JBUDsKLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogVmlkZW8gRW5jb2RlciBJbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioKLSAgICAgKiBQVE8gdXNlcyBpdHMgb3duIGJpdHJhdGUgcmVndWxhdGlvbiwgbm90IHRoZSAidHJ1ZSIgY29yZSByZWd1bGF0aW9uICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9UUlVFOyAvL000T1NBX0ZBTFNFOwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSBNNFBUTzNHUFBfUVVBTlRJWkVSX1NURVA7Ci0KLSAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPm1fUGFyYW1zLnZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5tX1BhcmFtcy52aWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogT3RoZXIgZW5jb2RlciBzZXR0aW5ncyAqLwotCi0gICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSAgICA9IDA7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgICAgICAgICA9IE00T1NBX0ZBTFNFOyAgIC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kICAgICAgICAgICAgID0gMTU7ICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzICA9IDA7ICAgICAgICAgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uICAgICAgICAgICAgPSBNNE9TQV9UUlVFOyAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyAgICAgICAgPSBNNE9TQV9GQUxTRTsgICAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0SW5pdCgmcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyRGF0YUludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUF9hcHBseVZQUCwgcEMsIHBDLT5tX3BFbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RJbml0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZDsKLQotICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0T3BlbihwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsICZwQy0+bV9Xcml0ZXJWaWRlb0FVLCAmRW5jUGFyYW1zKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0YXJ0KQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdGFydChwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICAqIE5vIG1vcmUgIHNldG9wdGlvbiBvbiAiTTRFTkNPREVSX2tWaWRlb0ZyYWdtZW50U2l6ZSIgaGVyZS4KLSAgICAgKiBJdCBpcyBub3cgYXV0b21hdGljbHkgYW5kICJzbWFydGx5IiBzZXQgaW4gdGhlIGVuY29kZXIgc2hlbGwuICovCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIDNHUCBvdXQgYWRkIHN0cmVhbXMgICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0odmlkZW8pIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aWRlbyBtYXggYXUgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgb3B0aW9uVmFsdWUudmFsdWUgPSAoTTRPU0FfVUludDMyKSgxLjVGICogKE00T1NBX0Zsb2F0KShwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT53aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgIE00T1NBX1RSQUNFM18xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyxNNFdSSVRFUl9rTWF4QVVTaXplOiAldSIsb3B0aW9uVmFsdWUudmFsdWUpOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbih2aWRlbyxcCi0gICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHZpZGVvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgIG9wdGlvblZhbHVlLnZhbHVlID0gKE00T1NBX1VJbnQzMikoKE00T1NBX0Zsb2F0KW9wdGlvblZhbHVlLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcsTTRXUklURVJfa01heENodW5ja1NpemU6ICV1IixvcHRpb25WYWx1ZS52YWx1ZSk7Ci0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24odmlkZW8sXAotICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYXVkaW8gbWF4IGF1IHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgICAgICAgPSBNNFBUTzNHUFBfQVVESU9fTUFYX0FVX1NJWkU7Ci0gICAgICAgIG9wdGlvblZhbHVlLnN0cmVhbUlEICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oYXVkaW8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heEFVU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IGF1ZGlvIG1heCBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IE00UFRPM0dQUF9BVURJT19NQVhfQ0hVTktfU0laRTsgLyoqPCBNYWdpY2FsICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2xvc2UgdGhlIHN0cmVhbSByZWdpc3RlcmluZyBpbiBvcmRlciB0byBiZSByZWFkeSB0byB3cml0ZSBkYXRhICovCi0gICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcocEMtPm1fcDNncFdyaXRlckNvbnRleHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTdGFydFdyaXRpbmcgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLCBNNE9TQV9UaW1lIG10SW5jQ3RzKQotICogQGJyaWVmICAgV3JpdGUgYW4gQU1SIDEyLjJrYnBzIHNpbGVuY2UgRlJBTUUgaW50byB0aGUgd3JpdGVyCi0gKiBAbm90ZSAgICBNYWlubHkgdXNlZCB0byBmaXggdGhlICdienonIGJ1Zy4uLgotICogQHBhcmFtICAgcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UgKElOKSAgICB3cml0ZXIgZGF0YSBpbnRlcmZhY2VzCi0gKiAgICAgICAgICBwV3JpdGVyQ29udGV4dCAgICAgICAgICAoSU4vT1VUKXdyaXRlciBjb250ZXh0Ci0gKiAgICAgICAgICBwV3JpdGVyQXVkaW9BVSAgICAgICAgICAoT1VUKSAgIHdyaXRlciBhdWRpbyBhY2Nlc3MgdW5pdAotICogICAgICAgICAgbXRJbmNDdHMgICAgICAgICAgICAgICAgKElOKSAgICB3cml0ZXIgQ1RTCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcFdyaXRlckF1ZGlvQVUtPmRhdGFBZGRyZXNzLAotICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8xMjJfRlJBTUUsIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRSk7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPnNpemUgICAgPSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkU7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPkNUUyAgICAgPSBtdEluY0N0czsKLSAgICBwV3JpdGVyQXVkaW9BVS0+bmJGcmFnICA9IDA7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFByb2Nlc3NBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyQXVkaW9BVSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZTogcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UwNDhGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsIE00T1NBX1RpbWUgbXRJbmNDdHMpCi0gKiBAYnJpZWYgICBXcml0ZSBhbiBBTVIgMTIuMmticHMgc2lsZW5jZSBGUkFNRSBpbnRvIHRoZSB3cml0ZXIKLSAqIEBub3RlICAgIE1haW5seSB1c2VkIHRvIGZpeCB0aGUgJ2J6eicgYnVnLi4uCi0gKiBAcGFyYW0gICBwV3JpdGVyRGF0YUludEludGVyZmFjZSAoSU4pICAgIHdyaXRlciBkYXRhIGludGVyZmFjZXMKLSAqICAgICAgICAgIHBXcml0ZXJDb250ZXh0ICAgICAgICAgIChJTi9PVVQpd3JpdGVyIGNvbnRleHQKLSAqICAgICAgICAgIHBXcml0ZXJBdWRpb0FVICAgICAgICAgIChPVVQpICAgd3JpdGVyIGF1ZGlvIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICBtdEluY0N0cyAgICAgICAgICAgICAgICAoSU4pICAgIHdyaXRlciBDVFMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0KiBwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSBtdEluY0N0cykKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBTdGFydEFVKHBXcml0ZXJDb250ZXh0LCBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShhdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBXcml0ZXJBdWRpb0FVLT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKU00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV8wNDhfRlJBTUUsCi0gICAgICAgICAgICAgICAgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+c2l6ZSAgICA9IE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICBwV3JpdGVyQXVkaW9BVS0+Q1RTICAgICA9IG10SW5jQ3RzOwotICAgIHBXcml0ZXJBdWRpb0FVLT5uYkZyYWcgID0gMDsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wUHJvY2Vzc0FVKHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWU6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnQtPnBQcm9jZXNzQVUoc2lsZW5jZSkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTZhNjQ5OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgICBQaWN0dXJlIHRvIDNncHAgU2VydmljZSB2aWRlbyBwcmVwcm9jZXNzaW5nIG1hbmFnZW1lbnQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqCi0gKiAgICBPU0FMIERlYnVnIHV0aWxpdGllcyAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKgotICogICAgT1NBTCBNZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0ICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIHRoZSBNNFBUTzNHUFAgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0Vycm9yQ29kZXMuaCIKLQotLyogSWYgdGltZSBpbmNyZW1lbnQgaXMgdG9vIGxvdyB0aGVuIHdlIGhhdmUgYW4gaW5maW5pdGUgYWxsb2MgbG9vcCBpbnRvIE00VmlFbmNDYXB0dXJlRnJhbWUoKSAqLwotLyogVGltZSBpbmNyZW1lbnQgc2hvdWxkIG1hdGNoIDMwIGZwcyBtYXhpbXVtICovCi0jZGVmaW5lIE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQgMzMuMzMzMzMzNAotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQIGludGVybmFsIGNvbnRleHQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSICAgIGVycjsKLSAgICBNNE9TQV9Eb3VibGUgbXREdXJhdGlvbjsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIC8qKiogTk9URSAqKiovCi0gICAgLyogSXQncyBPSyB0byBnZXQgcFBsYW5lSW4gPT0gTTRPU0FfTlVMTCBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBzaW5jZSBpdCBoYXMgYmVlbiBnaXZlbiBOVUxMIGluIHRoZSBwRmN0RW5jb2RlKCkgY2FsbC4gICAgICAgICAgICAqLwotICAgIC8qIEl0J3MgYmVjYXVzZSB3ZSB1c2UgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0IHRvICAgICAgICAgICAgKi8KLSAgICAvKiB0cmFuc21pdCB0aGUgZW5jb2RlciBpbnB1dCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlIGlucHV0IGRhdGEgaXMgdGhlIGltYWdlIHJlYWQgZnJvbSB0aGUgbV9wUGljdHVyZUNhbGxiYWNrRmN0ICAgICovCi0KLSAgICAvKioKLSAgICAgKiAgICBUaGUgVlBQIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIE00UFRPM0dQUCBjb250ZXh0ISAqLwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICBHZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlICovCi0gICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjaykKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0KHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCwgcFBsYW5lT3V0LAotICAgICAgICAgICAgICZtdER1cmF0aW9uKTsKLQotICAgICAgICAvKiBJbiBjYXNlIG9mIGVycm9yIHdoZW4gZ2V0dGluZyBZVVYgdG8gZW5jb2RlIChleDogZXJyb3Igd2hlbiBkZWNvZGluZyBhIEpQRUcpICovCi0gICAgICAgIGlmKChNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSAhPSBlcnIpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIGVuZCBvZiBlbmNvZGluZyBpcyBhc2tlZCBieSB0aGUgc2l6ZSBsaW1pdGF0aW9uIHN5c3RlbSwKLSAgICAgICAgICogd2UgbXVzdCBlbmQgdGhlIGVuY29kaW5nIHRoZSBzYW1lIHdheSB0aGF0IHdoZW4gaXQgaXMgYXNrZWQgYnkgdGhlCi0gICAgICAgICAqIHBpY3R1cmUgY2FsbGJhY2sgKGEuay5hLiB0aGUgaW50ZWdyYXRvcikuCi0gICAgICAgICAqIFRodXMgd2Ugc2ltdWxhdGUgdGhlIExhc3RQaWN0dXJlIGNvZGUgcmV0dXJuOiAqLwotICAgICAgICBpZiAoTTRPU0FfVFJVRSA9PSBwQy0+bV9Jc0xhc3RQaWN0dXJlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFKSA9PSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX2JMYXN0SW50ZXJuYWxDYWxsQmFjayA9IE00T1NBX1RSVUU7IC8qIFRvZ2dsZSBmbGFnIGZvciB0aGUgZmluYWwgY2FsbCBvZiB0aGUgQ0IqLwotICAgICAgICAgICAgcEMtPm1fSXNMYXN0UGljdHVyZSAgICAgICAgID0gTTRPU0FfVFJVRTsgLyogVG8gc3RvcCB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgcEMtPnBTYXZlZFBsYW5lICAgICAgICAgICAgID0gcFBsYW5lT3V0OyAgLyogU2F2ZSB0aGUgbGFzdCBZVVYgcGxhbmUgcHRyICovCi0gICAgICAgICAgICBwQy0+dWlTYXZlZER1cmF0aW9uICAgICAgICAgPSAoTTRPU0FfVUludDMyKW10RHVyYXRpb247IC8qIFNhdmUgdGhlIGxhc3QgZHVyYXRpb24gKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKio8IE5vdCBuZWNlc3NhcnkgaGVyZSBiZWNhdXNlIHRoZSBsYXN0IGZyYW1lIGR1cmF0aW9uIGlzIHNldCB0byB0aGUtbGFzdC1idXQtb25lIGJ5Ci0gICAgICAgICAgICAgICAgdGhlIGxpZ2h0IHdyaXRlciAqLwotICAgICAgICAvKio8IE9ubHkgbmVjZXNzYXJ5IGZvciBwQy0+bV9tdE5leHRDdHMgYmVsb3cuLi4qLwotICAgICAgICBtdER1cmF0aW9uID0gcEMtPnVpU2F2ZWREdXJhdGlvbjsKLQotCi0gICAgICAgIC8qKiBDb3B5IHRoZSBsYXN0IFlVViBwbGFuZSBpbnRvIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgKiAodGhlIGxhc3QgcGljIGlzIHNwbGl0ZWQgZHVlIHRvIHRoZSBjYWxsYmFjayBleHRyYS1jYWxsLi4uICovCi0gICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lT3V0W2ldLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wU2F2ZWRQbGFuZVtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaW1lSW5jcmVtZW50IHNob3VsZCBiZSAzMCBmcHMgbWF4aW11bSAqLwotICAgIGlmKG10RHVyYXRpb24gPCBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UKQotICAgIHsKLSAgICAgICAgbXREdXJhdGlvbiA9IE00UFRPM0dQUF9NSU5fVElNRV9JTkNSRU1FTlQ7Ci0gICAgfQotCi0gICAgcEMtPm1fbXROZXh0Q3RzICs9IG10RHVyYXRpb247Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX2FwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDg1OTE1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UkVBREVSX0Ftci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQW1yLmMKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIGFtciByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGdlbmVyaWMgTTRSRUFERVIgaW50ZXJmYWNlCi0gKiAgICAgICAgIG9uIHRvcCBvZiB0aGUgQU1SIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJNNEFNUlJfQ29yZVJlYWRlci5oIgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9BTVJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgYSBhbXIgcmVhZGVyIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgICAgVGhlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGFuZCBkZS1hbGxvY2F0ZWQgYnkgdGhlIHJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9BTVJfQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fcENvcmVDb250ZXh0OyAgICAgLyoqPCBjb3JlIGFtciByZWFkZXIgY29udGV4dCAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIG1fcEF1ZGlvU3RyZWFtOyAgICAgLyoqPCBwb2ludGVyIG9uIHRoZSBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiByZXR1cm5lZCBieSB0aGUgY29yZSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgIG1fYXVkaW9BdTsgICAgICAgICAgLyoqPCBhdWRpbyBhY2Nlc3MgdW5pdCB0byBiZSBmaWxsZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICBtX21heER1cmF0aW9uOyAgICAgIC8qKjwgZHVyYXRpb24gb2YgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgbV9wT3NhRmlsZVJlYWRlckZjdHM7ICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfQU1SX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwUmVhZGVyQ29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2NyZWF0ZTogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHBSZWFkZXJDb250ZXh0ID0gKE00UkVBREVSX0FNUl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00UkVBREVSX0FNUl9Db250ZXh0KSwKLSAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfQU1SX0NvbnRleHQiKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9tYXhEdXJhdGlvbiA9IDA7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9kZXN0cm95KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZGVzdHJveSgpOiBNNFJFQURFUl9BTVJfZGVzdHJveTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZnJlZShwQyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICAgdGhpcyBmdW5jdGlvbiBvcGVucyB0aGUgQU1SIGZpbGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZyB0aGUgbWVkaWEgdG8gb3BlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBGaWxlRGVzY3JpcHRvciksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRBTVJSX29wZW5SZWFkKCAmcEMtPm1fcENvcmVDb250ZXh0LCBwRmlsZURlc2NyaXB0b3IsIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgY2xvc2UgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFJFQURFUl9BTVJfY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgZXJyOwotICAgIE00QU1SUl9TdGF0ZSBTdGF0ZTsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2UoKTogTTRSRUFERVJfQU1SX2Nsb3NlOiBjb250ZXh0IGlzIE00T1NBX05VTEwsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9QQVJBTUVURVIiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkKTsKLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfZ2V0U3RhdGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSktPm1fc3RyZWFtSWQsICAmcEMtPm1fYXVkaW9BdSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9jbG9zZTogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRGVsZXRlIHRoZSBEU0kgaWYgbmVlZGVkICovCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKFwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotCi0gICAgICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BDb3JlQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9jbG9zZVJlYWQocEMtPm1fcENvcmVDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcENvcmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUgICAgY3VycmVudCB2ZXJzaW9uIG5lZWRzIHRvIHRyYW5zbGF0ZSBNNFNZU19TdHJlYW0gdG8gTTRfU3RyZWFtSGFuZGxlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChPVVQpICBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIGZpbGxlZCB3aXRoIHRoZSBmb3VuZCBzdHJlYW0gZGVzY3JpcHRpb24KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG1vZGUgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlclBhcmFtID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRBTVJSX2dldE5leHRTdHJlYW0oIHBDLT5tX3BDb3JlQ29udGV4dCwgJnN0cmVhbURlc2MpOwotICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9TVFJFQU0pCi0gICAgewotICAgICAgICBzdHJlYW1JZEFycmF5WzBdID0gMDsKLSAgICAgICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgICAgIGVyciA9IE00QU1SUl9zdGFydFJlYWRpbmcocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5KTsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpTTRFUlJfQUxMT0MgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IE00QU1SUl9zdGFydFJlYWRpbmcgcmV0dXJucyBNNEVSUl9BTExPQyEiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0FNUiwgKE00T1NBX0NoYXIgKikiTTRfQXVkaW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXIgPShNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgKnBTdHJlYW1IYW5kbGVyUGFyYW0gPSBwU3RyZWFtSGFuZGxlcjsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAvKgotICAgICAqIEF1ZGlvIHN0cmVhbSBoYW5kbGVyIGZpZWxkcyBhcmUgaW5pdGlhbGlzZWQgd2l0aCAwIHZhbHVlLgotICAgICAqIFRoZXkgd2lsbCBiZSBwcm9wZXJseSBzZXQgYnkgdGhlIEFNUiBkZWNvZGVyCi0gICAgICovCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSAgICA9IDA7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IDA7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkICAgICAgICAgICAgICAgID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhICAgICAgICAgICAgICAgPSAodm9pZCopc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLQotICAgIGlmIChzdHJlYW1EZXNjLmR1cmF0aW9uID4gcEMtPm1fbWF4RHVyYXRpb24pCi0gICAgewotICAgICAgICBwQy0+bV9tYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlICAgICAgICAgID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIE00QU1SUl9nZXRtYXhBVXNpemUocEMtPm1fcENvcmVDb250ZXh0LCAmcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplKTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzYy5zdHJlYW1UeXBlKQotICAgIHsKLSAgICBjYXNlIE00U1lTX2tBTVI6Ci0gICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgPSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRTWVNfa0FNUl9XQjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluaXRpYWxpemUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEF1LT5zaXplICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAtMjA7Ci0gICAgcEF1LT5EVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgLyogSkM6IGJ1ZyBmaXggMTE5NyAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAtMjA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHN0cmVhbSBvZiB0aGUgbWVkaWEKLSAqICAgICAgICAgIC0gdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uIDoKLSAgICAgICAgewotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwQy0+bV9tYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFNUlJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIgOgotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKilwVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHJlc2V0IHRoZSBzdHJlYW0sIHRoYXQgaXMgc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBpcyB0byBiZSBkZXByZWNhdGVkIGluIG5leHQgdmVyc2lvbnMKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEUgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX3Jlc2V0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBmb3IgcmVzZXQgZHVyaW5nIHBsYXliYWNrICovCi0gICAgLyogKHNldCBDVFMgdG8gLTIwIGluIG9yZGVyIHRoZSBmaXJzdCBBVSBDVFMgaXMgMCkgKi8KLSAgICBwQXUtPkNUUyA9IC0yMDsKLSAgICBwQXUtPkRUUyA9IC0yMDsKLQotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX3Jlc2V0OiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgICB0aGUgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICB0aGUgdGltZSBjYW4gbm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0gICAgTTRBTVJSX1N0YXRlICAgICAgICAgICAgU3RhdGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfM0dQX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLSAgICBlcnIgPSBNNEFNUlJfc2VlayhwQy0+bV9wQ29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa05vUkFQcHJldmlvdXMsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogZXJyb3Igd2hlbiBjYWxsaW5nIE00QU1SUl9zZWVrKClcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqICAgICAgICAgIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIG5lZWQgdG8gdHJhbnNsYXRlIE00T1NBX0FjY2Vzc1VuaXQgdG8gTTRfQWNjZXNzVW5pdAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEgKHRoZSBhdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX0FNUl9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIHRpbWVTY2FsZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGVyciA9IE00QU1SUl9nZXRTdGF0ZShwQy0+bV9wQ29yZUNvbnRleHQsICZTdGF0ZSwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpOwotICAgIGlmIChNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID09IFN0YXRlKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BVklfZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRBTVJSX25leHRBVShwQy0+bV9wQ29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotCi0gICAgaWYgKGVyciA9PSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgdGltZVNjYWxlID0gKE00T1NBX0Zsb2F0KShNNE9TQV9JbnQzMikocFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKS8xMDAwOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkNUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkRUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0dsb2JhbEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgICpwUmRyRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0gKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzMzkzMGIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9XYXYuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgcGNtIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1dBVl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9QQ01fQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fY29yZUNvbnRleHQ7ICAgICAgICAvKio8IGNvcmUgd2F2IHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgbV9wQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wT3NhRmlsZVJlYWRlckZjdHM7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfUENNX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGEgd2F2IHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgUG9pbnRlciB0byBhIHdhdiByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwUmVhZGVyQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX2NvcmVDb250ZXh0ICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyAgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGUgY29udGV4dCBpcyB1bi1hbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSByZWFkZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3I6ICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRQQ01SX29wZW5SZWFkKCYocEMtPm1fY29yZUNvbnRleHQpLCAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBGcmVlIGF1ZGlvIEFVIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2Nsb3NlOiBFcnJvciB3aGVuIGZyZWVpbmcgYXVkaW8gYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX2NvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhhIFBDTSBmaWxlICovCi0gICAgICAgZXJyID0gTTRQQ01SX2Nsb3NlUmVhZChwQy0+bV9jb3JlQ29udGV4dCk7Ci0gICAgICAgcEMtPm1fY29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fc2V0T3B0aW9uOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlciwgZ2l2ZW4gYW4gb3B0aW9uIElELgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogKElOKSBvcHRpb24gaWRlbnRpZmljYXRvciB3aG9zZSBvcHRpb24gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtICAgcFZhbHVlOiAgKE9VVCkgb3B0aW9uIHZhbHVlIHJldHJpZXZlZC4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIHJlcXVpcmVkIG9wdGlvbiBpZGVudGlmaWNhdG9yIGlzIHVua25vd24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgdm9pZCogcFZhbHVlKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciAgICAgID0gTTROT19FUlJPUjsKLQotICAgIC8qIG5vIGNoZWNrIG9mIGNvbnRleHQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHNvbWUgb3B0aW9uIGRvZXMgbm90IG5lZWQgaXQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWYWx1ZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICBlcnIgPSBNNFBDTVJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0vKiAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ki8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgZkR1cmF0aW9uOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qIHBEc2k7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRQQ01SX2dldE5leHRTdHJlYW0oIHBDLT5tX2NvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRQQ01SX3N0YXJ0UmVhZGluZyhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7IC8qdG8gcHV0IGluIG9wZW4gZnVuY3Rpb24qLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOyAvKmFsc28gcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0F1ZGlvVW5rbm93bjoKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzE2Yml0c1M6Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNVOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fOGJpdHNVOgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGZvdW5kIFVOS05PV04gc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgcERzaSA9IChNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwRHNpID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGluIHN0cmVhbSIpOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHBEc2ktPlNhbXBsZUZyZXF1ZW5jeTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gKE00T1NBX1VJbnQzMikocERzaS0+Qml0c1BlclNhbXBsZS84KTsKLSAgICAvKiBtX2J5dGVGcmFtZUxlbmd0aCBpcyBiYWRseSBuYW1lZDogaXQgaXMgbm90IGluIGJ5dGVzIGJ1dCBpbiBzYW1wbGVzIG51bWJlciAqLwotICAgIGlmKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlICovCi0gICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPQotICAgICAgICAgICAgICgoKHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUvOCkvNTApL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOy8qLzUwIHRvIGdldCBhcm91bmQgMjAgbXMgb2YgYXVkaW8qLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBQUMgQ2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzE1LjYyNSkvcERzaS0+bmJDaGFubmVscylcCi0gICAgICAgICAgICAgICAgL3BBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7Ci0KLSAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50MzIpZkR1cmF0aW9uOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9Ci0gICAgICAgICh2b2lkKilzdHJlYW1EZXNjLnRpbWVTY2FsZTsgLyp0cmljayB0byBjaGFuZ2UqLwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9hdmVyYWdlQml0UmF0ZSAgICAgICAgICA9IHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGU7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX21heEFVU2l6ZSAgICAgICAgICAgICAgID0KLSAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemVcCi0gICAgICAgICAgICAqcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9zdHJlYW1UeXBlICAgICAgICAgICAgICA9IE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOwotCi0gICAgKnBTdHJlYW1IYW5kbGVyID0gcEMtPm1fcEF1ZGlvU3RyZWFtOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gaGFuZGxlciB0byB3aGljaCB0aGUgYWNjZXNzIHVuaXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOy8qcEJ1ZmZlcjsqLwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzOiBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NCA9IDA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX3Jlc2V0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gMDsKLSAgICBwQXUtPkRUUyA9IDA7Ci0KLSAgICAvKiBUaGlzIGNhbGwgaXMgbmVlZGVkIG9ubHkgd2hlbiByZXBsYXkgZHVyaW5nIHBsYXliYWNrICovCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBhY2Nlc3MgdW5pdCBvZiB0aGUgc3BlY2lmaWVkIHN0cmVhbQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4vT1VUKSAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlciBjcmVhdGlvbikKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotICogQHJldHVybnMgTTRXQVJfTk9fREFUQV9ZRVQgICAgICAgICAgIHRoZXJlIGlzIG5vIGVub3VnaCBkYXRhIG9uIHRoZSBzdHJlYW0gZm9yIG5ldyBhY2Nlc3MgdW5pdAotICogQHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1KE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIC8qIGtlZXAgdHJhY2Ugb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzIGluIEFVIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGF0IGRlc3Ryb3koKQotICAgICAgIGJ1dCBiZSBhd2FyZSB0aGF0IHN5c3RlbSBpcyByaXNreSBhbmQgd291bGQgbmVlZCB1cGdyYWRlIGlmIG1vcmUgdGhhbgotICAgICAgIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIEFVIGlzIG5lZWRlZCAqLwotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBlcnIgPSBNNFBDTVJfbmV4dEFVKHBDLT5tX2NvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLQotICAgIGlmIChlcnIgPT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgPSAoTTRPU0FfRG91YmxlKXBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemU9MDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAganVtcCBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIHNwZWNpZmllZCB0aW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXIgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcFRpbWUgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOiB0aGUgdGltZSB0byB3aGljaCB0aGUgc3RyZWFtIHJlYWxseSBqdW1wZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dCBpbiB0aGlzIHJlYWRlciwgd2UgZG8gbm90IG1vZGlmeSB0aGUgdGltZQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgdGltZTY0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl9QQ01fanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQQ01SX2ZyZWVBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9qdW1wOiBFcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBlcnIgPSBNNFBDTVJfc2VlayhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rQmVnaW5uaW5nLCAmdGltZTY0KTsKLQotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotICoKLSAqIEBwYXJhbSBwTWVkaWFUeXBlICAgICAgICAgIDogUG9pbnRlciBvbiBhIE00UkVBREVSX01lZGlhVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSAqIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIHJlYWRlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm5zIDogTTROT19FUlJPUiAgICAgaWYgT0sKLSAqICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSAqICAgICAgICAgICAgRVJSX1BBUkFNRVRFUiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUgcGFzc2VkIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyR2xvYmFsSW50ZXJmYWNlID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJEYXRhSW50ZXJmYWNlID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0RhdGFJbnRlcmZhY2UiKTsKLQotICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0KLSAgICAgICAgIChNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ00gR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJHbG9iYWxJbnRlcmZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwUmRyRGF0YUludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfRGF0YUludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfRGF0YUludGVyZmFjZSksIE00UkVBREVSX1dBViwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopICJNNFJFQURFUl9QQ00gRGF0YUludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyRGF0YUludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgIGZyZWUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlUENNOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jcmVhdGU7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgICAgICAgICA9IE00UkVBREVSX1BDTV9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2Nsb3NlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICAgICAgPSBNNFJFQURFUl9QQ01fc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgICAgID0gTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSAgID0gTTRPU0FfTlVMTDsgLyphbGwgQVVzIGFyZSBSQVAqLwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgICAgICA9IE00UkVBREVSX1BDTV9nZXROZXh0QXU7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9yZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M2N2U3Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGV4dGVybmFsIEJpdHN0cmVhbSBwYXJzZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDggY29kZTsKLSAgICBNNE9TQV9JbnQzMiBwcm9maWxlOwotICAgIE00T1NBX0ludDMyIGxldmVsOwotfSBjb2RlUHJvZmlsZUxldmVsOwotCi1zdGF0aWMgY29kZVByb2ZpbGVMZXZlbCBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW10gPSB7Ci0gICAgezB4MDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MDIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MDQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAotICAgIHsweDA1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9LAotICAgIHsweDA4LCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAotICAgIHsweDExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgxMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlLE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4MzMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDM0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHg0MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4NTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg3MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDgxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDgyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDkxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg5MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweDk0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhhMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhhMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhhMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGIyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4YjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhiNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGMxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGQxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhkMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGYwLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4ZjEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHhmMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGYzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKLSAgICB7MHhmNSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9Ci19OwotCi1NNE9TQV9VSW50MzIgTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeShNNFZTX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwKLSAgICAgTTRPU0FfVUludDMyIG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybihNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KHBhcnNpbmdDdHh0LG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00VkRfRVhURVJOQUxfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgICAgICByZXR1cm4gKE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoIGJpdHNUb1dyaXRlLGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIE00REVDT0RFUl9FWFRFUk5BTF9QYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLCBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpCi17Ci0gICAgTTRWU19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgICAgICAgICA9IDA7Ci0gICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCAgICAgICAgICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9JbnQ4ICopcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpCi0gICAgewotICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmFuZG9tIGFjY2Vzc2libGUgdm9sICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KTsvKiB2aWRlbyBvYmplY3QgdHlwZSBpbmRpY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHZpZGVvIG9iamVjdCBsYXllciB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7IC8qIHBhcl93aWR0aCBhbmQgcGFyX2hlaWdodCAoOCs4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Lyogdm9sIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7LyogY2hyb21hIGZvcm1hdCArIGxvdyBkZWxheSAoMysxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2YnYgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgYml0cmF0ZSArIDIgbWFya2VyIGJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE1ICsgMSArIDE1ICsgMSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSk7LyogZmlyc3QgYW5kIGxhdHRlciBoYWxmIHZidiBidWZmZXIgc2l6ZSArIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSszKzExKzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7LyogZmlyc3QgaGFsZiB2YnYgb2NjdXBhbmN5ICsgbWFya2VyIGJpdHMgKDE1KzEpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgcmV0dXJuIDA7IC8qIG9ubHkgcmVjdGFuZ3VsYXIgY2FzZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfaW5jcl9sZW5ndGggPSAoaSA9PSAwKSA/IDEgOiBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBGaXhlZCBWT1AgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCk7LyogRml4ZWQgVk9QIHRpbWUgaW5jcmVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIC8qIDAgPSByZWN0YW5ndWxhciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3ByaXRlIHN0YXRpYyA9IDEgYW5kIFNwcml0ZSBHTUMgPSAyICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG93IGxhdGVuY3kgc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBzYWRjdCBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsvKiBxdWFudCBwcmVjaXNpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wcmVjaXNpb24gPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7IC8qIG5vZ3JheSBxdWFudCB1cGRhdGUgKyBjb21wb3NpdGlvbiBtZXRob2QgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXIgY29tcG9zaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsvKiBuZXdwcmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZHVjZWQgcmVzb2x1dGlvbiB2b3AgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWYgbGF5ZXIgaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmhhbmNlbWVudCB0eXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVByb2ZpbGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjUgOiB2aXN1YWxfb2JqZWN0X3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCNSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgb2JqZWN0IGxheWVyIGlkZW50aWZpZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlzdWFsIG9iamVjdCBsYXllciBwcmlvcml0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIGVuZCAtLS0tLSAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCkgewotCi0gICAgTTRPU0FfVUludDE2IGluZGV4ID0gMjg7IC8qIHRoZSAyOXRoIGJ5dGUgaXMgU1BTIHN0YXJ0ICovCi0gICAgTTRPU0FfQm9vbCBjb25zdHJhaW50U2V0MzsKLQotICAgIGlmICgocFByb2ZpbGUgPT0gTTRPU0FfTlVMTCkgfHwgKHBMZXZlbCA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmICgoRFNJU2l6ZSA8PSBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbDogRFNJIGlzIGludmFsaWQiKTsKLSAgICAgICAgKnBQcm9maWxlID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBjb25zdHJhaW50U2V0MyA9IChwRFNJW2luZGV4KzJdICYgMHgxMCk7Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlX2J5dGUgJWQsIGxldmVsX2J5dGU6ICVkIGNvbnN0cmFpbjNmbGFnIiwKLSAgICAgICAgICBwRFNJW2luZGV4KzFdLCBwRFNJW2luZGV4KzNdLCBjb25zdHJhaW50U2V0Myk7Ci0KLSAgICBzd2l0Y2ggKHBEU0lbaW5kZXgrMV0pIHsKLSAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzNdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRTZXQzKQotICAgICAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICVsZCBsZXZlbCAlbGQiLCAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDc7IC8qIHRoZSA1dGggYW5kIDZ0aCBieXRlcyBjb250YWluIHRoZSBsZXZlbCBhbmQgcHJvZmlsZSAqLwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIGludmFsaWQgcG9pbnRlciBmb3IgcFByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPCBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEgyNjNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZSIsCi0gICAgICAgICAgcERTSVs2XSwgcERTSVs1XSk7Ci0gICAgLyogZ2V0IHRoZSBIMjYzIGxldmVsICovCi0gICAgc3dpdGNoIChwRFNJWzVdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIH0KLQotICAgIC8qIGdldCBIMjYzIHByb2ZpbGUgKi8KLSAgICBzd2l0Y2ggKHBEU0lbNl0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlQW5kTGV2ZWwgJWQiLCBwcm9maWxlQW5kTGV2ZWwpOwotICAgIGxlbmd0aCA9IHNpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlKSAvc2l6ZW9mKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbMF0pOwotICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0uY29kZSA9PSBwcm9maWxlQW5kTGV2ZWwpIHsKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0ucHJvZmlsZTsKLSAgICAgICAgICAgICpwTGV2ZWwgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmxldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoImdldE1QRUc0UHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJWxkIGxldmVsICVsZCIsICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI0YjQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX1Rvb2xzLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotICAgIGNvZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL000T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgLy8gICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAodW5zaWduZWQgY2hhcikocGFyc2luZ0N0eHQtPmluKVswXTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5pbisrOwotICAgICAgICAgICAgLy9mcmVhZCgmc3RyZWFtX2J5dGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwxLGluKTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSAoY29kZSA8PCAxKTsKLSAgICAgICAgY29kZSB8PSAoKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSAmIDB4ODApID4+IDcpOwotCi0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA9IChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPDwgMSk7Ci0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLSAgICBNNE9TQV9VSW50MzIgdGVtcF9kZXN0ID0gMCwgbWFzayA9IDAsIHRlbXAgPSAxOwotICAgIE00T1NBX1VJbnQzMiBpbnB1dCA9IGJpdHNUb1dyaXRlOwotICAgIGlucHV0ID0gKGlucHV0IDw8ICgzMiAtIG5iX2JpdHMgLSBvZmZzZXQpKTsKLQotICAgIC8qIFB1dCBkZXN0aW5hdGlvbiBidWZmZXIgdG8gMCAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSAodGVtcCA8PCAoKDcqKGorMSkpLWkraikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1hc2sgPSB+bWFzazsKLSAgICAqZGVzdF9iaXRzICY9IG1hc2s7Ci0KLSAgICAvKiBQYXJzZSBpbnB1dCBiaXRzLCBhbmQgZmlsbCBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yKGo9MDtqPDM7aisrKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoaio4KStpID49IG9mZnNldCAmJiAoaio4KStpIDwgbmJfYml0cyArIG9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKChpbnB1dCAmICgweDgwMDAwMDAwID4+IG9mZnNldCkpID4+ICgzMS1vZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAvLypkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKDMxIC0gaSkpOwotICAgICAgICAgICAgICAgICpkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IChpbnB1dCA8PCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmJiNDZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYwYmMwNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGF1ZGlvIG1peGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiBzaWxlbmNlIGZyYW1lcyBoZXJlICovCi0jZGVmaW5lIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSApOwotLyoqCi0gKiAgICBJbnRlcm5hbCB3YXJuaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qIEEgZGVmaW5lIHVzZWQgd2l0aCBTU1JDIDEuMDQgYW5kIGFib3ZlIHRvIGF2b2lkIHRha2luZwotYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0jZGVmaW5lIE00VlNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICA2MDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggcFNldHRpbmdzLT51aUJlZ2luTG9vcCA+IHBTZXR0aW5ncy0+dWlFbmRMb29wICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lISIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCxyZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMgLDAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpKTsKLSAgICAvKioKLSAgICAqIENvcHkgdGhpcyBzZXR0aW5nIGluIGNvbnRleHQgKi8KLSAgICBwQy0+aUFkZEN0cyA9IHBTZXR0aW5ncy0+dWlBZGRDdHM7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IHBTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsOwotICAgIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID0gcFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0gcFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBDLT5mQlRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZkJUVm9sTGV2ZWw7Ci0gICAgcEMtPmZQVFZvbExldmVsID0gcFNldHRpbmdzLT5mUFRWb2xMZXZlbDsKLSAgICBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBwQy0+YkRvRHVja2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iTG9vcCA9IHBTZXR0aW5ncy0+Ykxvb3A7Ci0gICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAvKioKLSAgICAqIEluaXQgc29tZSBjb250ZXh0IHZhcmlhYmxlcyAqLwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEY7Ci0gICAgcEMtPmZBZGRlZEZhY3RvciA9IDAuMEY7Ci0gICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTZXQgdGhlIE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUJlZ2luTG9vcCA9IHBTZXR0aW5ncy0+dWlCZWdpbkxvb3A7Ci0gICAgcEMtPnVpRW5kTG9vcCA9IHBTZXR0aW5ncy0+dWlFbmRMb29wOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gaW5wdXQgY2xpcCwgYWRkZWQgY2xpcCBhbmQgb3V0cHV0IGNsaXAgYW5kIHByb2NlZWQgd2l0aCB0aGUgc2V0dGluZ3MgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKHBDLCBwU2V0dGluZ3MpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgbWFpbiBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOwotCi0gICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKDE2LAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOwotICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLSAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApKTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dCAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvICovCi0KLSAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogRmlyc3QgMC01MCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGUgOgotICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MCAqIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTKQotICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIG5vIGF1ZGlvIHRyYWNrIChSZW1vdmUgYXVkaW8gdHJhY2sgZmVhdHVyZSkuCi0gICAgICAgICAgICAqIEluIHRoYXQgY2FzZSB3ZSBkb3VibGUgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSAqLwotICAgICAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gPT0gcEMtPmV3Yy5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoICpwUHJvZ3Jlc3MpIDw8PSAxOyAvKio8IHgyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAqcFByb2dyZXNzID49IDUwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgNDk7IC8qKjwgVmlkZW8gcHJvY2Vzc2luZyBpcyBub3QgZ3JlYXRlciB0aGFuIDUwJSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFZpZGVvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gYXVkaW8gYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmlBZGRDdHMgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogTm8gYXVkaW8sIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgIT0gLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLSAwLjUpCi0gICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvID4gcEMtPnVpRW5kTG9vcAotICAgICAgICAgICAgICAgICYmIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTG9vcCA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+Yk5vTG9vcGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIganVtcENUUyA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJmp1bXBDVFMpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IGVycm9yIHdoZW4ganVtcGluZyBpbiBhZGRlZCBhdWRpbyBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXNlIG9mZnNldCB0byBnaXZlIGEgY29ycmVjdCBDVFMgLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvICovCi0gICAgICAgICAgICBpZiggMCAhPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBTZWNvbmQgNTAtMTAwJSBzZWdtZW50IGlzIGRlZGljYXRlZCB0byBzdGF0ZXMgOgotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJTy4uLiAqLwotICAgICAgICAgICAgICAgIC8qIEZvciBBdWRpbyB0aGUgcHJvZ3Jlc3MgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gZEF0byBhbmQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGl0IGlzIG1vcmUgYWNjdXJhdGUgKi8KLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MAotICAgICAgICAgICAgICAgICAgICArICg1MCAqIHBDLT5ld2MuZEFUbyAtIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT5ld2MuaU91dHB1dER1cmF0aW9uKSk7IC8qKjwgNTAgZm9yIDEwMC8yICoqLwotCi0gICAgICAgICAgICAgICAgaWYoICpwUHJvZ3Jlc3MgPj0gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTk7IC8qKjwgSXQncyBub3QgcmVhbGx5IGZpbmlzaGVkLCBJIHByZWZlciB0byByZXR1cm4gbGVzcyB0aGFuIDEwMCUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBGSU5JU0hFRCAqLwotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBQcm9ncmVzcyBwZXJjZW50YWdlOiBmaW5hbGl6ZSBmaW5pc2hlZCAtPiAxMDAlICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXVkaW8gbWl4aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gY29ycmVjdCB3YXJuaW5nICovCi0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCggTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpc1wKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBJbnB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBBZGRlZCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgM0dQIHdyaXRlci4gSW4gbm9ybWFsIHVzZSBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLAotICAgICAgYnV0IG5vdCBpbiBhYm9ydCB1c2UgY2FzZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4gdGhlIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBvdGhlciB0aGluZ3MgdG8gZnJlZSEgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIEF1ZGlvIGVuY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3NyYyBzdHVmZiAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVyT3V0KTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRlbXBCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRlbXBCdWZmZXIpOwotICAgICAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiogICAgICAgICAgICAgICAgICBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEFTRiA9IDA7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcEMsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqIFRoZSBBZGQgVm9sdW1lIG11c3QgYmUgKHN0cmljdGx5KSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUFkZFZvbHVtZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogQWRkVm9sdW1lIGlzIHplcm8sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTzsKLSAgICB9Ci0gICAgLyoKLSAgICBlbHNlIGlmKHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPj0gMTAwKSAvLyBJZiB2b2x1bWUgaXMgc2V0IHRvIDEwMCwgbm8gbW9yZSBvcmlnaW5hbCBhdWRpbyAuLi4KLSAgICB7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgaW5wdXQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGU7IC8qKjwgSW5wdXQgM0dQUCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy51aUVuZEN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBvcmlnaW5hbCBBdWRpby9WaWRlbyAzR1BQIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wSW5wdXRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wSW5wdXRDbGlwQ3R4dCwgJnBDLT5JbnB1dENsaXBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9UUlVFKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihvcmlnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIHZpZGVvLCBpdCdzIGFuIGVycm9yICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyB2aWRlbyBzdHJlYW0gaW4gY2xpcCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQy0+cElucHV0Q2xpcEN0eHQsCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgYWRkZWQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGU7IC8qKjwgQWRkZWQgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gcFNldHRpbmdzLT5BZGRlZEF1ZGlvRmlsZVR5cGU7Ci0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lICAgPSAwOy8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscz0KLSAgICAgICAgcFNldHRpbmdzLT51aU51bUNoYW5uZWxzOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5PSAgICBwU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiB0aGUgYWRkZWQgQXVkaW8gY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wQWRkZWRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wQWRkZWRDbGlwQ3R4dCwgJnBDLT5BZGRlZENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBPcGVuKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIGl0J3MgYW4gZXJyb3IgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyBhdWRpbyBub3IgdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBBZGRlZENsaXBDdHh0LAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+b3V0cHV0QVNGICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAyNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSA0ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHBhcmFtZXRlciBpbiBvdXRwdXQgQVNGICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAmJiAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dEFTRiA9IE00VklERU9FRElUSU5HX2s4MDAwX0FTRjsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMzIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDIwNDggKiBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBvdXRwdXRBU0Y7Ci0KLSAgICAgICAgICAgIGlmKCBvdXRwdXRBU0YgIT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAvKiBNb3Jlb3ZlciwgYXVkaW8gZW5jb2RlciBtYXkgYmUgbmVlZGVkIGluIGNhc2Ugb2YgYXVkaW8gcmVwbGFjaW5nLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkocEMsCi0gICAgICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgbG9vcCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkxvb3AgPiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgYmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgYXVkaW8gZHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE9rLCBsZXQncyBnbyB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgKi8KLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGFkZGVkIGZpbGUsIGZvcmNlIHJlbW92ZSBvcmlnaW5hbCAqLwotICAgICAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSB2aWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnB1dCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWw7Ci0gICAgc3dpdGNoKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYSBsaW5rIHRvIHZpZGVvIGRzaSAqLwotICAgIGlmKCBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotCi0gICAgICAgIC8qIEZvciBILjI2NCBlbmNvZGVyIGNhc2UKLSAgICAgICAgKiBGZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHNlbmQgRFNJIGZvciBIMjY0IHN0cmVhbSB0byAzR1Agd3JpdGVyIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjY0KSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5lZCBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGlucHV0IGNsaXAgdmlkZW8gc3RyZWFtIHR5cGUgPSAweCV4IiwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRlZCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+YlJlbW92ZU9yaWdpbmFsID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIC8qIGlmIG91dHB1dCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50cyBmcm9tIGFkZGVkIGNsaXAgc2V0dGluZ3MsCi0gICAgICAgICAgICB3ZSBuZWVkIHRvIHJlZW5jb2RlIEJHTSAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSAxMjIwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMzIwOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYml0cmF0ZSBoYXZlIHRvIGJlIGRvdWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlICs9IHBDLT5ld2MudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlcyBpdCBlYXNpZXIgdG8gZmFjdG9yaXplIGFtciBhbmQgZXZyYyBjb2RlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCBhIGxpbmsgdG8gYXVkaW8gZHNpICovCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBObyBhdWRpbyB0cmFjayBpbiBpbnB1dCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgIC1wQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyogUmVzZXQgdGltZSAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA9IHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAtcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEFkZEN0cyBpcyBsb3dlciB0aGFuIG9yaWdpbmFsIGNsaXAgZHVyYXRpb24gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKQotICAgICAgICAmJiAocEMtPmlBZGRDdHMgPiAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHVpQWRkQ3RzIGlzIGxhcmdlciB0aGFuIHZpZGVvIGR1cmF0aW9uLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgYXVkaW8gdHJhY2tzIGFyZSBub3QgY29tcGF0aWJsZSwgcmVwbGFjZSBpbnB1dCB0cmFjayBieSBzaWxlbmNlICovCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhdWRpbyBtaXhpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICBpZiggKCAoIHBDLT5iSGFzQXVkaW8pICYmIChNNE9TQV9GQUxTRQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkpCi0gICAgICAgIHx8IChNNE9TQV9UUlVFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwpICkgLyp8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkpICovCi0gICAgewotICAgICAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIG91dHB1dCBhdWRpbyBjYW4gc3VwcG9ydCBzaWxlbmNlIGZyYW1lcwotICAgIFRyaWNrIGkgdXNlIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwIGZpbGVkIHRvIHN0b3JlIHRoYXQgICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOwotCi0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICBpQWRkQ3RzIHNob3VsZCBiZSBzZXQgdG8gMCB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIDAgPCBwQy0+dWlFbmRMb29wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcCBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgZmFjdG9yIHRvIGFwcGx5IHRvIHNhbXBsZSB0byBkbyB0aGUgbWl4aW5nICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjUwRjsKLSAgICAgICAgcEMtPmZPcmlnRmFjdG9yID0gMC41MEY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIFNTUkMgaXMgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF0aW8sIHJhdGlvQnVmZmVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIFNTUkMgbW9kdWxlICovCi0gICAgICAgIFNTUkNfUmV0dXJuU3RhdHVzX2VuCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgMDsgLyogTWluaW1hbCBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAqLwotICAgICAgICBMVk1fSU5UMzIKLSAgICAgICAgICAgIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNgotICAgICAgICAgICAgKgotICAgICAgICAgICAgcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICAgICAgU1NSQ19QYXJhbXNfdCBzc3JjUGFyYW1zOyAgICAgICAgICAvKiBNZW1vcnkgZm9yIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2goIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgYWRkZWQgY2xpcCBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDEgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogaW52YWxpZCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX0luKXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID00NDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzc3JjUGFyYW1zLlNTUkNfRnNfT3V0KXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgfQotCi0gICAgICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA+IHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0KQotICAgICAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNFZTU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgICAgIHsgLyogRG9uJ3QgdGFrZSBibG9ja3Mgc21hbGxlciB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgICAgIE5yU2FtcGxlc01pbiA9IChMVk1fSU5UMTYpKE5yU2FtcGxlc01pbiA8PCAxKTsKLSAgICAgICAgfQotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgICAgICBOclNhbXBsZXNJbik7IC8qIG11bHRpcGxpY2F0aW9uIGJ5IE5yT2ZDaGFubmVscyBpcyBkb25lIGJlbG93ICovCi0gICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAgICAgbnVtZXJhdG9yID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIGRlbm9taW5hdG9yID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgaWYoIG51bWVyYXRvciAlIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJhdGlvQnVmZmVyID0gKE00T1NBX1VJbnQzMikobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJhdGlvID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICogcmF0aW9CdWZmZXIpIC8gKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaWYoIHJhdGlvID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBzaXplIG9mIFNTUkMgYnVmZmVySW4gaXMgYmlnZ2VyIHRoYW4gdGhlIGFza2VkIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpbysrOyAvKiBXZSB1c2UgdGhlIGltbWVkaWF0ZSBzdXBlcmlvciBpbnRlZ2VyICovCi0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gcmF0aW8gKiAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgotICAgICAgICAgICAgbV9idWZmZXJTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBwQy0+aVNzcmNOYlNhbXBsT3V0Ci0gICAgICAgICAgICAgICAgKiBzaXplb2Yoc2hvcnQpICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRlbXBCdWZmZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBUZW1wQnVmZmVyLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cFBvc0luVGVtcEJ1ZmZlciA9IHBDLT5wVGVtcEJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogXAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlckluLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gKE00T1NBX01lbUFkZHI4KXBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlIGlmKCAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVAzKXx8Ci0gICAgICAgICAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBtaW5idWZmZXIgPSAwOwotCi0gICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMjA0OCAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgbWluYnVmZmVyID0gcEMtPm1pbmltdW1CdWZmZXJJbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMzIwOwotCi0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPiAzMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47IC8qIE5vdCByZWFsbHkgcG9zc2libGUgLi4uKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCwgaW4gY2FzZSBvZiBNUDMgcmVwbGFjaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbixcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gZW5jb2RlciBpcyBuZWVkZWQgdG8gZG8gYXVkaW8gbWl4aW5nIG9yIGF1ZGlvIHJlc2FtcGxpbmcgKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgfHwgTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgIT0gb3V0cHV0QVNGCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBQQ00sIE1QMyBvciBhdWRpbyByZXBsYWNlIHdpdGggcmVlbmNvZGluZywgdXNlIGVuY29kZXIgRFNJICovCi0gICAgICAgIGlmKCBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID09IDAgJiYgKE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIC8qMTEvMTIvMjAwOCBDUjMyODMgYWRkIHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBmb3IgdGhlIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdCovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKCkKLSAqIEBicmllZiAgICBXcml0ZSBhbiBhdWRpbyBzaWxlbmNlIGZyYW1lIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgd2hlbiBwYWRkaW5nIHdpdGggc2lsZW5jZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLQotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9UaW1lKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8pLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2U6XAotICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgVklERU8gc3RlcCA6IGRWVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzLCBwQy0+U3RhdGUsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBpbnB1dCB2aWRlbyBBVSAqLwotICAgIGVyciA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBtX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUywgcEMtPnBJbnB1dENsaXBDdHh0LT5pVm9mZnNldCwKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICAvKiBmb3IgaC4yNjQgc3RyZWFtIGRvIG5vdCByZWFkIHRoZSAxc3QgNCBieXRlcyBhcyB0aGV5IGFyZSBoZWFkZXIgaW5kaWNhdG9ycyAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlCi0gICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IGlucHV0IHN0cmVhbSB0eXBlIEgyNjQiKTsKLSAgICAgICAgb2Zmc2V0ID0gNDsKLSAgICB9Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSAgLT0gIG9mZnNldDsKLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgdGhlIHZpZGVvIEFVIGlzIG5vdCBsYXJnZXIgdGhhbiBleHBlY3RlZCAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplID4gcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplICglZD4lZCkhXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUsIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKikocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyBvZmZzZXQpLAotICAgICAgICAocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSkpOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXJhbWV0ZXJzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUyArIDAuNSk7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkQgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTLCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIG1peCAgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgQWRkQ3RzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+aUFkZEN0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBGaXJzdCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gc2Vjb25kIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSByZWFkaW5nIHN0YXRlIHRvIGVuY29kaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKSAvKio8IE1peCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgfHwgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygc2FtcGxpbmcgZnJlcSBjb252ZXJzaW9uIGFuZC9vciBjaGFubmVsIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCBuZXh0IEFVIHdpbGwgYmUgICAgY2FsbGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgYXVkaW8gbWl4aW5nICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm8gbWl4LCBqdXN0IGNvcHkgYWRkZWQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3aGF0IHRvIGRvIHdoZW4gYXVkaW8gaXMgb3ZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogVmlkZW8gZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDMpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpby4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIHJlcGwgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgU0lEIChzaWxlbmNlKSBwYXlsb2FkIGluIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RKdW1wKGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBhdWRpbyBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBzZWdtZW50IChzaWxlbmNlKSBpcyBvbmx5IGRvbmUgaWYgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiBvdGhlciBjYXNlLCB3ZSBmaW5pc2ggaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgyLT5GKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IENsaXAgZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gZHVyYXRpb24gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBvcmlnaW5hbCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIkcgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcHJvcGVydGllcyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICBNNE9TQV9UUkFDRTJfMigiSCAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyb20gdGhlIGFkZGVkIGF1ZGlvIGZpbGUgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00gfHwKLSAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFIHx8Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApCi0gICAgewotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00T1NBX1RpbWUKLSAgICAgICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCBlbmQgb2YgYWRkZWQgZmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSyAqKioqIGJsZW5kIEFVcyIpOwotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoKTpcCi0gICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKiBVcGRhdGUgZGVjb2RlZCBidWZmZXIgaGVyZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLT0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IGZyYW1lVGltZURlbHRhIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygiSSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgIC8qKiBUSEUgQ0hFQ0sgQkVMT1cgSVMgQURERUQgVE8gUFJFVkVOVCBJU1NVRVMgTElOS0VEIFRPIFBSRS1BTExPQ0FURUQgTUFYIEFVIFNJWkUKLSAgICAgICAgbWF4IEFVIHNpemUgaXMgc2V0IGJhc2VkIG9uIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSBkZWZpbmVkIGluIGZpbGUKLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgsIElmIHRoaXMgZXJyb3Igb2NjdXJzIGluY3JlYXNlIHRoZSBsaW1pdCBzZXQgaW4gdGhpcyBmaWxlCi0gICAgICAgICovCi0gICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPiBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJFUlJPUjogYXVkaW8gQVUgc2l6ZSAoJWQpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoJWQpID0+IGFib3J0IiwKLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIlBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIENvbnZlcnQgUENNIG9mIGFkZGVkIHRyYWNrIHRvIHRoZSByaWdodCBBU0YgLyBuYiBvZiBDaGFubmVscwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQgc3NyY0VycjsgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wUG9zQnVmZmVyOwotCi0gICAgTTRPU0FfVUludDMyIG91dEZyYW1lQ291bnQgPSB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXM7Ci0gICAgLyogRG8gd2UgbmVlZCB0byBmZWVkIFNTUkMgYnVmZmVyIEluID8gKi8KLSAgICAvKioKLSAgICAqIFJDOiBUaGlzIGlzIG5vdCByZWFsbHkgb3B0aW11bSAobWVtbW92ZSkuIFdlIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRoIGxpbmtlZCBsaXN0LiAqLwotICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gcEMtPnBTc3JjQnVmZmVySW4gPCAoTTRPU0FfSW50MzIpcEMtPm1pbmltdW1CdWZmZXJJbiApCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIHRvIGdldCBtb3JlIFBDTSBkYXRhICovCi0gICAgICAgIGlmIChwQy0+Yk5vTG9vcGluZyA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDLT5ianVtcGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcFwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLSAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dWlFbmRMb29wID0wOyAvKiBWYWx1ZSAwIG1lYW5zIG5vIGxvb3BpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVuY29kaW5nIHN0YXRlIHRvIHJlYWRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgZGVjb2RlZCBkYXRhIGludG8gU1NSQyBidWZmZXIgaW4gKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCi0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiArPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgLyogRG8gdGhlIHJlc2FtcGxpbmcgLyBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkICg9ZmVlZCBidWZmZXIgb3V0KSAqLwotICAgIGlmKCBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX1RSVUUgKQotICAgIHsKLSAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblRlbXBCdWZmZXIgLSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMikocEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykKLSAgICAgICAgICAgICAgICAvIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICAgICAgICAgIGlmKCAwICE9IHNzcmNFcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydDogU1NSQ19Qcm9jZXNzIHJldHVybnMgMHgleCwgcmV0dXJuaW5nICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3JjRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzcmNFcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgKz0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIFNTUkMgYnVmZmVySW4gKi8KLSAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBUZW1wQnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvL000T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAvIHNpemVvZihzaG9ydCkgLwotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAvKiBDb252ZXJ0IFN0ZXJlbzwtPk1vbm8gKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiBub3Igc2FtcGwuIGZyZXEuIGNvbnZlcnNpb24gbmVlZGVkLCBqdXN0IGJ1ZmZlciBtYW5hZ2VtZW50ICovCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZCggTTRPU0FfVUludDMyIHZhbHVlICkKLSAgICB7Ci0gICAgaW50IGRiU291bmQgPSAxOwotCi0gICAgaWYoIHZhbHVlID09IDAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKCB2YWx1ZSA+IDB4NDAwMCAmJiB2YWx1ZSA8PSAweDgwMDAgKSAgICAgIC8vIDMyNzY4Ci0gICAgICAgIGRiU291bmQgPSA5MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgyMDAwICYmIHZhbHVlIDw9IDB4NDAwMCApIC8vIDE2Mzg0Ci0gICAgICAgIGRiU291bmQgPSA4NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgxMDAwICYmIHZhbHVlIDw9IDB4MjAwMCApIC8vIDgxOTIKLSAgICAgICAgZGJTb3VuZCA9IDc4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwICkgLy8gNDAyOAotICAgICAgICBkYlNvdW5kID0gNzI7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDQwMCAmJiB2YWx1ZSA8PSAweDA4MDAgKSAvLyAyMDQ4Ci0gICAgICAgIGRiU291bmQgPSA2NjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMjAwICYmIHZhbHVlIDw9IDB4MDQwMCApIC8vIDEwMjQKLSAgICAgICAgZGJTb3VuZCA9IDYwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwICkgLy8gNTEyCi0gICAgICAgIGRiU291bmQgPSA1NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDgwICYmIHZhbHVlIDw9IDB4MDEwMCApIC8vIDI1NgotICAgICAgICBkYlNvdW5kID0gNDg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA0MCAmJiB2YWx1ZSA8PSAweDAwODAgKSAvLyAxMjgKLSAgICAgICAgZGJTb3VuZCA9IDQyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwICkgLy8gNjQKLSAgICAgICAgZGJTb3VuZCA9IDM2OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMTAgJiYgdmFsdWUgPD0gMHgwMDIwICkgLy8gMzIKLSAgICAgICAgZGJTb3VuZCA9IDMwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDggJiYgdmFsdWUgPD0gMHgwMDEwICkgLy8xNgotICAgICAgICBkYlNvdW5kID0gMjQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDggKSAvLzgKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDMgJiYgdmFsdWUgPD0gMHgwMDA3ICkgLy8gNAotICAgICAgICBkYlNvdW5kID0gMTg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwMSAmJiB2YWx1ZSA8PSAweDAwMDMgKSAvLzIKLSAgICAgICAgZGJTb3VuZCA9IDEyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEgKSAgLy8gMQotICAgICAgICBkYlNvdW5kID0gNjsKLQotICAgIGVsc2UKLSAgICAgICAgZGJTb3VuZCA9IDA7Ci0KLSAgICByZXR1cm4gZGJTb3VuZDsKLSAgICB9Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBNaXggdGhlIGN1cnJlbnQgYXVkaW8gQVVzIChkZWNvZGVyLCBtaXgsIGVuY29kZSkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTE7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMjsKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLSAgICAvKiBkdWNraW5nIHZhcmlhYmxlICovCi0gICAgTTRPU0FfVUludDE2IGxvb3BJbmRleCA9IDA7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSBvcmlnaW5hbCBhdWRpbyB0cmFjayBBVSAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQocEMpOwotCi0gICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGUgYWRkZWQgYXVkaW8gdHJhY2sgQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkIFBDTSBzaXplISIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotICAgICAgICBwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNaXggdGhlIHR3byBkZWNvZGVkIFBDTSBhdWRpb3MgKi8KLSAgICBwUENNZGF0YTEgPQotICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgdWlQQ01zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgLyAyOyAvKmJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpKi8KLQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCApCi0gICAgewotICAgICAgICBsb29wSW5kZXggPSAwOwotICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotCi0gICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBwZWFrIHZhbHVlCi0gICAgICAgICB3aGlsZSggbG9vcEluZGV4Ci0gICAgICAgICAgICAgPCBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgLyBzaXplb2YoTTRPU0FfSW50MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0KLSAgICAgICAgICAgICAgICA/IHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb29wSW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5hdWRpb1ZvbHVtZUFycmF5W3BDLT5hdWRWb2xBcnJJbmRleF0gPQotICAgICAgICAgICAgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLyogV0lORE9XX1NJWkUgaXMgMTAgYnkgZGVmYXVsdCBhbmQgY2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIDEwIGN5Y2xlcyAqLwotICAgICAgICBpZiggcEMtPmF1ZFZvbEFyckluZGV4ID49IFdJTkRPV19TSVpFIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRG9EdWNraW5nID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCgoTTRPU0FfSW50MzIgKikmKHBDLT5hdWRpb1ZvbHVtZUFycmF5KSwKLSAgICAgICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgsIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKkJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlIGZvciBCYWNrZ3JvdW5kIFRyYWNrIGFuZCBQcmltYXJ5IFRyYWNrCi0gICAgICAgICpmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluCi0gICAgICAgICpmb3IgcHJpbWFyeQotICAgICAgICAqCi0gICAgICAgICpDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlciB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgKgotICAgICAgICAqRm9yIGEgd2luZG93IHNpemUgPSAyNSAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgICoKLSAgICAgICAgKi8KLQotICAgICAgICBpZiggcEMtPmJEb0R1Y2tpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IKLSAgICAgICAgICAgICAgICA+IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lICkgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvciBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciAtPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kdWNraW5nRmFjdG9yID0gcEMtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IgPCAxLjAgKSAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgLy8gb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciArPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBlbmRpZiAtIGR1Y2tpbmdfZW5hYmxlICovCi0KLSAgICAgICAgLyogTWl4aW5nIExvZ2ljICovCi0KLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0KLSAgICAgICAgICAgLyogc2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVCAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMiAqIHBDLT5mQlRWb2xMZXZlbCk7Ci0KLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTEgKiBwQy0+ZlBUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCggKnBQQ01kYXRhMikgKiAocEMtPmR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgLyAyICsgKnBQQ01kYXRhMSAvIDIpOwotCi0KLSAgICAgICAgICAgIGlmKCAqcFBDTWRhdGExIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC0oICpwUENNZGF0YTEpCi0gICAgICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgIGlmKCB0ZW1wID4gMzI3NjggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICAgICAgcFBDTWRhdGExKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgewotICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZPcmlnRmFjdG9yICogcEMtPmZQVFZvbExldmVsCi0gICAgICAgICAgICAgICArICpwUENNZGF0YTIgKiBwQy0+ZkFkZGVkRmFjdG9yICogcEMtPmZCVFZvbExldmVsICk7Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICAgICAgcFBDTWRhdGEyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcEMtPnBTc3JjQnVmZmVyT3V0IGJ1ZmZlciAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLQotICAgIC8qKgotICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkwgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgRGVjb2RlL2VuY29kZSBhIGZldyBBVSBiYWNrd2FyZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBmb3IgbGF0ZXIgTWl4IHNlZ21lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IDA7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotCi0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAqICdCWlpaJyBidWcgZml4OgotICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpQ3VycmVudEN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAvKiBEbyBub3QgZG8gcHJlLWVuY29kZSBzdGVwIGlmIHRoZXJlIGlzIG5vIG1peGluZyAocmVtb3ZlLCAxMDAgJSwgb3Igbm90IGVkaXRhYmxlKSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWR2YW5jZSBpbiB0aGUgb3JpZ2luYWwgYXVkaW8gc3RyZWFtIHRvIHJlYWNoIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgKiAoV2UgZG9uJ3Qgd2FudCBpQXVkaW9DVFMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGp1bXAgZnVuY3Rpb24sCi0gICAgICAgICogc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NhbCB2YXJpYWJsZSkuICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBJbnB1dENsaXBDdHh0LCAmaUN1cnJlbnRDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLi4uICovCi0gICAgICAgIGlmKCBpQ3VycmVudEN0cyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgd2hpbGUoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBwcmUtZW5jb2RlIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHNldEN1cnJlbnRFbmNvZGVyIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBlbmNvZGVyIHNoZWxsIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFZTUyBzZXR0aW5ncyAqLwotCi0gICAgLyogQ29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGVmZmVjdHMgYW5kIHRyYW5zaXRpb25zIHdlIHNob3VsZCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5ICovCi0gICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMKLSAgICAgICh3aXRoIGEgYmFkIHJlc3VsdCBvbiBzaGVkdWxpbmcgYW5kIGJsb2NrIGVmZmV0Y3MpICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM7Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIHN3aXRjaCggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdE9wZW4iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigidnNzOiBhdWRpbyBtaXggZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKQotewotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZmluYWxWYWx1ZSA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7IGkrKyApCi0gICAgICAgIGZpbmFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotCi0gICAgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUgLyBzdG9yZUNvdW50OwotCi0KLSAgICBpZiggZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlICkKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA2MTJmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcC5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaW5wdXQgY2xpcCBtYW5hZ2VtZW50LgotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0KLS8qKgotICogICAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqCi0gKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotLyogT3NhbCBoZWFkZXIgZmlsZW5vICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICAgU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBoQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBjbGlwIGNvbnRleHQgKi8KLSAgICAqaENsaXBDdHh0ID0KLSAgICAgICAgKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfQ2xpcENvbnRleHQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09ICpoQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFZTUzNHUFBfQ2xpcENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiBjbGlwQ3R4dD0weCV4IiwgKmhDbGlwQ3R4dCk7Ci0KLQotICAgIC8qKgotICAgICogVXNlIHRoaXMgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGNvZGUgKi8KLSAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwotCi0gICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcENsaXBDdHh0LCAwLHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpKTsKLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgcENsaXBDdHh0LT5pVm9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQW9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgcENsaXBDdHh0LT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmJWaWRlb0F1QXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+Yk1wZWc0R292U3RhdGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSAwOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgICA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgZnJlcXVlbmN5IHZhbHVlIHRvIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0IGNoYXIqIGZyZXFUb1N0cmluZyhpbnQgZnJlcSkgewotICAgIHN3aXRjaCAoZnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgcmV0dXJuICJfODAwMCI7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgcmV0dXJuICJfMTEwMjUiOwotICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIHJldHVybiAiXzEyMDAwIjsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICByZXR1cm4gIl8xNjAwMCI7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgcmV0dXJuICJfMjIwNTAiOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIHJldHVybiAiXzI0MDAwIjsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICByZXR1cm4gIl8zMjAwMCI7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgcmV0dXJuICJfNDQxMDAiOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzQ4MDAwIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiVW5zdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZTogJWQgSHoiLCBmcmVxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBUaGlzIG1ldGhvZCBtYXBzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCB2YWx1ZSB0bwotLy8gYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uCi1zdGF0aWMgY29uc3QgY2hhciogY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dChpbnQgY2hhbm5lbHMpIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gIl8xLnBjbSI7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gIl8yLnBjbSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkICVkIGNoYW5uZWxzIiwgY2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIE5vdGU6IGlmIHRoZSBjbGlwIGlzIG9wZW5lZCBpbiBmYXN0IG1vZGUsIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIGFuYWx5c2lzIGFuZCBub3RoaW5nIGVsc2UuICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgZHVtbXlTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDMyIGlEdXJhdGlvbjsKLSAgICBNNE9TQV9Wb2lkICpkZWNvZGVyVXNlckRhdGE7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gZHVtbXk7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemVGcm9tRFNJOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciBGaWx0ZXJPcHRpb247Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBjYWxsZWQgd2l0aCBwQ2xpcEN0eHQ6IDB4JXgsIGJBdm9pZE9wZW5pbmdWaWRlb0RlYz0weCV4IiwKLSAgICAgICAgcENsaXBDdHh0LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMpOwotICAgIC8qKgotICAgICogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MuIFJlbWVtYmVyIHRoYXQgd2UgZG9uJ3QgcG9zc2VzcyBpdCEgKi8KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBJbWFnZSBzdHJlYW07IHNldCBjdXJyZW50IHZpZCBkZWMiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5TaGVsbEFQSSwgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAmZHVtbXlTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogXAotICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgIFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgY29ycmVjdCByZWFkZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIDNHUFAgb3IgTVAzIHJlYWRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICh1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIGtub3cgdGhlIHJlYWRlcikgKi8KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIHJlYWQgZnVuY3Rpb24gc2V0ICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikocENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QpKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGZhc3Qgb3BlbiBtb2RlIGlmIGFza2VkICgzR1BQIG9ubHkpICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiRmFzdE9wZW5Nb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oRmFzdE9wZW5Nb2RlKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHNraXAgYXVkaW8gb3B0aW9uIGlmIGFza2VkICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IGJTa2lwQXVkaW9UcmFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oVmlkZW9Pbmx5KSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKSB7Ci0gICAgICAgIC8vIENvbXBvc2UgdGhlIHRlbXAgZmlsZW5hbWUgd2l0aCBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgY29uc3QgY2hhciogZnJlcVN0ciA9IGZyZXFUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgIGlmIChmcmVxU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyKiBjaGFuU3RyID0gY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0KLSAgICAgICAgaWYgKGNoYW5TdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgdG8gaG9sZCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPQotICAgICAgICAgICAgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSArIHN0cmxlbihmcmVxU3RyKSArIHN0cmxlbihjaGFuU3RyKSArIDE7Ci0KLSAgICAgICAgY2hhciogcFRlbXBGaWxlID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtYWxsb2MgJWQgYnl0ZXMgZmFpbCIsbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQocFRlbXBGaWxlLCAwLCBsZW5ndGgpOwotICAgICAgICBtZW1jcHkocFRlbXBGaWxlLCBwQ2xpcFNldHRpbmdzLT5wRmlsZSwgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7Ci0gICAgICAgIHN0cm5jYXQocFRlbXBGaWxlLCBmcmVxU3RyLCBzdHJsZW4oZnJlcVN0cikpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgY2hhblN0ciwgc3RybGVuKGNoYW5TdHIpKTsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgcFRlbXBGaWxlKTsKLSAgICAgICAgaWYgKHBUZW1wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wRmlsZSk7Ci0gICAgICAgICAgICBwVGVtcEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG9wZW4gcGNtIGZpbGUgcmV0dXJucyBlcnJvciA6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIDNHUFAvTVAzIGNsaXAgZmlsZSAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgfQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWU1MzR1BQIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgKi8KLSAgICB3aGlsZSggZXJyID09IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyppbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGEgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IG9yIEgyNjQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTX2VkaXRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiBBTVItTkIgb3IgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBBTVItTkIgb3IgQUFDIChBTVItV0IuLi4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAvbXAzIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IFZpZGVvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAvKiBJZiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUsIGl0J3MgYmVzdCB0byBhdm9pZCBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIHRoZSBjbGlwIGlzIG9ubHkKLSAgZ29pbmcgdG8gYmUgdXNlZCBmb3IgYW5hbHlzaXMsIGFzIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQgZm9yIHRoZSBhbmFseXNpcyBpbiB0aGUgY2FzZSBvZiBhCi0gIHBvc3NpYmxlIGV4dGVybmFsIGRlY29kZXIgYW55d2F5LCBhbmQgZWl0aGVyIHRoZXJlIGNvdWxkIGJlIG5vIGRlY29kZXIgYXQgdGhpcyBwb2ludCBvciB0aGUgSFcKLSAgZGVjb2RlciBjb3VsZCBiZSBwcmVzZW50LCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIG9wZW5pbmcgZm9yIHRoYXQuIFNlZSBjb21tZW50cyBpbgotICBpbnRCdWlsZEFuYWx5c2lzIGZvciBtb3JlIGRldGFpbHMuICovCi0KLSAgLyogQ0hBTkdFTUUgVGVtcG9yYXJpbHkgb25seSBkbyB0aGlzIGZvciBNUEVHNCwgc2luY2UgZm9yIG5vdyBvbmx5IE1QRUc0IGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBzdXBwb3J0ZWQsIGFuZCB0aGUgZm9sbG93aW5nIHdvdWxkbid0IHdvcmsgZm9yIEgyNjMgc28gYSByZWxlYXNlIHdoZXJlIGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBwb3NzaWJsZSwgYnV0IG5vdCB1c2VkLCB3b3VsZG4ndCB3b3JrIHdpdGggSDI2MyBzdHVmZi4gKi8KLQotICAgICAgICBpZiggYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICYmIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPb3BzISBUaGUgbWVyZSBhY3Qgb2Ygb3BlbmluZyB0aGUgZGVjb2RlciBhbHNvIHJlc3VsdHMgaW4gdGhlIGltYWdlIHNpemUgYmVpbmcKLSAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgdmlkZW8gc3RyZWFtISBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIFBhcnNlVmlkZW9EU0kgdG8gZmlsbAotICAgICAgICAgICAgdGhpcyBpbmZvLiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogTXBlZzQgc3RyZWFtOyB2aWQgZGVjIG5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmZHVtbXksICZ2aWRlb1NpemVGcm9tRFNJKTsKLQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCA9IHZpZGVvU2l6ZUZyb21EU0kubV91aVdpZHRoOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZUZyb21EU0kubV91aUhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wNC9IMjYzL0gyNjQgc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigmcENsaXBDdHh0LT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlciwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLCBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogT3VyIGRlY29kZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBIMjYzIHByb2ZpbGUgb3RoZXIgdGhhbiAwLgotICAgICAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJGdW5jdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgT0siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBBdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKHBDbGlwQ3R4dCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBBdWRpbyBkZWMgc3RhcnRlZDsgY29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cmVhbUlEID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fRFRTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fbWF4c2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cnVjdFNpemUgPSBzaXplb2YocENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCApCi0gICAgewotICAgICAgICAvKiBJZiBhbHJlYWR5IGNhbGN1bGF0ZWQgc2V0IGl0IHRvIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgIC8qIEJlY2F1c2UgZmFzdCBvcGVuIGFuZCBmdWxsIG9wZW4gY2FuIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSwKLSAgICAgICAgICAgaXQgY2FuIG1pc21hdGNoIHVzZXIgc2V0dGluZ3MgKi8KLSAgICAgICAgLyogVmlkZW8gdHJhY2sgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBhdWRpbyB0cmFjayAoaWYgdmlkZW8gdHJhY2sgaXMgc2hvcnRlciB0aGFuCi0gICAgICAgICAgIGF1ZGlvIHRyYWNrLCBpdCBjYW4gbGVkIHRvIGN1dCBsYXJnZXIgdGhhbiBleHBlY3RlZCkgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIGlEdXJhdGlvbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVsc2UgY29tcHV0ZSBpdCBmcm9tIHN0cmVhbXMgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgJiYgKChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikKLSAgICAgICAgICAgID4gaUR1cmF0aW9uKSAmJiBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiBlbmQgdGltZSBpcyBub3QgdXNlZCwgd2Ugc2V0IGl0IHRvIHRoZSB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZSA9IChNNE9TQV9VSW50MzIpaUR1cmF0aW9uOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+aUVuZFRpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgLyoqCi0gICAgKiBCdXQgd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIHRoZSBhdWRpbyBzdHJlYW0uIEl0IHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlYWRlciB3aGVuIGNsb3NpbmcgaXQqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogV2Ugd2lsbCByZXR1cm4gYSBjb25zdGFudCBzaWxlbmNlIEFNUiBBVS4KLSAgICAqIFdlIHNldCBpdCBoZXJlIG9uY2UsIGluc3RlYWQgb2YgYXQgZWFjaCByZWFkIGF1ZGlvIHN0ZXAuICovCi0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAoaXQgbmVlZHMgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHNpbGVuY2UKLSAgICAgIGZyYW1lIGV2ZW50dWFsbHkpKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpQ3RzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmFwQ3RzLCBpQ2xpcEN0czsKLSAgICBNNF9NZWRpYVRpbWUgZERlY29kZVRpbWU7Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcEp1bXAgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwIGJhc2UgKi8KLSAgICBpQ2xpcEN0cyA9IGlDdHMgLSBwQ2xpcEN0eHQtPmlWb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byB0aGUgcHJldmlvdXMgUkFQCi0gICAgKiB0byBkZWNvZGUgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQ2xpcEN0eHQtPlZzdGF0dXMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGRlY29kZXIgbXVzdCBiZSB0b2xkIHRvIGp1bXAgKi8KLSAgICAgICAgYkNsaXBKdW1wID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpIHByb2Nlc3MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8KLSAgICBvbmUgbW9yZSBzdGVwIG9yIGlmIGRlY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qIERvIGEgc3RlcCBvZiA1MDAgbXMgZGVjb2RpbmcgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgKz0gNTAwOwotCi0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA+IGlDbGlwQ3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0IHRpbWUgcmVhY2hlZCwgd2Ugc3dpdGNoIGJhY2sgdG8gREVDT0RFIG1vZGUgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImMgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEp1c3QgZGVjb2RlIGF0IGN1cnJlbnQgY2xpcCBjdHMgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiZCAsLCwsIGRlY29kZSB1cCB0byA6ICVsZCIsIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSB1cCB0byB0aGUgdGFyZ2V0ICovCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiwgcENsaXBDdHh0PTB4JXgiLAotICAgICAgICBkRGVjb2RlVGltZSwgcENsaXBDdHh0KTsKLQotICAgIGREZWNvZGVUaW1lID0gKE00T1NBX0RvdWJsZSlwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0czsKLSAgICBwQ2xpcEN0eHQtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICZkRGVjb2RlVGltZSwgYkNsaXBKdW1wLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBtX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBOTyBBVURJTyAtLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBhdWRpbyB0cmFjaywgd2UgcmV0dXJuIHNpbGVuY2UgQVVzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICs9IHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJiICMjIyMgYmxhbmsgdHJhY2siKTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBTVItTkIsIEVWUkMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0VWUkMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTm8gQVUgYXZhaWxhYmxlLCBzbyB3ZSBtdXN0IG11c3QgcmVhZCBvbmUgZnJvbSB0aGUgb3JpZ2luYWwgdHJhY2sgcmVhZGVyICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBBTVIgZnJhbWUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhZCBBVSAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBBTVIgZnJhbWUgQ1RTICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICAgICAqIHdlIHJldHVybiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gcENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAob3Igbm8gc2lsZW5jZSBpbiBFVlJDKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJBdWRpb0ZyYW1lQXZhaWxhYmxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBBTVIgZnJhbWUgaW4gdGhlIEFVICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICs9IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluY3JlbWVudCBDVFM6IG9uZSBBTVIgZnJhbWUgaXMgMjAgbXMgbG9uZyAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZCBBTVIgZnJhbWUgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSA9PSAwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSBncmVhdGVyIHRoYW4gQVUgc2l6ZSEsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BTVJfQVUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgQVUgaGFzIGJlZW4gcmVhY2hlZCBvciBub3QgKi8KLSAgICAgICAgaWYoICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSkKLSAgICAgICAgICAgIDwgKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzICsgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKio8IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBQUMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tlQUFDcGx1cwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gKCAoIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbGVzcyBhdWRpbyB0aGFuIHRoZSBzdHJlYW0gZHVyYXRpb24gaW5kaWNhdGVkLAotICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImEgIyMjIyBzaWxlbmNlIEFVIik7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6XAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIChzaWxlbmNlKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKio8IGZhdGFsIGVycm9yICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFBQzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTVAzLCBvdGhlcnMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktTVAzOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICArIDAuNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgZm9yIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfU3RyZWFtVHlwZSBhdWRpb3R5cGU7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNF9BQUNUeXBlIGlBYWNUeXBlID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvcGVyIGF1ZGlvIGRlY29kZXIgKi8KLQotICAgIGF1ZGlvdHlwZSA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvL0VWUkMKLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICE9IGF1ZGlvdHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksIGF1ZGlvdHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gIT0gYXVkaW90eXBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgIE00T1NBX05VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlY1wKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlciBvZiB0eXBlIDB4JXgiLCBhdWRpb3R5cGUpOwotICAgICAgICAgICAgLyogRXh0ZXJuYWwgT01YIGNvZGVjcyBhcmUgdXNlZCovCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgLypnZXQgZnJvbSBSZWFkZXI7IHRlbXBvcmFyeSwgdGlsbCBBdWRpbyBkZWNvZGVyIHNoZWxsIEFQSQotICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBnZXQgdGhlIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmaUFhY1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IEFBQyBOQkNoYW5zPSVkLCBTYW1wbEZyZXE9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgLyogVHJpY2ssIEkgdXNlIHBVc2VyRGF0YSB0byByZXRyaWV2ZSBhYWMgcHJvcGVydGllcywKLSAgICAgICAgICAgd2FpdGluZyBmb3Igc29tZSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi4gKi8KLQotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJihwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICBNNE9TQV9OVUxMIC8qIHRvIGJlIGNoYW5nZWQgd2l0aCBIVyBpbnRlcmZhY2VzICovKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogRVZSQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBEZWNvZGUgaGlnaCBxdWFsaXR5IGFhYyBidXQgZGlzYWJsZSBQUyBhbmQgU0JSICovCi0gICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSB0byBtaXggZGlmZmVyZW50IGtpbmQgb2YgQUFDIHNvIHdlIG11c3QgdGFrZSB0aGUgbG93ZXN0IGNhcGFiaWxpdHkgKi8KLSAgICAgICAgLyogSW4gTUNTIGl0IHdhcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtICovCi0gICAgICAgIE00X0FhY0RlY29kZXJDb25maWcgQWFjRGVjUGFyYW07Ci0KLSAgICAgICAgQWFjRGVjUGFyYW0ubV9BQUNEZWNvZGVyUHJvZmlsZSA9IEFBQ19rQUFDOwotICAgICAgICBBYWNEZWNQYXJhbS5tX0Rvd25TYW1wbGluZ01vZGUgPSBBQUNfa0RTX09GRjsKLQotICAgICAgICBpZiggTTRFTkNPREVSX2tNb25vID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSwgKE00T1NBX0RhdGFPcHRpb24pICZBYWNEZWNQYXJhbSk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICkgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigpOlwKLSAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBTaWxlbmNlIG1vZGUgKi8KLSAgICBpZiggcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YQotICAgICAgICA9PSAoTTRPU0FfVUludDggKilwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaXQgd2l0aCAwICg9IHBjbSBzaWxlbmNlKSAqLwotICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTdGFuZGFyZCBkZWNvZGluZyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGN1cnJlbnQgQU1SIGZyYW1lICovCi0gICAgICAgIGlmICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fdGltZVN0YW1wVXMgPQotICAgICAgICAgICAgIChpbnQ2NF90KSAocENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAqIDEwMDBMTCk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4sICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFBhc3MgTnVsbCBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIC8vIFJlYWRlciBpbnZva2VkIGZyb20gQXVkaW8gZGVjb2RlciBzb3VyY2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgIE00T1NBX05VTEwsICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcEp1bXBDdHMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0czsKLSAgICBNNE9TQV9JbnQzMiBpSnVtcEN0c01zOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBKdW1wQ3RzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdDogcEp1bXBDdHMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaVRhcmdldEN0cyA9ICpwSnVtcEN0czsKLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8gc3RyZWFtLCB3ZSBzaW11bGF0ZSBhIGp1bXAgYXQgdGhlIHRhcmdldCBqdW1wIENUUyAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIHRoZSB0YXJnZXQgQ1RTIHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSBjYWxsICh0aHVzIHRoZSAtMjApICovCi0gICAgICAgICpwSnVtcEN0cyA9IGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAvKiBQYXRjaCBiZWNhdXNlIG1fQ1RTIGlzIHVuZm9ydHVuYXRlbHkgcm91bmRlZCBpbiAzZ3AgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKgotICAgICAgICAgICAgcEp1bXBDdHM7IC8qIHNpbXVsYXRlIGEgcmVhZCBhdCBqdW1wIHBvc2l0aW9uIGZvciBsYXRlciBzaWxlbmNlIEFVcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiBjdXJyZW50X3RpbWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBsb29wX2NvdW50ZXIgPSAwOwotCi0gICAgICAgIGlmKCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICggbG9vcF9jb3VudGVyIDwgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCkKLSAgICAgICAgICAgICAgICAmJiAoY3VycmVudF90aW1lIDwgaVRhcmdldEN0cykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFM7Ci0gICAgICAgICAgICAgICAgbG9vcF9jb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgY3VycmVudCBBVSBpcyBzdG9yZWQgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgaW4gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgaUp1bXBDdHNNcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgqcEp1bXBDdHMgLyBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZpSnVtcEN0c01zKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogbV9wRmN0SnVtcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKGlKdW1wQ3RzTXMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPSAwOyAvKiBObyBmcmFtZSByZWFkIHlldCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVG8gZGV0ZWN0IHNvbWUgbWF5LWJlIGJ1Z3MsIEkgcHJlZmVyIHRvIHJlc2V0IGFsbCB0aGVzZSBhZnRlciBhIGp1bXAgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW4gQU1SLCB3ZSBoYXZlIHRvIG1hbmFnZSBtdWx0aS1mcmFtZWQgQVVzLAotICAgICAgICAgICAgYnV0IGFsc28gaW4gQUFDIHRoZSBqdW1wIGNhbiBiZSAxIEFVIHRvbyBtdWNoIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpZiggKnBKdW1wQ3RzIDwgaVRhcmdldEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGRvZXNuJ3QgcmVhZCBhbnkgQVUsIHdlIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcEN0eHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgQVUgZnJhbWVzIGFzIGxvbmcgYXMgd2UgcmVhY2ggdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IENUUwotICAgICAgICAgICAgICAgICogKHNvIHRoZSB0YXJnZXQgd2lsbCBiZSByZWFjaGVkIHdoZW4gdGhlIHVzZXIgY2FsbCBSZWFkTmV4dEF1ZGlvRnJhbWUpLiAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIENUUyB0aGF0IHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSAqLwotICAgICAgICAgICAgICAgICpwSnVtcEN0cyA9IHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZTogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdENsb3NlKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKTogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQ3R4dD0weCV4KTogcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICBwQ2xpcEN0eHQpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IsIGVycjI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB2aWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBjb250ZXh0ICAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1diAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgZnJlZShwQ2xpcEN0eHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFEX0J1ZmZlciBvdXRwdXRCdWZmZXI7Ci0gICAgdWludDMyX3Qgb3B0aW9uVmFsdWUgPTA7Ci0KLSAgICAvLyBEZWNvZGUgZmlyc3QgYXVkaW8gZnJhbWUgZnJvbSBjbGlwIHRvIGdldCBwcm9wZXJ0aWVzIGZyb20gY29kZWMKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1ZGlvQVUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgIGlmKCBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOiBcCi0gICAgICAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzLCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0UmVzZXQoCi0gICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYzZkN2EuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBhbmFseXNpcyBvZiBpbnB1dCBjbGlwcwotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLQotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgIHBDbGlwICAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCggTTRPU0FfVm9pZCAqcENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIENsaXBTZXR0aW5nczsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCBjYWxsZWQgd2l0aCBwQ2xpcD0weCV4LCBwQ2xpcFByb3BlcnRpZXM9MHgleCIsCi0gICAgICAgIHBDbGlwLCBwQ2xpcFByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IHBDbGlwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEJ1aWxkIGR1bW15IGNsaXAgc2V0dGluZ3MsIGluIG9yZGVyIHRvIHVzZSB0aGUgZWRpdENsaXBPcGVuIGZ1bmN0aW9uICovCi0gICAgQ2xpcFNldHRpbmdzLnBGaWxlID0gcENsaXA7Ci0gICAgQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gRmlsZVR5cGU7Ci0gICAgQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICBDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0gMDsKLQotICAgIC8qIENsaXAgcHJvcGVydGllcyBub3QgYnVpbGQgeWV0LCBzZXQgYXQgbGVhc3QgdGhpcyBmbGFnICovCi0gICAgQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBjbGlwIGluIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXBDb250ZXh0LCAmQ2xpcFNldHRpbmdzLCBNNE9TQV9GQUxTRSwKLSAgICAgICAgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhlcmUgaXQgaXMgYmV0dGVyIHRvIHJldHVybiB0aGUgRWRpdGluZyBzcGVjaWZpYyBlcnJvciBjb2RlICovCi0gICAgICAgIGlmKCAoICgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVycikKLSAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFuYWx5c2UgdGhlIGNsaXAgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gcENsaXBDb250ZXh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDbGlwQ29udGV4dCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UocENsaXBDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBNNFZTU19pbnRDbGlwQ2xvc2UoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gQ2xpcFNldHRpbmdzLkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcocENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwMlByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgY2FsbGVkIHdpdGggcENsaXAxQW5hbHlzaXM9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgcENsaXAyQW5hbHlzaXM9MHgleCIsIHBDbGlwMVByb3BlcnRpZXMsIHBDbGlwMlByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXAxUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogcENsaXAxUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMlByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMlByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoICggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcDFQcm9wZXJ0aWVzLT5GaWxlVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzICE9IHBDbGlwMlByb3BlcnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBNUDMgQ0FOIE9OTFkgQkUgQ1VULFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIGFyZSBpbiBWU1MgU3BsaXR0ZXIgbW9kZSAqLwotICAgICAgICAgICAgZ290byBhdWRpb19hbmFseXNpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqIEF1ZGlvICoqKioqKioqKioqKi8KLQotYXVkaW9fYW5hbHlzaXM6Ci0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAxUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZXMgLi4uICovCi0gICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pCi0gICAgICAgICYmIChwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUKLSAgICAgICAgKiBBbmQgbGV0X3Mgc2F5IEFBQywgQUFDKyBhbmQgZUFBQysgYXJlIG1peGFibGUgKi8KLSAgICAgICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoKCBNNE9TQV9GQUxTRSA9PSBiQ2xpcDFJc0FBQykgfHwgKE00T1NBX0ZBTFNFID09IGJDbGlwMklzQUFDKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIEF1ZGlvIFN0cmVhbSBUeXBlIik7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgIT0gcENsaXAyUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBOYiBvZiBDaGFubmVscyIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgICAgICBnb3RvIGFuYWx5c2lzX2RvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGhhdmUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgaWYoIHBDbGlwMVByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIFNhbXBsaW5nIEZyZXF1ZW5jeSIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENsaXAyUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotCi1hbmFseXNpc19kb25lOgotICAgIGlmKCB2aWRlb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiB2aWRlb19lcnI7Ci0KLSAgICBpZiggYXVkaW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gYXVkaW9fZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuCi0gKiAgICAgICAgaW4gdGhlIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCBBVkNQcm9mbGU7Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCB2aWRlbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKLQotICAgIC8qKgotICAgICogVmlkZW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0KLSAgIC8qIFRoaXMgaXNzdWUgaXMgc28gaW5jcmVkaWJseSBzdHVwaWQgdGhhdCBpdCdzIGRlcHJlc3NpbmcuIEJhc2ljYWxseSwgYSBmaWxlIGNhbiBiZSBhbmFseXNlZAotICAgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoYmVzaWRlcyB0aGF0IG9mIHRoZSBjbGlwIGl0c2VsZiksIHNvIHRoYXQgZm9yIGluc3RhbmNlIHR3byBjbGlwcyBjYW4KLSAgIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgYmVmb3JlIGFsbG9jYXRpbmcgYW4gZWRpdCBjb250ZXh0IGZvciBlZGl0aW5nIHRoZW0uIEJ1dCB0aGlzCi0gICBtZWFucyB0aGVyZSBpcyBubyB3YXkgaW4gaGVjayB0byBwYXNzIGFuIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgKHRvIGJlZ2luIHdpdGgpIHRvIHRoaXMKLSAgIGZ1bmN0aW9uLCBhcyB0aGV5IHdvcmsgYnkgYmVpbmcgcmVnaXN0ZXJlZCBpbiBhbiBleGlzdGluZyBjb250ZXh0OyBmdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkKLSAgIHByZXR0eSBvdmVya2lsbCB0byB1c2UgYSBmdWxsIGRlY29kZXIgZm9yIHRoYXQsIG1vcmVzbyBhIEhBUkRXQVJFIGRlY29kZXIganVzdCB0byBnZXQgdGhlCi0gICBjbGlwIGNvbmZpZyBpbmZvLiBJbiBmYWN0LCB0aGUgaGFyZHdhcmUgaXRzZWxmIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGluIHRoZSBjYXNlIG9mIGEKLSAgIEhXIGRlY29kZXIsIHRoZSBzaGVsbCBidWlsZHMgdGhlIGNvbmZpZyBpbmZvIGl0c2VsZiwgc28gd2UgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIGRlY29kZXIsIG9ubHkKLSAgIGEgZGV0YWNoZWQgZnVuY3Rpb25hbGl0eSBvZiBpdC4gU28gaW4gY2FzZSBIVy9leHRlcm5hbCBkZWNvZGVycyBtYXkgYmUgcHJlc2VudCwgd2UgaW5zdGVhZCB1c2UKLSAgIGRpcmVjdGx5IHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBvZiB0aGUgc2hlbGwgSFcgZGVjb2RlciAod2hpY2ggd2Uga25vdyB0byBiZSBwcmVzZW50LCBzaW5jZQotICAgSFcgZGVjb2RlcnMgYXJlIHBvc3NpYmxlKSB0byBnZXQgdGhlIGNvbmZpZyBpbmZvLiBOb3RpY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGV2ZW4gaWYgdGhlCi0gICBzb2Z0d2FyZSBkZWNvZGVyIGlzIGFjdHVhbGx5IHByZXNlbnQgYW5kIGV2ZW4gaWYgaXQgd2lsbCBlbmQgdXAgYmVpbmcgYWN0dWFsbHkgdXNlZDogZmlndXJpbmcKLSAgIG91dCB0aGUgY29uZmlnIGRvZXMgbm90IGludm9sdmUgYWN0dWFsIGRlY29kaW5nIG5vciB0aGUgcGFydGljdWxhcml0aWVzIG9mIGEgc3BlY2lmaWMgZGVjb2RlciwKLSAgIGl0J3MgdGhlIGZhY3QgdGhhdCBpdCdzIE1QRUc0IHRoYXQgbWF0dGVycywgc28gaXQgc2hvdWxkIG5vdCBiZSBmdW5jdGlvbmFsbHkgYW55IGRpZmZlcmVudAotICAgZnJvbSB0aGUgd2F5IGl0IHdhcyBkb25lIGJlZm9yZSAoYW5kIGl0J3MgbGlnaHQgZW5vdWdoIGZvciBwZXJmb3JtYW5jZSBub3QgdG8gYmUgYW55IHByb2JsZW0KLSAgICAgICAgIHdoYXRzb2V2ZXIpLiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlY0NvbmZpZ0luZm8sICZkdW1teVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlUaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iRGF0YVBhcnRpdGlvbjsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25maWdJbmZvLnVpUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1QRUc0UHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICAvKiBIMjYzIHRpbWUgc2NhbGUgaXMgYWx3YXlzIDMwMDAwICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXM6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgIC8qKiBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgKiAgVGhlIHZpZGVvIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNoZWNrIHdpbGwgYmUgZG9uZSBsYXR0ZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIGlmIHZpZGVvIGJpdHJhdGUgbm90IGF2YWlsYWJsZSByZXRyaWV2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBbmFseXNpcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9QY206Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tQQ007Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiEiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEJ1Z2ZpeCBQNE1FMDAwMDExMjg6IFdpdGggc29tZSBJTVRDIGZpbGVzLCB0aGUgQU1SIGJpdCByYXRlIGlzIDAga2JwcwotICAgICAgICBhY2NvcmRpbmcgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgOS4yIGticHMgdmFsdWUgdGhhbiBhIHN1cmUtdG8tYmUtZmFsc2UgMCBrYnBzIHZhbHVlISovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgdmlkZW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSAtPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLQotICAgICAgICAgICAgaWYoIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDcGx1czsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCk7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdyaXRlIHRoZSBWU1MgM0dQUCB2ZXJzaW9uIGluIHRoZSBjbGlwIGFuYWx5c2lzIHRvIGJlIHN1cmUgdGhlIGludGVncmF0b3IgZG9lc24ndAotICAgICogbWl4IG9sZGVyIGFuYWx5c2lzIHJlc3VsdHMgd2l0aCBuZXdlciBsaWJyYXJpZXMgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1I7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGU7Ci0KLSAgICBpZiggcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBEdXJhdGlvbiA9IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEFuYWx5c2lzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX1VJbnQzMiB1aU5iT2ZWYWxpZFN0cmVhbXMgPSAwOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qKioqKioqKiogZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZzpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBWaWRlbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbwotICAgICAgICAhPSBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qIENoZWNrIHZpZGVvIGZvcm1hdCBpcyBNUEVHLTQsIEgyNjMgb3IgSDI2NCAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB2aWRlb19lcnIgPSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBvbmx5IHN0cmVhbSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyBlZGl0aW5nIGZlYXR1cmUKLSAgICAgICAgKHVubGVzcyBpbiB0aGUgTVAzIGNhc2UpICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogTm8gdmlkZW8gc3RyZWFtIGluIGNsaXAiKTsKLSAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIEF1ZGlvICoqKioqKioqKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiwgRVZSQyBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIC8qPCBPSywgd2UgcHJvY2VlZCwgbm8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qPCBLTywgd2UgcmV0dXJuIGVycm9yICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBzdHJlYW0gaW4gdGhlIGZpbGUuLi4gKi8KLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIGlmKCAwID09IHVpTmJPZlZhbGlkU3RyZWFtcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQWRkZWRDbGlwUHJvcGVydGllcyApCi17Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgc2V0dGluZ3MgKi8KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgVlNTM0dQUCBsaWJyYXJ5ICovCi0gICAgaWYoICggcElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYoICggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBmaWxlIHR5cGUgKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICE9IHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNsaXAxSXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIGFkZGVkIGF1ZGlvICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgIGlmKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6IC8qUkMqLwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUaGUgd3JpdGVyIGNhbm5vdCB3cml0ZSB0aGlzICBpbnRvIGEgM2dwcCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICB9Ci0KLSAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBjYWxsIFNTUkMgaW4gb3JkZXIgdG8gYWxpZ24gQVNGIGFuZC9vciBuYiBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RlcmVvIHRvIE1vbm8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPiBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlZDkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VlNTM0dQUF9Db2RlY3MuYwotICogQGJyaWVmICBWU1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAvKio8IEludGVybmFsIHR5cGVzIG9mIHRoZSBWU1MgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIlZTUzogTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcFd0ckdsb2JhbEludGVyZmFjZSwgcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0gICAgaWYoICggTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgd3JpdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tWaWRlb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID0gTTRPU0FfRkFMU0U7IC8qIGludGVybmFsIGVuY29kZXIgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF0gPSAweCV4IiwKLSAgICAgICAgTWVkaWFUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZ2xvYmFsIGludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGRhdGEgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggbWVkaWFUeXBlID09IE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duCi0gICAgICAgIHx8IG1lZGlhVHlwZSA+PSBNNFJFQURFUl9rTWVkaWFUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCB2aWRlbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgICAgIC8qIGEgZGVjb2RlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJEZWNvZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotCi0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgLyogb2gsIGFuZCBkb24ndCBmb3JnZXQgdGhlIHVzZXIgZGF0YSwgdG9vLiAqLwotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotCi0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIE5YUCBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGRlY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0gICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wR2xvYmFsRmN0czsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wRGF0YUZjdHM7Ci0KLSAgICBpZiggcEMtPnBXcml0ZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcEMtPnBXcml0ZXJEYXRhRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00RU5DT0RFUl9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFNUiIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBlbmNvZGVyIHR5cGUgQUFDIik7Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVsweCV4XT0weCV4LFwKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gMHgleCIsCi0gICAgICAgIGVuY29kZXJUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV0sCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyk7Ci0KLSAgICBpZiggcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlIHJlYWRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4OgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQsCi0gICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOGI3ZDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXQuYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAvKio8IE9TQUwgc3RyaW5nIG1hbmFnZW1lbnQgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAic3RyaW5nLmgiICAgICAgICAgLyoqPCBmb3Igc3RyY3B5IChEb24ndCB3YW50IHRvIGdldCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRPU0FfU3RyaW5nLi4uKSAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVHJhbnNpdGlvbiApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcE91dHB1dEZpbGUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgIEdldCB0aGUgVlNTIDNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwKLSAgICAgICAgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwVmVyc2lvbkluZm8pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00VlNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRWU1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNFZTU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoIE00VlNTM0dQUF9FZGl0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgIHBGaWxlUmVhZFB0ckZjdD0weCV4LCBwRmlsZVdyaXRlUHRyRmN0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVSZWFkUHRyRmN0LCBwRmlsZVdyaXRlUHRyRmN0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgICAgICAvKiBJbmlhbGl6YXRpb24gb2YgY29udGV4dCBWYXJpYWJsZXMgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwQywgMCxzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgLyogSW5pdCB0aGUgY29udGV4dC4gKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gMDsKLSAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aUN1cnJlbnRDbGlwID0gMDsKLSAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IHBDLT55dXYxWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IHBDLT55dXYyWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IHBDLT55dXYzWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IHBDLT55dXY0WzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCBQQy0+ZXdjIG1lbWJlcnMgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlOYkNoYW5uZWxzID0gMTsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAwOwotICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5pTXBlZzRHb3ZPZmZzZXQgPSAwOwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSAwOwotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIC8qKgotICAgICogS2VlcCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9ucyBwb2ludGVyIHNldCBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgLyogVGhlIGZsYWcgaXMgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+YklzTU1TID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0cyA9IDA7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBDbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggcENsaXBTZXR0aW5ncz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsgICAgICAgIC8qKjwgbm8gZmlsZSAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IHVuZGVmaW5lZCAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwRmlsZSkrMSwgTTRWU1MzR1BQLAotICAgICAgICAvLyAicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgc3RybGVuKHBGaWxlKSsxKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCi0gICAgcENsaXBTZXR0aW5ncy0+ZmlsZVBhdGhTaXplID0gZmlsZVBhdGhTaXplICsgMTsKLSAgICAvKiovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lID0gMDsgLyoqPCBubyBiZWdpbiBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAwOyAgIC8qKjwgbm8gZW5kIGN1dCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0U2V0RGVmYXVsdFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBkZXN0PTB4JXAgc3JjPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdCwgcENsaXBTZXR0aW5nc09yaWcpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ29weSBwbGFpbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZywgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgIC8qIER1cGxpY2F0ZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSApCi0gICAgewotICAgICAgICAvL3BDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgIC8vIChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgcENsaXBTZXR0aW5nc09yaWctPnBGaWxlLAotICAgICAgICAvLyBzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxKTsKLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwotICAgICAgICAoIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwotICAgIH0KLQotICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBmcmVlIGZpbGVuYW1lICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIGVmZmVjdHMgc2V0dGluZ3MgKi8KLSAgICAvKiAgICBpZihNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9IFJDICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgICAgU2V0IHRoZSBWU1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgb3V0cHV0RmlsZVR5cGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7IC8qKjwgM0dQUCBvciBNUDMgKHdlIGRvbid0IGRvIEFNUiBvdXRwdXQpICovCi0gICAgTTRPU0FfVUludDMyIHVpQzFkdXJhdGlvbiwgdWlDMmR1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTZXR0aW5ncy0+cENsaXBMaXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MtPnBDbGlwTGlzdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggKCBwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgJiYgKHBDLT5TdGF0ZSAhPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW50ZXJuYWwgc2V0dGluZ3MgbGlzdCAqLwotICAgIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KHBDKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdXNlciBzZXR0aW5ncyBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT51aUNsaXBOdW1iZXIgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgY2xpcCBsaXN0ICovCi0gICAgcEMtPnBDbGlwTGlzdCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKQotICAgICAgICAqIHBDLT51aUNsaXBOdW1iZXIsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBDbGlwTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucENsaXBMaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSksCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGVmZmVjdHMgbGlzdCBSQyAqLwotCi0gICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDggaWYgdGhlIG51bWJlciBvZiBlZmZlY3RzIGlzIDAgLT4gY3Jhc2gqLwotICAgIGlmKCBwU2V0dGluZ3MtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEVmZmVjdHNMaXN0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzTGlzdFtpXSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgUkMgKi8KLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUludDgpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBBY3RpdmVFZmZlY3RzTGlzdCIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IDA7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGVzdCB0aGUgY2xpcCBhbmFseXNpcyBkYXRhLCBpZiBpdCBpcyBub3QgcHJvdmlkZWQsIGFuYWx5c2UgdGhlIGNsaXBzIGJ5IG91cnNlbHZlcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEFuYWx5c2lzIG5vdCBwcm92aWRlZCBieSB0aGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChwQy0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUsICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGNsaXAgY29tcGF0aWJpbGl0eSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9TTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgYWxsIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoJWQpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBpLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGUgbWFzdGVyIGNsaXAgdmVyc3VzIGFsbCB0aGUgb3RoZXIgb25lcy4KLSAgICAgICAgKGluY2x1ZGluZyBtYXN0ZXIgY2xpcCB3aXRoIGl0c2VsZiwgZWxzZSB2YXJpYWJsZXMgZm9yIG1hc3RlciBjbGlwCi0gICAgICAgIGFyZSBub3QgcHJvcGVybHkgc2V0dGVkKSAqLwotICAgICAgICBpZihwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2Ugb2Ygd2FybmluZyByZWdhcmRpbmcgYXVkaW8gaW5jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgIGVkaXRpbmcgY29udGludWVzICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSByZXR1cm5zIDB4JXghIiwgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogU2VhcmNoIGF1ZGlvIHRyYWNrcyB0aGF0IGNhbm5vdCBiZSBlZGl0ZWQgOgotICAgICogICAtIGRlbGV0ZSBhbGwgYXVkaW8gZWZmZWN0cyBmb3IgdGhlIGNsaXAKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBlZGl0YWJsZSBsZXQgdGhlIHRyYW5zaXRpb24KLSAgICAoYmFkIHRyYWNrIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgd2l0aCBzaWxlbmNlKQotICAgICogICAtIGlmIG1hc3RlciBjbGlwIGlzIG5vdCBlZGl0YWJsZSBzd2l0Y2ggdG8gYSBkdW1teSB0cmFuc2l0aW9uIChvbmx5IGNvcHkvcGFzdGUpICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcEMtPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNMaXN0W3VpRnhdLkF1ZGlvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICA9IE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGkgPCAocEMtPnVpQ2xpcE51bWJlciAtIDEpKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPkF1ZGlvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2UgYWRkIGEgdHJhbnNpdGlvbiBvZiBkdXJhdGlvbiAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgY2xpcC4KLSAgICAqIEl0IHdpbGwgc3VwcHJlc3MgYSB3aG9sZSBidW5jaCBhIHRlc3QgbGF0dGVyIGluIHRoZSBwcm9jZXNzaW5nLi4uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAqIChwQy0+dWlDbGlwTnVtYmVyKSwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5TZXR0aW5ncy5wVHJhbnNpdGlvbkxpc3QsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKio8IGNvcHkgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSk7IGkrKyApCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8qKjwgV2UgZmlsbCB0aGUgbGFzdCAiZHVtbXkiIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIgLSAxXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyCi0gICAgICAgIC0gMV0uVmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLQotICAgIC8qKgotICAgICogQXZvaWQgd2VpcmQgY2xpcCBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpKzFdLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTWF4aW11bSB0cmFuc2l0aW9uIGR1cmF0aW9uIGJldHdlZW4gY2xpcCBuIGFuZCBjbGlwIG4rMSBpcyB0aGUgZHVyYXRpb24KLSAgICAgICAgKiBvZiB0aGUgc2hvcnRlc3QgY2xpcCAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgZHVyYXRpb24gb2YgY2xpcCBuIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBTdWJzdHJhY3QgYmVnaW4gY3V0ICovCi0gICAgICAgIHVpQzFkdXJhdGlvbiAtPSBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuICovCi0gICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID4gdWlDMWR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IHVpQzFkdXJhdGlvbiAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSArIDFdLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbisxIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzJkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMyZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqPCBDaGVjayB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIHNob3J0ZXIgdGhhbiBjbGlwIG4rMSAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzJkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMyZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQXZvaWQgd2VpcmQgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cFRyYW5zaXRpb25MaXN0W2ldKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2sgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGF0IHR3byB0cmFuc2l0aW9ucyBhcmUgbm90IG92ZXJsYXBwaW5nCi0gICAgICAgICAgKG5vIG92ZXJsYXBwaW5nIHBvc3NpYmxlIGZvciBmaXJzdCBjbGlwKSAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgaXMgYSB0cmFuc2l0aW9uIG92ZXJsYXAgaWYgdGhlIHN1bSBvZiB0aGUgZHVyYXRpb24gb2YKLSAgICAgICAgICAgICAgdHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zCi0gICAgICAgICAgICAqIGlzIGhpZ2hlciB0aGFuIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2xpcCBpbi1iZXR3ZWVuLiAqLwotICAgICAgICAgICAgaWYoICggcEMtPnBUcmFuc2l0aW9uTGlzdFtpIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgICAgICAgICArIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24pID49IHVpQzFkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE92ZXJsYXBwaW5nIHRyYW5zaXRpb25zIG9uIGNsaXAgJWQsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdXRwdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPgotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0uQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKiBPbmx5IHZpZGVvIHRyYWNrIGR1cmF0aW9uIGlzIGltcG9ydGFudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGV2aWF0aW9uIGlmIGF1ZGlvIHRyYWNrIGlzIGxvbmdlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsgLyoqPCBBZGQgZW5kIGN1dCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gLT0KLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7IC8qKjwgUmVtb3ZlIGJlZ2luIGN1dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbW92ZSB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gKGl0IGlzIGNvdW50ZWQgdHdpY2UpICovCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09IHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogR2V0IHZpZGVvIHByb3BlcnRpZXMgZnJvbSBvdXRwdXQgcHJvcGVydGllcyAqLwotCi0gICAgLyogR2V0IG91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgc3dpdGNoKHBDLT54VlNTLm91dHB1dFZpZGVvU2l6ZSkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzUyOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcgKi8KLSAgICAgICAgICAgIC8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gOTYwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEwODg7IC8vIG5lZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBubyBvdXRwdXQgdmlkZW8gc2l6ZSBnaXZlbiwgZGVmYXVsdCB0byBRQ0lGISIpOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSAgICAgICAgPSAzMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgID0gMDsKLSAgICAvKiBTZXQgb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBtYXN0ZXIgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICB1aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgc3dpdGNoKCBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSwgbXAzIGNvcmUgcmVhZGVyIHJldHVybiBhIHRpbWUgaW4gbXMgKi8KLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxwQy0+dWlDbGlwTnVtYmVyOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIC8qKiBJZiBub3QgdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZSwgY2hlY2sKLSAgICAgICAgICAgICAqIGlmIHRyYW5zY29kaW5nIHJlcXVpcmVkIG5vdwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICE9Ci0gICAgICAgICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCl8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0gyNjQpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rTVBFRzQgJiYKLSAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSkgewotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqIElmIGJUcmFuc2NvZGluZ1JlcXVpcmVkIGlzIHRydWUsIGl0IG1lYW5zIHRoZSBjbGlwIGhhcwotICAgICAgICAgICAgICogYmVlbiB0cmFuc2NvZGVkIGluIEFuYWx5c2lzIHBoYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBXZSBwcm9kdWNlIGEgM2dwcCBmaWxlLCB1bmxlc3MgaXQgaXMgbXAzICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPgotICAgICAgICBwQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzsKLSAgICBlbHNlCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAvKioKLSAgICAqIEJld2FyZSwgYSBudWxsIGR1cmF0aW9uIHdvdWxkIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBlcnJvciAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLikgKi8KLSAgICBpZiggMCA9PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPcGVuIGZpcnN0IGNsaXAgKi8KLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRG8gdGhlIHZpZGVvIHN0dWZmIGluIDNHUFAgQXVkaW8vVmlkZW8gY2FzZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gZm9yIHRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKHBDLAotICAgICAgICAgICAgcFNldHRpbmdzLT51aU1hc3RlckNsaXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbmNyZW1lbnQgZm9yIHRoZSB0cmFuc2l0aW9uIGZpbGUgKi8KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDI1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IGludmFsaWQgdmlkZW9GcmFtZVJhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBbHBoYTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBNUEVHLTQgY2FzZS4KLSAgICAgICAgICAgICogVGltZSBzY2FsZSBvZiB0aGUgdHJhbnNpdGlvbiBlbmNvZGVyIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUKLSAgICAgICAgICAgICogdGltZXNjYWxlIG9mIHRoZSBpbnB1dCBmaWxlcy4KLSAgICAgICAgICAgICogU28gdGhlIGZyYW1lIGR1cmF0aW9uIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgdGltZSBzY2FsZSwKLSAgICAgICAgICAgICogYnV0IHdpdGhvdXQgYmVlaW5nIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICogRm9yIHRoYXQsIHdlIG11c3QgY29tcHV0ZSBhbHBoYSAoaW50ZWdlcikgc28gdGhhdDoKLSAgICAgICAgICAgICogICAgICAgICAgICAgKGFscGhhIHggMTAwMCkvRW5jb2RlclRpbWVTY2FsZSA+IE1pbkZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICoqLwotCi0gICAgICAgICAgICB1aUFscGhhID0gKE00T1NBX1VJbnQzMikoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggdWlBbHBoYSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICggdWlBbHBoYSAqIDEwMDAuMCkgLyBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlIGZvciBIMjYzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgTVAzIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyIG1wM3RhZ0J1ZmZlcjsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUocEMsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgSUQzdjIgdGFnIGNvdWxkIGJlIGF0IGFueSBwbGFjZSBpbiB0aGUgbXAzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoZSBtcDMgcmVhZGVyIG9ubHkgY2hlY2tzIGZldyBieXRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgIHN0cmVhbSB0byBsb29rIGZvciBhIElEM3YyIHRhZyAgKi8KLSAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBpZiB0aGUgSUQzdjIgdGFnIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRoZSByZWFkZXIgZG8KLSAgICAgICAgYXMgdGhlcmUgaXMgbm8gdGhlc2UgbWV0YWRhdGEgKi8KLQotICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnICovCi0gICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZywKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmbXAzdGFnQnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiggMCAhPSBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBXcml0ZURhdGEoSUQzdjJUYWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3BEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgM0dQUCBvdXRwdXQgZmlsZSAqLwotICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdDogU2V0IG1heCBvdXRwdXQgZmlsZSBzaXplIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIERlZmF1bHQgZXJyb3IgY2FzZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogaW52YWxpZCBvdXRwdXRGaWxlVHlwZSA9IDB4JXgsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiIsCi0gICAgICAgICAgICBvdXRwdXRGaWxlVHlwZSk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SOyAvKio8IHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSB1c2VyICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlLgotICAgICogVGhlIGZpcnN0IGNsaXAgaXMgaW5kZXBlbmRhbnQgdG8gdGhlICJ2aXJ0dWFsIHByZXZpb3VzIGNsaXBzIiwKLSAgICAqIHNvIGl0J3MgbGlrZSBpZiB3ZSB3aGVyZSBpbiBSZWFkL1dyaXRlIG1vZGUgYmVmb3JlIGl0LiAqLwotICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgIHBQcm9ncmVzcyAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOiBFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB1aVByb2dyZXNzQXVkaW8sIHVpUHJvZ3Jlc3NWaWRlbywgdWlQcm9ncmVzczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gYW5kIHNlbGVjdCBjb3JyZWN0IHByb2Nlc3NpbmcgKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8ocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA6Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXAoKTogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcy4KLSAgICAqIFdlIGRvIHRoZSBjb21wdXRpbmcgd2l0aCAzMmJpdHMgcHJlY2lzaW9uIGJlY2F1c2UgaW4gc29tZSAodmVyeSkgZXh0cmVtZSBjYXNlLCB3ZSBtYXkgZ2V0Ci0gICAgKiB2YWx1ZXMgaGlnaGVyIHRoYW4gMjU2ICguLi4pICovCi0gICAgdWlQcm9ncmVzc0F1ZGlvID0KLSAgICAgICAgKCAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiAxMDApKSAvIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgdWlQcm9ncmVzc1ZpZGVvID0gKChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgIHVpUHJvZ3Jlc3MgPSB1aVByb2dyZXNzQXVkaW8gKyB1aVByb2dyZXNzVmlkZW87Ci0KLSAgICBpZiggKCBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFNZU19rQXVkaW9Vbmtub3duKQotICAgICAgICAmJiAocEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgIT0gTTRTWVNfa1ZpZGVvVW5rbm93bikgKQotICAgICAgICB1aVByb2dyZXNzIC89IDI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCB1aVByb2dyZXNzID4gMTAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpdWlQcm9ncmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB0aGUgZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIFZTUyBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24uCi0gICAgKiBJbiAidGhlb3J5Iiwgd2Ugc2hvdWxkIG5vdCBhdXRob3JpemUgY2xvc2luZyBpZiB3ZSBhcmUgaW4gQ1JFQVRFRCBzdGF0ZS4KLSAgICAqIEJ1dCBpbiBwcmFjdGljZSwgaW4gY2FzZSB0aGUgb3BlbmluZyBmYWlsZWQsIGl0IG1heSBoYXZlIGJlZW4gcGFydGlhbGx5IGRvbmUuCi0gICAgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBmcmVlIHNvbWUgb3BlbmVkIHJlc3NvdXJjZXMgYnkgY2FsbGluZyBDbG9zZS4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEID09IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBXcm9uZyBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBUaGVyZSBtYXkgYmUgYW4gZW5jb2RlciB0byBkZXN0cm95ICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9lZGl0RGVzdHJveVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpZiggTTRTWVNfa01QMyA9PSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBNUDMgY2FzZSAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBvdXRwdXQgM0dQUCBjbGlwLCBpZiBpdCBoYXMgYmVlbiBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICAgICAgbGFzdENUUyA9IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcEZjdENsb3NlV3JpdGUoT1VUKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgb3V0cHV0IGF1ZGlvIERTSSwgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBjbGlwMSwgaWYgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocEMtPnBDMSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDIsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzIgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRlbXBvcmFyeSBZVVYgcGxhbmVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1syXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSQyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBFZmZlY3RzTGlzdCk7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihwQy0+bV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIHJldHVybmVkRXJyb3IpOwotICAgIHJldHVybiByZXR1cm5lZEVycm9yOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSwgaWYgbmVlZGVkLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgY2xvc2UgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBjYWxsaW5nIE00VlNTM0dQUF9lZGl0Q2xvc2UiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbG9zZShwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBEdW1teUF1QnVmZmVyKTsKLSAgICAgICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRDbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgICBlcnIgICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCBNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyICpzTWVzc2FnZSApCi17Ci0gICAgc3dpdGNoKCBlcnIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk86Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU06Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IE5vdCBhIFZTUzNHUFAgZXJyb3IgKi8KLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKiAgIFNUQVRJQyBGVU5DVElPTlMgICAqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIGNsaXAgc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgZ2l2ZW4gc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAoSU4vT1VUKSBDbGlwIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb247IC8qKjwgdGhlIGNsaXAgZHVyYXRpb24gb25jZSB0aGUgY3V0cyBhcmUgZG9uZSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUR1cmF0aW9uOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotCi0gICAgLyoqCi0gICAgKiBJZiBiZWdpbiBjdXQgaXMgdG9vIGZhciwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgdWlEdXJhdGlvbiA9IHBDbGlwLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLQotICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iLAotICAgICAgICAgICAgcENsaXAtPnVpQmVnaW5DdXRUaW1lLCB1aUR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCBpcyB0b28gZmFyLCBzZXQgdG8gemVybyAoaXQgbWVhbnMgbm8gZW5kIGN1dCkgKi8KLSAgICBpZiggcENsaXAtPnVpRW5kQ3V0VGltZSA+IHVpRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcENsaXAtPnVpRW5kQ3V0VGltZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGFjdHVhbCBjbGlwIGR1cmF0aW9uIChvbmNlIGN1dHMgYXJlIGRvbmUpICovCi0gICAgaWYoIDAgPT0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBObyBlbmQgY3V0ICovCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gdWlEdXJhdGlvbiAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDbGlwLT51aUJlZ2luQ3V0VGltZSA+PSBwQ2xpcC0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiLAotICAgICAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgcENsaXAtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDsKLSAgICAgICAgfQotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHBDbGlwLT51aUVuZEN1dFRpbWUgLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBUcmFuc2l0aW9uICAgIChJTi9PVVQpIFRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKQotewotICAgIC8qKgotICAgICogTm8gdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwID09IHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgICAgICBwVHJhbnNpdGlvbi0+QXVkaW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIH0KLSAgICBlbHNlIGlmKCAoIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlKQotICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUKLSAgICAgICAgPT0gcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUpICkKLSAgICB7Ci0gICAgICAgIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBleHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHNldCAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFRyYW5zaXRpb24tPkV4dFZpZGVvVHJhbnNpdGlvbkZjdCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IG1pbmltYWwgdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA+IDApCi0gICAgICAgICYmIChwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgPCBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPQotICAgICAgICAgICAgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUocEMtPnBDbGlwTGlzdCk7Ci0gICAgICAgIHBDLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUCBmaWxlCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0KLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+b3BlbldyaXRlKCZwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBwT3V0cHV0RmlsZSwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGU6IFdyaXRlT3BlbiByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsCi0gICAgICAgICAgIFJlYWRpZXMgdGhlIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIHRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSBjYWxsZWQgd2l0aCBwQ19ld2M9MHgleCwgcE91dHB1dEZpbGU9MHgleCIsCi0gICAgICAgIHBDX2V3YywgcE91dHB1dEZpbGUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENfZXdjKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwQ19ld2MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwT3V0cHV0RmlsZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcE91dHB1dEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKHBDX1NoZWxsQVBJLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuKCZwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwT3V0cHV0RmlsZSwgcE9zYUZpbGVXcml0UHRyLCBwVGVtcEZpbGUsIHBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBzaWduYXR1cmUgb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogVlNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3Q6Ci0gICAgU2V0IHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBvcHRpb24gaW4gdGhlIHdyaXRlciBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlCi0gICAgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBmaWxlIHNpemUgbGltaXRhdGlvbiovCi0gICAgaWYoIG1heE91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRXUklURVJfa01heEZpbGVTaXplLCAmbWF4T3V0cHV0RmlsZVNpemUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHdyaXRlciBzZXQgb3B0aW9uIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHZlcnNpb24gb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICAoTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAqIDEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgKiAxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pOwotICAgIGVyciA9Ci0gICAgICAgIHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa1ZpZGVvVW5rbm93biAhPSBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCA9IHBDX2V3Yy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQ19ld2MtPnVpVmlkZW9XaWR0aDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDAuMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgcENfZXdjLT5wVmlkZW9PdXRwdXREc2k7IC8qKjwgUHJldmlvdXNseSBjb21wdXRlZCBvdXRwdXQgRFNJICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT4KLSAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSBzaXplICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgIC8qKjwgV2UgSEFWRSB0byBwdXQgYSB2YWx1ZSBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBpbnB1dCB2aWRlbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsICZwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuRFRTID0gMDsgICAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aVZpZGVvTWF4QXVTaXplID0gKE00T1NBX1VJbnQzMikoMS41RgotICAgICAgICAgICAgKihNNE9TQV9GbG9hdCkocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGgKLSAgICAgICAgICAgICogcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0KQotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aVZpZGVvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IChNNE9TQV9VSW50MzIpKHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSBcCi0gICAgICAgICAgICAqIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQ2h1bmNrIHNpemUgKi8KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3Mgc3RyZWFtQXVkaW9JbmZvOwotCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT51aUF1ZGlvT3V0cHV0RHNpU2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYlNhbXBsZXNQZXJTZWMgPQotICAgICAgICAgICAgcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSA9IHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJDaGFubmVscyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDX2V3Yy0+dWlOYkNoYW5uZWxzOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYkJpdHNQZXJTYW1wbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQ19ld2MtPnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzogLyoqPCB0aGVyZSBjYW4ndCBiZSBNUDMgdHJhY2sgaW4gM0dQUCBmaWxlIC0+IGVycm9yICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiB1bmtub3duIG91dHB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIC1wQ19ld2MtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplID0gTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBwQ19ld2MtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIGNodW5jayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCBhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBzdHJlYW1zIGFkZGVkLCB3ZSdyZSBub3cgcmVhZHkgdG8gd3JpdGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoCi0gICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCkKLSAqIEBicmllZiAgICBHZW5lcmF0ZSBhIEgyNjMgb3IgTVBFRy00IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBjb21wYXRpYmxlIHdpdGggYWxsIGlucHV0IHZpZGVvCi0gKiAgICAgICAgICAgIHRyYWNrcy4gQ29weSBhdWRpbyBkc2kgZnJvbSBtYXN0ZXIgY2xpcC4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKQotewotICAgIE00T1NBX0ludDMyIGlSZXN5bmNoTWFya2VyRHNpSW5kZXg7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUZvckRzaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiR2V0RFNpRnJvbUVuY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBIMjYzIGNhc2UgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSA3OwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjYzKSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjYzKSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAoV2Ugb3ZlcnJpZGUgdGhlIGlucHV0IHZlbmRvciBpbmZvLgotICAgICAgICAqIEF0IGxlYXN0IHdlIGtub3cgdGhhdCBub3RoaW5nIHNwZWNpYWwgd2lsbCBiZSB0cmllZCB3aXRoIFBITFAtc3RhbXBlZAotICAgICAgICAgIGVkaXRlZCBzdHJlYW1zLi4uKSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVswXSA9ICdQJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMV0gPSAnSCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzJdID0gJ0wnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVszXSA9ICdQJzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs0XSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGV2ZWwgaXMgdGhlIHNpeHRoIGJ5dGUgaW4gdGhlIERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs1XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIGluIHRoZSBEU0kqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs2XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1QRUctNCBjYXNlICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSB8fAotICAgICAgICBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSkgewotCi0gICAgICAgIC8qIEZvciBNUEVHNCBhbmQgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOiBlbmNIZWFkZXItPnBCdWY9MHgleCwgc2l6ZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5wQnVmLCBlbmNIZWFkZXItPlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgIHNlbmQgRFNJIGZvciB2aWRlbyBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ29tcHV0ZSBBdWRpbyBEU0kgKi8KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBpZiggdWlNYXN0ZXJDbGlwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDbGlwIGlzIGFscmVhZHkgb3BlbmVkICovCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQy0+cEMxLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjYW4gdXNlIHRoZSBmYXN0IG9wZW4gbW9kZSB0byBnZXQgdGhlIERTSSAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgJnBDLT5wQ2xpcExpc3RbdWlNYXN0ZXJDbGlwXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2kgPSAmKHBDbGlwLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwQXVkaW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBBdWRpb091dHB1dERzaSwKLSAgICAgICAgICAgICh2b2lkICopcFN0cmVhbUZvckRzaS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIGEgY2xpcCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBvcGVuZWQgdG8gZ2V0IGl0cyBEU0ksIGNsb3NlIGl0ICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKQotICogQGJyaWVmICAgIFN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGNsaXAgdG8gdGhlIG5leHQgb25lCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IGZpcnN0IGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBpbmNyZW1lbnQgY2xpcCBjb3VudGVyICovCi0gICAgICAgIHBDLT51aUN1cnJlbnRDbGlwKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNsaXAgKi8KLSAgICBpZiggcEMtPnVpQ3VycmVudENsaXAgPj0gcEMtPnVpQ2xpcE51bWJlciApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbG9zZShDMSkgcmV0dXJucyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgbmV4dCBjbGlwIGhhcyBhbHJlYWR5IGJlIG9wZW5lZCwgc2V0IGl0IGFzIGZpcnN0IGNsaXAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQzEgPSBwQy0+cEMyOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSA9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzIgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvKioKLSAgICAqIGVsc2Ugb3BlbiBpdCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzEsCi0gICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZCB5ZXQsCi0gICAgICAgICAgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIHRyYW5zaXRpb24uCi0gICAgICAgICogU28gYm90aCBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHRpbWVzIGFyZSBPSy4KLSAgICAgICAgKiBTbyB3ZSBjYW4gc2V0IGJvdGggdmlkZW8yIGFuZCBhdWRpbyBvZmZzZXRzICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCB2aWRlbyBvZmZzZXQgKi8KLQotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBwQy0+cEMxLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIGF1ZGlvIG9mZnNldCAqLwotICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCArPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAqIFRoZXJlIG1heSBiZSBhIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIEFVIG9mIGRlc3luY2hybyBhdCBlYWNoIGFzc2VtYmx5LgotICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAqIHRoYW4gb25lIGF1ZGlvIEFVIGR1cmF0aW9uLgotICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgIGlmKCAoIHBDLT5wQzEtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAtIChNNE9TQV9JbnQzMikocEMtPnBDMS0+aVZvZmZzZXQgKnBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSkKLSAgICAgICAgPiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZHZhbmNlIG9uZSBBTVIgZnJhbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVwZGF0ZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkqLwotICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgY2xpcCBwcm9jZXNzaW5nICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0KLSAgICAgICAgaWYoIHBDLT5Wc3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgbm90IGEgdHJhbnNpdGlvbiB0aGVuIHJlc2V0IHByZXZpb3VzIHZpZGVvIHN0YXRlICovCi0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRoZSBmbGFncyBhcmUgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwLCBub3cgd2UgZG8gdGhlIGF1ZGlvICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXJ0IHdpdGggdGhlIHZpZGVvICovCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKiogaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcIiVzXCIiLAotICAgICAgICAoTTRPU0FfQ2hhciAqKXBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdChoQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgaWYoICpoQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCpoQ2xpcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBzaG9ydGN1dCAqLwotICAgIHBDbGlwID0gKmhDbGlwOwotCi0gICAgaWYgKHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzID0gJnBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzOwotICAgICAgICBwQ2xpcC0+cFNldHRpbmdzID0gcENsaXBTZXR0aW5nczsKLSAgICAgICAgcENsaXAtPmlFbmRUaW1lID0gcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAqaENsaXAgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgY29tbW9uICdzaWxlbmNlIGZyYW1lIHN0dWZmJyB0byBDbGlwQ29udGV4dCAqLwotICAgIHBDbGlwLT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDbGlwLT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcENsaXAtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQ2xpcC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcENsaXAtPmlBdWRpb0ZyYW1lQ3RzID0gLXBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQsCi0gICAgKiB3ZSByZW1vdmUgaXQuIFNvIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQ2xpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgaWYoIDAgPT0gcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZihwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgdmlkZW8gdG8gdGhlIHRhcmdldCBiZWdpbiBjdXQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVnaW4gY3V0IHZhbHVlICovCi0gICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIGlDdHMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAocENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgdmlkZW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBwQ2xpcC0+aVZvZmZzZXQgPSAtcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgYXVkaW8gdG8gdGhlIHZpZGVvIGFjdHVhbCBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbEF1ZGlvQmVnaW5DdXQgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0Ci0gICAgICAgICAgICAgICAgICAgICogcENsaXAtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjbGlwIG9mZnNldCB3aXRoIHRoZSBhdWRpbyBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtaUN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZvciB0aGUgTVAzLCB0aGUganVtcCBpcyBub3QgZG9uZSBiZWNhdXNlIG9mIHRoZSBWQlIsCi0gICAgICAgICAgICAgICAgICBpdCBjb3VsZCBiZSBub3QgZW5vdWdoIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYgKChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmVhZCB0aGUgZmlyc3QgVmlkZW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcC0+cFZpZGVvU3RyZWFtLCAmcENsaXAtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2UgKGFscmVhZHkhKSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjbGlwLCB3ZSBmaWx0ZXIgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICogSXQgd2lsbCBiZSBjb3JyZWN0bHkgbWFuYWdlZCBhdCB0aGUgZmlyc3Qgc3RlcC4gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljV2lkdGg7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcFByb3BlcnRpZXMtPnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RhdGUgY2hlY2sgbm90IHRvIGFsbG9jYXRlIGJ1ZmZlciBkdXJpbmcgc2F2ZSBzdGFydCAqLwotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgaW5wdXQgY2xpcCBpcyBhIHJvdGF0ZSB2aWRlbyBvciB0aGUgb3V0cHV0IHJlc29sdXRpb24gaXMgZGlmZmVyZW50Ci0gICAgICAgICogZnJvbSB0aGUgaW5wdXQgcmVzb2x1dGlvbiwgdGhlbiB0aGUgdmlkZW8gZnJhbWUgbmVlZHMgdG8gYmUgcm90YXRlZAotICAgICAgICAqIG9yIHJlc2l6ZWQsIGZvcmNlIHRvIHJlc2l6ZSBtb2RlICovCi0gICAgICAgIGlmICgoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCkgfHwKLSAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDLT5ld2MudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQpIHx8Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnZpZGVvUm90YXRpb25EZWdyZWVzICE9IDApIHsKLQotICAgICAgICAgICAgaWYgKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXppbmcgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFByZVJlc2l6ZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgdmlkZW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIGlmKCAoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICYmIChNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBBdWRpbyBBVSBvZiB0aGUgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludE9wZW5DbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoKQotICogQGJyaWVmICAgIEF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsCi0gKiAgICAgICAgICBkdXJhdGlvbnMsIHRyYW5zaXRpb25zIGFuZCBjdXRzLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDU18wLCAqcENTXzEsICpwQ1NfMjsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVDAsICpwVDI7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX1VJbnQzMiB0MF9kdXJhdGlvbiwgdDJfZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIHQwX2JpdHJhdGUsIHQyX2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIGMxX2R1cmF0aW9uOwotCi0gICAgTTRPU0FfVUludDMyIHRvdGFsX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9iaXRzdW07Ci0KLSAgICB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgdG90YWxfYml0c3VtID0gMDsKLQotICAgIC8qIExvb3Agb24gdGhlIG51bWJlciBvZiBjbGlwcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDU18xID0gJnBDLT5wQ2xpcExpc3RbaV07Ci0KLSAgICAgICAgdDBfZHVyYXRpb24gPSAwOwotICAgICAgICB0MF9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICB0Ml9kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGlwICovCi0gICAgICAgIGlmKCBpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18wID0gJnBDLT5wQ2xpcExpc3RbaSAtIDFdOwotICAgICAgICAgICAgcFQwID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdOwotCi0gICAgICAgICAgICBpZiggcFQwLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQwX2R1cmF0aW9uID0gcFQwLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0MF9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQwX2JpdHJhdGUgPSBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXh0IGNsaXAgKi8KLSAgICAgICAgaWYoIGkgPCBwQy0+dWlDbGlwTnVtYmVyIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18yID0gJnBDLT5wQ2xpcExpc3RbaSArIDFdOwotICAgICAgICAgICAgcFQyID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaV07Ci0KLSAgICAgICAgICAgIGlmKCBwVDItPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAhPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdDJfZHVyYXRpb24gPSBwVDItPnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA+IHQyX2JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdDJfYml0cmF0ZSA9IHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgY3V0IHRpbWVzICovCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlFbmRDdXRUaW1lID4gMCApCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIHBDU18xLT51aUJlZ2luQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gLT0gcENTXzEtPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGMxX2R1cmF0aW9uIC09IHQwX2R1cmF0aW9uICsgdDJfZHVyYXRpb247Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBiaXRzdW0gYW5kIGR1cmF0aW9uICovCi0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGMxX2R1cmF0aW9uICsgdDBfZHVyYXRpb24gLyAyICsgdDJfZHVyYXRpb24gLyAyOwotCi0gICAgICAgIHRvdGFsX2JpdHN1bSArPQotICAgICAgICAgICAgYzFfZHVyYXRpb24gKiAocENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlIC8gMTAwMCkKLSAgICAgICAgICAgICsgKHQwX2JpdHJhdGUgLyAxMDAwKSAqIHQwX2R1cmF0aW9uIC8gMgotICAgICAgICAgICAgKyAodDJfYml0cmF0ZSAvIDEwMDApICogdDJfZHVyYXRpb24gLyAyOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAoIHRvdGFsX2JpdHN1bSAvIHRvdGFsX2R1cmF0aW9uKSAqIDEwMDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0Njg4M2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBQV1JfRlhQX0ZSQUNUX01BWCAgICAgICAgICAgICgzMjc2OCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00T1NBX0ludDMyIEp1bXBDdHM7Ci0KLSAgICBKdW1wQ3RzID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQ2xpcCwgJkp1bXBDdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChBKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIEp1bXBDdHMgPj0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IC1KdW1wQ3RzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBhdWRpbyBpcyBjdXJyZW50bHkgaW4gcmVhZGluZyBtb2RlICovCi0gICAgICAgIHBDbGlwLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwgKE00T1NBX1VJbnQzMilwQ2xpcC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICBwQy0+ZXdjLmRBVG8gPQotICAgICAgICAgICAgKCBwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgKyBwQ2xpcC0+aUFvZmZzZXQpIC8gcENsaXAtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIGlmKCAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQXVkaW9GcmFtZUN0cyAvIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSkKLSAgICAgICAgICAgID49IHBDbGlwLT5pRW5kVGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgZHVyYXRpb24gaXMgYmV0dGVyIHJlc3BlY3RlZCBpZiB0aGUgZmlyc3QgQVUgYW5kIGxhc3QgQVUgYXJlIGJvdGggYWJvdmUKLSAgICAgICAgICAgIHRoZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgcENsaXAtPnBBdWRpb0ZyYW1lUHRyLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAvKiBUaGUgSUQzdjEgdGFnIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBtcDMgZmlsZSBzbyB0aGUgZW5kIG9mIHRoZSBjdXR0aW5nCi0gICAgICAgICAgICBwcm9jZXNzIGlzIHdhaXRlZCAqLwotICAgICAgICAgICAgLyogYmVmb3JlIHdyaXRpbmcgdGhlIG1ldGFkYXRhIGluIHRoZSBvdXRwdXQgZmlsZSovCi0KLSAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSBkYXRhIG9mIHRoZSBJRDN2MSBUYWcgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6IE00TVAzUl9nZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgICAgIGZyZWUobXAzdGFnQnVmZmVyLm1fcERhdGEpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6XAotICAgICAgICAgICAgICAgICAgICAgICAgcE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEoSUQzdjFUYWcpIHJldHVybnMgMHgleCIsICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFRoZSBFbmQgQ3V0IGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMgOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICYmIChNNE9TQV9GQUxTRQotICAgICAgICAgICAgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKSAvKio8IFJlYWNoZWQgZW5kIG9mIGNsaXAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKAotICAgICAgICAgICAgICAgIHBDKTsgLyoqPCBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQzMl90IGF1VGltZVN0YW1wID0gLTE7Ci0KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNPdXRCdWZmZXI7IC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNE9TQV9UaW1lCi0gICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICBNNE9TQV9Cb29sIGJTdG9wQXVkaW87Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIGlmKCAoIHBDLT5ld2MuZEFUbyAtIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgQXVkaW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoCi0gICAgICAgIHBDKTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgcEMtPkFzdGF0ZSB2YXJpYWJsZSEgKi8KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBzdGVwIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5Bc3RhdGUsIHBDLT5wQzEtPmlBb2Zmc2V0KTsKLQotICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9GQUxTRTsKLQotICAgIHN3aXRjaCggcEMtPkFzdGF0ZSApCi0gICAgewotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gUkVBRF9XUklURSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgb3V0cHV0IGF1ZGlvIENUUyAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKHJlYWQtd3JpdGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBSRUFEX1dSSVRFOiBBVSBzaXplIGdyZWF0ZXIgdGhhbiBNYXhBdVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUsIHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IGluIHJlYWQgbW9kZSAodGhlcmUgbWF5IGJlIGEgImlmKHN0YXR1cyE9UkVBRCkiIGhlcmUsCi0gICAgICAgICAgICAgICAgYnV0IGl0IGlzIHJlbW92ZWQgZm9yIG9wdGltaXphdGlvbikgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gREVDT0RFX0VOQ09ERSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VycmVudEN0cyA9IHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cEMxLCAmaVRhcmdldEN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMSk7IC8qKjwgcmVhZCBBVSB3aGVyZSB3ZSBqdW1wZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRGVjb2RlL2VuY29kZSB1cCB0byB0aGUgd2FudGVkIHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJFICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2lmKDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0pCi0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aW1lc3RhbXAgb2YgbGFzdCByZWFkIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmYXVUaW1lU3RhbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1VGltZVN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBhdWRpbyB0aW1lc3RhbXAgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA9IGF1VGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgYXVkaW8gXAotICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRFbmRBdWRpb0VmZmVjdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qIE1heSBoYXBwZW4gd2l0aCBjb3JydXB0ZWQgaW5wdXQgZmlsZXMgKHdoaWNoIGhhdmUgc3R0cyBlbnRyaWVzIG5vdAotICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIFNpbGVuY2VGcmFtZUR1cmF0aW9uKSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJaWlogYnVnIGZpeCAoZGVjb2RlLWVuY29kZSBjYXNlKToKLSAgICAgICAgICAgICAgICAqIChZZXMsIHRoZSBCenogYnVnIG1heSBhbHNvIG9jY3VyIHdoZW4gd2UgcmUtZW5jb2RlLiBJdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgKiAgb2NjdXIgYXQgdGhlIGRlY29kZSBiZWZvcmUgdGhlIGVuY29kZSwgYnV0IGF0IHRoZSBwbGF5YmFjayEpCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIGVuY29kZWQgc3RyZWFtIHdpdGggYSBzaWxlbmNlIEFVLgotICAgICAgICAgICAgICAgICogSXQgcmVtb3ZlcyBhbm5veWluZyAiQlpaWiIgYXVkaW8gZ2xpdGNoLgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBpZiB0aGVyZSBpcyBhIGJlZ2luIGN1dC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBmaXJzdCBjbGlwLgotICAgICAgICAgICAgICAgICogQmVjYXVzZSBvZiBhbm90aGVyIGJ1Z2ZpeCAoMjAwNS0wMy0yNCksIHRoZSBmaXJzdCBBVSB3cml0dGVuIG1heSBiZQotICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBvbmUgd2hpY2ggQ1RTIGlzIDIwLiBIZW5jZSB0aGUgY3RzPDIxIHRlc3QuCi0gICAgICAgICAgICAgICAgKiAodGhlIEJaWlogZWZmZWN0IG9jY3VycyBldmVuIHdpdGggdGhlIHNlY29uZCBBVSEpICovCi0gICAgICAgICAgICAgICAgaWYoICggTTRPU0FfRkFMU0UgPT0gcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuKQotICAgICAgICAgICAgICAgICAgICAmJiAoMCAhPSBwQy0+dWlDdXJyZW50Q2xpcCkgJiYgKHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICsgMSkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgYSBzaWxlbmNlIEFNUiBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmaWx0ZXJlZCBQQ00gYXVkaW8gZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IEFVICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSCArKysrIGVuY29kZSBBVSIpOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgYSBQQ00gYnVmZmVyIGZvciBldmVyeSBkZWNvZGVTdGVwIGNhbGwuKgotICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgQVUgc2l6ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhpcyBib29sZWFuIGlzIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkkgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoxMS8xMi8yMDA4IENSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWaWRlb0FydGlzdAotICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiU3RvcEF1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgYSBmZXcgQVUgYmFja3dhcmQgdG8gZGVjb2RlL2VuY29kZQotICAgICAgICAgICAgICAgICh3aXRob3V0IHdyaXRpbmcgcmVzdWx0KSBmcm9tIHRoYXQgcG9pbnQuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEID09IHBDLT5wQzEtPkFzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5wQzEtPgotICAgICAgICAgICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHMgKSAvKio8ZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLiovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJLIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJMICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk0gLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBmaXJzdCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIHNlY29uZCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGRlY29kZWQgdGhlIHNhbWUgYW1vdW50IG9mIFBDTSBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJSIDogQXVkaW9UcmFuc2l0aW9uOiBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkXAotICAgICAgICAgICAgICAgICAgICAgICAgUENNIHNpemUhIHBjMSBzaXplPTB4JXgsIHBDMiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAgb3IgZGlmZmVyZW50IGZvciBjbGlwMSBhbmQgY2xpcDIuCi0gICAgICAgICAgICAgICAgICAgICogU28gbm8gbmVlZCB0byByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlICovCi0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86ICwgcGMxIEF1ZEJ1ZmYgc2l6ZT0weCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQzIgQXVkQnVmZiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0KLSNlbmRpZiAvLyBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMxKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgYXVkaW8gZWZmZWN0IG9uIGNsaXAyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChwQywgMiwgKE00T1NBX0ludDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24ocEMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBibGVuZCBBVXMiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLQotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCx0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJQIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBzZWNvbmRhcnlFcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1Ioc2Vjb25kYXJ5RXJyb3IpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBzZWNvbmRhcnlFcnJvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IEVSUk9SIENBU0UgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX198Ki8KLQotICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCBcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5Bc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgZm9yY2VkIHRvIHN0b3AgYXVkaW8gKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBiU3RvcEF1ZGlvICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIGF1ZGlvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgIHVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOyAvKio8IFRyYW5zaXRpb24gZHVyYXRpb24gKi8KLQotICAgIGNvbnN0IE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSBwcmV2aW91c0FzdGF0ZSA9IHBDLT5Bc3RhdGU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIENsaXAxIGlzIG9uIGl0cyBiZWdpbiBjdXQsIG9yIGluIGl0cyBiZWdpbiBlZmZlY3Qgb3IgZW5kIGVmZmVjdCB6b25lICovCi0gICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAxKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIHdpdGggbmV4dCBjbGlwICovCi0gICAgaWYoICggVEQgPiAwKSAmJiAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEbyB3ZSBlbnRlciB0aGUgdHJhbnNpdGlvbiBzZWN0aW9uID8gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAhPSBwcmV2aW91c0FzdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludE9wZW5DbGlwKHBDLCAmcEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIHNob3J0IHRyYW5zaXRpb24gYW5kIGJhZCBsdWNrICguLi4pLCB0aGVyZSBtYXkgYmUgbm8gdmlkZW8gQVUKLSAgICAgICAgICAgICAgICAqIGluIHRoZSB0cmFuc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHRoZSBzZWNvbmQgY2xpcCBoYXMgbm90IGJlZW4gb3BlbmVkLgotICAgICAgICAgICAgICAgICogU28gd2UgbXVzdCB1cGRhdGUgdGhlIHZpZGVvIG9mZnNldCBoZXJlLiAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLyoqPCBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAodmlkZW8gb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gZG9pbmcgdGhlIHZpZGVvIHRyYW5zaXRpb24pICovCi0gICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCArPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgICAgICogSXQgbGVhZHMgdG8gYW4gYXVkaWJsZSBkZXN5bmNocm8gd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2YgY2xpcHMgYXNzZW1ibGVkLgotICAgICAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgICAgICogV2UgU3RlcCBvbmUgQVUgaW4gdGhlIHNlY29uZCBjbGlwIGFuZCB3ZSBjaGFuZ2UgdGhlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wQzItPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzItPmlWb2Zmc2V0ICpwQy0+cEMyLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgICAgICAgICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiWiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAtPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJlZ2luIGFuZCBlbmQgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgaWYgY3VycmVudCBtb2RlIGlzIFJlYWQvV3JpdGUgb3IgRGVjb2RlL0VuY29kZSAqLwotICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZS9kZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNBc3RhdGUpCi0gICAgICAgICYmIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgIChNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgIT0gcEMtPkFzdGF0ZSkgKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBtYXggYml0cmF0ZSBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZXMgYml0cmF0ZXMgYW5kIHRyYW5zaXRpb25zICovCi0gICAgICAgIGlmKCBwQy0+QXN0YXRlID09IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1heCBvZiB0aGUgdHdvIGJsZW5kZWQgZmlsZXMgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPiBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhbWUgYXMgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ3JlYXRlIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUNsaXBJbmRleDsKLSAgICBNNE9TQV9VSW50OCB1aUZ4SW5kZXg7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMiBCQywgRUM7Ci0gICAgTTRPU0FfSW50OCAqcGlDbGlwQWN0aXZlRWZmZWN0OwotICAgIE00T1NBX0ludDMyIHQ7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwaUNsaXBBY3RpdmVFZmZlY3QgPSAmKHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QpOwotICAgIH0KLSAgICBlbHNlIC8qKjwgKDIgPT0gdWlDbGlwTnVtYmVyKSAqLwotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcCArIDE7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAyQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNob3J0Y3V0cyBmb3IgY29kZSByZWFkYWJpbGl0eSAqLwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUKLSAgICAgUkMgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgPCByb3VuZGluZyAqLzsKLSAgICB0ID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8vKi0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyovCi0gICAgICAgICsgMC41KTsgLyoqPCByb3VuZGluZyAqLwotICAgIDsKLQotICAgIC8qKgotICAgICogRGVmYXVsdDogbm8gZWZmZWN0IGFjdGl2ZSAqLwotICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSAtMTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLSAgICAvLyBSQyAgICBmb3IgKHVpRnhJbmRleD0wOyB1aUZ4SW5kZXg8cEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyB1aUZ4SW5kZXgrKykKLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMKLSAgICAgICAgKCBFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLSAgICAgICAgICAgIGlmKCAoIHQgPj0gKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICYmIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/ICovCi0gICAgICAgICAgICAgICAgKHQgPCAoTTRPU0FfSW50MzIpKC8qQkMgKyovcEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+Ci0gICAgICAgICAgICAgICAgdWlEdXJhdGlvbikpICkgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgKnBpQ2xpcEFjdGl2ZUVmZmVjdCA9IHBDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwKLSAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHRoaXJzIG9uZS4KLSAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotICAgICAgICAgICAgICAgIHVpRnhJbmRleCA9IHBDLT5uYkVmZmVjdHM7IC8qKiBnZXQgb3V0IG9mIHRoZSBmb3IgbG9vcCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogVGhlIGR1cmF0aW9uIG9mIHRoZSBlbmQgZWZmZWN0IGhhcyBiZWVuIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VkIGNsaXAgZHVyYXRpb24uCi0gICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0Ci0gICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcDFvckNsaXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMgotICAgICAgICBpMzJzYW1wbGU7IC8qKjwgd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGlQb3M7Ci0gICAgTTRPU0FfSW50MzIgaUR1cjsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoIDEgIT0gdWlDbGlwMW9yQ2xpcDIpICYmICgyICE9IHVpQ2xpcDFvckNsaXAyKSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludEJlZ2luQXVkaW9FZmZlY3Q6IHVpQ2xpcDFvckNsaXAyIGludmFsaWQiKTsKLQotICAgIGlmKCAxID09IHVpQ2xpcDFvckNsaXAyICkKLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+Ci0gICAgICAgICAgICB1aUN1cnJlbnRDbGlwXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAxQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAxQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0gICAgZWxzZSAvKio8IGlmICgyPT11aUNsaXAxb3JDbGlwMikgKi8KLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgKyAxXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAyQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAyQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBpRHVyID0gKE00T1NBX0ludDMyKXBGeC0+dWlEdXJhdGlvbjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zID0KLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKyAwLjUgLSBwQ2xpcC0+aUFvZmZzZXQgLyBwQ2xpcC0+c2NhbGVfYXVkaW8pCi0gICAgICAgIC0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0IC0gcEZ4LT51aVN0YXJ0VGltZTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MgPiBpRHVyICkKLSAgICB7Ci0gICAgICAgIGlQb3MgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zIDwgMCApCi0gICAgewotICAgICAgICBpUG9zID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF0IHRoaXMgcG9pbnQsIGlQb3MgaXMgdGhlIGVmZmVjdCBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZSAqLwotICAgIHN3aXRjaCggcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvcyA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgKj0gaVBvczsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgLz0gaUR1cjsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHN3aXRjaCBmcm9tIDAtPkR1ciB0byBEdXItPjAgaW4gb3JkZXIgdG8gZG8gZmFkZU9VVCBpbnN0ZWFkIG9mIGZhZGVJTiAqLwotICAgICAgICAgICAgaVBvcyA9IGlEdXIgLSBpUG9zOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzLCBhcHBseSB0aGUgZmFkZSBmYWN0b3Igb24gZWFjaCAqLwotICAgICAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApIC8qKjwgZGVjcmVtZW50aW5nIGNvdW50ZXIgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0OiB1bmtub3duIGF1ZGlvIGVmZmVjdCB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgcEZ4LT5BdWRpb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdHJhbnNpdGlvbiBlZmZlY3QgdG8gdHdvIFBDTSBidWZmZXIKLSAqIEBub3RlICAgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zaXRpb24gaXMgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gKiAgICAgICAgICBJIGtub3cgaXQncyBub3QgYmVhdXRpZnVsLCBidXQgaXQgZml0cyBteSBjdXJyZW50IG5lZWRzLCBhbmQgaXQncyBlZmZpY2llbnQhCi0gKiAgICAgICAgICBTbyB3aHkgYm90aGVyIHdpdGggYSB0aGlyZCBvdXRwdXQgYnVmZmVyPwotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YTEgICAgKElOL09VVCkgRmlyc3QgaW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHBQQ01kYXRhMiAgICAoSU4pIFNlY29uZCBpbnB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pIFNpemUgb2YgYm90aCBQQ00gYnVmZmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX0ludDE2ICpwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGUxLAotICAgICAgICBpMzJzYW1wbGUyOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zMSwgaVBvczI7Ci0gICAgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zMSA9IHBDLT5wQzEtPmlFbmRUaW1lIC0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8KLSAgICAgICAgKyAwLjUgLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvKTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MxID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zMSA9IGlEdXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQb3MxIDwgMCApCi0gICAgewotICAgICAgICBpUG9zMSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQb3NpdGlvbiBvZiBzZWNvbmQgY2xpcCBpbiB0aGUgdHJhbnNpdGlvbiAqLwotICAgIGlQb3MyID0gaUR1ciAtIGlQb3MxOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zMiBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZS4KLSAgICAqIGlQb3MxIGlzIHRoZSB0cmFuc2l0aW9uIHByb2dyZXNzLCBpbiBhIGlEVXIgdG8gMCBiYXNlLiAqLwotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uQXVkaW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvczEgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgICAgIGlQb3MyID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSA9ICpwUENNZGF0YTE7IC8qKjwgR2V0IGNsaXAxIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgKj0gaVBvczE7ICAgICAvKio8IG11bHRpcGx5IGJ5IGZhZGUgbnVtZXJhdG9yICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSAvPSBpRHVyOyAgICAgIC8qKjwgZGl2aWRlIGJ5IGZhZGUgZGVub21pbmF0b3IgKi8KLQotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgPSAqcFBDTWRhdGEyOyAvKio8IEdldCBjbGlwMiBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyICo9IGlQb3MyOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExKysgPSAoTTRPU0FfSW50MTYpKGkzMnNhbXBsZTEKLSAgICAgICAgICAgICAgICAgICAgKyBpMzJzYW1wbGUyKTsgLyoqPCBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgcFBDTWRhdGEyKys7IC8qKjwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgc2Vjb25kIGJ1ZmZlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZToKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGlzIGlzIGEgc3R1cGlkLW5vbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTm9uZSB0cmFuc2l0aW9uLi4uCi0gICAgICAgICAgICAqIFdlIGNvcHkgdGhlIFBDTSBmcmFtZXMgKi8KLSAgICAgICAgICAgIGlmKCBpUG9zMSA8IChpRHVyID4+IDEpICkgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSAgICAgICAgICAgICogRm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBub24tdHJhbnNpdGlvbiBpdCdzIGFscmVhZHkgdGhlIGNhc2UhCi0gICAgICAgICAgICAqIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLi4uCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHVua25vd24gdHJhbnNpdGlvbiB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogSWYgYW4gZW5jb2RlciBhbHJlYWR5IGV4aXN0LCB3ZSBkZXN0cm95IGl0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENfZXdjLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQ19ld2MtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgZW5jb2RlciAgKi8KLSAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tFVlJDOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BbXJTSUQgPSBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSAocENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgICAgICAgICA/IE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBRdWFudGlmeSB2YWx1ZSAoY2VpbCBvbmUpICovCi0gICAgICAgICAgICBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDE2MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAyNDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDMyMDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNDgwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDQ4MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSA2NDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gNjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA5NjAwMDsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCByZXF1aXJlbWVudCBvZiBvdXIgZW5jb2RlciAqLwotICAgICAgICAgICAgaWYoICggcENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAmJiAocENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlIDwgMzIwMDApICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjpcCi0gICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCBjYWxsZWQgd2l0aCB1c2VyZGF0YSAweCV4IiwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0jZWxzZQotCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIEhXIGVuY29kZXIgKi8pOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLCAmcENfZXdjLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ZjQxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0VmlkZW8uYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLypmb3IgdHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQgKTsKLQotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlciggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDdHMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHBsYW5lKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8oTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaUN0cywgaU5leHRDdHM7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lOwotICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQuIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKiB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgKi8KLSAgICBpZiAoICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0Ci0gICAgICAgICsgcEMtPmlJbk91dFRpbWVPZmZzZXQpID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qIFJlLWFkanVzdCB2aWRlbyB0byBwcmVjaXNlIGN1dCB0aW1lICovCi0gICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpKQotICAgICAgICAgICAgLSBwQy0+cEMxLT5pVm9mZnNldCArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IC0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0gICAgICAgIGlmICggcEMtPmlJbk91dFRpbWVPZmZzZXQgPCAwICkgewotICAgICAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhwQyk7Ci0KLSAgICAgICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHN0YXRlcyBpZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpICovCi0gICAgaWYgKCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAmJiAoKCBwQy0+cEMyID09IE00T1NBX05VTEwpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBNb2RlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgb3V0cHV0IENUUyAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Wc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3dpdGNoKCBwQy0+VnN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgIC8qfCBSRUFEX1dSSVRFIE1PREUgfCovCi0gICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBkZWNvZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGUgZ29vZCBwb3NpdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgIT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBKdW1wIHRvIHRhcmdldCB2aWRlbyB0aW1lICh0YyA9IHRvLVQpICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBpQ3RzID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RKdW1wKFYxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+VmlkZW9BVS5tX0NUUyA9PSBpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPj0gaUN0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICsgcEMtPnBDMS0+aVZvZmZzZXQgPD0gcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG8gY29tcGVuc2F0ZSByZWFkZXIgaW1wcmVjaXNpb24gKG1fQ1RTIGlzIGFjdHVhbGx5IGFuIGludGVnZXIpCi0gICAgICAgICAgICAgICAgaUN0cyA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQgLSAxOwotICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gaUN0cyArICgoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKSArIDE7Ci0gICAgICAgICAgICAgICAgLyogQXZvaWQgdG8gd3JpdGUgYSBsYXN0IGZyYW1lIG9mIGR1cmF0aW9uIDAgKi8KLSAgICAgICAgICAgICAgICBpZiggaU5leHRDdHMgPiBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZSBBVSBpcyBnb29kIHRvIGJlIHdyaXR0ZW4sIHdyaXRlIGl0LCBlbHNlIGp1c3Qgc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IGJTa2lwRnJhbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICgoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaUN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPCBpTmV4dEN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9zaXplID4gMCkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPnBDMS0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9IChNNE9TQV9UaW1lKXBDLT5wQzEtPlZpZGVvQVUubV9DVFMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEF1U2l6ZSAoJWQ+JWQpISByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSB0aW1lIGluZm8gZm9yIHRoZSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXQKLSAgICAgICAgICAgICAgICAgICAgLXN0cmVhbSB0aW1lKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkIgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCBuZXh0IEFVIGZvciBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5wQzEtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdldGhlciB0byByZWFkIG9yIHRvIGluY3JlbWVudCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaU5leHRDdHMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kIChOT19NT1JFX0FVIG9yIHJlYWRlciBpbiBhZHZhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIChmcm9tIEFGVEVSX0NVVCkgdG8gbm9ybWFsIG1vZGUgYmVjYXVzZSB0aW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIG90aGVyIGNhc2VzIChyZWFkZXIgbGF0ZSksIGp1c3QgbGV0IHRoZSByZWFkZXIgY2F0Y2ggdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRWVG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBERUNPREVfRU5DT0RFIE1PREUgfCovCi0gICAgICAgICAgICAvKnwgICBCRUdJTl9DVVQgTU9ERSAgIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIERFQ09ERV9FTkNPREUgLyBCRUdJTl9DVVQiKTsKLQotICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMxKTsKLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAod2lsbCBqdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgaWYgbmVlZGVkICkgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzEsIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHZpZGVvIHByZS1wcm9jZXNzaW5nIGVycm9yIGJlZm9yZSBjYWxsaW5nIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSArKysrIGVuY29kZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIGZyYW1lKHJlbmRlcmluZyxmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzKSovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgKQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa0lGcmFtZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEZyYW1lTW9kZSA9IE00RU5DT0RFUl9rTm9ybWFsRnJhbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzLCBGcmFtZU1vZGUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgaGFkIGEgVlBQIGVycm9yLi4uICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIC8qKjwgLi4ub3IgYW4gZW5jb2RlciBlcnJvciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoZm9yIGJlZ2luIGN1dCwgZG8gbm90IGluY3JlbWVudCB0byBub3QKLSAgICAgICAgICAgICAgICBsb29zZSBQLWZyYW1lcykgKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHBDLT5Wc3RhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlY29kZVZpZGVvVXBUb0N0cyhDMSkgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERvbid0IGRlY29kZSBtb3JlIHRoYW4gbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYoICEoKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIGNsaXAyIHZpZGVvIHVwIHRvIHRoZSB0YXJnZXQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMyLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggZXJyPSV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzIpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkYgKioqKiBibGVuZCBBVXMiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZSAocmVuZGVyaW5nLCBmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgaW4gZW5jb2RlciBjYWxsYmFja3MgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIGVuY29kZSByZXR1cm5zIGEgcHJvY2VzcyBmcmFtZSBlcnJvciwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgVlBQIGVycm9yICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDLT5ld2MuVnBwRXJyb3I7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gcHJvY2VzcyBtb2RlIHdlIG11c3QgdXNlLCBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBDVFMuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgY29uc3QgTTRPU0FfSW50MzIgIHQgPSAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0gICAgY29uc3QgTTRPU0FfSW50MzIgVEQgPSBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIE00T1NBX0ludDMyIGlUbXA7Ci0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgcHJldmlvdXNWc3RhdGUgPSBwQy0+VnN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBhbiBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKCggdCAtIHBDLT5wQzEtPmlWb2Zmc2V0KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9lZGl0T3BlbkNsaXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgb2Zmc2V0Ci0gICAgICAgICAgICAqIChhdWRpbyBvdXRwdXQgQ1RTIGlzIG5vdCB5ZXQgYXQgdGhlIHRyYW5zaXRpb24sIHNvIGF1ZGlvCi0gICAgICAgICAgICAqICBvZmZzZXQgY2FuJ3QgYmUgdXBkYXRlZCB5ZXQpLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAyMDA1LTAzLTI0OiBCdWdGaXggZm9yIGF1ZGlvLXZpZGVvIHN5bmNocm86Ci0gICAgICAgICAgICAqIFVwZGF0ZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGR1ZSB0byB0aGUgYWN0dWFsIHZpZGVvIHRyYW5zaXRpb24gYmVnaW5uaW5nIHRpbWUuCi0gICAgICAgICAgICAqIEl0IHdpbGwgYXZvaWQgZGVzeW5jaHJvbml6YXRpb24gd2hlbiBkb2luZyB0aGUgYXVkaW8gdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIGlUbXAgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKVwKLSAgICAgICAgICAgICAtIChwQy0+cEMxLT5pRW5kVGltZSAtIFREICsgcEMtPnBDMS0+aVZvZmZzZXQpOwotICAgICAgICAgICAgaWYgKGlUbXAgPCAoTTRPU0FfSW50MzIpcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24pCi0gICAgICAgICAgICAvKio8IFRlc3QgaW4gY2FzZSBvZiBhIHZlcnkgc2hvcnQgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtPSBpVG1wOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEb24ndCBmb3JnZXQgdG8gYWxzbyBjb3JyZWN0IHRoZSB0b3RhbCBkdXJhdGlvbiB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgKiAoaXQgd2FzIGNvbXB1dGVkIHdpdGggdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gZHVyYXRpb24pLiAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9IGlUbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IE5vICJlbHNlIiBoZXJlIGJlY2F1c2UgaXQncyBoYXJkIHByZWRpY3QgdGhlIGVmZmVjdCBvZiAwIGR1cmF0aW9uIHRyYW5zaXRpb24uLi4qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZWZmZWN0IHdlIGdvIHRvIGRlY29kZS9lbmNvZGUgbW9kZSAqLwotICAgICAgICBpZigocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHx8IChwQy0+bmJBY3RpdmVFZmZlY3RzMSA+IDApIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgfHwKLSAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIGRvIGEgYmVnaW4gY3V0LCBleGNlcHQgaWYgYWxyZWFkeSBkb25lICh0aW1lIGlzIG5vdCBwcm9ncmVzc2luZyBiZWNhdXNlIHdlIHdhbnQKLSAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCi0gICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEVsc2Ugd2UgYXJlIGluIGRlZmF1bHQgY29weS9wYXN0ZSBtb2RlICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZW5jb2RlIHRoZSB2aWRlbyB0byBkb3duZ3JhZGUgdGhlIGJpdHJhdGUgb3Igbm90ID8gKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBjb21wdXRlIHRoZSBjaXJyZW50IGJpdHJhdGUgb2YgdGhlIGN1cnJlbnQgZWRpdGVkIGNsaXAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmY3VycmVudEJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgbmV4dCBiaXRyYXRlIG9mIGVkaXRlZCBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBjdXJyZW50Qml0cmF0ZSAtPSAxMjIwMDsKLQotICAgICAgICAgICAgICAgIC8qIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiggY3VycmVudEJpdHJhdGUgPiBwQy0+dWlNTVNWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCEoKHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID09IE00T1NBX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlCi0gICAgICAgICAgICAgICAgICogSWYgYW4gZXh0ZXJuYWwgZWZmZWN0IGhhcyBiZWVuIGFwcGxpZWQgb24gdGhlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgICAgICAqIHRoZW4gY29udGludWUgdG8gYmUgaW4gZGVjb2RlL2VuY29kZSBtb2RlIHRpbGwgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogY2xpcCB0byBhdm9pZCBILjI2NCBkaXN0b3J0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVAotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwQy0+VnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciwgaWYgbm90IGNyZWF0ZWQgYWxyZWFkeSovCi0gICAgICAgIGlmIChwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9PSBNNFZTUzNHUFBfa05vRW5jb2RlcikgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+YklzTU1TID09IE00T1NBX1RSVUUgJiYgcEMtPmV3Yy5wRW5jQ29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBXaGVuIHdlIGdvIGZyb20gZmlsdGVyaW5nIHRvIHJlYWQvd3JpdGUsIHdlIG11c3QgYWN0IGxpa2UgYSBiZWdpbiBjdXQsCi0gICAgKiBiZWNhdXNlIHRoZSBsYXN0IGZpbHRlcmVkIGltYWdlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAocEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKSApCi0gICAgewotICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBkZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBlbHNlIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpTWF4QXVTaXplOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdGFydEFVOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFN0YXJ0QVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIEdpdmVuIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIFZTUzNHUFAgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBGaXggdGhlIGVuY29kZWQgQVUgdGltZSAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gcEFVLT5DVFM7Ci0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0LXN0cmVhbSB0aW1lICovCi0gICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCBwQVUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgdHM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwTGFzdERlY29kZWRGcmFtZSA9IE00T1NBX05VTEwgOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjb2RlclJlbmRlckZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcDFbM10scFRlbXAyWzNdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wUGxhbmVDbGlwMVszXSxwVGVtcFBsYW5lQ2xpcDJbM107Ci0gICAgTTRPU0FfVUludDMyICBpID0gMCwgeXV2RnJhbWVXaWR0aCA9IDAsIHl1dkZyYW1lSGVpZ2h0ID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAvKioKLSAgICAqIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBQbGFuZUNsaXAxLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMiwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgVlBQIGVycm9yIHJlbWVtYmVyZWQgaW4gY29udGV4dCAqLwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBlZGl0aW5nLCB3ZSBtYXkgYmUgY2FsbGVkIHdoZW4gbm8gbW9yZSBjbGlwIGlzIGxvYWRlZC4KLSAgICAqIChiZWNhdXNlIHRvIGNsb3NlIHRoZSBlbmNvZGVyIHByb3Blcmx5IGl0IG11c3QgYmUgc3RlcHBlZCBvbmUgb3IgdHdpY2UuLi4pICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAqIGVuY29kaW5nIG5vaXNlIGxlYWRzIHRvIGEgaHVnZSB2aWRlbyBBVSwgYW5kIHRodXMgYSB3cml0ZXIgYnVmZmVyIG92ZXJmbG93LiAqLwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYWJvcnQpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKioqKioqKioqKioqKiogVHJhbnNpdGlvbiBjYXNlICoqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJUcmFuc2l0aW9uRWZmZWN0ICkKLSAgICB7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMSkgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCgyKSByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYxLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYzLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcDEgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAxICovCi0gICAgICAgIGlmKCBwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QocEMsIHBDLT5wQzEsIHRzLCBNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAxLCBwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzEtPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAyIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzItPmlWb2Zmc2V0OwotICAgICAgICAvKioKLSAgICAgICAgKiBSZW5kZXIgQ2xpcDIgKi8KLSAgICAgICAgaWYoIHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMyLCB0cywgTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDIsIHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJyKSAmJgotICAgICAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gZXJyKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgKiBlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgocEMtPnBDMi0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgPT0gZXJyKSkgewotICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgaWYgKHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLQotICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKHBDLCBwVG1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIE5vIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiBOTyB0cmFuc2l0aW9uIGNhc2UiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyICovCi0gICAgICAgIGlmIChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJlbmRlcmR1cCBmYWxzZSIpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICAgQ2hlY2sgaWYgcmVzaXppbmcgaXMgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RSZW5kZXIoKSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdW4tcm90YXRlZCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZQotICAgICAgICAgICAgICAgICAgICAqIGltYWdlIHBsYW5lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLCBwVGVtcDEsIGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKSBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwVGVtcDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgaXMgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciByZXNpemUgZnJhbWUgcGxhbmUKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzICYmCi0gICAgICAgICAgICAgICAgICAgIDE4MCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gcmVzaXplIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSB3ZSBkbyBub3Qgc2tpcCB0aGUgb3ZlcmxheSBlZmZlY3Qgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICogb3ZlcmxheSBhbmQgdmlkZW8gZnJhbWUgYXJlIGJvdGggb2Ygc2FtZSByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBQbGFuZU91dCxiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgICAgICBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgdHJ1ZSIpOwotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUscFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogUHJlcGFyZSBvdmVybGF5IHRlbXBvcmFyeSBidWZmZXIgaWYgb3ZlcmxheSBleGlzdCAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcDIsIHBDLT5ld2MudWlWaWRlb1dpZHRoLCBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVswXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsxXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzFdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsyXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUsIHBUbXAsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFZQUDogUmVuZGVyZWQgYXQgQ1RTICUuM2YiLCB0cyk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSgpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gb3ZlcmxheSBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgIChJTikgSW5wdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZXMgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNE9TQV9Eb3VibGUgVmlkZW9FZmZlY3RUaW1lOwotICAgIE00T1NBX0RvdWJsZSBQZXJjZW50YWdlRG9uZTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uIC0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IG9ubHksCi0gICAgICAgICAqIHNraXAgb3RoZXIgY29sb3IgZWZmZWN0IHdoaWNoIGhhZCBiZWVuIGFwcGxpZWQgKi8KLSAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoCi0gICAgICAgICAqIG9uIHRoZSBsYXN0IGZyYW1lIHdoaWNoIGlzIHByZXNlbnRlZCBmcm9tIENUUyA9IGVvZi10aW1lSW5jcmVtZW50IHRpbGwgQ1RTID0gZW9mICovCi0gICAgICAgIFBlcmNlbnRhZ2VEb25lID0gVmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24pOwotCi0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA8IDAuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBlcmNlbnRhZ2VEb25lID4gMS4wKSB7Ci0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgaWYgKG5leHRFZmZlY3RUaW1lID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgcFBsYW5lSW4sIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiBcCi0gICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIGVmZmVjdCBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICB1aUNsaXAxb3JDbGlwMiAgICAoSU4vT1VUKSAxIGZvciBmaXJzdCBjbGlwLCAyIGZvciBzZWNvbmQgY2xpcAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgYlNraXBGcmFtaW5nRWZmZWN0IChJTikgc2tpcCBmcmFtaW5nIGVmZmVjdCBmbGFnCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpIHsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotCi0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfSW50MzIgdG1wOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lVGVtcE91dDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgcFRlbXBZdXZQbGFuZVszXTsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IE51bUFjdGl2ZUVmZmVjdHMgPTA7Ci0KLQotICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBZdXZQbGFuZSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGVtcG9yYXJ5IHBsYW5lIGlmIG5lZWRlZCBSQyAqLwotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzID4gMSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXBZdXZQbGFuZSwgcFBsYW5lT3V0LT51X3dpZHRoLAotICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LT51X2hlaWdodCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVJbjsKLSAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotCi0KLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbi0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyogVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50IGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUqLwotICAgICAgICAvKiB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZQotICAgICAgICAgICAgLyAoKE00T1NBX0Zsb2F0KXBGeC0+dWlEdXJhdGlvbi8qLSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24qLyk7Ci0KLSAgICAgICAgaWYoIFBlcmNlbnRhZ2VEb25lIDwgMC4wICkKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA+IDEuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotICAgICAgICBzd2l0Y2goIHBGeC0+VmlkZW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkuICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSgoIDEuMCAtIFBlcmNlbnRhZ2VEb25lKSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiggcEZ4LT5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMDApICovCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHByb2dyZXNzIGluZm8gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDbGlwLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0VGltZSA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZihuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgZnJhbWluZyBlZmZlY3QgYWZ0ZXIgYXBwbHkgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFswXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblswXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzFdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzFdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMl0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMl0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMl0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJbiwgcFBsYW5lVGVtcE91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogdW5rbm93biBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJDIFVwZGF0ZXMgcFRlbXBQbGFuZUluIGFuZCBwVGVtcFBsYW5lT3V0IGRlcGVuZGluZyBvbiBjdXJyZW50IGVmZmVjdCAqLwotICAgICAgICBpZiAoKChpICUgMiA9PSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAgJSAyID09IDApKQotICAgICAgICAgICAgfHwgKChpICUgMiAhPSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAlIDIgIT0gMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgaWYocFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gdHJhbnNpdGlvbiBlZmZlY3QgcEMxK3BDMi0+cFBsYW5lT3V0Ci0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlQcm9ncmVzczsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgY29uc3QgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pRW5kVGltZSkgLSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArCi0gICAgICAgICgoTTRPU0FfRG91YmxlKXBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAvKioKLSAgICAqIFdlIG11c3QgcmVtb3ZlIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUsIGVsc2Ugd2Ugd291bGQgYWxtb3N0IG5ldmVyIHJlYWNoIHRoZSBlbmQKLSAgICAqIChJdCdzIGtpbmQgb2YgYSAicGlsZSBhbmQgaW50ZXJ2YWxzIiBpc3N1ZSkuICovCi0gICAgaVByb2dyZXNzIC09IChNNE9TQV9JbnQzMilwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICBpZiggaVByb2dyZXNzIDwgMCApIC8qKjwgU2FuaXR5IGNoZWNrcyAqLwotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uLCBvbiBhIGJhc2UgMTAwMCAqLwotICAgIGlQcm9ncmVzcyA9ICggKCBpRHVyIC0gaVByb2dyZXNzKSAqIDEwMDApIC8gaUR1cjsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmKCBpUHJvZ3Jlc3MgPCAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQcm9ncmVzcyA+IDEwMDAgKQotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlRyYW5zaXRpb25CZWhhdmlvdXIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gMTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyOgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KGlQcm9ncmVzcyAqIDEwMDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiA1MDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKCggKCAoIGlQcm9ncmVzcyAtIDUwMCkgKiAoaVByb2dyZXNzIC0gNTAwKSkKLSAgICAgICAgICAgICAgICAgICAgLyA1MDApICsgNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoKCBpUHJvZ3Jlc3MgLSA1MDApICogNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXBwbHkgdGhlIHRyYW5zaXRpb24gZWZmZWN0ICovCi0gICAgICAgICAgICBlcnIgPSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djEsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djIsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lT3V0LCBpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBZVVYgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKSAvKio8IGZpcnN0IGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IHNlY29uZCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBZVVYgZnJhbWVzICovCi0gICAgICAgICAgICBpID0gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKWlQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLkV4dFZpZGVvVHJhbnNpdGlvbkZjdCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+eXV2MSwgcEMtPnl1djIsIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAtIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCB2aWRlbyB0cmFuc2l0aW9uIGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oKQotICogQGJyaWVmICAgIFVwZGF0ZSBiaXQgc3RyZWFtIHRpbWUgaW5mbyBieSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGNvbXBsaWFudCB3aXRoCi0gKiAgICAgICAgICBwbGF5ZXJzIHVzaW5nIGJpdCBzdHJlYW0gdGltZSBpbmZvCi0gKiBAbm90ZSAgICBIMjYzIHVzZXMgYW4gYWJzb2x1dGUgdGltZSBjb3VudGVyIHVubGlrZSBNUEVHNCB3aGljaCB1c2VzIEdyb3VwIE9mIFZvcHMKLSAqICAgICAgICAgIChHT1YsIHNlZSB0aGUgc3RhbmRhcmQpCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgcmV0dXJucyB0aW1lIHVwZGF0ZWQgdmlkZW8gQVUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9mZnNldCBiZXR3ZWVuIHN5c3RlbSBhbmQgdmlkZW8gdGltZSAoTVBFRzQgb25seSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGNsaXAgKE1QRUc0IG9ubHkpCi0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApCi17Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzID0gMDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUFkZDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdXJyR292OwotICAgIE00T1NBX0ludDggaURpZmY7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCA9IHBDLT5wQzE7Ci0gICAgTTRPU0FfSW50MzIgKnBPZmZzZXQgPSAmKHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogU2V0IEgyNjMgdGltZSBjb3VudGVyIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEFVLT5zdHJlYW0tPnN0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKChNNE9TQV9VSW50MzIpKCAoIHBBVS0+Q1RTICogMzApIC8gMTAwMSArIDAuNSkKLSAgICAgICAgICAgICUgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSk7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzKSwKLSAgICAgICAgICAgIHVpVG1wKTsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNldCBNUEVHNCBHT1YgdGltZSBjb3VudGVyIHJlZ2FyZGluZyB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBlbHNlIGlmKCBNNFNZU19rTVBFR180ID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgR09WLgotICAgICAgICAqIGJld2FyZSBvZiBsaXR0bGUvYmlnIGVuZGlhbiEgKi8KLSAgICAgICAgLyogY29ycmVjdGlvbjogcmVhZCA4IGJpdHMgYmxvY2sgaW5zdGVhZCBvZiBvbmUgMzIgYml0cyBibG9jayAqLwotICAgICAgICBNNE9TQV9VSW50OCAqdGVtcDggPSAoTTRPU0FfVUludDggKikocEFVLT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wMzIgPSAwOwotCi0gICAgICAgIHRlbXAzMiA9ICggMHgwMDAwMDBmZiAmIChNNE9TQV9VSW50MzIpKCp0ZW1wOCkpCi0gICAgICAgICAgICArICgweDAwMDBmZjAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAxKSkpIDw8IDgpCi0gICAgICAgICAgICArICgweDAwZmYwMDAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAyKSkpIDw8IDE2KQotICAgICAgICAgICAgKyAoMHhmZjAwMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMykpKSA8PCAyNCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIlJDOiBUZW1wMzI6IDB4JXgsIGRhdGFBZGRyZXNzOiAweCV4XG4iLCB0ZW1wMzIsCi0gICAgICAgICAgICAqKHBBVS0+ZGF0YUFkZHJlc3MpKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiA9PSB0ZW1wMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBVS0+ZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICArIDEpOyAvKio8IEp1bXAgdG8gdGhlIHRpbWUgY29kZSAoanVzdCBhZnRlciB0aGUgMzIgYml0cyBoZWFkZXIpICovCi0gICAgICAgICAgICB1aUFkZCA9IChNNE9TQV9VSW50MzIpKHBBVS0+Q1RTKSsoICpwT2Zmc2V0KTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX0ZBTFNFOiAvKjwgSU5JVCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyB0aW1lID0gY2VpbCAoc3lzdGVtIHRpbWUgKyBvZmZzZXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyA9ICggdWlBZGQgKyA5OTkpIC8gMTAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHVwZGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0ZSB0byAnZmlyc3QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0FfVFJVRTogLyo8IFVQREFURSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCBHb3YgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdihwVG1wLCAmdWlDdXJyR292KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGZsb29yIG9yIGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAodWlBZGQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmID0gKE00T1NBX0ludDgpKHVpQ3VyckdvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0IC0gdWlDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlaWxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpRGlmZiA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzICs9IChNNE9TQV9VSW50MzIpKGlEaWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICpwT2Zmc2V0KSArPSAoKCB1aUN0cyAqIDEwMDApIC0gdWlBZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0ID0gdWlDdXJyR292OwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlU2V0ID0gdWlDdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdihwVG1wLCB1aUN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCB2aWRlbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4LCBpOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgT2ZmLCBCQywgRUM7Ci0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBNNE9TQV9JbnQzMiB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICBpZiAodWlDbGlwTnVtYmVyID09IDEpIHsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBPZmYgPSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgQkMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgRUMgPSBwQ2xpcC0+aUVuZFRpbWU7Ci0KLSAgICBpID0gMDsKLQotICAgIGZvciAoIHVpRnhJbmRleCA9IDA7IHVpRnhJbmRleCA8IHBDLT5uYkVmZmVjdHM7IHVpRnhJbmRleCsrICkKLSAgICB7Ci0gICAgICAgIC8qKiBTaG9ydGN1dCwgcmV2ZXJzZSBvcmRlciBiZWNhdXNlIG9mIHByaW9yaXR5IGJldHdlZW4gZWZmZWN0cyhFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkqLwotICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPm5iRWZmZWN0cyAtIDEgLSB1aUZ4SW5kZXhdKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAhPSBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHZpZGVvIGVmZmVjdCAqLwotCi0gICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8KLSAgICAgICAgICAgICAgICAgKiBvciBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggKHQgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHQgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRm9yIGFsbCBleHRlcm5hbCBlZmZlY3RzIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZ4LT5WaWRlb0VmZmVjdFR5cGUgPiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgICAgIGlmICggKChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA8PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdChzKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTXBlZzQgYW5kIEgyNjMgY2xpcHMsIGZ1bGwgZGVjb2RlIGVuY29kZSBub3QgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigxPT11aUNsaXBOdW1iZXIpCi0gICAgewotICAgIC8qKgotICAgICAqIFNhdmUgbnVtYmVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGFuZ2UgdGhlIGFic29sdXQgdGltZSB0byBjbGlwIHJlbGF0ZWQgdGltZSAqLwotICAgIHQgLT0gT2ZmOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGJlZ2luIGN1dCAoZm9yIGNsaXAxIG9ubHkpICovCi0gICAgaWYoICggMCAhPSBCQykgJiYgKHQgPT0gQkMpICYmICgxID09IHVpQ2xpcE51bWJlcikgKQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLQotICAgIGlmKCBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgICAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgICAgICAvKiBBbHNvIGl0IHByZXZlbnRzIHRvIGRyb3AgaW1wb3J0YW50IGZyYW1lcyAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZAotICAgICAgICBibG9jayBlZmZldGNzKSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAvLyBWYXJpYWJsZSBmcmFtZXJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTdGFnZUZyaWdodCBlbmNvZGVycwotICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEluIGNhc2Ugb2YgTU1TIG1vZGUsIHdlIG5lZWQgdG8gZW5hYmxlIGJpdHJhdGUgcmVndWxhdGlvbiB0byBiZSBzdXJlICovCi0gICAgICAgIC8qIHRvIHJlYWNoIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5NTVN2aWRlb0ZyYW1lcmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgc3dpdGNoICggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gKE00T1NBX1VJbnQ4KSgoIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICogcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSAvIDEwMDAuMCArIDAuNSk7Ci0KLSAgICAgICAgICAgIGlmKCBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID09IDAgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IE00U1lTX0gyNjQiKTsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLy9FbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazVfRlBTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aU1NU1ZpZGVvQml0cmF0ZTsgLyogUkMgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMDsgLyogV2UgbGV0IHRoZSBlbmNvZGVyIGNob29zZSB0aGUgdGltZXNjYWxlICovCi0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0SW5pdCIpOwotICAgIC8qKgotICAgICogSW5pdCB0aGUgdmlkZW8gZW5jb2RlciAoYWR2YW5jZWQgc2V0dGluZ3MgdmVyc2lvbiBvZiB0aGUgZW5jb2RlciBPcGVuIGZ1bmN0aW9uKSAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UsIE00VlNTM0dQUF9pbnRWUFAsIHBDLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgewotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgICAgICAvKioKLSAgICAgICAgKiBSZXNldCB2YXJpYWJsZSAqLwotICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlcigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGNvdW50ZXIgb2YgdGhlIGdpdmVuIEgyNjMgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4vT1VUKSBIMjYzIFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzICAgICAgICAgICAgKElOKSAgICAgTmV3IHRpbWUgY291bnRlciB2YWx1ZQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICkKLXsKLSAgICAvKgotICAgICogIFRoZSBIMjYzIHRpbWUgY291bnRlciBpcyA4IGJpdHMgbG9jYXRlZCBvbiB0aGUgIngiIGJlbG93OgotICAgICoKLSAgICAqICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAotICAgICogICAgPz8/Pz8/Pz8gPz8/Pz8/Pz8gPz8/Pz8/eHggeHh4eHh4Pz8KLSAgICAqLwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBiaXRzIG9uIHRoZSB0aGlyZCBieXRlICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4RkMpIHwgKCggdWlDdHMgPj4gNikgJiAweDMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgNiBiaXRzIG9uIHRoZSBmb3VydGggYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbM10gPSAoICggdWlDdHMgPDwgMikgJiAweEZDKSB8IChwQXVEYXRhQnVmZmVyWzNdICYgMHgzKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzU2VjICAgICAgICAgICAgKElOKSAgICAgTmV3IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSAyIGxhc3QgYml0cyBzcyAqLwotICAgIHVpU3MgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjICUgNjApOyAvKio8IG1vZHVsbyBwYXJ0ICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICgoICggdWlTcyAmIDB4MDMpIDw8IDYpIHwgKHBBdURhdGFCdWZmZXJbMl0gJiAweDNGKSk7Ci0KLSAgICBpZiggdWlDdHNTZWMgPCA2MCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCAweDEwKSB8ICh1aVNzID4+IDIpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIHRoZSAzIGxhc3QgYml0cyBvZiBtbSwgdGhlIG1hcmtlciBiaXQgKDB4MTAgKi8KLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjIC8gNjApOyAvKio8IGludGVnZXIgcGFydCAqLwotICAgICAgICB1aU1tID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAlIDYwKTsKLSAgICAgICAgcEF1RGF0YUJ1ZmZlclsxXSA9ICgoIHVpTW0gPDwgNSkgfCAoMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgaWYoIHVpVG1wIDwgNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICBwQXVEYXRhQnVmZmVyWzBdID0gKCh1aU1tID4+IDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgICAgIHVpSGggPSAoTTRPU0FfVUludDgpKHVpVG1wIC8gNjApOwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgoIHVpSGggPDwgMykgfCAodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEdldE1QRUc0R292KCkKLSAqIEBicmllZiAgICBHZXQgdGhlIHRpbWUgaW5mbyBmcm9tIEdyb3VwIE9mIFZPUCB2aWRlbyBBVQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQXVEYXRhQnVmZmVyICAgIChJTikgICAgTVBFRzQgVmlkZW8gQVUgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gICAgcEN0c1NlYyAgICAgICAgICAgIChPVVQpICAgIEN1cnJlbnQgR09WIHRpbWUgaW5mbyBpbiBzZWNvbmQgdW5pdAotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKQotewotICAgIC8qCi0gICAgKiAgVGhlIE1QRUctNCB0aW1lIGNvZGUgbGVuZ3RoIGlzIDE4IGJpdHM6Ci0gICAgKgotICAgICogICAgIGhoICAgICBtbSAgICBtYXJrZXIgICAgc3MKLSAgICAqICAgIHh4eHh4fHh4eCB4eHggICAgIDEgICAgeHh4eCB4eCA/Pz8/Pz8KLSAgICAqICAgfC0tLS0tIC0tLXwtLS0gICAgIC0gICAgLS0tLXwtLSAtLS0tLS18Ci0gICAgKi8KLSAgICBNNE9TQV9VSW50OCB1aUhoOwotICAgIE00T1NBX1VJbnQ4IHVpTW07Ci0gICAgTTRPU0FfVUludDggdWlTczsKLSAgICBNNE9TQV9VSW50OCB1aVRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgc3MgKi8KLSAgICB1aVNzID0gKCggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4QzApID4+IDYpOwotICAgIHVpVG1wID0gKCggcEF1RGF0YUJ1ZmZlclsxXSAmIDB4MEYpIDw8IDIpOwotICAgIHVpQ3RzU2VjID0gdWlTcyArIHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIG1tICovCi0gICAgdWlNbSA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweEUwKSA+PiA1KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweDA3KSA8PCAzKTsKLSAgICB1aU1tID0gdWlNbSArIHVpVG1wOwotICAgIHVpQ3RzU2VjID0gKCB1aU1tICogNjApICsgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgaGggKi8KLSAgICB1aUhoID0gKCggcEF1RGF0YUJ1ZmZlclswXSAmIDB4RjgpID4+IDMpOwotCi0gICAgaWYoIHVpSGggKQotICAgIHsKLSAgICAgICAgdWlDdHNTZWMgPSAoIHVpSGggKiAzNjAwKSArIHVpQ3RzU2VjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBpbiBzZWMgKi8KLSAgICAqcEN0c1NlYyA9IHVpQ3RzU2VjOwotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoKQotICogQGJyaWVmICAgIEFsbG9jYXRlIHRoZSB0aHJlZSBZVVYgNDoyOjAgcGxhbmVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBQbGFuZXMgICAgKElOL09VVCkgdmFsaWQgcG9pbnRlciB0byAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgICB1aVdpZHRoICAgIChJTikgICAgIEltYWdlIHdpZHRoCi0gKiBAcGFyYW0gICAgdWlIZWlnaHQoSU4pICAgICBJbWFnZSBoZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpV2lkdGgsIE00T1NBX1VJbnQzMiB1aUhlaWdodCApCi17Ci0gICAgaWYgKHBQbGFuZXMgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiBJbnZhbGlkIHBQbGFuZXMgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIG5vdCBOVUxMIGFuZCBzYW1lIHNpemUgd2l0aCB0YXJnZXQgc2l6ZSwKLSAgICAgKiBkbyBub3QgbWFsbG9jIGFnYWluKi8KLSAgICBpZiAocFBsYW5lc1swXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV93aWR0aCA9PSB1aVdpZHRoICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV9oZWlnaHQgPT0gdWlIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFBsYW5lc1swXS51X3dpZHRoID0gdWlXaWR0aDsKLSAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7Ci0gICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1swXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMF0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1swXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzBdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1sxXS51X3dpZHRoID0gcFBsYW5lc1swXS51X3dpZHRoID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKLSAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBpZiAocFBsYW5lc1sxXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCi0gICAgICAgICogcFBsYW5lc1sxXS51X2hlaWdodCwgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJwUGxhbmVzWzFdLnBhY19kYXRhIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogdW5hYmxlIHRvIGFsbG9jYXRlIHBQbGFuZXNbMV0ucGFjX2RhdGEsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUGxhbmVzWzJdLnVfd2lkdGggPSBwUGxhbmVzWzFdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X2hlaWdodCA9IHBQbGFuZXNbMV0udV9oZWlnaHQ7Ci0gICAgcFBsYW5lc1syXS51X3N0cmlkZSA9IHBQbGFuZXNbMl0udV93aWR0aDsKLSAgICBwUGxhbmVzWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMl0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1syXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMl0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1syXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1syXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzJdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1swXS51X3N0cmlkZSpwUGxhbmVzWzBdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzFdLnVfc3RyaWRlKnBQbGFuZXNbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMl0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMl0udV9zdHJpZGUqcFBsYW5lc1syXS51X2hlaWdodCk7Ci0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotKiBAbm90ZQotKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgIChJTikgVGhlIEFSR0I4ODggaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCB0byBvdXRwdXQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotKiBAcGFyYW0gd2lkdGggICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSogQHBhcmFtIGhlaWdodCAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotKiBAcmV0dXJuICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkgewotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTEgLHJnYlBsYW5lMjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9yZ2I4ODggPSB3aWR0aCAqIGhlaWdodCAqIDM7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGo9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcEFyZ2JQbGFuZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiYXJnYiBkYXRhIik7Ci0gICAgaWYgKHBBcmdiUGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjA6IFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFSR0IgcGxhbmUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEdldCBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOiBcCi0gICAgICAgICAgICBDYW4gbm90IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBBcmdiUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCByZWFkIEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCi0gICAgICAgICAgICBDYW4gbm90IGNsb3NlIEFSR0I4ODg4ICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9Ci0gICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIlJHQjg4OCBwbGFuZTEiKTsKLSAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMSIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcmdiUGxhbmUxLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBBcmdiUGxhbmVbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwQXJnYlBsYW5lKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkgewotCi0gICAgICAgIGZyYW1lU2l6ZV9yZ2I4ODggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMzsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJyZ2IgUGxhbmUyIik7Ci0gICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMiIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHJnYlBsYW5lMi51X2hlaWdodCA9ICBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMi51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIC8qIFJlc2l6aW5nICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgcmVzaXppbmcgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgZXhpdCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBSVJfUGFyYW1zIGFpclBhcmFtczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzBdLnVfaGVpZ2h0KnBPdXRwbGFuZVswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMV0ucGFjX2RhdGEsIFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVsxXS51X2hlaWdodCpwT3V0cGxhbmVbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMl0udV9oZWlnaHQqcE91dHBsYW5lWzJdLnVfc3RyaWRlKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tSZXNpemluZykgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLgotICAgICAgICAqIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wbGFuZSwgcE91dHBsYW5lKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPQotICAgICAgICAgICAgcE91dHBsYW5lWzBdLnBhY19kYXRhICsgcE91dHBsYW5lWzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPQotICAgICAgICAgICAgcE91dHBsYW5lWzFdLnBhY19kYXRhICsgcE91dHBsYW5lWzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPQotICAgICAgICAgICAgcE91dHBsYW5lWzJdLnBhY19kYXRhICsgcE91dHBsYW5lWzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBUbyBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qIEluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwSW5wbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcElucGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBPdXRwbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcE91dHBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwT3V0cGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBPdXRwbGFuZVsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBPdXRwbGFuZVsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJwSW1hZ2VQbGFuZVRlbXAgWSIpIDsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogQWxsb2MgRXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFUiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFYiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLCBZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPQotICAgICAgICAgICAgICAgIChwSW5wbGFuZS0+dV9oZWlnaHQgKiBwT3V0cGxhbmUtPnVfd2lkdGgpIC9wSW5wbGFuZS0+dV93aWR0aDsKLQotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBwT3V0cGxhbmUtPnVfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wICovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkgKgotICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwSW5wbGFuZS0+dV93aWR0aCAqIHBPdXRwbGFuZS0+dV9oZWlnaHQpL3BJbnBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4gKi8KLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50ICovCi0gICAgICAgICAgICBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQ3JvcHBpbmcpIHsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcE91dHBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgaWYgKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8Ci0gICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAvKiBIZWlnaHQgd2lsbCBiZSBjcm9wcGVkICovCi0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X2hlaWdodCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFdpZHRoIHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocElucGxhbmUtPnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcE91dHBsYW5lOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmYWlyUGFyYW1zKTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwSW5wbGFuZSwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVswXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcE91dHBsYW5lWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzFdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwT3V0cGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBPdXRwbGFuZVsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWNsZWFuVXA6Ci0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgWVVWIHBsYW5lCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopInBQbGFuZVl1diIpOwotCi0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCAqIDEuNSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X2hlaWdodCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID4+MTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKAotICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSArCi0gICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGgpOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwICgKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnBGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyLAotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNXaWR0aCwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZGVjb2RlciB1c2luZyBzZXRvcHRpb24KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uICgKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfVFJVRTsKLQotICAgIC8vIEFsbG9jYXRlIFl1diBwbGFuZSB3aXRoIGVmZmVjdAotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9Ci0gICAgIChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXZXaXRoRWZmZWN0Iik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZSA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID0KLSAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ICogcEMtPmV3Yy51aVZpZGVvV2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCBudW1FZmZlY3RzID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wWzNdOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcCwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICAvKiBSZXNpemUgb3Igcm90YXRlIGNhc2UgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX0ZBTFNFKSkgewotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgaWYgKDAgIT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHl1dkZyYW1lSGVpZ2h0ID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8ocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgdmlkZW8gc2l6ZSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCBvciByb3RhdGVkLAotICAgICAgICAgICAgICogdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlciB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IHdoZW4gYXBwbHlpbmcgdmlkZW8gRWZmZWN0LiAqLwotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIHBSZXNpemVQbGFuZSwgYlNraXBGcmFtaW5nRWZmZWN0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwUmVzaXplUGxhbmU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgsIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBUZW1wOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSAocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUscFRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgZXhpc3QqLwotICAgICAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwgcEMtPnl1djEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnJlZSB0aGUgdGVtcCBidWZmZXIKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgIChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+eXV2MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCBkZWNvZGVyIHNldE9wdGlvbiBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgMTgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoLCB5dXZGcmFtZUhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vIHJvdGF0ZSBvciBubyByZXNpemUgY2FzZSovCi0gICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG51bUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwUGxhbmVOb1Jlc2l6ZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djIsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwVG1wLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlciByZXR1cm5zIGVycm9yIDB4JXgsIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IChNNE9TQV9JbnQzMil0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBvdXRQbGFuZVszXTsKLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGluIHBsYW5lCi0gICAgICAgIG91dFBsYW5lWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3N0cmlkZSA9IG91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzBdLnVfc3RyaWRlKm91dFBsYW5lWzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBZIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzFdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsxXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9zdHJpZGUgPSBvdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsxXS51X3N0cmlkZSpvdXRQbGFuZVsxXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgVSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0UGxhbmVbMl0udV93aWR0aCA9IHBQbGFuZUluWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X3N0cmlkZSA9IG91dFBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzJdLnVfc3RyaWRlKm91dFBsYW5lWzJdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBWIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uRGVncmVlKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIG91dFBsYW5lKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb25EZWdyZWUpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotICAgICAgICAvLyBDb3B5IFksIFUgYW5kIFYgcGxhbmVzCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzBdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGgqcFBsYW5lSW5bMF0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMV0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMV0udV93aWR0aCpwUGxhbmVJblsxXS51X2hlaWdodCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblsyXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblsyXS51X3dpZHRoKnBQbGFuZUluWzJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzJdLnBhY19kYXRhKTsKLQotICAgICAgICAvLyBTd2FwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbiBwbGFuZQotICAgICAgICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblswXS51X3N0cmlkZSA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfd2lkdGggPSBwUGxhbmVJblsxXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsxXS51X3N0cmlkZSA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfd2lkdGggPSBwUGxhbmVJblsyXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsyXS51X3N0cmlkZSA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmIChwbGFuZUluID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5VTEwgaW4gcGxhbmUsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcGxhbmVJblswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lSW5bMV0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzBmNzA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICAgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgVlNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgVlNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBNUEVHNCBkZWNvZGVyICovCi0jaWYgIWRlZmluZWQoTTRWU1NfU1VQUE9SVF9WSURFQ18zR1ApICYmICFkZWZpbmVkKE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUykKLSNlcnJvciAiV2FpdCwgd2hhdD8iCi0vKiAiSGV5LCB0aGlzIGlzIHRoZSBWU1MzR1BQIHNwZWFraW5nLiBQcmF5IHRlbGwsIGhvdyB0aGUgaGVjayBkbyB5b3UgZXhwZWN0IG1lIHRvIGJlIGFibGUgdG8gZG8KLWFueSBlZGl0aW5nIHdpdGhvdXQgYSBidWlsdC1pbiB2aWRlbyBkZWNvZGVyLCBub3IgdGhlIHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgYW4gZXh0ZXJuYWwgb25lPyEKLVNlcmlvdXNseSwgSSdkIGxvdmUgdG8ga25vdy4iICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTQotI2luY2x1ZGUgIk00UkVBREVSX1BjbS5oIgotI2VuZGlmCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCIKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLS8vI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0vLyNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB3cml0ZXIgdG8gc3Vic2NyaWJlICovCi0vLyNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLS8qZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi1NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi1NNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ki8KLS8vI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKVwKLSAgICByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICAgICAgcmVhZGVyTWVkaWFUeXBlOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBwUmVhZGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlICAgICB3cml0ZXJNZWRpYVR5cGU7Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBXcml0ZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgIGF1ZGlvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogcEF1ZGlvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlICAgICAgICAgdmlkZW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgdmlkZW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIHBWaWRlb0NvZGVjSW50ZXJmYWNlOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIDNHUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1AgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSAgICBlcnIgPSBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBDTSByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0gyNjQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBIMjY0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0gICAgZXJyID0gTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKAotICAgICAgICAgICAgICAmdmlkZW9EZWNvZGVyVHlwZSwgJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWRCBOVUxMIERlY29kZXIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBcCi0gICAgICAgIGNhbid0IHJlZ2lzdGVyIHZpZGVvIE5VTEwgZGVjb2RlciIpOwotI2VuZGlmCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1STkIgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgQUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0KLSAgICAvKiAtLS0gTlVMTCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotICAgIGVyciA9IE00QURfTlVMTF9nZXRJbnRlcmZhY2UoICZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgRVZSQyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0gICAgLyogLS0tIDNHUFAgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0gICAgLyogcmV0cmlldmVzIHRoZSAzR1BQIHdyaXRlciBtZWRpYSB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoICZ3cml0ZXJNZWRpYVR5cGUsICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLCBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjY0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIGF1ZGlvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SCi0gICAgLyogcmV0cmlldmVzIHRoZSBBTVIgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQwotICAgIC8qIHJldHJpZXZlcyB0aGUgRVZSQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNEVWUkNfZ2V0SW50ZXJmYWNlcyggJmF1ZGlvQ29kZWNUeXBlLCAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEVWUkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEVWUkMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9FVlJDICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICBwQ29udGV4dC0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlID0gTTRPU0FfVFJVRTsgICAvKiB3aGVuIE5YUCBTVyBjb2RlY3MgYXJlIHJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbG93IHVucmVnaXN0cmF0aW9uKi8KLSNlbmRpZgotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU0MTBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5jCi0gKiBAYnJpZWYgICAgQVBJIG9mIGVYdGVuZGVkIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIChWaWRlbyBTdHVkaW8gMi4xKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqIE9TQUwgbWFpbiB0eXBlcyBhbmQgZXJyb3JzICoqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0vKioKLSAqIFZTUyAzR1BQIEFQSSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLUJlZ2luIG9mIHhWU1MgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfSW5pdCggTTRPU0FfQ29udGV4dCAqcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwLCBpOwotCi0gICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGFyYW1ldGVyIHN0cnVjdHVyZSBmb3IgTTR4VlNTX0luaXQgZnVuY3Rpb24gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wRmlsZVJlYWRQdHIgPT0gTTRPU0FfTlVMTAotICAgICAgICB8fCBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAicEZpbGVSZWFkUHRyIG9yIHBGaWxlV3JpdGVQdHIgaW4gTTR4VlNTX0luaXRQYXJhbXMgc3RydWN0dXJlIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciA9IHBQYXJhbXMtPnBGaWxlUmVhZFB0cjsKLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIgPSBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0OiBjb3B5IGNvbnZlcnNpb24gZnVuY3Rpb25zIHBvaW50ZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5Ci0gICAgIGJ1ZmZlciovCi0gICAgaWYoIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggcFBhcmFtcy0+cENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cENvbnZGcm9tVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0OwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9Ci0gICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50OCksCi0gICAgICAgICAgICAgICAgTTRWQSwgKE00T1NBX0NoYXIgKikiTTR4VlNTX0luaXQ6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cFRlbXBQYXRoICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLypObyBuZWVkIHRvIGNvbnZlcnQgaW50byBVVEY4IGFzIGFsbCBpbnB1dCBvZiB4VlNTIGFyZSBpbiBVVEY4Ci0gICAgICAgICh0aGUgY29udmVyc2lvbiBjdXN0b21lciBmb3JtYXQgaW50byBVVEY4Ci0gICAgICAgIGlzIGRvbmUgaW4gVkEvVkFMKSovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7Ci0gICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgaW4gcFNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOyAvKiBSQyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgb3IgcmVtb3ZlZCBzb21lIG1lZGlhcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLQotICAgIC8qICJTdGF0ZSBtYWNoaW5lIiAqLwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSAwOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIFB0bzNHUFAgYW5kIE1DUyBsaXN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHN0YXRlIGlmIGFsbCBpbml0aWFsaXphdGlvbnMgYXJlIGNvcnJlY3RzICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogaW5pdGlhbGl6ZSBNQ1MgY29udGV4dCovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0geFZTU19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvVHJhbnNpdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYklzQkdNUmVwbGFjZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0NvbmZpZ1s5XSA9Ci0gICAgewotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICAvKiogSW5kZXggPC0+IFZpZGVvIGNvbmZpZyAqKi8KLSAgICAvKiAwOiAgICAgICAgSDI2MyAgU1FDSUYgICAgICAgICovCi0gICAgLyogMTogICAgICAgIEgyNjMgIFFDSUYgICAgICAgICovCi0gICAgLyogMjogICAgICAgIEgyNjMgIENJRiAgICAgICAgKi8KLSAgICAvKiAzOiAgICAgICAgTVBFRzQgU1FDSUYgICAgICAgICovCi0gICAgLyogNDogICAgICAgIE1QRUc0IFFRVkdBICAgICAgICAqLwotICAgIC8qIDU6ICAgICAgICBNUEVHNCBRQ0lGICAgICAgICAqLwotICAgIC8qIDY6ICAgICAgICBNUEVHNCBRVkdBICAgICAgICAqLwotICAgIC8qIDc6ICAgICAgICBNUEVHNCBDSUYgICAgICAgICovCi0gICAgLyogODogICAgICAgIE1QRUc0IFZHQSAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBNNE9TQV9VSW50MzIgYXVkaW9Db25maWdbM10gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBBdWRpbyBjb25maWcgKiovCi0gICAgLyogMDogICAgQU1SICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIDE6ICAgIEFBQyAgICAxNmtIeiBtb25vICAgICAgICAqLwotICAgIC8qIDI6ICAgIEFBQyAxNmtIeiBzdGVyZW8gICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGhlIG51bWJlciBvZiBpbnB1dCBjbGlwIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFja2dyb3VuZCBtdXNpYywgYW5kIGlmIGl0cyBhdWRpbyB3aWxsIHJlcGxhY2UgaW5wdXQgY2xpcCBhdWRpbyAqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFyc2UgYWxsIGNsaXBzLCBhbmQgZ2l2ZSBvY2N1cmVuY2VzIG9mIGVhY2ggY29tYmluYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLyogV2UgaWdub3JlIEpQRyBpbnB1dCBmaWxlcyBhcyB0aGV5IGFyZSBhbHdheXMgdHJhbnNjb2RlZCAqLwotICAgICAgICBpZiggcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19SZWR1Y2VUcmFuc2NvZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIHV0ZiBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgIC8vICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDaGVjayBiZXN0IHZpZGVvIHNldHRpbmdzICovCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDEyOAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gOTYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzNdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE2MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzRdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE3NgotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTQ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s1XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzMjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI0MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s2XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzNTIKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI4OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1syXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbN10gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gNjQwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSA0ODAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbOF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgQkdNIHRoYXQgcmVwbGFjZXMgZXhpc3RpbmcgYXVkaW8gdHJhY2ssIHdlIGRvIG5vdCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBhdWRpbyB0cmFjayBhcyBpdCB3aWxsIGJlIHJlcGxhY2VkICovCi0gICAgICAgICAgICAvKiBJZiBub3QsIHdlIHRyeSB0byBtaW5pbWl6ZSBhdWRpbyByZWVuY29kaW5nICovCi0gICAgICAgICAgICBpZiggYklzQkdNUmVwbGFjZSA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ1swXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgdmlkZW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgOTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCB2aWRlb0NvbmZpZ1tpXSA+PSB2aWRlb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa0NJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1ZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgYXVkaW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBhdWRpb0NvbmZpZ1tpXSA+PSBhdWRpb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQ4IG5iT2ZTYW1lQ2xpcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9Cb29sIGlzTmV3QkdNID0gTTRPU0FfVFJVRTsKLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQdG8zR1BQX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19NQ1NfcGFyYW1zICpwTUNTX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGluZ0ZyZXE7Ci0gICAgTTRPU0FfQm9vbCBiSXNUcmFuc2NvZGluZyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0ludDMyIHRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICBNNE9TQV9JbnQ4IG1hc3RlckNsaXAgPSAtMTsKLQotICAgIGkgPSAwOwotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TZW5kQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFN0YXRlIGlzIGJhY2sgdG8gaW5pdGlhbGl6ZWQgdG8gYWxsb3cgY2FsbCBvZiBjbGVhbnVwIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvKiBDaGVjayBpZiBhIHByZXZpb3VzIHNlbmRDb21tYW5kIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciAhPSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAvKiBDb21wYXJlIEJHTSBpbnB1dCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGF1ZGlvIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IEJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIHNvLCBubyBuZWVkIHRvIHJlZGVjb2RlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIkJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIG5vdGhpbmcgdG8gZGVjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3QkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgb3V0cHV0IHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWwKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB3ZSBjYW4ndCByZXVzZSBhbHJlYWR5IHRyYW5zY29kZWQvY29udmVydGVkIGZpbGVzICovCi0gICAgICAgICAgICAvKiBzbywgd2UgZGVsZXRlIHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtc19zYXV2OwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfc2F1djsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19iZ20gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBkbyBub3QgZGVsZXRlIEJHTSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qUFIgUDRNRTAwMDAzMTgyIGluaXRpYWxpemUgdGhpcyBwb2ludGVyIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBiZSBkZWFsbG9jYXRlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19iZ20tPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc19iZ207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYXliZSBuZWVkIHRvIGltcGxlbWVudCBmcmFtZXJhdGUgY2hhbmdpbmcgKi8KLSAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVW5hbGxvY2F0ZSBwcmV2aW91cyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBDbGlwcyByZWdpc3RlcmluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gdXNlciBnaXZlbiBzdHJ1Y3R1cmUgdG8gb3VyICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOyovCi0gICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgIFRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIGJpdHJhdGUgYXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZSovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsID0gcFNldHRpbmdzLT5QVFZvbExldmVsOwotCi0gICAgLypGQjogYnVnIGZpeCBpZiB0aGUgb3V0cHV0IHBhdGggaXMgZ2l2ZW4gaW4gTTR4VlNTX3NlbmRDb21tYW5kKi8KLQotICAgIGlmKCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICAvKkFzIGFsbCBpbnB1dHMgb2YgdGhlIHhWU1MgYXJlIGluIFVURjgsIGNvbnZlcnQgdGhlIG91dHB1dCBmaWxlIHBhdGggaW50byB0aGUKLSAgICAgICAgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU2VuZENvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAocFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm91dHB1dCBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0gcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgMDsgLyogV2l0aCBWU1MgMi4wLCB0aGlzIG5ldyBwYXJhbSBpcyBtYW5kYXRvcnkgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdDsgLyogQ1IgdGV4dCBoYW5kbGluZyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAhPSAwIFwKLSAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byBsaW1pdCBmaWxlXAotICAgICAgICAgICAgICAgICAgICAgICBzaXplIHdpdGggb3RoZXIgYXVkaW8gb3V0cHV0IHRoYW4gQUFDIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwgPSAwOwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tNUEVHNAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2MwotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2NCApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIH0KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODsKLSAgICAgICAgICAgIGhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHdpZHRoID0gMzUyOwotICAgICAgICAgICAgaGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gODAwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHdpZHRoID0gNzIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLQotICAgICAgICAgICAgd2lkdGggPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLQotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHdpZHRoID0gOTYwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgY2xpcC90cmFuc2l0aW9ucyBpZiBjbGlwIG51bWJlciBpcyBub3QgbnVsbCAuLi4gKi8KLSAgICBpZiggMCA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgY2xpcCBsaXN0IHRvIE5VTEwgKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSBcCi0gICAgICAgICAgICAgICAgInhWU1MsIGNvcHkgb2YgcFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gbGlzdCB0byBOVUxMICovCi0gICAgICAgICAgICBtZW1zZXQoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBlbHNlLCB0aGVyZSBpcyBhIHBiIGluIHRoZSBpbnB1dCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gY2xpcCBpbiB0aGlzIHNldHRpbmdzIGxpc3QgISEiKTsKLSAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIC8qKi8KLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBSQyBBbGxvY2F0ZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKkZCIGJ1ZyBmaXggMTkuMDMuMjAwODogdGhlc2UgcG9pbnRlcnMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgLT4gY3Jhc2ggd2hlbiBmcmVlKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPQotICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqLwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHBUYXJnZXRlZFRpbWVTY2FsZSA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MsCi0gICAgICAgICAgICAmcFRhcmdldGVkVGltZVNjYWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgfHwgcFRhcmdldGVkVGltZVNjYWxlID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IHBUYXJnZXRlZFRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRvdGFsIGR1cmF0aW9uIHZhcmlhYmxlICovCi0gICAgdG90YWxEdXJhdGlvbiA9IDA7Ci0KLSAgICAvKiBQYXJzaW5nIGxpc3Qgb2YgY2xpcHMgZ2l2ZW4gYnkgYXBwbGljYXRpb24sIGFuZCBwcmVwYXJlIGFuYWx5emluZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGN1cnJlbnQgY2xpcCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgIChzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSBjbGlwIHNldHRpbmdzIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciB4VlNTX2NvbnRleHQgc3RydWN0dXJlICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyByZXR1cm4gZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKCBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZXh0ZXJuYWwgZWZmZWN0IGNvbnRleHQgdG8gTlVMTCwgdG8ga25vdyBpZiBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgZGVjb2RlZCBvciBub3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5WaWRlb1RyYW5zaXRpb25UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdHJhbnNpdGlvbiB0eXBlIGlzIGFscGhhIG1hZ2ljLCB3ZSBuZWVkIHRvIGRlY29kZSBpbnB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYzoKLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0byBoYXZlIGEgY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG91IG91cgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBmaWxlbmFtZSB0byBvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGFsbCB0cmFuc2l0aW9uIHRvIGtub3cgaWYgdGhlIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFscGhhU2V0dGluZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50ID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAxMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQpICogMjU1IC8gMjAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmlzcmV2ZXJzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5pc3JldmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGpwZyBmaWxlIGZvciBhbHBoYSBtYWdpYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBkZWNvZGVkIC0+IG5vIG5lZGQgdG8gZGVjb2RlIGl0IGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGpwZyBoYXMgbm90IGJlZW4gZGVjb2RlZCB5ZXQgLi4uICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKm91dHB1dFBsYW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aF9BUkdCODg4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHRfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCB3aWR0aCBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRyYW5zaXRpb25MaXN0TTR4VlNTX1NlbmRDb21tYW5kIGhlaWdodCEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9BUkdCODg4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcGxhbmUgZm9yIEFscGhhIG1hZ2ljIHRyYW5zaXRpb24iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCggd2lkdGggKiBoZWlnaHQgKiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQWxwaGEgbWFnaWMgcGFjX2RhdGEgb3V0cHV0IFlVViIpOwotICAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3N0cmlkZSA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSA9IG91dHB1dFBsYW5lWzBdLnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRQbGFuZVswXS51X3dpZHRoICogb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMV0udV93aWR0aCAqIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBjb252ZXJzaW9uLCB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBjb252ZXJ0ICsgcmVzaXppbmcgZnJvbSBBUkdCODg4OCB0byB5dXY0MjAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCBvdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9BUkdCODg4LCBoZWlnaHRfQVJHQjg4OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBkZWNvZGluZyBhbHBoYSBtYWdpYyBKUEVHOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPnBQbGFuZSA9IG91dHB1dFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50ID4gMCAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmV2ZXJzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikiSW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBzbGlkZVNldHRpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNvcHkgdGhlIGxvbmUgcGFyYW1ldGVyIGZyb20gdGhlIGlucHV0IHNldHRpbmdzIHRvIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlU2V0dGluZ3MtPmRpcmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncy0+ZGlyZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGtlZXAgb3VyIGNvcHkgb2YgdGhlIHNldHRpbmdzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gJk00eFZTU19TbGlkZVRyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IHNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2s6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5FeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHdpdGggdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgICAgICAgICAgdG90YWxEdXJhdGlvbiAtPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09Ci0gICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20pIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEFSR0JGaWxlSW47Ci0gICAgICAgICAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDbXBSZXN1bHQgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyApCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2VBUkdCXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSBwaWN0dXJlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IChNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBQdG8zR1BQIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0KLSAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOmdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmhlaWdodCA9IHBTZXR0aW5ncy0+cENsaXBMaXN0WwotICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY0hlaWdodDsgLy9BUkdCX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+d2lkdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgICAgIGldLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7IC8vQVJHQl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBIID0gJWQiLCBwUGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkNMSVAgTTR4VlNTX1NlbmRDb21tYW5kIEFSR0I4ODg4IFcgPSAlZCIsIHBQYXJhbXMtPndpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc2F2ZSBvZiBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX1B0bzNHUFBfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBpcyBmaWxsZWQsIGxldCdzIHVzZSBpdCBpbnN0ZWFkIG9mIEVuZEN1dFRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IEpQRyBmaWxlIGlzIHByZXNlbnQgb24gdGhlIEZTIChQNE1FMDAwMDI5NzQpIGJ5IGp1c3Qgb3BlbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjbG9zaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JGaWxlSW4sIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IGpwZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JGaWxlSW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWcsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nX3RtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X2ltZ190bXAsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSB0ZW1wIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0gICAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgUGFuQW5kWm9vbSBzZXR0aW5ncyBpZiBuZWVkZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNQYW5ab29tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBQYW4gJiBab29tIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSBrZW5idXJuIHZpZGVvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCBpbiBhbmFseXNpcyBwaGFzZSwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdGFuc2NvZGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGluIHNhdmluZyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsKLQotICAgIHJlcGxhY2VBUkdCXzNHUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBwUGFyYW1zLT5kdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjaW5nIGluIFZTUyBzdHJ1Y3R1cmUgdGhlIEpQRyBmaWxlIGJ5IHRoZSAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwUGFyYW1zLT5wRmlsZU91dDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIEFSR0IgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDNHUCBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBOZWVkIHRvIGNhbGwgTUNTIGluIGNhc2UgM0dQIHZpZGVvL2F1ZGlvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgKEgyNjMvTVBFRzQgb3IgQU1STkIvQUFDKSAqLwotICAgICAgICAgICAgLyogPT4gTmVlZCB0byBmaWxsIE1DU19QYXJhbXMgc3RydWN0dXJlIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMgISAqLwotICAgICAgICAgICAgLyogTmVlZCBhbHNvIHRvIHBhcnNlIE1DUyBwYXJhbXMgc3RydWN0IHRvIGNoZWNrIGlmIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2NvZGVkICovCi0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXM7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIHByb3BlcnRpZXMgc3RydWN0dXJlICovCi0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKSAmZmlsZVByb3BlcnRpZXMsMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy9maWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotCi0gICAgICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBwZXJjZW50YWdlIGN1dCB0aW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVzZSBwZXJjZW50YWdlIGN1dCB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRW5kQ3V0UGVyY2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9Ci0gICAgICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgTUNTIFBhcmFtIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVJbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQotICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgJiYgcFBhcmFtcy0+aXNCR00gPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlM0dQXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSAzR1AgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgIT0gMAotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGFyZSBub3QgY29ycmVjdCBhbmQgaWYgZHVyYXRpb24gZmllbGQgaXMgbm90IGZpbGxlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICA8PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgcGVyY2VudGFnZSBmb3IgYmVnaW4gYW5kIGVuZCBjdXQgdGltZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0aGUgcGVyY2VudGFnZSBpbnRvIGFic29sdXRlIHRpbWUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICogZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLyAxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogLi4uT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBlbmRDdXRUaW1lID09IDAsIGl0IG1lYW5zIGFsbCB0aGUgZmlsZSBpcyB0YWtlbi4gTGV0J3MgY2hhbmdlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgZHVyYXRpb24sIHRvIGFjY3VyYXRlIHByZXZpZXcuICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGZpZWxkIGlzIGZpbGxlZCwgaXQgaGFzIHByaW9yaXR5IG9uIG90aGVyIGZpZWxkcyBvbiBFbmRDdXRUaW1lLAotICAgICAgICAgICAgIHNvIGxldCdzIHVzZSBpdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAreFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIG91dHB1dCB2aWRlbyBmb3JtYXQgaXMgbm90IHNldCwgd2UgdGFrZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGZpcnN0IDNHUCB2aWRlbyAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICAvL000T1NBX1RSQUNFMl8xKCJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHNldCBpdCB0byBjdXJyZW50IGNsaXA6ICVkIiwKLSAgICAgICAgICAgICAgICAvLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIGFuIGVycm9yIHBhcmFtZXRlciBpcyByZXR1cm5lZC4iKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGF1ZGlvIGZvcm1hdCBpcyBub3Qgc2V0IC0+IHJlbW92ZSBhdWRpbyB0cmFjayBvZiBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDCi0gICAgICAgICAgICAgICAgJiYgKGZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gc2FtcGxpbmdGcmVxCi0gICAgICAgICAgICAgICAgfHwgYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8pKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2Ugd2FudCB0byByZXBsYWNlIGF1ZGlvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHRyYW5zY29kZSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGVtcCBmaXggOlBUIHZvbHVtZSBub3QgaGVyYWQgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAvKihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCovCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKSAvKjExLzEyLzIwMDggQ1IgMzI4MyBWQUwgZm9yIHRoZSBNTVMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlLCB3ZSBuZWVkIHRvIHRyYW5zY29kZSBleGNlcHQgdGhlIG1lZGlhIHdpdGhvdXQgYXVkaW8qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEhlcmUgY2hlY2sgdGhlIGNsaXAgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwsIGlmIGl0IGV4Y2VlZHMKLSAgICAgICAgICAgICAqIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBvZiBleHBvcnQgZmlsZSwgdGhlbiB0aGUgZmlsZSBuZWVkcwotICAgICAgICAgICAgICogdG8gYmUgdHJhbnNjb2RlZChkbyBub3QgZG8gY29tcHJlc3MgZG9tYWluIHRyaW0pLgotICAgICAgICAgICAgICogQWxzbyBmb3IgTVBFRzQgZm9tYXJ0LCBhbHdheXMgZG8gdHJhbnNjb2Rpbmcgc2luY2UgSFcgZW5jb2RlcgotICAgICAgICAgICAgICogbWF5IHVzZSBkaWZmZXJlbnQgdGltZSBzY2FsZSB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBjbGlwKi8KLSAgICAgICAgICAgaWYgKChmaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUpIHx8Ci0gICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSkgewotICAgICAgICAgICAgICAgLyogU2V0IGJUcmFuc2NvZGluZ1JlcXVpcmVkIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlIHZpZGVvIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAqIHRyYW5zY29kZWQgaW4gTUNTLiAqLwotICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICB2aWRlb0lzRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzdmlkJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncF90bXAsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAiJXN2aWQlZC50bXAiLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgTUNTIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0gTTR4VlNTX2tSZXNpemluZzsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT52aWRlb2NsaXBudW1iZXIgPSBpOyAvLyBJbmRpY2F0ZXMgdmlkZW8gY2xpcCBpbmRleAotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRvIG5vdCBuZWVkIHRvIHJlZW5jb2RlIHZpZGVvIGlmIGl0cyBwYXJhbWV0ZXJzIGRvIG5vdCBkaWZmZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBmcm9tIG91dHB1dCBzZXR0aW5ncyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgc3RydWN0dXJlIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgKHRoZSBNQ1MgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIGFyZSB1c2VkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB2aWRlbyBiaXRyYXRlIGlzIGhhcmRjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCB2aWRlbyBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPj0gTTRWSURFT0VESVRJTkdfazE2X0tCUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazhfTUJQUyApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb1Byb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxWaWRlbzsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUzsgLyogTXVzdCBiZSBzZXQsIG90aGVyd2lzZSwgTUNTIHJldHVybnMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOb25lQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBiaXRyYXRlIGluIHRoZSBBQUMgY2FzZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQgb3IgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gYXVkaW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYXVkaW8gYml0cmF0ZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDE2a2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBmcmVxdWVuY3kqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIHVuYWxsb3dlZCBzYW1wbGluZyBmcmVxdWVuY2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBTaG91bGQgbm90IGhhcHBlbiAhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlSW4sICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncF90bXA7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0XzNncF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIDNHUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAvKkZCIDIwMDgvMTAvMjAga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8sIGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyKi8KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgIGJJc1RyYW5zY29kaW5nID0gTTRPU0FfVFJVRTsKLQotcmVwbGFjZTNHUF8zR1A6Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBvcmlnaW5hbCAzR1AgZmlsZSBieSB0aGUgdHJhbnNjb2RlZCAzR1AgZmlsZSAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgM2dwIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgICAgIC8qaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9PSAwICYmIGZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAtIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgZGVmaW5lIG1hc3RlciBjbGlwIGFzIGZpcnN0IDNHUCBpbnB1dCBjbGlwICovCi0gICAgICAgICAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICBPdGhlciBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBmaWxlIHR5cGUgYXMgaW5wdXQgY2xpcCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBQYXJzZSBhbGwgZWZmZWN0cyB0byBtYWtlIHNvbWUgYWRqdXN0bWVudCBmb3IgZnJhbWluZywgKgotICAgICogdGV4dCBhbmQgdG8gdHJhbnNmb3JtIHJlbGF0aXZlIHRpbWUgaW50byBhYnNvbHV0ZSB0aW1lICoKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ID4gMTAwCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qIExldCdzIG5vdCB1c2UgdGhlbSBieSBzZXR0aW5nIHRoZW0gdG8gMCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA9IDA7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIGhhdmUgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBsZXQncyB1c2UgaXQuLi4gT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lID0gKE00T1NBX1VJbnQzMikodG90YWxEdXJhdGlvbgotICAgICAgICAgICAgICAgICogeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudAotICAgICAgICAgICAgICAgIC8gMTAwKTsKLSAgICAgICAgICAgIC8qIFRoZSBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgLQotICAgICAgICAgICAgc3RhcnQgdGltZSAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIGZyYW1pbmcgZWZmZWN0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1pbmcgZWZmZWN0IHN0cnVjdHVyZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nICkKLSAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCAqZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZWxzZQotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICBNNE9TQV9DaGFyICpwRXh0MiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgICAgICAgLyogQ29weSBmcmFtaW5nIGZpbGUgcGF0aCAqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICsgMSwgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBwRXh0MiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemU7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlUmVhZFB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS51aUR1cmF0aW9uOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9hbmltYXRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBPdXRwdXQgcmF0aW8gZm9yIHRoZSBlZmZlY3QgaXMgc3RvcmVkIGluIHVpRmlmdGllc091dEZyYW1lUmF0ZSBwYXJhbWV0ZXJzIG9mIHRoZQotICAgICAgICAgICAgZXh0ZW5kZWQgeFZTUyBlZmZlY3RzIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlCi0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+ZnJhbWVEdXJhdGlvblJhdGlvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0Zsb2F0KSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZSkgLyAxMDAwLjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9IDEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypGaWxsIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgaWYoIHBFeHQyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgZWZmZWN0LCBhbmQgZmlsbCBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBFeHQyICs9IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwRXh0MikgLSA0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiBDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyogT25seSB1c2VkIGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1Mud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGUkFNTUlORyBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIFdJRFRIIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIEhFSUdIVCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVQTkcgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFNQUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE5vdCBzdXBwb3J0ZWQgc3RpbGwgcGljdHVyZSBmb3JtYXQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBQbGFuZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBSR0IgcGxhbmUgaXMgcHJvdmlkZWQsIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCAmIH4xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIGlucHV0IGltYWdlL3BsYW5lIHByb3ZpZGVkIGZvciBmcmFtaW5nIGVmZmVjdC4iKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1I6IEFkZCB0ZXh0IGhhbmRsaW5nIHdpdGggZXh0ZXJuYWwgdGV4dCBpbnRlcmZhY2UgKi8KLSAgICAgICAgLyogSWYgZWZmZWN0IHR5cGUgaXMgdGV4dCwgd2UgY2FsbCBleHRlcm5hbCB0ZXh0IGZ1bmN0aW9uIHRvIGdldCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2FsbCB0aGUgZm9udCBlbmdpbmUgZnVuY3Rpb24gcG9pbnRlciB0byBnZXQgUkdCNTY1IGJ1ZmZlciAqLwotICAgICAgICAgICAgLyogV2UgdHJhbnNmb3JtIHRleHQgZWZmZWN0IGludG8gZnJhbWluZyBlZmZlY3QgZnJvbSBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgVVRGIGNvbnZlcnRpb24gZm9yIHRleHQgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVdyaXRlUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX0lzRmlsZUdpZiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgLyogRkI6IGNoYW5nZXMgZm9yIFZpZGVvIEFydGlzdDogbWVtY29weSBwVGV4dEJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgYWZ0ZXIgYSBjb21wbGV0ZSBhbmFseXNpcyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogcFRleHRCdWZmZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkNvbnZlcnQgdGV4dCBidWZmZXIgaW50byBjdXN0b21lciBmb3JtYXQgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIHRleHQgYnVmZmVyIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAvLyBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxLAotICAgICAgICAgICAgICAgIC8vIE00VlMsICJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCi0gICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIHRleHQgUkdCIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUkdCIHN0cnVjdHVyZSBmb3IgdGhlIHRleHQgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoCi0gICAgICAgICAgICAgICAgICAgID09IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiB0ZXh0IHBsYW5lIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IFJHQiB0ZXh0IGJ1ZmZlciBhbmQgZm9yY2UgaXQgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbgotICAgICAgICAgICAgICAgICBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVyV2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJIZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAyICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZXh0IFJHQiBwbGFuZS0+cGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIC8qIENhbGwgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBUZXh0UmVuZGVyaW5nRmN0KAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBSZW5kZXJpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gZGlkIG5vdCBzZXQgUkdCIGJ1ZmZlciBjb3JyZWN0bHkgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiBwbGFuZSB0byBZVVY0MjAgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICAgICAgLyogQ2hhbmdlIGludGVybmFsbHkgZWZmZWN0IHR5cGUgZnJvbSAidGV4dCIgdG8gZnJhbWluZyAqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTm8gdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gc2V0ICEhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCAqZmlmdGllc0N0eDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGV4cGVjdGVkIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCAobXVzdCBiZSBhYm92ZSAwKSAqLwotICAgICAgICAgICAgaWYoIDAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmaWZ0aWVzIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZmlmdGllc0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+ZmlmdGllc0VmZmVjdER1cmF0aW9uID0gMTAwMCAvIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LT5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgQ29sb3IgZWZmZWN0ICovCi0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgKkNvbG9yQ3R4OwotCi0gICAgICAgICAgICBDb2xvckN0eCA9Ci0gICAgICAgICAgICAgICAgKE00eFZTU19Db2xvclN0cnVjdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0NvbG9yU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBjb2xvciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIENvbG9yQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xvckN0eC0+Y29sb3JFZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGU7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Ci0gICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlSZ2IxNklucHV0Q29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHgtPnJnYjE2Q29sb3JEYXRhID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEJhY2tncm91bmQgbXVzaWMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgJiYgaXNOZXdCR00gPT0gTTRPU0FfVFJVRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotCi0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICBNNE9TQV9DaGFyICpvdXRfcGNtOwotICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBXZSBzYXZlIG91dHB1dCBmaWxlIHBvaW50ZXIsIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB3aGVuIHNhdmluZyBhdWRpbyBtaXhlZAotICAgICAgICAgZmlsZSAobGFzdCBzYXZlIHN0ZXApICovCi0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgICAgICAvKiBJZiBhIHByZXZpb3VzIEJHTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGRlbGV0ZSBpdCAqLwotICAgICAgICAvKiBIZXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB0ZXN0IHRvIGtub3cgaWYgdGhlIHNhbWUgQkdNIGlzIHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgICAgICBwRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikieFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgaW5wdXQgc3RydWN0dXJlIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncykpOwotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0KLSAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpICsgMSk7Ci0KLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgLyogRGVjb2RlIEJHTSB0cmFjayB0byBwY20gb3V0cHV0IGZpbGUgKi8KLQotICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgQkdNKSIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIGluIGNhc2Ugb2YgcHJvYmxlbSAoUFIgMjI3MykgKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0gMDsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdAotICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBQQ00gdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENoYWluIHByZXZpb3VzIGVsZW1lbnQgd2l0aCBuZXh0IGVsZW1lbnQgPSByZW1vdmUgQkdNIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfcHJldiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2LT5wTmV4dCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgY3VycmVudCBwb2ludGVyIGlzIHRoZSBmaXJzdCBvZiB0aGUgY2hhaW5lZCBsaXN0IGFuZCBuZXh0IHBvaW50ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgdG8gcmVhZmZlY3QgdGhlIGZpcnN0IGNoYWluZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfcHJldiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3ByZXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZCBsaXN0IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotICAgICAgICAgICAgIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zX3ByZXY7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgLyogU28sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbmV3IHBhcmFtcyovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ007Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPSBNNFZJREVPRURJVElOR19rMTVfRlBTOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0KLSAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0ZXJlbwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtcy0+YkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOwotCi0gICAgICAgIC8qIFByZXBhcmUgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIC8qIDIxIGlzIHRoZSBzaXplIG9mICJwcmV2aWV3XzE2MDAwXzIucGNtIiArIFwwICovCi0gICAgICAgIG91dF9wY20gPQotICAgICAgICAgICAgKE00T1NBX0NoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKQotICAgICAgICAgICAgKyAyMSwgTTRWUywgKE00T1NBX0NoYXIgKikiVGVtcCBjaGFyKiBmb3IgcGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggb3V0X3BjbSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSB0ZW1wb3JhcnkgcGF0aCB0byBmaW5hbCBwcmV2aWV3IHBhdGggc3RyaW5nICovCi0gICAgICAgIE00T1NBX2Nock5Db3B5KG91dF9wY20sIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKSArIDEpOwotCi0gICAgICAgIC8qIERlcGVuZGluZyBvZiB0aGUgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kgYW5kIG5iIG9mIGNoYW5uZWxzLCB3ZSBjb25zdHJ1Y3QgcHJldmlldwotICAgICAgICBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8xLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzE2MDAwXzIucGNtXDAiLAotICAgICAgICAgICAgICAgICAgICAyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSBQQ00gZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIGF1ZGlvIG91dHB1dCBmb3JtYXQgXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gb3V0X3BjbTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X3BjbTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfcGNtLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ci0gICAgICAgICAgICAgICAgcEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUGFyYW1zLT5pc0NyZWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIGlzTmV3QkdNID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIEJHTSBpcyB0aGUgc2FtZSBhcyBwcmV2aW91c2x5LCBubyBuZWVkIHRvIHJlZGVjb2RlIGF1ZGlvICovCi0gICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0LCB0byBzaWduYWwgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gdG8gc2tpcAotICAgICAgICBCR00gZGVjb2RpbmcgKi8KLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc190ZW1wID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8KLSAgICAgICAgIG1peGVkIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogUmUtd3JpdGUgQkdNIHNldHRpbmdzIGluIGNhc2UgdGhleSBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gc2VuZENvbW1hbmQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0cyA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0czsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcCA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotCi0gICAgICAgIHdoaWxlKCBwUGFyYW1zX3RlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+aXNDcmVhdGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNHhWU1NfU2VuZENvbW1hbmQgaGFzIGJlZW4gcmVjYWxsZWQsIEJHTSBpcyB0aGUgc2FtZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gQkdNIGluIHRoaXMgeFZTUyBjb21tYW5kIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAgICAgLyogTmVlZCB0byByZW1vdmUgTUNTIHByZXZpb3VzIHBhcmFtcyBjaGFpbmVkIGxpc3QgKi8KLQotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IGlzIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiA9PiB3ZSBwdXQgdGhlIGNvbnRleHQgdmFyaWFibGUgdG8gTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wOwotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgICAgIC8qIEhlcmUsIHdlIHVuYWxsb2NhdGUgYWxsIEJHTSBjb21wb25lbnRzIGFuZCBwdXQgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2sgdG8gTlVMTCAqLwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlZCB0byBiZSBhYmxlIHRvIG1peCB3aXRoIHZpZGVvIG9ubHkgZmlsZXMgLT4gaW4gY2FzZSBubyBtYXN0ZXIgY2xpcCBpcyBmb3VuZAotICAgIChpLmUgb25seSBKUEcgaW5wdXQgb3IgdmlkZW8gb25seSBpbnB1dCkgKi8KLSAgICAvKiBhbmQgaWYgdGhlcmUgaXMgYSBCR00sIHdlIGZvcmNlIHRoZSBhZGRlZCB2b2x1bWUgdG8gMTAwIChpLmUgcmVwbGFjZSBhdWRpbykgKi8KLQotICAgIGlmKCBtYXN0ZXJDbGlwID09IC0xCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCBubyBpbnB1dCAzR1AgZmlsZSBoYXMgYSB2aWRlbyB0cmFjay4KLSAgICAgICAgVGhlcmVmb3JlLCBpZiBhIG1peGluZyBpcyBhc2tlZCwgaXQgd2lsbCBmYWlsLiBUaHVzLCB3ZSBmb3JjZSByZXBsYWNlIGF1ZGlvLiAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID0gMTAwOwotICAgIH0KLQotICAgIC8qIFNhdmUgY2xpcCBudW1iZXIgdG8ga25vdyBpZiBhIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVBbmFseXppbmc7Ci0KLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgY29tcHV0ZSBoZXJlIHRoZSBtYXggdmlkZW8gYml0cmF0ZSAqLwotICAgIC8qIEluIGNhc2Ugb2YgdG9vIGxvdyBiaXRyYXRlLCBhIHNwZWNpZmljIHdhcm5pbmcgaXMgcmV0dXJuZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCAmJiB0b3RhbER1cmF0aW9uID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgICAgIE00T1NBX0RvdWJsZSByYXRpbzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZQotICAgICAgICAgICAgICAgID09IDEwMCApIC8qIFdlIGFyZSBpbiAicmVwbGFjZSBhdWRpbyBtb2RlLCBuZWVkIHRvIGNoZWNrIHRoZSBmaWxldHlwZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBEZWNvZGVkUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCR00gdHJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyplcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCBhbiBlcnJvcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBJbXBvc3NpYmxlIHRvIHVzZSBNTVMgbW9kZSB3aXRoIEJHTSAhPSBBTVItTkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgaW5wdXQgQkdNIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHRhcmdldGVkIGJpdHJhdGUsIHdpdGggOCUgbWFyZ2luIChtb292KSAqLwotICAgICAgICBpZiggdG90YWxEdXJhdGlvbiA+IDEwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAqIDggKiAwLjg0KSAvICh0b3RhbER1cmF0aW9uIC8gMTAwMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPj0gMTIyMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gMTIyMDA7IC8qIE9ubHkgQU1SIGlzIHN1cHBvcnRlZCBpbiBNTVMgY2FzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgYW4gaW5kaWNhdG9yIG9mICJjb21wbGV4aXR5IiBkZXBlbmRpbmcgb24gbmIgb2Ygc2VxdWVuY2VzIGFuZCB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAvKiBUaGUgaGlnaGVzdCBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcywgdGhlIG1vcmUgdGhlcmUgYXJlIHNvbWUgSSBmcmFtZXMgKi8KLSAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVkdWNlIHRoZSB0YXJnZXQgYml0cmF0ZSAqLwotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAqIDEwMDAwMCkgLyAoTTRPU0FfRG91YmxlKSh0b3RhbER1cmF0aW9uKSk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIlJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkXG5Ub3RhbCBkdXJhdGlvbjogJWQiLAotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpLAotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlLCB0b3RhbER1cmF0aW9uKTsKLQotICAgICAgICBpZiggcmF0aW8gPiA1MCAmJiByYXRpbyA8PSA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmlzayBvZiBoYXZpbmcgYSBoaWdoZXIgZmlsZSBzaXplCi0gICAgICAgICAgICB0aGFuIHNwZWNpZmllZCAqLwotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IChNNE9TQV9VSW50MzIpKHRhcmdldGVkQml0cmF0ZSAqIDAuMSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUxICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcmF0aW8gPiA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjE1KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKAotICAgICAgICAgICAgICAgICJOZXcgYml0cmF0ZTIgISFcblJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICByYXRpbywgdGFyZ2V0ZWRCaXRyYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZBTDoKLSAgICAgICAgRGVjcmVhc2UgdGhlIG91dHB1dCBmaWxlIHNpemUgdG8ga2VlcCBhIG1hcmdpbiBvZiA1JQotICAgICAgICBUaGUgd3JpdGVyIHdpbGwgc3RvcCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplIHdpbGwgYmUgcmVhY2hlZCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAqIDAuMDUpOwotCi0gICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApICAgICAgICAgICAgICAvKjQ4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOyAvKjQ4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDQ4MDAwICkgICAgICAgICAgICAgIC8qNjQwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNDgwMDA7IC8qNjQwMDA7Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgNjQwMDAgKSAgICAgICAgICAgICAgLyoxMjgwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNjQwMDA7IC8qMTI4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMTI4MDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMTI4MDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDE5MjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDE5MjAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IEVycm9yIGluIG91dHB1dCBmaWxlU2l6ZSAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpdGFyZ2V0ZWRCaXRyYXRlOwotICAgIH0KLQotICAgIGlmKCBiSXNUcmFuc2NvZGluZyApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkICpwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwRWRpdFNhdmluZ1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyA9IDA7Ci0gICAgLypvbmx5IGZvciBVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIC8qKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlT3BlbmVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdGFydCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFJDOiB0byB0ZW1wb3JhcnkgaGFuZGxlIGNoYW5naW5nIG9mIG91dHB1dCBmaWxlcGF0aCAqLwotICAgIC8qIFRPIEJFIENIQU5HRUQgQ0xFQU5MWSBXSVRIIEEgTUFMTE9DL01FTUNQWSAhISEhICovCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qaXQgbWVhbnMgdGhhdCBwT3V0cHV0RmlsZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gTTR4VlNTX3NlbmRDb21tYW5kKCkqLwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHBGaWxlUGF0aDsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyCi0gICAgICAgICBmb3JtYXQqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBGaWxlUGF0aCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgZmlsZVBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogb3V0cHV0IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZVtmaWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBmaWxlUGF0aFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZywgY29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gaW5wdXQgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopICYocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUyksCi0gICAgICAgICh2b2lkICopICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICBzaXplb2YoTTR4VlNTX0VkaXRTZXR0aW5ncykpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwRWRpdFNhdmluZ1NldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcDsgLyogVlNTMi4wIG1hbmRhdG9yeSBwYXJhbWV0ZXIgKi8KLQotICAgIC8qIEFsbG9jYXRlIHNhdmluZ1NldHRpbmdzLnBDbGlwTGlzdC9wVHJhbnNpdGlvbnMgc3RydWN0dXJlICovCi0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKgotICAgICAgICAqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgKnBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nICwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKgotICAgICAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAqKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGkgPCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgIC0gMSApIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPQotICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLy8gQWRkIE1QNCBmaWxlIHN1cHBvcnQKLQotICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpCi0KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciBzYXZpbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFIC8qIHJlbW92ZSBlZmZlY3RzICovKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgaWYoIGkKLSAgICAgICAgICAgICAgICA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IEVycm9yIHdoZW4gcGFyc2luZyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldOlwKLSAgICAgICAgICAgICAgICAgQmFkIGZpbGUgdHlwZSIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgdmlkZW8gZWZmZWN0cywgdXNlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUqLwotICAgIC8qIEZCIDIwMDgvMTAvMTU6IHJlbW92ZWQgOiBub3QgY29tcGF0aWJsZSB3aXRoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUKLSAgICBmb3Ioaj0wO2o8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cztqKyspCi0gICAgewotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSAhPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lKQotICAgIHsKLSAgICBuYkVmZmVjdHMrKzsKLSAgICB9Ci0gICAgfSovCi0gICAgbmJFZmZlY3RzID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIC8qIEFsbG9jYXRlIGVmZmVjdHMgc2F2aW5nIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgbnVtYmVyIG9mIGVmZmVjdHMgKi8KLSAgICBpZiggbmJFZmZlY3RzICE9IDAgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwotICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gbmJFZmZlY3RzOwotCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcEZpbGVQYXRoOwotICAgIH0KLQotICAgIC8qIFNhdmUgcG9pbnRlciBvZiBzYXZpbmcgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IHBFZGl0U2F2aW5nU2V0dGluZ3M7Ci0KLSAgICAvKiBDaGFuZ2Ugb3V0cHV0IGZpbGUgbmFtZSB0byB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgbmFtZSwgYmVjYXVzZSBmaW5hbCBmaWxlIHdpbGwgYmUKLSAgICAgZ2VuZXJhdGVkIGJ5IGF1ZGlvIG1peGVyICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BfdG1wW000WFZTU19NQVhfUEFUSF9MRU5dOwotCi0gICAgICAgIC8qKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwotICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSk7Ci0KLSAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIGZyZWUocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKi8KLQotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwX3RtcCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXAgZmlsZW5hbWUgaW4gY2FzZSBvZiBCR00iKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGxlbmd0aCArIDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wb3JhcnkgZmlsZSIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDIsIGJlY2F1c2UgYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDEsIGJlY2F1c2Ugbm8gYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKiovCi0KLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJlaW5pdGlhbGl6ZSBjdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nICovCi0gICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCA9IDA7Ci0KLSAgICAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVTYXZpbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdG9wIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBzYXZpbmcgc3RydWN0dXJlcyAqLwotICAgIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgUG9pbnRlciBvbiBhbiBpbnRlZ2VyIGdpdmluZyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgaW5kaWNhdGlvbiAoYmV0d2VlbiAwLTEwMCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQgPQotICAgICAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggdWlQcm9ncmVzcyA9IDA7Ci0KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+bV9zdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgIC8vY2FzZSBNNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApIC8qIFZTUyAtPiBjcmVhdGluZyBlZmZlY3RzLCB0cmFuc2l0aW9ucyAuLi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBWc3NDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0U3RlcChwVnNzQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyICE9IE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU3RlcDogTTRWU1MzR1BQX2VkaXRTdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmbmRlZiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBzdGVwLCBjaGVjayB0aGUgdGVtcCBmaWxlIGlzIG5vdCB1c2Ugc29tZXdoZXJlIGVsc2UgYWZ0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBjbXBSZXN1bHQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBwVlNTQ29udGV4dC0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwVlNTQ29udGV4dC0+cENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKHZvaWQgKilwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgd2UgZm91bmQgYSBjb3JyZXNwb25kaW5nIGZpbGUsIHdlIGRvIG5vdCBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY21wUmVzdWx0ICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICp0b3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKnBUbXBTdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHJlc3VsdCBpbiBVVEY4IHRvIGNoZWNrIGlmIHdlIGNhbiBkZWxldGUgaXQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFN0ciA9IHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvID0gKE00T1NBX0NoYXIgKilzdHJzdHIoKGNvbnN0IGNoYXIgKilwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopInZpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTROT19FUlJPUiApIC8qIEl0IG1lYW5zIHRoZSBmaWxlIGlzIGEgdGVtcG9yYXJ5IGZpbGUsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gZGVsZXRlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qIERPX05PVF9SRU1PVkVfVEVNUF9GSUxFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciAgYmxybnhwc3cjMjM0LS0tPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyo8LS0tLSBGaXggZm9yICBibHJueHBzdyMyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIEF1ZGlvIG1peGluZyBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApIC8qIEF1ZGlvIG1peGluZzogbWl4L3JlcGxhY2UgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBCR00gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAocEF1ZGlvTWl4aW5nQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ01haW46IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHN0YXRlIGluIHN0ZXAgZnVuY3Rpb24gISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQICkgLyogUHRvM0dQUCwgYW5hbHlzaW5nIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OyAvKiBDdXJyZW50IFB0bzNHUFAgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBzdGVwIHRvIE1DUyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogQ2hhbmdlIEFuYWx5emluZyBtaWNybyBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSBjb252ZXJ0ZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuaW5nIFB0bzNHUFAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCApIC8qIFB0bzNHUFAsIGNvbnZlcnRpbmcgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9TdGVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzIGJhciAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQtPm1fTmJJbWFnZSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX0ltYWdlQ291bnRlciAqIDEwMCkgLyAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggZXJyICE9IE00Tk9fRVJST1IpICYmIChlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPIEJFIENIRUNLRUQgTk8gTEVBS1MgICEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00UFRPM0dQUF9TdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgPT0gKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFdlIGdvIGJhY2sgdG8gYW5hbHl6ZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV4dCBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZCByZWNvbnZlcnRpbmcgaXQgaWYgYW5vdGhlciBTZW5kQ29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qU1M6Ymxybnhwc3cjICAyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MgKSAvKiBNQ1M6IGFuYWx5emluZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIgaXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgTUNTIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoZXJlIGlzIG5vIG5leHQgaW1hZ2UgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rU3RhdGVPcGVuZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAvKiBFbmQgb2YgQW5hbHlzaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGZpbGUgaGFzIHRvIGJlIHRyYW5zY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBNQ1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCwgJnJvdGF0aW9uRGVncmVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT52aWRlb2NsaXBudW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXRzIGFyZSBkb25lIGluIHRoZSBNQ1MsIHNvIHdlIG5lZWQgdG8gcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJlZ2luQ3V0VGltZSBhbmQgZW5kQ3V0VGltZSB0byBrZWVwIHRoZSBlbnRpcmUgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUgPSAwOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOyBNQ1MgY29udGV4dDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGFpbiByb3RhdGlvbiBpbmZvIG9mIHRyaW1tZWQgLyB0cmFuc2NvZGVkIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUyApCi0gICAgICAgICAgICAgICAgICAgIC8qIE1DUzogdHJhbnNjb2RpbmcgZmlsZSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RlcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19zdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIE1DUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIgPT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOyAvKiBXZSBnbyBiYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZSBwYXJhbWV0ZXJzIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5leHQgZmlsZSB0byB0cmFuc2NvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhISovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIFRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMgY2FsbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgbWljcm8gc3RhdGUgaW4gYW5hbHl6aW5nIHN0YXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotZW5kX3N0ZXA6Ci0gICAgLyogQ29tcHV0ZSBwcm9ncmVzc2lvbiAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgKiAxMDApIFwKLSAgICAgICAgICAgIC8gKHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwpKQotICAgICAgICAgICAgKyAodWlQcm9ncmVzcyAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkpOwotCi0gICAgICAgIGlmKCAqcFByb2dyZXNzID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgLyogRGVwZW5kaW5nIG9mIHRoZSBzdGF0ZSwgZGlmZmVyZW50cyB0aGluZ3MgaGF2ZSB0byBiZSBkb25lICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlT3BlbmVkOgotICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0Nsb3NlQ29tbWFuZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8LS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZnJlZSB0aGlzIHBvaW50ZXIgb25seSBpZiBhIEJHTSB0cmFjayBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgb3ducyB0byB1cyAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgICAgICAvKmlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2ZWQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVBbmFseXppbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLS0tRml4IGZvciBibHJueHBzdyMyMzQ+Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBNQ1MgbW9kdWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00TUNTX2Fib3J0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0Nsb3NlQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLQotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6ZW50ZXJpbmciKTsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoXAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0NsZWFuVXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVVEYgY29udmVyc2lvbjogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbiApCi17Ci0gICAgLyogSnVzdCB1c2VkIGZvciBhIGdyZXAgaW4gY29kZSAqLwotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBzdGF0aWMgY29uc3QgTTRPU0FfQ2hhciBjVmVyc2lvblsyNl0gPSAiTlhQU1dfVmlkZW9TdHVkaW8yMV8xXzNfMCI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwVmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRfeFZTU19NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00X3hWU1NfTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNF94VlNTX1JFVklTSU9OOwotICAgIHBWZXJzaW9uLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogQ3JlYXRlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgLyplcnIgPSBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhwQ2xpcFNldHRpbmdzLCBwRmlsZSxuYkVmZmVjdHMpOyovCi0gICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIChuZWVkZWQgZm9yIFVURiAxNiBjb252ZXJzaW9uKSovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgbmJFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgY2xpcCBzZXR0aW5ncyB0byBkZWZhdWx0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlEdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYiA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzT3JpZyBpcyBOVUxMIik7Ci0KLSAgICAvKiBDYWxsIGluaGVyaXRlZCBWU1MzR1BQIGR1cGxpY2F0aW9uICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLCBiQ29weUVmZmVjdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIDpcCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIGluIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMsIC4uLikuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19GcmVlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIEZyZWUgaW5oZXJpdGVkIFZTUzNHUFAgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUgb3IKLSAqIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICptY3NDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19nZXRNQ1NDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlID09IE00eFZTU19rU3RhdGVJbml0aWFsaXplZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldE1DU0NvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqbWNzQ29udGV4dCA9IHhWU1NfY29udGV4dC0+cE1DU19DdHh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcgcHJldmlldwotICogICAgICAgICAgICAgIG9yIGJleW9uZAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICp2c3MzZ3BwQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IHBDb250ZXh0IGlzIE5VTEwiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPCBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqdnNzM2dwcENvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBDYWxsIHRoZSBkZWNvZGVyIGFwaSBkaXJlY3RseQotICAgIC8vIHRvIGdldCBhbGwgdGhlIHZpZGVvIGRlY29kZXIgY2FwYWJsaXRpZXMuCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGE2ZjQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfaW50ZXJuYWwuYwotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9ucyBvZiBleHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLQotLypmb3IgcmdiMTYgY29sb3IgZWZmZWN0Ki8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAgICAgICAgICAgIC8qKjwgdmlkZW8gZWZmZWN0cyAqLwotCi0vKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBvZiBWU1MgaXMgaW5jbHVkZWQgYmVjYXVzZSBvZiBNTVMgdXNlIGNhc2UgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKkV4aWYgaGVhZGVyIGZpbGVzIHRvIGFkZCBpbWFnZSByZW5kZXJpbmcgc3VwcG9ydCAoY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMpKi8KLSNpbmNsdWRlICJNNEVYSUZDX0NvbW1vbkFQSS5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotCi0vKiBQcm90b3R5cGUgb2YgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAgZnVuY3Rpb24gKGF2b2lkIGdyZWVuIGVmZmVjdCBvZiB0cmFuc3BhcmVuY3kgY29sb3IpICovCi1NNFZJRklfVUludDggTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLQotLypzcGVjaWFsIE1DUyBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gVmlkZW9BcnRpc3QgYW5kIFZpZGVvU3R1ZGlvIHRvIG9wZW4gdGhlIG1lZGlhIGluIHRoZSBub3JtYWwKLSBtb2RlLiBUaGF0IHdheSB0aGUgbWVkaWEgZHVyYXRpb24gaXMgYWNjdXJhdGUqLwotZXh0ZXJuIE00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBNQ1MgKDNHUCB0cmFuc2NvZGVyKSB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICogQG5vdGUgICAgICAgIFRoZSB0cmFuc2NvZGluZyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUyBjb250ZXh0LgotICogICAgICAgICAgICAgICAgVGhpcyBjb250ZXh0IGNvbnRhaW5zIGEgcG9pbnRlciBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICogICAgICAgICAgICAgICAgY2hhaW5lZCBsaXN0IG9mIE1DUyBwYXJhbWV0ZXJzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotICAgIE00TUNTX091dHB1dFBhcmFtcyBQYXJhbXM7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgUmF0ZXM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgY2xpcFByb3BzOwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgY2xpcCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgJmNsaXBQcm9wcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcm90YXRpb25EZWdyZWUgPSBjbGlwUHJvcHMudmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIE1DUyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICAgTUNTIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0ICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVUeXBlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0RmlsZVR5cGU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLm91dHB1dFZpZGVvUHJvZmlsZT0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbDsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIFBhcmFtcy5iQXVkaW9Nb25vID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+YkF1ZGlvTW9ubzsKLSAgICBQYXJhbXMucE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIC8qRkIgMjAwOC8xMC8yMDogYWRkIG1lZGlhIHJlbmRlcmluZyBwYXJhbWV0ZXIgdG8ga2VlcCBhc3BlY3QgcmF0aW8qLwotICAgIHN3aXRjaCh4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZykKLSAgICB7Ci0gICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rUmVzaXppbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0Nyb3BwaW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rQmxhY2tCb3JkZXJzOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyoqLwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotICAgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGVmZmVjdHM7IDAgZm9yIG5vdy4KLSAgICBQYXJhbXMubmJFZmZlY3RzID0gMDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLnBFZmZlY3RzID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJEaXNjYXJkRXhpZiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyBlZmZlY3Q7IG51bGwgZm9yIG5vdy4KLSAgICBQYXJhbXMuYkFkanVzdE9yaWVudGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCi0KLSAgICAvKioKLSAgICAgKiBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRPdXRwdXRQYXJhbXMobWNzX2NvbnRleHQsICZQYXJhbXMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19zZXRPdXRwdXRQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgUmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIFJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBSYXRlcy5CZWdpbkN1dFRpbWUgPSAwOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSAwOwotICAgIFJhdGVzLk91dHB1dEZpbGVTaXplID0gMDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+QmVnaW5DdXRUaW1lOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5FbmRDdXRUaW1lOwotICAgIFJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICBlcnIgPSBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhtY3NfY29udGV4dCwgJlJhdGVzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBNQ1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgTUNTIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCA9IG1jc19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgTUNTICgzR1AgdHJhbnNjb2RlcikKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IE00TUNTX2Nsb3NlKHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nOiBFcnJvciBpbiBNNE1DU19jbG9zZTogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgTUNTIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xlYW5VcDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSAqIEBicmllZiAgICBJdCBDb3ZlcnRzIGFuZCByZXNpemVzIGEgQVJHQjg4ODggaW1hZ2UgdG8gWVVWNDIwCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAgICAoSU4pIFRoZSBJbWFnZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQjg4ODggaW1hZ2UgIHdpbGwgYmUgY29udmVydGVkIGFuZCByZXNpemVkICB0byBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICpAcGFyYW0gICAgd2lkdGggICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0gKkBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiPSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhLgotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKLQotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDp3aWR0aCBhbmQgaGVpZ2h0ICVkICVkIiwKLSAgICAgICAgd2lkdGggLGhlaWdodCk7Ci0gICAgLyogR2V0IGZpbGUgc2l6ZSAobWFuZGF0b3J5IGZvciBjaHVuayBkZWNvZGluZykgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCi0gICAgICAgICAgICBDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4XAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgICByZ2JQbGFuZTEudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMS51X3RvcGxlZnQgPSAwOwotCi0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUxLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotCi0gICAgLyogVG8gQ2hlY2sgaWYgcmVzaXppbmcgaXMgcmVxdWlyZWQgd2l0aCBjb2xvciBjb252ZXJzaW9uICovCi0gICAgaWYod2lkdGggIT0gcEltYWdlUGxhbmVzLT51X3dpZHRoIHx8IGhlaWdodCAhPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZnJhbWVTaXplID0gICggcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDMpOwotICAgICAgICByZ2JQbGFuZTIucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyBSR0I4ODggdG8gUkdCODg4ICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBOTyAgUmVzaXppbmcgOiIpOwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSAgICB9Ci1jbGVhbnVwOgotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBsZWF2aW5nIDoiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICogQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICogQHBhcmFtICAgIGhlaWdodCAgICAgICAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqeXV2UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZih5dXZQbGFuZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCggcEZpbGVJbixwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2UGxhbmUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIHJldHVybiBlcnJvcjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgICpwSW1hZ2VQbGFuZXMgPSB5dXZQbGFuZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMCA6TGVhdmluZyIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgSXQgZmVlZHMgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4ICAgIGxhc3RfZnJhbWVfZmxhZyA9IDA7Ci0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqIHBDID0gKE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KikgKHBQaWN0dXJlQ3R4dCk7Ci0KLSAgICAvKlVzZWQgZm9yIHBhbiZ6b29tKi8KLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhhID0gMDsKLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhiID0gMDsKLSAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgIC8qKi8KLQotICAgIC8qVXNlZCBmb3IgY3JvcHBpbmcgYW5kIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgcFBpY3R1cmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgcGljdHVyZVNpemUgPSAwIDsKLSAgICBNNE9TQV9VSW50OCogICAgcGljdHVyZUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgLy9NNEVYSUZDX0NvbnRleHQgcEV4aWZDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVYSUZDX0Jhc2ljVGFncyBwQmFzaWNUYWdzOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczEgPSBwSW1hZ2VQbGFuZXNbMF07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMiA9IHBJbWFnZVBsYW5lc1sxXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMzID0gcEltYWdlUGxhbmVzWzJdOwotICAgIC8qKi8KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlQ3R4dCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBJbWFnZVBsYW5lcyksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcEltYWdlUGxhbmVzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlRHVyYXRpb24pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVEdXJhdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgOkVudGVyaW5nIik7Ci0gICAgLypQUiBQNE1FMDAwMDMxODEgSW4gY2FzZSB0aGUgaW1hZ2UgbnVtYmVyIGlzIDAsIHBhbiZ6b29tIGNhbiBub3QgYmUgdXNlZCovCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tICYmIHBDLT5tX05iSW1hZ2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKklmIG5vIGNyb3BwaW5nL2JsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGp1c3QgZGVjb2RlIGFuZCByZXNpemUgdGhlIHBpY3R1cmUqLwotICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgJiYgTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGFuZCByZXNpemUgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMTogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAocEMtPm1fRmlsZUluLAotICAgICAgICAgICAgIHBDLT5tX3BGaWxlUmVhZFB0ciwgcEltYWdlUGxhbmVzLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qSW4gY2FzZSBvZiBjcm9wcGluZywgYmxhY2sgYm9yZGVycyBvciBwYW4mem9vbSwgY2FsbCB0aGUgRVhJRiByZWFkZXIgYW5kIHRoZSBBSVIqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyByYXRpb3MgKi8KLSAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnZlcnQgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAyOiB3aWR0aCBhbmQgaGVnaHQgJWQgJWQiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwgcEMtPm1fcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICYocEMtPm1fcERlY29kZWRQbGFuZSkscEMtPm1fcFB0bzNHUFBwYXJhbXMtPndpZHRoLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZGVjb2RpbmcgSlBFRzogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjAgcGxhbmFyIGlzIHJldHVybmVkIGJ1dCBhbGxvY2F0aW9uIGlzIG1hZGUgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29udGlnb3VzIHBsYW5lcyBpbiBtZW1vcnkpICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEV4aWYgcGFyYW1zIHN0cnVjdHVyZSovCi0gICAgICAgIHBCYXNpY1RhZ3Mub3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOwotCi0gICAgICAgIC8qKgotICAgICAgICBQYW4mem9vbSBwYXJhbXMqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCi0gICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7Ci0gICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdGhlIHJhdGlvIGlzIG5vdCAwKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgKGEpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKyB0ZW1wUGFuem9vbVhhIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypNb2RpZnkgdGhlIChhKSBwYXJhbWV0ZXJzOiovCi0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypUaGUgbmV3IHJhdGlvIGlzIHRoZSBvcmlnaW5hbCBvbmUqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSB0ZW1wUGFuem9vbVhhOwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ2hlY2sgKGIpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiICsgdGVtcFBhbnpvb21YYiAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYikgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gdGVtcFBhbnpvb21YYjsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZXMgQUlSIHBhcmFtZXRlcnMgKi8KLS8qICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiIFwKLSAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gKi8KLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdXNpbmcgcEMtPm1fTmJJbWFnZSB3ZSBoYXZlIHRvIHVzZSAocEMtPm1fTmJJbWFnZS0xKSBhcyBwQy0+bV9JbWFnZUNvdW50ZXIKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgeC0xIG1heCBmb3IgeCBuby4gb2YgZnJhbWVzCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWJcCi0gICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgXAotICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoICsgUGFyYW1zLm1faW5wdXRDb29yZC5tX3gpXAotICAgICAgICAgICAgICAgICA+IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dENvb3JkLm1feDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV95KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3k7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpPj4xKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgIFNlY29uZGx5IHdpdGggcGFuJnpvb20qLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICAvKk5PIFJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCkgPD0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IGhlaWdodCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIGhlaWdodCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCBhbmQgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feSA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplV2lkdGggPSAodGVtcE91dHB1dFNpemVXaWR0aD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV94Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhbmQgbGVmdCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggLT0gKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgbGVmdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIGJlbG93IHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAvKlJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkgPCBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVIZWlnaHQgPSAodGVtcE91dHB1dFNpemVIZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW1hZ2Ugd2lkdGggKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZUhlaWdodE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBwYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCB3aWR0aCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZUhlaWdodCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IHdpZHRoIGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMCwgdGVtcEZpbmFsT3V0cHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0PSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoKSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAodGVtcElucHV0U2l6ZVdpZHRoTWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW50byB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplV2lkdGhNYXggPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHRvcCBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgYm90dG9tIG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplV2lkdGgqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIFBpY3R1cmUgcmVuZGVyaW5nOiBSZXNpemluZyBhbmQgQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyAhPSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKz0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZW1wSGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoPSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKz0gKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKE00T1NBX0ludDMyKSh0ZW1wV2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKLSAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcEMtPm1fcERlY29kZWRQbGFuZSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEltYWdlUGxhbmVzWzBdID0gcEltYWdlUGxhbmVzMTsKLSAgICAgICAgcEltYWdlUGxhbmVzWzFdID0gcEltYWdlUGxhbmVzMjsKLSAgICAgICAgcEltYWdlUGxhbmVzWzJdID0gcEltYWdlUGxhbmVzMzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgaW1hZ2UgY291bnRlciAqLwotICAgIHBDLT5tX0ltYWdlQ291bnRlcisrOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZW5kIG9mIHNlcXVlbmNlICovCi0gICAgbGFzdF9mcmFtZV9mbGFnICAgID0gKHBDLT5tX0ltYWdlQ291bnRlciA+PSBwQy0+bV9OYkltYWdlKTsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdGhlIHBpY3R1cmUgZHVyYXRpb24gKi8KLSAgICAqcFBpY3R1cmVEdXJhdGlvbiA9IHBDLT5tX3RpbWVEdXJhdGlvbjsKLQotICAgIGlmICgxID09IGxhc3RfZnJhbWVfZmxhZykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcERlY29kZWRQbGFuZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgUHRvM0dQUCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGUgIlBpY3R1cmVzIHRvIDNHUFAiIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGJ5IHRoZSBpbnRlcm5hbCB4VlNTCi0gKiAgICAgICAgICAgIGNvbnRleHQuIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudAotICogICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IG9mIFB0bzNHUFAgcGFyYW1ldGVycy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIGR1bW15IEFNUiBmaWxlIHVzZWQgdG8gYWRkIEFNUiBzaWxlbmNlIGluIGZpbGVzIGdlbmVyYXRlZAotICAgICBieSBQdG8zR1BQICovCi0gICAgI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0gICAgLyogVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oICovCi0gICAgZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4XAotICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0gICAgLyogQU1SIHNpbGVudCBmcmFtZSB1c2VkIHRvIGNvbXB1dGUgZHVtbXkgQU1SIHNpbGVuY2UgZmlsZSAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9IRUFERVJfU0laRSA2Ci0gICAgY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9IRUFERVJbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgeyAweDIzLCAweDIxLCAweDQxLCAweDRkLCAweDUyLCAweDBhIH07Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRQVE8zR1BQX0NvbnRleHQgcE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFBUTzNHUFBfUGFyYW1zIFBhcmFtczsKLSAgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgTTRPU0FfQm9vbCBjbXBSZXN1bHQ9TTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQ29udGV4dCBwRHVtbXlBTVJGaWxlOwotICAgIE00T1NBX0NoYXIgb3V0X2FtcltNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfSW5pdCggJnBNNFBUTzNHUFBfQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgJWxkXG4iLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwotICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy52aWRlb1Byb2ZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgUGFyYW1zLnZpZGVvTGV2ZWwgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgImR1bW15IiBhbXIgZmlsZSBjb250YWluaW5nIHNpbGVuY2UgaW4gdGVtcG9yYXJ5IGZvbGRlciAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgcERlY29kZWRQYXRoLCBNNE9TQV9rRmlsZVdyaXRlKTsKLQotICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24gc2VlIGFib3ZlKi8KLS8qICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+b3BlbldyaXRlKCZwRHVtbXlBTVJGaWxlLCBvdXRfYW1yLCBNNE9TQV9rRmlsZVdyaXRlKTsKLSAqLwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IG9wZW4gb3V0cHV0IGR1bW15IGFtciBmaWxlICVzLFwKLSAgICAgICAgICAgICBlcnJvcjogMHgleFxuIixvdXRfYW1yLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPndyaXRlRGF0YShwRHVtbXlBTVJGaWxlLAotICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9IRUFERVIsIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9JbnQ4KilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5jbG9zZVdyaXRlKHBEdW1teUFNUkZpbGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IGNsb3NlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAgd2l0aCB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAgICAgKiBQdG8zR1BQIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0IGFuZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID09IDApIHsKLSAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSAgICA9IE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljVG8zR1A6IHZpZGVvIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplICAgID0gTTRQVE8zR1BQX2tVTkxJTUlURUQ7Ci0gICAgUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgICAgPSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCAgICA9IHBDYWxsQmFja0N0eHQ7Ci0gICAgLypGQjogY2hhbmdlIHRvIHVzZSB0aGUgY29udmVydGVkIHBhdGggKFVURiBjb252ZXJzaW9uKSBzZWUgdGhlIGNvbnZlcnNpb24gYWJvdmUqLwotICAgIC8qRml4IDotIEFkZGluZyBBdWRpbyBUcmFjayBpbiBJbWFnZSBhcyBpbnB1dCA6QXVkaW9UYXJja0ZpbGUgU2V0dGluZyB0byBOVUxMICovCi0gICAgUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlICAgID0gTTRPU0FfTlVMTDsvLyhNNE9TQV9Wb2lkKilwRGVjb2RlZFBhdGg7Ly9vdXRfYW1yOwotICAgIFBhcmFtcy5BdWRpb1BhZGRpbmdNb2RlICAgICAgICA9IE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOwotICAgIFBhcmFtcy5BdWRpb0ZpbGVGb3JtYXQgICAgICAgID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjsKLSAgICBQYXJhbXMucE91dHB1dDNncHBGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZU91dDsKLSAgICBQYXJhbXMucFRlbXBvcmFyeUZpbGUgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcDsKLSAgICAvKitQUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgLypJbmNyZWFzaW5nIGZyZXF1ZW5jeSBvZiBGcmFtZSwgY2FsY3VsYXRpbmcgTm9zIG9mIEZyYW1lID0gZHVyYXRpb24gL0ZQUyAqLwotICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0FQSS5jIEAgbGluZSAzODQxIGluIE00eFZTU19TZW5kQ29tbWFuZCovCi0gICAgLypJZiBjYXNlIGNoZWNrIGZvciBQYW5ab29tIHJlbW92ZWQgKi8KLSAgICBQYXJhbXMuTmJWaWRlb0ZyYW1lcyAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgKHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5kdXJhdGlvbiBcCi0gICAgICAgICAgICAvIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGUpOyAvKiAqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fdGltZUR1cmF0aW9uICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmZyYW1lcmF0ZTsKLSAgICAvKi1QUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgcENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgICAgPSAwOwotICAgIHBDYWxsQmFja0N0eHQtPm1fRmlsZUluICAgICAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVJbjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgICAgICAgID0gUGFyYW1zLk5iVmlkZW9GcmFtZXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRmlsZVJlYWRQdHIgICAgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BEZWNvZGVkUGxhbmUgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcFB0bzNHUFBwYXJhbXMgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX2Fpcl9jb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX21lZGlhUmVuZGVyaW5nID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzICovCi0gICAgZXJyID0gTTRQVE8zR1BQX09wZW4ocE00UFRPM0dQUF9DdHh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKLSAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwotICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIFB0bzNHUFAgc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gcE00UFRPM0dQUF9DdHh0OwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IHBDYWxsQmFja0N0eHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBQdG8zR1BQCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE00UFRPM0dQUCBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00UFRPM0dQUF9DbGVhblVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncDpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgfQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uKi8KLS8qICAgIHJlbW92ZShvdXRfYW1yKTsKLSAqLwotCi0gICAgeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKLSAgICAgICAgICAgICpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciAqKVwKLSAgICAgICAgICAgICAgICAiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhIFwKLSAgICAgICAgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICAgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOlwKLSAgICAgICAgICAgICBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTZXRQbGFuZVRyYW5zcGFyZW50KE00T1NBX1VJbnQ4KiBwbGFuZUluLCBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9VSW50OCogcGxhbmUgPSBwbGFuZUluOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0gICAgZm9yKGk9MDsgaTwoc2l6ZT4+MSk7IGkrKykKLSAgICB7Ci0gICAgICAgICpwbGFuZSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSQkc4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgQVJHQjg4ODggaW5wdXQgZmlsZSAgdG8gWVVWNDIwIHdoZW51c2VkIGZvciBmcmFtbWluZyBlZmZlY3QKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBBUkdCODg4OCBmaWxlIHBhdGggaXMgY29udGFpbmVkIGluIHRoZSBwRWZmZWN0IHN0cnVjdHVyZQotICogICAgICAgICAgICBJZiB0aGUgQVJHQjg4ODggbXVzdCBiZSByZXNpemVkIHRvIGZpdCBvdXRwdXQgdmlkZW8gc2l6ZSwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICB3aWxsIGRvIGl0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRWZmZWN0ICAgICAgICAoSU4pIFRoZSBlZmZlY3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9ucyBvbgotICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB0byBkZWNvZGUsIHJlc2l6aW5nIC4uLgotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOL09VVCkgU3RydWN0dXJlIGluIHdoaWNoIHRoZSBvdXRwdXQgUkdCIHdpbGwgYmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqIEByZXR1cm4gICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IEZpbGUgbm90IGZvdW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00T1NBX1VJbnQzMiBmaWxlX3NpemU7Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBoZWlnaHQsIHdpZHRoX291dCwgaGVpZ2h0X291dDsKLSAgICBNNE9TQV9Wb2lkKiBwRmlsZSA9IHBFZmZlY3QtPnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGogPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0oZnJhbWluZ0N0eC0+d2lkdGggKiBmcmFtaW5nQ3R4LT5oZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQWxwaGFQZXJjZW50ID0gMDsKLSAgICBNNFZJRklfVUludDgqIFRlbXBQYWNEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MTYgKnB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IEVudGVyaW5nICIpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Qgd2lkdGggYW5kIGhlaWdodCAlZCAlZCAiLAotICAgICAgICBmcmFtaW5nQ3R4LT53aWR0aCxmcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopXAotICAgICAgICAiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSBmaWxlIHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICBwRGVjb2RlZFBhdGggPSBwRmlsZTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgcEZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotCi0gICAgIC8qIE9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSBhbmQgc3RvcmUgaXQgaW50byBtZW1vcnkgKi8KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCSW4sIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IGNsb3NlIGlucHV0IHBuZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZSwgZXJyKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+aGVpZ2h0OwotICAgIHJnYlBsYW5lLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT53aWR0aDsKLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMzsKLSAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgICIpOwotCi0gICAgLyogcHJlbXVsdGlwbGllZCBhbHBoYSAlIG9uIFJHQiAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpICs9IDQpIHsKLSAgICAgICAgLyogdGhpcyBpcyBhbHBoYSB2YWx1ZSAqLwotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wQWxwaGFQZXJjZW50ID0gcFRtcERhdGFbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSsxXTsKLSAgICAgICAgaisrOwotCi0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgaWYgKHRlbXBBbHBoYVBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0gZWxzZSB7LyogSW4gY2FzZSBvZiBhbHBoYSB2YWx1ZSAwLCBtYWtlIEdSRUVOIHRvIDI1NSAqLwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSAyNTU7IC8vcFRtcERhdGFbaSsyXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEIgKi8KLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzNdOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogY29udmVydCBSR0I4ODggdG8gUkdCNTY1ICovCi0KLSAgICAvKiBhbGxvY2F0ZSB0ZW1wIFJHQiA1NjUgYnVmZmVyICovCi0gICAgVGVtcFBhY0RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgKDQgKiAoZnJhbWluZ0N0eC0+d2lkdGggKyBmcmFtaW5nQ3R4LT5oZWlnaHQgKyAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICBpZiAoVGVtcFBhY0RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCBSR0I1NjUgZGF0YSIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0ciA9IChNNE9TQV9VSW50MTYgKilUZW1wUGFjRGF0YTsKLSAgICB6ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBqIDsgaSArPSAzKQotICAgIHsKLSAgICAgICAgcHRyW3orK10gPSBQQUNLX1JHQjU2NSgwLCAgIHJnYlBsYW5lLnBhY19kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbaSsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMl0pOwotICAgIH0KLQotICAgIC8qIGZyZWUgdGhlIFJCRzg4OCBhbmQgYXNzaWduIFJHQjU2NSAqLwotICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gVGVtcFBhY0RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBvdXRwdXQgc2l6ZXMgYXJlIG9kZCAqLwotICAgIGlmKHJnYlBsYW5lLnVfaGVpZ2h0ICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIG9kZCAgIik7Ci0gICAgICAgIG91dHB1dF9wYWNfZGF0YSArPXJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCoyOwotCi0gICAgICAgIGZvcihpPTA7aTxyZ2JQbGFuZS51X3dpZHRoO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGp1c3QgYWRkIGEgd2hpdGUgbGluZSB0byB0aGUgUE5HIHRoYXQgd2lsbCBiZSB0cmFuc3BhcmVudCAqLwotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCsrOwotICAgIH0KLSAgICBpZihyZ2JQbGFuZS51X3dpZHRoICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGFkZCBhIG5ldyBjb2x1bW4gb2Ygd2hpdGUgKD10cmFuc3BhcmVudCksIGJ1dCB3ZSBuZWVkIHRvIHBhcnNlIGFsbCBSR0IgbGluZXMgLi4uICovCi0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNFZJRklfVUludDgqIG5ld1JHQnBhY19kYXRhOwotICAgICAgICBNNFZJRklfVUludDgqIG91dHB1dF9wYWNfZGF0YSwgKmlucHV0X3BhY19kYXRhOwotCi0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGgrKzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBvdXRwdXQgd2lkdGggaXMgb2RkICAiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgUkdCIG91dHB1dCBidWZmZXIgaW4gd2hpY2ggYWxsIGRlY29kZWQgZGF0YQotICAgICAgICAgICsgd2hpdGUgbGluZSB3aWxsIGJlIGNvcGllZCAqLwotICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCi0gICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0X3BhY19kYXRhPSBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgaW5wdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV9oZWlnaHQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilvdXRwdXRfcGFjX2RhdGEsICh2b2lkICopaW5wdXRfcGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgIChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotCi0gICAgICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICAgICAgLyogUHV0IHRoZSBwaXhlbCB0byB0cmFuc3BhcmVuY3kgY29sb3IgKi8KLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLQotICAgICAgICAgICAgaW5wdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IG5ld1JHQnBhY19kYXRhOwotICAgIH0KLQotICAgIC8qIHJlc2V0IHN0cmlkZSAqLwotICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gcmdiUGxhbmUudV93aWR0aCoyOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBjaGFpbmVkIGxpc3QgcGFyYW1ldGVycyAqLwotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIC4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgLyoqCi0gICAgICogR2V0IG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KLSAgICAgc3dpdGNoKE91dHB1dFZpZGVvUmVzb2x1dGlvbikKLSAgICAvL3N3aXRjaCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpCi0gICAgewotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA5NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDE2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAzMjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMzUyOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gODAwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICB3aWR0aF9vdXQgPSA3MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDM2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDEyODA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgIHdpZHRoX291dCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgd2lkdGhfb3V0ID0gOTYwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgIHdpZHRoX291dCA9IDE5MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgLyoqCi0gICAgICogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSwKLSAgICAgKiBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhbHJlYWR5IGRvbmUgaW4gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgUkdCIGlmIG5lZWRlZCAqLwotICAgIGlmKChwRWZmZWN0LT54VlNTLmJSZXNpemUpICYmCi0gICAgICAgICAocmdiUGxhbmUudV93aWR0aCAhPSB3aWR0aF9vdXQgfHwgcmdiUGxhbmUudV9oZWlnaHQgIT0gaGVpZ2h0X291dCkpCi0gICAgewotICAgICAgICB3aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0X291dDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogXAotICAgICAgICAgICAgIE5ldyBXaWR0aCBhbmQgaGVpZ2h0ICVkICVkICAiLHdpZHRoLGhlaWdodCk7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBoZWlnaHRfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGhfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KmZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT51X3dpZHRoKjIqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwYWNfZGF0YSBSR0IiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBcCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBSZXNpemluZyBOZWVkZWQgIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgJiByZ2JQbGFuZS51X3dpZHRoICVkICVkIixyZ2JQbGFuZS51X2hlaWdodCxyZ2JQbGFuZS51X3dpZHRoKTsKLQotICAgICAgICAvL2VyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCA6XAotICAgICAgICAgICAgICAgIHdoZW4gcmVzaXppbmcgUkdCIHBsYW5lOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICAgICAgICBSZXNpemluZyBOb3QgTmVlZGVkICIpOwotCi0gICAgICAgIHdpZHRoID0gcmdiUGxhbmUudV93aWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gcmdiUGxhbmUudV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCoyOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IHJnYlBsYW5lLnBhY19kYXRhOwotICAgIH0KLQotCi0gICAgaWYocEVmZmVjdC0+eFZTUy5iUmVzaXplKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlIHRvcGxlZnQgdG8gMCBmb3IgcHVyZSBmcmFtaW5nIGVmZmVjdCAqLwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCAgUkdCIG91dHB1dCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICBlZmZlY3QgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEFsbG9jIGZvciBZLCBVIGFuZCBWIHBsYW5lcwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9ICgod2lkdGgrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICgoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgWSIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKCgoaGVpZ2h0KzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotCi0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSAgb3V0cHV0IFYiKTsKLSAgICBpZiAoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICBjb252ZXJ0IFJHQiB0byBZVVYgIik7Ci0KLSAgICAvL2VyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgZXJyID0gTTRWSUZJX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTUFMgcG5nOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBzZXQgc3BlY2lhbCB4VlNTIGVmZmVjdCBhcyBleHRlcm5hbCBlZmZlY3RzIGZvciB0aGUgVlNTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGksajsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVlNTIDNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0SW5pdCggJnBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOiBNNFZTUzNHUFBfZWRpdEluaXQgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqIHBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLmJBdWRpb01vbm8gPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCi0gICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0KLSAgICAgICAgcFZTU0NvbnRleHQtPmJJc01NUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT51aU1NU1ZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlOwotICAgICAgICBwVlNTQ29udGV4dC0+TU1TdmlkZW9GcmFtZXJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLypXYXJuaW5nOiBzaW5jZSB0aGUgYWRkaW5nIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgcFNldHRpbmdzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIG5leHQKLSAgICBwYXJ0IGluICBwQ3VycmVudEVkaXRTZXR0aW5ncyAodGhlcmUgaXMgYSBzcGVjaWZpYyBjdXJyZW50IGVkaXRpbmcgc3RydWN0dXJlIGZvciB0aGUgc2F2aW5nLAotICAgICBhcyBmb3IgdGhlIHByZXZpZXcpKi8KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucywgZm9yIHNhdmluZyBtb2RlICh0byBiZSBtb3ZlZCB0bwotICAgICAgTTR4VlNTX3NhdmVTdGFydCgpID8pKi8KLSAgICBmb3IgKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaj0wOyBqPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPm5iRWZmZWN0czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9PQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZTsKLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAgICBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazsgLyoqPCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYTsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnJhbWluZyBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOwotICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbjsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dDsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OwotICAgICAgICAgICAgICAgIC8qKjwgd2UgZG9uJ3QgdXNlIGFueSBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgVlNTIDNHUFAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdE9wZW4ocFZzc0N0eHQsIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0T3BlbiByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIFZTUyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2xvc2UgLyBmcmVlIFZTUyBsYXRlciAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IHBWc3NDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2UgdGhlIFZTUyAzR1BQICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocFZzc0N0eHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0aGlzIFZTUzNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZTogXAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgYXVkaW8gbWl4aW5nCi0gKiBAbm90ZSAgICBJdCB0YWtlcyBpdHMgcGFyYW1ldGVycyBmcm9tIHRoZSBCR00gc2V0dGluZ3MgaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqCi0gKiBGQjogdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHNhdmluZyBpcyBub3cgdGhlCi0gKiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgYW5kIG5vdCB0aGUgcFNldHRpbmdzCi0gKiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIFVURiBzdXBwb3J0Ci0gKiBBbGwgdGhlICJ4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MiCi0gKioqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzOwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcEF1ZGlvTWl4aW5nQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikicEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBpZihwQXVkaW9NaXhTZXR0aW5ncyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZSA9PQotICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgewotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKChNNE9TQV9Db250ZXh0KXhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBhdWRpbyBCR00gcHJvcGVydGllcyAtPlwKLSAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RpbmcgYXVkaW8gYmFja2dyb3VuZCBtdXNpYyIsIGVycik7Ci0gICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KzE7Ci0gICAgICAgICAgICAgICAgICAvKiBUbyBmb3JjZSBCR00gZW5jb2RpbmcgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9GQUxTRTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wQWRkZWRBdWRpb1RyYWNrRmlsZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QVNGID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlOdW1DaGFubmVscyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlOdW1DaGFubmVsczsKLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJfRHVja2luZ05lZWRlZWQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZCVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0ICl4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+bG93Vm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+ZlBUVm9sTGV2ZWwgPQotICAgICAoTTRPU0FfRmxvYXQpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlBUVm9sTGV2ZWwvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5iTG9vcCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ykxvb3A7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyA9IDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBhdWRpbyBtaXggc2V0dGluZ3Mgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT51aUJlZ2luTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlFbmRMb29wID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgd2lsbCBiZSBmaW5hbCBmaWxlIChhdWRpbyBtaXhpbmcgaXMgdGhlIGxhc3Qgc3RlcCkgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE91dHB1dENsaXBGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgaXMgYSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIGFsbCBhdWRpby92aWRlbyBlZGl0aW9ucyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wT3JpZ2luYWxDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgc2V0dGluZ3MgcG9pbnRlciB0byBiZSBhYmxlIHRvIGZyZWUgaXQgaW4KLSAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoJnBBdWRpb01peGluZ0N0eHQsIHBBdWRpb01peFNldHRpbmdzLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBhdWRpbyBtaXhpbmcgc3RlcCBmdW5jdGlvbiBpbgotICAgICAgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBwQXVkaW9NaXhpbmdDdHh0OwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0IHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgLy9NNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKHBBdWRpb01peGluZ0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBWU1MgYXVkaW8gbWl4aW5nIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBwcmV2aWV3IGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgcHJldmlldy4zZ3AgZmlsZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZyZWUgdGhlIHByZXZpZXcgc3RydWN0dXJlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRlbXBvcmFyeSBwcmV2aWV3IGZpbGUgcGF0aCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgcHJldmlldyBlZmZlY3RzIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBzYXZpbmcgZWRpdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZQotICogICAgICAgICAgICBvdXRwdXQuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICBpZihpICE9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgb3V0cHV0IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjdXJyZW50IGVkaXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFuIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAoSU4pIFBvaW50ZXIgb24gTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gZnJlZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi17Ci0gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVhY2ggY2xpcCAuLi4gKi8KLSAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgY2xpcCBzZXR0aW5ncyAqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBpZihpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZS0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9aSsxO2o8cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcCBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUkM6IEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRm9yIGVhY2ggY2xpcCwgZnJlZSBmcmFtaW5nIHN0cnVjdHVyZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZwotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4X3NhdmU7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmczMTAyU3RydWN0KiBmcmFtaW5nQ3R4X2ZpcnN0ID0gZnJhbWluZ0N0eDsKLSNlbmRpZgotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4ICE9IE00T1NBX05VTEwpIC8qIEJ1Z2ZpeCAxLjIuMDogY3Jhc2gsIHRyeWluZyB0byBmcmVlIG5vbiBleGlzdGFudAotICAgICAgICAgICAgICAgICBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24KLSAgICAgICAgICAgICAgICAgICAgZXhpc3RhbnQgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYnVnIGZpeCBQNE1FMDAwMDMwMDIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlKGZyYW1pbmdDdHhfZmlyc3QgIT0gZnJhbWluZ0N0eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIEZpZnRpZXMgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBGaWZ0aWVzQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihGaWZ0aWVzQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwotICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEZyZWUgQ29sb3IgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLQotICAgICAgICAgICAgICAgIGlmKENvbG9yQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKENvbG9yQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRnJlZSBzaW1wbGUgZmllbGRzICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0vLyAgICBNNE9TQV9VSW50OCBpLGo7Ci0KLSAgICAvKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtc19zYXV2OwotCi0gICAgICAgIHdoaWxlKHBQYXJhbXMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0jZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXQgYWxsIGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgPSAwOwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCA9IDA7Ci0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcEZpbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgcHJvcGVydGllcyBvZiBhbiBpbnB1dCAzR1AgZmlsZSB1c2luZyBNQ1MKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZSAgICAgICAgICAgIChJTikgM0dQIGZpbGUgdG8gYW5hbHlzZQotICogQHBhcmFtICAgIHBGaWxlUHJvcGVydGllcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIGEgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgM0dQIGZpbGUgcHJvcGVydGllcwotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qb3BlbiB0aGUgTUNTIGluIHRoZSAibm9ybWFsIG9wZW5pbmciIG1vZGUgdG8gcmV0cmlldmUgdGhlIGV4YWN0IGR1cmF0aW9uKi8KLSAgICBlcnIgPSBNNE1DU19vcGVuX25vcm1hbE1vZGUobWNzX2NvbnRleHQsIHBGaWxlLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCwKLSAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0FfTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllczogRXJyb3IgaW4gTTRNQ1NfYWJvcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZSB0YXJnZXRlZCB0aW1lIHNjYWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBUYXJnZXRlZFRpbWVTY2FsZSAgICAoT1VUKSAgICBUYXJnZXRlZCB0aW1lIHNjYWxlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDggaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBUaW1lU2NhbGUgPSAwLCB0ZW1wRHVyYXRpb24gPSAwOwotCi0gICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykKLSAgICB7Ci0gICAgICAgIC8qc2VhcmNoIHRpbWVzY2FsZSBvbmx5IGluIG1wZWc0IGNhc2UqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0KLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0luaXQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkVuZCBvZiB0aGUgY29udmVyc2lvbjogdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgLypnZXQgaW5wdXQgZmlsZSBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZTpcCi0gICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzIHJldHVybmVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWVTY2FsZSA9IGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRHVyYXRpb24gPSAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkKLSAgICAgICAgewotICAgICAgICAgICAgLyp0aGUgdGltZXNjYWxlIGlzIDMwIGZvciBQVE8zR1AqLwotICAgICAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHRlbXBUaW1lU2NhbGUgPj0gMzApLypEZWZpbmUgYSBtaW5pbXVtIHRpbWUgc2NhbGUsIG90aGVyd2lzZSBpZiB0aGUgdGltZXNjYWxlIGlzIG5vdAotICAgIGVub3VnaCwgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzaGVsbCBlbmNvZGVyKi8KLSAgICB7Ci0gICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSB0ZW1wVGltZVNjYWxlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gMzA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsIChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKkZCKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgLyplbmQgRkIqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPVwKLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilcCi0gICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgXAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXAotICAgICAgICAgICAgICAgICAgICAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdClcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCAvIDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogQ2hlY2sgdGhlIGlucHV0cyAoZGVidWcgb25seSkgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBfRmlmdGllc0RhdGEgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfRmlmdGllc0RhdGEgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQbGFuZU91dCA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAieFZTUzogcF9QbGFuZU91dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFByb2dyZXNzID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInhWU1M6IHBfUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpXAotICAgICAgICAgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgXAotICAgICAgICAgICAgICAgICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSggKQotICogQGJyaWVmICAgIFpvb20gaW4vb3V0IHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgdmlkZW8gZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSBpcyBzZXQgdG8KLSAqIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiBvciBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSkKLXsKLSAgICBNNE9TQV9VSW50MzIgYm94V2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIGJveEhlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWTsKLSAgICBNNE9TQV9VSW50MzIgcmF0aW8gPSAwOwotICAgIC8qICAqIDEuMTg5MjA3IGJldHdlZW4gcmF0aW8gKi8KLSAgICAvKiB6b29tIGJldHdlZW4geDEgYW5kIHgxNiAqLwotICAgIE00T1NBX1VJbnQzMiByYXRpb3RhYlsxN10gPXsxMDI0LDEyMTgsMTQ0OCwxNzIyLDIwNDgsMjQzNSwyODk2LDM0NDQsNDA5Niw0ODcxLDU3OTMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODg5LDgxOTIsOTc0MiwxMTU4NSwxMzc3NywxNjM4NH07Ci0gICAgTTRPU0FfVUludDMyIGlrOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgYm94UGxhbmVbM107Ci0KLSAgICBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09IChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxNiAtICgxNSAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgcmF0aW8gPSAxNiAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0gICAgZWxzZSBpZihNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tSW4gPT0gKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgIHsKLSAgICAgICAgLy9yYXRpbyA9IDEgKyAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMSArIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0KLSAgICBmb3IoaWs9MDtpazwzO2lrKyspewotCi0gICAgICAgIGJveFBsYW5lW2lrXS51X3N0cmlkZSA9IHBJbnB1dFBsYW5lc1tpa10udV9zdHJpZGU7Ci0gICAgICAgIGJveFBsYW5lW2lrXS5wYWNfZGF0YSA9IHBJbnB1dFBsYW5lc1tpa10ucGFjX2RhdGE7Ci0KLSAgICAgICAgYm94SGVpZ2h0ID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0IDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFdpZHRoID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPDwgMTAgKSAvIHJhdGlvdGFiW3JhdGlvXTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfaGVpZ2h0ID0gKGJveEhlaWdodCkmKH4xKTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfd2lkdGggPSAoYm94V2lkdGgpJih+MSk7Ci0KLSAgICAgICAgYm94UG9zWSA9IChwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0ID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X2hlaWdodCA+PiAxKTsKLSAgICAgICAgYm94UG9zWCA9IChwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPj4gMSkgLSAoYm94UGxhbmVbaWtdLnVfd2lkdGggPj4gMSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3RvcGxlZnQgPSBib3hQb3NZICogYm94UGxhbmVbaWtdLnVfc3RyaWRlICsgYm94UG9zWDsKLSAgICB9Ci0KLSAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCAoTTRWSUZJX0ltYWdlUGxhbmUqKSZib3hQbGFuZSwgcE91dHB1dFBsYW5lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gKi8KLSAgICByZXR1cm4oTTROT19FUlJPUik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgdXNlckRhdGEgICAgICAgIChJTikgQ29udGFpbnMgYSBwb2ludGVyIG9uIGEgc2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgUGxhbmVJbjEgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDEKLSAqIEBwYXJhbSAgICBQbGFuZUluMiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlUcmFuc2l0aW9uS2luZChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKiBhbHBoYUNvbnRleHQ7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwbGFuZXN3YXA7Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgYWxwaGFDb250ZXh0ID0gKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXVzZXJEYXRhOwotCi0gICAgYWxwaGFQcm9ncmVzc0xldmVsID0gKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAqIDEyOCkvMTAwMDsKLQotICAgIGlmKCBhbHBoYUNvbnRleHQtPmlzcmV2ZXJzZSAhPSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IDEyOCAtIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLSAgICAgICAgcGxhbmVzd2FwID0gUGxhbmVJbjE7Ci0gICAgICAgIFBsYW5lSW4xID0gUGxhbmVJbjI7Ci0gICAgICAgIFBsYW5lSW4yID0gcGxhbmVzd2FwOwotICAgIH0KLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgYWxwaGFNYXNrID0gYWxwaGFDb250ZXh0LT5wUGxhbmUtPnBhY19kYXRhOwotCi0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBwX2luMV9ZID0gUGxhbmVJbjFbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfVSA9IFBsYW5lSW4xWzFdLnBhY19kYXRhOwotICAgIHBfaW4xX1YgPSBQbGFuZUluMVsyXS5wYWNfZGF0YTsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIHBfaW4yX1kgPSBQbGFuZUluMlswXS5wYWNfZGF0YTsKLSAgICBwX2luMl9VID0gUGxhbmVJbjJbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfViA9IFBsYW5lSW4yWzJdLnBhY19kYXRhOwotCi0gICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNvbHVtbiAuLi4gKi8KLSAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGFuZCBlYWNoIHJvdyBvZiB0aGUgYWxwaGEgbWFzayAqLwotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgb2YgdGhlIGFscGhhIG1hc2sgaXMgPiB0byB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICAgICAgKiAoIGN1cnJlbnQgdGltZSBpcyBub3JtYWxpemVkIG9uIFswLTI1NV0gKSAqLwotICAgICAgICAgICAgaWYoIGFscGhhUHJvZ3Jlc3NMZXZlbCA8IGFscGhhTWFza1t4K3kqUGxhbmVPdXQtPnVfd2lkdGhdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBrZWVwICJvbGQgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjFfWSt4K3kqUGxhbmVJbjFbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1pbjsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZExldmVsTWF4OwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kUmFuZ2U7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotICAgIE00VklGSV9JbnQzMiBhbHBoYU1hc2tWYWx1ZTsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotICAgIE00VklGSV9VSW50OCAqYWxwaGFNYXNrOwotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1Y7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4yX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVjsKLQotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNaW4gPSBhbHBoYVByb2dyZXNzTGV2ZWwtYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRMZXZlbE1heCA9IGFscGhhUHJvZ3Jlc3NMZXZlbCthbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkOwotCi0gICAgYWxwaGFCbGVuZFJhbmdlID0gKGFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQpKjI7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgIC8qIGFwcGx5IEFscGhhIE1hZ2ljIG9uIGVhY2ggcGl4ZWwgKi8KLSAgICAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYWxwaGFNYXNrVmFsdWUgPSBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXTsKLSAgICAgICAgICAgIGlmKCBhbHBoYUJsZW5kTGV2ZWxNYXggPCBhbHBoYU1hc2tWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIChhbHBoYUJsZW5kTGV2ZWxNaW4gPCBhbHBoYU1hc2tWYWx1ZSkmJgotICAgICAgICAgICAgICAgICAgICAoYWxwaGFNYXNrVmFsdWUgPD0gYWxwaGFCbGVuZExldmVsTWF4ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGJsZW5kICJvbGQgYW5kIG5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KE00VklGSV9VSW50OCkKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4yX1kreCt5KlBsYW5lSW4yWzBdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oTTRWSUZJX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMVsxXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhhbHBoYUJsZW5kTGV2ZWxNYXgtYWxwaGFNYXNrVmFsdWUpKiggKihwX2luMl9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsxXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbilcCi0gICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVisoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBsYW5lSW4yWzJdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotI2RlZmluZSBNNFhYWF9TYW1wbGVBZGRyZXNzKHBsYW5lLCB4LCB5KSAgKCAocGxhbmUpLnBhY19kYXRhICsgKHBsYW5lKS51X3RvcGxlZnQgKyAoeSlcCi0gICAgICogKHBsYW5lKS51X3N0cmlkZSArICh4KSApCi0KLXN0YXRpYyB2b2lkIE00WFhYX0NvcHlQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogZGVzdCwgTTRWSUZJX0ltYWdlUGxhbmUqIHNvdXJjZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgIE00T1NBX01lbUFkZHI4ICAgIHNvdXJjZVdhbGssIGRlc3RXYWxrOwotCi0gICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICBoZWlnaHQgPSBkZXN0LT51X2hlaWdodDsKLSAgICB3aWR0aCA9IGRlc3QtPnVfd2lkdGg7Ci0KLSAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKnNvdXJjZSwgMCwgMCk7Ci0gICAgc291cmNlU3RyaWRlID0gc291cmNlLT51X3N0cmlkZTsKLQotICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKmRlc3QsIDAsIDApOwotICAgIGRlc3RTdHJpZGUgPSBkZXN0LT51X3N0cmlkZTsKLQotICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiB0b3BQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBib3R0b21QbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICB0b3BQYXJ0SGVpZ2h0LCBib3R0b21QYXJ0SGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgICAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkIGFuZAotICAgICAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICAgICAgaWYgKDAgPT0gaSkgLyogWSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21QYXJ0SGVpZ2h0ID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wUGFydEhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0IC0gYm90dG9tUGFydEhlaWdodDsKLSAgICAgICAgd2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoOwotCi0gICAgICAgIHNvdXJjZVdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyh0b3BQbGFuZVtpXSwgMCwgYm90dG9tUGFydEhlaWdodCk7Ci0gICAgICAgIHNvdXJjZVN0cmlkZSA9IHRvcFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogRmlyc3QgdGhlIHBhcnQgZnJvbSB0aGUgdG9wIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBmb3IgKHk9MDsgeTx0b3BQYXJ0SGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFuZCBub3cgY2hhbmdlIHRoZSB2YXJzIHRvIGNvcHkgdGhlIHBhcnQgZnJvbSB0aGUgYm90dG9tIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoYm90dG9tUGxhbmVbaV0sIDAsIDApOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSBib3R0b21QbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBkZXN0V2FsayBpcyBhbHJlYWR5IGF0IE00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIHRvcFBhcnRIZWlnaHQpICovCi0KLSAgICAgICAgZm9yICh5PTA7IHk8Ym90dG9tUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oTTRWSUZJX0ltYWdlUGxhbmUqIGxlZnRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHJpZ2h0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVYpCi17Ci0gICAgTTRPU0FfVUludDMyIGksIHk7Ci0gICAgLyogSWYgd2Ugc2hpZnRlZCBieSBleGFjdGx5IDAsIG9yIGJ5IHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGltYWdlLCB0aGVuIHdlIHdvdWxkIGdldCB0aGUgbGVmdAotICAgIGZyYW1lIG9yIHRoZSByaWdodCBmcmFtZSwgcmVzcGVjdGl2ZWx5LiBUaGVzZSBjYXNlcyBhcmVuJ3QgaGFuZGxlZCB0b28gd2VsbCBieSB0aGUgZ2VuZXJhbAotICAgIGhhbmRsaW5nLCBzaW5jZSB0aGV5IHJlc3VsdCBpbiAwLXNpemUgbWVtY29waWVzLCBzbyBtaWdodCBhcyB3ZWxsIHBhcnRpY3VsYXJpemUgdGhlbS4gKi8KLQotICAgIGlmICgwID09IHNoaWZ0VVYpICAgIC8qIG91dHB1dCBsZWZ0IGZyYW1lICovCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgLyogZm9yIGVhY2ggWVVWIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00WFhYX0NvcHlQbGFuZSgmKFBsYW5lT3V0W2ldKSwgJihsZWZ0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChQbGFuZU91dFsxXS51X3dpZHRoID09IHNoaWZ0VVYpIC8qIG91dHB1dCByaWdodCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYocmlnaHRQbGFuZVtpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBEbyB0aHJlZSBsb29wcywgb25lIGZvciBlYWNoIHBsYW5lIHR5cGUsIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBidWZmZXJzCi0gICAgImhvdCIgYXQgdGhlIHNhbWUgdGltZSAoYmV0dGVyIGZvciBjYWNoZSkuICovCi0gICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgbGVmdFBhcnRXaWR0aCwgcmlnaHRQYXJ0V2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBsZWZ0U3RyaWRlLCAgICByaWdodFN0cmlkZSwgICAgZGVzdFN0cmlkZTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgbGVmdFdhbGssICAgIHJpZ2h0V2FsaywgICAgZGVzdFdhbGtMZWZ0LCBkZXN0V2Fsa1JpZ2h0OwotCi0gICAgICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQKLSAgICAgICAgYW5kIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0OwotCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSAyKnNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodFBhcnRXaWR0aCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFBhcnRXaWR0aCA9IFBsYW5lT3V0W2ldLnVfd2lkdGggLSByaWdodFBhcnRXaWR0aDsKLQotICAgICAgICBsZWZ0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGxlZnRQbGFuZVtpXSwgcmlnaHRQYXJ0V2lkdGgsIDApOwotICAgICAgICBsZWZ0U3RyaWRlID0gbGVmdFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIHJpZ2h0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKHJpZ2h0UGxhbmVbaV0sIDAsIDApOwotICAgICAgICByaWdodFN0cmlkZSA9IHJpZ2h0UGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZGVzdFdhbGtMZWZ0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0V2Fsa1JpZ2h0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIGxlZnRQYXJ0V2lkdGgsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrTGVmdCwgKHZvaWQgKilsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ0V2FsayArPSBsZWZ0U3RyaWRlOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwotCi0gICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIGRlc3RXYWxrUmlnaHQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyogc2V0dGluZ3MgPQotICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyopdXNlckRhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVY7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiaW5zaWRlIE00eFZTU19TbGlkZVRyYW5zaXRpb24iKTsKLSAgICBpZiAoKE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgfHwgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikgKQotICAgIHsKLSAgICAgICAgLyogaG9yaXpvbnRhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV93aWR0aCAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19TbGlkZVRyYW5zaXRpb24gdXBwZXI6IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIiwKLSAgICAgICAgICAgIHNoaWZ0VVYscFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSByaWdodCwgdGhlIG5leHQgY2xpcCBmcmFtZSBsZWZ0LCBhbmQgcmV2ZXJzZSBzaGlmdFVWCi0gICAgICAgICAgICAoc2luY2UgaXQncyBhIHNoaWZ0IGZyb20gdGhlIGxlZnQgZnJhbWUpIHNvIHRoYXQgd2Ugc3RhcnQgb3V0IG9uIHRoZSByaWdodAotICAgICAgICAgICAgKGkuZS4gbm90IGxlZnQpIGZyYW1lLCBpdAotICAgICAgICAgICAgYmVpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2xpcC4gKi8KLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMiwgUGxhbmVJbjEsIFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfd2lkdGggLSBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIExlZnQgb3V0LCByaWdodCBpbiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiB2ZXJ0aWNhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV9oZWlnaHQgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIGJvdHRvbTogc2hpZnRVViA9ICVkLHByb2dyZXNzID0gJWQiLHNoaWZ0VVYsCi0gICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKTsKLSAgICAgICAgaWYgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHV0IHRoZSBwcmV2aW91cyBjbGlwIGZyYW1lIHRvcCwgdGhlIG5leHQgY2xpcCBmcmFtZSBib3R0b20uICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4xLCBQbGFuZUluMiwgUGxhbmVPdXQsIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQm90dG9tIG91dCwgdG9wIGluICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfVmVydGljYWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0IC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nLCBzZWUgaWYgZGltZW5zaW9ucyBtYXRjaCwgZXRjLiwKLSAgICBhdCBsZWFzdCBpbiBkZWJ1ZyBtb2RlLiAqLwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgZmFkZSB0byBibGFjayBhbmQgdGhlbiBhIGZhZGUgZnJvbSBibGFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00T1NBX0ludDMyIHRtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLQotICAgIGlmKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpIDwgNTAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKDEuMCAtICgoTTRPU0FfRmxvYXQpKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyoyKS8xMDAwKSkgKiAxMDI0ICk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0ICovCi0gICAgICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjEsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgZXJyb3IgMHgleCwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCAoKChNNE9TQV9GbG9hdCkoKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MtNTAwKSoyKSkvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjIsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gdGhlIGN1c3RvbWVyIGZvcm1hdCB0byBVVEY4Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjggdG8gdGhlIGN1c3RvbWVyIGZvcm1hdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLQotICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdFwKLSAgICAgICAgICAgICgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgIGlmKGVyciA9PSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKmRlY29kZWQgcGF0aCovCi0gICAgICAgIHBCdWZmZXJPdXQgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgKCpjb252ZXJ0ZWRTaXplKSA9IENvbnZlcnRlZFNpemU7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTEyOWMzYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiQXVkaW9NaXhlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yUmVzYW1wbGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotCi0gICAgcHVibGljOgotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcik7Ci0KLSAgICBlbnVtIHsgLy9TYW1wbGluZyBmcmVxCi0gICAgIGtGcmVxODAwMEh6ID0gODAwMCwKLSAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAga0ZyZXE0NDEwMCA9IDQ0MTAwLAotICAgICBrRnJlcTQ4MDAwID0gNDgwMDAsCi0gICAgfTsKLQotICAgIEF1ZGlvUmVzYW1wbGVyICptUmVzYW1wbGVyOwotICAgIGludDE2X3QqIG1JbnB1dDsKLSAgICBpbnQgbmJDaGFubmVsczsKLSAgICBpbnQgbmJTYW1wbGVzOwotICAgIE00T1NBX0ludDMyIG91dFNhbXBsaW5nUmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBpblNhbXBsaW5nUmF0ZTsKLQotICAgIGludDE2X3QgKm1UbXBJbkJ1ZmZlcjsKLX07Ci0KLSNkZWZpbmUgTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OIDQwIC8vbXMKLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JSZXNhbXBsZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykgewotCi0gICAgdWludDMyX3QgZGF0YVNpemUgPSBwQnVmZmVyLT5mcmFtZUNvdW50ICogdGhpcy0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtVG1wSW5CdWZmZXIgPSAoaW50MTZfdCopbWFsbG9jKGRhdGFTaXplKTsKLSAgICBtZW1jcHkobVRtcEluQnVmZmVyLCB0aGlzLT5tSW5wdXQsIGRhdGFTaXplKTsKLSAgICBwQnVmZmVyLT5yYXcgPSAodm9pZCopbVRtcEluQnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikgewotCi0gICAgaWYocEJ1ZmZlci0+cmF3ICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgICAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOwotICAgICAgICBtVG1wSW5CdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0NvbnRleHQgIExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoTTRPU0FfSW50MzIgYml0RGVwdGgsIE00T1NBX0ludDMyIGluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHNhbXBsZVJhdGUsIE00T1NBX0ludDMyIHF1YWxpdHkpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0gbmV3IFZpZGVvRWRpdG9yUmVzYW1wbGVyKCk7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgIGJpdERlcHRoLCBpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7Ci0gICAgaWYgKGNvbnRleHQtPm1SZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShhbmRyb2lkOjpWaWRlb0VkaXRvclJlc2FtcGxlcjo6a0ZyZXEzMjAwMEh6KTsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUoMHgxMDAwLCAweDEwMDApOwotICAgIGNvbnRleHQtPm5iQ2hhbm5lbHMgPSBpbkNoYW5uZWxDb3VudDsKLSAgICBjb250ZXh0LT5vdXRTYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7Ci0gICAgY29udGV4dC0+bVRtcEluQnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiAoKE00T1NBX0NvbnRleHQgKWNvbnRleHQpOwotfQotCi0KLXZvaWQgTFZBdWRpb3NldFNhbXBsZVJhdGUoTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0LCBNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpblNhbXBsZVJhdGUpOwotICAgIC8qCi0gICAgICogbmJTYW1wbGVzIGlzIGNhbGN1bGF0ZWQgZm9yIDQwbXMgd29ydGggb2YgZGF0YTtoZW5jZSBzYW1wbGUgcmF0ZQotICAgICAqIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuYlNhbXBsZXMKLSAgICAgKi8KLSAgICBjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSA9IGluU2FtcGxlUmF0ZTsKLSAgICAvLyBBbGxvY2F0ZSBidWZmZXIgZm9yIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygc2FtcGxlcy4KLSAgICBjb250ZXh0LT5tSW5wdXQgPSAoaW50MTZfdCopbWFsbG9jKCAoaW5TYW1wbGVSYXRlICogTUFYX1NBTVBMRURVUkFUSU9OX0ZPUl9DT05WRVJUSU9OICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+bmJDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkgLyAxMDAwKTsKLX0KLQotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFZvbHVtZShsZWZ0LHJpZ2h0KTsKLX0KLQotdm9pZCBMVkRlc3Ryb3koTTRPU0FfQ29udGV4dCByZXNhbXBsZXJDb250ZXh0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLQotICAgIGlmIChjb250ZXh0LT5tVG1wSW5CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKGNvbnRleHQtPm1UbXBJbkJ1ZmZlcik7Ci0gICAgICAgIGNvbnRleHQtPm1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQtPm1JbnB1dCAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUoY29udGV4dC0+bUlucHV0KTsKLSAgICAgICAgY29udGV4dC0+bUlucHV0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dC0+bVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0LT5tUmVzYW1wbGVyOwotICAgICAgICBjb250ZXh0LT5tUmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjb250ZXh0OwotICAgICAgICBjb250ZXh0ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBpbnQzMl90ICpwVG1wQnVmZmVyID0gTlVMTDsKLQotICAgIGNvbnRleHQtPm5iU2FtcGxlcyA9IChjb250ZXh0LT5pblNhbXBsaW5nUmF0ZSAqIG91dEZyYW1lQ291bnQpIC8gY29udGV4dC0+b3V0U2FtcGxpbmdSYXRlOwotICAgIG1lbWNweShjb250ZXh0LT5tSW5wdXQsaW5wdXQsKGNvbnRleHQtPm5iU2FtcGxlcyAqIGNvbnRleHQtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIC8qCi0gICAgIFNSQyBtb2R1bGUgYWx3YXlzIGdpdmVzIHN0ZXJlbyBvdXRwdXQsIGhlbmNlIDIgZm9yIHN0ZXJlbyBhdWRpbwotICAgICovCi0gICAgcFRtcEJ1ZmZlciA9IChpbnQzMl90KiltYWxsb2Mob3V0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgIG1lbXNldChwVG1wQnVmZmVyLCAweDAwLCBvdXRGcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQzMl90KSk7Ci0KLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCAqKXBUbXBCdWZmZXIsCi0gICAgICAgKHNpemVfdClvdXRGcmFtZUNvdW50LCAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0KTsKLSAgICAvLyBDb252ZXJ0IGJhY2sgdG8gMTYgYml0cwotICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilvdXQsIHBUbXBCdWZmZXIsIG91dEZyYW1lQ291bnQpOwotICAgIGZyZWUocFRtcEJ1ZmZlcik7Ci0gICAgcFRtcEJ1ZmZlciA9IE5VTEw7Ci19Ci0KLX0KLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhOWEwMTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl8zR1BSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SXzNHUFJFQURFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQzYjgwMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9ICi0KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FBQyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9NUDMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9ERUNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRmNmIwNC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIEVuY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BQUMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9NUDMoCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UpOwotCi0jZW5kaWYgLyogVklERU9FRElUT1JfQVVESU9FTkNPREVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2FmZjZhNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckJ1ZmZlci5jCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgQnVmZmVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiAgIFZJREVPRURJVE9SX0JVRkZFUl9ICi0jZGVmaW5lICAgVklERU9FRElUT1JfQlVGRkVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLSNpbmNsdWRlICJMVl9NYWNyb3MuaCIKLQotLyotLS0gQ29yZSBpZCBmb3IgVklERU9FRElUT1IgQnVmZmVyIGFsbG9jYXRpb25zICAtLS0qLwotI2RlZmluZSBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwgMHgwMTJGCi0KLS8qIC0tLS0tIGVycm9ycyAgLS0tLS0qLwotI2RlZmluZSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX05PX0JVRkZFUl9NQVRDSCBcCi0gICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLDB4MDAwMDAyKQotCi10eXBlZGVmIGVudW0gewotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHkgPSAwLAotICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLAotfSBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RydWN0dXJlICAgIExWT01YX0JVRkZFUl9CdWZmZXIKLSAqIEBicmllZiAgICAgICBPbmUgT01YIEJ1ZmZlciBhbmQgZGF0YSByZWxhdGVkIHRvIGl0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1ZvaWQqIHBEYXRhOyAgICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBkYXRhKi8KLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgc3RhdGU7IC8qKjwgQnVmZmVyIHN0YXRlICovCi0gICAgTTRPU0FfVUludDMyIGlkeDsgICAgICAgICAgICAgICAvKio8IEluZGV4IG9mIHRoZSBidWZmZXIgaW5zaWRlIHRoZSBwb29sICovCi0gICAgTTRfTWVkaWFUaW1lICAgIGJ1ZmZDVFM7ICAgICAgICAvKio8IFRpbWUgc3RhbXAgb2YgdGhlIGJ1ZmZlciAqLwotfSBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSAgICBMVk9NWF9CVUZGRVJfUG9vbAotICogQGJyaWVmICAgICAgIFN0cnVjdHVyZSB0byBtYW5hZ2UgYnVmZmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiBwTlhQQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiBOQjsKLSAgICBNNE9TQV9DaGFyKiBwb29sTmFtZTsKLX0gVklERU9FRElUT1JfQlVGRkVSX1Bvb2w7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmIC8vX19jcGx1c3BsdXMKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAqICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKExWT01YX0JVRkZFUl9Qb29sKiBwcG9vbCkKLSAqIEBicmllZiAgIERlYWxsb2NhdGUgYSBidWZmZXIgcG9vbAotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gZnJlZQotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICogICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLSAqIEBicmllZiAgIFJldHVybnMgYSBidWZmZXIgaW4gYSBnaXZlbiBzdGF0ZQotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wKLSAqIEBwYXJhbSAgIGRlc2lyZWRTdGF0ZSA6IElOIFRoZSBidWZmZXIgc3RhdGUKLSAqIEBwYXJhbSAgIHBOWFBCdWZmZXIgOiBJTiBUaGUgc2VsZWN0ZWQgYnVmZmVyCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcik7Ci0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sLAotICAgICAgICBNNE9TQV9VSW50MzIgbFNpemUpOwotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvL19fY3BsdXNwbHVzCi0jZW5kaWYgLypWSURFT0VESVRPUl9CVUZGRVJfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzNiNTE3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX1ZJREVPX0VESVRPUl9BUElfSF9fCi0jZGVmaW5lIF9fVklERU9fRURJVE9SX0FQSV9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLXR5cGVkZWYgZW51bQotewotICAgIE1TR19UWVBFX1BST0dSRVNTX0lORElDQVRJT04sICAgICAvLyBQbGF5YmFjayBwcm9ncmVzcyBpbmRpY2F0aW9uIGV2ZW50Ci0gICAgTVNHX1RZUEVfUExBWUVSX0VSUk9SLCAgICAgICAgICAgIC8vIFBsYXliYWNrIGVycm9yCi0gICAgTVNHX1RZUEVfUFJFVklFV19FTkQsICAgICAgICAgICAgIC8vIFByZXZpZXcgb2YgY2xpcHMgaXMgY29tcGxldGUKLSAgICBNU0dfVFlQRV9PVkVSTEFZX1VQREFURSwgICAgICAgICAgLy8gdXBkYXRlIG92ZXJsYXkgZHVyaW5nIHByZXZpZXcKLSAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCAgICAgICAgICAgLy8gY2xlYXIgdGhlIG92ZXJsYXkKLX0gcHJvZ3Jlc3NfY2FsbGJhY2tfbXNnX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgb3ZlcmxheVNldHRpbmdzSW5kZXg7Ci0gICAgaW50IGNsaXBJbmRleDsKLX0gVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAqcEZpbGU7ICAgICAgICAgICAgICAgICAgIC8qKiBQQ00gZmlsZSBwYXRoICovCi0gICAgTTRPU0FfQm9vbCAgICAgYlJlbW92ZU9yaWdpbmFsOyAgICAgICAgICAvKiogSWYgdHJ1ZSwgdGhlIG9yaWdpbmFsIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpTmJDaGFubmVsczsgICAgICAgICAgICAvKiogTnVtYmVyIG9mIGNoYW5uZWxzICgxPW1vbm8sIDI9c3RlcmVvKSBvZiBCR00gY2xpcCovCi0gICAgTTRPU0FfVUludDMyICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgICAgIC8qKiBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kgKDgwMDAgZm9yIGFtciwgMTYwMDAgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgZm9yIGFhYykgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqIEV4dGVuZGVkIGZyZXF1ZW5jeSBmb3IgQUFDKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVBQUMrIHN0cmVhbXMgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQWRkQ3RzOyAgICAgICAgICAgICAgICAvKiogVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgdWlBZGRWb2x1bWU7ICAgICAgICAgICAgIC8qKiBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIGJlZ2luQ3V0TXM7Ci0gICAgTTRPU0FfVUludDMyICAgZW5kQ3V0TXM7Ci0gICAgTTRPU0FfSW50MzIgICAgZmlsZVR5cGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgYkxvb3A7ICAgICAgICAgICAgICAgICAgIC8qKiBMb29waW5nIG9uL29mZiAqKi8KLSAgICAvKiBBdWRpbyBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlJbkR1Y2tpbmdfdGhyZXNob2xkOyAgIC8qKiBUaHJlc2hvbGQgdmFsdWUgYXQgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgbXVzaWMgc2hhbGwgZHVjayAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpSW5EdWNraW5nX2xvd1ZvbHVtZTsgICAvKiogbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjdG9yIG9mIGN1cnJlbnQgbGV2ZWwgKi8KLSAgICBNNE9TQV9Cb29sICAgICBiSW5EdWNraW5nX2VuYWJsZTsgICAgICAgLyoqIGVuYWJsZSBkdWNraW5nICovCi0gICAgTTRPU0FfVUludDMyICAgdWlCVENoYW5uZWxDb3VudDsgICAgICAgIC8qKiBjaGFubmVsIGNvdW50IGZvciBCVCAqLwotICAgIE00T1NBX1ZvaWQgICAgICpwUENNRmlsZVBhdGg7Ci19IE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAqcEJ1ZmZlcjsgICAgICAgICAgICAvKiBZVVY0MjAgYnVmZmVyIG9mIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdGltZU1zOyAgICAgICAgICAgIC8qIHRpbWUgc3RhbXAgb2YgdGhlIGZyYW1lIHRvIGJlIHJlbmRlcmVkKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlTdXJmYWNlV2lkdGg7ICAgIC8qIFN1cmZhY2UgZGlzcGxheSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpU3VyZmFjZUhlaWdodDsgICAgLyogU3VyZmFjZSBkaXNwbGF5IGhlaWdodCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpRnJhbWVXaWR0aDsgICAgICAgIC8qIEZyYW1lIHdpZHRoKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlGcmFtZUhlaWdodDsgICAgICAgIC8qIEZyYW1lIGhlaWdodCovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJBcHBseUVmZmVjdDsgICAgICAgIC8qIEFwcGx5IHZpZGVvIGVmZmVjdHMgYmVmb3JlIHJlbmRlciovCi0gICAgTTRPU0FfVUludDMyICAgIGNsaXBCZWdpbkN1dFRpbWU7ICAvKiBDbGlwIGJlZ2luIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgY2xpcEVuZEN1dFRpbWU7ICAgIC8qIENsaXAgZW5kIGN1dCB0aW1lIHJlbGF0aXZlIHRvIHN0b3J5Ym9hcmQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZTsgLyogVmlkZW8gcm90YXRpb24gZGVncmVlICovCi0KLX0gVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyOwotI2VuZGlmIC8qX19WSURFT19FRElUT1JfQVBJX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViM2JlNDAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvck1wM1JlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBNUDMgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9NUDNSRUFERVJfSAotCi0jaW5jbHVkZSAiTTRSRUFERVJfQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX01QM1JFQURFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjFiMjFkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JVdGlscy5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBVdGlsaXRpZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfSF8KLSNkZWZpbmUgQU5EUk9JRF9VVElMU19IXwotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKQotICogQG5vdGUgVGhpcyBtYWNybyBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFuZCBnb2VzIHRvIGZ1bmN0aW9uIGNsZWFuVXAgbGFiZWwKLSAqICAgICAgIGlmIHRoZSB0ZXN0IGZhaWxzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9DSEVDSyh0ZXN0LCBlcnJDb2RlKSBcCi17IFwKLSAgICBpZiggISh0ZXN0KSApIHsgXAotICAgICAgICBBTE9HVigiISEhICVzIChMJWQpIGNoZWNrIGZhaWxlZCA6ICIgI3Rlc3QgIiwgeWllbGRzIGVycm9yIDB4JS44eCIsIFwKLSAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgZXJyQ29kZSk7IFwKLSAgICAgICAgZXJyID0gKGVyckNvZGUpOyBcCi0gICAgICAgIGdvdG8gY2xlYW5VcDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX0ZSRUUocCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gY2FsbHMgZnJlZSBhbmQgbWFrZXMgc3VyZSB0aGUgcG9pbnRlciBpcyBzZXQgdG8gTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSB7IFwKLSAgICAgICAgZnJlZSgocCkpIDsgXAotICAgICAgICAocCkgPSBNNE9TQV9OVUxMIDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTQUZFX01BTExPQyhwLCB0eXBlLCBjb3VudCwgY29tbWVudCkKLSAqIEBub3RlIFRoaXMgbWFjcm8gYWxsb2NhdGVzIGEgYnVmZmVyLCBjaGVja3MgZm9yIHN1Y2Nlc3MgYW5kIGZpbGxzIHRoZSBidWZmZXIKLSAqICAgICAgIHdpdGggMC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgU0FGRV9NQUxMT0MocCwgdHlwZSwgY291bnQsIGNvbW1lbnQpIFwKLXsgXAotICAgIChwKSA9ICh0eXBlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKHR5cGUpKihjb3VudCksIDB4RkYsKE00T1NBX0NoYXIqKWNvbW1lbnQpO1wKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IChwKSwgTTRFUlJfQUxMT0MpOyBcCi0gICAgbWVtc2V0KCh2b2lkICopKHApLCAwLHNpemVvZih0eXBlKSooY291bnQpKTsgXAotfQotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAgICBVVElMSVRJRVMgICAgICoKLSAgICAgKioqKioqKioqKioqKioqKioqKiovCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIERJU1BMQVkgTUVUQURBVEEgQ09OVEVOVCAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLS8vIEJ1aWxkIHRoZSBBVkMgY29kZWMgc3BjaWZpYyBpbmZvIGZyb20gdGhlIFN0YWdlRnJpZ2h0IGVuY29kZXJzIG91dHB1dAotc3RhdHVzX3QgYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSh1aW50OF90ICoqb3V0cHV0RGF0YSwgc2l6ZV90ICpvdXRwdXRTaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgTWV0YURhdGEgKnBhcmFtKTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9BTkRST0lEX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlZWEzYTYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsCi0gICAgICAgIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoCi0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycyk7Ci0KLSNlbmRpZiAvLyBWSURFT0VESVRPUl9WSURFT0RFQ09ERVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzYyNjQzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfSW50ZXJuYWwuaAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIHZpZGVvIGRlY29kZXIgaW50ZXJuYWwgaGVhZGVyIGZpbGUqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQnVmZmVyLmgiCi0jaW5jbHVkZSAiTTRWRF9Ub29scy5oIgotI2luY2x1ZGUgIkk0MjBDb2xvckNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvcmVjdC5oPgotI2luY2x1ZGUgPE9NWF9WaWRlby5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NQUpPUiAgICAgMAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1IgICAgIDAKLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX1JFVklTSU9OICAxCi0KLS8qIEVSUk9SUyAqLwotI2RlZmluZSBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgMHhGRiwgMHgwMDAxKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWMsCi0gICAgVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYywKLSAgICBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjCi19IFZJREVPRURJVE9SX0NvZGVjVHlwZTsKLQotCi0vKnR5cGVkZWYgc3RydWN0ewotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1fYnl0ZTsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2luZGV4OwotICAgIE00T1NBX01lbUFkZHI4IGluOwotCi19IFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0OyovCi0KLXR5cGVkZWYgTTRWU19CaXRzdHJlYW1fY3R4dCBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqIFN0YWdlZnJpZ3RoIHBhcmFtcyAqLwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgIG1DbGllbnQ7IC8qKjwgT01YIENsaWVudCBzZXNzaW9uIGluc3RhbmNlLiAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1WaWRlb0RlY29kZXI7IC8qKjwgU3RhZ2VmcmlnaHQgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgIG1SZWFkZXJTb3VyY2U7IC8qKjwgUmVhZGVyIGFjY2VzcyA+ICovCi0KLSAgICAvKiBSRUFERVIgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKm1fcFJlYWRlckdsb2JhbDsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICptX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOwotCi0gICAgLyogU1RSRUFNIFBBUkFNUyAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsKLQotICAgIC8qIFVzZXIgZmlsdGVyIHBhcmFtcy4gKi8KLSAgICBNNFZJRklfUGxhbkNvbnZlcnRlckZ1bmN0aW9uVHlwZSAqbV9wRmlsdGVyOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICptX3BGaWx0ZXJVc2VyRGF0YTsKLQotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1fbGFzdERlY29kZWRDVFM7Ci0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1SZWFjaGVkRU9TOwotICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSAgIG1EZWNvZGVyVHlwZTsKLSAgICBNNERFQ09ERVJfVmlkZW9TaXplICAgICBtX1ZpZGVvU2l6ZTsKLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gbV9EY2k7IC8qKjwgRGVjb2RlciBDb25maWcgaW5mbyAqLwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sICptX3BEZWNCdWZmZXJQb29sOyAvKio8IERlY29kZWQgYnVmZmVyIHBvb2wgKi8KLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAgICBkZWNPdXB1dENvbG9yRm9ybWF0OwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iSW5wdXRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0SW5wdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJSZW5kZXJlZEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RSZW5kZXJlZEN0czsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtTGFzdFJlbmRlcmVkQ3RzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgbUdpdmVuV2lkdGgsIG1HaXZlbkhlaWdodDsgLy9Vc2VkIGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lORk9fRk9STUFUX0NIQU5HRUQKLSAgICBBUmVjdCAgICAgICAgICAgICAgICAgICBtQ3JvcFJlY3Q7ICAvLyBUaGVzZSBhcmUgb2J0YWluZWQgZnJvbSBrS2V5Q3JvcFJlY3QuCi0gICAgSTQyMENvbG9yQ29udmVydGVyKiAgICAgbUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gY29uc2VxdXRpdmUvbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzLgotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1GcmFtZUludGVydmFsTXM7Ci0KLX0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dDsKLQotfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNTE1NGYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9WSURFT0VOQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKTsKLQotI2VuZGlmIC8vVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTMwYjg1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTWVkaWFCdWZmZXJQdWxsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwIFwKLSAgICBWaWRlb0VkaXRvckJ1ZmZlci5jIFwKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgY29yZWNnIGdyYXBoaWNzKSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXggICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgIFwKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjODI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlclB1bGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotTWVkaWFCdWZmZXJQdWxsZXI6Ok1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUFza1RvU3RhcnQoZmFsc2UpLAotICAgICAgbUFza1RvU3RvcChmYWxzZSksCi0gICAgICBtQWNxdWlyZVN0b3BwZWQoZmFsc2UpLAotICAgICAgbVJlbGVhc2VTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1Tb3VyY2VFcnJvcihPSykgewotCi0gICAgYW5kcm9pZENyZWF0ZVRocmVhZChhY3F1aXJlVGhyZWFkU3RhcnQsIHRoaXMpOwotICAgIGFuZHJvaWRDcmVhdGVUaHJlYWQocmVsZWFzZVRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotTWVkaWFCdWZmZXJQdWxsZXI6On5NZWRpYUJ1ZmZlclB1bGxlcigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJQdWxsZXI6Omhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiAoKG1Tb3VyY2VFcnJvciAhPSBPSykgPyB0cnVlIDogZmFsc2UpOwotfQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RhcnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtQXNrVG9TdGFydCA9IHRydWU7Ci0gICAgbUFjcXVpcmVDb25kLnNpZ25hbCgpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1Bc2tUb1N0b3AgPSB0cnVlOwotICAgIG1BY3F1aXJlQ29uZC5zaWduYWwoKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci0gICAgd2hpbGUgKCFtQWNxdWlyZVN0b3BwZWQgfHwgIW1SZWxlYXNlU3RvcHBlZCkgewotICAgICAgICBtVXNlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSByZW1haW5pbmcgYnVmZmVycwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVsZWFzZUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlbGVhc2VCdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIG1CdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLU1lZGlhQnVmZmVyKiBNZWRpYUJ1ZmZlclB1bGxlcjo6Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlciogYiA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXIqIE1lZGlhQnVmZmVyUHVsbGVyOjpnZXRCdWZmZXJCbG9ja2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHdoaWxlIChtQnVmZmVycy5lbXB0eSgpICYmICFtQWNxdWlyZVN0b3BwZWQpIHsKLSAgICAgICAgbVVzZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBiID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpwdXRCdWZmZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLnB1c2goYnVmZmVyKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYUJ1ZmZlclB1bGxlcjo6YWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZykgewotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiBzZWxmID0gKE1lZGlhQnVmZmVyUHVsbGVyKilhcmc7Ci0gICAgc2VsZi0+YWNxdWlyZVRocmVhZEZ1bmMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IE1lZGlhQnVmZmVyUHVsbGVyOjpyZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKSB7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqIHNlbGYgPSAoTWVkaWFCdWZmZXJQdWxsZXIqKWFyZzsKLSAgICBzZWxmLT5yZWxlYXNlVGhyZWFkRnVuYygpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjphY3F1aXJlVGhyZWFkRnVuYygpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgc3RhcnQgc2lnbmFsCi0gICAgd2hpbGUgKCFtQXNrVG9TdGFydCAmJiAhbUFza1RvU3RvcCkgewotICAgICAgICBtQWNxdWlyZUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB1bnRpbCB3ZSBhcmUgYXNrZWQgdG8gc3RvcCwgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIHJlYWQKLSAgICB3aGlsZSAoIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIHBCdWZmZXI7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtU291cmNlLT5yZWFkKCZwQnVmZmVyLCBOVUxMKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBtU291cmNlRXJyb3IgPSByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gocEJ1ZmZlcik7Ci0gICAgICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0KLSAgICBtQWNxdWlyZVN0b3BwZWQgPSB0cnVlOwotICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6cmVsZWFzZVRocmVhZEZ1bmMoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIHN0YXJ0IHNpZ25hbAotICAgIHdoaWxlICghbUFza1RvU3RhcnQgJiYgIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgbVJlbGVhc2VDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIExvb3AgdW50aWwgd2UgYXJlIGFza2VkIHRvIHN0b3AKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobVJlbGVhc2VCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtQXNrVG9TdG9wKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZWxlYXNlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYUJ1ZmZlciogcEJ1ZmZlciA9IG1SZWxlYXNlQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1SZWxlYXNlQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHBCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgIH0KLQotICAgIG1SZWxlYXNlU3RvcHBlZCA9IHRydWU7Ci0gICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3MmE1My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTUVESUFfQlVGRkVSX1BVTExFUl9ICi0jZGVmaW5lIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotLyoKLSAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGNhbiBwdWxsIGEgbGlzdCBvZiBtZWRpYSBidWZmZXJzCi0gKiBmcm9tIGEgTWVkaWFTb3VyY2UgcmVwZWF0ZWRseS4gVGhlIHVzZXIgY2FuIHRoZW4gZ2V0IHRoZQotICogYnVmZmVycyBmcm9tIHRoYXQgbGlzdC4KLSAqLwotc3RydWN0IE1lZGlhQnVmZmVyUHVsbGVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgfk1lZGlhQnVmZmVyUHVsbGVyKCk7Ci0KLSAgICAvLyBTdGFydCB0byBidWlsZCB1cCB0aGUgbGlzdCBvZiB0aGUgYnVmZmVycy4KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgYnVmZmVycywgYW5kIHN0b3AKLSAgICAvLyBwdWxsaW5nIGJ1ZmZlcnMgZnJvbSB0aGUgTWVkaWFTb3VyY2UuCi0gICAgdm9pZCBzdG9wKCk7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgbGlzdC4gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGF2YWlsYWJsZQotICAgIC8vIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAgICBNZWRpYUJ1ZmZlciogZ2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlCi0gICAgLy8gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCBibG9ja3Mgd2FpdGluZyBmb3IKLSAgICAvLyBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlIG9yIHVudGlsIHN0b3AoKSBpcyBjYWxsZWQuCi0gICAgTWVkaWFCdWZmZXIqIGdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAvLyBBZGQgYSBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhdmFpbGFibGUgbWVkaWEgYnVmZmVycwotICAgIHZvaWQgcHV0QnVmZmVyKE1lZGlhQnVmZmVyKiBidWZmZXIpOwotCi0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc291cmNlIHJldHVybmVkIGFuIGVycm9yIG9yIG5vdC4KLSAgICBib29sIGhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgYWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZyk7Ci0gICAgdm9pZCBhY3F1aXJlVGhyZWFkRnVuYygpOwotCi0gICAgc3RhdGljIGludCByZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKTsKLSAgICB2b2lkIHJlbGVhc2VUaHJlYWRGdW5jKCk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtQnVmZmVyczsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtUmVsZWFzZUJ1ZmZlcnM7Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtVXNlckNvbmQ7ICAgICAvLyBmb3IgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcwotICAgIENvbmRpdGlvbiBtQWNxdWlyZUNvbmQ7ICAvLyBmb3IgdGhlIGFjcXVpcmUgdGhyZWFkCi0gICAgQ29uZGl0aW9uIG1SZWxlYXNlQ29uZDsgIC8vIGZvciB0aGUgcmVsZWFzZSB0aHJlYWQKLQotICAgIGJvb2wgbUFza1RvU3RhcnQ7ICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdGFydAotICAgIGJvb2wgbUFza1RvU3RvcDsgICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdG9wCi0gICAgYm9vbCBtQWNxdWlyZVN0b3BwZWQ7ICAvLyBUaGUgYWNxdWlyZSB0aHJlYWQgaGFzIHN0b3BwZWQKLSAgICBib29sIG1SZWxlYXNlU3RvcHBlZDsgIC8vIFRoZSByZWxlYXNlIHRocmVhZCBoYXMgc3RvcHBlZAotICAgIHN0YXR1c190IG1Tb3VyY2VFcnJvcjsgLy8gRXJyb3IgcmV0dXJuZWQgYnkgTWVkaWFTb3VyY2UgcmVhZAotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZSEKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBNZWRpYUJ1ZmZlclB1bGxlciYpOwotICAgIE1lZGlhQnVmZmVyUHVsbGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJQdWxsZXImKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gX01FRElBX0JVRkZFUl9QVUxMRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTljZjllYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl8zR1BSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJFU0RTLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFycmF5IG9mIEFNUiBOQi9XQiBiaXRyYXRlcwotICogQG5vdGUgICAgQXJyYXkgdG8gbWF0Y2ggdGhlIG1vZGUgYW5kIHRoZSBiaXQgcmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWNvbnN0IE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbXJCaXRSYXRlIFsyIC8qIDhrSHogLyAxNmtIeiAgICAgKi9dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOSAvKiB0aGUgYml0cmF0ZSBtb2RlICovXSA9Ci17Ci0gICAgezQ3NTAsIDUxNTAsIDU5MDAsICA2NzAwLCAgNzQwMCwgIDc5NTAsICAxMDIwMCwgMTIyMDAsIDB9LAotICAgIHs2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MH0KLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWY6VGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgM0dQIHNoZWxsIFJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gICAgICAgICAgICAgIG1EYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiAgICAgICAgICBtRXh0cmFjdG9yOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtQXVkaW9Tb3VyY2U7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1WaWRlb1NvdXJjZTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbVZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1WaWRlb0F1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtTWF4RHVyYXRpb247Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1GaWxlU2l6ZTsKLSAgICBNNF9TdHJlYW1UeXBlICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1TdHJlYW1JZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVRyYWNrczsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUN1cnJUcmFjazsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla1RpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtUaW1lOwotCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQ7Ci0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyKiAgIG1QYml0U3RyZWFtOyAgIC8qKjwgYml0c3RyZWFtIHBvaW50ZXIgKDMyYml0cyBhbGlnbmVkKSAqLwotICAgIE00T1NBX0ludDMyICAgICBtU2l6ZTsgICAgICAgICAvKio8IGJpdHN0cmVhbSBzaXplIGluIGJ5dGVzICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1JbmRleDsgICAgICAgIC8qKjwgYnl0ZSBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtQml0SW5kZXg7ICAgICAvKio8IGJpdCBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtU3RydWN0U2l6ZTsgICAvKio8IHNpemUgb2Ygc3RydWN0dXJlICovCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFsbG9jYXRlcyB0aGUgY29udGV4dCBhbmQgaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChPVVQpICBQb2ludGVyIHRvIHRoZSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICBiaXRTdHJlYW0gICBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbQotICogQHBhcmFtICAgc2l6ZSAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0OwotCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikiM0dQIEJpdFN0cmVhbVBhcnNlciBDb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW09KE00T1NBX1VJbnQzMiopcEJpdFN0cmVhbTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bVNpemU9c2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tU3RydWN0U2l6ZSA9Ci0gICAgICAgIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KTsKLQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCkgewotICAgIGZyZWUoKE00T1NBX0ludDMyKilwQ29udGV4dCk7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgbGVuZ3RoICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIEByZXR1cm4gIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsOwotICAgIE00T1NBX0ludDMyIGlfb3ZmOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0czppbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dmFsPShNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKHBTdHJlYW1Db250ZXh0LT5cCi0gICAgICAgIG1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4IF0pOwotICAgIGlfb3ZmID0gcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aCAtIDMyOwotICAgIHVfbWFzayA9IChsZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgbGVuZ3RoKSAtIDE7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIGVub3VnaCBiaXRzIGF2YWlsYmxlIGluIHRoZSBjdXJyZW50IHdvcmQoMzJiaXRzKSovCi0gICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgcmV0dmFsPShyZXR2YWwgPj4gKC0gaV9vdmYpKSAmIHVfbWFzazsKLSAgICB9IGVsc2UgewotICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICsgMSBdKTsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICB1X21zYl9tYXNrID0gKCgxIDw8ICgzMiAtIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgpKSAtIDEpIDw8IGlfb3ZmOwotICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgdV9sc2JfbWFzayA9ICgxIDw8IGlfb3ZmKSAtIDE7Ci0gICAgICAgIHVfbHNiX3ZhbHVlID0gdV9uZXh0d29yZCA+PiAoMzIgLSBpX292Zik7Ci0gICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgfQotICAgIC8qIHJldHVybiB0aGUgYml0cy4uLiovCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBsZW5ndGggICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0PSgKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgdmFsOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YWw9cFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aDsKLSAgICAvKiB1cGRhdGUgdGhlIGJpdHMuLi4qLwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKz0gbGVuZ3RoOwotCi0gICAgaWYgKHZhbCAtIDMyID49IDApIHsKLSAgICAgICAgLyogdXBkYXRlIHRoZSBiaXRzLi4uKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCAtPSAzMjsKLSAgICAgICAgLyogdXBkYXRlIHRoZSB3b3JkcyovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0Qml0cygKLSAgICAgICAgdm9pZCogcENvbnRleHQsTTRPU0FfSW50MzIgYml0UG9zLCBNNE9TQV9JbnQzMiBiaXRMZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0ludDMyIGJpdExvY2F0aW9uLCBiaXRJbmRleDsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldEJpdHM6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBjb21wdXRlcyB0aGUgd29yZCBsb2NhdGlvbiovCi0gICAgYml0TG9jYXRpb249Yml0UG9zLzMyOwotICAgIGJpdEluZGV4PShiaXRQb3MpICUgMzI7Ci0KLSAgICBpZiAoYml0TG9jYXRpb24gPCBwU3RyZWFtQ29udGV4dC0+bVNpemUpIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICAgICAgTTRPU0FfSW50MzIgaV9vdmYgPSBiaXRJbmRleCArIGJpdExlbmd0aCAtIDMyOwotICAgICAgICByZXR2YWw9KE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIGJpdExvY2F0aW9uIF0pOwotCi0gICAgICAgIHVfbWFzayA9IChiaXRMZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgYml0TGVuZ3RoKSAtIDE7Ci0KLSAgICAgICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgICAgIHJldHZhbD0ocmV0dmFsID4+ICgtIGlfb3ZmKSkgJiB1X21hc2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgYml0TG9jYXRpb24gKyAxIF0pOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICAgICAgdV9tc2JfbWFzayA9ICgoMSA8PCAoMzIgLSBiaXRJbmRleCkpIC0gMSkgPDwgaV9vdmY7Ci0gICAgICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgICAgIHVfbHNiX21hc2sgPSAoMSA8PCBpX292ZikgLSAxOwotICAgICAgICAgICAgdV9sc2JfdmFsdWUgPSB1X25leHR3b3JkID4+ICgzMiAtIGlfb3ZmKTsKLSAgICAgICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyUmVzdGFydCh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiByZXNldHMgdGhlIGJpdHN0cmVhbSBwb2ludGVycyovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXg9MDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQG5vdGUgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX1VJbnQ4KiAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIoCi0gICAgICAgIHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dXJuIChNNE9TQV9VSW50OCopKChNNE9TQV9VSW50OCopcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtICsgXAotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICogc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBcCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgvOCkgOwotfQotCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHVybiBwU3RyZWFtQ29udGV4dC0+bVNpemU7Ci19Ci0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckluaXQocENvbnRleHQsIHBCaXRTdHJlYW0sIHNpemUpOwotfQotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIHZhbCkgewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLQotICAgICovCi0KLSAgICBkbyB7Ci0gICAgICAgIGI9KHZhbCAmICgoMHhmZik8PCAoOCAqIG51bUJ5dGVzKSkpPj4gKDggKiBudW1CeXRlcyk7Ci0gICAgICAgIGxlbmd0aD0obGVuZ3RoIDw8IDcpIHwgKGIgJiAweDdmKTsKLSAgICAgICAgbnVtQnl0ZXMrKzsKLSAgICB9IHdoaWxlICgoYiAmIDB4ODApICYmIG51bUJ5dGVzIDwgNCk7Ci0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YQotICogQG5vdGUgICBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBsb2NhdGlvbi4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0TXBlZ0xlbmd0aEZyb21TdHJlYW0odm9pZCogcENvbnRleHQpewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLSAgICAqLwotCi0gICAgZG8gewotICAgICAgICBiPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgbGVuZ3RoPShsZW5ndGggPDwgNykgfCAoYiAmIDB4N2YpOwotICAgICAgICBudW1CeXRlcysrOwotICAgIH0gd2hpbGUgKChiICYgMHg4MCkgJiYgbnVtQnl0ZXMgPCA0KTsKLQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0jZW5kaWYgLyogVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUiAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0ICwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocEMsIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQsIDEsICJWaWRlb0VkaXRvcjNncFJlYWRlciIpOwotCi0gICAgbWVtc2V0KHBDLCBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCksIDApOwotCi0gICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1BdWRpb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1WaWRlb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tTWF4RHVyYXRpb24gPSAwOwotCi0gICAgKnBDb250ZXh0PXBDOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgcENvbnRleHQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzKTsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIFNBRkVfRlJFRShwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MpOwotICAgIHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgU0FGRV9GUkVFKHBDKTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgbWVkaWEgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBzdGFydCAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIC8vcEMtPm1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwQy0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAocEMtPm1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShwQy0+bURhdGFTb3VyY2UsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0KLSAgICBpZiAocEMtPm1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBleHRyYWN0b3IgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSogQG5vdGUgICAgIGNsb3NlIHRoZSAzR1AgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0ICpwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEgKnBBdWRpb1NiclVzZXJEYXRhOwotICAgIE00X0FjY2Vzc1VuaXQgKnBBVTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIEF1ZGlvIik7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkpIHsKLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJEYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKShcCi0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgcEFVID0gKE00X0FjY2Vzc1VuaXQqKXBBdWRpb1NiclVzZXJEYXRhLT5tX3BGaXJzdEFVOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEFVKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQVUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXVkaW9TYnJVc2VyRGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEF1ZGlvU2JyVXNlckRhdGEpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIFZpZGVvICIpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICBwQy0+bVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgfQotICAgIHBDLT5tRXh0cmFjdG9yLmNsZWFyKCk7Ci0gICAgcEMtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gZnJvbSB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSoKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0qIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0qCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgTm8gdmlkZW8gc3RyZWFtIEgyNjMgaW4gZmlsZS4KLSogQHJldHVybiAgIE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUCi0qICAgICAgICAgICBGdW5jdGlvbiAzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gYmVnaW4gJWQiLCBvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGR1cmF0aW9uICVkIixwQy0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIj4+Pj4+Pj4gICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0Iik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChwQy0+bU1heER1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMlRtcCA9IChNNE9TQV9VSW50MzIpcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwQy0+bUZpbGVTaXplICogODAwMC4wIC8gcEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGJpdHJhdGUgJWxkIiwgKnBCaXRyYXRlKTsKLSAgICAgICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllczoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gbm8gdmlkZW9TdHJlYW0gcmV0cmlldmVkIik7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3N0cmVhbVR5cGUpIHx8IChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCA3KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gRFNJIFNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9WSURFT19OT1RfSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTUFHSUNBTCBpbiB0aGUgZGVjb2RlciBjb25maSBIMjYzOiB0aGUgN3RoIGJ5dGUgaXMgdGhlIHByb2ZpbGUKLSAgICAgICAgICAgICAqIG51bWJlciwgNnRoIGJ5dGUgaXMgdGhlIGxldmVsIG51bWJlciAqLwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aVByb2ZpbGUgPQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzZdOwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aUxldmVsID0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s1XTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfM0dQX2tPcHRpb25JRF9cCi0gICAgICAgICAgICBIMjYzUHJvcGVydGllcyBlbmQiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybToKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyT3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSIpOwotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZWaWRlb0F1OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIDpHZXROdW1iZXJPZlZpZGVvQXUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveDoKLSAgICAgICAgLyogdXNlZCBvbmx5IGZvciBTRU1DICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3giKTsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsgLy9jaGVjayB0aGlzCi0gICAgICAgIGJyZWFrOwotCi0jaWZkZWYgT1BUSU9OSURfR0VUX05FWFRfVklERU9fQ1RTCi0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUzoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogZ2V0TmV4dFZpZGVvQ1RTIik7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGVuZDogb3B0aW9uSUQ6IHgleCIsIG9wdGlvbklkKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIHNldCBhbiBvcHRpb24gb24gdGhlIDNncCByZWFkZXIKLSogQG5vdGUgTm8gb3B0aW9uIGNhbiBiZSBzZXQgeWV0LgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24gYmVnaW4gJWQiLG9wdGlvbklkKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlKToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfa09wdGlvbklEX01heE1ldGFkYXRhU2l6ZSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb246IHJldHVybnMgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjIGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdCBiZWdpbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0qIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgKEkvTylJTiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQgdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIGJlZ2luIik7Ci0KLSAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKLSAgICAgICAgKnBUaW1lIC09IDE7Ci0gICAgfQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBpZiAoKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpKQotICAgICAgICAgICAgewotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgICAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICAgICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICAgICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgICAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSA9IHRpbWU2NDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgQVVESU8gdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLSAgICB9IGVsc2UgaWYgKChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID09IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICAgICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+bVZpZGVvU2Vla1RpbWUgPSB0aW1lNjQ7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIFZJREVPIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgbXMgYmVmb3JlIHNlZWtzZXQgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgZW5kIik7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IGJlZ2luIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSogQG5vdGUgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0qCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTykgUG9pbnRlciB0byBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm5zICBNNEVSUl9BTExPQyAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgIE00V0FSX05PX01PUkVfQVUgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDPShWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBpbnQ2NF90IHRlbXBUaW1lNjQgPSAwOwotICAgIE1lZGlhQnVmZmVyICptTWVkaWFCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIE00T1NBX0Jvb2wgZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgIHN0YXR1c190IGVycm9yOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBDPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYmVnaW4iKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICAgICAgaWYgKHBDLT5tQXVkaW9TZWVraW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gc2VlayB0aW1lOiAlbGQiLAotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwQy0+bUF1ZGlvU2Vla1RpbWUpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZsYWcgPSBNNE9TQV9UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHZpZGVvIHN0ZXJhbSAiKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgaWYocEMtPm1WaWRlb1NlZWtpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHNlZWs6ICVsZCIscEMtPm1WaWRlb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBDLT5tVmlkZW9TZWVrVGltZSwKLSAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGZyZWUgdGhlIE1lZGlhQnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJvciA9IHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXUgTWVkaWFCdWZmZXIgJXggLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlciwgZXJyb3IpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgJmkzMlRtcCkgJiYgaTMyVG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNZTkMgRlJBTUUgRk9VTkQtLSVkIiwgaTMyVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIH0gd2hpbGUodGVtcFRpbWU2NCA8IHBDLT5tVmlkZW9TZWVrVGltZSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvICB0aW1lIHdpdGggc2VlayAgPSAlbGxkOiIsCi0gICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSB2aWRlbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICZpMzJUbXApICYmIGkzMlRtcCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiU1lOQyBGUkFNRSBGT1VORC0tJWQiLCBpMzJUbXApOwotICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvIG5vIHNlZWsgdGltZSA9ICVsbGQ6IiwKLSAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTp2aWRlbyBubyBzZWVrIHRpbWUgYnVmZmVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKCAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fCAgKHBBdS0+c2l6ZSA8IFwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQnVmZmVyIGxlbmdodCA9ICVkICwlZCIsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgK1wKLSAgICAgICAgICAgICAgICAzKSAmIH4weDMsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKTsKLQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLSAgICAgICAgICAgIGlmKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoY29uc3QgY2hhciAqKW1NZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbU1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBpZiggKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjKSApIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpsYnVmZmVyOwotCi0gICAgICAgICAgICBsYnVmZmVyID0gKE00T1NBX1VJbnQ4ICopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBBTE9HVigicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3Mgc2l6ZSA9ICV4IixzaXplKTsKLQotICAgICAgICAgICAgbGJ1ZmZlclswXSA9IChzaXplID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzFdID0gKHNpemUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzNdID0gKHNpemUpICYgMHhGRjsKLSAgICAgICAgfQotCi0gICAgICAgIHBBdS0+Q1RTID0gdGVtcFRpbWU2NDsKLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLy9jb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IENUUyA9ICVsZCIscEF1LT5DVFMpOwotCi0gICAgICAgIHBBdS0+RFRTICA9IHBBdS0+Q1RTOwotICAgICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX0ludDgqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSBwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTID0gcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogTTRXQVJfTk9fTU9SRV9BVSAoRU9TKSByZWFjaGVkIik7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgbU1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGVuZCAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTcGxpdCB0aGUgQVZDIERTSSBpbiBpdHMgZGlmZmVyZW50IGNvbXBvbmVudHMgYW5kIHdyaXRlIGl0IGluCi0gKiAgICAgICAgICBPTkUgbWVtb3J5IGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAgICAgICAgIChJTi9PVVQpIFRoZSBNUEVHNC1BVkMgc3RyZWFtCi0gKiBAcGFyYW0gICBwRGVjb2RlckNvbmZpZ0xvY2FsOiAgICAoSU4pIFRoZSBEU0kgYnVmZmVyCi0gKiBAcGFyYW0gICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsOiAoSU4pIFRoZSBEU0kgYnVmZmVyIHNpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfRklMRV9TWU5UQVhfRVJST1IgICBwRGVjb2RlckNvbmZpZ0xvY2FsIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbmFseXNlQXZjRHNpKAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBEZWNvZGVyQ29uZmlnTG9jYWwsCi0gICAgICAgIE00T1NBX0ludDMyIGRlY29kZXJDb25maWdTaXplTG9jYWwpIHsKLSAgICBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyAqcEF2Y1NwZWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgdWlTcGVjSW5mb1NpemU7Ci0gICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFBvczsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHBhcnNpbmcgdG8gZ2V0IHRoZSB0b3RhbCBhbGxvY2F0aW9uIHNpemUgKHdlIG11c3Qgbm90IGRvCi0gICAgICogbXVsdGlwbGUgbWFsbG9jLCBidXQgb25seSBvbmUgaW5zdGVhZCkgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX0ludDMyIHZhbDsKLSAgICAgICAgTTRPU0FfVUludDMyIGksajsKLSAgICAgICAgTTRPU0FfVUludDggbmFsVW5pdExlbmd0aDsKLSAgICAgICAgTTRPU0FfVUludDggIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlNQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlBQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemU7Ci0gICAgICAgIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvIGF2Y1NwSWY7Ci0KLSAgICAgICAgYXZjU3BJZi5tX25hbFVuaXRMZW5ndGggPSAwOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVyQ29uZmlnTG9jYWwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQoJnBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgcERlY29kZXJDb25maWdMb2NhbCwgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCk7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEJpdFBhcnNlckNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gY29uZmlndXJhdGlvbiB2ZXJzaW9uICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIHByb2ZpbGUgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gcHJvZmlsZSBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIGxldmVsIGluZGljYXRpb24qLwotICAgICAgICB2YWw9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgMTExMTExYiAyIGJpdHMgbGVuZ3RoIFNpemUgbWludXMgb25lKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotCi0gICAgICAgIG5hbFVuaXRMZW5ndGggPSAoTTRPU0FfVUludDgpKCh2YWwgJiAweDAzKSArIDEpOy8qMGIxMTExMTEwMCovCi0gICAgICAgIGlmIChuYWxVbml0TGVuZ3RoID4gNCkgewotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgdmFsPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgOCk7LyogMyBiaXRzLXJlc2VydmVkIDExMWItNSBiaXRzIG51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ki8KLSAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0gdmFsICYgMHgxRjsKLSAgICAgICAgICAgIC8qMUYgaW5zdGVhZCBvZiBFMCovIC8qMGIxMTEwMDAwMCovIC8qTnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIHVpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlNQUyArPSB1aVNpemU7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqUmVhZCB0aGUgZWxlbWVudChkb250IGtlZXAgaXQsIHdlIG9ubHkgd2FudCBzaXplIHJpZ2h0IG5vdykgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cz0oTTRPU0FfVUludDgpXAotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICB1aVNpemUgPSAoTTRPU0FfVUludDMyKQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTICs9IHVpU2l6ZTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICpSZWFkIHRoZSBlbGVtZW50KGRvbnQga2VlcCBpdCx3ZSBvbmx5IHdhbnQgc2l6ZSByaWdodCBub3cpKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGZ1bGwgYnVmZmVyICovCi0gICAgICAgICAgICB1aVNwZWNJbmZvU2l6ZSA9IHNpemVvZihzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpCi0gICAgICAgICAgICAgICAgICAgICArIC8qKjwgc2l6ZSBvZiB0aGUgdGFibGUgb2YgU1BTIGVsZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkKLSAgICAgICAgICAgICAgICAgICAgICsgLyoqPCBzaXplIG9mIHRoZSB0YWJsZSBvZiBQUFMgZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZTUFMgKwotICAgICAgICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlBQUzsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvID0oc3RydWN0IF9hdmNTcGVjaWZpY0luZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aVNwZWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdmNTcGVjSW5mbykgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX25hbFVuaXRMZW5ndGggPSBuYWxVbml0TGVuZ3RoOwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0KLSAgICAgICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICA9Ci0gICAgICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsKLQotICAgICAgICAgICAgLyogV2UgcGxhY2UgdGhlIFNQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIG1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ9IChzdHJ1Y3QgX3BhcmFtZXRlclNldCopKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoJnBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCkgKwotICAgICAgICAgICAgICAgIHNpemVvZihwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQpKTsKLSAgICAgICAgICAgIC8qV2UgcGxhY2UgdGhlIFBQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIHRoZSBTUFMgcGFyYW0gc2V0cyB0YWJsZSovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgPSAoc3RydWN0IF9wYXJhbWV0ZXJTZXQqKSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQpICsKLSAgICAgICAgICAgICAgICAobnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpKSk7Ci0gICAgICAgICAgICAvKio8IFRoZSBkYXRhIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSBQUFMgcGFyYW0gc2V0cyB0YWJsZSAqLwotICAgICAgICAgICAgcFBvcyA9IChNNE9TQV9NZW1BZGRyOClwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKwotICAgICAgICAgICAgICAgIChudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogcmVzZXQgdGhlIGJpdCBwYXJzZXIgKi8KLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Vjb25kIHBhcnNpbmcgdG8gY29weSB0aGUgZGF0YSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBBdmNTcGVjSW5mbykgewotICAgICAgICBNNE9TQV9JbnQzMiBpLGo7Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KCZwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICBmcmVlKHBBdmNTcGVjSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBwcm9maWxlIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIHByb2ZpbGUgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBsZXZlbCBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAvKiAzIGJpdHMgLS0gcmVzZXJ2ZWQgMTExYiAtLSA1IGJpdHMgbnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGggPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwxNik7Ci0KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBQb3MgKz0gcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDtqKyspewotICAgICAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXT0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogbnVtYmVyIG9mIHDDrmN0dXJlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsMTYpOwotCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwUG9zICs9IHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHVpU3BlY0luZm9TaXplOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9VSW50OCopcEF2Y1NwZWNJbmZvOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgID0gIGRlY29kZXJDb25maWdTaXplTG9jYWw7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvICA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsLCBNNFJFQURFUl8zR1AsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqICkgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAodm9pZCAqIClwRGVjb2RlckNvbmZpZ0xvY2FsLAotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotY2xlYW51cDoKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICByZXR1cm4gTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiBPVVQpICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwgYmUgZmlsbGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6KE9VVCkgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQz0oVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQ4ICpEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9MCwgbWF4QVVTaXplID0gMDsKLQotICAgIE00X1N0cmVhbVR5cGUgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVVua25vd247Ci0gICAgTTRPU0FfVUludDggdGVtcCwgaSwgdHJhY2tDb3VudDsKLSAgICBNNE9TQV9Cb29sIGhhdmVBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgaGF2ZVZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgID0gTlVMTDsKLSAgICBpbnQ2NF90IER1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50OCogRGVjb2RlclNwZWNpZmljID0gTTRPU0FfTlVMTCA7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGNvbnN0IHZvaWQgKmNvZGVjX3NwZWNpZmljX2RhdGE7Ci0gICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICBNNE9TQV9JbnQzMiAgcHRlbXBUaW1lOwotICAgIE00T1NBX0ludDMyICBhdmdGUFM9MDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ICAgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImdldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJnZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHRyYWNrQ291bnQgPSBwQy0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICB0ZW1wID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICBpZih0ZW1wID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGVycm9yID0gJWQiLAotICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0pOwotICAgICAgICByZXR1cm4gKE00V0FSX05PX01PUkVfU1RSRUFNKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBtZXRhID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVWaWRlbyAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHRlbXApOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBnZXRUcmFjayBjYWxsZWQiKTsKLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlckdldE5leHRTdHJlYW1IYW5kbGVyIHN0cmVhbVR5cGVOT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IHN0cmVhbSB0eXBlOiAlZCAiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICBpZihzdHJlYW1UeXBlICE9IE00REFfU3RyZWFtVHlwZVVua25vd24pIHsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtSWQgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfVmlkZW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcFZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fdmlkZW9XaWR0aCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSAgPSAoTTRfU3RyZWFtSGFuZGxlciopKHBWaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKSA9IChpbnQzMl90KSgoRHVyYXRpb24pLzEwMDApOyAvLyBjb252ZXJzaW9uIHRvIG1TCi0gICAgICAgICAgICAgICAgcEMtPm1NYXhEdXJhdGlvbiA9ICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5tTWF4RHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgdG9vIHNob3J0OiAlbGxkIFVzIiwgRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2R1cmF0aW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgb2ZmNjRfdCBmaWxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcEMtPm1EYXRhU291cmNlLT5nZXRTaXplKCZmaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSAgPSBmaWxlU2l6ZTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2ZpbGVTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgKGludDMyX3QqKSYobWF4QVVTaXplKSk7Ci0gICAgICAgICAgICAgICAgaWYobWF4QVVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QVVTaXplID0gNzAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSA9IG1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUpOwotCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwVmlkZW9TdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1GaWxlU2l6ZSAqIDgwMDApL3BDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fYXZlcmFnZUJpdHJhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBWaWRlb1N0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlKTsKLQotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKGF2Z0ZQUykpOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IEF2ZXJhZ2UgRlBTIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICBhdmdGUFMpOwotCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID0oTTRPU0FfRmxvYXQpIGF2Z0ZQUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBBdmVyYWdlIEZQUyBmcm9tIE1QNCBleHRyYWN0b3IgaW4gRkxPQVQ6ICVmIiwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlkZW8gcm90YXRpb24gZGVncmVlCi0gICAgICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICBpZighbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlKSkgewotICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKikocFZpZGVvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIERTSSBpbmZvICovCi0gICAgICAgICAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwoTTRPU0FfQ2hhciopIkgyNjMgRFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkVfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IEgyNjMgZHNpIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX0ludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUsIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJIMjY0IERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncF9nZXROZXh0U3RyZWFtIGlzIE5VTEwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgU2l6ZSAlZCIsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FuYWx5c2VBdmNEc2koKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIqKURlY29kZXJTcGVjaWZpY0luZm8sIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRlY3NpemUgJWQsIGgyNjRkZWNzaXplICVkOiAlZCIsICgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCAoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCA9PSBzdHJlYW1UeXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIk00ViBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEVTRFNJbmZvLCAodm9pZCAqKWRhdGEsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFIE1QNCBkc2lzaXplOiAlZCwgJXgiLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIiBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gTk8gdmlkZW8gc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBOTyB2aWRlbyBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIGF1ZGlvIGdldFRyYWNrIGNhbGxlZCIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFjayhwQy0+bUN1cnJUcmFjayk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgICAgICAgICBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWEgc3RyZWFtdHlwZSBVbmtub3duICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc3RyZWFtVHlwZSAhPSBNNERBX1N0cmVhbVR5cGVVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbUlkID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiVkUgc3RyZWFtdHlwZSAlZCAsaWQgJWQiLCAgc3RyZWFtVHlwZSwgcEMtPm1DdXJyVHJhY2spOwotCi0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICA9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5PSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSA9IChNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0gMDsKLSAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyPShNNF9TdHJlYW1IYW5kbGVyKilwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAoaW50MzJfdCopJihtYXhBVVNpemUpKTsKLSAgICAgICAgICAgICAgICBpZihtYXhBVVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXhBVVNpemUgPSA3MDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplID0gbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBBdWRpbyBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLCBtYXhBVVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBzdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyZXFJbmRleCA9IDA7IC8qKjwgQU1SIE5CICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1vZGVTZXQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlcUluZGV4ID0gMTsgLyoqPCBBTVIgV0IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiQU1SIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VQ2hhciBBbXJEc2lbXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB7J1AnLCdIJywnTCcsJ1AnLDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsfTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSA5OwotICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIlBITFAgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmVxSW5kZXggPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbXJEc2lbOF0gPSAweDAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQW1yRHNpWzhdID0gMHgwMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8IDk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljW2ldID0gQW1yRHNpW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FtckJpdFJhdGVbZnJlcUluZGV4XVs3XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZigoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRWRzaSAlZCwleCIsY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtU3RyZWFtVHlwZTogbm9uZSAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVkUgbm9hdWRpby12aWRlbyBzdHJlYW06cEMtPm1DdXJyVHJhY2sgPSAlZCAiLHBDLT5tQ3VyclRyYWNrKTsKLSAgICAgICAgICAgIHBDLT5tQ3VyclRyYWNrKys7IC8vSW5jcmVtZW50IGN1cnJlbnQgdHJhY2sgdG8gZ2V0IHRoZSBuZXh0IHRyYWNrCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZFIFN0cmVhbVR5cGU6ICVkLCBzdHJlbWhhbmRsZXIgJXgiLHN0cmVhbVR5cGUsICpwU3RyZWFtSGFuZGxlciApOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtSWQgICA9IHBDLT5tU3RyZWFtSWQ7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSAgPSBNNE9TQV9OVUxMOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0KLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24gPSAoaW50MzJfdCkoRHVyYXRpb24gLyAxMDAwKTsKLQotICAgICAgICBwQy0+bU1heER1cmF0aW9uID0gKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLSAgICAgICAgQUxPR1YoIlZFIHN0ciBkdXJhdGlvbiBkdXJhdGlvbjogJWQgIiwgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgIC8qIEluIEFBQyBjYXNlOiBQdXQgdGhlIGZpcnN0IEFVIGluIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhCi0gICAgICAgICAqc2luY2UgZGVjb2RlciBoYXMgdG8ga25vdyBpZiBzdHJlYW0gY29udGFpbnMgU0JSIGRhdGEoSW1wbGljaXQgc2lnKSAqLwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiAgcEF1ZGlvU2JyVXNlcmRhdGE7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSksTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcFVzZXJEYXRhID0gcEF1ZGlvU2JyVXNlcmRhdGE7Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9iSXNTYnJFbmFibGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVID0gKE00X0FjY2Vzc1VuaXQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRfQWNjZXNzVW5pdCksTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIjFzdCBBQUMgQVUiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVKSB7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gKE00X0FhY0RlY29kZXJDb25maWcqKVwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FhY0RlY29kZXJDb25maWcpLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopKCpwU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiBwVXNlckRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopXAotICAgICAgICAgICAgICAgIChwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdChwQywgKCpwU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQqKXBVc2VyRGF0YS0+bV9wRmlyc3RBVSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCopcFVzZXJEYXRhLT5tX3BGaXJzdEFVKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIDEuICJNNFdBUl9OT19NT1JFX0FVID09IGVyciIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZQotICAgICAgICAgICAgICogYWNjZXNzIHVuaXQgZnJvbSB0aGUgY3VycmVudCB0cmFjay4gSW4gb3RoZXIgd29yZHMsIHRoZXJlCi0gICAgICAgICAgICAgKiBpcyBvbmx5IGEgc2luZ2xlIGFjY2VzcyB1bml0IGZyb20gdGhlIGN1cnJlbnQgdHJhY2ssIGFuZAotICAgICAgICAgICAgICogdGhlIHBhcnNpbmcgb2YgdGhpcyB0cmFjayBoYXMgcmVhY2hlZCBFT1MuIFRoZSByZWFzb24gd2h5Ci0gICAgICAgICAgICAgKiB0aGUgZmlyc3QgYWNjZXNzIHVuaXQgbmVlZHMgdG8gYmUgcGFyc2VkIGhlcmUgaXMgYmVjYXVzZSBmb3IKLSAgICAgICAgICAgICAqIHNvbWUgYXVkaW8gY29kZWMgKGxpa2UgQUFDKSwgdGhlIHZlcnkgZmlyc3QgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAqIG11c3QgYmUgZGVjb2RlZCBiZWZvcmUgaXRzIGNvbmZpZ3VyYXRpb24vZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAgICAgICogKHN1Y2ggYXMgIyBvZiBjaGFubmVscyBhbmQgc2FtcGxlIHJhdGUpIGNhbiBiZSBjb3JyZWN0bHkKLSAgICAgICAgICAgICAqIGRldGVybWluZWQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogMi4gInRyYWNrQ291bnQgPiBwQy0+bUN1cnJUcmFjayIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG90aGVyCi0gICAgICAgICAgICAgKiB0cmFja3MgdG8gYmUgcGFyc2VkLCBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudCB0cmFjay4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBXaGVuIGJvdGggY29uZGl0aW9ucyAxICYgMiBob2xkLCBvdGhlciB0cmFja3Mgc2hvdWxkIGJlCi0gICAgICAgICAgICAgKiBwYXJzZWQuIFRodXMsIHdlIHNob3VsZCBub3QgYmFpbCBvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVyciAmJiB0cmFja0NvdW50ID4gcEMtPm1DdXJyVHJhY2spIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQocEMsICgqcFN0cmVhbUhhbmRsZXIpKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1DdXJyVHJhY2srKzsgLy9JbmNyZW1lbnQgdGhlIGN1cnJlbnQgdHJhY2sgdG8gZ2V0IG5leHQgdHJhY2sKLSAgICBBTE9HVigicEMtPm1DdXJyVHJhY2sgPSAlZCIscEMtPm1DdXJyVHJhY2spOwotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAqcE1lZGlhRmFtaWx5PU00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICB9Ci1FcnJvcjoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZW5kIGVycm9yID0gJWQiLGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQgKnBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTWVkaWFCdWZmZXIgKm1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0gICAgaW50NjRfdCB0ZW1wVGltZTY0ID0gMDsKLSAgICBzdGF0dXNfdCBlcnJvcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0gICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7Ci0gICAgICAgICpwVGltZSAtPSAxOwotICAgIH0KLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZSAqIDEwMDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgc2VlayB0aW1lOiAlbGQiLHRpbWU2NCk7Ci0gICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZTY0LCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgZXJyb3IgPSBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgLy9DYW4gbm90IGdldCB0aGUgcHJldmlvdXMgU3luYy4KLSAgICAgICAgLy9NdXN0IGJlIGVuZCBvZiBzdHJlYW0uCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgcmVhZCB0aW1lICVsZCwgJXgiLCB0ZW1wVGltZTY0LAotICAgICAgICBtTWVkaWFCdWZmZXIpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKSh0ZW1wVGltZTY0IC8gMTAwMCk7Ci0KLSAgICBpZihtTWVkaWFCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiIG1NZWRpYUJ1ZmZlciBzaXplID0gJWQgbGVuZ3RoICVkIiwgbU1lZGlhQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgIGlmKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBlbmQgXAotICAgICAgICAgICAgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGVuZDogZXJyICV4IiwgZXJyKTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci19Ci0KLWV4dGVybiAiQyIgewotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZShNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgYmVnaW4iKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlICVkIDB4JXggMHgleCIsICpwTWVkaWFUeXBlLAotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSwqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUDsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi19ICAvKiBleHRlcm4gIkMiICovCi0KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjN2VhMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX0FVRElPREVDT0RFUiIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLS8vIFZlcnNpb24KLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SIDAKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFViAgIDAKLQotLy8gRm9yY2UgdXNpbmcgc29mdHdhcmUgZGVjb2RlciBhcyBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBwcmVmZXRjaAotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtTb2Z0d2FyZUNvZGVjc09ubHkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwKLSAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbUJ1ZmZlcnM7Ci0gICAgICAgIE11dGV4IG1Mb2NrOyAgLy8gcHJvdGVjdHMgbUJ1ZmZlcnMKLSAgICAgICAgYm9vbCBtSXNFT1M7Ci0gICAgICAgIFN0YXRlIG1TdGF0ZTsKLSAgICAgICAgdm9pZCogbURlY1NoZWxsQ29udGV4dDsKLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvIGRlY29kZXIKLSAqICAgICAgICAgICBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJUeXBlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gIG1EZWNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0Q2hhbm5lbHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQqIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgTTRPU0FfRVJSIHJlYWRlckVyckNvZGU7Ci0gICAgaW50MzJfdCB0aW1lU3RhbXBNczsKLQotfSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0OwotCi1zcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGZvcm1hdCwgZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCogZGVjb2RlclNoZWxsQ29udGV4dCk6Ci0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUlzRU9TKGZhbHNlKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRGVjU2hlbGxDb250ZXh0KGRlY29kZXJTaGVsbENvbnRleHQpIHsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgpIHsKLQotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgaW50IG4gPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBtQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVygiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBuKTsKLSAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdGljIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyRnJvbVJlYWRlcigKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBwRGVjQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8vIEdldCBuZXh0IEFVIGZyb20gcmVhZGVyLgotICAgIGxlcnIgPSBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcERlY0NvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICBwQWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkQnVmZmVyRnJvbVJlYWRlciA6IEVPUyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwRGVjQ29udGV4dC0+dGltZVN0YW1wTXMgPSBwQWNjZXNzVW5pdC0+bV9DVFM7Ci0KLSAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEFjY2Vzc1VuaXQtPm1fc2l6ZSk7Ci0gICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9JbnQ4KiluZXdCdWZmZXItPmRhdGEoKSArIG5ld0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLCBwQWNjZXNzVW5pdC0+bV9zaXplKTsKLSAgICBuZXdCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDBMTCkpOwotICAgIHJldHVybiBuZXdCdWZmZXI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnJlYWQgaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSByZWFkZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKLSAgICBpZihtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSByZWFkQnVmZmVyRnJvbVJlYWRlcihwRGVjQ29udGV4dCk7Ci0gICAgICAgIGlmICghbmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHBEZWNDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gobmV3QnVmZmVyKTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIGJlZ2luIik7Ci0KLSAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhIGJ1ZmZlciwgZ2V0IGl0IGZyb20gdGhlIHJlYWRlci4KLSAgICBpZihidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gcmVhZEJ1ZmZlckZyb21SZWFkZXIocERlY0NvbnRleHQpOwotICAgICAgICBpZiAoIW5ld0J1ZmZlcikgewotICAgICAgICAgICAgcERlY0NvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICBtQnVmZmVycy5wdXNoKGJ1ZmZlcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMoTTRPU0FfSW50OCogcERhdGEsCi0gICAgICAgIE00T1NBX1VJbnQzMiBkYXRhU2l6ZSwgTTRPU0FfVUludDggbmJCaXRzLCBNNE9TQV9JbnQzMiogcFJlc3VsdCwKLSAgICAgICAgTTRPU0FfVUludDMyKiBwT2Zmc2V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCaXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBlbmRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZW5kQml0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiByZXN1bHQgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1aTMyVG1wID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMk1hc2sgPSAwOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERhdGEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT2Zmc2V0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDMyID49IG5iQml0cywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoKnBPZmZzZXQgKyBuYkJpdHMpIDw9IDgqZGF0YVNpemUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBiZWdpbiIpOwotCi0gICAgc3RhcnRCeXRlICAgPSAoKnBPZmZzZXQpID4+IDM7Ci0gICAgZW5kQnl0ZSAgICAgPSAoKnBPZmZzZXQgKyBuYkJpdHMpID4+IDM7Ci0gICAgc3RhcnRCaXQgICAgPSAoKnBPZmZzZXQpICUgODsKLSAgICBlbmRCaXQgICAgICA9ICgqcE9mZnNldCArIG5iQml0cykgJSA4OwotICAgIGN1cnJlbnRCeXRlID0gc3RhcnRCeXRlOwotCi0gICAgLy8gRXh0cmFjdCB0aGUgcmVxdWVzdGVkIG51bmJlciBvZiBiaXRzIGZyb20gbWVtb3J5Ci0gICAgd2hpbGUoIGN1cnJlbnRCeXRlIDw9IGVuZEJ5dGUpIHsKLSAgICAgICAgdWkzMk1hc2sgPSAweDAwMDAwMEZGOwotICAgICAgICBpZiggY3VycmVudEJ5dGUgPT0gc3RhcnRCeXRlICkgewotICAgICAgICAgICAgdWkzMk1hc2sgPj49IHN0YXJ0Qml0OwotICAgICAgICB9Ci0gICAgICAgIHVpMzJUbXAgPSB1aTMyTWFzayAmICgoTTRPU0FfVUludDMyKXBEYXRhW2N1cnJlbnRCeXRlXSk7Ci0gICAgICAgIGlmKCBjdXJyZW50Qnl0ZSA9PSBlbmRCeXRlICkgewotICAgICAgICAgICAgdWkzMlRtcCA+Pj0gKDgtZW5kQml0KTsKLSAgICAgICAgICAgIHJlc3VsdCA8PD0gZW5kQml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0IDw8PSA4OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCB8PSB1aTMyVG1wOwotICAgICAgICBjdXJyZW50Qnl0ZSsrOwotICAgIH0KLQotICAgICpwUmVzdWx0ID0gcmVzdWx0OwotICAgICpwT2Zmc2V0ICs9IG5iQml0czsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotI2RlZmluZSBGUkVRX1RBQkxFX1NJWkUgMTYKLWNvbnN0IE00T1NBX1VJbnQzMiBBRF9BQUNfRlJFUV9UQUJMRVtGUkVRX1RBQkxFX1NJWkVdID0KLSAgICB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLAotICAgIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDB9OwotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJKE00T1NBX0ludDgqIHBEU0ksCi0gICAgICAgIE00T1NBX1VJbnQzMiBkc2lTaXplLCBBQUNfREVDX1NUUkVBTV9QUk9QUyogcFByb3BlcnRpZXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX0ludDMyIHJlc3VsdCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBiZWdpbiIpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQcm9wZXJ0aWVzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gR2V0IHRoZSBvYmplY3QgdHlwZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNSwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgc3dpdGNoKCByZXN1bHQgKSB7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDIgKEFBQyBMb3cgQ29tcGxleGl0eSkgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDA7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDUgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAwOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgMjkgKFBhcmFtZXRyaWMgU3RlcmVvKSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMTsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJwYXJzZV9BQUNfRFNJIEVSUk9SIDogb2JqZWN0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiaW52YWxpZCBBQUMgb2JqZWN0IHR5cGUiLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwUHJvcGVydGllcy0+YUF1ZGlvT2JqZWN0VHlwZSA9IChNNE9TQV9JbnQzMilyZXN1bHQ7Ci0KLSAgICAvLyBHZXQgdGhlIGZyZXF1ZW5jeSBpbmRleAotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNCwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgPD0gcmVzdWx0KSAmJiAoRlJFUV9UQUJMRV9TSVpFID4gcmVzdWx0KSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwUHJvcGVydGllcy0+YVNhbXBGcmVxID0gQURfQUFDX0ZSRVFfVEFCTEVbcmVzdWx0XTsKLSAgICBwUHJvcGVydGllcy0+YUV4dGVuc2lvblNhbXBGcmVxID0gMDsKLQotICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA0LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBwUHJvcGVydGllcy0+YU51bUNoYW4gPSAoTTRPU0FfVUludDMyKXJlc3VsdDsKLQotICAgIC8vIFNldCB0aGUgbWF4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsCi0gICAgcFByb3BlcnRpZXMtPmFNYXhQQ01TYW1wbGVzUGVyQ2ggPSAocFByb3BlcnRpZXMtPmFTQlJQcmVzZW50KSA/IDIwNDggOiAxMDI0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3koTTRBRF9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaAotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCkgKSB7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0b3AoKTsKLSAgICB9Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UuY2xlYXIoKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmNsZWFyKCk7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLQotICAgIFNBRkVfRlJFRShwRGVjb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IDogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZShNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfQ29udGV4dCogcENvbnRleHQsIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgYWFjUHJvcGVydGllczsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFEYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgYmVnaW46IGRlY29kZXJUeXBlICVkIiwgZGVjb2RlclR5cGUpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiQXVkaW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTROT19FUlJPUjsKLSAgICBwRGVjb2RlckNvbnRleHQtPnRpbWVTdGFtcE1zID0gLTE7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogbWF4QVVTaXplICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGRlY29kZXIKLSAgICBkZWNvZGVyTWV0YURhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDE2MDAwOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgLy8gUmVqZWN0IEFEVFMgJiBBRElGIChvciBhbnkgaW5jb3JyZWN0IHR5cGUpCi0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSxNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotCi0gICAgICAgICAgICBkZWNvZGVyTWV0YURhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fRVNEU0luZm9TaXplKTsKLQotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIC8vIFJldHJpZXZlIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gdGhlIERTSQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmYWFjUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDEwMjQ7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLQotICAgICAgICAgICAgLy8gQ29weSB0aGUgc3RyZWFtIHByb3BlcnRpZXMgaW50byB1c2VyZGF0YQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcFVzZXJEYXRhICkgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYWFjUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFBQ19ERUNfU1RSRUFNX1BST1BTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRGVjb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsCi0gICAgICAgIChpbnQzMl90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgIChpbnQ2NF90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZGVjb2Rlck1ldGFEYXRhLCAodm9pZCAqKXBEZWNvZGVyQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUocERlY29kZXJDb250ZXh0LT5cCi0gICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhRGF0YSwgZmFsc2UsIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UsIE5VTEwsCi0gICAgICAgICAgICBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNoYW5uZWxzLCB0aGUgZGVjb2RlciBtaWdodCBvdmVyd3JpdGUgdGhlIGlucHV0IG1ldGFkYXRhCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAmcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IG91dHB1dCBjaGFuICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZGVjb2RlcgotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAqcENvbnRleHQgPSBwRGVjb2RlckNvbnRleHQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95KHBEZWNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQUFDKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFBQywgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQihNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBTVJOQiwgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1SV0IoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX01QMyhNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVNUDMsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgTTRBRF9Db250ZXh0IHBDb250ZXh0LCBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcElucHV0QnVmZmVyICkgewotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLCBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBwSW5wdXRCdWZmZXItPm1fdGltZVN0YW1wVXMpOwotICAgIH0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEFEX0J1ZmZlciogcE91cHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXB1dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIGRhdGEKLSAgICBpZiggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBEZWNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotCi0gICAgaWYoIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID09Ci0gICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKLSAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBQQ01zCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3VwdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoKE00T1NBX01lbUFkZHI4KWJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIH0gZWxzZSBpZiggcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPAotICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7Ci0gICAgICAgIC8vIFRoZSBkZWNvZGVyIGZvcmNlcyBzdGVyZW8gb3V0cHV0LCBkb3duc2FtcGxlCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMikoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKS8yKTsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhSW4gID0gKChNNE9TQV9JbnQxNiopYnVmZmVyLT5kYXRhKCkpICsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YU91dCA9IChNNE9TQV9JbnQxNiopcE91cHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFFbmQgPSBwRGF0YUluICsgXAotICAgICAgICAgICAgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkvc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgICAgIHdoaWxlKCBwRGF0YUluIDwgcERhdGFFbmQgKSB7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAqcERhdGFJbjsKLSAgICAgICAgICAgIHBEYXRhSW4rPTI7Ci0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGRlY29kZXIgZm9yY2VzIG1vbm8gb3V0cHV0LCBub3Qgc3VwcG9ydGVkCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyLCBNNEFEX0J1ZmZlciogcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgTTRPU0FfQm9vbCBiSnVtcCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocERlY29kZXJDb250ZXh0LAotICAgICAgICBwSW5wdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUmVhZAotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnJlYWQoJm91dHB1dEJ1ZmZlciwgTlVMTCk7Ci0gICAgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBBdWRpbyBkZWNvZGVyIFwKLSAgICAgICAgIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgQ0hFQ0sob3V0cHV0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKLQotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBzYW1wbGluZ0ZyZXEgPSAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogY2hhbm5lbENudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICh1aW50MzJfdClzYW1wbGVSYXRlOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAodWludDMyX3QpY2hhbm5lbENvdW50OwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzID0gY2hhbm5lbENvdW50OwotCi0gICAgICAgIHJldHVybiBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0U7Ci0gICAgfSBlbHNlIGlmIChFUlJPUl9FTkRfT0ZfU1RSRUFNID09IHJlc3VsdCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogQXVkaW8gZGVjb2RlciBcCi0gICAgICAgICByZXR1cm5lZCBFUlJPUl9FTkRfT0ZfU1RSRUFNIik7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0gZWxzZSBpZiAoT0sgIT0gcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSBQQ00gYnVmZmVyCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRGVjb2RlckNvbnRleHQsCi0gICAgICAgIG91dHB1dEJ1ZmZlciwgcE91dHB1dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWZXJzaW9uSW5mbywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFVjsKLSAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBiZWdpbiAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9VSW50MzI+KE00QURfa09wdGlvbklEX1VzZXJQYXJhbSk6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gVXNlclBhcmFtIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIDNncFJlYWRlckludGVyZmFjZSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BSZWFkZXIgPQotICAgICAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlICopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvQVU6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gQXVkaW9BVSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0KLSAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCAqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gIHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggKChNNE9TQV9VSW50MzIpTTROT19FUlJPUiA9PSBlcnIpIHx8ICgoTTRPU0FfVUludDMyKU00RVJSX05PVF9JTVBMRU1FTlRFRCA9PSBlcnIpICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGVycm9yIDB4JVgiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGU6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPSBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVsczoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeToKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdUNUUzoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9IHBEZWNvZGVyQ29udGV4dC0+dGltZVN0YW1wTXM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJUeXBlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luICVkIDB4JXggMHgleCIsCi0gICAgICAgIGRlY29kZXJUeXBlLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRGVjb2RlckludGVyZmFjZSwgTTRBRF9JbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlciIpOwotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUldCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFBQzoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFEX2dldEludGVyZmFjZSBFUlJPUjogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVEVTVDogQUFDIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBQUMsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlRFU1Q6IEFNUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1STkIsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZU1QMywgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MWYzZWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9BVURJT0VOQ09ERVIiCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKiBERUZJTklUSU9OUyAqKiovCi0vLyBGb3JjZSB1c2luZyBzb2Z0d2FyZSBlbmNvZGVyIGFzIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHByZWZldGNoCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga1NvZnR3YXJlQ29kZWNzT25seQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLQotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtTGFzdEJ1ZmZlckxpbms7Ci0gICAgICAgIGludDMyX3QgbU5iQnVmZmVyOwotICAgICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRW5jRm9ybWF0OwotCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYpOwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmKTsKLX07Ci0KLXNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSIpOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSIpOwotCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQiKTsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0IEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFUlJPUjogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQiKTsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCA6IEVPUyIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLQotICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICBpZiggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgdG1wTGluazsKLSAgICBtTmJCdWZmZXItLTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIik7Ci0KLSAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgbmV3TGluay0+YnVmZmVyID0gYnVmZmVyOwotICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluay0+bmV4dExpbmsgPSBuZXdMaW5rOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIH0KLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIG1OYkJ1ZmZlcisrOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvCi0gKiAgICAgICAgICAgZW5jb2RlciBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMqICAgICAgICAgICAgbUNvZGVjUGFyYW1zOwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgICBtRFNJOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBtRW5jb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgbUVuY29kZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci19IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQ7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbyk7Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICVkIiwgZm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FBQyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBQUMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BTVJOQihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBTVJOQiwgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X01QMyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tNUDMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJBdWRpb0VuY29kZXJfY2xvc2U6SU4gJWQgZnJhbWVzLE9VVCAlZCBmcmFtZXMgZnJvbSAlbGxkIHRvICVsbGQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMpOwotCi0gICAgaWYoIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOnNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQgJWQgJWQiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgYmVnaW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKnBEU0ksCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEdyYWJiZXJDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaU5iQ2hhbm5lbCA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcERTSS0+cEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBEU0ktPmluZm9TaXplID0gMDsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAtMTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICA9IC0xOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gOiBwYXJhbXMgRj0lZCBDTj0lZCBCUj0lZCBGPSVkIiwKLSAgICAgICAgcFBhcmFtcy0+RnJlcXVlbmN5LCBwUGFyYW1zLT5DaGFubmVsTnVtLCBwUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwUGFyYW1zLT5Gb3JtYXQpOwotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMsIDEsCi0gICAgICAgICJWSURFT0VESVRPUiBDb2RlY1BhcmFtcyIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmVxdWVuY3kgID0gcFBhcmFtcy0+RnJlcXVlbmN5OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtID0gcFBhcmFtcy0+Q2hhbm5lbE51bTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSAgICA9IHBQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCAgICAgPSBwUGFyYW1zLT5Gb3JtYXQ7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5Ci0gICAgVklERU9FRElUT1JfQ0hFQ0socEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyZXF1ZW5jeSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01vbm86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlOYkNoYW5uZWwgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgewotICAgICAgICAgICAgaU5iQ2hhbm5lbCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGNoYW5uZWwgbnVtYmVyIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGlOYkNoYW5uZWwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLSAgICAvLyBGSVhNRToKLSAgICAvLyBXZSBhcmUgbW92aW5nIGF3YXkgdG8gdXNlIHNvZnR3YXJlIEFBQ0VuY29kZXIgYW5kIGluc3RlYWQgdXNlIE9NWC1iYXNlZAotICAgIC8vIHNvZnR3YXJlIEFBQyBhdWRpbyBlbmNvZGVyLiBXZSB3YW50IHRvIHVzZSBBQUNFbmNvZGVyIGZvciBub3cuIEFmdGVyIHdlCi0gICAgLy8gZml4IHRoZSBpbnRlcmZhY2UgaXNzdWUgd2l0aCB0aGUgT01YLWJhc2VkIEFBQyBhdWRpbyBlbmNvZGVyLCB3ZSBzaG91bGQKLSAgICAvLyB0aGVuIHNldCB0aGUgY29tcG9uZW50IG5hbWUgYmFjayB0byBOVUxMIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcGljayB1cAotICAgIC8vIHRoZSByaWdodCBBQUMgYXVkaW8gZW5jb2Rlci4KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgIkFBQ0VuY29kZXIiIC8qIGNvbXBvbmVudCBuYW1lICovLAotICAgICAgICAgICAgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gR2V0IEFBQyBEU0ksIHRoaXMgY29kZSBjYW4gb25seSB3b3JrIHdpdGggc29mdHdhcmUgZW5jb2RlcgotICAgIGlmKCBNNEVOQ09ERVJfa0FBQyA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBpbnQzMl90ICAgICAgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgICAgICAgID0gTlVMTDsKLQotICAgICAgICAvLyBSZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgRFNJCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICpwRFNJID0gcEVuY29kZXJDb250ZXh0LT5tRFNJOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwSW5CdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTW9ubzoKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgICAgIC8vIExldCB0aGUgTWVkaWFCdWZmZXIgb3duIHRoZSBkYXRhIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBpdAotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgICAgIHBEYXRhID0gKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKXBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyWzBdLAotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFFX3Byb2Nlc3NJbnB1dEJ1ZmZlciB1bnN1cHBvcnRlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gJWQiLAotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciA6IHN0b3JlICVkIGJ5dGVzIiwKLSAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgaWYoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICkgewotICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggc29mdHdhcmUgZW5jb2RlciwKLSAgICAgICAgICogRFNJIHdhcyByZXRyaWV2ZWQgYmVmb3JlaGFuZCAqLwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcEluQnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBJbkJ1ZmZlciwgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LHBJbkJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBSZWFkCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFByb3ZpZGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIHdyaXRlcgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCBidWZmZXIsCi0gICAgICAgIHBPdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEZvcm1hdCwgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRW5jb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgMHgleCAweCV4IixwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSk7Ci0gICAgU0FGRV9NQUxMT0MoKnBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJBdWRpb0VuY29kZXIiKTsKLQotICAgICpwRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3dpdGNoKCBmb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlOiB1bnN1cHBvcnRlZCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbGVhblVwICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RlcCAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBQUMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBTVJOQiwgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzIG5vIGVycm9yIik7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa01QMywgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0Y2ZhN2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSN1bmRlZiBNNE9TQV9UUkFDRV9MRVZFTAotI2RlZmluZSBNNE9TQV9UUkFDRV9MRVZFTCAxCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jZGVmaW5lIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFIDQwCi0KLSNkZWZpbmUgVklERU9FRElUT1JfU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gcCkgXAotICAgIHsgXAotICAgICAgICBmcmVlKHApOyBcCi0gICAgICAgIHAgPSBNNE9TQV9OVUxMOyBcCi0gICAgfSBcCi19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycykKLSAqIEBicmllZiAgIEFsbG9jYXRlIGEgcG9vbCBvZiBuYkJ1ZmZlcnMgYnVmZmVycwotICoKLSAqIEBwYXJhbSAgIHBwb29sICAgICAgOiBJTiBUaGUgYnVmZmVyIHBvb2wgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICBuYkJ1ZmZlcnMgIDogSU4gVGhlIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBwb29sCi0gKiBAcGFyYW0gICBwb29sTmFtZSAgIDogSU4gYSBuYW1lIGdpdmVuIHRvIHRoZSBwb29sCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIG5iQnVmZmVycywgTTRPU0FfQ2hhciogcG9vbE5hbWUpCi17Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwb29sOwotICAgIE00T1NBX1VJbnQzMiBpbmRleDsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogcHBvb2wgPSAweCV4IG5iQnVmZmVycyA9ICVkICIsCi0gICAgICAgIHBwb29sLCBuYkJ1ZmZlcnMpOwotCi0gICAgcG9vbCA9IE00T1NBX05VTEw7Ci0gICAgcG9vbCA9IChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbCIpKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwb29sKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBidWZmZXJzIik7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cE5YUEJ1ZmZlciA9IChWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIpKm5iQnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2FsbG9jYXRlUG9vbDogcE5YUEJ1ZmZlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBvb2wtPnBOWFBCdWZmZXIpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iQnVmZmVyczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IEFsbG9jYXRpbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotICAgIHBvb2wtPnBvb2xOYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwb29sLT5wb29sTmFtZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSgiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbDogcG9vbG5hbWUiKSk7Ci0gICAgaWYocG9vbC0+cG9vbE5hbWUgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBc3NpZ25pbmcgUG9vbCBuYW1lIGJ1ZmZlciIpOwotCi0gICAgbWVtc2V0KCh2b2lkICopcG9vbC0+cG9vbE5hbWUsIDAsVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUpOwotICAgIG1lbWNweSgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAodm9pZCAqKXBvb2xOYW1lLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRS0xKTsKLQotICAgIHBvb2wtPk5CID0gbmJCdWZmZXJzOwotCi1WSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA6Ci0gICAgaWYoTTROT19FUlJPUiAhPSBsZXJyKQotICAgIHsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBOWFBCdWZmZXIpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBWSURFT0VESVRPUl9TQUZFX0ZSRUUocG9vbCk7Ci0gICAgfQotICAgICpwcG9vbCA9IHBvb2w7Ci0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgRU5EIik7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiAgaiA9IDA7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sIDogcHBvb2wgPSAweCV4IiwgcHBvb2wpOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGZvciAoaiA9IDA7IGogPCBwcG9vbC0+TkI7IGorKykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEpOwotICAgICAgICAgICAgcHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocHBvb2wgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cE5YUEJ1ZmZlcik7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbC0+cG9vbE5hbWUpOwotICAgICAgICBTQUZFX0ZSRUUocHBvb2wpOwotICAgIH0KLQotICAgIHJldHVybihlcnIpOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gKiAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotICogQGJyaWVmICAgUmV0dXJucyBhIGJ1ZmZlciBpbiBhIGdpdmVuIHN0YXRlCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbAotICogQHBhcmFtICAgZGVzaXJlZFN0YXRlIDogSU4gVGhlIGJ1ZmZlciBzdGF0ZQotICogQHBhcmFtICAgcE5YUEJ1ZmZlciA6IElOIFRoZSBzZWxlY3RlZCBidWZmZXIKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfVUludDMyIGksIGlidWY7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlciBmcm9tICVzIGluIHN0YXRlPSVkIiwKLSAgICAgICAgcHBvb2wtPnBvb2xOYW1lLCBkZXNpcmVkU3RhdGUpOwotCi0gICAgaWJ1ZiA9IDA7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHBwb29sLT5OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYkZvdW5kID0gKHBwb29sLT5wTlhQQnVmZmVyW2ldLnN0YXRlID09IGRlc2lyZWRTdGF0ZSk7Ci0gICAgICAgIGlmIChiRm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlidWYgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZighYkZvdW5kKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIgTm8gYnVmZmVyIGF2YWlsYWJsZSBpbiBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBkZXNpcmVkU3RhdGUpOwotICAgICAgICAqcE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLQotICAgIC8qIGNhc2Ugd2hlcmUgYSBidWZmZXIgaGFzIGJlZW4gZm91bmQgKi8KLSAgICAqcE5YUEJ1ZmZlciA9ICYocHBvb2wtPnBOWFBCdWZmZXJbaWJ1Zl0pOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXI6IGlkeCA9ICVkIiwgaWJ1Zik7Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBvb2wsCi0gICAgTTRPU0FfVUludDMyIGxTaXplKQotewotICAgIE00T1NBX0VSUiAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgIGluZGV4LCBqOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBvb2wgKi8KLSAgICBmb3IoaW5kZXggPSAwOyBpbmRleCA8IHBvb2wtPk5COyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IChNNE9TQV9Wb2lkKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBsU2l6ZSwgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgKE00T1NBX0NoYXIqKSgiQlVGRkVSX2luaXRQb29sQnVmZmVyczogQnVmZmVyIGRhdGEiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0ucERhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbmRleDsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbal0ucERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zaXplID0gMDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5pZHggPSBpbmRleDsKLSAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA9IC0xOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi17Ci0gICAgTTRPU0FfRVJSICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgaW5kZXgsIGo7Ci0gICAgTTRfTWVkaWFUaW1lICBjYW5kaWRhdGVUaW1lU3RhbXAgPSAoTTRfTWVkaWFUaW1lKTB4N2ZmZmZmZjsKLSAgICBNNE9TQV9Cb29sICAgIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgKnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvcihpbmRleCA9IDA7IGluZGV4PCBwb29sLT5OQjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmKHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnN0YXRlID09IGRlc2lyZWRTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uYnVmZkNUUyA8PSBjYW5kaWRhdGVUaW1lU3RhbXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXAgPSBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTOwotICAgICAgICAgICAgICAgICAgICAqcE5YUEJ1ZmZlciA9ICYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKE00T1NBX0ZBTFNFID09IGJGb3VuZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyIFdBUk5JTkcgbm8gYnVmZmVyIGF2YWlsYWJsZSIpOwotICAgICAgICBlcnIgPSBNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvck1wM1JlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWY1M2M1NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIE1QMyBSZWFkZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9NUDNSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTXAzUmVhZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8qKgotICogRU5HSU5FIElOVEVSRkFDRQotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFNGIE1QMyByZWFkZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNwPERhdGFTb3VyY2U+ICAgICAgICAgICAgICBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gICAgICAgICAgbUV4dHJhY3RvcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgbU1lZGlhU291cmNlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBtQXVkaW9BdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbU1heER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBtU3RyZWFtTnVtYmVyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBtU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yRmxhZ3M7Ci19IFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIE1QMyByZWFkZXIKLSAqIEBub3RlICAgICBhbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocFJlYWRlckNvbnRleHQsIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSAwOwotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSBNUDMgcmVhZGVyCi0gKiBAbm90ZSAgICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKiBAcGFyYW0gICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBUaGUgaW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBiZWdpbiIpOwotCi0gICAgU0FGRV9GUkVFKHBSZWFkZXJDb250ZXh0KTsKLWNsZWFuVXA6Ci0gICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBvcGVuIHRoZSByZWFkZXIgYW5kIGluaXRpYWxpemVzIGl0cyBjcmVhdGVkIGluc3RhbmNlCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBNUDMgZmlsZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcil7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlICgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2UgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIHN0YXJ0Iik7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UsTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVuZCIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yID09IE5VTEwpICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXh0cmFjdG9yIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciA9IDA7Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgTVAzIHJlYWRlcgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UgYmVnaW4iKTsKLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZWFkZXJDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5cCi0gICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci5jbGVhcigpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Nsb3NlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE9wdGlvbiBiZWdpbjogb3B0aW9uSWQ9ICVkICIsKGludClvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFZhbHVlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9EdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk1wM1JlYWRlciBkdXJhdGlvbj0lbGQiLHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24pOwotICAgICAgICAgICAgKihNNE9TQV9UaW1lKilwVmFsdWUgPSBwUmVhZGVyQ29udGV4dC0+bU1heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YxVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX01wM0lkM3YyVGFnOgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOiAgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgYW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdXNlcikgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICBUaGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBiZWdpbjogb3B0aW9uSWQ6ICVkIFZhbHVlOiAlZCAiLAotICAgICAgICAoaW50KW9wdGlvbklkLChpbnQpcFZhbHVlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyOgotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcihJTikgICBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgIChJL08pSU46dGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00T1NBX0ludDMyKiBwVGltZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKXsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgdGltZSBtcyAlbGQgIiwgdGltZTY0KTsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICB0aW1lNjQgPSB0aW1lNjQgLyAxMDAwOyAvKiBDb252ZXJ0IHRoZSB0aW1lIGludG8gbWlsbGkgc2VjICovCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhIGZpbGUKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSBwb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhbmQgZmlsbGVkIHdpdGggc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfU1RSRUFNICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlclBhcmFtKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX1VJbnQ4IHR5cGUsIHRlbXA7Ci0gICAgTTRPU0FfQm9vbCBoYXZlQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IE5VTEw7Ci0gICAgaW50NjRfdCBEdXJhdGlvbjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIGJlZ2luIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIHN0cmVhbSBudW1iZXIgPSAlZCIsCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyKTsKLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPj0gMSkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYXggbnVtYmVyIG9mIHN0cmVhbSByZWFjaGVkIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgPSBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlciArIDE7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbnVtYmVyIG9mIFRyYWNrcyVkIiwKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCkpOwotICAgIGZvciAodGVtcCA9IDA7IHRlbXAgPCBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsgdGVtcCsrKSB7Ci0gICAgICAgIG1ldGEgPSBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0ZW1wKTsKLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UgPQotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5nZXRUcmFjayh0ZW1wKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVBdWRpbykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWhhdmVBdWRpbykgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBubyBtb3JlIHN0cmVhbSAiKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvckZsYWdzID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZEdXJhdGlvbik7Ci0gICAgc3RyZWFtRGVzYy5kdXJhdGlvbiA9IChNNE9TQV9UaW1lKUR1cmF0aW9uLzEwMDA7Ci0KLSAgICBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90Kikmc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSk7Ci0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAoaW50MzJfdCopJnN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBBTE9HVigiQml0cmF0ZSA9ICVkLCBTYW1wbGVSYXRlID0gJWQgZHVyYXRpb24gPSAlbGxkIiwKLSAgICAgICAgc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZSxzdHJlYW1EZXNjLnRpbWVTY2FsZSxEdXJhdGlvbi8xMDAwKTsKLQotICAgIHN0cmVhbURlc2Muc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgc3RyZWFtRGVzYy5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBzdHJlYW1EZXNjLnN0cmVhbUlEID0gcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXI7Ci0gICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICBzdHJlYW1EZXNjLm1heEJpdHJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgLyogICAgQWxsb2NhdGUgdGhlIGF1ZGlvIHN0cmVhbSBoYW5kbGVyIGFuZCBzZXQgaXRzIHBhcmFtZXRlcnMgICAgKi8KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKSwgTTRSRUFERVJfTVAzLAotICAgICAgICAoTTRPU0FfQ2hhciopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBBdWRpb1N0cmVhbUhhbmRsZXIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS5jbGVhcigpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG1ldGEgaXMgTlVMTCIpOwotICAgIH0KLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBzdHJlYW1EZXNjLnRpbWVTY2FsZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICBzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsCi0gICAgICAgIChpbnQzMl90KikmcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzKTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDExNTI7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9IDI7Ci0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9wVXNlckRhdGEgPSBOVUxMOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID0gc3RyZWFtRGVzYy5zdHJlYW1JRDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbiA9IHN0cmVhbURlc2MuZHVyYXRpb247Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUJpdFJhdGUgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplID0gMDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBzdGFydCAiKTsKLSAgICBpZihwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcil7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcEF1IHN0cnVjdHVyZSAqLwotICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBBdS0+c2l6ZSAgICAgICAgPSAwOwotICAgIHBBdS0+Q1RTICAgICAgICAgPSAwOwotICAgIHBBdS0+RFRTICAgICAgICAgPSAwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCBpLmUgc2VlayBpdCB0byB0aGUgYmVnaW5uaW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gcmVzZXQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBzdGFydCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0gICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgIHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUgPSB0aW1lNjQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyIChJTikgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAoSS9PKVBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgTTRFUlJfQUxMT0MgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0gKiBAcmV0dXJucyAgIE00V0FSX05PX01PUkVfQVUgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE1lZGlhQnVmZmVyICptQXVkaW9CdWZmZXI7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IHN0YXJ0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmVhZGVyQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwUmVhZGVyQ29udGV4dC0+XAotICAgICAgICBtQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd25cbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmIChwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8ocFJlYWRlckNvbnRleHQtPm1TZWVrVGltZSk7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+cmVhZCgmbUF1ZGlvQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICBpZiAobUF1ZGlvQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChwQXUtPmRhdGFBZGRyZXNzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICAocEF1LT5zaXplIDwgbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKLSAgICAgICAgICAgIGlmIChwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gKE00T1NBX0ludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgKG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAzKSAmIH4weDMsCi0gICAgICAgICAgICAgICAgTTRSRUFERVJfTVAzLCAoTTRPU0FfQ2hhciopInBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzIiApOwotCi0gICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBtYWxsb2MgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bURhdGFTb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKE00T1NBX01lbUFkZHI4KXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKW1BdWRpb0J1ZmZlci0+ZGF0YSgpICsgbUF1ZGlvQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgIG1BdWRpb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZwQXUtPkNUUyk7Ci0KLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLypjb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYyAqLwotICAgICAgICBwQXUtPkRUUyAgPSBwQXUtPkNUUzsKLSAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBNNFNZU19rRnJhZ0F0dHJPazsKLSAgICAgICAgbUF1ZGlvQnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBBVSBDVFMgPSAlbGQiLHBBdS0+Q1RTKTsKLQotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQ4KikgcEF1LT5kYXRhQWRkcmVzczsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSA9IHBBdS0+c2l6ZTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fQ1RTID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0RUUyA9IHBBdS0+RFRTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IEVPUyByZWFjaGVkLiIpOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotICAgIHBBdS0+bmJGcmFnID0gMDsKLQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBtQXVkaW9CdWZmZXIgPSBOVUxMOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgZW5kIik7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2U6IGJlZ2luIik7Ci0gICAgLyogSW5wdXQgcGFyYW1ldGVycyBjaGVjayAqLwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcE1lZGlhVHlwZSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJkckdsb2JhbEludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotCi0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3k7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RDbG9zZSAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb247Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfc2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldE5leHRTdHJlYW0gPQotICAgICAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEZpbGxBdVN0cnVjdCA9Ci0gICAgICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0b3AgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RSZXNldCAgICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRQcmV2UmFwVGltZSA9IE00T1NBX05VTEw7Ci0KLSAgICAoKnBSZHJEYXRhSW50ZXJmYWNlKS0+bV9wRmN0R2V0TmV4dEF1ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCAgICAgID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJHbG9iYWxJbnRlcmZhY2UpOwotICAgICAgICBTQUZFX0ZSRUUoKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotfSAgLyogZXh0ZXJuICJDIiAqLwotfSAgLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTcyMzdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JVdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU0ZfdXRpbHMiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyogQW5kcm9pZCBpbmNsdWRlcyovCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBERUJVRyBMRVZFTCBTRVRVUCAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTE9HMSBBTE9HRSAgICAvKkVSUk9SUyBMb2dnaW5nKi8KLSNkZWZpbmUgTE9HMiBBTE9HSSAgICAvKldBUk5JTkcgTG9nZ2luZyovCi0jZGVmaW5lIExPRzMgLy9BTE9HViAgLypDT01NRU5UUyBMb2dnaW5nKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIGRpc3BsYXlNZXRhRGF0YShjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSkgewotCi0gICAgY29uc3QgY2hhciogY2hhckRhdGE7Ci0gICAgaW50MzJfdCBpbnQzMkRhdGE7Ci0gICAgaW50NjRfdCBpbnQ2NERhdGE7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkKiBkYXRhOwotICAgIHZvaWQqIHB0cjsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlNSU1FVHlwZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V2lkdGggJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SGVpZ2h0ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlGcmFtZXNJbnRlcnZhbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTdHJpZGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTbGljZUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDaGFubmVsQ291bnQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVNhbXBsZVJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJpdFJhdGUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RVNEUyB0eXBlPSVkIHNpemU9JWQiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFWQ0MgZGF0YT0weCVYIHR5cGU9JWQgc2l6ZT0lZCIsCi0gICAgICAgICAgICAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0luZm8gdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Vm9yYmlzQm9va3MgdHlwZT0lZCBzaXplPSVkIiwgdHlwZSwgc2l6ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdhbnRzTkFMRnJhZ21lbnRzICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SXNTeW5jRnJhbWUgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUlzQ29kZWNDb25maWcgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaW50NjREYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpbWUgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUR1cmF0aW9uLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUR1cmF0aW9uICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29sb3JGb3JtYXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZFBvaW50ZXIoa0tleVBsYXRmb3JtUHJpdmF0ZSwgJnB0cikpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlQbGF0Zm9ybVByaXZhdGUgcG9pbnRlcj0weCV4IiwgKGludDMyX3QpIHB0cik7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURlY29kZXJDb21wb25lbnQgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJ1ZmZlcklELCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUJ1ZmZlcklEICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleU1heElucHV0U2l6ZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGh1bWJuYWlsVGltZSAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFydGlzdCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBbGJ1bUFydGlzdCwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0aXN0ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUNvbXBvc2VyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q29tcG9zZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5R2VucmUsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlHZW5yZSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlUaXRsZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVRpdGxlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVllYXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlZZWFyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0IHR5cGU9JWQgc2l6ZT0lZCIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0TUlNRSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBdXRob3IsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBdXRob3IgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNEVHJhY2tOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGlzY051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURpc2NOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGF0ZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURhdGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5V3JpdGVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V3JpdGVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGltZVNjYWxlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvUHJvZmlsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VmlkZW9MZXZlbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXk2NEJpdEZpbGVPZmZzZXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlGaWxlVHlwZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUcmFja1RpbWVTdGF0dXMgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVJlYWxUaW1lUmVjb3JkaW5nICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci19Ci0KLS8qKgotICogVGhpcyBjb2RlIHdhcyBleHRyYWN0ZWQgZnJvbSBTdGFnZUZyaWdodCBNUEVHNCB3cml0ZXIKLSAqIElzIGlzIHVzZWQgdG8gcGFyc2UgYW5kIGZvcm1hdCB0aGUgQVZDIGNvZGVjIHNwZWNpZmljIGluZm8gcmVjZWl2ZWQKLSAqIGZyb20gU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgPSAweDA3Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owotc3RydWN0IEFWQ1BhcmFtU2V0IHsKLSAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCi0gICAgICAgIDogbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQotCi0gICAgdWludDE2X3QgbUxlbmd0aDsKLSAgICBjb25zdCB1aW50OF90ICptRGF0YTsKLX07Ci1zdHJ1Y3QgQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQgewotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1TZXFQYXJhbVNldHM7Ci0gICAgTGlzdDxBVkNQYXJhbVNldD4gbVBpY1BhcmFtU2V0czsKLSAgICB1aW50OF90IG1Qcm9maWxlSWRjOwotICAgIHVpbnQ4X3QgbVByb2ZpbGVDb21wYXRpYmxlOwotICAgIHVpbnQ4X3QgbUxldmVsSWRjOwotfTsKLQotY29uc3QgdWludDhfdCAqcGFyc2VQYXJhbVNldChBVkNDb2RlY1NwZWNpZmljQ29udGV4dCogcEMsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKSB7Ci0gICAgQ0hFQ0sodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCB8fAotICAgICAgICAgIHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpOwotCi0gICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKLSAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKLSAgICAgICAgICAgIG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF0sIDQpKSB7Ci0gICAgICAgIC0tYnl0ZXNMZWZ0OwotICAgIH0KLSAgICBpZiAoYnl0ZXNMZWZ0IDw9IDQpIHsKLSAgICAgICAgYnl0ZXNMZWZ0ID0gMDsgLy8gTGFzdCBwYXJhbWV0ZXIgc2V0Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdOwotICAgICpwYXJhbVNldExlbiA9IG5leHRTdGFydENvZGUgLSBkYXRhOwotICAgIGlmICgqcGFyYW1TZXRMZW4gPT0gMCkgewotICAgICAgICBBTE9HRSgiUGFyYW0gc2V0IGlzIG1hbGZvcm1lZCwgc2luY2UgaXRzIGxlbmd0aCBpcyAwIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFWQ1BhcmFtU2V0IHBhcmFtU2V0KCpwYXJhbVNldExlbiwgZGF0YSk7Ci0gICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKLSAgICAgICAgaWYgKCpwYXJhbVNldExlbiA8IDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZXEgcGFyYW1ldGVyIHNldCBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bVNlcVBhcmFtU2V0cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBwQy0+bVByb2ZpbGVJZGMgPSBkYXRhWzFdOwotICAgICAgICAgICAgcEMtPm1Qcm9maWxlQ29tcGF0aWJsZSA9IGRhdGFbMl07Ci0gICAgICAgICAgICBwQy0+bUxldmVsSWRjID0gZGF0YVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQy0+bVByb2ZpbGVJZGMgIT0gZGF0YVsxXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgIT0gZGF0YVsyXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tTGV2ZWxJZGMgIT0gZGF0YVszXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgcHJvZmlsZS9sZXZlbCBmb3VuZCBpbiBzZXEgcGFyYW1ldGVyIHNldHMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bVNlcVBhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDLT5tUGljUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7Ci0gICAgfQotICAgIHJldHVybiBuZXh0U3RhcnRDb2RlOwotfQotCi1zdGF0dXNfdCBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKHVpbnQ4X3QgKipwT3V0cHV0RGF0YSwgc2l6ZV90ICpwT3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSkKLXsKLSAgICAvL0FMT0dWKCJidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7Ci0KLSAgICBpZiAoIChwT3V0cHV0RGF0YSA9PSBOVUxMKSB8fCAocE91dHB1dFNpemUgPT0gTlVMTCkgKSB7Ci0gICAgICAgIEFMT0dFKCJvdXRwdXQgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICgqcE91dHB1dERhdGEgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQWxyZWFkeSBoYXZlIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAvLyBEYXRhIGlzIGluIHRoZSBmb3JtIG9mIEFWQ0NvZGVjU3BlY2lmaWNEYXRhCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIGRhdGEsIDQpKSB7Ci0gICAgICAgIC8vIDIgYnl0ZXMgZm9yIGVhY2ggb2YgdGhlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGZpZWxkCi0gICAgICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKLSAgICAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqcE91dHB1dFNpemUgPSBzaXplOwotICAgICAgICAqcE91dHB1dERhdGEgPSAodWludDhfdCopbWFsbG9jKHNpemUpOwotICAgICAgICBtZW1jcHkoKnBPdXRwdXREYXRhLCBkYXRhLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFWQ0NvZGVjU3BlY2lmaWNDb250ZXh0IGN0eDsKLSAgICB1aW50OF90ICpvdXRwdXREYXRhID0gTlVMTDsKLSAgICBzaXplX3Qgb3V0cHV0U2l6ZSA9IDA7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgZGF0YSBpcyB2YWxpZAotICAgIHVpbnQ4X3QgdHlwZSA9IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0OwotICAgIGJvb2wgZ290U3BzID0gZmFsc2U7Ci0gICAgYm9vbCBnb3RQcHMgPSBmYWxzZTsKLSAgICBjb25zdCB1aW50OF90ICp0bXAgPSBkYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBkYXRhOwotICAgIHNpemVfdCBieXRlc0xlZnQgPSBzaXplOwotICAgIHNpemVfdCBwYXJhbVNldExlbiA9IDA7Ci0gICAgb3V0cHV0U2l6ZSA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgJiYgIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHRtcCwgNCkpIHsKLSAgICAgICAgdHlwZSA9ICgqKHRtcCArIDQpKSAmIDB4MUY7Ci0gICAgICAgIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0KSB7Ci0gICAgICAgICAgICBpZiAoZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWdvdFNwcykgewotICAgICAgICAgICAgICAgIGdvdFNwcyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCgmY3R4LCB0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLAotICAgICAgICAgICAgICAgICZwYXJhbVNldExlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCkgewotICAgICAgICAgICAgaWYgKCFnb3RTcHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ290UHBzKSB7Ci0gICAgICAgICAgICAgICAgZ290UHBzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KCZjdHgsIHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsCi0gICAgICAgICAgICAgICAgJnBhcmFtU2V0TGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJPbmx5IFNQUyBhbmQgUFBTIE5hbCB1bml0cyBhcmUgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV4dFN0YXJ0Q29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW92ZSBvbiB0byBmaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBzZXQKLSAgICAgICAgYnl0ZXNMZWZ0IC09IG5leHRTdGFydENvZGUgLSB0bXA7Ci0gICAgICAgIHRtcCA9IG5leHRTdGFydENvZGU7Ci0gICAgICAgIG91dHB1dFNpemUgKz0gKDIgKyBwYXJhbVNldExlbik7Ci0gICAgfQotCi0gICAgewotICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cwotICAgICAgICBzaXplX3QgblNlcVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdW5kIG5vdCBmaW5kIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBwaWMgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5QaWNQYXJhbVNldHMgPSBjdHgubVBpY1BhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBwaWN0dXJlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJU08gMTQ0OTYtMTU6IEFWQyBmaWxlIGZvcm1hdAotICAgIG91dHB1dFNpemUgKz0gNzsgIC8vIDcgbW9yZSBieXRlcyBpbiB0aGUgaGVhZGVyCi0gICAgb3V0cHV0RGF0YSA9ICh1aW50OF90ICopbWFsbG9jKG91dHB1dFNpemUpOwotICAgIHVpbnQ4X3QgKmhlYWRlciA9IG91dHB1dERhdGE7Ci0gICAgaGVhZGVyWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCi0gICAgaGVhZGVyWzFdID0gY3R4Lm1Qcm9maWxlSWRjOyAgICAgICAgICAgLy8gcHJvZmlsZSBpbmRpY2F0aW9uCi0gICAgaGVhZGVyWzJdID0gY3R4Lm1Qcm9maWxlQ29tcGF0aWJsZTsgICAgLy8gcHJvZmlsZSBjb21wYXRpYmlsaXR5Ci0gICAgaGVhZGVyWzNdID0gY3R4Lm1MZXZlbElkYzsKLQotICAgIC8vIDYtYml0ICcxMTExMTEnIGZvbGxvd2VkIGJ5IDItYml0IHRvIGxlbmd0aFNpemVNaW51dXNPbmUKLSAgICBpbnQzMl90IHVzZTJCeXRlTmFsTGVuZ3RoID0gMDsKLSAgICBpZiAocGFyYW0gJiYKLSAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5MkJ5dGVOYWxMZW5ndGgsICZ1c2UyQnl0ZU5hbExlbmd0aCkgJiYKLSAgICAgICAgdXNlMkJ5dGVOYWxMZW5ndGgpIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDE7ICAvLyBsZW5ndGggc2l6ZSA9PSAyIGJ5dGVzCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaGVhZGVyWzRdID0gMHhmYyB8IDM7ICAvLyBsZW5ndGggc2l6ZSA9PSA0IGJ5dGVzCi0gICAgfQotCi0gICAgLy8gMy1iaXQgJzExMScgZm9sbG93ZWQgYnkgNS1iaXQgbnVtU2VxdWVuY2VQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5TZXF1ZW5jZVBhcmFtU2V0cyA9IGN0eC5tU2VxUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbNV0gPSAweGUwIHwgblNlcXVlbmNlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSA2OwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1TZXFQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tU2VxUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBzZXFQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBzZXFQYXJhbVNldExlbmd0aCA+PiA4OwotICAgICAgICBoZWFkZXJbMV0gPSBzZXFQYXJhbVNldExlbmd0aCAmIDB4ZmY7Ci0gICAgICAgIC8vQUxPR0UoIiMjIyBTUFMgJWQgJWQgJWQiLCBzZXFQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFNQUyBOQUwgdW5pdCAoc2VxdWVuY2UgcGFyYW1ldGVyIGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgc2VxUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBzZXFQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gOC1iaXQgblBpY3R1cmVQYXJhbWV0ZXJTZXRzCi0gICAgaW50IG5QaWN0dXJlUGFyYW1TZXRzID0gY3R4Lm1QaWNQYXJhbVNldHMuc2l6ZSgpOwotICAgIGhlYWRlclswXSA9IG5QaWN0dXJlUGFyYW1TZXRzOwotICAgIGhlYWRlciArPSAxOwotICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gY3R4Lm1QaWNQYXJhbVNldHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGN0eC5tUGljUGFyYW1TZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIDE2LWJpdCBwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCi0gICAgICAgIHVpbnQxNl90IHBpY1BhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7Ci0gICAgICAgIGhlYWRlclswXSA9IHBpY1BhcmFtU2V0TGVuZ3RoID4+IDg7Ci0gICAgICAgIGhlYWRlclsxXSA9IHBpY1BhcmFtU2V0TGVuZ3RoICYgMHhmZjsKLS8vQUxPR0UoIiMjIyBQUFMgJWQgJWQgJWQiLCBwaWNQYXJhbVNldExlbmd0aCwgaGVhZGVyWzBdLCBoZWFkZXJbMV0pOwotCi0gICAgICAgIC8vIFBQUyBOYWwgdW5pdCAocGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBieXRlcykKLSAgICAgICAgbWVtY3B5KCZoZWFkZXJbMl0sIGl0LT5tRGF0YSwgcGljUGFyYW1TZXRMZW5ndGgpOwotICAgICAgICBoZWFkZXIgKz0gKDIgKyBwaWNQYXJhbVNldExlbmd0aCk7Ci0gICAgfQotCi0gICAgKnBPdXRwdXRTaXplID0gb3V0cHV0U2l6ZTsKLSAgICAqcE91dHB1dERhdGEgPSBvdXRwdXREYXRhOwotICAgIHJldHVybiBPSzsKLX0KLX0vLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU5MTczMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9ERUNPREVSIgotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIE1BWF9ERUNfQlVGRkVSUyAxMAotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVkQnVmZmVyKTsKLQotY2xhc3MgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAotICAgICAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi0gICAgcHJvdGVjdGVkIDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwotICAgICAgICBNZWRpYUJ1ZmZlciogbUJ1ZmZlcjsKLSAgICAgICAgTWVkaWFCdWZmZXJHcm91cCogbUdyb3VwOwotICAgICAgICBNdXRleCBtTG9jazsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogbXBEZWNTaGVsbENvbnRleHQ7Ci0gICAgICAgIGludDMyX3QgbU1heEFVU2l6ZTsKLSAgICAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICAgICAgVklERU9FRElUT1JfQ29kZWNUeXBlIG1Db2RlY1R5cGU7Ci0KLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwgVklERU9FRElUT1JfQ29kZWNUeXBlIGNvZGVjVHlwZSwKLSAgICAgICAgdm9pZCAqZGVjb2RlclNoZWxsQ29udGV4dCkgOgotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1CdWZmZXIoTlVMTCksCi0gICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgICBtQ29kZWNUeXBlKGNvZGVjVHlwZSkgewotICAgIG1wRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBkZWNvZGVyU2hlbGxDb250ZXh0OwotfQotCi1WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKCkgewotICAgIGlmIChtU3RhcnRlZCA9PSB0cnVlKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdGFydCgKLSAgICAgICAgTWV0YURhdGEgKnBhcmFtcykgewotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBpZiAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtTWF4QVVTaXplKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGtLZXlNYXhJbnB1dFNpemUiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICAgICAgaWYgKG1Hcm91cCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkFUQUw6IG1lbW9yeSBsaW1pdGF0aW9uICEgIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtTWF4QVVTaXplKSk7Ci0KLSAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FOgotICAgICAgICAgICAgLy8gV2h5IGRvIHdlIG5lZWQgdG8gY2hlY2sgb24gdGhlIHJlZiBjb3VudD8KLSAgICAgICAgICAgIGludCByZWZfY291bnQgPSBtQnVmZmVyLT5yZWZjb3VudCgpOwotICAgICAgICAgICAgQUxPR1YoIk1lZGlhQnVmZmVyIHJlZmNvdW50IGlzICVkIixyZWZfY291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWZfY291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyKiogYnVmZmVyX291dCwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IHRpbWVfdXM7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICAgICAgb3B0aW9ucy0+Z2V0U2Vla1RvKCZ0aW1lX3VzLCAmbW9kZSk7Ci0gICAgICAgIGlmIChtb2RlICE9IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCByZWFkIG9wdGlvbnMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9FUlIgZXJyOwotICAgICAgICBNNE9TQV9JbnQzMiByYXBUaW1lID0gdGltZV91cyAvIDEwMDA7Ci0KLSAgICAgICAgLyotLS0gUmV0cmlldmUgdGhlIHByZXZpb3VzIFJBUCB0aW1lIC0tLSovCi0gICAgICAgIGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwtPm1fcEZjdEdldFByZXZSYXBUaW1lKAotICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgICAgICByYXBUaW1lIC09IDQwMDAwOwotICAgICAgICAgICAgaWYocmFwVGltZSA8IDApIHJhcFRpbWUgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImdldCByYXAgdGltZSBlcnJvciA9IDB4JXhcbiIsICh1aW50MzJfdCllcnIpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopbXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAmcmFwVGltZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImp1bXAgZXJyID0gMHgleFxuIiwgKHVpbnQzMl90KWVycik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKLSAgICBpZiAobGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gbGVycjsKLSAgICB9Ci0gICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7ICAvLyBjbGVhciBhbGwgdGhlIG1ldGEgZGF0YQotCi0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIC8vZ2V0TmV4dCBBVSBmcm9tIHJlYWRlci4KLSAgICAgICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLSAgICAgICAgbGVyciA9IG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgcEFjY2Vzc1VuaXQpOwotICAgICAgICBpZiAobGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCB8fCBsZXJyID09IE00V0FSX05PX01PUkVfQVUpIHsKLSAgICAgICAgICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jb3B5IHRoZSByZWFkZXIgQVUgYnVmZmVyIHRvIG1CdWZmZXIKLSAgICAgICAgTTRPU0FfVUludDMyIGxTaXplICA9IChwQWNjZXNzVW5pdC0+bV9zaXplID4gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplKVwKLSAgICAgICAgICAgID8gKE00T1NBX1VJbnQzMiltTWF4QVVTaXplIDogcEFjY2Vzc1VuaXQtPm1fc2l6ZTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopbUJ1ZmZlci0+ZGF0YSgpLCh2b2lkICopcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBsU2l6ZSk7Ci0KLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGxTaXplKTsKLSAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IChpbnQ2NF90KSAocEFjY2Vzc1VuaXQtPm1fQ1RTICogMTAwMCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lVXMpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIEFVIHN0YXJ0IGNvZGUgZm9yIEgyNjQKLSAgICAgICAgaWYgKFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWMgPT0gbUNvZGVjVHlwZSkgewotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9KHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIGRhdGFbMF09MDsKLSAgICAgICAgICAgIGRhdGFbMV09MDsKLSAgICAgICAgICAgIGRhdGFbMl09MDsKLSAgICAgICAgICAgIGRhdGFbM109MTsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgKHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9PSAweDA0KT8gMSA6IDApOwotICAgICAgICAqYnVmZmVyX291dCA9IG1CdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LCBNNE9TQV9VSW50MzIgbmJfYml0cykgewotICAgIHJldHVybiAoTTRWRF9Ub29sc19HZXRCaXRzRnJvbU1lbW9yeSgoTTRWU19CaXRzdHJlYW1fY3R4dCopIHBhcnNpbmdDdHh0LAotICAgICAgICAgICAgbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKE00T1NBX1VJbnQ4KiBwVm9sLAotICAgICAgICBNNE9TQV9JbnQzMiBhVm9sU2l6ZSwgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9TaXplKiBwVmlkZW9TaXplKSB7Ci0KLSAgICBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dCBwYXJzaW5nQ3R4dDsKLSAgICBNNE9TQV9VSW50MzIgY29kZSwgajsKLSAgICBNNE9TQV9NZW1BZGRyOCBzdGFydDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQzMiB0aW1lX2luY3JfbGVuZ3RoOwotICAgIE00T1NBX1VJbnQ4IHZvbF92ZXJpZD0wLCBiX2hpZXJhcmNoeV90eXBlOwotCi0gICAgLyogUGFyc2luZyB2YXJpYWJsZXMgKi8KLSAgICBNNE9TQV9VSW50OCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzY2FsYWJpbGl0eSA9IDA7Ci0gICAgTTRPU0FfVUludDggZW5oYW5jZW1lbnRfdHlwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGludGVybGFjZWQgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gMDsKLSAgICBNNE9TQV9VSW50OCBxdWFudF9wcmVjaXNpb24gPSAwOwotCi0gICAgLyogRmlsbCB0aGUgc3RydWN0dXJlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzICovCi0gICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoICAgICAgPSAwOwotICAgIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQgICAgID0gMDsKLQotICAgIHBEY2ktPnVpVGltZVNjYWxlICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVByb2ZpbGUgICAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAwOwotICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcERjaS0+YlVzZU9mUlZMQyAgICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIFJlc2V0IHRoZSBiaXRzdHJlYW0gY29udGV4dCAqLwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gKE00T1NBX01lbUFkZHI4KSBwVm9sOwotCi0gICAgc3RhcnQgPSAoTTRPU0FfTWVtQWRkcjgpIHBWb2w7Ci0KLSAgICAvKiBTdGFydCBwYXJzaW5nICovCi0gICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPCBhVm9sU2l6ZSkgewotICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCw4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGUgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweDIwLi4weDJGIDogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkIHRvIHNhdmUgaXQgZm9yIHZvcCBwYXJzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAoTTRPU0FfVUludDgpY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAvKiBvbmx5IHJlY3Rhbmd1bGFyIGNhc2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlUaW1lU2NhbGUgPSBjb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlcyB0aW1lIGluY3JlbWVudCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGogICAgPSBjb2RlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgMzIpICYmIChqICE9IDApOyBqID4+PTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoID0gKGkgPT0gMCkgPyAxIDogaTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgdGltZV9pbmNyX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAxKSB7IC8qIDEgPSBCaW5hcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7LyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBPQk1DIGRpc2FibGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9sX3ZlcmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc3ByaXRlIGVuYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNwcml0ZV9lbmFibGUgPT0gMSkgfHwgKHNwcml0ZV9lbmFibGUgPT0gMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIHdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgaGVpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgbCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBzcHJpdGUgdG9wIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDYpOy8qIHNwcml0ZSB3YXJwaW5nIHBvaW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV93YXJwaW5nX3BvaW50cyA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsvKiBzcHJpdGUgd2FycGluZyBhY2N1cmFjeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBzcHJpdGUgYnJpZ2h0bmVzcyBjaGFuZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2xfdmVyaWQgIT0gMSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2FkY3QgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcXVhbnQgcHJlY2lzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRfcHJlY2lzaW9uID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIGJpdHMgcGVyIHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXlzY2FsZSBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbG9hZCBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBsb2FkIG5vbiBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcXVhcnRlciBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlc3luYyBtYXJrZXIgZGlzYWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAoY29kZSkgPyAwIDogMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogcmV2ZXJzaWJsZSBWTEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iVXNlT2ZSVkxDID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sX3ZlcmlkICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbmV3cHJlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmlsaXR5ID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBoaWVyYXJjaHkgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfaGllcmFyY2h5X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNCk7LyogcmVmIGxheWVyIGlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJlZiBzYW1wbGluZyBkaXJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogZW5oYW5jZW1lbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHVzZSByZWYgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiB1c2UgcmVmIHRleHR1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjAgOiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7LyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlQcm9maWxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEI1IDogdmlzdWFsX29iamVjdF9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOyAvKiB2aXN1YWwgb2JqZWN0IHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNyk7IC8qIFJlYWxpZ24gb24gYnl0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSBlbmQgLS0tLS0gKi8KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPj4gMikgPT0gMHgyMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogSDI2MyAuLi4tPiB3cm9uZyovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVZVNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfVUludDggKmlueXV2LCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKSB7Ci0gICAgTTRWSUZJX1VJbnQ4IHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotICAgIE00VklGSV9VSW50OCAqb3V0eXV2ID0KLSAgICAgICAgKChNNFZJRklfVUludDgqKSYoUGxhbmVPdXRbMF0ucGFjX2RhdGFbUGxhbmVPdXRbMF0udV90b3BsZWZ0XSkpOwotICAgIGludDMyX3Qgd2lkdGggPSBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIGludDMyX3QgaGVpZ2h0ID0gUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsxXS5wYWNfZGF0YVtQbGFuZU91dFsxXS51X3RvcGxlZnRdKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPQotICAgICAgICAodWludDE2X3QgKikgJihQbGFuZU91dFsyXS5wYWNfZGF0YVtQbGFuZU91dFsyXS51X3RvcGxlZnRdKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweSgodm9pZCAqKW91dHksICh2b2lkICopaW55dXYsIG91dFlzaXplKTsKLQotICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KLSAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCi0gICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOwotICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci12b2lkIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyogZGVjb2RlcnMpIHsKLSAgICBWaWRlb0RlY29kZXIgKnBEZWNvZGVyOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpwT214Q29tcG9uZW50cyA9IE5VTEw7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOwotICAgIHBEZWNvZGVyID0gZGVjb2RlcnMtPmRlY29kZXI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IGRlY29kZXJzLT5kZWNvZGVyTnVtYmVyOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIlN1cHBvcnRlZCBDb2RlY1slZF0gOiVkIiwgaSwgcERlY29kZXItPmNvZGVjKTsKLSAgICAgICAgcE9teENvbXBvbmVudHMgPSBwRGVjb2Rlci0+Y29tcG9uZW50OwotICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgIHBEZWNvZGVyLT5jb21wb25lbnROdW1iZXI7IGorKykgewotICAgICAgICAgICBwUHJvZmlsZUxldmVsID0gcE9teENvbXBvbmVudHMtPnByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgQUxPR1YoIi0tPmNvbXBvbmVudCAlZCIsIGopOwotICAgICAgICAgICBmb3Ioc2l6ZV90IGsgPSAwOyBrIDwgcE9teENvbXBvbmVudHMtPnByb2ZpbGVOdW1iZXI7IGsrKykgewotICAgICAgICAgICAgICAgQUxPR1YoIi0tPnByb2ZpbGU6JWxkIG1heExldmVsOiVsZCIsIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsKys7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLX0KLQotTTRPU0FfRVJSIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzCi0gICAgKE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKLSAgICB9OwotCi0gICAgaW50MzJfdCBzdXBwb3J0Rm9ybWF0cyA9IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqcERlY29kZXJzOwotICAgIFZpZGVvRGVjb2RlciAqcERlY29kZXI7Ci0gICAgVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXMgKnBPbXhDb21wb25lbnRzID0gTlVMTDsKLSAgICBWaWRlb1Byb2ZpbGVMZXZlbCAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7Ci0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBTQUZFX01BTExPQyhwRGVjb2RlcnMsIE00REVDT0RFUl9WaWRlb0RlY29kZXJzLCAxLCAiVmlkZW9EZWNvZGVycyIpOwotICAgIFNBRkVfTUFMTE9DKHBEZWNvZGVyLCBWaWRlb0RlY29kZXIsIHN1cHBvcnRGb3JtYXRzLAotICAgICAgICAiVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJzLT5kZWNvZGVyID0gcERlY29kZXI7Ci0KLSAgICBwRGVjb2RlcnMtPmRlY29kZXJOdW1iZXI9IHN1cHBvcnRGb3JtYXRzOwotICAgIHN0YXR1cyA9IGNsaWVudC5jb25uZWN0KCk7Ci0gICAgQ0hFQ0soc3RhdHVzID09IE9LKTsKLSAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHNpemVvZihrTWltZVR5cGVzKSAvIHNpemVvZihrTWltZVR5cGVzWzBdKTsKLSAgICAgICAgICAgICArK2spIHsKLSAgICAgICAgICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gcmVzdWx0czsKLSAgICAgICAgICAgIENIRUNLX0VRKFF1ZXJ5Q29kZWNzKGNsaWVudC5pbnRlcmZhY2UoKSwga01pbWVUeXBlc1trXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIHF1ZXJ5RGVjb2RlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgU0FGRV9NQUxMT0MocE9teENvbXBvbmVudHMsIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzLAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNpemUoKSwgIlZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIks9JWQiLGspOwotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb21wb25lbnQgPSBwT214Q29tcG9uZW50czsKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29tcG9uZW50TnVtYmVyID0gcmVzdWx0cy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgIGRlY29kZXIgJyVzJyBzdXBwb3J0cyAiLAotICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICAvLyBGSVhNRToKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgaWdub3JlIHRoZSBzb2Z0d2FyZSBjb2RlY3MgYW5kIG1ha2UgSXNTb2Z0d2FyZUNvZGVjKCkKLSAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHB1YmljIEFQSSBmcm9tIE9NWENvZGVjLmNwcAotICAgICAgICAgICAgICAgIGlmIChJc1NvZnR3YXJlQ29kZWMocmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yZSBzb2Z0d2FyZSBjb2RlYyAlcyIsIHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIC8vIENvdW50IHRoZSBzdXBwb3J0ZWQgcHJvZmlsZXMKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHNbal07Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBhc3N1bWUgdGhhdCB0aGUgcHJvZmlsZXMgYXJlIG9yZGVyZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNBRkVfTUFMTE9DKHBQcm9maWxlTGV2ZWwsIFZpZGVvUHJvZmlsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlTnVtYmVyLCAiVmlkZW9Qcm9maWxlTGV2ZWwiKTsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZUxldmVsID0gcFByb2ZpbGVMZXZlbDsKLSAgICAgICAgICAgICAgICBwT214Q29tcG9uZW50cy0+cHJvZmlsZU51bWJlciA9IHByb2ZpbGVOdW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG1heCBMZXZlbCBmb3IgZWFjaCBwcm9maWxlLgotICAgICAgICAgICAgICAgIGludDMyX3QgbWF4TGV2ZWwgPSAtMTsKLSAgICAgICAgICAgICAgICBwcm9maWxlID0gLTE7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsICZwcm9maWxlTGV2ZWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVsc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gLTEgJiYgbWF4TGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBwcm9maWxlTGV2ZWwubVByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IHByb2ZpbGVMZXZlbC5tTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSA9IHByb2ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwgPSBtYXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBwcm9maWxlOiAlbGQsIG1heCBsZXZlbDogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUsIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC5tUHJvZmlsZSAhPSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlcisrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVMZXZlbC5tTGV2ZWwgPiBtYXhMZXZlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzsKLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBrTWltZVR5cGVzW2tdKSkKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29kZWMgPSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Mywga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOwotCi0gICAgICAgICAgICBwRGVjb2RlcisrOwotICAgIH0KLQotICAgIGxvZ1N1cHBvcnREZWNvZGVyc0FuZENhcGFiaWxpdGllcyhwRGVjb2RlcnMpOwotICAgICpkZWNvZGVycyA9IHBEZWNvZGVyczsKLWNsZWFuVXA6Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE1ldGFEYXRhKiBtZXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgYm9vbCBzdWNjZXNzID0gT0s7Ci0gICAgaW50MzJfdCB3aWR0aCA9IDA7Ci0gICAgaW50MzJfdCBoZWlnaHQgPSAwOwotICAgIGludDMyX3QgZnJhbWVTaXplID0gMDsKLSAgICBpbnQzMl90IHZXaWR0aCwgdkhlaWdodDsKLSAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIGJlZ2luIik7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2V2lkdGgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2SGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigidldpZHRoID0gJWQsIHZIZWlnaHQgPSAlZCIsIHZXaWR0aCwgdkhlaWdodCk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA9IHZXaWR0aDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgPSB2SGVpZ2h0OwotCi0gICAgaWYgKCFtZXRhLT5maW5kUmVjdCgKLSAgICAgICAgICAgICAgICBrS2V5Q3JvcFJlY3QsICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSkgewotCi0gICAgICAgIGNyb3BMZWZ0ID0gY3JvcFRvcCA9IDA7Ci0gICAgICAgIGNyb3BSaWdodCA9IHZXaWR0aCAtIDE7Ci0gICAgICAgIGNyb3BCb3R0b20gPSB2SGVpZ2h0IC0gMTsKLQotICAgICAgICBBTE9HVigiZ290IGRpbWVuc2lvbnMgb25seSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImdvdCBjcm9wIHJlY3QgJWQsICVkLCAlZCwgJWQiLAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5sZWZ0ID0gY3JvcExlZnQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LnJpZ2h0ID0gY3JvcFJpZ2h0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC50b3AgPSBjcm9wVG9wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5ib3R0b20gPSBjcm9wQm90dG9tOwotCi0gICAgd2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgaGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgOiBXPSVkIEg9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoMCAhPSB3aWR0aCkgJiYgKDAgIT0gaGVpZ2h0KSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIGlmKCAoTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKSAmJgotICAgICAgICAocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID09IFwKLSAgICAgICAgICAgICh1aW50MzJfdCl3aWR0aCkgJiYKLSAgICAgICAgKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCA9PSBcCi0gICAgICAgICAgICAodWludDMyX3QpaGVpZ2h0KSApIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byByZWNvbmZpZ3VyZQotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhICByZXNldDogVz0lZCBIPSVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgLy8gVXBkYXRlIHRoZSBzdHJlYW0gaGFuZGxlciBwYXJhbWV0ZXJzCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGggID0gd2lkdGg7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGZyYW1lU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wKLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSA6IHJlc2V0IHRoZSBidWZmZXIgcG9vbCIpOwotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2wocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBlcnIgPSAgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCgmcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgTUFYX0RFQ19CVUZGRVJTLCAoTTRPU0FfQ2hhciopIlZJREVPRURJVE9SX0RlY29kZWRCdWZmZXJQb29sIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2luaXRQb29sQnVmZmVycyhwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLAotICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSArIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogMik7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICkgewotICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBjb2xvciBjb252ZXJ0ZXIKLSAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgIT0gTlVMTCApIHsKLSAgICAgICAgQUxPR1YoIiMjIyBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IDogcmVsZWFzaW5nIGRlY29kZXIiKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RvcCgpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmNsZWFyKCk7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgaWYoIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgU0FGRV9GUkVFKHBEZWNTaGVsbENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwgTTRPU0FfVm9pZCAqcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgYm9vbCBzdWNjZXNzID0gVFJVRTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0gICAgaW50IGRlY29kZXJPdXRwdXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFN0cmVhbUhhbmRsZXIsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmVhZGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY1NoZWxsQ29udGV4dCwgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyIik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyID0KLSAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IHBBY2Nlc3NVbml0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbCA9IHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyID0gcFJlYWRlckRhdGFJbnRlcmZhY2U7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIHN3aXRjaCggcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOwotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFZPTCBoZWFkZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKXBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICZwRGVjU2hlbGxDb250ZXh0LT5tX0RjaSwgJnBEZWNTaGVsbENvbnRleHQtPm1fVmlkZW9TaXplKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjY0VmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IGluY29ycmVjdCBzdHJlYW0gdHlwZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzICAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzICAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYlJlbmRlcmVkRnJhbWVzICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdFJlbmRlcmVkQ3RzICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYk91dHB1dEZyYW1lcyAgICA9IDA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgICAgID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCAgID0gTTRPU0FfTlVMTDsKLQotICAgIC8vIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gdmlkZW8gZnJhbWVzLgotICAgIENIRUNLKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID4gMCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBmYWxzZSwgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNvbG9yIGZvcm1hdAotICAgIHN1Y2Nlc3MgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICBrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpY29sb3JGb3JtYXQ7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBHZXQgdGhlIGNvbG9yIGNvbnZlcnRlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBuZXcgSTQyMENvbG9yQ29udmVydGVyOwotICAgIGlmIChwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGRlY29kZXJPdXRwdXQgPSBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5nZXREZWNvZGVyT3V0cHV0Rm9ybWF0KCk7Ci0gICAgfQotCi0gICAgaWYgKGRlY29kZXJPdXRwdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR0koImRlY29kZXIgb3V0cHV0IGZvcm1hdCA9IDB4JVhcbiIsIGRlY29kZXJPdXRwdXQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvU29mdHdhcmVEZWNvZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcFJlYWRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0LCBNNE9TQV9Wb2lkICpwVXNlckRhdGEpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKLSAgICBib29sIHN1Y2Nlc3MgPSBUUlVFOwotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBzaXplID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFkYXRhID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNTaGVsbENvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9Ci0gICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwgPSBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICBzd2l0Y2goIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBWT0wgaGVhZGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmcERlY1NoZWxsQ29udGV4dC0+bV9EY2ksICZwRGVjU2hlbGxDb250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcyAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHZpZGVvIGZyYW1lcy4KLSAgICBpZihwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA+IDApewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRnJhbWVJbnRlcnZhbE1zID0KLSAgICAgICAgICAgIDEwMDAuMCAvIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0gICAgZGVjb2Rlck1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHN3aXRjaCggcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlICkgewotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM6Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBkZWNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGRlY29kZXIgc291cmNlCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZSA9IG5ldyBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgZGVjb2Rlck1ldGFkYXRhLCBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUsCi0gICAgICAgICh2b2lkICopcERlY1NoZWxsQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gc3RhdHVzLCBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAgQUxPR0koIlVzaW5nIHNvZnR3YXJlIGNvZGVjcyBvbmx5Iik7Ci0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgZmFsc2UsIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UsTlVMTCxPTVhDb2RlYzo6a1NvZnR3YXJlQ29kZWNzT25seSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLmdldCgpLAotICAgICAgICBNNEVSUl9TRl9ERUNPREVSX1JTUkNfRkFJTCk7Ci0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBzdWNjZXNzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgcG9vbCBmcm9tIHRoZSBtZXRhZGF0YQotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICBzdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgKnBDb250ZXh0ID0gKE00T1NBX0NvbnRleHQpcERlY1NoZWxsQ29udGV4dDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95KHBEZWNTaGVsbENvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIDogRE9ORSIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIqIHBOZXh0RnJhbWVDdHM7Ci0gICAgTTRPU0FfVUludDMyICpwbGFzdERlY29kZWRGcmFtZUN0czsKLSAgICBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsKiBwcm9maWxlOwotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERlY0NvbmZJbmZvOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbiBiZWdpbiIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfQVZDTGFzdERlY29kZWRGcmFtZUNUUzoKLSAgICAgICAgICAgICBwbGFzdERlY29kZWRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKikgcFZhbHVlOwotICAgICAgICAgICAgICpwbGFzdERlY29kZWRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8gPSAoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZTsKLQotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21ham9yID0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01BSk9SOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX21pbm9yPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUlOT1I7Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfUkVWSVNJT047Ci0gICAgICAgICAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmVyc2lvbkluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZToKLSAgICAgICAgICAgIC8qKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcFZpZGVvU2l6ZSA9IChNNERFQ09ERVJfVmlkZW9TaXplKilwVmFsdWU7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpV2lkdGgpKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgICAgICAgICAoaW50MzJfdCopKCZwVmlkZW9TaXplLT5tX3VpSGVpZ2h0KSk7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uIDogVz0lZCBIPSVkIiwKLSAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGgsIHBWaWRlb1NpemUtPm1fdWlIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX05leHRSZW5kZXJlZEZyYW1lQ1RTOgotICAgICAgICAgICAgLyoqIEhvdyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbi4gU0YgZGVjb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoaXMuICoKLSAgICAgICAgICAgICoqIExldCB1cyBwcm92aWRlIGxhc3QgZGVjb2RlZCBmcmFtZSBDVFMgYXMgb2Ygbm93LiAqCi0gICAgICAgICAgICAqKiBPbmx5IFZQUyB1c2VzIHRoaXMgT3B0aW9uIElELiAqLwotICAgICAgICAgICAgcE5leHRGcmFtZUN0cyA9IChNNE9TQV9VSW50MzIgKilwVmFsdWU7Ci0gICAgICAgICAgICAqcE5leHRGcmFtZUN0cyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfTVBFRzRfa09wdGlvbklEX0RlY29kZXJDb25maWdJbmZvOgotICAgICAgICAgICAgaWYocERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID09IFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjKSB7Ci0gICAgICAgICAgICAgICAgKCooTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKilwVmFsdWUpID0KLSAgICAgICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9EY2k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOiBlbmQgd2l0aCBlcnIgPSAweCV4IiwgbGVycik7Ci0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCAqcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb24gYmVnaW4iKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlcjogewotICAgICAgICAgICAgICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIHBPdXRwdXRGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRERUNPREVSX091dHB1dEZpbHRlciopIHBWYWx1ZTsKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUqKXBPdXRwdXRGaWx0ZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRmlsdGVyRnVuY3Rpb247Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyVXNlckRhdGEgPQotICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RmlsdGVyLT5tX3BGaWx0ZXJVc2VyRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbGVyciA9IE00RVJSX0JBRF9DT05URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjogZW5kIHdpdGggZXJyID0gMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRPU0FfQm9vbCBiSnVtcCwgTTRPU0FfVUludDMyIHRvbGVyYW5jZSkgewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqKSBjb250ZXh0OwotICAgIGludDY0X3QgbEZyYW1lVGltZTsKLSAgICBNZWRpYUJ1ZmZlciogcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhQnVmZmVyKiBwTmV4dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyU3RhdHVzOwotICAgIGJvb2wgbmVlZFNlZWsgPSBiSnVtcDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgYmVnaW4iKTsKLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TICkgewotICAgICAgICAvLyBEbyBub3QgY2FsbCByZWFkKCksIGl0IGNvdWxkIGxlYWQgdG8gYSBmcmVlemUKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSA6IEVPUyBhbHJlYWR5IHJlYWNoZWQiKTsKLSAgICAgICAgbGVyciA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICB9Ci0gICAgaWYocERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA+PSAqcFRpbWUpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9kZWNvZGU6IEFscmVhZHkgZGVjb2RlZCB1cCB0byB0aGlzIHRpbWUgQ1RTID0gJWxmLiIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTKTsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgIH0KLSAgICBpZihNNE9TQV9UUlVFID09IGJKdW1wKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU6IEp1bXAgY2FsbGVkIik7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzKXsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSAqcFRpbWU7Ci0KLSAgICB3aGlsZSAocERlY29kZXJCdWZmZXIgPT0gTlVMTCB8fCBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTICsgdG9sZXJhbmNlIDwgKnBUaW1lKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsIGZyYW1lQ1RTID0gJWxmLCBEZWNvZGVVcFRvID0gJWxmIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMsICpwVGltZSk7Ci0KLSAgICAgICAgLy8gUmVhZCB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YWdlZnJpZ2h0IGRlY29kZXIKLSAgICAgICAgaWYgKG5lZWRTZWVrKSB7Ci0gICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGludDY0X3QgdGltZV91cyA9ICpwVGltZSAqIDEwMDA7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyh0aW1lX3VzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBlcnJTdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5yZWFkKCZwTmV4dEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgbmVlZFNlZWsgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyclN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnJlYWQoJnBOZXh0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBFT1MgYW5kIGZvcm1hdCBjaGFuZ2UKLSAgICAgICAgaWYgKGVyclN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBBTE9HVigiRW5kIG9mIHN0cmVhbSByZWFjaGVkLCByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAiKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFjaGVkRU9TID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGxlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgLy8gSWYgd2UgZGVjb2RlZCBhIGJ1ZmZlciBiZWZvcmUgRU9TLCB3ZSBzdGlsbCBuZWVkIHRvIHB1dCBpdAotICAgICAgICAgICAgLy8gaW50byB0aGUgcXVldWUuCi0gICAgICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgJiYgYkp1bXApIHsKLSAgICAgICAgICAgICAgICBjb3B5QnVmZmVyVG9RdWV1ZShwRGVjU2hlbGxDb250ZXh0LCBwRGVjb2RlckJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0gZWxzZSBpZiAoSU5GT19GT1JNQVRfQ0hBTkdFRCA9PSBlcnJTdGF0dXMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlIDogc291cmNlIHJldHVybnMgSU5GT19GT1JNQVRfQ0hBTkdFRCIpOwotICAgICAgICAgICAgbGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSgKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LAotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGxlcnIgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiEhISBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgRVJST1IgOiAiCi0gICAgICAgICAgICAgICAgICAgICJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIHJldHVybnMgMHglWCIsIGxlcnIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIEVSUk9SOjB4JXgoJWQpIiwKLSAgICAgICAgICAgICAgICBlcnJTdGF0dXMsZXJyU3RhdHVzKTsKLSAgICAgICAgICAgIGxlcnIgPSBlcnJTdGF0dXM7Ci0gICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgT01YQ29kZWMgY2xpZW50IHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSAwLWxlbmd0aCBidWZmZXJzCi0gICAgICAgIC8vIGFuZCBkcm9wIHRoZSAwLWxlbmd0aCBidWZmZXJzLgotICAgICAgICBpZiAocE5leHRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHBOZXh0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyB3ZSBoYXZlIGEgZ29vZCBuZXh0IGJ1ZmZlciwgcmVsZWFzZSB0aGUgcHJldmlvdXMgb25lLgotICAgICAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgcERlY29kZXJCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IHBOZXh0QnVmZmVyOwotCi0gICAgICAgIC8vIFJlY29yZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZGVjb2RlZCBidWZmZXIKLSAgICAgICAgcERlY29kZXJCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZsRnJhbWVUaW1lKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyA9IChNNF9NZWRpYVRpbWUpKGxGcmFtZVRpbWUvMTAwMCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUsZGVjb2RlZCBmcmFtZXRpbWUgPSAlbGYsc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgIChNNF9NZWRpYVRpbWUpbEZyYW1lVGltZSwgcERlY29kZXJCdWZmZXItPnNpemUoKSApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSBhIGJ1ZmZlciBpZiBiSnVtcCA9PSBmYWxzZSB0byBhIHF1ZXVlLiBUaGVzZQotICAgICAgICAgKiBidWZmZXJzIGhhdmUgYSB0aW1lc3RhbXAgPj0gdGhlIHRhcmdldCB0aW1lLCAqcFRpbWUgKGZvciBpbnN0YW5jZSwKLSAgICAgICAgICogdGhlIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gdmlkZW9zLCBvciBhIHRyaW1taW5nIHBvc3Rpb24gaW5zaWRlCi0gICAgICAgICAqIG9uZSB2aWRlbyksIHNpbmNlIHRoZXkgYXJlIHBhcnQgb2YgdGhlIHRyYW5zaXRpb24gY2xpcCBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlby4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgKnBUaW1lIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYW55IG9mIHRoZSBleGlzdGluZwotICAgICAgICAgKiB2aWRlbyBmcmFtZXMsIHdlIHdvdWxkIGxpa2UgdG8gZ2V0IHRoZSBidWZmZXIgcmlnaHQgYmVmb3JlICpwVGltZQotICAgICAgICAgKiBhbmQgaW4gdGhlIHRyYW5zY29kaW5nIHBocmFzZSwgdGhpcyB2aWRlbyBmcmFtZSB3aWxsIGJlIGVuY29kZWQKLSAgICAgICAgICogYXMgYSBrZXkgZnJhbWUgYW5kIGJlY29tZXMgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIGZvciB0aGUgdHJhbnNpdGlvbiBvciB0aGUKLSAgICAgICAgICogdHJpbW1lZCB2aWRlbyB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgYnVmZmVyIG11c3QgYWxzbyBiZSBxdWV1ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqLwotICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVNcyA9Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyArCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyArCi0gICAgICAgICAgICAgICAgdG9sZXJhbmNlOwotICAgICAgICBpZiAoIWJKdW1wIHx8IHRhcmdldFRpbWVNcyA+ICpwVGltZSkgewotICAgICAgICAgICAgbGVyciA9IGNvcHlCdWZmZXJUb1F1ZXVlKHBEZWNTaGVsbENvbnRleHQsIHBEZWNvZGVyQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSAqcFRpbWU7Ci0KLVZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA6Ci0gICAgKnBUaW1lID0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUzsKLSAgICBpZiAocERlY29kZXJCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBwRGVjb2RlckJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTogZW5kIHdpdGggMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1zdGF0aWMgTTRPU0FfRVJSIGNvcHlCdWZmZXJUb1F1ZXVlKAotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQsCi0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVyQnVmZmVyKSB7Ci0KLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogdG1wRGVjQnVmZmVyOwotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIHF1ZXVlCi0gICAgbGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9nZXRCdWZmZXIocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eSwgJnRtcERlY0J1ZmZlcik7Ci0gICAgaWYgKGxlcnIgPT0gKE00T1NBX1VJbnQzMilNNEVSUl9OT19CVUZGRVJfQVZBSUxBQkxFKSB7Ci0gICAgICAgIGxlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyKAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkLCAmdG1wRGVjQnVmZmVyKTsKLSAgICAgICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChsZXJyICE9IE00Tk9fRVJST1IpIHJldHVybiBsZXJyOwotCi0gICAgLy8gQ29sb3IgY29udmVydCBvciBjb3B5IGZyb20gdGhlIGdpdmVuIE1lZGlhQnVmZmVyIHRvIG91ciBidWZmZXIKLSAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Y29udmVydERlY29kZXJPdXRwdXRUb0k0MjAoCi0gICAgICAgICAgICAodWludDhfdCAqKXBEZWNvZGVyQnVmZmVyLT5kYXRhKCksLy8gPz8gKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksICAgLy8gZGVjb2RlckJpdHMKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoLCAgLy8gZGVjb2RlcldpZHRoCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQsICAvLyBkZWNvZGVySGVpZ2h0Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QsICAvLyBkZWNvZGVyUmVjdAotICAgICAgICAgICAgdG1wRGVjQnVmZmVyLT5wRGF0YSAvKiBkc3RCaXRzICovKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0RGVjb2Rlck91dHB1dFRvSTQyMCBmYWlsZWQiKTsKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBpbnQzMl90IHdpZHRoID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIGludDMyX3QgaGVpZ2h0ID0gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBpbnQzMl90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaW50MzJfdCB1dlBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0IC8gNDsKLSAgICAgICAgaW50MzJfdCBvZmZzZXRTcmMgPSAwOwotCi0gICAgICAgIGlmICgoIHdpZHRoID09IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICkgICYmCi0gICAgICAgICAgICAoIGhlaWdodCA9PSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmYgPSAoTTRPU0FfTWVtQWRkcjgpcERlY29kZXJCdWZmZXItPmRhdGEoKSArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopdG1wRGVjQnVmZmVyLT5wRGF0YSwgKHZvaWQgKilwVG1wQnVmZiwgeVBsYW5lU2l6ZSk7Ci0KLSAgICAgICAgICAgIG9mZnNldFNyYyArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodDsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUpLAotICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwotCi0gICAgICAgICAgICBvZmZzZXRTcmMgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDEpICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCA+PiAxKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YSArIHlQbGFuZVNpemUgKyB1dlBsYW5lU2l6ZSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikocFRtcEJ1ZmYgKyBvZmZzZXRTcmMpLCB1dlBsYW5lU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBwVG1wQnVmZiA9IChNNE9TQV9NZW1BZGRyOClwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpOwotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmZEc3QgPSAoTTRPU0FfTWVtQWRkcjgpdG1wRGVjQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgICAgIGludDMyX3QgaW5kZXg7Ci0KLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQ7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKCBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgLSBoZWlnaHQpKTsKLSAgICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBoZWlnaHQgPj4gMTsgaW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wQnVmZkRzdCwgKHZvaWQgKilwVG1wQnVmZiwgd2lkdGggPj4gMSk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZiArPSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwVG1wQnVmZiArPSAoKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoICogKHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbkhlaWdodCAtIGhlaWdodCkpIC8gNCk7Ci0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0RlY29kZXJfZGVjb2RlOiB1bmV4cGVjdGVkIGNvbG9yIGZvcm1hdCAweCVYIiwKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPmRlY091cHV0Q29sb3JGb3JtYXQpOwotICAgICAgICBsZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHRtcERlY0J1ZmZlci0+YnVmZkNUUyA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgdG1wRGVjQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkOwotICAgIHRtcERlY0J1ZmZlci0+c2l6ZSA9IHBEZWNvZGVyQnVmZmVyLT5zaXplKCk7Ci0KLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0cHV0UGxhbmUsCi0gICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBNNE9TQV9VSW50MzIgbGluZGV4LCBpOwotICAgIE00T1NBX1VJbnQ4KiBwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lSW4sIHRtcFBsYW5lT3V0OwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHBUbXBWSURFT0VESVRPUkJ1ZmZlciwgKnBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIE00X01lZGlhVGltZSBjYW5kaWRhdGVUaW1lU3RhbXAgPSAtMTsKLSAgICBNNE9TQV9Cb29sIGJGb3VuZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGNvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVGltZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRwdXRQbGFuZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIFRoZSBvdXRwdXQgYnVmZmVyIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICBpZiAoICgqcFRpbWUgPD0gcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09IGJGb3JjZVJlbmRlcikgKSB7Ci0gICAgICAgIEFMT0dWKCJWSURFT0VESVRPUl9WSURFT19yZW5kZXIgRnJhbWUgaW4gdGhlIHBhc3QiKTsKLSAgICAgICAgZXJyID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9yZW5kZXI6IGxhc3RSZW5kZXJlZCB0aW1lID0gJWxmLHJlcXVlc3RlZCByZW5kZXIgdGltZSA9ICIKLSAgICAgICAgIiVsZiIsIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cywgKnBUaW1lKTsKLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGJ1ZmZlciBhcHByb3ByaWF0ZSBmb3IgcmVuZGVyaW5nLiAgKi8KLSAgICBmb3IgKGk9MDsgaSA8IHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wtPk5COyBpKyspIHsKLSAgICAgICAgcFRtcFZJREVPRURJVE9SQnVmZmVyID0gJnBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2xcCi0gICAgICAgICAgICAtPnBOWFBCdWZmZXJbaV07Ci0gICAgICAgIGlmIChwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID09IFZJREVPRURJVE9SX0JVRkZFUl9rRmlsbGVkKSB7Ci0gICAgICAgICAgICAvKiogRnJlZSBhbGwgdGhvc2UgYnVmZmVycyBvbGRlciB0aGFuIGxhc3QgcmVuZGVyZWQgZnJhbWUuICovCi0gICAgICAgICAgICBpZiAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTIDwgcERlY1NoZWxsQ29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBtX2xhc3RSZW5kZXJDdHMpIHsKLSAgICAgICAgICAgICAgICBwVG1wVklERU9FRElUT1JCdWZmZXItPnN0YXRlID0gVklERU9FRElUT1JfQlVGRkVSX2tFbXB0eTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqIEdldCB0aGUgYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgdGltZXN0YW1wICAqLwotICAgICAgICAgICAgaWYgKCAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTID49IHBEZWNTaGVsbENvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPD0gKnBUaW1lKSAmJgotICAgICAgICAgICAgICAgIChwVG1wVklERU9FRElUT1JCdWZmZXItPmJ1ZmZDVFMgPiBjYW5kaWRhdGVUaW1lU3RhbXApKSB7Ci0gICAgICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwUmVuZGVyVklERU9FRElUT1JCdWZmZXIgPSBwVG1wVklERU9FRElUT1JCdWZmZXI7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlVGltZVN0YW1wID0gcFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfcmVuZGVyOiBmb3VuZCBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCA9ICVsZiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKE00T1NBX0ZBTFNFID09IGJGb3VuZCkgewotICAgICAgICBlcnIgPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgMyBvdXB1dCAlZCAlZCAlZCAlZCIsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoLCBwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQsCi0gICAgICAgIHBPdXRwdXRQbGFuZVswXS51X3RvcGxlZnQsIHBPdXRwdXRQbGFuZVswXS51X3N0cmlkZSk7Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSBjYW5kaWRhdGVUaW1lU3RhbXA7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIgKSB7Ci0gICAgICAgIC8vIEZpbHRlcmluZyB3YXMgcmVxdWVzdGVkCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHRtcFBsYW5lWzNdOwotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIGNvbnZlcnNpb24KLSAgICAgICAgdG1wUGxhbmVbMF0udV93aWR0aCAgID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS51X2hlaWdodCAgPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICB0bXBQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVswXS51X3N0cmlkZSAgPSB0bXBQbGFuZVswXS51X3dpZHRoOwotICAgICAgICB0bXBQbGFuZVswXS5wYWNfZGF0YSAgPSAoTTRWSUZJX1VJbnQ4KilwUmVuZGVyVklERU9FRElUT1JCdWZmZXItPnBEYXRhOwotICAgICAgICB0bXBQbGFuZVsxXS51X3dpZHRoICAgPSB0bXBQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfaGVpZ2h0ICA9IHRtcFBsYW5lWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzBdLnVfc3RyaWRlLzI7Ci0gICAgICAgIHRtcFBsYW5lWzFdLnBhY19kYXRhICA9IHRtcFBsYW5lWzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICh0bXBQbGFuZVswXS51X3N0cmlkZSAqIHRtcFBsYW5lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgdG1wUGxhbmVbMl0udV93aWR0aCAgID0gdG1wUGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMl0udV9oZWlnaHQgID0gdG1wUGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfc3RyaWRlICA9IHRtcFBsYW5lWzFdLnVfc3RyaWRlOwotICAgICAgICB0bXBQbGFuZVsyXS5wYWNfZGF0YSAgPSB0bXBQbGFuZVsxXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAodG1wUGxhbmVbMV0udV9zdHJpZGUgKiB0bXBQbGFuZVsxXS51X2hlaWdodCk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciB3ID0gJWQgSCA9ICVkIiwKLSAgICAgICAgICAgIHRtcFBsYW5lWzBdLnVfd2lkdGgsdG1wUGxhbmVbMF0udV9oZWlnaHQpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BGaWx0ZXIoTTRPU0FfTlVMTCwgJnRtcFBsYW5lWzBdLCBwT3V0cHV0UGxhbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEp1c3QgY29weSB0aGUgWVVWNDIwUCBidWZmZXIKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcEJ1ZmZQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBSZW5kZXJWSURFT0VESVRPUkJ1ZmZlci0+cERhdGE7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wV2lkdGggPQotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSGVpZ2h0ID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzBdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgdGVtcFdpZHRoICogdGVtcEhlaWdodCk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICh0ZW1wV2lkdGggKiB0ZW1wSGVpZ2h0KTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgICAgIHRlbXBCdWZmUHRyICs9ICgodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKikgcE91dHB1dFBsYW5lWzJdLnBhY19kYXRhLCAodm9pZCAqKXRlbXBCdWZmUHRyLAotICAgICAgICAgICAgKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcysrOwotICAgIGlmICggMCA+IHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICkgewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLSAgICB9Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyA9ICpwVGltZTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgICpwVGltZSA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0czsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdENyZWF0ZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVzdHJveSAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0R2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RTZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlY29kZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZTsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0UmVuZGVyICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyOwotCi0gICAgKnBEZWNJbnRlcmZhY2UgPSAoTTRPU0FfQ29udGV4dClwRGVjb2RlckludGVyZmFjZTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9WaWRlb1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogcERlY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UgPSAoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgIHNpemVvZihNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UpLCBNNERFQ09ERVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlIiApOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAqcERlY29kZXJUeXBlID0gZGVjb2RlclR5cGU7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0Q3JlYXRlICAgID0gVmlkZW9FZGl0b3JWaWRlb1NvZnR3YXJlRGVjb2Rlcl9jcmVhdGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlc3Ryb3kgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0LAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX01QRUc0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfa1ZpZGVvVHlwZUFWQywKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLQotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcygKLSAgICBNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgcmV0dXJuIHF1ZXJ5VmlkZW9EZWNvZGVyQ2FwYWJpbGl0aWVzKGRlY29kZXJzKTsKLX0KLQotfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDc4NzY4MC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBlbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVklERU9FRElUT1JfVklERU9FTkNPREVSIgotCi0vKioqKioqKioqKioqKioqKioqKgotICogICAgIEhFQURFUlMgICAgICoKLSAqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotI2luY2x1ZGUgIk1lZGlhQnVmZmVyUHVsbGVyLmgiCi0jaW5jbHVkZSA8STQyMENvbG9yQ29udmVydGVyLmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gRm9yY2UgdXNpbmcgaGFyZHdhcmUgZW5jb2RlcgotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtIYXJkd2FyZUNvZGVjc09ubHkKLQotI2lmICFkZWZpbmVkKFZJREVPRURJVE9SX0ZPUkNFQ09ERUMpCi0gICAgI2Vycm9yICJDYW5ub3QgZm9yY2UgRFNJIHJldHJpZXZhbCBpZiBjb2RlYyB0eXBlIGlzIG5vdCBmaXhlZCIKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgU09VUkNFIENMQVNTICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICZvcGVyYXRvcj0oCi0gICAgICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgJik7Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUZpcnN0QnVmZmVyTGluazsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbUxhc3RCdWZmZXJMaW5rOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtTmJCdWZmZXI7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Jc0VPUzsKLSAgICAgICAgU3RhdGUgICAgICAgICAgICAgbVN0YXRlOwotICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtRW5jRm9ybWF0OwotICAgICAgICBNdXRleCAgICAgICAgICAgICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgbUJ1ZmZlckNvbmQ7Ci19OwotCi1zcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCkgewotCi0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGFTb3VyY2UgPQotICAgICAgICBuZXcgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoZm9ybWF0KTsKLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1Jc0VPUyhmYWxzZSksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjp+VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoKSB7Ci0KLSAgICAvLyBTYWZldHkgY2xlYW4gdXAKLSAgICBpZiggU1RBUlRFRCA9PSBtU3RhdGUgKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydChNZXRhRGF0YSAqbWV0YSkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdGFydCgpIGJlZ2luIik7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIGJlZ2luIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcDogaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFJlbGVhc2UgdGhlIGJ1ZmZlciBjaGFpbgotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0gICAgd2hpbGUoIG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICAgICAgZGVsZXRlIHRtcExpbms7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCA6ICVkIGJ1ZmZlciByZW1haW5lZCIsIGkpOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9wKCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyByZWFkT3B0aW9uczsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlckNoYWluKiB0bXBMaW5rID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6cmVhZCgpIGJlZ2luIik7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMICYmICFtSXNFT1MpIHsKLSAgICAgICAgbUJ1ZmZlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gRW5kIG9mIHN0cmVhbT8KLSAgICBpZiAobUZpcnN0QnVmZmVyTGluayA9PSBOVUxMKSB7Ci0gICAgICAgICpidWZmZXIgPSBOVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQgOiBFT1MiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgLy8gR2V0IGEgYnVmZmVyIGZyb20gdGhlIGNoYWluCi0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLSAgICB0bXBMaW5rID0gbUZpcnN0QnVmZmVyTGluazsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0KLSAgICBpZiAoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICB9Ci0gICAgZGVsZXRlIHRtcExpbms7Ci0gICAgbU5iQnVmZmVyLS07Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoKSBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoKSBiZWdpbiIpOwotCi0gICAgaWYoIE5VTEwgPT0gYnVmZmVyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIDogcmVhY2hlZCBFT1MiKTsKLSAgICAgICAgbUlzRU9TID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgICAgIG5ld0xpbmstPmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgbmV3TGluay0+bmV4dExpbmsgPSBOVUxMOwotICAgICAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgICAgICBtTGFzdEJ1ZmZlckxpbmstPm5leHRMaW5rID0gbmV3TGluazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IG5ld0xpbms7Ci0gICAgICAgIG1OYkJ1ZmZlcisrOwotICAgIH0KLSAgICBtQnVmZmVyQ29uZC5zaWduYWwoKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgZW5kIik7Ci0gICAgcmV0dXJuIG1OYkJ1ZmZlcjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb250ZXh0IG9mIHRoZSBTdGFnZUZyaWdodCB2aWRlbyBlbmNvZGVyCi0gKiAgICAgICAgICAgc2hlbGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIENSRUFURUQgICA9IDB4MSwKLSAgICBPUEVORUQgICAgPSAweDIsCi0gICAgU1RBUlRFRCAgID0gMHg0LAotICAgIEJVRkZFUklORyA9IDB4OCwKLSAgICBSRUFESU5HICAgPSAweDEwCi19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfU3RhdGUgICAgIG1TdGF0ZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgbVdyaXRlckRhdGFJbnRlcmZhY2U7Ci0gICAgTTRWUFBfYXBwbHlfZmN0KiAgICAgICAgICAgICAgICAgIG1QcmVQcm9jRnVuY3Rpb247Ci0gICAgTTRWUFBfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1QcmVQcm9jQ29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICAgbUFjY2Vzc1VuaXQ7Ci0gICAgTTRFTkNPREVSX1BhcmFtcyogICAgICAgICAgICAgICAgIG1Db2RlY1BhcmFtczsKLSAgICBNNEVOQ09ERVJfSGVhZGVyICAgICAgICAgICAgICAgICAgbUhlYWRlcjsKLSAgICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVV9mY3QqICAgbUgyNjROQUxVUG9zdFByb2Nlc3NGY3Q7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgIG1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICBtTGFzdENUUzsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gbUVuY29kZXJTb3VyY2U7Ci0gICAgT01YQ2xpZW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyOwotICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFICAgICAgICAgICAgICBtRW5jb2RlckNvbG9yRm9ybWF0OwotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiAgICAgICAgICAgICAgICBtUHVsbGVyOwotICAgIEk0MjBDb2xvckNvbnZlcnRlciogICAgICAgICAgICAgICBtSTQyMENvbG9yQ29udmVydGVyOwotCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RJbnB1dEN0czsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbnB1dEN0czsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0RnJhbWVzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RPdXRwdXRDdHM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotCi0gICAgTWVkaWFQcm9maWxlcyAqbVZpZGVvRWRpdG9yUHJvZmlsZTsKLSAgICBpbnQzMl90IG1NYXhQcmVmZXRjaEZyYW1lczsKLX0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSShNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgc3A8TWV0YURhdGE+IG1ldGFEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0gICAgaW50MzJfdCBzdHJpZGUgPSAwOwotICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKLSAgICBpbnQzMl90IGZyYW1lcmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBpc0NvZGVjQ29uZmlnID0gMDsKLSAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0gICAgTWVkaWFCdWZmZXIqIGlucHV0QnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICBzcDxWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZT4gZW5jb2RlclNvdXJjZSA9IE5VTEw7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBOVUxMOzsKLSAgICBPTVhDbGllbnQgY2xpZW50OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gbWV0YURhdGEuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIGVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKG1ldGFEYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSAgICAvLyBWSURFT0VESVRPUl9GT1JDRUNPREVDIE1VU1QgYmUgZGVmaW5lZCBoZXJlCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSAgICBlbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIG1ldGFEYXRhLCB0cnVlLAotICAgICAgICBlbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IGVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8qKgotICAgICAqIFNlbmQgZmFrZSBmcmFtZXMgYW5kIHJldHJpZXZlIHRoZSBEU0kKLSAgICAgKi8KLSAgICAvLyBTZW5kIGEgZmFrZSBmcmFtZSB0byB0aGUgc291cmNlCi0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAgICAgJnN0cmlkZSk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAgICAgJmhlaWdodCk7Ci0gICAgbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lcmF0ZSk7Ci0gICAgc2l6ZSA9IChzaXplX3QpKHN0cmlkZSpoZWlnaHQqMykvMjsKLSAgICBpbnB1dEJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplKTsKLSAgICBpbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAwKTsKLSAgICBuYkJ1ZmZlciA9IGVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGlucHV0QnVmZmVyKTsKLSAgICBlbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihOVUxMKTsgLy8gU2lnbmFsIEVPUwotCi0gICAgLy8gQ2FsbCByZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdGFydCgpOzsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICByZXN1bHQgPSBlbmNvZGVyLT5yZWFkKCZvdXRwdXRCdWZmZXIsIE5VTEwpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMID09IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAvLyBGb3IgSDI2NCwgZm9ybWF0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gYnVpbGRBVkNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICh1aW50OF90KiopKCYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpKSwKLSAgICAgICAgICAgIChzaXplX3QqKSgmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKSksCi0gICAgICAgICAgICAoY29uc3QgdWludDhfdCopb3V0cHV0QnVmZmVyLT5kYXRhKCkgKyBvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgZW5jb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRm9yIE1QRUc0LCBqdXN0IGNvcHkgdGhlIERTSQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKW91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUsICJFbmNvZGVyIGhlYWRlciIpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwKLSAgICAgICAgICAgICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkob3V0cHV0QnVmZmVyLT5kYXRhKCkpK291dHB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUpOwotICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICByZXN1bHQgPSBlbmNvZGVyLT5zdG9wKCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLWNsZWFuVXA6Ci0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBpZiAoIGVuY29kZXIgIT0gTlVMTCApIHsgZW5jb2Rlci5jbGVhcigpOyB9Ci0gICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBpZiAoIGVuY29kZXJTb3VyY2UgIT0gTlVMTCApIHsgZW5jb2RlclNvdXJjZS5jbGVhcigpOyB9Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKgotICogRU5HSU5FIElOVEVSRkFDRSAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LCBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQgZW5jb2RlcklucHV0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IGJlZ2luOiBmb3JtYXQgICVkIiwgZm9ybWF0KTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFZQUGZjdCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWUFBjdHh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQ1JFQVRFRDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZSA9IHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbiA9IHBWUFBmY3Q7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHJlUHJvY0NvbnRleHQgPSBwVlBQY3R4dDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBOVUxMOwotCi0gICAgLy8gR2V0IGNvbG9yIGNvbnZlcnRlciBhbmQgZGV0ZXJtaW5lIGVuY29kZXIgaW5wdXQgZm9ybWF0Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gbmV3IEk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyLT5pc0xvYWRlZCgpKSB7Ci0gICAgICAgIGVuY29kZXJJbnB1dCA9IHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0Rm9ybWF0KCk7Ci0gICAgfQotICAgIGlmIChlbmNvZGVySW5wdXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQgPSAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpZW5jb2RlcklucHV0OwotICAgIEFMT0dJKCJlbmNvZGVyIGlucHV0IGZvcm1hdCA9IDB4JVhcbiIsIGVuY29kZXJJbnB1dCk7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjYzKE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2MywgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rTVBFRzQsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9IMjY0KE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwKLSAgICAgICAgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpCi0gICAgICAgIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0KE00RU5DT0RFUl9rSDI2NCwgcENvbnRleHQsCi0gICAgICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBwVlBQZmN0LCBwVlBQY3R4dCwgcEV4dGVybmFsQVBJLCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT1BFTkVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcyk7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBDUkVBVEVEOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVLCBNNE9TQV9Wb2lkKiBwUGFyYW1zKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVOQ09ERVJfUGFyYW1zKiBwQ29kZWNQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaVByb2ZpbGUgPSAwOwotICAgIGludDMyX3QgaUxldmVsID0gMDsKLQotICAgIGludDMyX3QgaUZyYW1lUmF0ZSA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiPj4+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBBVSwgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFBhcmFtcywgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcENvZGVjUGFyYW1zID0gKE00RU5DT0RFUl9QYXJhbXMqKXBQYXJhbXM7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soQ1JFQVRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29udGV4dCBpbml0aWFsaXphdGlvbgotICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQgPSBwQVU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tVmlkZW9FZGl0b3JQcm9maWxlID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1NYXhQcmVmZXRjaEZyYW1lcyA9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVZpZGVvRWRpdG9yUHJvZmlsZS0+Z2V0VmlkZW9FZGl0b3JDYXBQYXJhbUJ5TmFtZSgKLSAgICAgICAgIm1heFByZWZldGNoWVVWRnJhbWVzIik7Ci0KLSAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcywgTTRFTkNPREVSX1BhcmFtcywgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZvcm1hdCA9IHBDb2RlY1BhcmFtcy0+SW5wdXRGb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPklucHV0RnJhbWVXaWR0aCA9Ci0gICAgICAgIHBDb2RlY1BhcmFtcy0+SW5wdXRGcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0ID0KLSAgICAgICAgcENvZGVjUGFyYW1zLT5JbnB1dEZyYW1lSGVpZ2h0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoID0gcENvZGVjUGFyYW1zLT5GcmFtZVdpZHRoOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCA9IHBDb2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUgPSBwQ29kZWNQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSA9IHBDb2RlY1BhcmFtcy0+RnJhbWVSYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPSBwQ29kZWNQYXJhbXMtPkZvcm1hdDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlID0gcENvZGVjUGFyYW1zLT52aWRlb1Byb2ZpbGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw9IHBDb2RlY1BhcmFtcy0+dmlkZW9MZXZlbDsKLQotICAgIC8vIENoZWNrIG91dHB1dCBmb3JtYXQgY29uc2lzdGVuY3kgYW5kIHJlc29sdXRpb24KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCAgJSAxNiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCAlIDE2LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLyoqCi0gICAgICogU3RhZ2VGcmlnaHQgZ3JhcGggYnVpbGRpbmcKLSAgICAgKi8KLQotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjYzOgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbiA6IGluY29ycmVjdCBpbnB1dCBmb3JtYXQiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaVByb2ZpbGUgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlOwotICAgIGlMZXZlbCA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb0xldmVsOwotICAgIEFMT0dWKCJFbmNvZGVyIG1pbWUgJXMgcHJvZmlsZSAlZCwgbGV2ZWwgJWQiLAotICAgICAgICBtaW1lLGlQcm9maWxlLCBpTGV2ZWwpOwotICAgIEFMT0dWKCJFbmNvZGVyIHcgJWQsIGggJWQsIGJpdHJhdGUgJWQsIGZwcyAlZCIsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlKTsKLSAgICBDSEVDSyhpUHJvZmlsZSAhPSAweDdmZmZmZmZmKTsKLSAgICBDSEVDSyhpTGV2ZWwgIT0gMHg3ZmZmZmZmZik7Ci0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGlQcm9maWxlKTsKLSAgICAvL0ZJWE1FOgotICAgIC8vIFRlbXA6IERvIG5vdCBzZXQgdGhlIGxldmVsIGZvciBNcGVnNCAvIEguMjYzIEVuYwotICAgIC8vIGFzIE9NWC5OdmlkaWEubXA0LmVuY29kZXIgYW5kIE9NWC5OdmlkaWEuaDI2My5lbmNvZGVyCi0gICAgLy8gcmV0dXJuIDB4ODAwMDEwMTkKLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PSBNNEVOQ09ERVJfa0gyNjQpIHsKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwgaUxldmVsKTsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlTdHJpZGUsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsCi0gICAgICAgIChpbnQzMl90KXBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodCk7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2s1X0ZQUzogICAgaUZyYW1lUmF0ZSA9IDU7ICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6ICBpRnJhbWVSYXRlID0gODsgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTBfRlBTOiAgIGlGcmFtZVJhdGUgPSAxMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMl81X0ZQUzogaUZyYW1lUmF0ZSA9IDEzOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzogICBpRnJhbWVSYXRlID0gMTU7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAgIGlGcmFtZVJhdGUgPSAyMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6ICAgaUZyYW1lUmF0ZSA9IDI1OyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzogICBpRnJhbWVSYXRlID0gMzA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOgotICAgICAgICAgICAgaUZyYW1lUmF0ZSA9IDMwOwotICAgICAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgc2V0IHRvIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTOiBzZXQgdG8gMzAiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1VTRV9USU1FU0NBTEU6Ci0gICAgICAgICAgICBpRnJhbWVSYXRlID0gMzA7Ci0gICAgICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBzZXQgdG8gTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFOiAgc2V0IHRvIDMwIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0VuY29kZXJfb3BlbjppbmNvcnJlY3QgZnJhbWVyYXRlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBpRnJhbWVSYXRlKTsKLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlCaXRSYXRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAxKTsKLQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyQ29sb3JGb3JtYXQpOwotCi0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgIT0gTTRFTkNPREVSX2tIMjYzKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZW5jb2RlciBEU0kKLSAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJKHBFbmNvZGVyQ29udGV4dCwgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICBOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbm5lY3QgdG8gdGhlIE9NWCBjbGllbnQKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBPTVggY29kZWMKLSNpZmRlZiBWSURFT0VESVRPUl9GT1JDRUNPREVDCi0gICAgY29kZWNGbGFncyB8PSBPTVhDb2RlYzo6VklERU9FRElUT1JfRk9SQ0VDT0RFQzsKLSNlbmRpZiAvKiBWSURFT0VESVRPUl9GT1JDRUNPREVDICovCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLCBOVUxMLCBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXIgPSBuZXcgTWVkaWFCdWZmZXJQdWxsZXIoCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIpOwotCi0gICAgLy8gU2V0IHRoZSBuZXcgc3RhdGUKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Eb3VibGUgQ3RzLAotICAgICAgICBNNE9TQV9Cb29sIGJSZWFjaGVkRU9TKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwT3V0UGxhbmVbM107Ci0gICAgTWVkaWFCdWZmZXIqIGJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50MzJfdCBuYkJ1ZmZlciA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGJlZ2luOiBjdHMgICVmIiwgQ3RzKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGlmICggTTRPU0FfRkFMU0UgPT0gYlJlYWNoZWRFT1MgKSB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplWSA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVdpZHRoICoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemVVID0gc2l6ZVkgPj4gMjsKLSAgICAgICAgTTRPU0FfVUludDMyIHNpemUgID0gc2l6ZVkgKyAyKnNpemVVOwotICAgICAgICBNNE9TQV9VSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClzaXplKTsKLSAgICAgICAgcERhdGEgPSAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICAvLyBQcmVwYXJlIHRoZSBvdXRwdXQgaW1hZ2UgZm9yIHByZS1wcm9jZXNzaW5nCi0gICAgICAgIHBPdXRQbGFuZVswXS51X3dpZHRoICAgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfaGVpZ2h0ICA9IHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZUhlaWdodDsKLSAgICAgICAgcE91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfd2lkdGggICA9IHBPdXRQbGFuZVswXS51X3dpZHRoLzI7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X2hlaWdodCAgPSBwT3V0UGxhbmVbMF0udV9oZWlnaHQvMjsKLSAgICAgICAgcE91dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMF0udV9zdHJpZGUvMjsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfd2lkdGggICA9IHBPdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBwT3V0UGxhbmVbMl0udV9oZWlnaHQgID0gcE91dFBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICBwT3V0UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfc3RyaWRlICA9IHBPdXRQbGFuZVsxXS51X3N0cmlkZTsKLQotICAgICAgICBwT3V0UGxhbmVbMF0ucGFjX2RhdGEgPSBwRGF0YTsKLSAgICAgICAgcE91dFBsYW5lWzFdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWTsKLSAgICAgICAgcE91dFBsYW5lWzJdLnBhY19kYXRhID0gcERhdGEgKyBzaXplWSArIHNpemVVOwotCi0gICAgICAgIC8vIEFwcGx5IHByZS1wcm9jZXNzaW5nCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NGdW5jdGlvbigKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NDb250ZXh0LCBNNE9TQV9OVUxMLCBwT3V0UGxhbmUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAvLyBDb252ZXJ0IE1lZGlhQnVmZmVyIHRvIHRoZSBlbmNvZGVyIGlucHV0IGZvcm1hdCBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcikgewotICAgICAgICAgICAgSTQyMENvbG9yQ29udmVydGVyKiBjb252ZXJ0ZXIgPSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2lkdGggPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICAgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0KLSAgICAgICAgICAgIGludCBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQ7Ci0gICAgICAgICAgICBBUmVjdCBlbmNvZGVyUmVjdDsKLSAgICAgICAgICAgIGludCBlbmNvZGVyQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlci0+Z2V0RW5jb2RlcklucHV0QnVmZmVySW5mbygKLSAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyV2lkdGgsICZlbmNvZGVySGVpZ2h0LAotICAgICAgICAgICAgICAgICZlbmNvZGVyUmVjdCwgJmVuY29kZXJCdWZmZXJTaXplKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGVuY29kZXJCdWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXItPmNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhLCAgLy8gc3JjQml0cwotICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyV2lkdGgsIGVuY29kZXJIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXJSZWN0LAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbmV3QnVmZmVyLT5kYXRhKCkgKyBuZXdCdWZmZXItPnJhbmdlX29mZnNldCgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvbnZlcnRJNDIwVG9FbmNvZGVySW5wdXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIG5ldyBidWZmZXIKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIG1ldGFkYXRhCi0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCAoaW50NjRfdCkoQ3RzKjEwMDApKTsKLSAgICB9Ci0KLSAgICAvLyBQdXNoIHRoZSBidWZmZXIgdG8gdGhlIHNvdXJjZSwgYSBOVUxMIGJ1ZmZlciwgbm90aWZpZXMgdGhlIHNvdXJjZSBvZiBFT1MKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlcnJvciAweCVYIiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiggTlVMTCAhPSBidWZmZXIgKSB7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwgTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBidWZmZXIsICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIEFVCi0gICAgaWYgKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygwID09ICgoTTRPU0FfVUludDMyKWJ1ZmZlci0+ZGF0YSgpKSU0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZ2V0KCksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgaWYgKCBidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpMzJUbXApICYmIGkzMlRtcCApewotICAgICAgICB7ICAgLy8gRGlzcGxheSB0aGUgRFNJCi0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBEU0kgJWQiLAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgdWludDhfdCogdG1wID0gKHVpbnQ4X3QqKShidWZmZXItPmRhdGEoKSk7Ci0gICAgICAgICAgICBmb3IoIHVpbnQzMl90IGk9MDsgaTxidWZmZXItPnJhbmdlX2xlbmd0aCgpOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkRTSSBbJWRdICUuMlgiLCBpLCB0bXBbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIENUUwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZpNjRUbXApLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgICAgIGlmICggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyA9IGk2NFRtcDsKLQotICAgICAgICBDdHMgPSAoTTRPU0FfSW50MzIpKGk2NFRtcC8xMDAwKTsKLSAgICAgICAgQUxPR1YoIltUU19DSEVDS10gVkkvRU5DIFdSSVRFIGZyYW1lICVkIEAgJWxsZCAtPiAlZCAobGFzdCAlZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMsIGk2NFRtcCwgQ3RzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgIGlmICggQ3RzIDwgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyApIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBXQVJOSU5HIDogQ3RzIGlzIGdvaW5nICIKLSAgICAgICAgICAgICJiYWNrd2FyZHMgJWQgPCAlZCIsIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0gICAgICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiAlZCAlZCIsCi0gICAgICAgICAgICBDdHMsIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RDVFMpOwotCi0gICAgICAgIC8vIFJldHJpZXZlIHRoZSBBVSBjb250YWluZXIKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFN0YXJ0QVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPD0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIC8vIFJlbW92ZSBIMjY0IEFVIHN0YXJ0IGNvZGUKLSAgICAgICAgaWYgKCBNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ICkgewotICAgICAgICAgICAgaWYgKCFtZW1jbXAoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIFwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSApIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NGY3QpICkgewotICAgICAgICAvLyBIMjY0IHRyaW1taW5nIGNhc2UsIE5BTFUgcG9zdCBwcm9jZXNzaW5nIGlzIG5lZWRlZAotICAgICAgICBNNE9TQV9JbnQzMiBvdXRwdXRTaXplID0gcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZTsKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NDdHgsCi0gICAgICAgICAgICAoTTRPU0FfVUludDgqKWJ1ZmZlci0+ZGF0YSgpK2J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICZvdXRwdXRTaXplKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPSAoTTRPU0FfVUludDMyKW91dHB1dFNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGUgQVUgY2FuIGp1c3QgYmUgY29waWVkCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5cCi0gICAgICAgICAgICAgICAgZGF0YUFkZHJlc3MsICh2b2lkICopKChNNE9TQV9NZW1BZGRyOCkoYnVmZmVyLT5kYXRhKCkpK2J1ZmZlci0+XAotICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCgpKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsJmkzMlRtcCkgJiYgaTMyVG1wKXsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmF0dHJpYnV0ZSA9IEFVX1BfRnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyA9IEN0czsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+Q1RTID0gQ3RzOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5EVFMgPSBDdHM7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXI6IEFVIEAgMHglWCAweCVYICVkICVkIiwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKnBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkNUUyk7Ci0KLSAgICAgICAgLy8gV3JpdGUgdGhlIEFVCi0gICAgICAgIGVyciA9IHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnN0cmVhbS0+c3RyZWFtSUQsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0KTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgMHglWCAlZiAlZCIsIHBJblBsYW5lLCBDdHMsIEZyYW1lTW9kZSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLSAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQlVGRkVSSU5HOwotICAgIH0KLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gQ3RzOwotICAgIH0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgPSBDdHM7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIDB4JVggJWQgJWYgKCVkKSIsIHBJblBsYW5lLCBGcmFtZU1vZGUsCi0gICAgICAgIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0KLSAgICAvLyBQdXNoIHRoZSBpbnB1dCBidWZmZXIgdG8gdGhlIGVuY29kZXIgc291cmNlCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgQ3RzLAotICAgICAgICBNNE9TQV9GQUxTRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHNvdXJjZSBpbiBjYXNlIG9mIEVPUwotICAgIGlmICggTTRFTkNPREVSX2tMYXN0RnJhbWUgPT0gRnJhbWVNb2RlICkgewotICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIDAsIE00T1NBX1RSVUUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLSAgICBpZiAoIEJVRkZFUklORyA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgLy8gUHJlZmV0Y2ggaXMgY29tcGxldGUsIHN0YXJ0IHJlYWRpbmcKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBSRUFESU5HOwotICAgIH0KLSAgICAvLyBSZWFkCi0gICAgd2hpbGUgKDEpICB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKTsKLQotICAgICAgICBpZiAob3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGludDMyX3QgWVVWQnVmZmVyTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS0+Z2V0TnVtYmVyT2ZCdWZmZXJzSW5RdWV1ZSgpOwotICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bSBudW1iZXIgb2YgcHJlZmV0Y2ggWVVWIGZyYW1lcyBpcwotICAgICAgICAgICAgICogbm90IGV4Y2VlZGVkLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzYWdlIG9mIHZpZGVvIGVkaXRvciBlbmdpbmUuCi0gICAgICAgICAgICAgKiBUaGUgdmFsdWUgb2YgbWF4aW11bSBwcmVmZXRjaCBZdXYgZnJhbWVzIGlzIGRlZmluZWQgaW4gbWVkaWFfcHJvZmlsZXMueG1sICovCi0gICAgICAgICAgICBpZiAoKFlVVkJ1ZmZlck51bWJlciA8IHBFbmNvZGVyQ29udGV4dC0+bU1heFByZWZldGNoRnJhbWVzKSB8fAotICAgICAgICAgICAgICAgIChwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPmhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpCi0gICAgICAgICAgICAgICAgICAgID09IHRydWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBQcm92aWRlIHRoZSBlbmNvZGVkIEFVIHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICByZXN1bHQgICAgICAgICAgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgID0gLTEuMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0SW5wdXRDdHMgICA9IC0xLjA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgPSAwOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gLTE7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgPSAtMTsKLQotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0YXJ0KCk7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RhcnQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFNlbmQgRU9TIGFnYWluIHRvIG1ha2Ugc3VyZSB0aGUgc291cmNlIGRvZXNuJ3QgYmxvY2suCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKHBFbmNvZGVyQ29udGV4dCwgMCwKLSAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnVmZmVycyBpZiBuZWNlc3NhcnkKLSAgICBpZiAoIChCVUZGRVJJTkcgfCBSRUFESU5HKSAmIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICB3aGlsZSAoMSkgIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+Z2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciA9PSBOVUxMKSBicmVhazsKLQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQsIG91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5wdXRCdWZmZXIob3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gU1RBUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaCBtb2R1bGUgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKCBTVEFSVEVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnN0b3AoKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IE9QRU5FRDsKLSAgICB9Ci0KLSAgICBpZiAocEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAhPSBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcykgewotICAgICAgICBBTE9HVygiU29tZSBmcmFtZXMgd2VyZSBub3QgZW5jb2RlZDogaW5wdXQoJWQpICE9IG91dHB1dCglZCkiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiAoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcmVndWxCaXRSYXRlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgQUxPR1coInJlZ3VsQml0UmF0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gc3RhcnQgb3B0aW9uSUQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9TZXRIMjY0UHJvY2Vzc05BTFVmY3RzUHRyOgotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCA9Ci0gICAgICAgICAgICAgICAgKEgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVX2ZjdCopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQ6Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzQ3R4ID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfQ29udGV4dClvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIGJlZ2luIG9wdGluSWQgMHglWCIsIG9wdGlvbklEKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlcjoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMICE9IHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICAqKE00RU5DT0RFUl9IZWFkZXIqKilvcHRpb25WYWx1ZSA9ICYocEVuY29kZXJDb250ZXh0LT5tSGVhZGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9Gb3JtYXQgZm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBGb3JtYXQsICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEVuY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luIDB4JXggMHgleCAlZCIsIHBGb3JtYXQsCi0gICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyIik7Ci0KLSAgICAqcEZvcm1hdCA9IGZvcm1hdDsKLQotICAgIHN3aXRjaCggZm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2NDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0X0gyNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIDogdW5zdXBwb3J0ZWQgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW47Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RTdGFydCAgICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0b3AgICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3A7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RQYXVzZSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UmVzdW1lICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xlYW51cCAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFJlZ3VsQml0UmF0ZSA9Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3JlZ3VsQml0UmF0ZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEVuY29kZSAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZTsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tIMjYzLCBwRm9ybWF0LAotICAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX2tNUEVHNCwgcEZvcm1hdCwKLSAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa0gyNjQsIHBGb3JtYXQsCi0gICAgICAgICAgIHBFbmNvZGVySW50ZXJmYWNlLCBtb2RlKTsKLQotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTJkMjExMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1YTUzMGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIwotIyBsaWJ2aWRlb2ZpbHRlcnMKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycwotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBcCi0gICAgICBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyBcCi0gICAgICBNNFZJRklfQ2xpcC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIFwKLSAgICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMC5jIFwKLSAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00VkZMX3RyYW5zaXRpb24uYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VkZMX3RyYW5zaXRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE1ZTBiNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRUUkFOX3RyYW5zaXRpb24uYwotICogQGJyaWVmCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqIE9TQUwgKG1lbXNldCBhbmQgbWVtY3B5KSAqKiovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpbmNsdWRlICJNNFZGTF90cmFuc2l0aW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgTTRWRkxfU1dBUF9TSE9SVChhKSBhID0gKChhICYgMHhGRikgPDwgOCkgfCAoKGEgJiAweEZGMDApID4+IDgpCi0jZWxzZQotI2RlZmluZSBNNFZGTF9TV0FQX1NIT1JUKGEpCi0jZW5kaWYKLQotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotCi0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYUJ5U3RlcChNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRkxfTW9kaWZMdW1QYXJhbSAqbHVtX3BhcmFtLCB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIHVuc2lnbmVkIGxvbmcgbGYxLCBsZjIsIGxmMzsKLSAgICBsb25nIGksIGo7Ci0KLSAgICBpZiAobHVtX3BhcmFtLT5jb3B5X2Nocm9tYSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogY29weSBjaHJvbWEgcGxhbmUgKi8KLQotICAgIH0KLQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIHN3aXRjaChsdW1fcGFyYW0tPmx1bV9mYWN0b3IpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgICAgLyogdmVyeSBzcGVjaWZpYyBjYXNlIDogc2V0IGx1bWEgcGxhbmUgdG8gMTYgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2Rlc3QsMTYsIHVfd2lkdGgpOwotICAgICAgICAgICAgcF9kZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgMToKLSAgICAgICAgLyogMC4yNSAqLwotICAgICAgICBsZjEgPSA2OyBsZjIgPSA2OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIC8qIDAuMzc1ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgLyogMC41ICovCi0gICAgICAgIGxmMSA9IDc7IGxmMiA9IDc7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgLyogMC42MjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICAvKiAwLjc1ICovCi0gICAgICAgIGxmMSA9IDg7IGxmMiA9IDg7IGxmMyA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgLyogMC44NzUgKi8KLSAgICAgICAgbGYxID0gOTsgbGYyID0gODsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKCgocGl4IDw8IGxmMSkgKyAocGl4IDw8IGxmMikgKyAocGl4IDw8IGxmMykgKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsdW1fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgKnBfc3JjLCAqcF9kZXN0LCAqcF9zcmNfbGluZSwgKnBfZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGNoYXIgKnBfY3NyYywgKnBfY2Rlc3QsICpwX2NzcmNfbGluZSwgKnBfY2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBsb25nIHBpeF9zcmM7Ci0gICAgdW5zaWduZWQgbG9uZyB1X291dHB4LCB1X291dHB4MjsKLSAgICB1bnNpZ25lZCBsb25nIHVfd2lkdGgsIHVfc3RyaWRlLCB1X3N0cmlkZV9vdXQsdV9oZWlnaHQsIHBpeDsKLSAgICBsb25nIGksIGo7Ci0KLSAgICAvKiBjb3B5IG9yIGZpbHRlciBjaHJvbWEgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMV0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzFdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gcGxhbmVfaW5bMV0udV9zdHJpZGU7Ci0gICAgdV9zdHJpZGVfb3V0ID0gcGxhbmVfb3V0WzFdLnVfc3RyaWRlOwotICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMV0ucGFjX2RhdGFbcGxhbmVfb3V0WzFdLnVfdG9wbGVmdF07Ci0gICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMV0ucGFjX2RhdGFbcGxhbmVfaW5bMV0udV90b3BsZWZ0XTsKLQotICAgIGlmIChsdW1fZmFjdG9yID4gMjU2KQotICAgIHsKLSAgICAgICAgcF9jZGVzdCA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyYyA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICAvKiBjb3B5IGNocm9tYSAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3RfbGluZSwgKHZvaWQgKilwX2NzcmNfbGluZSwgdV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdCwodm9pZCAqKSBwX2NzcmMsIHVfd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgICAgICBwX2NzcmMgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogZmlsdGVyIGNocm9tYSAqLwotICAgICAgICBwaXggPSAoMTAyNCAtIGx1bV9mYWN0b3IpIDw8IDc7Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMrKyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIHBfY2Rlc3RfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9vdXRbMl0ucGFjX2RhdGFbcGxhbmVfb3V0WzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgcF9jZGVzdCA9IHBfY2Rlc3RfbGluZTsKLSAgICAgICAgICAgIHBfY3NyYyA9IHBfY3NyY19saW5lOwotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfY2Rlc3QrKyA9ICgocGl4ICsgKCpwX2NzcmMgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBhcHBseSBsdW1hIGZhY3RvciAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblswXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMF0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSAocGxhbmVfaW5bMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgdV9zdHJpZGVfb3V0ID0gKHBsYW5lX291dFswXS51X3N0cmlkZSA+PiAxKTsKLSAgICBwX2Rlc3QgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX291dFswXS5wYWNfZGF0YVtwbGFuZV9vdXRbMF0udV90b3BsZWZ0XTsKLSAgICBwX3NyYyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfaW5bMF0ucGFjX2RhdGFbcGxhbmVfaW5bMF0udV90b3BsZWZ0XTsKLSAgICBwX2Rlc3RfbGluZSA9IHBfZGVzdDsKLSAgICBwX3NyY19saW5lID0gcF9zcmM7Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKHBpeCAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLSAqIEBicmllZiAgIEJsZW5kcyB0d28gWVVWIDQ6MjowIFBsYW5hciBpbWFnZXMuCi0gKiBAbm90ZSAgICBCbGVuZHMgWVVWNDIwIHBsYW5hciBpbWFnZXMsCi0gKiAgICAgICAgICBNYXAgdGhlIHZhbHVlIG9mIHByb2dyZXNzIGZyb20gKDAgLSAxMDAwKSB0byAoMCAtIDEwMjQpCi0gKiAgICAgICAgICBTZXQgdGhlIHJhbmdlIG9mIGJsZW5kaW5nZmFjdG9yLAotICogICAgICAgICAgICAgICAgICAxLiBmcm9tIDAgdG8gKFByb2dyZXNzIDw8IDEpICAgICAgICAgICAgO2ZvciBQcm9ncmVzcyA8PSA1MTIKLSAqICAgICAgICAgICAgICAgICAgMi4gZnJvbSAoKCBQcm9ncmVzcyAtIDUxMik8PCAxKSB0byAxMDI0IDtvdGhlcndpc2UKLSAqICAgICAgICAgIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyBieSB0aGUgZmFjdG9yLAotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UtMSkgLyAoaW1hZ2Ugd2lkdGgtMSkgIDtmb3Igd2lkdGggPj0gcmFuZ2UKLSAqICAgICAgICAgICAgICAgICAgPSAgKFJhbmdlKSAvIChpbWFnZSB3aWR0aCkgICAgICA7b3RoZXJ3aXNlCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2goPSBpKSByb3cgb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoKD0gaikgY29sdW1uIG9mIG91dHB1dCBZIHBsYW5lIChzdGVwcyBvZiAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIG9uZSBVICYgViBzYW1wbGUgZnJvbSB0d28gaW5wdXQgWVVWNDoyOjAgaW1hZ2VzIGFuZAotICogICAgICAgICAgICAgICAgICBDb21wdXRlIGZvdXIgWSBzYW1wbGUgYW5kIG9uZSBVICYgViBzYW1wbGUgZm9yIG91dHB1dCBZVVY0OjI6MCBpbWFnZQotICogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIGZvbGxvd2luZywKLSAqICAgICAgICAgICAgICAgICAgT3V0KGksaikgPSBibGVuZGluZ2ZhY3RvcihpLGopICogSW4xKGksaikrIChsIC0gYmxlbmRpbmdmYWN0b3IoaSxqKSkgKkluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lSW4yOiAoSU4pICBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiogQ2hlY2sgZm9yIHZhbHVlIGlzIEVWRU4gKi8KLSNpZm5kZWYgSVNfRVZFTgotI2RlZmluZSBJU19FVkVOKGEpICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyoqIFVzZWQgZm9yIGZpeGVkIHBvaW50IGltcGxlbWVudGF0aW9uICovCi0jaWZuZGVmIE1BWF9TSE9SVAotI2RlZmluZSBNQVhfU0hPUlQgICAweDEwMDAwCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgICAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0jZW5kaWYKLQotdW5zaWduZWQgY2hhciBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBQcm9ncmVzcykKLXsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDEsKnB1OF9kYXRhX1Vfc3RhcnQxLCpwdThfZGF0YV9WX3N0YXJ0MTsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDIsKnB1OF9kYXRhX1Vfc3RhcnQyLCpwdThfZGF0YV9WX3N0YXJ0MjsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9zdGFydDMsKnB1OF9kYXRhX1Vfc3RhcnQzLCpwdThfZGF0YV9WX3N0YXJ0MzsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MSwgKnB1OF9kYXRhX1lfbmV4dDEsICpwdThfZGF0YV9VMSwgKnB1OF9kYXRhX1YxOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQyLCAqcHU4X2RhdGFfWV9uZXh0MiwgKnB1OF9kYXRhX1UyLCAqcHU4X2RhdGFfVjI7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDMsKnB1OF9kYXRhX1lfbmV4dDMsICpwdThfZGF0YV9VMywgKnB1OF9kYXRhX1YzOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTEsIHUzMl9zdHJpZGUyX1kxLCB1MzJfc3RyaWRlX1UxLCB1MzJfc3RyaWRlX1YxOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTIsIHUzMl9zdHJpZGUyX1kyLCB1MzJfc3RyaWRlX1UyLCB1MzJfc3RyaWRlX1YyOwotICAgIFVJbnQzMiAgIHUzMl9zdHJpZGVfWTMsIHUzMl9zdHJpZGUyX1kzLCB1MzJfc3RyaWRlX1UzLCB1MzJfc3RyaWRlX1YzOwotICAgIFVJbnQzMiAgIHUzMl9oZWlnaHQsICB1MzJfd2lkdGg7Ci0gICAgVUludDMyICAgdTMyX2JsZW5kZmFjdG9yLCB1MzJfc3RhcnRBLCB1MzJfZW5kQSwgdTMyX2JsZW5kX2luYywgdTMyX3hfYWNjdW07Ci0gICAgVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdywgdTMyX3JhbmdlQSwgdTMyX3Byb2dyZXNzOwotICAgIFVJbnQzMiAgIHUzMl9VMSx1MzJfVjEsdTMyX1UyLHUzMl9WMiwgdTMyX1kxLCB1MzJfWTI7Ci0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIGhlaWdodCBpcyBFVkVOIGFuZCBpbWFnZSBwbGFuZSBoZWlnaHRzIGFyZSBzYW1lICovCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluMVswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZUluMlswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjFbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjJbMF0udV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBZIHBsYW5lIHdpZHRoIGlzIEVWRU4gYW5kIGltYWdlIHBsYW5lIHdpZHRocyBhcmUgc2FtZSAqLwotICAgIGlmKCAoSVNfRVZFTihwUGxhbmVJbjFbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVJbjJbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXRbMF0udV93aWR0aCkgPT0gRkFMU0UpICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4xWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lSW4yWzBdLnVfd2lkdGggICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dDEgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQxID0gcFBsYW5lSW4xWzBdLnBhY19kYXRhICsgcFBsYW5lSW4xWzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MSA9IHBQbGFuZUluMVsxXS5wYWNfZGF0YSArIHBQbGFuZUluMVsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDEgPSBwUGxhbmVJbjFbMl0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0MiBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDIgPSBwUGxhbmVJbjJbMF0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQyID0gcFBsYW5lSW4yWzFdLnBhY19kYXRhICsgcFBsYW5lSW4yWzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MiA9IHBQbGFuZUluMlsyXS5wYWNfZGF0YSArIHBQbGFuZUluMlsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MyA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDMgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQzID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBpbnB1dDEgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMSA9IHBQbGFuZUluMVswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UxID0gcFBsYW5lSW4xWzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjEgPSBwUGxhbmVJbjFbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggaW5wdXQyIFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTIgPSBwUGxhbmVJbjJbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMiA9IHBQbGFuZUluMlsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YyID0gcFBsYW5lSW4yWzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIG91dHB1dCBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kzID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTMgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMyA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIHUzMl9zdHJpZGUyX1kxICAgPSB1MzJfc3RyaWRlX1kxIDw8IDE7Ci0gICAgdTMyX3N0cmlkZTJfWTIgICA9IHUzMl9zdHJpZGVfWTIgPDwgMTsKLSAgICB1MzJfc3RyaWRlMl9ZMyAgID0gdTMyX3N0cmlkZV9ZMyA8PCAxOwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgIHUzMl93aWR0aCAgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLQotICAgIC8qIFVzZXIgU3BlY2lmaWVkIFByb2dyZXNzIHZhbHVlICovCi0gICAgdTMyX3Byb2dyZXNzID0gUHJvZ3Jlc3M7Ci0KLSAgICAvKiBNYXAgUHJvZ3Jlc3MgdmFsdWUgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkgLT4gZm9yIG9wdGltaXNhdGlvbiAqLwotICAgIGlmKHUzMl9wcm9ncmVzcyA8IDEwMDApCi0gICAgICAgIHUzMl9wcm9ncmVzcyA9ICgodTMyX3Byb2dyZXNzIDw8IDEwKSAvIDEwMDApOwotICAgIGVsc2UKLSAgICAgICAgdTMyX3Byb2dyZXNzID0gMTAyNDsKLQotICAgIC8qIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IgKi8KLSAgICBpZih1MzJfcHJvZ3Jlc3MgPD0gNTEyKQotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9IDA7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAodTMyX3Byb2dyZXNzIDw8IDEpOwotICAgIH0KLSAgICBlbHNlIC8qIHUzMl9wcm9ncmVzcyA+IDUxMiAqLwotICAgIHsKLSAgICAgICAgdTMyX3N0YXJ0QSA9ICh1MzJfcHJvZ3Jlc3MgLSA1MTIpIDw8IDE7Ci0gICAgICAgIHUzMl9lbmRBICAgPSAgMTAyNDsKLSAgICB9Ci0gICAgdTMyX3JhbmdlQSA9IHUzMl9lbmRBIC0gdTMyX3N0YXJ0QTsKLQotICAgIC8qIFNldCB0aGUgaW5jcmVtZW50IG9mIGJsZW5kaW5nZmFjdG9yIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGltYWdlIHJvdyAqLwotICAgIGlmICgodTMyX3dpZHRoID49IHUzMl9yYW5nZUEpICYmICh1MzJfcmFuZ2VBID4gMCkgKQotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKCh1MzJfcmFuZ2VBLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGggLSAxKTsKLSAgICB9Ci0gICAgZWxzZSAvKiAodTMyX3dpZHRoIDwgdTMyX3JhbmdlQSkgfHwgKHUzMl9yYW5nZUEgPCAwKSAqLwotICAgIHsKLSAgICAgICAgdTMyX2JsZW5kX2luYyAgID0gKHUzMl9yYW5nZUEgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aCk7Ci0gICAgfQotCi0gICAgLyogVHdvIFlVVjQyMCByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBpbnB1dCBpbWFnZTEgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MSA9IHB1OF9kYXRhX1lfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9VMSA9IHB1OF9kYXRhX1Vfc3RhcnQxOwotICAgICAgICBwdThfZGF0YV9WMSA9IHB1OF9kYXRhX1Zfc3RhcnQxOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggaW5wdXQgaW1hZ2UyIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDIgPSBwdThfZGF0YV9ZX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVTIgPSBwdThfZGF0YV9VX3N0YXJ0MjsKLSAgICAgICAgcHU4X2RhdGFfVjIgPSBwdThfZGF0YV9WX3N0YXJ0MjsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIG91dHB1dCBpbWFnZSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQzID0gcHU4X2RhdGFfWV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1UzID0gcHU4X2RhdGFfVV9zdGFydDM7Ci0gICAgICAgIHB1OF9kYXRhX1YzID0gcHU4X2RhdGFfVl9zdGFydDM7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93IGZvciBpbWFnZSBsdW1hIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDEgPSBwdThfZGF0YV9ZX2N1cnJlbnQxICsgdTMyX3N0cmlkZV9ZMTsKLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MiA9IHB1OF9kYXRhX1lfY3VycmVudDIgKyB1MzJfc3RyaWRlX1kyOwotICAgICAgICBwdThfZGF0YV9ZX25leHQzID0gcHU4X2RhdGFfWV9jdXJyZW50MyArIHUzMl9zdHJpZGVfWTM7Ci0KLSAgICAgICAgLyogSW5pdGlhbGlzZSBibGVuZGZhY3RvciAqLwotICAgICAgICB1MzJfYmxlbmRmYWN0b3IgICA9IHUzMl9zdGFydEE7Ci0gICAgICAgIC8qIEJsZW5kZmFjdG9yIEluY3JlbWVudCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeF9hY2N1bSA9IDA7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9jdXJyZW50MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgY2hyb21pbmFuY2UyIHZhbHVlICovCi0gICAgICAgICAgICB1MzJfVTEgPSAqcHU4X2RhdGFfVTErKzsKLSAgICAgICAgICAgIHUzMl9WMSA9ICpwdThfZGF0YV9WMSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX2N1cnJlbnQyKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBjaHJvbWluYW5jZTIgdmFsdWUgKi8KLSAgICAgICAgICAgIHUzMl9VMiA9ICpwdThfZGF0YV9VMisrOwotICAgICAgICAgICAgdTMyX1YyID0gKnB1OF9kYXRhX1YyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX2N1cnJlbnQzKysgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBjaHJvbWEoVSkgdmFsdWUgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfVTMrKyAgICAgICAgICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9VMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfVTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIENvbXB1dGUgY2hyb21hKFYpIHZhbHVlIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1YzKysgICAgICAgICAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfVjIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1YxKSA+PiAxMCk7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSsxKSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX25leHQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYmxlbmRpbmcgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfYmxlbmRmYWN0b3IgPSB1MzJfc3RhcnRBICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX2N1cnJlbnQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9jdXJyZW50MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBPdXRwdXQgaW1hZ2UqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfY3VycmVudDMrKyA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9ZMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9ZMSkgPj4gMTApOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UxICovCi0gICAgICAgICAgICB1MzJfWTEgPSAqcHU4X2RhdGFfWV9uZXh0MSsrOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgaW5wdXQgSW1hZ2UyICovCi0gICAgICAgICAgICB1MzJfWTIgPSAqcHU4X2RhdGFfWV9uZXh0MisrOwotCi0gICAgICAgICAgICAvKiBDb21wdXRlIEx1bWEgdmFsdWUgKHgrMSx5KzEpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9uZXh0MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl9ibGVuZF9pbmM7Ci0KLSAgICAgICAgICAgIC8qIFdvcmtpbmcgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGp1c3QgYWZ0ZXIgZWFjaCBzdG9yYWdlICovCi0KLSAgICAgICAgfS8qIEVuZCBvZiByb3cgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIGlucHV0IGltYWdlMSBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDEgKz0gdTMyX3N0cmlkZTJfWTE7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQxICs9IHUzMl9zdHJpZGVfVTE7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQxICs9IHUzMl9zdHJpZGVfVjE7Ci0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBpbnB1dCBpbWFnZTIgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQyICs9IHUzMl9zdHJpZGUyX1kyOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1UyOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MiArPSB1MzJfc3RyaWRlX1YyOwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2Ygb3V0cHV0IGltYWdlIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MyArPSB1MzJfc3RyaWRlMl9ZMzsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDMgKz0gdTMyX3N0cmlkZV9VMzsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDMgKz0gdTMyX3N0cmlkZV9WMzsKLQotICAgIH0vKiBFbmQgb2YgY29sdW1uIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzYwODc2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBDb2xvciBDb252ZXJzaW9uIEZpbHRlcgotICogICAgICAgICAgIC0jIENvbnRhaW5zIHRoZSBmb3JtYXQgY29udmVyc2lvbiBmaWx0ZXJzIGZyb20gQkdSNTY1IHRvIFlVVjQyMAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBUcmFuc2Zvcm0gQkdSNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBCR1I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gQkdSNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNFZJRklfVUludDggICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX1ksIHUzMl9zdHJpZGUyX1ksIHUzMl9zdHJpZGVfVSwgdTMyX3N0cmlkZV9WOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2JnciwgdTMyX3N0cmlkZV8yYmdyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY29sLCB1MzJfcm93OwotCi0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9yMDAsIGkzMl9yMDEsIGkzMl9yMTAsIGkzMl9yMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9nMDAsIGkzMl9nMDEsIGkzMl9nMTAsIGkzMl9nMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl9iMDAsIGkzMl9iMDEsIGkzMl9iMTAsIGkzMl9iMTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl95MDAsIGkzMl95MDEsIGkzMl95MTAsIGkzMl95MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl91MDAsIGkzMl91MDEsIGkzMl91MTAsIGkzMl91MTE7Ci0gICAgTTRWSUZJX0ludDMyICAgIGkzMl92MDAsIGkzMl92MDEsIGkzMl92MTAsIGkzMl92MTE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeW4sICpwdThfeXMsICpwdThfdSwgKnB1OF92OwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3lfZGF0YSwgKnB1OF91X2RhdGEsICpwdThfdl9kYXRhOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2Jncm5fZGF0YSwgKnB1OF9iZ3JuOwotICAgIE00VklGSV9VSW50MTYgICB1MTZfcGl4MSwgdTE2X3BpeDIsIHUxNl9waXgzLCB1MTZfcGl4NDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhICA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSAgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9iZ3JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfYmdyID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMmJnciA9IHUzMl9zdHJpZGVfYmdyIDw8IDE7Ci0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X2Jncm4gPSBwdThfYmdybl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBCR1IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9iZ3JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfYmdybiArIHUzMl9zdHJpZGVfYmdyICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMCwgdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjEwLCBpMzJfZzEwLCBpMzJfcjEwLCB1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDEsIHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjExLCBpMzJfZzExLCBpMzJfcjExLCB1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgQkdSIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9iZ3JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X2Jncm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMmJncjsKLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9DbGlwLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyOTBiMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9DbGlwLmMKLSAqIEBicmllZiAgICBNYW5hZ2VtZW50IG9mIHRoZSBSR0IgQ2xpcHBpbmcgbWF0cml4IGluY2x1c2lvbiBhbmQgRGl2aXNpb24gVGFibGUKLSAqIEBub3RlICAgICAtIyBDbGlwcGluZyBNYXRyaXggaXMgdXNlZCBpbiBvcmRlciB0byBwcm9wZXJseSBtYW5hZ2UgdGhlIGluY2x1c2lvbiBvZgotICogICAgICAgICAgIHRoZSBleHRlcm5hbCBSR0IgQ2xpcHBpbmcgbWF0cml4IHVzZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCi0gKiAgICAgICAgICAgVGhpcyBmaWxlIEhBUyBUTyBCRSBjb21waWxlZCB3aXRoIGFsbCBjb2xvciBjb252ZXJzaW9uIGZpbHRlcnMgcHJvamVjdAotICogICAgICAgICAgIC0jIERpdmlzaW9uIHRhYmxlIGlzIHVzZWQgaW4gUkdCIHRvIEhMUyBjb2xvciBjb252ZXJzaW9uCi0gKiAgICAgICAgICAgSW1wb3J0YW50OiBUaGlzIGZpbGUgbXVzdCBiZSBjb21waWxlZCBkdXJpbmcgdGhlIGFzc2VtYmx5IGxpYnJhcnkgYnVpbGRpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgTTRWSUZJX0NsaXBUYWJsZVsxMjU2XQotPSB7Ci0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsCi0weDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBhLCAweDBiLAotMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywKLTB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsCi0weDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLCAweDIzLAotMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLTB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi0weDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDNiLAotMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywKLTB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCi0weDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAotMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwKLTB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsCi0weDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLAotMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywKLTB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsCi0weDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLCAweDgxLCAweDgyLCAweDgzLAotMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwKLTB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsCi0weDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweDliLAotMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywKLTB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsCi0weGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLCAweGIxLCAweGIyLCAweGIzLAotMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLTB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsCi0weGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLAotMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywKLTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsCi0weGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLCAweGUxLCAweGUyLCAweGUzLAotMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwKLTB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsCi0weGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAotMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCi19OwotCi0vKiBEaXZpc2lvbiB0YWJsZSBmb3IgKCA2NTUzNS94ICk7IHggPSAwIHRvIDUxMiAqLwotQ05TVCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotQ05TVCBNNFZJRklfSW50MzIgIGNvbnN0X3N0b3JhZ2UxWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsMHgwMDAwMDY0OSwweDAwMDAwZDBmLCAweDAwMDBEODZDLCAweDAwMDBEODNCLCAweDAwMDEwMDAwLCAweDAwMDEwMDAwCi19OwotCi1DTlNUIE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLCAweDFCRjgwMCwgMHgwMDAwMDY0OSwgMHgwMDAwMGQwZiwgMHgxMTAxODAsIDB4NDBjZiwgMHgyMkJFMDAKLX07Ci0KLQotQ05TVCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLUNOU1QgTTRWSUZJX1VJbnQ4ICAgKk00VklGSV9DbGlwVGFibGVfemVybwotID0gJk00VklGSV9DbGlwVGFibGVbNTAwXTsKLQotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQ2xpcC5jICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRjYmQ1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBSR0I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiAoKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYgKChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3ZfZGF0YSA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9yZ2IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotCi0gICAgLyogTG9vcCBvbiBlYWNoIHJvdyBvZiB0aGUgb3V0cHV0IGltYWdlLCBpbnB1dCBjb29yZGluYXRlcyBhcmUgZXN0aW1hdGVkIGZyb20gb3V0cHV0IG9uZXMgKi8KLSAgICAvKiBUd28gWVVWIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQgO3UzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBDdXJyZW50IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biA9IHB1OF95X2RhdGE7Ci0gICAgICAgIC8qIE5leHQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3lzID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotICAgICAgICAvKiBDdXJyZW50IFUgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3UgPSBwdThfdV9kYXRhOwotICAgICAgICAvKiBDdXJyZW50IFYgcGxhbmUgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X3YgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuID0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0IGZvdXIgUkdCIDU2NSBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgdTE2X3BpeDEgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSBwdThfcmdibik7Ci0gICAgICAgICAgICB1MTZfcGl4MiA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIENTVF9SR0JfMTZfU0laRSkpOwotICAgICAgICAgICAgdTE2X3BpeDMgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYikpOwotICAgICAgICAgICAgdTE2X3BpeDQgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMTZfU0laRSkpOwotCi0gICAgICAgICAgICAvKiBVbnBhY2sgUkdCNTY1IHRvIDhiaXQgUiwgRywgQiAqLwotICAgICAgICAgICAgLyogKHgseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMCxpMzJfZzAwLGkzMl9iMDAsdTE2X3BpeDEpOwotICAgICAgICAgICAgLyogKHgrMSx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjEwLGkzMl9nMTAsaTMyX2IxMCx1MTZfcGl4Mik7Ci0gICAgICAgICAgICAvKiAoeCx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMDEsaTMyX2cwMSxpMzJfYjAxLHUxNl9waXgzKTsKLSAgICAgICAgICAgIC8qICh4KzEseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjExLGkzMl9nMTEsaTMyX2IxMSx1MTZfcGl4NCk7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGNocm9tYSBkYXRhICovCi0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBjb2x1bW4gKi8KLSAgICAgICAgICAgIHB1OF9yZ2JuICs9IChDU1RfUkdCXzE2X1NJWkU8PDEpOwotICAgICAgICAgICAgLyogVXBkYXRlIGN1cnJlbnQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3luICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgbmV4dCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeXMgKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBVIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdSArKzsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBWIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICBwdThfeV9kYXRhICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg1YTJhNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Qcm90bzoKLU00VklGSV9VSW50OCAgICBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci1QdXJwb3NlOiAgICBmaWxsaW5nIG9mIHRoZSBZVVY0MjAgcGxhbmUgZnJvbSBhIEJHUjI0IHBsYW5lCi1BYnN0cmFjdDogICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICAgICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gICAgICAgICAgICAgICAgICAgIEdldCA0IEJHUiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzIGFuZAotICAgICAgICAgICAgICAgICAgICBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gICAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gICAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLQotSW46ICAgICAgICAgICAgUkdCMjQgcGxhbmUKLUluT3V0OiAgICAgICAgbm9uZQotT3V0OiAgICAgICAgYXJyYXkgb2YgMyBNNFZJRklfSW1hZ2VQbGFuZSBzdHJ1Y3R1cmVzCi1Nb2RpZmllZDogICAgTUw6IFJHQiBmdW5jdGlvbiBtb2RpZmllZCB0byBCR1IuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNFZJRklfVUludDggTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLFwKLSAgICAgICAgICAgICAgICAgICAgIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLQotICAgIC8qIHNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgICA9IFBsYW5lT3V0WzBdLnBhY19kYXRhICsgUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgICAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICAgID0gUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBidWZmZXIgKi8KLSAgICBwdThfcmdibl9kYXRhICAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgICA9IFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodCAgICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICAgICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgICA9IHB1OF95X2RhdGE7Ci0gICAgICAgIHB1OF95cyAgICA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLQotICAgICAgICBwdThfdSAgICA9IHB1OF91X2RhdGE7Ci0gICAgICAgIHB1OF92ICAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgICAgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwICAgID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCAgICA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgICAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgICAvKiBtYXRyaXggbHVtaW5hbmNlICovCi0gICAgICAgICAgICBwdThfeW5bMF09IChNNFZJRklfVUludDgpaTMyX3kwMDsKLQotICAgICAgICAgICAgaTMyX3UxMCAgICA9IFUyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgICAgPSBWMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfeTEwICAgID0gWTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgcHU4X3luWzFdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgICAgPSBVMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxICAgID0gVjI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3kwMSAgICA9IFkyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIHB1OF95c1swXT0gKE00VklGSV9VSW50OClpMzJfeTAxOwotCi0gICAgICAgICAgICBpMzJfdTExICAgID0gVTI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSAgICA9IFYyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl95MTEgICAgPSBZMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0KLSAgICAgICAgICAgICpwdThfdSAgICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgICAgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICBwdThfcmdibiAgICArPSAgKENTVF9SR0JfMjRfU0laRTw8MSk7Ci0gICAgICAgICAgICBwdThfeW4gICAgICAgICs9IDI7Ci0gICAgICAgICAgICBwdThfeXMgICAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgICArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICArPSB1MzJfc3RyaWRlXzJyZ2I7Ci0KLQotICAgIH0gLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MTdlNGVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgUmVzaXplIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIEdlbmVyaWMgcmVzaXppbmcgb2YgUkdCNTY1IChQbGFuYXIpIGltYWdlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgUkdCNTY1IFBsYW5hciBwbGFuZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IChQbGFuYXIpIHBsYW5lIGJ1ZmZlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIFJHQjU2NSAoUGxhbmFyKSBwbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfaW47Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQxNiAgICpwdTE2X3NyY19ib3R0b207Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDAsIGkzMl9nMDAsIGkzMl9yMDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDIsIGkzMl9nMDIsIGkzMl9yMDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGkzMl9iMDMsIGkzMl9nMDMsIGkzMl9yMDM7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIGNvdW50X3RyYW5zPTA7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFJHQiB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X2hlaWdodCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV9oZWlnaHQpID09IEZBTFNFKSkgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICBwdTE2X2RhdGFfaW4gICAgPSAoTTRWSUZJX1VJbnQxNiopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgIHB1MTZfZGF0YV9vdXQgICA9IChNNFZJRklfVUludDE2KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgdTMyX3N0cmlkZV9pbiAgID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgdTMyX3dpZHRoX2luICAgID0gcFBsYW5lSW4tPnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKSB7Ci0gICAgICAgIHUzMl94X2luYyAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikgewotICAgICAgICB1MzJfeV9pbmMgICA9ICgodTMyX2hlaWdodF9pbiAtIDEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkgewotICAgICAgICAvKgotICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25hbCBwYXJ0LCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKSB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLQotICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgIC8qCi0gICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOgotICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudAotICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotCi0gICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl94X2FjY3VtID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgIHB1MTZfc3JjX3RvcCA9IHB1MTZfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNik7Ci0gICAgICAgICAgICBwdTE2X3NyY19ib3R0b20gPSBwdTE2X3NyY190b3AgKyAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzFdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAzLGkzMl9nMDMsaTMyX3IwMywoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfYm90dG9tWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLChNNFZJRklfVUludDE2KXB1MTZfc3JjX2JvdHRvbVsxXSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU29sdXRpb24gdG8gYXZvaWQgZ3JlZW4gZWZmZWN0cyBkdWUgdG8gdHJhbnNwYXJlbmN5ICovCi0gICAgICAgICAgICBjb3VudF90cmFucyA9IDA7Ci0KLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYgKGkzMl9iMDAgPT0gMCAmJiBpMzJfZzAwID09IDYzICYmIGkzMl9yMDAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAyID09IDAgJiYgaTMyX2cwMiA9PSA2MyAmJiBpMzJfcjAyID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMiA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDIgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDMgPT0gMCAmJiBpMzJfZzAzID09IDYzICYmIGkzMl9yMDMgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAzID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMyA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudF90cmFucyA+IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBwaXhlbCBpcyB0cmFuc3BhcmVudCAqLwotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gNjM7Ci0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9nMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9nMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9ICAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9iMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9iMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnB1MTZfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDE2KSggKCgodTMyX0d0ZW1wX3ZhbHVlICYgMHgzOCkgPj4gMykgfCAodTMyX0J0ZW1wX3ZhbHVlIDw8IDMpKSB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICgoKHUzMl9HdGVtcF92YWx1ZSAmIDB4NykgPDwgNSApIHwgdTMyX1J0ZW1wX3ZhbHVlKTw8OCApKTsKLQotICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHUzMl94X2luYzsKLQotICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotCi0gICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgIHB1MTZfZGF0YV9pbiA9IHB1MTZfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbj4+MSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGViOWQ0NC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjg4OHRvUkdCODg4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBSZXNpemUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgR2VuZXJpYyByZXNpemluZyBvZiBZVVY0MjAgKFBsYW5hcikgaW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFJlc2l6ZXMgWVVWNDIwIFBsYW5hciBwbGFuZS4KLSAqIEBub3RlICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSBVICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgWVVWIGluIHRoZSBvdXB1dCBwbGFuZQotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gWVVWNDIwIChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9kYXRhX2luOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luLCB1MzJfc3RyaWRlX291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jLCB1MzJfeV9pbmM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2FjY3VtLCB1MzJfeV9hY2N1bSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX1J0ZW1wX3ZhbHVlLHUzMl9HdGVtcF92YWx1ZSx1MzJfQnRlbXBfdmFsdWU7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMDsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDEsIGkzMl9nMDEsIGkzMl9yMDE7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAyLCBpMzJfZzAyLCBpMzJfcjAyOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfd2lkdGgpID09IEZBTFNFKSB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfd2lkdGgpID09IEZBTFNFKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLQotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gKE00VklGSV9VSW50OCopKHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQpOwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSAoTTRWSUZJX1VJbnQ4KikocFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0KTsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgICAgIHUzMl9zdHJpZGVfb3V0ICA9IHBQbGFuZU91dC0+dV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotCi0gICAgICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgIGlmICh1MzJfd2lkdGhfb3V0ID49IHUzMl93aWR0aF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2luYyAgID0gKHUzMl93aWR0aF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQuKi8KLSAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jID0gKHUzMl9oZWlnaHRfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl95X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gdTMyX3lfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl95X2FjY3VtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfeF9pbmMgPj0gTUFYX1NIT1JUKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfaGVpZ2h0ID0gdTMyX2hlaWdodF9vdXQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYil3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbGwgdGhlIHJvdyAqLwotCi0gICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtPj4xMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAgICAgdTMyX3dpZHRoID0gdTMyX3dpZHRoX291dDsKLQotICAgICAgICAgICAgZG8geyAvKiBTY2FuIGFsb25nIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArICh1MzJfeF9hY2N1bSA+PiAxNikqMzsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgKHUzMl9zdHJpZGVfaW4pOwotICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgIGlmICgodTMyX3dpZHRoID09IDEpICYmICh1MzJfd2lkdGhfaW4gPT0gdTMyX3dpZHRoX291dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQgaW5wdXQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlIGNvcm5lciBwaXhlbHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgIFdoZW4gaW5wdXQgaGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgZXF1YWwgdG8gb3V0cHV0IGhlaWdodCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgd2lkdGggbm90IGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICByb3cgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1MzJfaGVpZ2h0ID09IDEpICYmICh1MzJfaGVpZ2h0X2luID09IHUzMl9oZWlnaHRfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHB1OF9zcmNfdG9wLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLHB1OF9zcmNfdG9wLDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDIsaTMyX2cwMixpMzJfcjAyLHB1OF9zcmNfYm90dG9tLDApOwotICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLHB1OF9zcmNfYm90dG9tLDMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHUzMl9SdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX3IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX3IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0d0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfZzAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfZzAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfZzAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAgKE00VklGSV9VSW50OCkoKChpMzJfYjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfYjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfYjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfQnRlbXBfdmFsdWUgOwotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9HdGVtcF92YWx1ZSA7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX1J0ZW1wX3ZhbHVlIDsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotCi0gICAgICAgICAgICB9IHdoaWxlKC0tdTMyX3dpZHRoKTsKLQotICAgICAgICAgICAgLy9wdTE2X2RhdGFfb3V0ID0gcHUxNl9kYXRhX291dCArICh1MzJfc3RyaWRlX291dD4+MSkgLSAodTMyX3dpZHRoX291dCk7Ci0KLSAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gdTMyX3lfaW5jOwotICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqICh1MzJfc3RyaWRlX2luKSA7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDQyZTgwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9CR1I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b0JHUjU2NS5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIENvbWJvIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIFJlc2l6ZXMgWVVWNDIwIGFuZCBjb252ZXJ0cyB0byBSR1I1NjUgd2l0aCByb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gQkdSNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSh2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlIFlVViB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgdTMyX3dpZHRoMl9SR0IgID0gcFBsYW5lT3V0LT51X3dpZHRoID4+IDE7Ci0gICAgdTMyX2hlaWdodDJfUkdCID0gcFBsYW5lT3V0LT51X2hlaWdodCA+PiAxOwotCi0gICAgdTMyX3N0cmlkZV9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDE7Ci0gICAgdTMyX3N0cmlkZTJfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAyOwotCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7IHUzMl9wbGFuZSA8IFBMQU5FUzsgdTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0gICAgfQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFkgUGxhbmUuICovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiAqLwotICAgIGlmICh1MzJfd2lkdGgyX1JHQiA+PSB1MzJfd2lkdGhfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0IpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodCBmb3IgVSBhbmQgViBQbGFuZXMuICovCi0KLSAgICBpZiAodTMyX2hlaWdodDJfUkdCID49IHUzMl9oZWlnaHRfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgPSAodTMyX2hlaWdodF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0IpOwotICAgIH0KLQotICAgIHUzMl95X2luY1tWUGxhbmVdID0gdTMyX3lfaW5jW1VQbGFuZV07Ci0gICAgdTMyX3hfaW5jW1ZQbGFuZV0gPSB1MzJfeF9pbmNbVVBsYW5lXTsKLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEtlZXAgdGhlIGZyYWN0aW9ubmFsIHBhcnQsIGFzc2ltdW5nIHRoYXQgaW50ZWdlciAgcGFydCBpcyBjb2RlZCBvbiB0aGUgMTYgaGlnaCBiaXRzLAotICAgICAgICAgICAgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IHUzMl95X2luY1tZUGxhbmVdICYgMHhmZmZmOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gdTMyX3lfaW5jW1VQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bV9ZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotICAgICAgICB1MzJfeV9hY2N1bV9ZID4+PSAxOwotICAgICAgICB1MzJfeV9hY2N1bV9VID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gMDsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3hfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IHUzMl94X2luY1tZUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3hfYWNjdW1fc3RhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICB9Ci0KLSAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ID0gKE00VklGSV9VSW50MzIqKXB1OF9kYXRhX291dDsKLQotICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIDoKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKSB3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodF9vdXQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPSAyKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fWSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotICAgICAgICB1MzJfeF9hY2N1bV9VID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjX1kgPSAodTMyX3lfYWNjdW1fWSA+PiAxMikgJiAxNTsKLSAgICAgICAgdTMyX3lfZnJhY19VID0gKHUzMl95X2FjY3VtX1UgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgLyogUkdCIGN1cnJlbnQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfY3VycmVudCA9IHB1MzJfcmdiX2RhdGFfc3RhcnQgOwotCi0gICAgICAgIC8qIFJHQiBuZXh0IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX25leHQgICAgPSBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgKyAodTMyX3N0cmlkZTJfb3V0KTsKLQotICAgICAgICAvKiBZIFBsYW5lIG5leHQgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSBwdThfZGF0YV9pbltZUGxhbmVdOwotCi0gICAgICAgIHUzMl9yZ2JfdGVtcDMgPSB1MzJfeV9hY2N1bV9ZICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgaWYgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gIHB1OF9kYXRhX2luW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfcmdiX3RlbXAzICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICB1MzJfcmdiX3RlbXA0ID0gKHUzMl9yZ2JfdGVtcDMgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoX291dDsgdTMyX2NvbCAhPSAwOyB1MzJfY29sIC09IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogSW5wdXQgWSBwbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSW5wdXQgVSBQbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfVSA9IHB1OF9kYXRhX2luW1VQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9VID0gcHU4X3NyY190b3BfVSArIHUzMl9zdHJpZGVfaW5bVVBsYW5lXTsKLQotICAgICAgICAgICAgcHU4X3NyY190b3BfViA9IHB1OF9kYXRhX2luW1ZQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9WID0gcHU4X3NyY190b3BfViArIHUzMl9zdHJpZGVfaW5bVlBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBZIHBsYW5lICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFUgYW5kIFYgcGxhbmVzICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1UgPSAodTMyX3hfYWNjdW1fVSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBVXzMyID0gKCgocHU4X3NyY190b3BfVVswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1VbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVVswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1VbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgVl8zMiA9ICgoKHB1OF9zcmNfdG9wX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9WWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpKyAocHU4X3NyY19ib3R0b21fVlswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1ZbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1UgKz0gKHUzMl94X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KSA7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3JnYl90ZW1wNCkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfcmdiX3RlbXA0ICk+PjgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfQkdSNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLSAgICAgICAgfSAgIC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSAgPSAgdTMyX3JnYl90ZW1wMyArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgKz0gKHUzMl95X2luY1tVUGxhbmVdKTsKLQotICAgICAgICAvKiBZIHBsYW5lIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1kgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzJfeV9hY2N1bV9ZID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdOwotICAgICAgICB9Ci0gICAgICAgIC8qIFUgYW5kIFYgcGxhbmVzIHJvdyB1cGRhdGUgKi8KLSAgICAgICAgaWYgKHUzMl95X2FjY3VtX1UgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1VQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltVUGxhbmVdKTsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1ZQbGFuZV0gPSAgcHU4X2RhdGFfaW5bVlBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3lfYWNjdW1fVSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltWUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIC8qIEJHUiBwb2ludGVyIFVwZGF0ZSAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWRhOWQwNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvUkdCNTY1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBDb21ibyBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBSZXNpemVzIFlVVjQyMCBhbmQgY29udmVydHMgdG8gUkdSNTY1IHdpdGggcm90YXRpb24KLSAqIEBkYXRlCi0gKiAgICAgICAgICAgLSAyMDA0LzA4LzExOiBDcmVhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KHZvaWQgKnBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplIFlVVjQyMCBwbGFuZSBhbmQgY29udmVydHMgdG8gUkdCNTY1IHdpdGggKzkwIHJvdGF0aW9uLgotICogQG5vdGUgICAgQmFzaWMgc3R1cnR1cmUgb2YgdGhlIGZ1bmN0aW9uCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93IChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoc3RlcCAyKQotICogICAgICAgICAgICAgICAgICBHZXQgZm91ciBZIHNhbXBsZXMgYW5kIDEgdSAmIFYgc2FtcGxlCi0gKiAgICAgICAgICAgICAgICAgIFJlc2l6ZSB0aGUgWSB3aXRoIGNvcnJlc3BvbmluZyBVIGFuZCBWIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgQ29tcHV0ZSB0aGUgZm91ciBjb3JyZXNwb25kaW5nIFIgRyBCIHZhbHVlcwotICogICAgICAgICAgICAgICAgICBQbGFjZSB0aGUgUiBHIEIgaW4gdGhlIG91cHV0IHBsYW5lIGluIHJvdGF0ZWQgZmFzaGlvbgotICogICAgICAgICAgICAgIGVuZCBsb29wIGNvbHVtbgotICogICAgICAgICAgZW5kIGxvb3Agcm93Ci0gKiAgICAgICAgICBGb3IgcmVzaXppbmcgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcKLSAqICAgICAgICAgIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG93biBlYWNoIGNvbHVtbi4KLSAqICAgICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZAotICogICAgICAgICAgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3Vycy4gVGhlIHJhdGlvIG9mIGNvbXByZXNzaW9uCi0gKiAgICAgICAgICBvciBkaWxhdGF0aW9uIGlzIGVzdGltYXRlZCB1c2luZyBpbnB1dCBhbmQgb3V0cHV0IHNpemVzLgotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBZVVYgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwQ29udGV4dDogKElOKSBDb250ZXh0IFBvaW50ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1KHZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW5bUExBTkVTXSwgKnB1OF9kYXRhX2luMVtQTEFORVNdLCpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICpwdTMyX3JnYl9kYXRhX2N1cnJlbnQsICpwdTMyX3JnYl9kYXRhX25leHQsICpwdTMyX3JnYl9kYXRhX3N0YXJ0OwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbltQTEFORVNdLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luW1BMQU5FU10sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfc3RyaWRlX2luW1BMQU5FU107Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfb3V0LCB1MzJfc3RyaWRlMl9vdXQsIHUzMl93aWR0aDJfUkdCLCB1MzJfaGVpZ2h0Ml9SR0I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luY1tQTEFORVNdLCB1MzJfeV9pbmNbUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW1fWSwgdTMyX3hfYWNjdW1fVSwgdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2FjY3VtX1ksIHUzMl95X2FjY3VtX1U7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWNfWSwgdTMyX3hfZnJhY19VLCB1MzJfeV9mcmFjX1ksdTMyX3lfZnJhY19VOwotICAgIE00VklGSV9JbnQzMiAgICBVXzMyLCBWXzMyLCBZXzMyLCBZdmFsXzMyOwotICAgIE00VklGSV9VSW50OCAgICB1OF9SZWQsIHU4X0dyZWVuLCB1OF9CbHVlOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcm93LCB1MzJfY29sOwotCi0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMSwgdTMyX3JnYl90ZW1wMjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3JnYl90ZW1wMyx1MzJfcmdiX3RlbXA0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfY2hlY2tfc2l6ZTsKLQotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3BfWSwqcHU4X3NyY190b3BfVSwqcHU4X3NyY190b3BfViA7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbV9ZLCAqcHU4X3NyY19ib3R0b21fVSwgKnB1OF9zcmNfYm90dG9tX1Y7Ci0KLSAgICAvKiBDaGVjayBmb3IgdGhlICB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBldmVuICovCi0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfaGVpZ2h0KTsKLSAgICBpZiggdTMyX2NoZWNrX3NpemUgPT0gRkFMU0UgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0gICAgdTMyX2NoZWNrX3NpemUgPSBJU19FVkVOKHBQbGFuZUluWzBdLnVfd2lkdGgpOwotICAgIGlmICh1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0KLSAgICB9Ci0gICAgLyogTWFrZSB0aGUgb3VwdXQgd2lkdGggYW5kIGhlaWdodCBhcyBldmVuICovCi0gICAgcFBsYW5lT3V0LT51X2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQgJiAweEZGRkZGRkZFOwotICAgIHBQbGFuZU91dC0+dV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3N0cmlkZSA9IHBQbGFuZU91dC0+dV9zdHJpZGUgJiAweEZGRkZGRkZDOwotCi0gICAgLyogQXNzaWdubWVudCBvZiBvdXRwdXQgcG9pbnRlciAqLwotICAgIHB1OF9kYXRhX291dCAgICA9IHBQbGFuZU91dC0+cGFjX2RhdGEgKyBwUGxhbmVPdXQtPnVfdG9wbGVmdDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCB3aWR0aChyb3RhdGVkKSAqLwotICAgIHUzMl93aWR0aF9vdXQgICA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBoZWlnaHQocm90YXRlZCkgKi8KLSAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgIHUzMl93aWR0aDJfUkdCICA9IHBQbGFuZU91dC0+dV93aWR0aCA+PiAxOwotICAgIHUzMl9oZWlnaHQyX1JHQiA9IHBQbGFuZU91dC0+dV9oZWlnaHQgPj4gMTsKLSAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgIHUzMl9zdHJpZGVfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAxOwotICAgIHUzMl9zdHJpZGUyX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMjsKLQotICAgIGZvcih1MzJfcGxhbmUgPSAwOyB1MzJfcGxhbmUgPCBQTEFORVM7IHUzMl9wbGFuZSsrKQotICAgIHsKLSAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0gICAgICAgIHB1OF9kYXRhX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnBhY19kYXRhICsgcFBsYW5lSW5bdTMyX3BsYW5lXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICAgICAgdTMyX3N0cmlkZV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfaGVpZ2h0OwotICAgIH0KLSAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoIGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luW1lQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1lQbGFuZV0gICA9ICh1MzJfd2lkdGhfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBZIFBsYW5lLiovCi0gICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bWVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tZUGxhbmVdID0gKHUzMl9oZWlnaHRfaW5bWVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFUgYW5kIFYgUGxhbmVzLiovCi0gICAgaWYgKHUzMl93aWR0aDJfUkdCID49IHUzMl93aWR0aF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQik7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBVIGFuZCBWIFBsYW5lcy4qLwotCi0gICAgaWYgKHUzMl9oZWlnaHQyX1JHQiA+PSB1MzJfaGVpZ2h0X2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgID0gKCh1MzJfaGVpZ2h0X2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQi0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gID0gKHUzMl9oZWlnaHRfaW5bVVBsYW5lXSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCKTsKLSAgICB9Ci0KLSAgICB1MzJfeV9pbmNbVlBsYW5lXSA9IHUzMl95X2luY1tVUGxhbmVdOwotICAgIHUzMl94X2luY1tWUGxhbmVdID0gdTMyX3hfaW5jW1VQbGFuZV07Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3lfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl95X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkIG9uIHRoZSAxNiBoaWdoIGJpdHMsCi0gICAgICAgIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgIHUzMl95X2FjY3VtX1kgPSB1MzJfeV9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IHUzMl95X2luY1tVUGxhbmVdICYgMHhmZmZmOwotCi0gICAgICAgIGlmICghdTMyX3lfYWNjdW1fWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1UgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA+Pj0gMTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IDA7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSAwOwotCi0gICAgfQotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl94X2FjY3VtX3N0YXJ0LgotICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLSAgICAvKiBJbnRpYWxpc2UgdGhlIFJHQiBwb2ludGVyICovCi0gICAgcHUzMl9yZ2JfZGF0YV9zdGFydCA9IChNNFZJRklfVUludDMyKilwdThfZGF0YV9vdXQ7Ci0KLSAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYSA6Ci0gICAgICAgIEYocCcscScpPWYocCxxKVIoLWEpUihiKStmKHAscS0xKVIoLWEpUihiLTEpK2YocCsxLHEpUigxLWEpUihiKStmKHArJixxKzEpUigxLWEpUihiLTEpCi0gICAgICAgIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14ICAwID08IHggPTwgMSBhbmQgYSAocmVzcC4gYikgd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgICAgIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBuZWFyZXN0IG5laWdoYm9yIGluIHRoZSBwIChyZXNwLiBxKSBkaXJlY3Rpb24KLSAgICAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHRfb3V0OyB1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0gMikKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX1kgPSB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICAgICAgdTMyX3hfYWNjdW1fVSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgdTMyX3lfZnJhY19ZID0gKHUzMl95X2FjY3VtX1kgPj4gMTIpICYgMTU7Ci0gICAgICAgIHUzMl95X2ZyYWNfVSA9ICh1MzJfeV9hY2N1bV9VID4+IDEyKSAmIDE1OwotCi0gICAgICAgIC8qIFJHQiBjdXJyZW50IGxpbmUgUG9zaXRpb24gUG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgPSBwdTMyX3JnYl9kYXRhX3N0YXJ0IDsKLQotICAgICAgICAvKiBSR0IgbmV4dCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9uZXh0ICAgID0gcHUzMl9yZ2JfZGF0YV9jdXJyZW50ICsgKHUzMl9zdHJpZGUyX291dCk7Ci0KLSAgICAgICAgLyogWSBQbGFuZSBuZXh0IHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gcHU4X2RhdGFfaW5bWVBsYW5lXTsKLQotICAgICAgICB1MzJfcmdiX3RlbXAzID0gdTMyX3lfYWNjdW1fWSArICh1MzJfeV9pbmNbWVBsYW5lXSk7Ci0gICAgICAgIGlmICh1MzJfcmdiX3RlbXAzID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9ICBwdThfZGF0YV9pbltZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfcmdiX3RlbXAzID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1lQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3JnYl90ZW1wMyAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgdTMyX3JnYl90ZW1wNCA9ICh1MzJfcmdiX3RlbXAzID4+IDEyKSAmIDE1OwotCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aF9vdXQ7IHUzMl9jb2wgIT0gMDsgdTMyX2NvbCAtPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFkgcGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIElucHV0IFUgUGxhbmUgZWxlbWVudHMgKi8KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1UgPSBwdThfZGF0YV9pbltVUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fVSA9IHB1OF9zcmNfdG9wX1UgKyB1MzJfc3RyaWRlX2luW1VQbGFuZV07Ci0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1YgPSBwdThfZGF0YV9pbltWUGxhbmVdICsgKHUzMl94X2FjY3VtX1UgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fViA9IHB1OF9zcmNfdG9wX1YgKyB1MzJfc3RyaWRlX2luW1ZQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgWSBQbGFuZSAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBVIGFuZCBWIFBsYW5lcyAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19VID0gKHUzMl94X2FjY3VtX1UgPj4gMTIpJjE1OwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgVV8zMiA9ICgoKHB1OF9zcmNfdG9wX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9VWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1VbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9VWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFZfMzIgPSAoKChwdThfc3JjX3RvcF9WWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVlsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9WWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVlsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fVSArPSAodTMyX3hfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgdTMyX3hfZnJhY19ZID0gKHUzMl94X2FjY3VtX1kgPj4gMTIpJjE1OwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19SR0I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNikgOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKT4+OCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19SR0I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotICAgICAgICB9ICAgLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICB1MzJfeV9hY2N1bV9ZICA9ICB1MzJfcmdiX3RlbXAzICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSArPSAodTMyX3lfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgIC8qIFkgcGxhbmUgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fWSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9ICBwdThfZGF0YV9pbjFbWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl95X2FjY3VtX1kgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSkpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gcHU4X2RhdGFfaW4xW1lQbGFuZV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogVSBhbmQgViBwbGFuZXMgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fVSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVVBsYW5lXSA9ICBwdThfZGF0YV9pbltVUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1VQbGFuZV0pOwotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVlBsYW5lXSA9ICBwdThfZGF0YV9pbltWUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ICs9IHUzMl9zdHJpZGVfb3V0OwotCi0gICAgfSAgIC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRSBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwCmluZGV4IDY1MzkxNzEuLjkxY2YyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcAorKysgYi9tZWRpYS9jb21tb25fdGltZS91dGlscy5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKIH0KIAogdm9pZCBkZXNlcmlhbGl6ZVNvY2thZGRyKGNvbnN0IFBhcmNlbCogcCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CiAKICAgICBhZGRyLT5zc19mYW1pbHkgPSBwLT5yZWFkSW50MzIoKTsKICAgICBzd2l0Y2goYWRkci0+c3NfZmFtaWx5KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tayBiL21lZGlhL2ltZ191dGlscy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZDAwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0J5dGVBcnJheU91dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzM5NzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0LmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfQllURV9BUlJBWV9PVVRQVVRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGFjY3VtdWxhdGVzIHdyaXR0ZW4gYnl0ZXMgaW50byBhIGJ1ZmZlci4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgQnl0ZUFycmF5T3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorCisgICAgICAgIEJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIHZpcnR1YWwgfkJ5dGVBcnJheU91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgQnl0ZUFycmF5T3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGlzIEJ5dGVBcnJheU91dHB1dC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjdXJyZW50IHNpemUgb2YgdGhlIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBwb2ludGVyIHRvIGFycmF5IG9mIGJ5dGVzIHdyaXR0ZW4uICBJdCBpcyBub3QgdmFsaWQgdG8gdXNlIHRoaXMgcG9pbnRlciBpZgorICAgICAgICAgKiBvcGVuLCB3cml0ZSwgb3IgY2xvc2UgaXMgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcnJheSgpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBWZWN0b3I8dWludDhfdD4gbUJ5dGVBcnJheTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19CWVRFX0FSUkFZX09VVFBVVF9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4OWIwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19ETkdfVVRJTFNfSAorI2RlZmluZSBJTUdfVVRJTFNfRE5HX1VUSUxTX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9CeXRlQXJyYXlPdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBORUxFTVMoeCkgKChpbnQpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkpCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgdmFsdWVzIGZvciB0aGUgT3Bjb2RlTGlzdCB0YWdzIHNwZWNpZmllZAorICogaW4gdGhlIEFkb2JlIERORyAxLjQgc3BlYy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3Bjb2RlTGlzdEJ1aWxkZXIgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPE9wY29kZUxpc3RCdWlsZGVyPiB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIENmYUxheW91dCB7CisgICAgICAgICAgICBDRkFfUkdHQiA9IDAsCisgICAgICAgICAgICBDRkFfR1JCRywKKyAgICAgICAgICAgIENGQV9HQlJHLAorICAgICAgICAgICAgQ0ZBX0JHR1IsCisgICAgICAgIH07CisKKyAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKyAgICAgICAgdmlydHVhbCB+T3Bjb2RlTGlzdEJ1aWxkZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoaXMgb3Bjb2RlIGxpc3QgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIG9wY29kZXMgZGVmaW5lZCBpbiB0aGlzIGxpc3QuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBvcGNvZGUgbGlzdCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBUaGlzIGJ1ZmZlcgorICAgICAgICAgKiBtdXN0IGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdCBhcyBtYW55IGVsZW1lbnRzIGFzIHJldHVybmVkCisgICAgICAgICAqIGJ5IGNhbGxpbmcgdGhlIGdldFNpemUoKSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE9wTGlzdCgvKm91dCovIHVpbnQ4X3QqIGJ1ZikgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuICBUaGUgZ2l2ZW4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIEdhaW5NYXAgb3Bjb2RlIHdpdGggdGhlIGdpdmVuIGZpZWxkcy4gIFRoZSBtYXBHYWlucyBhcnJheQorICAgICAgICAgKiBtdXN0IGhhdmUgbWFwUG9pbnRzViAqIG1hcFBvaW50c0ggKiBtYXBQbGFuZXMgZWxlbWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgcm93UGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xQaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcFNwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFwT3JpZ2luSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hcFBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXBHYWlucyk7CisKKyAgICAgICAgLy8gVE9ETzogQWRkIG90aGVyIE9wY29kZSBtZXRob2RzCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTCA9IDB4MXU7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHX09QVElPTkFMX0ZPUl9QUkVWSUVXID0gMHgydTsKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIEdBSU5fTUFQX0lEID0gOSwKKyAgICAgICAgICAgIExTTV9SX0lORCA9IDAsCisgICAgICAgICAgICBMU01fR0VfSU5EID0gMSwKKyAgICAgICAgICAgIExTTV9HT19JTkQgPSAyLAorICAgICAgICAgICAgTFNNX0JfSU5EID0gMywKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtQ291bnQ7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dCBtT3BMaXN0OworICAgICAgICBFbmRpYW5PdXRwdXQgbUVuZGlhbk91dDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ROR19VVElMU19IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0VuZGlhblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5YmUxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9FbmRpYW5VdGlscy5oCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19FTkRJQU5fVVRJTFMKKyNkZWZpbmUgSU1HX1VUSUxTX0VORElBTl9VVElMUworCisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEVuZGlhbm5lc3MgdHlwZXMgc3VwcG9ydGVkLgorICovCitlbnVtIEFORFJPSURfQVBJIEVuZGlhbm5lc3MgeworICAgIFVOREVGSU5FRF9FTkRJQU4sIC8vIERlZmF1bHQgZW5kaWFubmVzcyB3aWxsIGJlIHVzZWQuCisgICAgQklHLAorICAgIExJVFRMRQorfTsKKworLyoqCisgKiBDb252ZXJ0IGZyb20gdGhlIG5hdGl2ZSBkZXZpY2UgZW5kaWFubmVzcyB0byBiaWcgZW5kaWFuLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCBjb252ZXJ0VG9CaWdFbmRpYW4oVCBpbik7CisKKy8qKgorICogQ29udmVydCBmcm9tIHRoZSBuYXRpdmUgZGV2aWNlIGVuZGlhbm5lc3MgdG8gbGl0dGxlIGVuZGlhbi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgY29udmVydFRvTGl0dGxlRW5kaWFuKFQgaW4pOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyBmb3Igd3JpdGluZyB0byBhbiBPdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gZW5kaWFubmVzcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgRW5kaWFuT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogV3JhcCB0aGUgZ2l2ZW4gT3V0cHV0LiAgQ2FsbGluZyB3cml0ZSBtZXRob2RzIHdpbGwgcmVzdWx0IGluCisgICAgICAgICAqIHdyaXRlcyB0byB0aGlzIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIEVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQ9TElUVExFKTsKKworICAgICAgICB2aXJ0dWFsIH5FbmRpYW5PdXRwdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbCBvcGVuIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsIGNsb3NlIG9uIHRoZSB3cmFwcGVkIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBlbmRpYW5uZXNzIHRvIHVzZSB3aGVuIHdyaXRpbmcuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0RW5kaWFubmVzcyhFbmRpYW5uZXNzIGVuZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgZW5kaWFubmVzcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgRW5kaWFubmVzcyBnZXRFbmRpYW5uZXNzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIEVuZGlhbk91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q3VycmVudE9mZnNldCgpIGNvbnN0OworCisKKyAgICAgICAgLy8gVE9ETzogc3dpdGNoIHdyaXRlIG1ldGhvZHMgdG8gdWludDMyX3QgaW5zdGVhZCBvZiBzaXplX3QsCisgICAgICAgIC8vIHRoZSBtYXggc2l6ZSBvZiBhIFRJRkYgZmlsZXMgaXMgYm91bmRlZAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgd2lsbCB3cml0ZSBlbGVtZW50cyBmcm9tIGdpdmVuIGlucHV0IGJ1ZmZlciB0byB0aGUgb3V0cHV0LgorICAgICAgICAgKiBDb3VudCBlbGVtZW50cyBpbiB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBlbmRpYW5uZXNzIHNldCBmb3IgdGhpcworICAgICAgICAgKiBFbmRpYW5PdXRwdXQuICBJZiB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB0aGF0IG1hbnkgZWxlbWVudHMgd2lsbAorICAgICAgICAgKiBiZSBza2lwcGVkIGluIHRoZSBidWZmZXIgYmVmb3JlIHdyaXRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHVpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBpbnQxNl90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB1aW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgaW50MzJfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGludDY0X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IGZsb2F0KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgaW5saW5lIHN0YXR1c190IHdyaXRlSGVscGVyKGNvbnN0IFQqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KTsKKworICAgICAgICB1aW50MzJfdCBtT2Zmc2V0OworICAgICAgICBPdXRwdXQqIG1PdXRwdXQ7CisgICAgICAgIEVuZGlhbm5lc3MgbUVuZGlhbjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZUhlbHBlcihjb25zdCBUKiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGFzc2VydChvZmZzZXQgPD0gY291bnQpOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFQpOworICAgIHN3aXRjaChtRW5kaWFuKSB7CisgICAgICAgIGNhc2UgQklHOiB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gb2Zmc2V0OyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIFQgdG1wID0gY29udmVydFRvQmlnRW5kaWFuPFQ+KGJ1ZltvZmZzZXQgKyBpXSk7CisgICAgICAgICAgICAgICAgaWYgKChyZXMgPSBtT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmdG1wKSwgMCwgc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtT2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExJVFRMRTogeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IG9mZnNldDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUIHRtcCA9IGNvbnZlcnRUb0xpdHRsZUVuZGlhbjxUPihidWZbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgICAgIGlmICgocmVzID0gbU91dHB1dC0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnRtcCksIDAsIHNpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvQmlnRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9CaWdFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9iZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0JpZ0VuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9iZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvQmlnRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9CaWdFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvYmU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0JpZ0VuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2JlNjQoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDhfdCBpbikgeworICAgIHJldHVybiBpbjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDhfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50OF90IGluKSB7CisgICAgcmV0dXJuIGluOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdWludDE2X3QgY29udmVydFRvTGl0dGxlRW5kaWFuKHVpbnQxNl90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlMTYoaW4pOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50MTZfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4oaW50MTZfdCBpbikgeworICAgIHJldHVybiBodG9sZTE2KGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbih1aW50MzJfdCBpbikgeworICAgIHJldHVybiBodG9sZTMyKGluKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIGludDMyX3QgY29udmVydFRvTGl0dGxlRW5kaWFuKGludDMyX3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGUzMihpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSB1aW50NjRfdCBjb252ZXJ0VG9MaXR0bGVFbmRpYW4odWludDY0X3QgaW4pIHsKKyAgICByZXR1cm4gaHRvbGU2NChpbik7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBpbnQ2NF90IGNvbnZlcnRUb0xpdHRsZUVuZGlhbihpbnQ2NF90IGluKSB7CisgICAgcmV0dXJuIGh0b2xlNjQoaW4pOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfRU5ESUFOX1VUSUxTKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVJbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNGYyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZUlucHV0LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfRklMRV9JTlBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX0lOUFVUX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9JbnB1dC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgZnJvbSBhIGZpbGUuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIEZpbGVJbnB1dCA6IHB1YmxpYyBJbnB1dCB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgZmlsZSBpbnB1dCBmb3IgdGhlIGdpdmVuIHBhdGguCisgICAgICAgICAqLworICAgICAgICBGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKTsKKworICAgICAgICB2aXJ0dWFsIH5GaWxlSW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiBhIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcGF0aCBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgZmlsZSBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBBdCBtb3N0LCB0aGUgbnVtYmVyCisgICAgICAgICAqIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudCBhcmd1bWVudCB3aWxsIGJlIHJlYWQuICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4KKyAgICAgICAgICogaW50byB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgTk9UX0VOT1VHSF9EQVRBIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICBJZiBhbgorICAgICAgICAgKiBlcnJvciBoYXMgb2NjdXJyZWQsIHRoaXMgd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyIHRoYW4gTk9UX0VOT1VHSF9EQVRBLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBwYXRoIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRmlsZU91dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDViZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0ZpbGVPdXRwdXQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19GSUxFX09VVFBVVF9ICisjZGVmaW5lIElNR19VVElMU19GSUxFX09VVFBVVF9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBBTkRST0lEX0FQSSBGaWxlT3V0cHV0IDogcHVibGljIE91dHB1dCB7CisgICAgcHVibGljOgorICAgICAgICBGaWxlT3V0cHV0KFN0cmluZzggcGF0aCk7CisgICAgICAgIHZpcnR1YWwgfkZpbGVPdXRwdXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgRklMRSAqbUZwOworICAgICAgICBTdHJpbmc4IG1QYXRoOworICAgICAgICBib29sIG1PcGVuOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX0ZJTEVfT1VUUFVUX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvSW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTAzNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0lucHV0LmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfSU5QVVRfSAorI2RlZmluZSBJTUdfVVRJTFNfSU5QVVRfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdXNlZCBhcyBhIHNvdXJjZSBvZiBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgSW5wdXQgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+SW5wdXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogT3BlbiB0aGlzIElucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWFkIGJ5dGVzIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4gIEF0IG1vc3QsIHRoZSBudW1iZXIgb2YgYnl0ZXMgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAqIGNvdW50IGFyZ3VtZW50IHdpbGwgYmUgcmVhZC4gIEJ5dGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBnaXZlbiBidWZmZXIgc3RhcnRpbmcKKyAgICAgICAgICogYXQgdGhlIGluZGV4IGdpdmVuIGluIHRoZSBvZmZzZXQgYXJndW1lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTa2lwcyBieXRlcyBpbiB0aGUgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciBOT1RfRU5PVUdIX0RBVEEgaWYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIGFuCisgICAgICAgICAqIGVycm9yIGhhcyBvY2N1cnJlZCwgdGhpcyB3aWxsIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXIgdGhhbiBOT1RfRU5PVUdIX0RBVEEuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgc2tpcChzaXplX3QgY291bnQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbG9zZSB0aGUgSW5wdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgSW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworCisjZW5kaWYgLypJTUdfVVRJTFNfSU5QVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3JkZXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNTNhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9PcmRlcmFibGUuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19PUkRFUkFCTEUKKyNkZWZpbmUgSU1HX1VUSUxTX09SREVSQUJMRQorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkVfREVGKG9wKSBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0OworCisvKioKKyAqIFN1YmNsYXNzZXMgb2YgT3JkZXJhYmxlIGNhbiBiZSBjb21wYXJlZCBhbmQgc29ydGVkLiAgVGhpcyBpcworICogaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgc29ydGVkIGFycmF5cyBvZiBUSUZGIGVudHJpZXMKKyAqIGFuZCBJRkRzLgorICovCitjbGFzcyBBTkRST0lEX0FQSSBPcmRlcmFibGUgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk9yZGVyYWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJpc29uIG9wZXJhdG90b3JzIGFyZSBiYXNlZCBvbiB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgICAgICAgICogZnJvbSB0aGlzIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisgICAgICAgIENPTVBBUkVfREVGKD49KQorICAgICAgICBDT01QQVJFX0RFRig8PSkKKyAgICAgICAgQ09NUEFSRV9ERUYoPT0pCisgICAgICAgIENPTVBBUkVfREVGKCE9KQorfTsKKworI3VuZGVmIENPTVBBUkVfREVGCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PUkRFUkFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL091dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmFlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvT3V0cHV0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfT1VUUFVUX0gKKyNkZWZpbmUgSU1HX1VUSUxTX09VVFBVVF9ICisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB1c2VkIHRvIG91dHB1dCBieXRlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgT3V0cHV0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfk91dHB1dCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBPcGVuIHRoaXMgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIGluIHRoZSBjb3VudAorICAgICAgICAgKiBhcmd1bWVudCB3aWxsIGJlIHdyaXR0ZW4uICBCeXRlcyB3aWxsIGJlIHdyaXR0ZW4gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyIHN0YXJ0aW5nCisgICAgICAgICAqIGF0IHRoZSBpbmRleCBnaXZlbiBpbiB0aGUgb2Zmc2V0IGFyZ3VtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2UgdGhpcyBPdXRwdXQuICBJdCBpcyBub3QgdmFsaWQgdG8gY2FsbCBvcGVuIG9uIGEgcHJldmlvdXNseSBjbG9zZWQgT3V0cHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19PVVRQVVRfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvUGFpci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUxY2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1BhaXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19QQUlSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1BBSVJfSAorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIEdlbmVyaWMgcGFpciB1dGlsaXR5IGNsYXNzLiAgTm90aGluZyBzcGVjaWFsIGhlcmUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIFM+CitjbGFzcyBBTkRST0lEX0FQSSBQYWlyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEYgZmlyc3Q7CisgICAgICAgIFMgc2Vjb25kOworCisgICAgICAgIFBhaXIoKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgUGFpciYgbykgOiBmaXJzdChvLmZpcnN0KSwgc2Vjb25kKG8uc2Vjb25kKSB7fQorCisgICAgICAgIFBhaXIoY29uc3QgRiYgZiwgY29uc3QgUyYgcykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHt9Cit9OworCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfUEFJUl9IKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1OWE4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9Tb3J0ZWRFbnRyeVZlY3Rvci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1NPUlRFRF9FTlRSWV9WRUNUT1JfSAorI2RlZmluZSBJTUdfVVRJTFNfU09SVEVEX0VOVFJZX1ZFQ1RPUl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisvKioKKyAqIFN1YmNsYXNzIG9mIFNvcnRlZFZlY3RvciB0aGF0IGhhcyBiZWVuIGV4dGVuZGVkIHRvCisgKiBkbyBjb21wYXJpc29ucy9sb29rdXBzIGJhc2VkIG9uIHRoZSB0YWcgSUQgb2YgdGhlIGVudHJpZXMuCisgKi8KK2NsYXNzIFNvcnRlZEVudHJ5VmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxUaWZmRW50cnk+ID4geworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+U29ydGVkRW50cnlWZWN0b3IoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IHdpdGggdGhlIGdpdmVuIHRhZyBJRCwgb3IKKyAgICAgICAgICogLTEgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBzc2l6ZV90IGluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBhcmUgdGFnIElELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3Q7Cit9OworCisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TT1JURURfRU5UUllfVkVDVE9SX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvU3RyaXBTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM2YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1N0cmlwU291cmNlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfU1RSSVBfU09VUkNFX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1NUUklQX1NPVVJDRV9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGFjdHMgYXMgYSBkYXRhIHNvdXJjZSBmb3Igc3RyaXBzIHNldCBpbiBhIFRpZmZJZmQuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFN0cmlwU291cmNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmlwU291cmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGNvdW50IGJ5dGVzIHRvIHRoZSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvU3RyZWFtKE91dHB1dCYgc3RyZWFtLCB1aW50MzJfdCBjb3VudCkgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHNvdXJjZSBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElmZCgpIGNvbnN0ID0gMDsKK307CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19TVFJJUF9TT1VSQ0VfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTc0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGFnRGVmaW5pdGlvbnMuaApAQCAtMCwwICsxLDEzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9UQUdfREVGSU5JVElPTl9ICisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL091dHB1dC5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUYWcgZGVmaW5pdGlvbnMgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBzdGFuZGFyZCBUSUZGIGNvbXBhdGlibGUgdGFncy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVGFnRGVmaW5pdGlvbiB7CisgICAgLy8gVGhlIHRhZyBuYW1lLgorICAgIGNvbnN0IGNoYXIqIHRhZ05hbWU7CisgICAgLy8gVGhlIHNwZWNpZmllZCB0YWcgSUQuCisgICAgY29uc3QgdWludDE2X3QgdGFnSWQ7CisgICAgLy8gVGhlIGRlZmF1bHQgdHlwZSBmb3IgdGhpcyB0YWcuICBUaGlzIG11c3QgYmUgYSB2YWxpZCBUSUZGIHR5cGUuCisgICAgY29uc3QgVGFnVHlwZSBkZWZhdWx0VHlwZTsKKyAgICAvLyBUaGUgZGVmYXVsdCBJbWFnZSBGaWxlIERpcmVjdG9yeSAoSUZEKSBmb3IgdGhpcyB0YWcuCisgICAgY29uc3QgdWludDMyX3QgZGVmYXVsdElmZDsKKyAgICAvLyBUaGUgdmFsaWQgY291bnQgZm9yIHRoaXMgdGFnLCBvciAwIGlmIHRoZSBjb3VudCBpcyBub3QgZml4ZWQuCisgICAgY29uc3QgdWludDMyX3QgZml4ZWRDb3VudDsKKyAgICAvLyBUaGUgZW5kaWFubmVzcyBvZiB0aGUgdGFnIHZhbHVlLCBvciBVTkRFRklORURfRU5ESUFOIGlmIHRoZXJlIGlzIG5vIGZpeGVkIGVuZGlhbgorICAgIGNvbnN0IEVuZGlhbm5lc3MgZml4ZWRFbmRpYW47Cit9IFRhZ0RlZmluaXRpb25fdDsKKworLyoqCisgKiBDb252ZW5pZW5jZSBkZWZpbmVzIGZvciB0YWcgaWRzLgorICovCitlbnVtIHsKKyAgICBUQUdfUkFXVE9QUkVWSUVXR0FJTiA9IDB4QzdBOHUsCisgICAgVEFHX05FV1JBV0lNQUdFRElHRVNUID0gMHhDN0E3dSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxUQ1JPUFNJWkUgPSAweEM3OTN1LAorICAgIFRBR19PUklHSU5BTEJFU1RRVUFMSVRZRklOQUxTSVpFID0gMHhDNzkydSwKKyAgICBUQUdfT1JJR0lOQUxERUZBVUxURklOQUxTSVpFID0gMHhDNzkxdSwKKyAgICBUQUdfUFJPRklMRUhVRVNBVE1BUEVOQ09ESU5HID0gMHhDN0EzdSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRUVOQ09ESU5HID0gMHhDN0E0dSwKKyAgICBUQUdfQkFTRUxJTkVFWFBPU1VSRU9GRlNFVCA9IDB4QzdBNXUsCisgICAgVEFHX0RFRkFVTFRCTEFDS1JFTkRFUiA9IDB4QzdBNnUsCisgICAgVEFHX0RFRkFVTFRVU0VSQ1JPUCA9IDB4QzdCNXUsCisgICAgVEFHX05PSVNFUFJPRklMRSA9IDB4Qzc2MXUsCisgICAgVEFHX09QQ09ERUxJU1QzID0gMHhDNzRFdSwKKyAgICBUQUdfT1BDT0RFTElTVDIgPSAweEM3NDF1LAorICAgIFRBR19PUENPREVMSVNUMSA9IDB4Qzc0MHUsCisgICAgVEFHX1BST0ZJTEVMT09LVEFCTEVEQVRBID0gMHhDNzI2dSwKKyAgICBUQUdfUFJPRklMRUxPT0tUQUJMRURJTVMgPSAweEM3MjV1LAorICAgIFRBR19ST1dJTlRFUkxFQVZFRkFDVE9SID0gMHhDNzFGdSwKKyAgICBUQUdfU1VCVElMRUJMT0NLU0laRSA9IDB4QzcxRXUsCisgICAgVEFHX09SSUdJTkFMUkFXRklMRURJR0VTVCA9IDB4QzcxRHUsCisgICAgVEFHX1JBV0lNQUdFRElHRVNUID0gMHhDNzFDdSwKKyAgICBUQUdfUFJFVklFV0RBVEVUSU1FID0gMHhDNzFCdSwKKyAgICBUQUdfUFJFVklFV0NPTE9SU1BBQ0UgPSAweEM3MUF1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NESUdFU1QgPSAweEM3MTl1LAorICAgIFRBR19QUkVWSUVXU0VUVElOR1NOQU1FID0gMHhDNzE4dSwKKyAgICBUQUdfUFJFVklFV0FQUExJQ0FUSU9OVkVSU0lPTiA9IDB4QzcxN3UsCisgICAgVEFHX1BSRVZJRVdBUFBMSUNBVElPTk5BTUUgPSAweEM3MTZ1LAorICAgIFRBR19GT1JXQVJETUFUUklYMiA9IDB4QzcxNXUsCisgICAgVEFHX0ZPUldBUkRNQVRSSVgxID0gMHhDNzE0dSwKKyAgICBUQUdfUFJPRklMRUNPUFlSSUdIVCA9IDB4QzZGRXUsCisgICAgVEFHX1BST0ZJTEVFTUJFRFBPTElDWSA9IDB4QzZGRHUsCisgICAgVEFHX1BST0ZJTEVUT05FQ1VSVkUgPSAweEM2RkN1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTIgPSAweEM2RkJ1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQREFUQTEgPSAweEM2RkF1LAorICAgIFRBR19QUk9GSUxFSFVFU0FUTUFQRElNUyA9IDB4QzZGOXUsCisgICAgVEFHX1BST0ZJTEVOQU1FID0gMHhDNkY4dSwKKyAgICBUQUdfTk9JU0VSRURVQ1RJT05BUFBMSUVEID0gMHhDNkY3dSwKKyAgICBUQUdfQVNTSE9UUFJPRklMRU5BTUUgPSAweEM2RjZ1LAorICAgIFRBR19FWFRSQUNBTUVSQVBST0ZJTEVTID0gMHhDNkY1dSwKKyAgICBUQUdfUFJPRklMRUNBTElCUkFUSU9OU0lHTkFUVVJFID0gMHhDNkY0dSwKKyAgICBUQUdfQ0FNRVJBQ0FMSUJSQVRJT05TSUdOQVRVUkUgPSAweEM2RjN1LAorICAgIFRBR19DT0xPUklNRVRSSUNSRUZFUkVOQ0UgPSAweEM2QkZ1LAorICAgIFRBR19DVVJSRU5UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MnUsCisgICAgVEFHX0NVUlJFTlRJQ0NQUk9GSUxFID0gMHhDNjkxdSwKKyAgICBUQUdfQVNTSE9UUFJFUFJPRklMRU1BVFJJWCA9IDB4QzY5MHUsCisgICAgVEFHX0FTU0hPVElDQ1BST0ZJTEUgPSAweEM2OEZ1LAorICAgIFRBR19NQVNLRURBUkVBUyA9IDB4QzY4RXUsCisgICAgVEFHX0FDVElWRUFSRUEgPSAweEM2OER1LAorICAgIFRBR19PUklHSU5BTFJBV0ZJTEVEQVRBID0gMHhDNjhDdSwKKyAgICBUQUdfT1JJR0lOQUxSQVdGSUxFTkFNRSA9IDB4QzY4QnUsCisgICAgVEFHX1JBV0RBVEFVTklRVUVJRCA9IDB4QzY1RHUsCisgICAgVEFHX01BS0VSTk9URVNBRkVUWSA9IDB4QzYzNXUsCisgICAgVEFHX0ROR1BSSVZBVEVEQVRBID0gMHhDNjM0dSwKKyAgICBUQUdfU0hBRE9XU0NBTEUgPSAweEM2MzN1LAorICAgIFRBR19BTlRJQUxJQVNTVFJFTkdUSCA9IDB4QzYzMnUsCisgICAgVEFHX0NIUk9NQUJMVVJSQURJVVMgPSAweEM2MzF1LAorICAgIFRBR19MRU5TSU5GTyA9IDB4QzYzMHUsCisgICAgVEFHX0NBTUVSQVNFUklBTE5VTUJFUiA9IDB4QzYyRnUsCisgICAgVEFHX0xJTkVBUlJFU1BPTlNFTElNSVQgPSAweEM2MkV1LAorICAgIFRBR19CQVlFUkdSRUVOU1BMSVQgPSAweEM2MkR1LAorICAgIFRBR19CQVNFTElORVNIQVJQTkVTUyA9IDB4QzYyQ3UsCisgICAgVEFHX0JBU0VMSU5FTk9JU0UgPSAweEM2MkJ1LAorICAgIFRBR19CQVNFTElORUVYUE9TVVJFID0gMHhDNjJBdSwKKyAgICBUQUdfQVNTSE9UV0hJVEVYWSA9IDB4QzYyOXUsCisgICAgVEFHX0FTU0hPVE5FVVRSQUwgPSAweEM2Mjh1LAorICAgIFRBR19BTkFMT0dCQUxBTkNFID0gMHhDNjI3dSwKKyAgICBUQUdfUkVEVUNUSU9OTUFUUklYMiA9IDB4QzYyNnUsCisgICAgVEFHX1JFRFVDVElPTk1BVFJJWDEgPSAweEM2MjV1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjIgPSAweEM2MjR1LAorICAgIFRBR19DQU1FUkFDQUxJQlJBVElPTjEgPSAweEM2MjN1LAorICAgIFRBR19DT0xPUk1BVFJJWDIgPSAweEM2MjJ1LAorICAgIFRBR19DT0xPUk1BVFJJWDEgPSAweEM2MjF1LAorICAgIFRBR19DQUxJQlJBVElPTklMTFVNSU5BTlQyID0gMHhDNjVCdSwKKyAgICBUQUdfQ0FMSUJSQVRJT05JTExVTUlOQU5UMSA9IDB4QzY1QXUsCisgICAgVEFHX0RFRkFVTFRDUk9QU0laRSA9IDB4QzYyMHUsCisgICAgVEFHX0RFRkFVTFRDUk9QT1JJR0lOID0gMHhDNjFGdSwKKyAgICBUQUdfQkVTVFFVQUxJVFlTQ0FMRSA9IDB4QzY1Q3UsCisgICAgVEFHX0RFRkFVTFRTQ0FMRSA9IDB4QzYxRXUsCisgICAgVEFHX1dISVRFTEVWRUwgPSAweEM2MUR1LAorICAgIFRBR19CTEFDS0xFVkVMREVMVEFWID0gMHhDNjFDdSwKKyAgICBUQUdfQkxBQ0tMRVZFTERFTFRBSCA9IDB4QzYxQnUsCisgICAgVEFHX0JMQUNLTEVWRUwgPSAweEM2MUF1LAorICAgIFRBR19CTEFDS0xFVkVMUkVQRUFURElNID0gMHhDNjE5dSwKKyAgICBUQUdfTElORUFSSVpBVElPTlRBQkxFID0gMHhDNjE4dSwKKyAgICBUQUdfQ0ZBTEFZT1VUID0gMHhDNjE3dSwKKyAgICBUQUdfQ0ZBUExBTkVDT0xPUiA9IDB4QzYxNnUsCisgICAgVEFHX0xPQ0FMSVpFRENBTUVSQU1PREVMID0gMHhDNjE1dSwKKyAgICBUQUdfVU5JUVVFQ0FNRVJBTU9ERUwgPSAweEM2MTR1LAorICAgIFRBR19ETkdCQUNLV0FSRFZFUlNJT04gPSAweEM2MTN1LAorICAgIFRBR19ETkdWRVJTSU9OID0gMHhDNjEydSwKKyAgICBUQUdfU1VCRklMRVRZUEUgPSAweDAwRkZ1LAorICAgIFRBR19ZUkVTT0xVVElPTiA9IDB4MDExQnUsCisgICAgVEFHX1hSRVNPTFVUSU9OID0gMHgwMTFBdSwKKyAgICBUQUdfVEhSRVNISE9MRElORyA9IDB4MDEwN3UsCisgICAgVEFHX1NUUklQT0ZGU0VUUyA9IDB4MDExMXUsCisgICAgVEFHX1NUUklQQllURUNPVU5UUyA9IDB4MDExN3UsCisgICAgVEFHX1NPRlRXQVJFID0gMHgwMTMxdSwKKyAgICBUQUdfU0FNUExFU1BFUlBJWEVMID0gMHgwMTE1dSwKKyAgICBUQUdfUk9XU1BFUlNUUklQID0gMHgwMTE2dSwKKyAgICBUQUdfUkVTT0xVVElPTlVOSVQgPSAweDAxMjh1LAorICAgIFRBR19QTEFOQVJDT05GSUdVUkFUSU9OID0gMHgwMTFDdSwKKyAgICBUQUdfUEhPVE9NRVRSSUNJTlRFUlBSRVRBVElPTiA9IDB4MDEwNnUsCisgICAgVEFHX09SSUVOVEFUSU9OID0gMHgwMTEydSwKKyAgICBUQUdfTkVXU1VCRklMRVRZUEUgPSAweDAwRkV1LAorICAgIFRBR19NT0RFTCA9IDB4MDExMHUsCisgICAgVEFHX01JTlNBTVBMRVZBTFVFID0gMHgwMTE4dSwKKyAgICBUQUdfTUFYU0FNUExFVkFMVUUgPSAweDAxMTl1LAorICAgIFRBR19NQUtFID0gMHgwMTBGdSwKKyAgICBUQUdfSU1BR0VXSURUSCA9IDB4MDEwMHUsCisgICAgVEFHX0lNQUdFTEVOR1RIID0gMHgwMTAxdSwKKyAgICBUQUdfSU1BR0VERVNDUklQVElPTiA9IDB4MDEwRXUsCisgICAgVEFHX0hPU1RDT01QVVRFUiA9IDB4MDEzQ3UsCisgICAgVEFHX0dSQVlSRVNQT05TRVVOSVQgPSAweDAxMjJ1LAorICAgIFRBR19HUkFZUkVTUE9OU0VDVVJWRSA9IDB4MDEyM3UsCisgICAgVEFHX0ZSRUVPRkZTRVRTID0gMHgwMTIwdSwKKyAgICBUQUdfRlJFRUJZVEVDT1VOVFMgPSAweDAxMjF1LAorICAgIFRBR19GSUxMT1JERVIgPSAweDAxMEF1LAorICAgIFRBR19FWFRSQVNBTVBMRVMgPSAweDAxNTJ1LAorICAgIFRBR19EQVRFVElNRSA9IDB4MDEzMnUsCisgICAgVEFHX0NPUFlSSUdIVCA9IDB4ODI5OHUsCisgICAgVEFHX0NPTVBSRVNTSU9OID0gMHgwMTAzdSwKKyAgICBUQUdfQ09MT1JNQVAgPSAweDAxNDB1LAorICAgIFRBR19DRUxMV0lEVEggPSAweDAxMDh1LAorICAgIFRBR19DRUxMTEVOR1RIID0gMHgwMTA5dSwKKyAgICBUQUdfQklUU1BFUlNBTVBMRSA9IDB4MDEwMnUsCisgICAgVEFHX0FSVElTVCA9IDB4MDEzQnUsCisgICAgVEFHX0VYSUZWRVJTSU9OID0gMHg5MDAwdSwKKyAgICBUQUdfQ0ZBUkVQRUFUUEFUVEVSTkRJTSA9IDB4ODI4RHUsCisgICAgVEFHX0RBVEVUSU1FT1JJR0lOQUwgPSAweDkwMDN1LAorICAgIFRBR19DRkFQQVRURVJOID0gMHg4MjhFdSwKKyAgICBUQUdfU1VCSUZEUyA9IDB4MDE0QXUsCisgICAgVEFHX1RJRkZFUFNUQU5EQVJESUQgPSAweDkyMTZ1LAorICAgIFRBR19FWFBPU1VSRVRJTUUgPSAweDgyOUF1LAorICAgIFRBR19JU09TUEVFRFJBVElOR1MgPSAweDg4Mjd1LAorICAgIFRBR19GT0NBTExFTkdUSCA9IDB4OTIwQXUsCisgICAgVEFHX0ZOVU1CRVIgPSAweDgyOUR1LAorICAgIFRBR19HUFNJTkZPID0gMHg4ODI1dSwKKyAgICBUQUdfR1BTVkVSU0lPTklEID0gMHgwdSwKKyAgICBUQUdfR1BTTEFUSVRVREVSRUYgPSAweDF1LAorICAgIFRBR19HUFNMQVRJVFVERSA9IDB4MnUsCisgICAgVEFHX0dQU0xPTkdJVFVERVJFRiA9IDB4M3UsCisgICAgVEFHX0dQU0xPTkdJVFVERSA9IDB4NHUsCisgICAgVEFHX0dQU1RJTUVTVEFNUCA9IDB4N3UsCisgICAgVEFHX0dQU0RBVEVTVEFNUCA9IDB4MDAxRHUsCit9OworCisvKioKKyAqIFRJRkZfRVBfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgVElGRiBFUCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGX0VQX1RBR19ERUZJTklUSU9OU1tdID0gIHsKKyAgICB7IC8vIFBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24KKyAgICAgICAgIlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24iLAorICAgICAgICAweDAxMDZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViSWZkcworICAgICAgICAiU3ViSWZkcyIsCisgICAgICAgIDB4MDE0QXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENGQVBhdHRlcm4KKyAgICAgICAgIkNGQVBhdHRlcm4iLAorICAgICAgICAweDgyOEV1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFSZXBlYXRQYXR0ZXJuRGltCisgICAgICAgICJDRkFSZXBlYXRQYXR0ZXJuRGltIiwKKyAgICAgICAgMHg4MjhEdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERhdGVUaW1lT3JpZ2luYWwKKyAgICAgICAgIkRhdGVUaW1lT3JpZ2luYWwiLAorICAgICAgICAweDkwMDN1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDIwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFRpZmYvRVBTdGFuZGFyZElECisgICAgICAgICJUaWZmIiwKKyAgICAgICAgMHg5MjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRXhwb3N1cmVUaW1lCisgICAgICAgICJFeHBvc3VyZVRpbWUiLAorICAgICAgICAweDgyOUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gSVNPU3BlZWRSYXRpbmdzCisgICAgICAgICJJU09TcGVlZFJhdGluZ3MiLAorICAgICAgICAweDg4Mjd1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9jYWxMZW5ndGgKKyAgICAgICAgIkZvY2FsTGVuZ3RoIiwKKyAgICAgICAgMHg5MjBBdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZOdW1iZXIKKyAgICAgICAgIkZOdW1iZXIiLAorICAgICAgICAweDgyOUR1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTSW5mbworICAgICAgICAiR1BTSW5mbyIsCisgICAgICAgIDB4ODgyNXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU1ZlcnNpb25JRAorICAgICAgICAiR1BTVmVyc2lvbklEIiwKKyAgICAgICAgMHgwdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR1BTTGF0aXR1ZGVSZWYKKyAgICAgICAgIkdQU0xhdGl0dWRlUmVmIiwKKyAgICAgICAgMHgxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0xhdGl0dWRlCisgICAgICAgICJHUFNMYXRpdHVkZSIsCisgICAgICAgIDB4MnUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGVSZWYKKyAgICAgICAgIkdQU0xvbmdpdHVkZVJlZiIsCisgICAgICAgIDB4M3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNMb25naXR1ZGUKKyAgICAgICAgIkdQU0xvbmdpdHVkZSIsCisgICAgICAgIDB4NHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHUFNUaW1lU3RhbXAKKyAgICAgICAgIkdQU1RpbWVTdGFtcCIsCisgICAgICAgIDB4N3UsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMywKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgVElGRiBFUCB0YWdzKi8KK307CisKKy8qKgorICogRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TIGNvbnRhaW5zIHRhZ3MgZGVmaW5lZCBpbiB0aGUgSmVpdGEgRVhJRiAyLjMgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRVhJRl8yXzNfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBFeGlmVmVyc2lvbgorICAgICAgICAiRXhpZlZlcnNpb24iLAorICAgICAgICAweDkwMDB1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEdQU0RhdGVTdGFtcAorICAgICAgICAiR1BTRGF0ZVN0YW1wIiwKKyAgICAgICAgMHgwMDFEdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAxMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgLypUT0RPOiBSZW1haW5pbmcgRVhJRiAyLjMgdGFncyovCit9OworCisvKioKKyAqIFRJRkZfNl9UQUdfREVGSU5JVElPTlMgY29udGFpbnMgdGFncyBkZWZpbmVkIGluIHRoZSBUSUZGIDYuMCBzcGVjCisgKi8KK2NvbnN0IFRhZ0RlZmluaXRpb25fdCBUSUZGXzZfVEFHX0RFRklOSVRJT05TW10gPSB7CisgICAgeyAvLyBTdWJGaWxlVHlwZQorICAgICAgICAiU3ViRmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXJ0aXN0CisgICAgICAgICJBcnRpc3QiLAorICAgICAgICAweDAxM0J1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQml0c1BlclNhbXBsZQorICAgICAgICAiQml0c1BlclNhbXBsZSIsCisgICAgICAgIDB4MDEwMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDZWxsTGVuZ3RoCisgICAgICAgICJDZWxsTGVuZ3RoIiwKKyAgICAgICAgMHgwMTA5dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENlbGxXaWR0aAorICAgICAgICAiQ2VsbFdpZHRoIiwKKyAgICAgICAgMHgwMTA4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWFwCisgICAgICAgICJDb2xvck1hcCIsCisgICAgICAgIDB4MDE0MHUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDb21wcmVzc2lvbgorICAgICAgICAiQ29tcHJlc3Npb24iLAorICAgICAgICAweDAxMDN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29weXJpZ2h0CisgICAgICAgICJDb3B5cmlnaHQiLAorICAgICAgICAweDgyOTh1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGF0ZVRpbWUKKyAgICAgICAgIkRhdGVUaW1lIiwKKyAgICAgICAgMHgwMTMydSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAyMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYVNhbXBsZXMKKyAgICAgICAgIkV4dHJhU2FtcGxlcyIsCisgICAgICAgIDB4MDE1MnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGaWxsT3JkZXIKKyAgICAgICAgIkZpbGxPcmRlciIsCisgICAgICAgIDB4MDEwQXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlQnl0ZUNvdW50cworICAgICAgICAiRnJlZUJ5dGVDb3VudHMiLAorICAgICAgICAweDAxMjF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBGcmVlT2Zmc2V0cworICAgICAgICAiRnJlZU9mZnNldHMiLAorICAgICAgICAweDAxMjB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBHcmF5UmVzcG9uc2VDdXJ2ZQorICAgICAgICAiR3JheVJlc3BvbnNlQ3VydmUiLAorICAgICAgICAweDAxMjN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gR3JheVJlc3BvbnNlVW5pdAorICAgICAgICAiR3JheVJlc3BvbnNlVW5pdCIsCisgICAgICAgIDB4MDEyMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBIb3N0Q29tcHV0ZXIKKyAgICAgICAgIkhvc3RDb21wdXRlciIsCisgICAgICAgIDB4MDEzQ3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBJbWFnZURlc2NyaXB0aW9uCisgICAgICAgICJJbWFnZURlc2NyaXB0aW9uIiwKKyAgICAgICAgMHgwMTBFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlTGVuZ3RoCisgICAgICAgICJJbWFnZUxlbmd0aCIsCisgICAgICAgIDB4MDEwMXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEltYWdlV2lkdGgKKyAgICAgICAgIkltYWdlV2lkdGgiLAorICAgICAgICAweDAxMDB1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYWtlCisgICAgICAgICJNYWtlIiwKKyAgICAgICAgMHgwMTBGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1heFNhbXBsZVZhbHVlCisgICAgICAgICJNYXhTYW1wbGVWYWx1ZSIsCisgICAgICAgIDB4MDExOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNaW5TYW1wbGVWYWx1ZQorICAgICAgICAiTWluU2FtcGxlVmFsdWUiLAorICAgICAgICAweDAxMTh1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gTW9kZWwKKyAgICAgICAgIk1vZGVsIiwKKyAgICAgICAgMHgwMTEwdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5ld1N1YmZpbGVUeXBlCisgICAgICAgICJOZXdTdWJmaWxlVHlwZSIsCisgICAgICAgIDB4MDBGRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWVudGF0aW9uCisgICAgICAgICJPcmllbnRhdGlvbiIsCisgICAgICAgIDB4MDExMnUsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQaG90b01ldHJpY0ludGVycHJldGF0aW9uCisgICAgICAgICJQaG90b01ldHJpY0ludGVycHJldGF0aW9uIiwKKyAgICAgICAgMHgwMTA2dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFBsYW5hckNvbmZpZ3VyYXRpb24KKyAgICAgICAgIlBsYW5hckNvbmZpZ3VyYXRpb24iLAorICAgICAgICAweDAxMUN1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmVzb2x1dGlvblVuaXQKKyAgICAgICAgIlJlc29sdXRpb25Vbml0IiwKKyAgICAgICAgMHgwMTI4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJvd3NQZXJTdHJpcAorICAgICAgICAiUm93c1BlclN0cmlwIiwKKyAgICAgICAgMHgwMTE2dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2FtcGxlc1BlclBpeGVsCisgICAgICAgICJTYW1wbGVzUGVyUGl4ZWwiLAorICAgICAgICAweDAxMTV1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU29mdHdhcmUKKyAgICAgICAgIlNvZnR3YXJlIiwKKyAgICAgICAgMHgwMTMxdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFN0cmlwQnl0ZUNvdW50cworICAgICAgICAiU3RyaXBCeXRlQ291bnRzIiwKKyAgICAgICAgMHgwMTE3dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3RyaXBPZmZzZXRzCisgICAgICAgICJTdHJpcE9mZnNldHMiLAorICAgICAgICAweDAxMTF1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBTdWJmaWxlVHlwZQorICAgICAgICAiU3ViZmlsZVR5cGUiLAorICAgICAgICAweDAwRkZ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVGhyZXNoaG9sZGluZworICAgICAgICAiVGhyZXNoaG9sZGluZyIsCisgICAgICAgIDB4MDEwN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBYUmVzb2x1dGlvbgorICAgICAgICAiWFJlc29sdXRpb24iLAorICAgICAgICAweDAxMUF1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gWVJlc29sdXRpb24KKyAgICAgICAgIllSZXNvbHV0aW9uIiwKKyAgICAgICAgMHgwMTFCdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKK307CisKKy8qKgorICogRE5HX1RBR19ERUZJTklUSU9OUyBjb250YWlucyB0YWdzIGRlZmluZWQgaW4gdGhlIERORyAxLjQgc3BlYworICovCitjb25zdCBUYWdEZWZpbml0aW9uX3QgRE5HX1RBR19ERUZJTklUSU9OU1tdID0geworICAgIHsgLy8gRE5HVmVyc2lvbgorICAgICAgICAiRE5HVmVyc2lvbiIsCisgICAgICAgIDB4QzYxMnUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICA0LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR0JhY2t3YXJkVmVyc2lvbgorICAgICAgICAiRE5HQmFja3dhcmRWZXJzaW9uIiwKKyAgICAgICAgMHhDNjEzdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gVW5pcXVlQ2FtZXJhTW9kZWwKKyAgICAgICAgIlVuaXF1ZUNhbWVyYU1vZGVsIiwKKyAgICAgICAgMHhDNjE0dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExvY2FsaXplZENhbWVyYU1vZGVsCisgICAgICAgICJMb2NhbGl6ZWRDYW1lcmFNb2RlbCIsCisgICAgICAgIDB4QzYxNXUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFQbGFuZUNvbG9yCisgICAgICAgICJDRkFQbGFuZUNvbG9yIiwKKyAgICAgICAgMHhDNjE2dSwKKyAgICAgICAgQllURSwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDRkFMYXlvdXQKKyAgICAgICAgIkNGQUxheW91dCIsCisgICAgICAgIDB4QzYxN3UsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExpbmVhcml6YXRpb25UYWJsZQorICAgICAgICAiTGluZWFyaXphdGlvblRhYmxlIiwKKyAgICAgICAgMHhDNjE4dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbFJlcGVhdERpbQorICAgICAgICAiQmxhY2tMZXZlbFJlcGVhdERpbSIsCisgICAgICAgIDB4QzYxOXUsCisgICAgICAgIFNIT1JULAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWwKKyAgICAgICAgIkJsYWNrTGV2ZWwiLAorICAgICAgICAweEM2MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJsYWNrTGV2ZWxEZWx0YUgKKyAgICAgICAgIkJsYWNrTGV2ZWxEZWx0YUgiLAorICAgICAgICAweEM2MUJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmxhY2tMZXZlbERlbHRhVgorICAgICAgICAiQmxhY2tMZXZlbERlbHRhViIsCisgICAgICAgIDB4QzYxQ3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBXaGl0ZUxldmVsCisgICAgICAgICJXaGl0ZUxldmVsIiwKKyAgICAgICAgMHhDNjFEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0U2NhbGUKKyAgICAgICAgIkRlZmF1bHRTY2FsZSIsCisgICAgICAgIDB4QzYxRXUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJlc3RRdWFsaXR5U2NhbGUKKyAgICAgICAgIkJlc3RRdWFsaXR5U2NhbGUiLAorICAgICAgICAweEM2NUN1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBEZWZhdWx0Q3JvcE9yaWdpbgorICAgICAgICAiRGVmYXVsdENyb3BPcmlnaW4iLAorICAgICAgICAweEM2MUZ1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiRGVmYXVsdENyb3BTaXplIiwKKyAgICAgICAgMHhDNjIwdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYWxpYnJhdGlvbklsbHVtaW5hbnQxCisgICAgICAgICJDYWxpYnJhdGlvbklsbHVtaW5hbnQxIiwKKyAgICAgICAgMHhDNjVBdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbGlicmF0aW9uSWxsdW1pbmFudDIKKyAgICAgICAgIkNhbGlicmF0aW9uSWxsdW1pbmFudDIiLAorICAgICAgICAweEM2NUJ1LAorICAgICAgICBTSE9SVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ29sb3JNYXRyaXgxCisgICAgICAgICJDb2xvck1hdHJpeDEiLAorICAgICAgICAweEM2MjF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yTWF0cml4MgorICAgICAgICAiQ29sb3JNYXRyaXgyIiwKKyAgICAgICAgMHhDNjIydSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDYW1lcmFDYWxpYnJhdGlvbjEKKyAgICAgICAgIkNhbWVyYUNhbGlicmF0aW9uMSIsCisgICAgICAgIDB4QzYyM3UsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ2FtZXJhQ2FsaWJyYXRpb24yCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvbjIiLAorICAgICAgICAweEM2MjR1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDEKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDEiLAorICAgICAgICAweEM2MjV1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJlZHVjdGlvbk1hdHJpeDIKKyAgICAgICAgIlJlZHVjdGlvbk1hdHJpeDIiLAorICAgICAgICAweEM2MjZ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFuYWxvZ0JhbGFuY2UKKyAgICAgICAgIkFuYWxvZ0JhbGFuY2UiLAorICAgICAgICAweEM2Mjd1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90TmV1dHJhbAorICAgICAgICAiQXNTaG90TmV1dHJhbCIsCisgICAgICAgIDB4QzYyOHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBBc1Nob3RXaGl0ZVhZCisgICAgICAgICJBc1Nob3RXaGl0ZVhZIiwKKyAgICAgICAgMHhDNjI5dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lRXhwb3N1cmUKKyAgICAgICAgIkJhc2VsaW5lRXhwb3N1cmUiLAorICAgICAgICAweEM2MkF1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJhc2VsaW5lTm9pc2UKKyAgICAgICAgIkJhc2VsaW5lTm9pc2UiLAorICAgICAgICAweEM2MkJ1LAorICAgICAgICBSQVRJT05BTCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQmFzZWxpbmVTaGFycG5lc3MKKyAgICAgICAgIkJhc2VsaW5lU2hhcnBuZXNzIiwKKyAgICAgICAgMHhDNjJDdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEJheWVyR3JlZW5TcGxpdAorICAgICAgICAiQmF5ZXJHcmVlblNwbGl0IiwKKyAgICAgICAgMHhDNjJEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBMaW5lYXJSZXNwb25zZUxpbWl0CisgICAgICAgICJMaW5lYXJSZXNwb25zZUxpbWl0IiwKKyAgICAgICAgMHhDNjJFdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYVNlcmlhbE51bWJlcgorICAgICAgICAiQ2FtZXJhU2VyaWFsTnVtYmVyIiwKKyAgICAgICAgMHhDNjJGdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIExlbnNJbmZvCisgICAgICAgICJMZW5zSW5mbyIsCisgICAgICAgIDB4QzYzMHUsCisgICAgICAgIFJBVElPTkFMLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDaHJvbWFCbHVyUmFkaXVzCisgICAgICAgICJDaHJvbWFCbHVyUmFkaXVzIiwKKyAgICAgICAgMHhDNjMxdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQW50aUFsaWFzU3RyZW5ndGgKKyAgICAgICAgIkFudGlBbGlhc1N0cmVuZ3RoIiwKKyAgICAgICAgMHhDNjMydSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU2hhZG93U2NhbGUKKyAgICAgICAgIlNoYWRvd1NjYWxlIiwKKyAgICAgICAgMHhDNjMzdSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEROR1ByaXZhdGVEYXRhCisgICAgICAgICJETkdQcml2YXRlRGF0YSIsCisgICAgICAgIDB4QzYzNHUsCisgICAgICAgIEJZVEUsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE1ha2VyTm90ZVNhZmV0eQorICAgICAgICAiTWFrZXJOb3RlU2FmZXR5IiwKKyAgICAgICAgMHhDNjM1dSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFJhd0RhdGFVbmlxdWVJRAorICAgICAgICAiUmF3RGF0YVVuaXF1ZUlEIiwKKyAgICAgICAgMHhDNjVEdSwKKyAgICAgICAgQllURSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDE2LAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsUmF3RmlsZU5hbWUKKyAgICAgICAgIk9yaWdpbmFsUmF3RmlsZU5hbWUiLAorICAgICAgICAweEM2OEJ1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGF0YQorICAgICAgICAiT3JpZ2luYWxSYXdGaWxlRGF0YSIsCisgICAgICAgIDB4QzY4Q3UsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIEJJRworICAgIH0sCisgICAgeyAvLyBBY3RpdmVBcmVhCisgICAgICAgICJBY3RpdmVBcmVhIiwKKyAgICAgICAgMHhDNjhEdSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgNCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBNYXNrZWRBcmVhcworICAgICAgICAiTWFza2VkQXJlYXMiLAorICAgICAgICAweEM2OEV1LAorICAgICAgICBMT05HLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdElDQ1Byb2ZpbGUKKyAgICAgICAgIkFzU2hvdElDQ1Byb2ZpbGUiLAorICAgICAgICAweEM2OEZ1LAorICAgICAgICBVTkRFRklORUQsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEFzU2hvdFByZVByb2ZpbGVNYXRyaXgKKyAgICAgICAgIkFzU2hvdFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTB1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEN1cnJlbnRJQ0NQcm9maWxlCisgICAgICAgICJDdXJyZW50SUNDUHJvZmlsZSIsCisgICAgICAgIDB4QzY5MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQ3VycmVudElDQ1Byb2ZpbGUKKyAgICAgICAgIkN1cnJlbnRJQ0NQcm9maWxlIiwKKyAgICAgICAgMHhDNjkxdSwKKyAgICAgICAgVU5ERUZJTkVELAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBDdXJyZW50UHJlUHJvZmlsZU1hdHJpeAorICAgICAgICAiQ3VycmVudFByZVByb2ZpbGVNYXRyaXgiLAorICAgICAgICAweEM2OTJ1LAorICAgICAgICBTUkFUSU9OQUwsCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENvbG9yaW1ldHJpY1JlZmVyZW5jZQorICAgICAgICAiQ29sb3JpbWV0cmljUmVmZXJlbmNlIiwKKyAgICAgICAgMHhDNkJGdSwKKyAgICAgICAgU0hPUlQsCisgICAgICAgIElGRF8wLAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIENhbWVyYUNhbGlicmF0aW9uU2lnbmF0dXJlCisgICAgICAgICJDYW1lcmFDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGM3UsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ2FsaWJyYXRpb25TaWduYXR1cmUKKyAgICAgICAgIlByb2ZpbGVDYWxpYnJhdGlvblNpZ25hdHVyZSIsCisgICAgICAgIDB4QzZGNHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBFeHRyYUNhbWVyYVByb2ZpbGVzCisgICAgICAgICJFeHRyYUNhbWVyYVByb2ZpbGVzIiwKKyAgICAgICAgMHhDNkY1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgSUZEXzAsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gQXNTaG90UHJvZmlsZU5hbWUKKyAgICAgICAgIkFzU2hvdFByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIElGRF8wLAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUmVkdWN0aW9uQXBwbGllZAorICAgICAgICAiTm9pc2VSZWR1Y3Rpb25BcHBsaWVkIiwKKyAgICAgICAgMHhDNkY3dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZU5hbWUKKyAgICAgICAgIlByb2ZpbGVOYW1lIiwKKyAgICAgICAgMHhDNkY4dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEaW1zCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRGltcyIsCisgICAgICAgIDB4QzZGOXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAzLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMQorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGExIiwKKyAgICAgICAgMHhDNkZBdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVIdWVTYXRNYXBEYXRhMgorICAgICAgICAiUHJvZmlsZUh1ZVNhdE1hcERhdGEyIiwKKyAgICAgICAgMHhDNkZCdSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVUb25lQ3VydmUKKyAgICAgICAgIlByb2ZpbGVUb25lQ3VydmUiLAorICAgICAgICAweEM2RkN1LAorICAgICAgICBGTE9BVCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUVtYmVkUG9saWN5CisgICAgICAgICJQcm9maWxlRW1iZWRQb2xpY3kiLAorICAgICAgICAweEM2RkR1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcm9maWxlQ29weXJpZ2h0CisgICAgICAgICJQcm9maWxlQ29weXJpZ2h0IiwKKyAgICAgICAgMHhDNkZFdSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIEZvcndhcmRNYXRyaXgxCisgICAgICAgICJGb3J3YXJkTWF0cml4MSIsCisgICAgICAgIDB4QzcxNHUsCisgICAgICAgIFNSQVRJT05BTCwKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRm9yd2FyZE1hdHJpeDIKKyAgICAgICAgIkZvcndhcmRNYXRyaXgyIiwKKyAgICAgICAgMHhDNzE1dSwKKyAgICAgICAgU1JBVElPTkFMLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3QXBwbGljYXRpb25OYW1lCisgICAgICAgICJQcmV2aWV3QXBwbGljYXRpb25OYW1lIiwKKyAgICAgICAgMHhDNzE2dSwKKyAgICAgICAgQVNDSUksCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24KKyAgICAgICAgIlByZXZpZXdBcHBsaWNhdGlvblZlcnNpb24iLAorICAgICAgICAweEM3MTd1LAorICAgICAgICBBU0NJSSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDAsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJldmlld1NldHRpbmdzTmFtZQorICAgICAgICAiUHJldmlld1NldHRpbmdzTmFtZSIsCisgICAgICAgIDB4QzcxOHUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3U2V0dGluZ3NEaWdlc3QKKyAgICAgICAgIlByZXZpZXdTZXR0aW5nc0RpZ2VzdCIsCisgICAgICAgIDB4QzcxOXUsCisgICAgICAgIEJZVEUsCisgICAgICAgIFBSRVZJRVdfSUZELAorICAgICAgICAxNiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3Q29sb3JTcGFjZQorICAgICAgICAiUHJldmlld0NvbG9yU3BhY2UiLAorICAgICAgICAweEM3MUF1LAorICAgICAgICBMT05HLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBQcmV2aWV3RGF0ZVRpbWUKKyAgICAgICAgIlByZXZpZXdEYXRlVGltZSIsCisgICAgICAgIDB4QzcxQnUsCisgICAgICAgIEFTQ0lJLAorICAgICAgICBQUkVWSUVXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBSYXdJbWFnZURpZ2VzdAorICAgICAgICAiUmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3MUN1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gT3JpZ2luYWxSYXdGaWxlRGlnZXN0CisgICAgICAgICJPcmlnaW5hbFJhd0ZpbGVEaWdlc3QiLAorICAgICAgICAweEM3MUR1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gU3ViVGlsZUJsb2NrU2l6ZQorICAgICAgICAiU3ViVGlsZUJsb2NrU2l6ZSIsCisgICAgICAgIDB4QzcxRXUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDIsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUm93SW50ZXJsZWF2ZUZhY3RvcgorICAgICAgICAiUm93SW50ZXJsZWF2ZUZhY3RvciIsCisgICAgICAgIDB4QzcxRnUsCisgICAgICAgIExPTkcsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURpbXMKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEaW1zIiwKKyAgICAgICAgMHhDNzI1dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDMsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUxvb2tUYWJsZURhdGEKKyAgICAgICAgIlByb2ZpbGVMb29rVGFibGVEYXRhIiwKKyAgICAgICAgMHhDNzI2dSwKKyAgICAgICAgRkxPQVQsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QxCisgICAgICAgICJPcGNvZGVMaXN0MSIsCisgICAgICAgIDB4Qzc0MHUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QyCisgICAgICAgICJPcGNvZGVMaXN0MiIsCisgICAgICAgIDB4Qzc0MXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE9wY29kZUxpc3QzCisgICAgICAgICJPcGNvZGVMaXN0MyIsCisgICAgICAgIDB4Qzc0RXUsCisgICAgICAgIFVOREVGSU5FRCwKKyAgICAgICAgUkFXX0lGRCwKKyAgICAgICAgMCwKKyAgICAgICAgQklHCisgICAgfSwKKyAgICB7IC8vIE5vaXNlUHJvZmlsZQorICAgICAgICAiTm9pc2VQcm9maWxlIiwKKyAgICAgICAgMHhDNzYxdSwKKyAgICAgICAgRE9VQkxFLAorICAgICAgICBSQVdfSUZELAorICAgICAgICAwLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIERlZmF1bHRVc2VyQ3JvcAorICAgICAgICAiRGVmYXVsdFVzZXJDcm9wIiwKKyAgICAgICAgMHhDN0I1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFJBV19JRkQsCisgICAgICAgIDQsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gRGVmYXVsdEJsYWNrUmVuZGVyCisgICAgICAgICJEZWZhdWx0QmxhY2tSZW5kZXIiLAorICAgICAgICAweEM3QTZ1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBCYXNlbGluZUV4cG9zdXJlT2Zmc2V0CisgICAgICAgICJCYXNlbGluZUV4cG9zdXJlT2Zmc2V0IiwKKyAgICAgICAgMHhDN0E1dSwKKyAgICAgICAgUkFUSU9OQUwsCisgICAgICAgIFBST0ZJTEVfSUZELAorICAgICAgICAxLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIFByb2ZpbGVMb29rVGFibGVFbmNvZGluZworICAgICAgICAiUHJvZmlsZUxvb2tUYWJsZUVuY29kaW5nIiwKKyAgICAgICAgMHhDN0E0dSwKKyAgICAgICAgTE9ORywKKyAgICAgICAgUFJPRklMRV9JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUHJvZmlsZUh1ZVNhdE1hcEVuY29kaW5nCisgICAgICAgICJQcm9maWxlSHVlU2F0TWFwRW5jb2RpbmciLAorICAgICAgICAweEM3QTN1LAorICAgICAgICBMT05HLAorICAgICAgICBQUk9GSUxFX0lGRCwKKyAgICAgICAgMSwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsRGVmYXVsdEZpbmFsU2l6ZSIsCisgICAgICAgIDB4Qzc5MXUsCisgICAgICAgIExPTkcsCisgICAgICAgIElGRF8wLAorICAgICAgICAyLAorICAgICAgICBVTkRFRklORURfRU5ESUFOCisgICAgfSwKKyAgICB7IC8vIE9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUKKyAgICAgICAgIk9yaWdpbmFsQmVzdFF1YWxpdHlGaW5hbFNpemUiLAorICAgICAgICAweEM3OTJ1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBPcmlnaW5hbERlZmF1bHRDcm9wU2l6ZQorICAgICAgICAiT3JpZ2luYWxEZWZhdWx0Q3JvcFNpemUiLAorICAgICAgICAweEM3OTN1LAorICAgICAgICBMT05HLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMiwKKyAgICAgICAgVU5ERUZJTkVEX0VORElBTgorICAgIH0sCisgICAgeyAvLyBOZXdSYXdJbWFnZURpZ2VzdAorICAgICAgICAiTmV3UmF3SW1hZ2VEaWdlc3QiLAorICAgICAgICAweEM3QTd1LAorICAgICAgICBCWVRFLAorICAgICAgICBJRkRfMCwKKyAgICAgICAgMTYsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorICAgIHsgLy8gUmF3VG9QcmV2aWV3R2FpbgorICAgICAgICAiUmF3VG9QcmV2aWV3R2FpbiIsCisgICAgICAgIDB4QzdBOHUsCisgICAgICAgIERPVUJMRSwKKyAgICAgICAgUFJFVklFV19JRkQsCisgICAgICAgIDEsCisgICAgICAgIFVOREVGSU5FRF9FTkRJQU4KKyAgICB9LAorfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfVEFHX0RFRklOSVRJT05fSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmggYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NzJiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmRW50cnkuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9FTlRSWQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworI2RlZmluZSBDT01QQVJFX0RFRihvcCkgXAoraW5saW5lIGJvb2wgb3BlcmF0b3Igb3AgKGNvbnN0IFRpZmZFbnRyeSYgZW50cnkpIGNvbnN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBzaW5nbGUgVElGRiBJRkQgZW50cnkuCisgKgorICogU3ViY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gc3VwcG9ydCBhc3NpZ25tZW50IGFuZCBjb3B5aW5nIG9wZXJhdGlvbnMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZFbnRyeSA6IHB1YmxpYyBUaWZmV3JpdGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGlmZkVudHJ5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSAxMi1ieXRlIElGRCBlbnRyeSB0byB0aGUgb3V0cHV0LiBUaGUgZ2l2ZW4gb2Zmc2V0IHdpbGwgYmUKKyAgICAgICAgICogc2V0IGFzIHRoZSB0YWcgdmFsdWUgaWYgdGhlIHNpemUgb2YgdGhlIHRhZyB2YWx1ZSBleGNlZWRzIHRoZSBtYXgKKyAgICAgICAgICogc2l6ZSBmb3IgdGhlIFRJRkYgVmFsdWUgZmllbGQgKDQgYnl0ZXMpLCBhbmQgc2hvdWxkIGJlIHdvcmQgYWxpZ25lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY291bnQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIENvdW50CisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0YWcgaWQgc2V0IGZvciB0aGlzIGVudHJ5LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFRhZworICAgICAgICAgKiBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDE2X3QgZ2V0VGFnKCkgY29uc3QgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHR5cGUgc2V0IGZvciB0aGlzIGVudHJ5LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVElGRiBUeXBlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBUYWdUeXBlIGdldFR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVmaW5lZCBlbmRpYW5uZXNzIGZvciB0aGlzIGVudHJ5LiAgSWYgdGhpcyBpcyBkZWZpbmVkLAorICAgICAgICAgKiB0aGUgdGFnIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB3aXRoIHRoZSBnaXZlbiBieXRlIG9yZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgZm9yIHRoaXMgZW50cnkuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUSUZGIFZhbHVlCisgICAgICAgICAqIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlIHZhbHVlIGlzIE5VTEwsIG9yIGlmIHRoZSB0eXBlIHVzZWQgZG9lcyBub3QKKyAgICAgICAgICogbWF0Y2ggdGhlIHR5cGUgb2YgdGhpcyB0YWcuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBjb25zdCBUKiBnZXREYXRhKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcmNlIHRoZSB0eXBlIHVzZWQgaGVyZSB0byBiZSBhIHZhbGlkIFRJRkYgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBOVUxMIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBOVUxMLCBvciBpZiB0aGUgdHlwZSBnaXZlbiBkb2VzCisgICAgICAgICAqIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgZ2l2ZW4uCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgY29uc3QgVCogZm9yY2VWYWxpZFR5cGUoVGFnVHlwZSB0eXBlLCBjb25zdCBUKiB2YWx1ZSk7CisKKyAgICAgICAgdmlydHVhbCBjb25zdCB2b2lkKiBnZXREYXRhSGVscGVyKCkgY29uc3QgPSAwOworCisgICAgICAgIENPTVBBUkVfREVGKD4pCisgICAgICAgIENPTVBBUkVfREVGKDwpCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgTUFYX1BSSU5UX1NUUklOR19MRU5HVEggPSAyNTYKKyAgICAgICAgfTsKK307CisKKyNkZWZpbmUgQ09NUEFSRShvcCkgXAorYm9vbCBUaWZmRW50cnk6Om9wZXJhdG9yIG9wIChjb25zdCBUaWZmRW50cnkmIGVudHJ5KSBjb25zdCB7IFwKKyAgICByZXR1cm4gZ2V0Q29tcGFyYWJsZVZhbHVlKCkgb3AgZW50cnkuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBUKiBUaWZmRW50cnk6OmdldERhdGEoKSBjb25zdCB7CisgICAgY29uc3QgVCogdmFsdWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihnZXREYXRhSGVscGVyKCkpOworICAgIHJldHVybiBmb3JjZVZhbGlkVHlwZTxUPihnZXRUeXBlKCksIHZhbHVlKTsKK30KKworI3VuZGVmIENPTVBBUkUKKyN1bmRlZiBDT01QQVJFX0RFRgorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCisjZW5kaWYgLypJTUdfVVRJTFNfVElGRl9FTlRSWSovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNjYjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZFbnRyeUltcGwuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9FTlRSWV9JTVBMCisjZGVmaW5lIElNR19VVElMU19USUZGX0VOVFJZX0lNUEwKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZFbnRyeS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvRW5kaWFuVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBUaWZmRW50cnlJbXBsIDogcHVibGljIFRpZmZFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworICAgICAgICB2aXJ0dWFsIH5UaWZmRW50cnlJbXBsKCk7CisKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUYWdJbmZvKHVpbnQzMl90IG9mZnNldCwgLypvdXQqL0VuZGlhbk91dHB1dCogb3V0KSBjb25zdDsKKworICAgICAgICB1aW50MzJfdCBnZXRDb3VudCgpIGNvbnN0OworICAgICAgICB1aW50MTZfdCBnZXRUYWcoKSBjb25zdDsKKyAgICAgICAgVGFnVHlwZSBnZXRUeXBlKCkgY29uc3Q7CisgICAgICAgIEVuZGlhbm5lc3MgZ2V0RW5kaWFubmVzcygpIGNvbnN0OworICAgICAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3Qgdm9pZCogZ2V0RGF0YUhlbHBlcigpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBnZXRBY3R1YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgdWludDE2X3QgbVRhZzsKKyAgICAgICAgdWludDE2X3QgbVR5cGU7CisgICAgICAgIHVpbnQzMl90IG1Db3VudDsKKyAgICAgICAgRW5kaWFubmVzcyBtRW5kOworICAgICAgICBWZWN0b3I8VD4gbURhdGE7CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+OjpUaWZmRW50cnlJbXBsKHVpbnQxNl90IHRhZywgVGFnVHlwZSB0eXBlLCB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsCisgICAgICAgIGNvbnN0IFQqIGRhdGEpCisgICAgICAgIDogbVRhZyh0YWcpLCBtVHlwZShzdGF0aWNfY2FzdDx1aW50MTZfdD4odHlwZSkpLCBtQ291bnQoY291bnQpLCBtRW5kKGVuZCkgeworICAgIGNvdW50ID0gKHR5cGUgPT0gUkFUSU9OQUwgfHwgdHlwZSA9PSBTUkFUSU9OQUwpID8gY291bnQgKiAyIDogY291bnQ7CisgICAgc3NpemVfdCBpbmRleCA9IG1EYXRhLmFwcGVuZEFycmF5KGRhdGEsIGNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4IDwgMCwgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdmVjdG9yIGZvciBkYXRhLiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUaWZmRW50cnlJbXBsPFQ+Ojp+VGlmZkVudHJ5SW1wbCgpIHt9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvdW50OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordWludDE2X3QgVGlmZkVudHJ5SW1wbDxUPjo6Z2V0VGFnKCkgY29uc3QgeworICAgIHJldHVybiBtVGFnOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVGFnVHlwZSBUaWZmRW50cnlJbXBsPFQ+OjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUYWdUeXBlPihtVHlwZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCB2b2lkKiBUaWZmRW50cnlJbXBsPFQ+OjpnZXREYXRhSGVscGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihtRGF0YS5hcnJheSgpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NpemVfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIFdPUkRfQUxJR04odG90YWwpCisgICAgcmV0dXJuICh0b3RhbCA8PSBPRkZTRVRfU0laRSkgPyAwIDogdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRBY3R1YWxTaXplKCkgY29uc3QgeworICAgIHVpbnQzMl90IHRvdGFsID0gc2l6ZW9mKFQpICogbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvLyAyIGludHMgc3RvcmVkIGZvciBlYWNoIHJhdGlvbmFsLCBtdWx0aXBseSBieSAyCisgICAgICAgIHRvdGFsIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitFbmRpYW5uZXNzIFRpZmZFbnRyeUltcGw8VD46OmdldEVuZGlhbm5lc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FbmQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1aW50MzJfdCBUaWZmRW50cnlJbXBsPFQ+OjpnZXRDb21wYXJhYmxlVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWc7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmRW50cnlJbXBsPFQ+Ojp3cml0ZVRhZ0luZm8odWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVRhZywgMCwgMSksIHJldCk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm1UeXBlLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbUNvdW50LCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQzMl90IGRhdGFTaXplID0gZ2V0QWN0dWFsU2l6ZSgpOworICAgIGlmIChkYXRhU2l6ZSA+IE9GRlNFVF9TSVpFKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZvZmZzZXQsIDAsIDEpLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgICAgICBpZiAoZ2V0VHlwZSgpID09IFJBVElPTkFMIHx8IGdldFR5cGUoKSA9PSBTUkFUSU9OQUwpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICAgICAqIHJhdGlvbmFsIGlzIHJlcHJlc2VudGVkIGJ5IDIgaW50cy4gIFRvIHJlY292ZXIgdGhlCisgICAgICAgICAgICAgKiBzaXplIG9mIHRoZSBhcnJheSBoZXJlLCBtdWx0aXBseSB0aGUgY291bnQgYnkgMi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY291bnQgPDw9IDE7CisgICAgICAgIH0KKyAgICAgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUobURhdGEuYXJyYXkoKSwgMCwgY291bnQpLCByZXQpOworICAgICAgICBaRVJPX1RJTExfV09SRChvdXQsIGRhdGFTaXplLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdHVzX3QgVGlmZkVudHJ5SW1wbDxUPjo6d3JpdGVEYXRhKHVpbnQzMl90IG9mZnNldCwgRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIC8vIFNvbWUgdGFncyBoYXZlIGZpeGVkLWVuZGlhbiB2YWx1ZSBvdXRwdXQKKyAgICBFbmRpYW5uZXNzIHRtcCA9IFVOREVGSU5FRF9FTkRJQU47CisgICAgaWYgKG1FbmQgIT0gVU5ERUZJTkVEX0VORElBTikgeworICAgICAgICB0bXAgPSBvdXQtPmdldEVuZGlhbm5lc3MoKTsKKyAgICAgICAgb3V0LT5zZXRFbmRpYW5uZXNzKG1FbmQpOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50ID0gbUNvdW50OworICAgIGlmIChnZXRUeXBlKCkgPT0gUkFUSU9OQUwgfHwgZ2V0VHlwZSgpID09IFNSQVRJT05BTCkgeworICAgICAgICAvKioKKyAgICAgICAgICogUmF0aW9uYWxzIGFyZSBzdG9yZWQgYXMgYW4gYXJyYXkgb2YgaW50cy4gIEVhY2gKKyAgICAgICAgICogcmF0aW9uYWwgaXMgcmVwcmVzZW50ZWQgYnkgMiBpbnRzLiAgVG8gcmVjb3ZlciB0aGUKKyAgICAgICAgICogc2l6ZSBvZiB0aGUgYXJyYXkgaGVyZSwgbXVsdGlwbHkgdGhlIGNvdW50IGJ5IDIuCisgICAgICAgICAqLworICAgICAgICBjb3VudCA8PD0gMTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZShtRGF0YS5hcnJheSgpLCAwLCBjb3VudCksIHJldCk7CisKKyAgICBpZiAobUVuZCAhPSBVTkRFRklORURfRU5ESUFOKSB7CisgICAgICAgIG91dC0+c2V0RW5kaWFubmVzcyh0bXApOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIG5leHQgd29yZCBhbGlnbm1lbnQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIHNpemVvZihUKSAqIGNvdW50LCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlVGFnSW5mbyh1aW50MzJfdCBvZmZzZXQsCisgICAgICAgIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3QgeworICAgIGFzc2VydCgob2Zmc2V0ICUgVElGRl9XT1JEX1NJWkUpID09IDApOworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtVGFnLCAwLCAxKSwgcmV0KTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LT53cml0ZSgmbVR5cGUsIDAsIDEpLCByZXQpOworICAgIEJBSUxfT05fRkFJTChvdXQtPndyaXRlKCZtQ291bnQsIDAsIDEpLCByZXQpOworCisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJm9mZnNldCwgMCwgMSksIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHVpbnQzMl90IFRpZmZFbnRyeUltcGw8c3A8VGlmZklmZD4gPjo6Z2V0QWN0dWFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7ICsraSkgeworICAgICAgICB0b3RhbCArPSBtRGF0YVtpXS0+Z2V0U2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGF0dXNfdCBUaWZmRW50cnlJbXBsPHNwPFRpZmZJZmQ+ID46OndyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIEVuZGlhbk91dHB1dCogb3V0KSBjb25zdCB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1Db3VudDsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRGF0YVtpXS0+d3JpdGVEYXRhKG9mZnNldCwgb3V0KSwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IG1EYXRhW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0VOVFJZX0lNUEwqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2OWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmSGVscGVycy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNR19VVElMU19USUZGX0hFTFBFUlNfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9IRUxQRVJTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworY29uc3QgdWludDhfdCBaRVJPX1dPUkRbXSA9IHswLCAwLCAwLCAwfTsKKworI2RlZmluZSBCQUlMX09OX0ZBSUwoeCwgZmxhZykgXAorICAgIGlmICgoZmxhZyA9ICh4KSkgIT0gT0spIHJldHVybiBmbGFnOworCisjZGVmaW5lIEJZVEVTX1RJTExfV09SRChpbmRleCkgXAorICAgICgoVElGRl9XT1JEX1NJWkUgLSAoKGluZGV4KSAlIFRJRkZfV09SRF9TSVpFKSkgJSBUSUZGX1dPUkRfU0laRSkKKworI2RlZmluZSBXT1JEX0FMSUdOKGNvdW50KSBcCisgICAgY291bnQgKz0gQllURVNfVElMTF9XT1JEKGNvdW50KTsKKworI2RlZmluZSBaRVJPX1RJTExfV09SRChvdXRwdXQsIGluZGV4LCByZXQpIFwKKyAgICB7IFwKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IEJZVEVTX1RJTExfV09SRChpbmRleCk7IFwKKyAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsgXAorICAgICAgICAgICAgQkFJTF9PTl9GQUlMKChvdXRwdXQpLT53cml0ZShaRVJPX1dPUkQsIDAsIHJlbWFpbmluZyksIHJldCk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisvKioKKyAqIEJhc2ljIFRJRkYgaGVhZGVyIGNvbnN0YW50cy4KKyAqLworZW51bSB7CisgICAgQkFEX09GRlNFVCA9IDAsCisgICAgVElGRl9XT1JEX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgSUZEX0hFQURFUl9TSVpFID0gMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIElGRF9GT09URVJfU0laRSA9IDQsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBUSUZGX0VOVFJZX1NJWkUgPSAxMiwgLy8gU2l6ZSBpbiBieXRlcworICAgIE1BWF9JRkRfRU5UUklFUyA9IFVJTlQxNl9NQVgsCisgICAgRklMRV9IRUFERVJfU0laRSA9IDgsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBFTkRJQU5fTUFSS0VSX1NJWkUgPSAyLCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9NQVJLRVJfU0laRSA9IDIsIC8vIFNpemUgaW4gYnl0ZXMKKyAgICBPRkZTRVRfTUFSS0VSX1NJWkUgPSA0LCAvLyBTaXplIGluIGJ5dGVzCisgICAgVElGRl9GSUxFX01BUktFUiA9IDQyLAorICAgIEJJR19FTkRJQU5fTUFSS0VSID0gMHg0RDREdSwKKyAgICBMSVRUTEVfRU5ESUFOX01BUktFUiA9IDB4NDk0OXUKK307CisKKy8qKgorICogQ29uc3RhbnRzIGZvciB0aGUgVElGRiB0YWcgdHlwZXMuCisgKi8KK2VudW0gVGFnVHlwZSB7CisgICAgVU5LTk9XTl9UQUdUWVBFID0gMCwKKyAgICBCWVRFPTEsCisgICAgQVNDSUksCisgICAgU0hPUlQsCisgICAgTE9ORywKKyAgICBSQVRJT05BTCwKKyAgICBTQllURSwKKyAgICBVTkRFRklORUQsCisgICAgU1NIT1JULAorICAgIFNMT05HLAorICAgIFNSQVRJT05BTCwKKyAgICBGTE9BVCwKKyAgICBET1VCTEUKK307CisKKy8qKgorICogU2l6ZXMgb2YgdGhlIFRJRkYgZW50cnkgZmllbGRzIChpbiBieXRlcykuCisgKi8KK2VudW0geworICAgIFRBR19TSVpFID0gMiwKKyAgICBUWVBFX1NJWkUgPSAyLAorICAgIENPVU5UX1NJWkUgPSA0LAorICAgIE9GRlNFVF9TSVpFID0gNAorfTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBJRkQgaWQgY29uc3RhbnRzLgorICovCitlbnVtIHsKKyAgICBJRkRfMCA9IDAsCisgICAgUkFXX0lGRCwKKyAgICBQUk9GSUxFX0lGRCwKKyAgICBQUkVWSUVXX0lGRAorfTsKKworaW5saW5lIHNpemVfdCBnZXRUeXBlU2l6ZShUYWdUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBBU0NJSToKKyAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICBjYXNlIFNCWVRFOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU0hPUlQ6CisgICAgICAgIGNhc2UgU1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgY2FzZSBTTE9ORzoKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBjYXNlIFJBVElPTkFMOgorICAgICAgICBjYXNlIFNSQVRJT05BTDoKKyAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICByZXR1cm4gODsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworaW5saW5lIHVpbnQzMl90IGNhbGN1bGF0ZUlmZFNpemUoc2l6ZV90IG51bWJlck9mRW50cmllcykgeworICAgIHJldHVybiBJRkRfSEVBREVSX1NJWkUgKyBJRkRfRk9PVEVSX1NJWkUgKyBUSUZGX0VOVFJZX1NJWkUgKiBudW1iZXJPZkVudHJpZXM7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKyNlbmRpZiAvKklNR19VVElMU19USUZGX0hFTFBFUlNfSCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZklmZC5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWI1YzlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZJZmQuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9JRkRfSAorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9JRkRfSAorCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnkuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvT3V0cHV0Lmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhvbGRzIGEgc2luZ2xlIFRJRkYgSW1hZ2UgRmlsZSBEaXJlY3RvcnkgKElGRCkgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgbWFwcyB0byB0aGUgVElGRiBJRkQgc3RydWN0dXJlIHRoYXQgaXMgbG9naWNhbGx5IGNvbXBvc2VkIG9mOgorICogLSBBIDItYnl0ZSBmaWVsZCBsaXN0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcy4KKyAqIC0gQSBsaXN0IG9mIDEyLWJ5dGUgVElGRiBlbnRyaWVzLgorICogLSBBIDQtYnl0ZSBvZmZzZXQgdG8gdGhlIG5leHQgSUZELgorICovCitjbGFzcyBBTkRST0lEX0FQSSBUaWZmSWZkIDogcHVibGljIFRpZmZXcml0YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmSWZkKHVpbnQzMl90IGlmZElkKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZklmZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBUaWZmRW50cnkgdG8gdGhpcyBJRkQgb3IgcmVwbGFjZSBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoZQorICAgICAgICAgKiBzYW1lIHRhZyBJRC4gIE5vIHZhbGlkYXRpb24gaXMgZG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgSUZELiAgVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIGxpbmtlZAorICAgICAgICAgKiBsaXN0IG9mIElGRHMgYXMgZGVmaW5lZCBieSB0aGUgVElGRiA2LjAgc3BlYy4sIGFuZCBpcyBub3QgaW5jbHVkZWQKKyAgICAgICAgICogd2hlbiBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBJRkQgYW5kIGVudHJpZXMgZm9yIHRoZSBnZXRTaXplKCkKKyAgICAgICAgICogbWV0aG9kICh1bmxpa2UgU3ViSUZEcykuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0TmV4dElmZChjb25zdCBzcDxUaWZmSWZkPiYgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IElGRCwgb3IgTlVMTCBpZiBub25lIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3A8VGlmZklmZD4gZ2V0TmV4dElmZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcml0ZSB0aGUgSUZEIGRhdGEuICBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBzdWItSUZEcykuICBUaGUgd3JpdHRlbiBhbW91bnQgc2hvdWxkIGVuZCBvbiBhIHdvcmQgYm91bmRhcnksIGFuZAorICAgICAgICAgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHNob3VsZCBiZSB3b3JkIGFsaWduZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlRGF0YSh1aW50MzJfdCBvZmZzZXQsIC8qb3V0Ki9FbmRpYW5PdXRwdXQqIG91dCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgSUZELiBUaGlzIGluY2x1ZGVzIHRoZSBJRkQgaGVhZGVyLCBlbnRyaWVzLCBmb290ZXIsCisgICAgICAgICAqIGFuZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgKHJlY3Vyc2l2ZWx5IGluY2x1ZGluZworICAgICAgICAgKiBhbnkgc3ViLUlGRHMpLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGlkIG9mIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRJZCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGlmIGl0IGV4aXN0cywgb3IgYW4gZW1wdHkgc3Ryb25nCisgICAgICAgICAqIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlIHRoZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcgSUQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byB2YWxpZGF0ZSBhbmQgc2V0IHN0cmlwLXJlbGF0ZWQgaW1hZ2UgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBzZXRzIGFsbCBzdHJpcCByZWxhdGVkIHRhZ3MsIGJ1dCBsZWF2ZXMgb2Zmc2V0IHZhbHVlcyB1bml0aWFsaXplZC4KKyAgICAgICAgICogc2V0U3RyaXBPZmZzZXRzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgb2Zmc2V0IGJlZm9yZSB3cml0aW5nLgorICAgICAgICAgKiBUaGUgc3RyaXAgdGFnIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBleGlzdGluZyB0YWdzIGZvciBpbWFnZQorICAgICAgICAgKiBkaW1lbnNpb25zIGFuZCBwaXhlbCB0eXBlIHNldCBpbiB0aGUgSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBEb2VzIG5vdCBoYW5kbGUgcGxhbmFyIGltYWdlIGNvbmZpZ3VyYXRpb25zIChQbGFuYXJDb25maWd1cmF0aW9uICE9IDEpLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzIGhhcyBiZWVuIGNhbGxlZCwgYnV0IG5vdCBzZXRTdHJpcE9mZnNldHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGJvb2wgdW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBiZWdpbm5pbmcgb2Zmc2V0IGZvciBzdHJpcHMuCisgICAgICAgICAqCisgICAgICAgICAqIENhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHN0cmlwIG9mZnNldHMgYmVmb3JlIGNhbGxpbmcgd3JpdGVEYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSBzdHJpcHMgaW4gYnl0ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgc3VtcyB0aGUgYnl0ZSBjb3VudCBhdCBlYWNoIHN0cmlwIG9mZnNldCwgYW5kIHJldHVybnMKKyAgICAgICAgICogdGhlIHRvdGFsIGNvdW50IG9mIGJ5dGVzIHN0b3JlZCBpbiBzdHJpcHMgZm9yIHRoaXMgSUZELgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJpcFNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBJRkQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJpbnQgYSBmb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIElGRCB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGxvZygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdmFsdWUgdXNlZCB0byBkZXRlcm1pbmUgc29ydCBvcmRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tBbmRHZXRPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSBjb25zdDsKKyAgICAgICAgU29ydGVkRW50cnlWZWN0b3IgbUVudHJpZXM7CisgICAgICAgIHNwPFRpZmZJZmQ+IG1OZXh0SWZkOworICAgICAgICB1aW50MzJfdCBtSWZkSWQ7CisgICAgICAgIGJvb2wgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkOworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfSUZEX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmNlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvVGlmZldyaXRhYmxlLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorI2RlZmluZSBJTUdfVVRJTFNfVElGRl9XUklUQUJMRQorCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKKy8qKgorICogVGlmZldyaXRhYmxlIHN1YmNsYXNzZXMgcmVwcmVzZW50IFRJRkYgbWV0YWRhdGEgb2JqZWN0cyB0aGF0IGNhbiBiZSB3cml0dGVuCisgKiB0byBhbiBFbmRpYW5PdXRwdXQgb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBUSUZGIGVudHJpZXMgYW5kIElGRHMuCisgKi8KK2NsYXNzIEFORFJPSURfQVBJIFRpZmZXcml0YWJsZSA6IHB1YmxpYyBPcmRlcmFibGUsIHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRhYmxlPiB7CisgICAgcHVibGljOgorICAgICAgICBUaWZmV3JpdGFibGUoKTsKKyAgICAgICAgdmlydHVhbCB+VGlmZldyaXRhYmxlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQuIFRoZSBnaXZlbiBvZmZzZXQgaXMgdXNlZCB0byBjYWxjdWxhdGUKKyAgICAgICAgICogdGhlIGhlYWRlciBvZmZzZXQgZm9yIHZhbHVlcyB3cml0dGVuLiAgVGhlIG9mZnNldCBpcyBkZWZpbmVkCisgICAgICAgICAqIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFRJRkYgaGVhZGVyLCBhbmQgaXMgd29yZCBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0ID0gMDsKKworfTsKKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEFCTEUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL1RpZmZXcml0ZXIuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9UaWZmV3JpdGVyLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKyNkZWZpbmUgSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gKKworI2luY2x1ZGUgPGltZ191dGlscy9FbmRpYW5VdGlscy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9TdHJpcFNvdXJjZS5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmRW50cnlJbXBsLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitjbGFzcyBUaWZmRW50cnk7CitjbGFzcyBUaWZmSWZkOworY2xhc3MgT3V0cHV0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIFRJRkYgSUZEcyB0aGF0IGNhbiBiZSB3cml0dGVuIGFzIGEKKyAqIGNvbXBsZXRlIERORyBmaWxlIGhlYWRlci4KKyAqCisgKiBUaGlzIG1hcHMgdG8gdGhlIFRJRkYgaGVhZGVyIHN0cnVjdHVyZSB0aGF0IGlzIGxvZ2ljYWxseSBjb21wb3NlZCBvZjoKKyAqIC0gQW4gOC1ieXRlIGZpbGUgaGVhZGVyIGNvbnRhaW5pbmcgYW4gZW5kaWFubmVzcyBpbmRpY2F0b3IsIHRoZSBUSUZGCisgKiAgIGZpbGUgbWFya2VyLCBhbmQgdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgSUZELgorICogLSBBIGxpc3Qgb2YgVElGRiBJRkQgc3RydWN0dXJlcy4KKyAqLworY2xhc3MgQU5EUk9JRF9BUEkgVGlmZldyaXRlciA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VGlmZldyaXRlcj4geworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBTdWJJZmRUeXBlIHsKKyAgICAgICAgICAgIFNVQklGRCA9IDAsCisgICAgICAgICAgICBHUFNJTkZPCisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBUaWZmV3JpdGVyIHdpdGggdGhlIGRlZmF1bHQgdGFnIG1hcHBpbmdzLiBUaGlzIGVuYWJsZXMKKyAgICAgICAgICogYWxsIG9mIHRoZSB0YWdzIGRlZmluZWQgaW4gVGFnRGVmaW5pdGlvbnMuaCwgYW5kIHVzZXMgdGhlIGZvbGxvd2luZworICAgICAgICAgKiBtYXBwaW5nIHByZWNlZGVuY2UgdG8gcmVzb2x2ZSBjb2xsaXNpb25zOgorICAgICAgICAgKiAoaGlnaGVzdCBwcmVjZWRlbmNlKSBUSUZGL0VQID4gRE5HID4gRVhJRiAyLjMgPiBUSUZGIDYuMAorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgVGlmZldyaXRlciB3aXRoIHRoZSBnaXZlbiB0YWcgbWFwcGluZ3MuICBUaGUgbWFwcGluZworICAgICAgICAgKiBwcmVjZWRlbmNlIHdpbGwgYmUgaW4gdGhlIG9yZGVyIHRoYXQgdGhlIGRlZmluaXRpb24gbWFwcyBhcmUgZ2l2ZW4sCisgICAgICAgICAqIHdoZXJlIHRoZSBsb3dlciBpbmRleCBtYXAgZ2V0cyBwcmVjZWRlbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHdpdGggdXNlci1kZWZpbmVkIGRlZmluaXRpb25zLCBvciBkZWZpbml0aW9ucyBmb3JtCisgICAgICAgICAqIFRhZ0RlZmluaXRpb25zLmgKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGVuYWJsZWREZWZpbml0aW9ucyBtYXBwaW5nIG9iamVjdCBpcyBvd25lZCBieSB0aGUgY2FsbGVyLCBhbmQgbXVzdAorICAgICAgICAgKiBzdGF5IGFsaXZlIGZvciB0aGUgbGlmZXNwYW4gb2YgdGhlIGNvbnN0cnVjdGVkIFRpZmZXcml0ZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgVGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworICAgICAgICB2aXJ0dWFsIH5UaWZmV3JpdGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdyaXRlIGEgVElGRiBoZWFkZXIgY29udGFpbmluZyBlYWNoIElGRCBzZXQuICBUaGlzIHdpbGwgcmVjdXJzaXZlbHkKKyAgICAgICAgICogd3JpdGUgYWxsIFN1YklGRHMgYW5kIHRhZ3MuCisgICAgICAgICAqCisgICAgICAgICAqIEFueSBTdHJpcFNvdXJjZXMgcGFzc2VkIGluIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGFzIGltYWdlIHN0cmlwcworICAgICAgICAgKiBhdCB0aGUgYXBwcm9wcmlhdGUgb2ZmZXN0cy4gIFRoZSBTdHJpcEJ5dGVDb3VudHMsIFJvd3NQZXJTdHJpcCwgYW5kCisgICAgICAgICAqIFN0cmlwT2Zmc2V0cyB0YWdzIG11c3QgYmUgc2V0IHRvIHVzZSB0aGlzLiAgVG8gc2V0IHRoZXNlIHRhZ3MgaW4gYQorICAgICAgICAgKiBnaXZlbiBJRkQsIHVzZSB0aGUgYWRkU3RyaXAgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgU3RyaXBTb3VyY2UqKiBzb3VyY2VzLCBzaXplX3Qgc291cmNlc0NvdW50LAorICAgICAgICAgICAgICAgIEVuZGlhbm5lc3MgZW5kID0gTElUVExFKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgYSBUSUZGIGhlYWRlciBjb250YWluaW5nIGVhY2ggSUZEIHNldC4gIFRoaXMgd2lsbCByZWN1cnNpdmVseQorICAgICAgICAgKiB3cml0ZSBhbGwgU3ViSUZEcyBhbmQgdGFncy4KKyAgICAgICAgICoKKyAgICAgICAgICogSW1hZ2UgZGF0YSBmb3Igc3RyaXBzIG9yIHRpbGVzIG11c3QgYmUgd3JpdHRlbiBzZXBhcmF0ZWx5IGF0IHRoZQorICAgICAgICAgKiBhcHByb3ByaWF0ZSBvZmZzZXRzLiAgVGhlc2Ugb2Zmc2V0cyBtdXN0IG5vdCBmYWxsIHdpdGhpbiB0aGUgZmlsZQorICAgICAgICAgKiBoZWFkZXIgd3JpdHRlbiB0aGlzIHdheS4gIFRoZSBzaXplIG9mIHRoZSBoZWFkZXIgd3JpdHRlbiBpcyBnaXZlbgorICAgICAgICAgKiBieSB0aGUgZ2V0VG90YWxTaXplKCkgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQgPSBMSVRUTEUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIFRJRkYgaGVhZGVyLiAgVGhpcyBpbmNsdWRlcyBhbGwKKyAgICAgICAgICogSUZEcywgdGFncywgYW5kIHZhbHVlcyBzZXQgZm9yIHRoaXMgVGlmZldyaXRlci4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0VG90YWxTaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBlbnRyeSB0byB0aGUgSUZEIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKiAtIE5BTUVfTk9UX0ZPVU5EIC0gTm8gaWZkIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnksIHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5IGZvciBhIGtub3duIHRhZyBhbmQgYWRkIGl0IHRvIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqIFRoaXMgdGFnIG11c3QgYmUgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGRlZmluaXRpb24gdmVjdG9ycyB0aGlzIFRJRkYgd3JpdGVyCisgICAgICAgICAqIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiBUaGUgY291bnQgYW5kIHR5cGUgYXJlIHZhbGlkYXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gVmFsaWQKKyAgICAgICAgICogZXJyb3IgY29kZXMgZm9yIHRoaXMgbWV0aG9kIGFyZToKKyAgICAgICAgICogLSBCQURfSU5ERVggLSBUaGUgZ2l2ZW4gdGFnIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAqIC0gQkFEX1ZBTFVFIC0gVGhlIGdpdmVuIGNvdW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvdW50IGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoaXMgdGFnLgorICAgICAgICAgKiAtIEJBRF9UWVBFICAtIFRoZSB0eXBlIG9mIHRoZSBnaXZlbiBkYXRhIGlzbid0IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICB0eXBlIHJlcXVpcmVkIGZvciB0aGlzIHRhZy4KKyAgICAgICAgICogLSBOQU1FX05PVF9GT1VORCAtIE5vIGlmZCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gSUQuCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0dXNfdCBhZGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLCB1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhbiBlbnRyeSBmb3IgYSBrbm93biB0YWcuICBUaGlzIHRhZyBtdXN0IGJlIG9uZSBvZiB0aGUgdGFncworICAgICAgICAgKiBkZWZpbmVkIGluIG9uZSBvZiB0aGUgZGVmaW5pdGlvbiB2ZWN0b3JzIHRoaXMgVElGRiB3cml0ZXIgd2FzIGNvbnN0cnVjdGVkCisgICAgICAgICAqIHdpdGguIFRoZSBjb3VudCBhbmQgdHlwZSBhcmUgdmFsaWRhdGVkLiBJZiB0aGlzIHN1Y2NlZWRzLCB0aGUgcmVzdWx0aW5nCisgICAgICAgICAqIGVudHJ5IHdpbGwgYmUgcGxhY2VkIGluIHRoZSBvdXRFbnRyeSBwb2ludGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBWYWxpZAorICAgICAgICAgKiBlcnJvciBjb2RlcyBmb3IgdGhpcyBtZXRob2QgYXJlOgorICAgICAgICAgKiAtIEJBRF9JTkRFWCAtIFRoZSBnaXZlbiB0YWcgZG9lc24ndCBleGlzdC4KKyAgICAgICAgICogLSBCQURfVkFMVUUgLSBUaGUgZ2l2ZW4gY291bnQgZG9lc24ndCBtYXRjaCB0aGUgcmVxdWlyZWQgY291bnQgZm9yCisgICAgICAgICAqICAgICAgICAgICAgICAgdGhpcyB0YWcuCisgICAgICAgICAqIC0gQkFEX1RZUEUgIC0gVGhlIHR5cGUgb2YgdGhlIGdpdmVuIGRhdGEgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICAgKiAgICAgICAgICAgICAgIHR5cGUgcmVxdWlyZWQgZm9yIHRoaXMgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdHVzX3QgYnVpbGRFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBUKiBkYXRhLAorICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPFRpZmZFbnRyeT4qIG91dEVudHJ5KSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2V0IHRoZSBzdHJpcCByZWxhdGVkIHRhZ3MgZm9yIGEgZ2l2ZW4gSUZELgorICAgICAgICAgKgorICAgICAgICAgKiBDYWxsIHRoaXMgYmVmb3JlIHVzaW5nIGEgU3RyaXBTb3VyY2UgYXMgYW4gaW5wdXQgdG8gd3JpdGUuCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgdGFncyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZDoKKyAgICAgICAgICogLSBJbWFnZVdpZHRoCisgICAgICAgICAqIC0gSW1hZ2VMZW5ndGgKKyAgICAgICAgICogLSBTYW1wbGVzUGVyUGl4ZWwKKyAgICAgICAgICogLSBCaXRzUGVyU2FtcGxlCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJpcCh1aW50MzJfdCBpZmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQsCisgICAgICAgICAqIG9yIGFuIGVtcHR5IHBvaW50ZXIgaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNwPFRpZmZFbnRyeT4gZ2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmUgdGhlIFRJRkYgZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdGFnIElEIGluIHRoZSBnaXZlbiBJRkQgaWYgaXQgZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbW92ZUVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgaWZkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IElGRCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAqIGxpc3Qgb2YgSUZEcy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSWZkKHVpbnQzMl90IGlmZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBlbXB0eSBJRkQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGFkZCBpdCBhcyBhIFN1YklmZCBvZiB0aGUKKyAgICAgICAgICogcGFyZW50IElGRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3ViSWZkKHVpbnQzMl90IHBhcmVudElmZCwgdWludDMyX3QgaWZkLCBTdWJJZmRUeXBlIHR5cGUgPSBTVUJJRkQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHRoZSBnaXZlbiB0YWcgSUQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIFRhZ1R5cGUgZ2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBjb3VudCBmb3IgYSBnaXZlbiB0YWcgSUQsIG9yIDAgaWYgdGhpcworICAgICAgICAgKiB0YWcgbm9ybWFsbHkgaGFzIGEgdmFyaWFibGUgY291bnQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERlZmF1bHRDb3VudCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gSUZEIHdpdGggdGhlIGdpdmVuIElEIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNJZmQodWludDMyX3QgaWZkKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGEgZGVmaW5pdGlvbiBleGlzdCBmb3IgdGhlIGdpdmVuIHRhZyBJRC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgYm9vbCBjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YWcgaWYgYSBkZWZpbml0aW9uIGV4aXN0cyBmb3IgdGhlIGdpdmVuIHRhZworICAgICAgICAgKiBJRCwgb3IgbnVsbCBpZiBubyBkZWZpbml0aW9uIGV4aXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VGFnTmFtZSh1aW50MTZfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcmludCB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgSUZEcyBhbmQgZW50cmllcyB0byBsb2djYXQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGVudHJ5LiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lLgorICAgICAgICAgKgorICAgICAgICAgKiBXQVJOSU5HOiBVc2luZyB0aGlzIG1ldGhvZCBjYW4gcmVzdWx0IGluIGNyZWF0aW5nIHBvb3JseSBmb3JtYXR0ZWQKKyAgICAgICAgICogVElGRiBmaWxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBhIFRpZmZFbnRyeSB3aXRoIHRoZSBnaXZlbiB0YWcsIHR5cGUsIGNvdW50LCBlbmRpYW5uZXNzLAorICAgICAgICAgKiBhbmQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzcDxUaWZmRW50cnk+IHVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgRW5kaWFubmVzcyBlbmQsIGNvbnN0IFQqIGRhdGEpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGJ1aWxkIGF0YWctdG8tZGVmaW5pdGlvbiBtYXBwaW5nIGZyb20gYSBnaXZlbgorICAgICAgICAgKiBhcnJheSBvZiB0YWcgZGVmaW5pdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+IGJ1aWxkVGFnTWFwKAorICAgICAgICAgICAgICAgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9ucywgc2l6ZV90IGxlbmd0aCk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgREVGQVVMVF9OVU1fVEFHX01BUFMgPSA0LAorICAgICAgICB9OworCisgICAgICAgIHNwPFRpZmZJZmQ+IGZpbmRMYXN0SWZkKCk7CisgICAgICAgIHN0YXR1c190IHdyaXRlRmlsZUhlYWRlcihFbmRpYW5PdXRwdXQmIG91dCk7CisgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogbG9va3VwRGVmaW5pdGlvbih1aW50MTZfdCB0YWcpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBjYWxjdWxhdGVPZmZzZXRzKCk7CisKKyAgICAgICAgc3A8VGlmZklmZD4gbUlmZDsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPFRpZmZJZmQ+ID4gbU5hbWVkSWZkczsKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDE2X3QsIGNvbnN0IFRhZ0RlZmluaXRpb25fdCo+KiBtVGFnTWFwczsKKyAgICAgICAgc2l6ZV90IG1OdW1UYWdNYXBzOworCisgICAgICAgIHN0YXRpYyBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gc1RhZ01hcHNbXTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0dXNfdCBUaWZmV3JpdGVyOjpidWlsZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAvKm91dCovc3A8VGlmZkVudHJ5Piogb3V0RW50cnkpIGNvbnN0IHsKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gc3VjaCB0YWcgZXhpc3RzIGZvciBpZCAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgdWludDMyX3QgZml4ZWRDb3VudCA9IGRlZmluaXRpb24tPmZpeGVkQ291bnQ7CisgICAgaWYgKGZpeGVkQ291bnQgPiAwICYmIGZpeGVkQ291bnQgIT0gY291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvdW50ICVkIGZvciB0YWcgJXggKGV4cGVjdHMgJWQpLiIsIF9fRlVOQ1RJT05fXywgY291bnQsIHRhZywKKyAgICAgICAgICAgICAgICBmaXhlZENvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBUYWdUeXBlIGZpeGVkVHlwZSA9IGRlZmluaXRpb24tPmRlZmF1bHRUeXBlOworICAgIGlmIChUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlKGZpeGVkVHlwZSwgZGF0YSkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgdHlwZSB1c2VkIGZvciB0YWcgdmFsdWUgZm9yIHRhZyAleC4iLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICAqb3V0RW50cnkgPSBuZXcgVGlmZkVudHJ5SW1wbDxUPih0YWcsIGZpeGVkVHlwZSwgY291bnQsCisgICAgICAgIGRlZmluaXRpb24tPmZpeGVkRW5kaWFuLCBkYXRhKTsKKworICAgIHJldHVybiBPSzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KHVpbnQxNl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IFQqIGRhdGEsIHVpbnQzMl90IGlmZCkgeworICAgIHNwPFRpZmZFbnRyeT4gb3V0RW50cnk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBidWlsZEVudHJ5PFQ+KHRhZywgY291bnQsIGRhdGEsICZvdXRFbnRyeSk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBidWlsZCBlbnRyeSBmb3IgdGFnICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gYWRkRW50cnkob3V0RW50cnksIGlmZCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzcDxUaWZmRW50cnk+IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkodWludDE2X3QgdGFnLCBUYWdUeXBlIHR5cGUsIHVpbnQzMl90IGNvdW50LAorICAgICAgICBFbmRpYW5uZXNzIGVuZCwgY29uc3QgVCogZGF0YSkgeworICAgIFRpZmZFbnRyeUltcGw8VD4qIGVudHJ5ID0gbmV3IFRpZmZFbnRyeUltcGw8VD4odGFnLCB0eXBlLCBjb3VudCwgZW5kLCBkYXRhKTsKKyAgICByZXR1cm4gc3A8VGlmZkVudHJ5PihlbnRyeSk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCisKKworI2VuZGlmIC8qSU1HX1VUSUxTX1RJRkZfV1JJVEVSX0gqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBFbmRpYW5VdGlscy5jcHAgXAorICBGaWxlSW5wdXQuY3BwIFwKKyAgRmlsZU91dHB1dC5jcHAgXAorICBTb3J0ZWRFbnRyeVZlY3Rvci5jcHAgXAorICBJbnB1dC5jcHAgXAorICBPdXRwdXQuY3BwIFwKKyAgT3JkZXJhYmxlLmNwcCBcCisgIFRpZmZJZmQuY3BwIFwKKyAgVGlmZldyaXRhYmxlLmNwcCBcCisgIFRpZmZXcml0ZXIuY3BwIFwKKyAgVGlmZkVudHJ5LmNwcCBcCisgIFRpZmZFbnRyeUltcGwuY3BwIFwKKyAgQnl0ZUFycmF5T3V0cHV0LmNwcCBcCisgIERuZ1V0aWxzLmNwcCBcCisgIFN0cmlwU291cmNlLmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJleHBhdCBcCisgIGxpYnV0aWxzIFwKKyAgbGliY3V0aWxzIFwKKyAgbGliY2FtZXJhX21ldGFkYXRhIFwKKyAgbGliY2FtZXJhX2NsaWVudAorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlIFwKKyAgc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgIC1XYWxsIFwKKyAgLVdleHRyYSBcCisgIC1XZXJyb3IgXAorICAtZnZpc2liaWxpdHk9aGlkZGVuCisKK2lmbmVxICgkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSwpCisgICAgIyBFbmFibGUgYXNzZXJ0KCkgaW4gZW5nIGJ1aWxkcworICAgIExPQ0FMX0NGTEFHUyArPSAtVU5ERUJVRyAtRExPR19OREVCVUc9MQorZW5kaWYKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGliaW1nX3V0aWxzCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvQnl0ZUFycmF5T3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJkMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9CeXRlQXJyYXlPdXRwdXQuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbWdfdXRpbHMvQnl0ZUFycmF5T3V0cHV0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0J5dGVBcnJheU91dHB1dDo6Qnl0ZUFycmF5T3V0cHV0KCkge30KKworQnl0ZUFycmF5T3V0cHV0Ojp+Qnl0ZUFycmF5T3V0cHV0KCkge30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0OjpvcGVuKCkgeworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQnl0ZUFycmF5T3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIGlmIChtQnl0ZUFycmF5LmFwcGVuZEFycmF5KGJ1ZiArIG9mZnNldCwgY291bnQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSB0byBCeXRlQXJyYXlPdXRwdXQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCeXRlQXJyYXlPdXRwdXQ6OmNsb3NlKCkgeworICAgIG1CeXRlQXJyYXkuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBCeXRlQXJyYXlPdXRwdXQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CeXRlQXJyYXkuc2l6ZSgpOworfQorCitjb25zdCB1aW50OF90KiBCeXRlQXJyYXlPdXRwdXQ6OmdldEFycmF5KCkgY29uc3QgeworICAgIHJldHVybiBtQnl0ZUFycmF5LmFycmF5KCk7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjRhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9EbmdVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworT3Bjb2RlTGlzdEJ1aWxkZXI6Ok9wY29kZUxpc3RCdWlsZGVyKCkgOiBtQ291bnQoMCksIG1PcExpc3QoKSwgbUVuZGlhbk91dCgmbU9wTGlzdCwgQklHKSB7CisgICAgaWYobUVuZGlhbk91dC5vcGVuKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBPcGVuIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworT3Bjb2RlTGlzdEJ1aWxkZXI6On5PcGNvZGVMaXN0QnVpbGRlcigpIHsKKyAgICBpZihtRW5kaWFuT3V0LmNsb3NlKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDbG9zZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKK3NpemVfdCBPcGNvZGVMaXN0QnVpbGRlcjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9wTGlzdC5nZXRTaXplKCkgKyBzaXplb2YobUNvdW50KTsKK30KKwordWludDMyX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmdldENvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtQ291bnQ7Cit9CisKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjpidWlsZE9wTGlzdCh1aW50OF90KiBidWYpIGNvbnN0IHsKKyAgICB1aW50MzJfdCBjb3VudCA9IGNvbnZlcnRUb0JpZ0VuZGlhbihtQ291bnQpOworICAgIG1lbWNweShidWYsICZjb3VudCwgc2l6ZW9mKGNvdW50KSk7CisgICAgbWVtY3B5KGJ1ZiArIHNpemVvZihjb3VudCksIG1PcExpc3QuZ2V0QXJyYXkoKSwgbU9wTGlzdC5nZXRTaXplKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgeworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCA9IGFjdGl2ZUFyZWFSaWdodCAtIGFjdGl2ZUFyZWFMZWZ0OworICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQgPSBhY3RpdmVBcmVhQm90dG9tIC0gYWN0aXZlQXJlYVRvcDsKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBsc21IZWlnaHQ7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gbHNtV2lkdGg7CisKKyAgICBmbG9hdCByZWRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGdyZWVuRXZlbk1hcFtsc21XaWR0aCAqIGxzbUhlaWdodF07CisgICAgZmxvYXQgZ3JlZW5PZGRNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworICAgIGZsb2F0IGJsdWVNYXBbbHNtV2lkdGggKiBsc21IZWlnaHRdOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07CisgICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKKyAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07CisgICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICB9CisKKyAgICB1aW50MzJfdCByZWRUb3AgPSAwOworICAgIHVpbnQzMl90IHJlZExlZnQgPSAwOworICAgIHVpbnQzMl90IGdyZWVuRXZlblRvcCA9IDA7CisgICAgdWludDMyX3QgZ3JlZW5FdmVuTGVmdCA9IDE7CisgICAgdWludDMyX3QgZ3JlZW5PZGRUb3AgPSAxOworICAgIHVpbnQzMl90IGdyZWVuT2RkTGVmdCA9IDA7CisgICAgdWludDMyX3QgYmx1ZVRvcCA9IDE7CisgICAgdWludDMyX3QgYmx1ZUxlZnQgPSAxOworCisgICAgc3dpdGNoKGNmYSkgeworICAgICAgICBjYXNlIENGQV9SR0dCOgorICAgICAgICAgICAgcmVkVG9wID0gMDsKKyAgICAgICAgICAgIHJlZExlZnQgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAxOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgICAgICByZWRUb3AgPSAwOworICAgICAgICAgICAgcmVkTGVmdCA9IDE7CisgICAgICAgICAgICBncmVlbkV2ZW5Ub3AgPSAwOworICAgICAgICAgICAgZ3JlZW5FdmVuTGVmdCA9IDA7CisgICAgICAgICAgICBncmVlbk9kZFRvcCA9IDE7CisgICAgICAgICAgICBncmVlbk9kZExlZnQgPSAxOworICAgICAgICAgICAgYmx1ZVRvcCA9IDE7CisgICAgICAgICAgICBibHVlTGVmdCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfR0JSRzoKKyAgICAgICAgICAgIHJlZFRvcCA9IDE7CisgICAgICAgICAgICByZWRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlblRvcCA9IDA7CisgICAgICAgICAgICBncmVlbkV2ZW5MZWZ0ID0gMDsKKyAgICAgICAgICAgIGdyZWVuT2RkVG9wID0gMTsKKyAgICAgICAgICAgIGdyZWVuT2RkTGVmdCA9IDE7CisgICAgICAgICAgICBibHVlVG9wID0gMDsKKyAgICAgICAgICAgIGJsdWVMZWZ0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9CR0dSOgorICAgICAgICAgICAgcmVkVG9wID0gMTsKKyAgICAgICAgICAgIHJlZExlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5FdmVuVG9wID0gMDsKKyAgICAgICAgICAgIGdyZWVuRXZlbkxlZnQgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRUb3AgPSAxOworICAgICAgICAgICAgZ3JlZW5PZGRMZWZ0ID0gMDsKKyAgICAgICAgICAgIGJsdWVUb3AgPSAwOworICAgICAgICAgICAgYmx1ZUxlZnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gQ0ZBIGxheW91dCAlZCIsIF9fRlVOQ1RJT05fXywgY2ZhKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovcmVkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5FdmVuVG9wLAorICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbkV2ZW5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovZ3JlZW5FdmVuTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5PZGRUb3AsCisgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuT2RkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLAorICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL2dyZWVuT2RkTWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovYmx1ZVRvcCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovYmx1ZUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKKyAgICAgICAgICAgICAgICAgICAgIC8qY29sUGl0Y2gqLzIsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c1YqL2xzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzSCovbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdWKi9zcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ0gqL3NwYWNpbmdILAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5WKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBPcmlnaW5IKi8wLAorICAgICAgICAgICAgICAgICAgICAgLyptYXBQbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAvKm1hcEdhaW5zKi9ibHVlTWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkR2Fpbk1hcCh1aW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQb2ludHNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUG9pbnRzSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBTcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXBPcmlnaW5WLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hcE9yaWdpbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXBQbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFwR2FpbnMpIHsKKworICAgIHVpbnQzMl90IG9wY29kZUlkID0gR0FJTl9NQVBfSUQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZvcGNvZGVJZCwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHVpbnQ4X3QgdmVyc2lvbltdID0gezEsIDMsIDAsIDB9OworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUodmVyc2lvbiwgMCwgTkVMRU1TKHZlcnNpb24pKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgLy8gRG8gbm90IGluY2x1ZGUgb3B0aW9uYWwgZmxhZyBmb3IgcHJldmlldywgYXMgdGhpcyBjYW4gaGF2ZSBhIGxhcmdlIGVmZmVjdCBvbiB0aGUgb3V0cHV0LgorICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19PUFRJT05BTDsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJmZsYWdzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0lOVF9BUkdTID0gMTE7CisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0RPVUJMRV9BUkdTID0gNDsKKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IE5VTUJFUl9JTlRfQVJHUyAqIHNpemVvZih1aW50MzJfdCkgKyBOVU1CRVJfRE9VQkxFX0FSR1MgKiBzaXplb2YoZG91YmxlKSArCisgICAgICAgICAgICBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyAqIHNpemVvZihmbG9hdCk7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZ0b3RhbFNpemUsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICAvLyBCYXRjaCB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgIHVpbnQzMl90IHNldHRpbmdzMVtdID0geyB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFBvaW50c1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwUG9pbnRzSCB9OworCisgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZShzZXR0aW5nczEsIDAsIE5FTEVNUyhzZXR0aW5nczEpKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZG91YmxlIHNldHRpbmdzMltdID0geyBtYXBTcGFjaW5nViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpblYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcE9yaWdpbkggfTsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoc2V0dGluZ3MyLCAwLCBORUxFTVMoc2V0dGluZ3MyKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm1hcFBsYW5lcywgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUobWFwR2FpbnMsIDAsIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgbUNvdW50Kys7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRW5kaWFuVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODFjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0VuZGlhblV0aWxzLmNwcApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0VuZGlhblV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitFbmRpYW5PdXRwdXQ6OkVuZGlhbk91dHB1dChPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpCisgICAgICAgIDogbU9mZnNldCgwKSwgbU91dHB1dChvdXQpLCBtRW5kaWFuKGVuZCkge30KKworRW5kaWFuT3V0cHV0Ojp+RW5kaWFuT3V0cHV0KCkge30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0OjpvcGVuKCkgeworICAgIG1PZmZzZXQgPSAwOworICAgIHJldHVybiBtT3V0cHV0LT5vcGVuKCk7Cit9CisKK3N0YXR1c190IEVuZGlhbk91dHB1dDo6Y2xvc2UoKSB7CisgICAgcmV0dXJuIG1PdXRwdXQtPmNsb3NlKCk7Cit9CisKK3ZvaWQgRW5kaWFuT3V0cHV0OjpzZXRFbmRpYW5uZXNzKEVuZGlhbm5lc3MgZW5kKSB7CisgICAgbUVuZGlhbiA9IGVuZDsKK30KKwordWludDMyX3QgRW5kaWFuT3V0cHV0OjpnZXRDdXJyZW50T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtT2Zmc2V0OworfQorCitFbmRpYW5uZXNzIEVuZGlhbk91dHB1dDo6Z2V0RW5kaWFubmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVuZGlhbjsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmKChyZXMgPSBtT3V0cHV0LT53cml0ZShidWYsIG9mZnNldCwgY291bnQpKSA9PSBPSykgeworICAgICAgICBtT2Zmc2V0ICs9IGNvdW50OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBFbmRpYW5PdXRwdXQ6OndyaXRlKGNvbnN0IGludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICByZXR1cm4gd3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmKSwgb2Zmc2V0LCBjb3VudCk7Cit9CisKKyNkZWZpbmUgREVGSU5FX1dSSVRFKF90eXBlXykgXAorc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBfdHlwZV8qIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7IFwKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8X3R5cGVfPihidWYsIG9mZnNldCwgY291bnQpOyBcCit9CisKK0RFRklORV9XUklURSh1aW50MTZfdCkKK0RFRklORV9XUklURShpbnQxNl90KQorREVGSU5FX1dSSVRFKHVpbnQzMl90KQorREVGSU5FX1dSSVRFKGludDMyX3QpCitERUZJTkVfV1JJVEUodWludDY0X3QpCitERUZJTkVfV1JJVEUoaW50NjRfdCkKKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBmbG9hdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBhc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodWludDMyX3QpKTsKKyAgICByZXR1cm4gd3JpdGVIZWxwZXI8dWludDMyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihidWYpLCBvZmZzZXQsIGNvdW50KTsKK30KKworc3RhdHVzX3QgRW5kaWFuT3V0cHV0Ojp3cml0ZShjb25zdCBkb3VibGUqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOworICAgIHJldHVybiB3cml0ZUhlbHBlcjx1aW50NjRfdD4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KGJ1ZiksIG9mZnNldCwgY291bnQpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGU3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVJbnB1dC5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGltZ191dGlscy9GaWxlSW5wdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZUlucHV0OjpGaWxlSW5wdXQoU3RyaW5nOCBwYXRoKSA6IG1GcChOVUxMKSwgbVBhdGgocGF0aCksIG1PcGVuKGZhbHNlKSB7fQorCitGaWxlSW5wdXQ6On5GaWxlSW5wdXQoKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogRmlsZUlucHV0IGRlc3Ryb3llZCB3aXRob3V0IGNhbGxpbmcgY2xvc2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKK30KKworc3RhdHVzX3QgRmlsZUlucHV0OjpvcGVuKCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IE9wZW4gY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbUZwID0gOjpmb3BlbihtUGF0aCwgInJiIik7CisgICAgaWYgKCFtRnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1PcGVuID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgRmlsZUlucHV0OjpyZWFkKHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGNvdW50KSB7CisgICAgaWYgKCFtT3BlbikgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCByZWFkIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IGJ5dGVzUmVhZCA9IDo6ZnJlYWQoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworICAgIGludCBlcnJvciA9IDo6ZmVycm9yKG1GcCk7CisgICAgaWYgKGVycm9yICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciAlZCBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBlcnJvciwgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEVuZCBvZiBmaWxlIHJlYWNoZWQKKyAgICBpZiAoOjpmZW9mKG1GcCkgIT0gMCAmJiBieXRlc1JlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIHJldHVybiBieXRlc1JlYWQ7Cit9CisKK3N0YXR1c190IEZpbGVJbnB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0ZpbGVPdXRwdXQuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc2M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9GaWxlT3V0cHV0LmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0ZpbGVPdXRwdXQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworRmlsZU91dHB1dDo6RmlsZU91dHB1dChTdHJpbmc4IHBhdGgpIDogbUZwKE5VTEwpLCBtUGF0aChwYXRoKSwgbU9wZW4oZmFsc2UpIHt9CisKK0ZpbGVPdXRwdXQ6On5GaWxlT3V0cHV0KCkgeworICAgIGlmIChtT3BlbikgeworICAgICAgICBBTE9HVygiJXM6IERlc3RydWN0b3IgY2FsbGVkIHdpdGggJXMgc3RpbGwgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEZpbGVPdXRwdXQ6Om9wZW4oKSB7CisgICAgaWYgKG1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogT3BlbiBjYWxsZWQgd2hlbiBmaWxlICVzIGFscmVhZHkgb3Blbi4iLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtRnAgPSA6OmZvcGVuKG1QYXRoLCAid2IiKTsKKyAgICBpZiAoIW1GcCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sIG1QYXRoLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpIHsKKyAgICBpZiAoIW1PcGVuKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHdyaXRlIGZpbGUgJXMsIGZpbGUgbm90IG9wZW4uIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgOjpmd3JpdGUoYnVmICsgb2Zmc2V0LCBzaXplb2YodWludDhfdCksIGNvdW50LCBtRnApOworCisgICAgaW50IGVycm9yID0gOjpmZXJyb3IobUZwKTsKKyAgICBpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVkIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgZmlsZSAlcy4iLCBfX0ZVTkNUSU9OX18sIGVycm9yLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRmlsZU91dHB1dDo6Y2xvc2UoKSB7CisgICAgaWYoIW1PcGVuKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2xvc2UgY2FsbGVkIHdoZW4gZmlsZSAlcyBhbHJlYWR5IGNsb3NlLiIsIF9fRlVOQ1RJT05fXywgbVBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgaWYoOjpmY2xvc2UobUZwKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNsb3NlIGZpbGUgJXMuIiwgX19GVU5DVElPTl9fLCBtUGF0aC5zdHJpbmcoKSk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU9wZW4gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvSW5wdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0lucHV0LmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL0lucHV0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitJbnB1dDo6fklucHV0KCkge30KKworc3RhdHVzX3QgSW5wdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorCitzdGF0dXNfdCBJbnB1dDo6Y2xvc2UoKSB7IHJldHVybiBPSzsgfQorCitzc2l6ZV90IElucHV0Ojpza2lwKHNpemVfdCBjb3VudCkgeworICAgIGNvbnN0IHNpemVfdCBTS0lQX0JVRl9TSVpFID0gMTAyNDsKKyAgICB1aW50OF90IHNraXBCdWZbU0tJUF9CVUZfU0laRV07CisKKyAgICBzaXplX3QgcmVtYWluaW5nID0gY291bnQ7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgc2l6ZV90IGFtdCA9IChTS0lQX0JVRl9TSVpFID4gcmVtYWluaW5nKSA/IHJlbWFpbmluZyA6IFNLSVBfQlVGX1NJWkU7CisgICAgICAgIHNzaXplX3QgcmV0ID0gcmVhZChza2lwQnVmLCAwLCBhbXQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYocmV0ID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmaWxlIGVuY291bnRlcmVkCisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIG5vIGJ5dGVzLCByZXR1cm4gRU9GCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIG51bSBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCAtIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgY29kZS4KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmVtYWluaW5nIC09IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLworCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL09yZGVyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwZjEyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvT3JkZXJhYmxlLmNwcApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL09yZGVyYWJsZS5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworQ09NUEFSRSg+KQorQ09NUEFSRSg8KQorQ09NUEFSRSg+PSkKK0NPTVBBUkUoPD0pCitDT01QQVJFKD09KQorQ09NUEFSRSghPSkKKworT3JkZXJhYmxlOjp+T3JkZXJhYmxlKCkge30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvT3V0cHV0LmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjYlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL091dHB1dC5jcHAKaW5kZXggMTNjYWM2ZC4uMGUzOTViOQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9PdXRwdXQuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9PdXRwdXQuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK091dHB1dDo6fk91dHB1dCgpIHt9CitzdGF0dXNfdCBPdXRwdXQ6Om9wZW4oKSB7IHJldHVybiBPSzsgfQorc3RhdHVzX3QgT3V0cHV0OjpjbG9zZSgpIHsgcmV0dXJuIE9LOyB9CiAKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvU29ydGVkRW50cnlWZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZTFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1NvcnRlZEVudHJ5VmVjdG9yLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1NvcnRlZEVudHJ5VmVjdG9yLmg+CisKKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworU29ydGVkRW50cnlWZWN0b3I6On5Tb3J0ZWRFbnRyeVZlY3RvcigpIHt9CisKK3NzaXplX3QgU29ydGVkRW50cnlWZWN0b3I6OmluZGV4T2ZUYWcodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgLy8gVE9ETzogVXNlIGJpbmFyeSBzZWFyY2ggaGVyZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldFRhZygpID09IHRhZykgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgU29ydGVkRW50cnlWZWN0b3I6OmRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0IHsKKyAgICBjb25zdCBzcDxUaWZmRW50cnk+KiBsRW50cnkgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHNwPFRpZmZFbnRyeT4qPihsaHMpOworICAgIGNvbnN0IHNwPFRpZmZFbnRyeT4qIHJFbnRyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8VGlmZkVudHJ5Pio+KHJocyk7CisgICAgcmV0dXJuIGNvbXBhcmVfdHlwZSgqKmxFbnRyeSwgKipyRW50cnkpOworfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKaW5kZXggMTNjYWM2ZC4uNTdiNjA4MgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9TdHJpcFNvdXJjZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSA8aW1nX3V0aWxzL1N0cmlwU291cmNlLmg+CiAKLS8qIC0tLS0tIE1haW4gZmVhdHVyZXMgLS0tLS0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzX01DUy5oIiAvKiBUcmFuc2NvZGVyICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworU3RyaXBTb3VyY2U6On5TdHJpcFNvdXJjZSgpIHt9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQorfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnkuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZJZmQuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBpbWdfdXRpbHMgeworCitUaWZmRW50cnk6On5UaWZmRW50cnkoKSB7fQorCisvKioKKyAqIFNwZWNpYWxpemUgZm9yIGVhY2ggdmFsaWQgdHlwZSwgaW5jbHVkaW5nIHN1Yi1JRkRzLgorICoKKyAqIFZhbHVlcyB3aXRoIHR5cGVzIG90aGVyIHRoYW4gdGhlIG9uZXMgZ2l2ZW4gaGVyZSBzaG91bGQgbm90IGNvbXBpbGUuCisgKi8KKwordGVtcGxhdGU8PgorY29uc3Qgc3A8VGlmZklmZD4qIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8c3A8VGlmZklmZD4gPihUYWdUeXBlIHR5cGUsIGNvbnN0IHNwPFRpZmZJZmQ+KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2lmZCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQ4X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8dWludDhfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCB1aW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IEJZVEUgfHwgdHlwZSA9PSBBU0NJSSB8fCB0eXBlID09IFVOREVGSU5FRCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDhfdCogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxpbnQ4X3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50OF90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNCWVRFIHx8IHR5cGUgPT0gQVNDSUkgfHwgdHlwZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2ludDhfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQxNl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQxNl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNIT1JUKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgQUxPR0UoIiVzOiBWYWx1ZSBvZiB0eXBlICd1aW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGludDE2X3QqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8aW50MTZfdD4oVGFnVHlwZSB0eXBlLCBjb25zdCBpbnQxNl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFNTSE9SVCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MTZfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IHVpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPHVpbnQzMl90PihUYWdUeXBlIHR5cGUsIGNvbnN0IHVpbnQzMl90KiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IExPTkcgfHwgdHlwZSA9PSBSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAndWludDMyX3QnIGlzIG5vdCB2YWxpZCBmb3IgdGFnIHdpdGggVElGRiB0eXBlICVkLiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgIHJldHVybiBOVUxMOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBpbnQzMl90KiBUaWZmRW50cnk6OmZvcmNlVmFsaWRUeXBlPGludDMyX3Q+KFRhZ1R5cGUgdHlwZSwgY29uc3QgaW50MzJfdCogdmFsdWUpIHsKKyAgICBpZiAodHlwZSA9PSBTTE9ORyB8fCB0eXBlID09IFNSQVRJT05BTCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnaW50MzJfdCcgaXMgbm90IHZhbGlkIGZvciB0YWcgd2l0aCBUSUZGIHR5cGUgJWQuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3RlbXBsYXRlPD4KK2NvbnN0IGRvdWJsZSogVGlmZkVudHJ5Ojpmb3JjZVZhbGlkVHlwZTxkb3VibGU+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZG91YmxlKiB2YWx1ZSkgeworICAgIGlmICh0eXBlID09IERPVUJMRSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIEFMT0dFKCIlczogVmFsdWUgb2YgdHlwZSAnZG91YmxlJyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordGVtcGxhdGU8PgorY29uc3QgZmxvYXQqIFRpZmZFbnRyeTo6Zm9yY2VWYWxpZFR5cGU8ZmxvYXQ+KFRhZ1R5cGUgdHlwZSwgY29uc3QgZmxvYXQqIHZhbHVlKSB7CisgICAgaWYgKHR5cGUgPT0gRkxPQVQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBBTE9HRSgiJXM6IFZhbHVlIG9mIHR5cGUgJ2Zsb2F0JyBpcyBub3QgdmFsaWQgZm9yIHRhZyB3aXRoIFRJRkYgdHlwZSAlZC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0eXBlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworU3RyaW5nOCBUaWZmRW50cnk6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIFN0cmluZzggb3V0cHV0OworICAgIHVpbnQzMl90IGNvdW50ID0gZ2V0Q291bnQoKTsKKyAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCJbaWQ6ICV4LCB0eXBlOiAlZCwgY291bnQ6ICV1LCB2YWx1ZTogJyIsIGdldFRhZygpLCBnZXRUeXBlKCksIGNvdW50KTsKKworICAgIHNpemVfdCBjYXBwZWRDb3VudCA9IGNvdW50OworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIGNhcHBlZENvdW50ID0gTUFYX1BSSU5UX1NUUklOR19MRU5HVEg7CisgICAgfQorCisgICAgVGFnVHlwZSB0eXBlID0gZ2V0VHlwZSgpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFVOREVGSU5FRDoKKyAgICAgICAgY2FzZSBCWVRFOiB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50OF90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFTQ0lJOiB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlZF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZ2V0RGF0YTx1aW50OF90PigpKTsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBjb3VudDsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgIGxlbiA9IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCh0eXBlZF9kYXRhLCBsZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTSE9SVDogeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIExPTkc6IHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiV1ICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHR5cGVkX2RhdGEgPSBnZXREYXRhPHVpbnQzMl90PigpOworICAgICAgICAgICAgY2FwcGVkQ291bnQgPDw9IDE7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyBpKz0yKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJXUvJXUgIiwgdHlwZWRfZGF0YVtpXSwgdHlwZWRfZGF0YVtpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTQllURTogeworICAgICAgICAgICAgY29uc3QgaW50OF90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQ4X3Q+KCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHBlZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kRm9ybWF0KCIlZCAiLCB0eXBlZF9kYXRhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1NIT1JUOiB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQxNl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNMT05HOiB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxpbnQzMl90PigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWQgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNSQVRJT05BTDogeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCogdHlwZWRfZGF0YSA9IGdldERhdGE8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGNhcHBlZENvdW50IDw8PSAxOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgaSs9MikgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVkLyVkICIsIHR5cGVkX2RhdGFbaV0sIHR5cGVkX2RhdGFbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkxPQVQ6IHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB0eXBlZF9kYXRhID0gZ2V0RGF0YTxmbG9hdD4oKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FwcGVkQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIiVmICIsIHR5cGVkX2RhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBET1VCTEU6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdHlwZWRfZGF0YSA9IGdldERhdGE8ZG91YmxlPigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXBwZWRDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZEZvcm1hdCgiJWYgIiwgdHlwZWRfZGF0YVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJ1bmtub3duIHR5cGUgIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA+IE1BWF9QUklOVF9TVFJJTkdfTEVOR1RIKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIi4uLiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCInXSIpOworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK30gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KK30gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZFbnRyeUltcGwuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGxpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaApjb3B5IHRvIG1lZGlhL2ltZ191dGlscy9zcmMvVGlmZkVudHJ5SW1wbC5jcHAKaW5kZXggMTNjYWM2ZC4uMjU3YzI2NgotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmRW50cnlJbXBsLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTMgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkVudHJ5SW1wbC5oPgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAotI2VuZGlmIC8qIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSCAqLwotCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmSWZkLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiMDBjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZklmZC5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZklmZCIKKworI2luY2x1ZGUgPGltZ191dGlscy9UYWdEZWZpbml0aW9ucy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSWZkLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RpZmZXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKKworVGlmZklmZDo6VGlmZklmZCh1aW50MzJfdCBpZmRJZCkKKyAgICAgICAgOiBtTmV4dElmZCgpLCBtSWZkSWQoaWZkSWQpLCBtU3RyaXBPZmZzZXRzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKK1RpZmZJZmQ6On5UaWZmSWZkKCkge30KKworc3RhdHVzX3QgVGlmZklmZDo6YWRkRW50cnkoY29uc3Qgc3A8VGlmZkVudHJ5PiYgZW50cnkpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FbnRyaWVzLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA+PSBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBGYWlsZWQgdG8gYWRkIGVudHJ5IGZvciB0YWcgMHgleCB0byBJRkQgJXUsIHRvbyBtYW55IGVudHJpZXMgaW4gSUZEISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlbnRyeS0+Z2V0VGFnKCksIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKG1FbnRyaWVzLmFkZChlbnRyeSkgPCAwKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGFkZCBlbnRyeSBmb3IgdGFnIDB4JXggdG8gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgZW50cnktPmdldFRhZygpLAorICAgICAgICAgICAgICAgIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3A8VGlmZkVudHJ5PiBUaWZmSWZkOjpnZXRFbnRyeSh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyBlbnRyeSBmb3IgdGFnIDB4JXggaW4gaWZkICV1LiIsIF9fRlVOQ1RJT05fXywgdGFnLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1FbnRyaWVzW2luZGV4XTsKK30KKwordm9pZCBUaWZmSWZkOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVudHJpZXMuaW5kZXhPZlRhZyh0YWcpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIG1FbnRyaWVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICB9Cit9CisKKwordm9pZCBUaWZmSWZkOjpzZXROZXh0SWZkKGNvbnN0IHNwPFRpZmZJZmQ+JiBpZmQpIHsKKyAgICBtTmV4dElmZCA9IGlmZDsKK30KKworc3A8VGlmZklmZD4gVGlmZklmZDo6Z2V0TmV4dElmZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5leHRJZmQ7Cit9CisKK3VpbnQzMl90IFRpZmZJZmQ6OmNoZWNrQW5kR2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3QgeworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgaWYgKHNpemUgPiBNQVhfSUZEX0VOVFJJRVMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgY29udGFpbnMgdG9vIG1hbnkgZW50cmllcy4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9PRkZTRVQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBjYWxjdWxhdGUgSUZEIG9mZnNldHMsIElGRCAldSBjb250YWlucyBubyBlbnRyaWVzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IEJBRF9PRkZTRVQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgY2FsY3VsYXRlIElGRCBvZmZzZXRzLCBJRkQgJXUgaGFkIGEgYmFkIGluaXRpYWwgb2Zmc2V0LiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX09GRlNFVDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZmRTaXplID0gY2FsY3VsYXRlSWZkU2l6ZShzaXplKTsKKyAgICBXT1JEX0FMSUdOKGlmZFNpemUpOworICAgIHJldHVybiBvZmZzZXQgKyBpZmRTaXplOworfQorCitzdGF0dXNfdCBUaWZmSWZkOjp3cml0ZURhdGEodWludDMyX3Qgb2Zmc2V0LCAvKm91dCovRW5kaWFuT3V0cHV0KiBvdXQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKG9mZnNldCAlIFRJRkZfV09SRF9TSVpFKSA9PSAwKTsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKworICAgIEFMT0dWKCIlczogSUZEICV1IHdyaXR0ZW4gdG8gb2Zmc2V0ICV1IiwgX19GVU5DVElPTl9fLCBtSWZkSWQsIG9mZnNldCApOworICAgIHVpbnQzMl90IHZhbHVlT2Zmc2V0ID0gY2hlY2tBbmRHZXRPZmZzZXQob2Zmc2V0KTsKKyAgICBpZiAodmFsdWVPZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBzaXplID0gbUVudHJpZXMuc2l6ZSgpOworCisgICAgLy8gV3JpdGVyIElGRCBoZWFkZXIgKDIgYnl0ZXMsIG51bWJlciBvZiBlbnRyaWVzKS4KKyAgICB1aW50MTZfdCBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oc2l6ZSk7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmhlYWRlciwgMCwgMSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB0YWcgZW50cmllcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVUYWdJbmZvKHZhbHVlT2Zmc2V0LCBvdXQpLCByZXQpOworICAgICAgICB2YWx1ZU9mZnNldCArPSBtRW50cmllc1tpXS0+Z2V0U2l6ZSgpOworICAgIH0KKworICAgIC8vIFdyaXRlciBJRkQgZm9vdGVyICg0IGJ5dGVzLCBvZmZzZXQgdG8gbmV4dCBJRkQpLgorICAgIHVpbnQzMl90IGZvb3RlciA9IChtTmV4dElmZCAhPSBOVUxMKSA/IG9mZnNldCArIGdldFNpemUoKSA6IDA7CisgICAgQkFJTF9PTl9GQUlMKG91dC0+d3JpdGUoJmZvb3RlciwgMCwgMSksIHJldCk7CisKKyAgICBhc3NlcnQob3V0LT5nZXRDdXJyZW50T2Zmc2V0KCkgPT0gb2Zmc2V0ICsgY2FsY3VsYXRlSWZkU2l6ZShzaXplKSk7CisKKyAgICAvLyBXcml0ZSB6ZXJvZXMgdGlsbCB3b3JkIGFsaWduZWQKKyAgICBaRVJPX1RJTExfV09SRChvdXQsIGNhbGN1bGF0ZUlmZFNpemUoc2l6ZSksIHJldCk7CisKKyAgICAvLyBXcml0ZSB2YWx1ZXMgZm9yIGVhY2ggdGFnIGVudHJ5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGxhc3QgPSBvdXQtPmdldEN1cnJlbnRPZmZzZXQoKTsKKyAgICAgICAgLy8gT25seSB3cml0ZSB2YWx1ZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgMTItYnl0ZSBUSUZGIGVudHJ5CisgICAgICAgIGlmIChtRW50cmllc1tpXS0+Z2V0U2l6ZSgpID4gT0ZGU0VUX1NJWkUpIHsKKyAgICAgICAgICAgIEJBSUxfT05fRkFJTChtRW50cmllc1tpXS0+d3JpdGVEYXRhKG91dC0+Z2V0Q3VycmVudE9mZnNldCgpLCBvdXQpLCByZXQpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBuZXh0ID0gb3V0LT5nZXRDdXJyZW50T2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBkaWZmID0gKG5leHQgLSBsYXN0KTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbCA9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgICAgIGlmIChkaWZmICE9IGFjdHVhbCkgeworICAgICAgICAgICAgQUxPR1coIlNpemVzIGRvIG5vdCBtYXRjaCBmb3IgdGFnICV4LiBFeHBlY3RlZCAlenUsIHJlY2VpdmVkICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1FbnRyaWVzW2ldLT5nZXRUYWcoKSwgYWN0dWFsLCBkaWZmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChvdXQtPmdldEN1cnJlbnRPZmZzZXQoKSA9PSBvZmZzZXQgKyBnZXRTaXplKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc2l6ZV90IFRpZmZJZmQ6OmdldFNpemUoKSBjb25zdCB7CisgICAgc2l6ZV90IHNpemUgPSBtRW50cmllcy5zaXplKCk7CisgICAgdWludDMyX3QgdG90YWwgPSBjYWxjdWxhdGVJZmRTaXplKHNpemUpOworICAgIFdPUkRfQUxJR04odG90YWwpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIHRvdGFsICs9IG1FbnRyaWVzW2ldLT5nZXRTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JZmRJZDsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0Q29tcGFyYWJsZVZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtSWZkSWQ7Cit9CisKK3N0YXR1c190IFRpZmZJZmQ6OnZhbGlkYXRlQW5kU2V0U3RyaXBUYWdzKCkgeworICAgIHNwPFRpZmZFbnRyeT4gd2lkdGhFbnRyeSA9IGdldEVudHJ5KFRBR19JTUFHRVdJRFRIKTsKKyAgICBpZiAod2lkdGhFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIEltYWdlV2lkdGggdGFnIHNldCIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IGhlaWdodEVudHJ5ID0gZ2V0RW50cnkoVEFHX0lNQUdFTEVOR1RIKTsKKyAgICBpZiAoaGVpZ2h0RW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBJbWFnZUxlbmd0aCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gc2FtcGxlc0VudHJ5ID0gZ2V0RW50cnkoVEFHX1NBTVBMRVNQRVJQSVhFTCk7CisgICAgaWYgKHNhbXBsZXNFbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXNuJ3QgaGF2ZSBhIFNhbXBsZXNQZXJQaXhlbCB0YWcgc2V0IiwgX19GVU5DVElPTl9fLCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZFbnRyeT4gYml0c0VudHJ5ID0gZ2V0RW50cnkoVEFHX0JJVFNQRVJTQU1QTEUpOworICAgIGlmIChiaXRzRW50cnkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2Vzbid0IGhhdmUgYSBCaXRzUGVyU2FtcGxlIHRhZyBzZXQiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgd2lkdGggPSAqKHdpZHRoRW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQzMl90IGhlaWdodCA9ICooaGVpZ2h0RW50cnktPmdldERhdGE8dWludDMyX3Q+KCkpOworICAgIHVpbnQxNl90IGJpdHNQZXJTYW1wbGUgPSAqKGJpdHNFbnRyeS0+Z2V0RGF0YTx1aW50MTZfdD4oKSk7CisgICAgdWludDE2X3Qgc2FtcGxlc1BlclBpeGVsID0gKihzYW1wbGVzRW50cnktPmdldERhdGE8dWludDE2X3Q+KCkpOworCisgICAgaWYgKChiaXRzUGVyU2FtcGxlICUgOCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEJpdHNQZXJTYW1wbGUgJWQgaW4gSUZEICV1IGlzIG5vdCBieXRlLWFsaWduZWQuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUsIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlIC8gODsKKworICAgIC8vIENob29zZSBzdHJpcCBzaXplIGFzIGNsb3NlIHRvIDhrYiBhcyBwb3NzaWJsZSB3aXRob3V0IHNwbGl0dGluZyByb3dzLgorICAgIC8vIElmIHRoZSByb3cgbGVuZ3RoIGlzID44a2IsIGVhY2ggc3RyaXAgd2lsbCBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgcm93LgorICAgIGNvbnN0IHVpbnQzMl90IHJvd0xlbmd0aEJ5dGVzID0gYnl0ZXNQZXJTYW1wbGUgKiBzYW1wbGVzUGVyUGl4ZWwgKiB3aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBpZGVhbENodW5rU2l6ZSA9ICgxIDw8IDEzKTsgLy8gOGtiCisgICAgdWludDMyX3Qgcm93c1BlckNodW5rID0gaWRlYWxDaHVua1NpemUgLyByb3dMZW5ndGhCeXRlczsKKyAgICByb3dzUGVyQ2h1bmsgPSAocm93c1BlckNodW5rID09IDApID8gMSA6IHJvd3NQZXJDaHVuazsKKyAgICBjb25zdCB1aW50MzJfdCBhY3R1YWxDaHVua1NpemUgPSByb3dMZW5ndGhCeXRlcyAqIHJvd3NQZXJDaHVuazsKKworICAgIGNvbnN0IHVpbnQzMl90IGxhc3RDaHVua1Jvd3MgPSBoZWlnaHQgJSByb3dzUGVyQ2h1bms7CisgICAgY29uc3QgdWludDMyX3QgbGFzdENodW5rU2l6ZSA9IGxhc3RDaHVua1Jvd3MgKiByb3dMZW5ndGhCeXRlczsKKworICAgIGlmIChhY3R1YWxDaHVua1NpemUgPiAvKm1heCBzdHJpcCBzaXplIGZvciBUSUZGL0VQKi82NTUzNikgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmlwIGxlbmd0aCB0b28gbG9uZy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBoZWlnaHQgLyByb3dzUGVyQ2h1bms7CisKKyAgICAvLyBBZGQgYW5vdGhlciBzdHJpcCBmb3IgdGhlIGluY29tcGxldGUgY2h1bmsuCisgICAgaWYgKGxhc3RDaHVua1Jvd3MgPiAwKSB7CisgICAgICAgIG51bVN0cmlwcyArPSAxOworICAgIH0KKworICAgIC8vIFB1dCBlYWNoIHJvdyBpbiBpdCdzIG93biBzdHJpcAorICAgIHVpbnQzMl90IHJvd3NQZXJTdHJpcFZhbCA9IHJvd3NQZXJDaHVuazsKKyAgICBzcDxUaWZmRW50cnk+IHJvd3NQZXJTdHJpcCA9IFRpZmZXcml0ZXI6OnVuY2hlY2tlZEJ1aWxkRW50cnkoVEFHX1JPV1NQRVJTVFJJUCwgTE9ORywgMSwKKyAgICAgICAgICAgIFVOREVGSU5FRF9FTkRJQU4sICZyb3dzUGVyU3RyaXBWYWwpOworCisgICAgaWYgKHJvd3NQZXJTdHJpcCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBSb3dzUGVyU3RyaXAgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiBieXRlQ291bnRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJpcHM7ICsraSkgeworICAgICAgICBpZiAobGFzdENodW5rUm93cyA+IDAgJiYgaSA9PSAobnVtU3RyaXBzIC0gMSkpIHsKKyAgICAgICAgICAgIGJ5dGVDb3VudHMuYWRkKGxhc3RDaHVua1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZUNvdW50cy5hZGQoYWN0dWFsQ2h1bmtTaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBieXRlIGNvdW50cyBmb3IgZWFjaCBzdHJpcAorICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBCWVRFQ09VTlRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIGJ5dGVDb3VudHMuYXJyYXkoKSk7CisKKyAgICBpZiAoc3RyaXBCeXRlQ291bnRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgYnVpbGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0YWcuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0c1ZlY3RvcjsKKyAgICBzdHJpcE9mZnNldHNWZWN0b3IucmVzaXplKG51bVN0cmlwcyk7CisKKyAgICAvLyBTZXQgdW5pbml0aWFsaXplZCBvZmZzZXRzCisgICAgc3A8VGlmZkVudHJ5PiBzdHJpcE9mZnNldHMgPSBUaWZmV3JpdGVyOjp1bmNoZWNrZWRCdWlsZEVudHJ5KFRBR19TVFJJUE9GRlNFVFMsIExPTkcsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtU3RyaXBzKSwgVU5ERUZJTkVEX0VORElBTiwgc3RyaXBPZmZzZXRzVmVjdG9yLmFycmF5KCkpOworCisgICAgaWYgKHN0cmlwT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGJ1aWxkIGVudHJ5IGZvciBTdHJpcE9mZnNldHMgdGFnLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBCeXRlQ291bnRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkocm93c1BlclN0cmlwKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoYWRkRW50cnkoc3RyaXBPZmZzZXRzKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBhZGQgZW50cnkgZm9yIFN0cmlwQnl0ZUNvdW50cyB0byBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbVN0cmlwT2Zmc2V0c0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgVGlmZklmZDo6dW5pbml0aWFsaXplZE9mZnNldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJpcE9mZnNldHNJbml0aWFsaXplZDsKK30KKworc3RhdHVzX3QgVGlmZklmZDo6c2V0U3RyaXBPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSB7CisKKyAgICAvLyBHZXQgb2xkIG9mZnNldHMgYW5kIGJ5dGVjb3VudHMKKyAgICBzcDxUaWZmRW50cnk+IG9sZE9mZnNldHMgPSBnZXRFbnRyeShUQUdfU1RSSVBPRkZTRVRTKTsKKyAgICBpZiAob2xkT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBPZmZzZXRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxUaWZmRW50cnk+IHN0cmlwQnl0ZUNvdW50cyA9IGdldEVudHJ5KFRBR19TVFJJUEJZVEVDT1VOVFMpOworICAgIGlmIChzdHJpcEJ5dGVDb3VudHMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IElGRCAldSBkb2VzIG5vdCBjb250YWluIFN0cmlwQnl0ZUNvdW50cyBlbnRyeS4iLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3Qgb2Zmc2V0c0NvdW50ID0gb2xkT2Zmc2V0cy0+Z2V0Q291bnQoKTsKKyAgICB1aW50MzJfdCBieXRlQ291bnQgPSBzdHJpcEJ5dGVDb3VudHMtPmdldENvdW50KCk7CisgICAgaWYgKG9mZnNldHNDb3VudCAhPSBieXRlQ291bnQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJpcE9mZnNldHMgY291bnQgKCV1KSBkb2Vzbid0IG1hdGNoIFN0cmlwQnl0ZUNvdW50cyBjb3VudCAoJXUpIGluIElGRCAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldHNDb3VudCwgYnl0ZUNvdW50LCBtSWZkSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90KiBzdHJpcEJ5dGVDb3VudHNBcnJheSA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHNpemVfdCBudW1TdHJpcHMgPSBvZmZzZXRzQ291bnQ7CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHN0cmlwT2Zmc2V0czsKKworICAgIC8vIENhbGN1bGF0ZSB1cGRhdGVkIGJ5dGUgb2Zmc2V0cworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyaXBzOyArK2kpIHsKKyAgICAgICAgc3RyaXBPZmZzZXRzLmFkZChvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gc3RyaXBCeXRlQ291bnRzQXJyYXlbaV07CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBuZXdPZmZzZXRzID0gVGlmZldyaXRlcjo6dW5jaGVja2VkQnVpbGRFbnRyeShUQUdfU1RSSVBPRkZTRVRTLCBMT05HLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG51bVN0cmlwcyksIFVOREVGSU5FRF9FTkRJQU4sIHN0cmlwT2Zmc2V0cy5hcnJheSgpKTsKKworICAgIGlmIChuZXdPZmZzZXRzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsdCBub3QgYnVpbGQgdXBkYXRlZCBvZmZzZXRzIGVudHJ5IGluIElGRCAldSIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYWRkRW50cnkobmV3T2Zmc2V0cykgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIHVwZGF0ZWQgb2Zmc2V0cyBlbnRyeSBpbiBJRkQgJXUiLCBfX0ZVTkNUSU9OX18sIG1JZmRJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgVGlmZklmZDo6Z2V0U3RyaXBTaXplKCkgY29uc3QgeworICAgIHNwPFRpZmZFbnRyeT4gc3RyaXBCeXRlQ291bnRzID0gZ2V0RW50cnkoVEFHX1NUUklQQllURUNPVU5UUyk7CisgICAgaWYgKHN0cmlwQnl0ZUNvdW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogSUZEICV1IGRvZXMgbm90IGNvbnRhaW4gU3RyaXBCeXRlQ291bnRzIGVudHJ5LiIsIF9fRlVOQ1RJT05fXywgbUlmZElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb3VudCA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0Q291bnQoKTsKKyAgICBjb25zdCB1aW50MzJfdCogYnl0ZUNvdW50cyA9IHN0cmlwQnl0ZUNvdW50cy0+Z2V0RGF0YTx1aW50MzJfdD4oKTsKKworICAgIHVpbnQzMl90IHRvdGFsID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4oY291bnQpOyArK2kpIHsKKyAgICAgICAgdG90YWwgKz0gYnl0ZUNvdW50c1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsOworfQorCitTdHJpbmc4IFRpZmZJZmQ6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHNpemVfdCBzID0gbUVudHJpZXMuc2l6ZSgpOworICAgIFN0cmluZzggb3V0cHV0OworICAgIG91dHB1dC5hcHBlbmRGb3JtYXQoIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG1FbnRyaWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG91dHB1dC5hcHBlbmQoIlx0Iik7CisgICAgICAgIG91dHB1dC5hcHBlbmQobUVudHJpZXNbaV0tPnRvU3RyaW5nKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICBvdXRwdXQuYXBwZW5kKCIsIG5leHRfaWZkOiAleF0iLCAoKG1OZXh0SWZkICE9IE5VTEwpID8gbU5leHRJZmQtPmdldElkKCkgOiAwKSk7CisgICAgcmV0dXJuIG91dHB1dDsKK30KKwordm9pZCBUaWZmSWZkOjpsb2coKSBjb25zdCB7CisgICAgc2l6ZV90IHMgPSBtRW50cmllcy5zaXplKCk7CisgICAgQUxPR0koIltpZmQ6ICV4LCBudW1fZW50cmllczogJXp1LCBlbnRyaWVzOlxuIiwgZ2V0SWQoKSwgcyk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHM7ICsraSkgeworICAgICAgICBBTE9HSSgiXHQlcyIsIG1FbnRyaWVzW2ldLT50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICB9CisgICAgQUxPR0koIiwgbmV4dF9pZmQ6ICV4XSIsICgobU5leHRJZmQgIT0gTlVMTCkgPyBtTmV4dElmZC0+Z2V0SWQoKSA6IDApKTsKK30KKworfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLworfSAvKm5hbWVzcGFjZSBhbmRyb2lkKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRhYmxlLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CnNpbWlsYXJpdHkgaW5kZXggNjQlCmNvcHkgZnJvbSBsaWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKY29weSB0byBtZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0YWJsZS5jcHAKaW5kZXggMTNjYWM2ZC4uZjhkN2RlNwotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGFibGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGFibGUuaD4KKyNpbmNsdWRlIDxpbWdfdXRpbHMvVGlmZkhlbHBlcnMuaD4KIAotLyogLS0tLS0gQWRkLW9ucyAtLS0tLSAqLworI2luY2x1ZGUgPGFzc2VydC5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW1nX3V0aWxzIHsKIAorVGlmZldyaXRhYmxlOjpUaWZmV3JpdGFibGUoKSB7fQorCitUaWZmV3JpdGFibGU6On5UaWZmV3JpdGFibGUoKSB7fQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MTczNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGlmZldyaXRlciIKKworI2luY2x1ZGUgPGltZ191dGlscy9UaWZmSGVscGVycy5oPgorI2luY2x1ZGUgPGltZ191dGlscy9UaWZmV3JpdGVyLmg+CisjaW5jbHVkZSA8aW1nX3V0aWxzL1RhZ0RlZmluaXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGltZ191dGlscyB7CisKK0tleWVkVmVjdG9yPHVpbnQxNl90LCBjb25zdCBUYWdEZWZpbml0aW9uX3QqPiBUaWZmV3JpdGVyOjpidWlsZFRhZ01hcCgKKyAgICAgICAgICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbnMsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gbWFwOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBtYXAuYWRkKGRlZmluaXRpb25zW2ldLnRhZ0lkLCBkZWZpbml0aW9ucyArIGkpOworICAgIH0KKyAgICByZXR1cm4gbWFwOworfQorCisjZGVmaW5lIENPTVBBUkUob3ApIFwKK2Jvb2wgT3JkZXJhYmxlOjpvcGVyYXRvciBvcCAoY29uc3QgT3JkZXJhYmxlJiBvcmRlcmFibGUpIGNvbnN0IHsgXAorICAgIHJldHVybiBnZXRDb21wYXJhYmxlVmFsdWUoKSBvcCBvcmRlcmFibGUuZ2V0Q29tcGFyYWJsZVZhbHVlKCk7IFwKK30KKworI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSBcCisgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCitLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4gVGlmZldyaXRlcjo6c1RhZ01hcHNbXSA9IHsKKyAgICBidWlsZFRhZ01hcChUSUZGX0VQX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShUSUZGX0VQX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEROR19UQUdfREVGSU5JVElPTlMsIEFSUkFZX1NJWkUoRE5HX1RBR19ERUZJTklUSU9OUykpLAorICAgIGJ1aWxkVGFnTWFwKEVYSUZfMl8zX1RBR19ERUZJTklUSU9OUywgQVJSQVlfU0laRShFWElGXzJfM19UQUdfREVGSU5JVElPTlMpKSwKKyAgICBidWlsZFRhZ01hcChUSUZGXzZfVEFHX0RFRklOSVRJT05TLCBBUlJBWV9TSVpFKFRJRkZfNl9UQUdfREVGSU5JVElPTlMpKQorfTsKKworVGlmZldyaXRlcjo6VGlmZldyaXRlcigpIDogbVRhZ01hcHMoc1RhZ01hcHMpLCBtTnVtVGFnTWFwcyhERUZBVUxUX05VTV9UQUdfTUFQUykge30KKworVGlmZldyaXRlcjo6VGlmZldyaXRlcihLZXllZFZlY3Rvcjx1aW50MTZfdCwgY29uc3QgVGFnRGVmaW5pdGlvbl90Kj4qIGVuYWJsZWREZWZpbml0aW9ucywKKyAgICAgICAgc2l6ZV90IGxlbmd0aCkgOiBtVGFnTWFwcyhlbmFibGVkRGVmaW5pdGlvbnMpLCBtTnVtVGFnTWFwcyhsZW5ndGgpIHt9CisKK1RpZmZXcml0ZXI6On5UaWZmV3JpdGVyKCkge30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGUoT3V0cHV0KiBvdXQsIFN0cmlwU291cmNlKiogc291cmNlcywgc2l6ZV90IHNvdXJjZXNDb3VudCwKKyAgICAgICAgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IHRvdGFsU2l6ZSA9IGdldFRvdGFsU2l6ZSgpOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHVpbnQzMl90PiBvZmZzZXRWZWN0b3I7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZElmZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnVuaW5pdGlhbGl6ZWRPZmZzZXRzKCkpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlwU2l6ZSA9IG1OYW1lZElmZHNbaV0tPmdldFN0cmlwU2l6ZSgpOworICAgICAgICAgICAgaWYgKG1OYW1lZElmZHNbaV0tPnNldFN0cmlwT2Zmc2V0KHRvdGFsU2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBzZXQgc3RyaXAgb2Zmc2V0cy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbFNpemUgKz0gc3RyaXBTaXplOworICAgICAgICAgICAgV09SRF9BTElHTih0b3RhbFNpemUpOworICAgICAgICAgICAgb2Zmc2V0VmVjdG9yLmFkZChtTmFtZWRJZmRzLmtleUF0KGkpLCB0b3RhbFNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG9mZlZlY1NpemUgPSBvZmZzZXRWZWN0b3Iuc2l6ZSgpOworICAgIGlmIChvZmZWZWNTaXplICE9IHNvdXJjZXNDb3VudCkgeworICAgICAgICBBTE9HRSgiJXM6IE1pc21hdGNoIGJldHdlZW4gbnVtYmVyIG9mIElGRHMgd2l0aCB1bmluaXRpYWxpemVkIHN0cmlwcyAoJXp1KSBhbmQiCisgICAgICAgICAgICAgICAgIiBzb3VyY2VzICglenUpLiIsIF9fRlVOQ1RJT05fXywgb2ZmVmVjU2l6ZSwgc291cmNlc0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorCisgICAgaWYgKExPR19OREVCVUcgPT0gMCkgeworICAgICAgICBsb2coKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9mZlZlY1NpemU7ICsraSkgeworICAgICAgICB1aW50MzJfdCBpZmRLZXkgPSBvZmZzZXRWZWN0b3Iua2V5QXQoaSk7CisgICAgICAgIHVpbnQzMl90IG5leHRPZmZzZXQgPSBvZmZzZXRWZWN0b3JbaV07CisgICAgICAgIHVpbnQzMl90IHNpemVUb1dyaXRlID0gbU5hbWVkSWZkc1tpZmRLZXldLT5nZXRTdHJpcFNpemUoKTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNvdXJjZXNDb3VudDsgKytqKSB7CisgICAgICAgICAgICBpZiAoc291cmNlc1tqXS0+Z2V0SWZkKCkgPT0gaWZkS2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBzb3VyY2VzW2ldLT53cml0ZVRvU3RyZWFtKGVuZE91dCwgc2l6ZVRvV3JpdGUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCB3cml0ZSB0byBzdHJlYW0sIHJlY2VpdmVkICVkLiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWkVST19USUxMX1dPUkQoJmVuZE91dCwgc2l6ZVRvV3JpdGUsIHJldCk7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gc3RyZWFtIGZvciBieXRlIHN0cmlwcyBmb3IgSUZEICV1IiwgX19GVU5DVElPTl9fLCBpZmRLZXkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQobmV4dE9mZnNldCA9PSBlbmRPdXQuZ2V0Q3VycmVudE9mZnNldCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjp3cml0ZShPdXRwdXQqIG91dCwgRW5kaWFubmVzcyBlbmQpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBFbmRpYW5PdXRwdXQgZW5kT3V0KG91dCwgZW5kKTsKKworICAgIGlmIChtSWZkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaWZmIGhlYWRlciBpcyBlbXB0eS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBCQUlMX09OX0ZBSUwod3JpdGVGaWxlSGVhZGVyKGVuZE91dCksIHJldCk7CisKKyAgICB1aW50MzJfdCBvZmZzZXQgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgQkFJTF9PTl9GQUlMKGlmZC0+d3JpdGVEYXRhKG9mZnNldCwgJmVuZE91dCksIHJldCk7CisgICAgICAgIG9mZnNldCArPSBpZmQtPmdldFNpemUoKTsKKyAgICAgICAgaWZkID0gaWZkLT5nZXROZXh0SWZkKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworY29uc3QgVGFnRGVmaW5pdGlvbl90KiBUaWZmV3JpdGVyOjpsb29rdXBEZWZpbml0aW9uKHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtVGFnTWFwczsgKytpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVGFnTWFwc1tpXS5pbmRleE9mS2V5KHRhZyk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBkZWZpbml0aW9uID0gbVRhZ01hcHNbaV1baW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyB3aXRoIGlkICV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb247Cit9CisKK3NwPFRpZmZFbnRyeT4gVGlmZldyaXRlcjo6Z2V0RW50cnkodWludDE2X3QgdGFnLCB1aW50MzJfdCBpZmQpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIElGRCAlZCBzZXQgZm9yIHRoaXMgd3JpdGVyLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBtTmFtZWRJZmRzW2luZGV4XS0+Z2V0RW50cnkodGFnKTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpyZW1vdmVFbnRyeSh1aW50MTZfdCB0YWcsIHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBtTmFtZWRJZmRzW2luZGV4XS0+cmVtb3ZlRW50cnkodGFnKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZEVudHJ5KGNvbnN0IHNwPFRpZmZFbnRyeT4mIGVudHJ5LCB1aW50MzJfdCBpZmQpIHsKKyAgICB1aW50MTZfdCB0YWcgPSBlbnRyeS0+Z2V0VGFnKCk7CisKKyAgICBjb25zdCBUYWdEZWZpbml0aW9uX3QqIGRlZmluaXRpb24gPSBsb29rdXBEZWZpbml0aW9uKHRhZyk7CisKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gZGVmaW5pdGlvbiBleGlzdHMgZm9yIHRhZyAweCV4LiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisKKyAgICAvLyBBZGQgYSBuZXcgSUZEIGlmIG5lY2Vzc2FyeQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBJRkQgJXUgZXhpc3RzLiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IHNlbGVjdGVkSWZkICA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZElmZC0+YWRkRW50cnkoZW50cnkpOworfQorCitzdGF0dXNfdCBUaWZmV3JpdGVyOjphZGRTdHJpcCh1aW50MzJfdCBpZmQpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU5hbWVkSWZkcy5pbmRleE9mS2V5KGlmZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCAldSBkb2Vzbid0IGV4aXN0LCBjYW5ub3QgYWRkIHN0cmlwIGVudHJpZXMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxUaWZmSWZkPiBzZWxlY3RlZCA9IG1OYW1lZElmZHNbaW5kZXhdOworICAgIHJldHVybiBzZWxlY3RlZC0+dmFsaWRhdGVBbmRTZXRTdHJpcFRhZ3MoKTsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6YWRkSWZkKHVpbnQzMl90IGlmZCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IElmZCB3aXRoIElEIDB4JXggYWxyZWFkeSBleGlzdHMuIiwgX19GVU5DVElPTl9fLCBpZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFRpZmZJZmQ+IG5ld0lmZCA9IG5ldyBUaWZmSWZkKGlmZCk7CisgICAgaWYgKG1JZmQgPT0gTlVMTCkgeworICAgICAgICBtSWZkID0gbmV3SWZkOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IGxhc3QgPSBmaW5kTGFzdElmZCgpOworICAgICAgICBsYXN0LT5zZXROZXh0SWZkKG5ld0lmZCk7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFRpZmZXcml0ZXI6OmFkZFN1YklmZCh1aW50MzJfdCBwYXJlbnRJZmQsIHVpbnQzMl90IGlmZCwgU3ViSWZkVHlwZSB0eXBlKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShpZmQpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogSWZkIHdpdGggSUQgMHgleCBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sIGlmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3NpemVfdCBwYXJlbnRJbmRleCA9IG1OYW1lZElmZHMuaW5kZXhPZktleShwYXJlbnRJZmQpOworICAgIGlmIChwYXJlbnRJbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQYXJlbnQgSUZEIHdpdGggSUQgMHgleCBkb2VzIG5vdCBleGlzdC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZklmZD4gcGFyZW50ID0gbU5hbWVkSWZkc1twYXJlbnRJbmRleF07CisgICAgc3A8VGlmZklmZD4gbmV3SWZkID0gbmV3IFRpZmZJZmQoaWZkKTsKKworICAgIHVpbnQxNl90IHN1YklmZFRhZzsKKyAgICBpZiAodHlwZSA9PSBTVUJJRkQpIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX1NVQklGRFM7CisgICAgfSBlbHNlIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgc3ViSWZkVGFnID0gVEFHX0dQU0lORk87CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIFN1YklGRCB0eXBlICVkLiIsIF9fRlVOQ1RJT05fXywgdHlwZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VGlmZkVudHJ5PiBzdWJJZmRzID0gcGFyZW50LT5nZXRFbnRyeShzdWJJZmRUYWcpOworICAgIGlmIChzdWJJZmRzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGJ1aWxkRW50cnkoc3ViSWZkVGFnLCAxLCAmbmV3SWZkLCAmc3ViSWZkcykgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0eXBlID09IEdQU0lORk8pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGFkZCBHUFNJbmZvIFN1YklGRCB0byBJRkQgJXUsIG9uZSBhbHJlYWR5IGV4aXN0cy4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGlmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPFRpZmZJZmQ+ID4gc3ViSWZkTGlzdDsKKyAgICAgICAgY29uc3Qgc3A8VGlmZklmZD4qIG9sZElmZEFycmF5ID0gc3ViSWZkcy0+Z2V0RGF0YTxzcDxUaWZmSWZkPiA+KCk7CisgICAgICAgIGlmIChzdWJJZmRMaXN0LmFwcGVuZEFycmF5KG9sZElmZEFycmF5LCBzdWJJZmRzLT5nZXRDb3VudCgpKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGJ1aWxkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YklmZExpc3QuYWRkKG5ld0lmZCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBidWlsZCBTdWJJZmQgZW50cnkgaW4gSUZEIDB4JXguIiwgX19GVU5DVElPTl9fLCBwYXJlbnRJZmQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gc3ViSWZkTGlzdC5zaXplKCk7CisgICAgICAgIGlmIChidWlsZEVudHJ5KHN1YklmZFRhZywgY291bnQsIHN1YklmZExpc3QuYXJyYXkoKSwgJnN1YklmZHMpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYnVpbGQgU3ViSWZkIGVudHJ5IGluIElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgcGFyZW50SWZkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5hZGRFbnRyeShzdWJJZmRzKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkIFN1YklmZCBlbnRyeSBpbiBJRkQgMHgleC4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudElmZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYobU5hbWVkSWZkcy5hZGQoaWZkLCBuZXdJZmQpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgbmV3IElGRCAweCV4LiIsIF9fRlVOQ1RJT05fXywgaWZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1RhZ1R5cGUgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdFR5cGUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZmluZCBkZWZpbml0aW9uIGZvciB0YWcgJXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgIHJldHVybiBVTktOT1dOX1RBR1RZUEU7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT5kZWZhdWx0VHlwZTsKK30KKwordWludDMyX3QgVGlmZldyaXRlcjo6Z2V0RGVmYXVsdENvdW50KHVpbnQxNl90IHRhZykgY29uc3QgeworICAgIGNvbnN0IFRhZ0RlZmluaXRpb25fdCogZGVmaW5pdGlvbiA9IGxvb2t1cERlZmluaXRpb24odGFnKTsKKyAgICBpZiAoZGVmaW5pdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGZpbmQgZGVmaW5pdGlvbiBmb3IgdGFnICV4IiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGRlZmluaXRpb24tPmZpeGVkQ291bnQ7Cit9CisKK2Jvb2wgVGlmZldyaXRlcjo6aGFzSWZkKHVpbnQzMl90IGlmZCkgY29uc3QgeworICAgIHNzaXplX3QgaW5kZXggPSBtTmFtZWRJZmRzLmluZGV4T2ZLZXkoaWZkKTsKKyAgICByZXR1cm4gaW5kZXggPj0gMDsKK30KKworYm9vbCBUaWZmV3JpdGVyOjpjaGVja0lmRGVmaW5lZCh1aW50MTZfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwRGVmaW5pdGlvbih0YWcpICE9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIFRpZmZXcml0ZXI6OmdldFRhZ05hbWUodWludDE2X3QgdGFnKSBjb25zdCB7CisgICAgY29uc3QgVGFnRGVmaW5pdGlvbl90KiBkZWZpbml0aW9uID0gbG9va3VwRGVmaW5pdGlvbih0YWcpOworICAgIGlmIChkZWZpbml0aW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkZWZpbml0aW9uLT50YWdOYW1lOworfQorCitzcDxUaWZmSWZkPiBUaWZmV3JpdGVyOjpmaW5kTGFzdElmZCgpIHsKKyAgICBzcDxUaWZmSWZkPiBpZmQgPSBtSWZkOworICAgIHdoaWxlKGlmZCAhPSBOVUxMKSB7CisgICAgICAgIHNwPFRpZmZJZmQ+IG5leHRJZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICAgICAgaWYgKG5leHRJZmQgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWZkID0gbmV4dElmZDsKKyAgICB9CisgICAgcmV0dXJuIGlmZDsKK30KKworc3RhdHVzX3QgVGlmZldyaXRlcjo6d3JpdGVGaWxlSGVhZGVyKEVuZGlhbk91dHB1dCYgb3V0KSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgdWludDE2X3QgZW5kTWFya2VyID0gKG91dC5nZXRFbmRpYW5uZXNzKCkgPT0gQklHKSA/IEJJR19FTkRJQU5fTUFSS0VSIDogTElUVExFX0VORElBTl9NQVJLRVI7CisgICAgQkFJTF9PTl9GQUlMKG91dC53cml0ZSgmZW5kTWFya2VyLCAwLCAxKSwgcmV0KTsKKworICAgIHVpbnQxNl90IHRpZmZNYXJrZXIgPSBUSUZGX0ZJTEVfTUFSS0VSOworICAgIEJBSUxfT05fRkFJTChvdXQud3JpdGUoJnRpZmZNYXJrZXIsIDAsIDEpLCByZXQpOworCisgICAgdWludDMyX3Qgb2Zmc2V0TWFya2VyID0gRklMRV9IRUFERVJfU0laRTsKKyAgICBCQUlMX09OX0ZBSUwob3V0LndyaXRlKCZvZmZzZXRNYXJrZXIsIDAsIDEpLCByZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQzMl90IFRpZmZXcml0ZXI6OmdldFRvdGFsU2l6ZSgpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSBGSUxFX0hFQURFUl9TSVpFOworICAgIHNwPFRpZmZJZmQ+IGlmZCA9IG1JZmQ7CisgICAgd2hpbGUoaWZkICE9IE5VTEwpIHsKKyAgICAgICAgdG90YWxTaXplICs9IGlmZC0+Z2V0U2l6ZSgpOworICAgICAgICBpZmQgPSBpZmQtPmdldE5leHRJZmQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KKwordm9pZCBUaWZmV3JpdGVyOjpsb2coKSBjb25zdCB7CisgICAgQUxPR0koIiVzOiBUaWZmV3JpdGVyOiIsIF9fRlVOQ1RJT05fXyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1OYW1lZElmZHMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgbU5hbWVkSWZkc1tpXS0+bG9nKCk7CisgICAgfQorfQorCit9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCit9IC8qbmFtZXNwYWNlIGFuZHJvaWQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQubWsKaW5kZXggYjUwNjM1My4uZWUyODNhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLm1rCkBAIC0xLDQgKzEsNCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC04LDQgKzgsNiBAQAogCiBMT0NBTF9NT0RVTEUgOj0gbGliY3B1c3RhdHMKIAorTE9DQUxfQ0ZMQUdTIDo9IC1zdGQ9Z251KysxMSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCA2Mzc0MDJhLi5jZmRjYjUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CkBAIC0yMTgsNyArMjE3LDcgQEAKICNkZWZpbmUgRlJFUV9TSVpFIDY0CiAgICAgICAgICAgICBjaGFyIGZyZXFfcGF0aFtGUkVRX1NJWkVdOwogI2RlZmluZSBGUkVRX0RJR0lUIDI3Ci0gICAgICAgICAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKE1BWF9DUFUgPD0gMTApOworICAgICAgICAgICAgc3RhdGljX2Fzc2VydChNQVhfQ1BVIDw9IDEwLCAiTUFYX0NQVSB0b28gbGFyZ2UiKTsKICNkZWZpbmUgRlJFUV9QQVRIICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHU/L2NwdWZyZXEvc2NhbGluZ19jdXJfZnJlcSIKICAgICAgICAgICAgIHN0cmxjcHkoZnJlcV9wYXRoLCBGUkVRX1BBVEgsIHNpemVvZihmcmVxX3BhdGgpKTsKICAgICAgICAgICAgIGZyZXFfcGF0aFtGUkVRX0RJR0lUXSA9IGNwdU51bSArICcwJzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKaW5kZXggMmJiNmRiZS4uZTBjYThhZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKQEAgLTE1LDE2ICsxNSwxMCBAQAogCiBMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CiAKLWlmZXEgKCQoVEFSR0VUX09TKS0kKFRBUkdFVF9TSU1VTEFUT1IpLGxpbnV4LXRydWUpCi1MT0NBTF9MRExJQlMgKz0gLWxkbAotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IGQ4NGJjYTYuLjRhNDEwMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMTYsNyArMTYsOCBAQAogCiAjZGVmaW5lIExPR19UQUcgIkVmZmVjdERvd25taXgiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KQEAgLTI5LDI1ICszMCwxMyBAQAogCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKIAorLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgogdHlwZWRlZiBlbnVtIHsKLSAgICBDSEFOTkVMX01BU0tfU1VSUk9VTkQgPSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKLSAgICAvLyBsaWtlIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQgd2l0aCAqX1NJREVfKiBpbnN0ZWFkIG9mICpfQkFDS18qLCBzYW1lIGNoYW5uZWwgb3JkZXIKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0KLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAotICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQsCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCi0gICAgLy8gbGlrZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIHdpdGggKl9TSURFXyogaW5zdGVhZCBvZiAqX0JBQ0tfKiwgc2FtZSBjaGFubmVsIG9yZGVyCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwKLSAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCB8Ci0gICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hULAotICAgIENIQU5ORUxfTUFTS183UE9JTlQxX1NJREVfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBDSEFOTkVMX01BU0tfUVVBRF9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0sgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERSA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICBDSEFOTkVMX01BU0tfN1BPSU5UMSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCiB9IGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3Q7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGRvd25taXggZWZmZWN0CkBAIC05OSw3ICs4OCw3IEBACiAvLyBzdHJpY3RseSBmb3IgdGVzdGluZywgbG9ncyB0aGUgaW5kaWNlcyBvZiB0aGUgY2hhbm5lbHMgZm9yIGEgZ2l2ZW4gbWFzaywKIC8vIHVzZXMgdGhlIHNhbWUgY29kZSBhcyBEb3dubWl4X2ZvbGRHZW5lcmljKCkKIHZvaWQgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbih1aW50MzJfdCBtYXNrKSB7Ci0gICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JXg6IiwgbWFzayk7CisgICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JSIgUFJJeDMyICI6IiwgbWFzayk7CiAgICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscwogICAgIGlmIChtYXNrICYga1Vuc3VwcG9ydGVkKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyAodG9wIG9yIGZyb250IGxlZnQvcmlnaHQgb2YgY2VudGVyKSIpOwpAQCAtMTI5LDcgKzExOCw3IEBACiAgICAgICAgIGhhc0JhY2tzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IHBvcGNvdW50KG1hc2spOworICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOwogICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7CiAgICAgY29uc3QgYm9vbCBoYXNMRkUgPQogICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7CkBAIC0yMjAsNyArMjA5LDcgQEAKIAogICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdCkgbW9kdWxlOwogCi0gICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICVkIiwgbW9kdWxlLCBzaXplb2YoZG93bm1peF9tb2R1bGVfdCkpOworICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpICVwICwgc2l6ZSAlenUiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI1NCw3ICsyNDMsNyBAQAogICAgICAgICBBTE9HVigiRG93bm1peExpYl9HZXREZXNjcmlwdG9yKCkgaT0lZCIsIGkpOwogICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaV0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAleCIsCisgICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBkb3dubWl4IHR5cGUgJWQsIFVVSUQgPSAlIiBQUkl4MzIsCiAgICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0zMjgsNyArMzE3LDcgQEAKICAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKICAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCiAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHgleCBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CkBAIC0zMzksMjAgKzMyOCwxNyBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1NVUlJPVU5EOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVN1cnJvdW5kKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9CQUNLOgogICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX1NJREU6CiAgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzdQT0lOVDFfU0lERV9CQUNLOgorICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgogICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwLDcgKzM2Niw3IEBACiAKICAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKIAotICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00MDQsNyArMzkwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhOiAlcCIsCisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyICIsIHBSZXBseURhdGE6ICVwIiwKICAgICAgICAgICAgICAgICBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAogICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApAQCAtNDEzLDcgKzM5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnJlcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwUmVwbHlEYXRhOwogICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICVkLCByZXBseVNpemUgJWQiLAorICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICUiIFBSSWQzMiAiLCByZXBseVNpemUgJSIgUFJJdTMyLAogICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXJlcC0+ZGF0YSwgcmVwLT52c2l6ZSk7CiAgICAgICAgIHJlcC0+c3RhdHVzID0gRG93bm1peF9nZXRQYXJhbWV0ZXIocERvd25taXhlciwgKihpbnQzMl90ICopcmVwLT5kYXRhLCAmcmVwLT52c2l6ZSwKICAgICAgICAgICAgICAgICByZXAtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwpAQCAtNDIxLDggKzQwNyw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTToKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCAiIFwKLSAgICAgICAgICAgICAgICAicFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCiAgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNDcxLDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICAvLyBGSVhNRSBjaGFuZ2UgdHlwZSBpZiBwbGF5aW5nIG9uIGhlYWRzZXQgdnMgc3BlYWtlcgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogMHglMDh4IiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4IiBQUkl4MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKQEAgLTQ5MSw3ICs0NzcsNyBAQAogICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlZCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERTogJSIgUFJJdTMyLCAqKHVpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6CkBAIC01MDAsNyArNDg2LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNjI5LDcgKzYxNSw5IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgaWYgKCZwRHdtTW9kdWxlLT5jb25maWcgIT0gcENvbmZpZykgeworICAgICAgICBtZW1jcHkoJnBEd21Nb2R1bGUtPmNvbmZpZywgcENvbmZpZywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpOworICAgIH0KIAogICAgIGlmIChpbml0KSB7CiAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKQEAgLTY0MSw3ICs2MjksOCBAQAogICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2sgY2FuJ3QgYmUgMCIpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9IHBvcGNvdW50KHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgcERvd25taXhlci0+aW5wdXRfY2hhbm5lbF9jb3VudCA9CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB9CiAKICAgICBEb3dubWl4X1Jlc2V0KHBEb3dubWl4ZXIsIGluaXQpOwpAQCAtNjk3LDMxICs2ODYsMzEgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKIAogICAgIGludDE2X3QgdmFsdWUxNjsKLSAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKKyAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICUiIFBSSWQzMiAiLCB2YWx1ZTE2ICUiIFBSSWQxNiAiLCB2YWx1ZTMyICUiIFBSSWQzMiwKICAgICAgICAgICAgIHBEb3dubWl4ZXIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgogICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoZG93bm1peF90eXBlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJWQsIHNob3VsZCBiZSAlZCIsCisgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJSIgUFJJdTMyICIsIHNob3VsZCBiZSAlenUiLAogICAgICAgICAgICAgICAgICAgICBzaXplLCBzaXplb2YoZG93bm1peF90eXBlX3QpKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAgICAgICAgIHZhbHVlMTYgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICVkIiwgdmFsdWUxNik7CisgICAgICAgIEFMT0dWKCJzZXQgRE9XTk1JWF9QQVJBTV9UWVBFLCB0eXBlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgIGlmICghKCh2YWx1ZTE2ID4gRE9XTk1JWF9UWVBFX0lOVkFMSUQpICYmICh2YWx1ZTE2IDw9IERPV05NSVhfVFlQRV9MQVNUKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciBpbnZhbGlkIERPV05NSVhfUEFSQU1fVFlQRSB2YWx1ZSAlZCIsIHZhbHVlMTYpOworICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIGludmFsaWQgRE9XTk1JWF9QQVJBTV9UWVBFIHZhbHVlICUiIFBSSWQxNiwgdmFsdWUxNik7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSAoZG93bm1peF90eXBlX3QpIHZhbHVlMTY7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlIiBQUklkMzIsIHBhcmFtKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogfQpAQCAtNzUzLDI0ICs3NDIsMjQgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSkgeworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MTZfdCAqcFZhbHVlMTY7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICBjYXNlIERPV05NSVhfUEFSQU1fVFlQRToKICAgICAgIGlmICgqcFNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlZCBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKKyAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlIiBQUkl1MzIgIiBmb3IgRE9XTk1JWF9QQVJBTV9UWVBFIiwgKnBTaXplKTsKICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgIH0KICAgICAgIHBWYWx1ZTE2ID0gKGludDE2X3QgKilwVmFsdWU7CiAgICAgICAqcFZhbHVlMTYgPSAoaW50MTZfdCkgcERvd25taXhlci0+dHlwZTsKICAgICAgICpwU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKLSAgICAgIEFMT0dWKCJEb3dubWl4X2dldFBhcmFtZXRlciBET1dOTUlYX1BBUkFNX1RZUEUgaXMgJWQiLCAqcFZhbHVlMTYpOworICAgICAgQUxPR1YoIkRvd25taXhfZ2V0UGFyYW1ldGVyIERPV05NSVhfUEFSQU1fVFlQRSBpcyAlIiBQUklkMTYsICpwVmFsdWUxNik7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJSIgUFJJZDE2LCBwYXJhbSk7CiAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKQEAgLTgyNSw2NSArODE0LDYgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21TdXJyb3VuZCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgInN1cnJvdW5kIHNvdW5kIiAobW9ubyByZWFyKSBzaWduYWwgdG8gc3RlcmVvCi0gKgotICogSW5wdXRzOgotICogIHBTcmMgICAgICAgc3Vycm91bmQgc2lnbmFsIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2Ygc3Vycm91bmQgZnJhbWVzIHRvIGRvd25taXgKLSAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKLSAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCi0gKgotICogT3V0cHV0czoKLSAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcwotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzUmVhckNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJDCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgKGx0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgKHJ0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IEZDKC0zZEIpICsgUkMoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNSZWFyQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNSZWFyQ29udHJpYgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzUmVhckNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wMTYobHQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHJ0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUHVycG9zZToKQEAgLTEwNjgsNyArOTk4LDcgQEAKICAgICAgICAgaGFzQmFja3MgPSB0cnVlOwogICAgIH0KIAotICAgIGNvbnN0IGludCBudW1DaGFuID0gcG9wY291bnQobWFzayk7CisgICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7CiAgICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKICAgICBjb25zdCBib29sIGhhc0xGRSA9CiAgICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IGNiNmI5NTcuLjIzOTlhYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtOTMsMTEgKzkzLDEwIEBACiBpbnQgRG93bm1peF9Jbml0KGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUpOwogaW50IERvd25taXhfQ29uZmlndXJlKGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KTsKIGludCBEb3dubWl4X1Jlc2V0KGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGJvb2wgaW5pdCk7Ci1pbnQgRG93bm1peF9zZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK2ludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IERvd25taXhfZ2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKIAogdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci12b2lkIERvd25taXhfZm9sZEZyb21TdXJyb3VuZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7CiB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKIHZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwogYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawppbmRleCA2MGE2Y2U1Li5hOTMyYWY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDYgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBsaWJsb2cKIAotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpCiBMT0NBTF9NT0RVTEU6PSBsaWJlZmZlY3RzCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCmluZGV4IDMyYzRjZTAuLjM1ZTViYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX05VTExBRERSRVNTKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CisgICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7CiAgICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggNzk0MjcxYi4uZjVhMDFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50CiAgICAgICAgICAqLwotICAgICAgICBpZigoKChMVk1fVUlOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fVUlOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmluZGV4IGM2OTU0ZjIuLjdmNzI1ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCkBAIC0yOSw3ICsyOSw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFRvdGFsU2l6ZTsgICAgICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwogfSAgIElOU1RfQUxMT0M7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4MTY1NWRkLi4wYzZmYjI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODUsMTQgKzg2LDE0IEBACiAKIHR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KIAotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBjaGFyICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwordHlwZWRlZiAgICAgaW50OF90ICAgICAgICAgICAgICBMVk1fSU5UODsgICAgICAgICAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1aW50OF90ICAgICAgICAgICAgIExWTV9VSU5UODsgICAgICAgICAgLyogVW5zaWduZWQgOC1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBzaG9ydCAgICAgICAgICAgICAgIExWTV9JTlQxNjsgICAgICAgICAgLyogU2lnbmVkIDE2LWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBzaG9ydCAgICAgIExWTV9VSU5UMTY7ICAgICAgICAgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDE2X3QgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQxNl90ICAgICAgICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwogCi10eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwppbmRleCA0ODFkZjg0Li5hODlhNWMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpTdGFydEFkZHIgKQogewogICAgIHBtcy0+VG90YWxTaXplID0gMzsKLSAgICBwbXMtPnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOy8qIFRoaXMgY29kZSB3aWxsIGZhaWwgaWYgdGhlIHBsYXRmb3JtIGFkZHJlc3Mgc3BhY2UgaXMgbW9yZSB0aGFuIDMyLWJpdHMqLworICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoKCh1aW50cHRyX3QpU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIH0KIAogCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwogICAgIE5ld01lbWJlckFkZHJlc3MgPSAodm9pZCopcG1zLT5wTmV4dE1lbWJlcjsKIAotICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIDB4RkZGRkZGRkMpOyAvKiBDZWlsIHRoZSBzaXplIHRvIGEgbXVsdGlwbGUgb2YgZm91ciAqLworICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIChMVk1fVUlOVDMyKX4zKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KIAogICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7CiAgICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOwpAQCAtODQsMzAgKzg0LDMwIEBACiB2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKIHsKLSAgICBMVk1fVUlOVDMyIFN0YXJ0QWRkcjsKKyAgICB1aW50cHRyX3QgU3RhcnRBZGRyOwogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIAotICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CiAKICAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisgICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwogCiAKLSAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwogCiAgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworICAgIHBtc1syXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKIAogCi0gICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKIAogICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKyAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmluZGV4IGM0NzY3YTguLmUwMWMxYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJMVkVRTkIuaCIKICNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBGb3IgbWVtc2V0ICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKaW5kZXggYWMzYzc0MC4uNThmNThlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtNzcsNyArNzcsNyBAQAogICAgIH0KIAogICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgKi8KLSAgICBpZiAoKCgoTFZNX0lOVDMyKXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKChMVk1fSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKICAgICB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfQUxJR05NRU5URVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggODlkOTczYS4uZWE3MmU2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xOSwxMSArMTksMTMgQEAKICNkZWZpbmUgQVJSQVlfU0laRShhcnJheSkgKHNpemVvZiBhcnJheSAvIHNpemVvZiBhcnJheVswXSkKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG5ldz4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxuZXc+CisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCiAKIApAQCAtMTM4LDIyICsxNDAsMjIgQEAKIGludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCAgVm9sdW1lX3NldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgYm9vbCBlbmFibGVkKTsKIApAQCAtMTYxLDcgKzE2Myw3IEBACiAKIGV4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNlc3Npb25ObzsKQEAgLTIyMSw2ICsyMjMsOCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgICAgICA9IExWTV9GQUxTRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgICAgICA9IDA7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lICAgICAgICAgICAgICA9IExWTV9UUlVFOwpAQCAtNTYwLDExICs1NjQsMTIgQEAKICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CiAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTc2LDExICs1ODEsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgTm90IGZyZWVpbmdcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgJWxkIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAogICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9CkBAIC04ODksMTYgKzg5NCwxNiBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAKICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlbGQgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTYzLDYgKzExNjgsMTc3IEBACiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcblxuIik7CiB9ICAgIC8qIGVuZCBzZXRTdHJlbmd0aCAqLwogCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQ2hlY2sgaWYgYW4gYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgZGV2aWNlVHlwZSAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb3IgaXQgaXMgdW5rbm93bgorLy8gIDAgICAgICAgICAgICBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICBzd2l0Y2ggKGRldmljZVR5cGUpIHsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENoZWNrIGlmIGEgY2hhbm5lbCBtYXNrICsgYXVkaW8gZGV2aWNlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2sgIHRoZSBjaGFubmVsIG1hc2sgb2YgdGhlIGlucHV0IHRvIHZpcnR1YWxpemUKKy8vICBkZXZpY2VUeXBlICAgdGhlIHR5cGUgb2YgZGV2aWNlIHRoYXQgYWZmZWN0cyB0aGUgcHJvY2Vzc2luZyAoZS5nLiBmb3IgYmluYXVyYWwgdnMgdHJhbnNhdXJhbCkKKy8vIE91dHB1dDoKKy8vICAtRUlOVkFMICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvciBpdCBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBpZiAoKGNoYW5uZWxDb3VudCA9PSAwKSB8fCAoY2hhbm5lbENvdW50ID4gMikpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlVHlwZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBGb3JjZSB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSB0byB0aGF0IG9mIHRoZSBnaXZlbiBhdWRpbyBkZXZpY2UKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGZvcmNlZERldmljZSB0aGUgdHlwZSBvZiBkZXZpY2Ugd2hvc2UgdmlydHVhbGl6YXRpb24gbW9kZSB3ZSdsbCBhbHdheXMgdXNlCisvLyBPdXRwdXQ6CisvLyAgLUVJTlZBTCAgICAgIGlmIHRoZSBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvciBpcyB1bmtub3duCisvLyAgMCAgICAgICAgICAgIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSBmb3JjZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CisgICAgQUxPR1YoIlZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGZvcmNlZERldj0weCV4IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBib29sIHVzZVZpcnR1YWxpemVyID0gZmFsc2U7CisKKyAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChmb3JjZWREZXZpY2UpICE9IDApIHsKKyAgICAgICAgLy8gZm9yY2VkIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkLCBtYWtlIGl0IGJlaGF2ZSBhcyBhIHJlc2V0IG9mIGZvcmNlZCBtb2RlCisgICAgICAgIGZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAvLyBidXQgcmV0dXJuIGFuIGVycm9yCisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGZvcmNlZERldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBkaXNhYmxpbmcgZm9yY2VkIHZpcnR1YWxpemF0aW9uIG1vZGU6CisgICAgICAgIC8vIHZlcmlmeSB3aGV0aGVyIHRoZSB2aXJ0dWFsaXphdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorICAgICAgICBpZiAoVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlKSA9PSAwKSB7CisgICAgICAgICAgICB1c2VWaXJ0dWFsaXplciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmb3JjaW5nIHZpcnR1YWxpemF0aW9uIG1vZGU6IGhlcmUgd2UgYWxyZWFkeSBrbm93IHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAvLyBvbmx5IGVuYWJsZSBmb3IgYSBzdXBwb3J0ZWQgbW9kZSwgd2hlbiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQKKyAgICAgICAgdXNlVmlydHVhbGl6ZXIgPSAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSk7CisgICAgfQorCisgICAgaWYgKHVzZVZpcnR1YWxpemVyKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGxlYXZpbmcgTFZNX1ZJUlRVQUxJWkVSIGVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CisgICAgICAgICAgICBBTE9HVigiXHRWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJcdFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUgbGVhdmluZyBMVk1fVklSVFVBTElaRVIgZGlzYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJcdGFmdGVyIFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGU6IGVuYWJsZWQ9JWQgdG1wRGlzYWJsZWQ9JWQiLAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSB2aXJ0dWFsIHNwZWFrZXIgYW5nbGVzIGZvciBhIGNoYW5uZWwgbWFzayArIGF1ZGlvIGRldmljZSB0eXBlCisvLyBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KKy8vCisvLyBJbnB1dHM6CisvLyAgY2hhbm5lbE1hc2s6ICAgdGhlIGNoYW5uZWwgbWFzayBvZiB0aGUgaW5wdXQgdG8gdmlydHVhbGl6ZQorLy8gIGRldmljZVR5cGUgICAgIHRoZSB0eXBlIG9mIGRldmljZSB0aGF0IGFmZmVjdHMgdGhlIHByb2Nlc3NpbmcgKGUuZy4gZm9yIGJpbmF1cmFsIHZzIHRyYW5zYXVyYWwpCisvLyBJbnB1dC9PdXRwdXQ6CisvLyAgcFNwZWFrZXJBbmdsZXMgdGhlIGFycmF5IG9mIGludGVnZXIgd2hlcmUgZWFjaCBzcGVha2VyIGFuZ2xlIGlzIHdyaXR0ZW4gYXMgYSB0cmlwbGV0IGluIHRoZQorLy8gICAgICAgICAgICAgICAgIGZvbGxvd2luZyBmb3JtYXQ6CisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIGJpdCBtYXNrIHdpdGggYSBzaW5nbGUgdmFsdWUgc2VsZWN0ZWQgZm9yIGVhY2ggc3BlYWtlciwgZm9sbG93aW5nCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udmVudGlvbiBvZiB0aGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHlwZQorLy8gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYSB2YWx1ZSBpbiBkZWdyZWVzIGV4cHJlc3NpbmcgdGhlIHNwZWFrZXIgYXppbXV0aCwgd2hlcmUgMCBpcyBpbiBmcm9udAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHVzZXIsIDE4MCBiZWhpbmQsIC05MCB0byB0aGUgbGVmdCwgOTAgdG8gdGhlIHJpZ2h0IG9mIHRoZSB1c2VyCisvLyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhIHZhbHVlIGluIGRlZ3JlZXMgZXhwcmVzc2luZyB0aGUgc3BlYWtlciBlbGV2YXRpb24sIHdoZXJlIDAgaXMgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIHBsYW5lLCArOTAgaXMgZGlyZWN0bHkgYWJvdmUgdGhlIHVzZXIsIC05MCBiZWxvdworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlIF9fdW51c2VkLCBpbnQzMl90ICpwU3BlYWtlckFuZ2xlcykgeworICAgIC8vIHRoZSBjaGFubmVsIGNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgMSBvciAyCisgICAgLy8gdGhlIGRldmljZSBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgaGVhZHBob25lCisgICAgLy8gdGhpcyB2aXJ0dWFsaXplciBpcyBhbHdheXMgMmluIHdpdGggc3BlYWtlcnMgYXQgLTkwIGFuZCA5MGRlZyBvZiBhemltdXRoLCAwZGVnIG9mIGVsZXZhdGlvbgorICAgICpwU3BlYWtlckFuZ2xlcysrID0gKGludDMyX3QpIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAtOTA7IC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IDA7ICAgLy8gZWxldmF0aW9uCisgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQ7CisgICAgKnBTcGVha2VyQW5nbGVzKysgPSA5MDsgIC8vIGF6aW11dGgKKyAgICAqcFNwZWFrZXJBbmdsZXMgICA9IDA7ICAgLy8gZWxldmF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gUmV0cmlldmUgdGhlIGN1cnJlbnQgZGV2aWNlIHdob3NlIHByb2Nlc3NpbmcgbW9kZSBpcyB1c2VkIGJ5IHRoaXMgZWZmZWN0CisvLworLy8gT3V0cHV0OgorLy8gICBBVURJT19ERVZJQ0VfTk9ORSBpZiB0aGUgZWZmZWN0IGlzIG5vdCB2aXJ0dWFsaXppbmcKKy8vICAgb3IgdGhlIGRldmljZSB0eXBlIGlmIHRoZSBlZmZlY3QgaXMgdmlydHVhbGl6aW5nCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2F1ZGlvX2RldmljZXNfdCBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICAgIGF1ZGlvX2RldmljZXNfdCB2aXJ0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKQorICAgICAgICAgICAgJiYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpKSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIC8vIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkLCByZXR1cm4gdGhhdCBkZXZpY2UKKyAgICAgICAgICAgIHZpcnREZXZpY2UgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBmb3JjZWQgbW9kZSwgcmV0dXJuIHRoZSBjdXJyZW50IGRldmljZQorICAgICAgICAgICAgdmlydERldmljZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKCkgcmV0dXJuaW5nIDB4JXgiLCB2aXJ0RGV2aWNlKTsKKyAgICByZXR1cm4gdmlydERldmljZTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJMaW1pdEJhbmRMZXZlbHMoKQpAQCAtMTM1Nyw3ICsxNTMzLDcgQEAKIC8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCiAvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCitpbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQgX191bnVzZWQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBIaSl7CiAgICAgKnBMb3cgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzBdOwogICAgICpwSGkgID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKQEAgLTEzODEsNyArMTU1Nyw3IEBACiAvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQogLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCBfX3VudXNlZCwgdWludDMyX3QgdGFyZ2V0RnJlcSl7CiAgICAgaW50IGJhbmQgPSAwOwogCiAgICAgaWYodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0pewpAQCAtMTc1OCw3ICsxOTM0LDcgQEAKIAogaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKXsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CkBAIC0xODc2LDEyICsyMDUyLDExIEBACiAKIGludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgICAgKnBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpewogICAgIGludCBzdGF0dXMgPSAwOwogICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICBpbnQzMl90IHBhcmFtMjsKICAgICBjaGFyICpuYW1lOwogCiAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgc3RhcnQiKTsKQEAgLTE5MDEsNyArMjA3NiwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKLQorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6CisgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgc2l6ZSBjYW4gb25seSBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byBpbnB1dCB2YWx1ZSwKKyAgICAgICAgICAgIC8vIGRlZmVycmluZyB2YWxpZGl0eSBjaGVjayB0byBiZWxvdworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgJWQiLCpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkyMiwxMyArMjEwNywzNiBAQAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSAqcFBhcmFtVGVtcCsrOworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSAqcFBhcmFtVGVtcDsKKyAgICAgICAgICAgIHVpbnQzMl90IG5iQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMyAqIG5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZSAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgc3RhdHVzID0gVmlydHVhbGl6ZXJJc0NvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVMgc3VwcG9ydHMgbWFzaz0weCV4IGRldmljZT0weCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGlzIHN1cHBvcnRlZCwgZ2V0IHRoZSBhbmdsZXMKKyAgICAgICAgICAgICAgICBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoY2hhbm5lbE1hc2ssIGRldmljZVR5cGUsIChpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBlbmQiKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kIHJldHVybmluZyBzdGF0dXM9JWQiLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMTk2Myw2ICsyMTcxLDE1IEBACiAgICAgICAgICAgICBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVmlydHVhbGl6ZXItPnNldFN0cmVuZ3RoIik7CiAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERTogeworICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAqKGF1ZGlvX2RldmljZXNfdCAqKSBwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKHBDb250ZXh0LCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIC8vQUxPR1YoIlZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPTB4JXggcmVzdWx0PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICBkZXZpY2VUeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE5OTQsNyArMjIxMSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTIyNTIsNyArMjQ2OSw3IEBACiAKIGludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50IGJNdXRlID0gMDsKQEAgLTI4MzAsNyArMzA0Nyw3IEBACiAgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKICAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKQEAgLTI4NDEsOCArMzA1OCw4IEBACiAKICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CiAgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCkBAIC0yODcwLDcgKzMwODcsNyBAQAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgpAQCAtMjkxOCw2ICszMTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CisgICAgICAgICAgICAgIC8vIFdhcm5pbmcgdGhpcyBsb2cgd2lsbCBmYWlsIHRvIHByb3Blcmx5IHJlYWQgYW4gaW50MzJfdCB2YWx1ZSwgYXNzdW1lcyBpbnQxNl90CiAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAogICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCkBAIC0zMDIzLDYgKzMyNDEsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkgZGV2aWNlOwogCiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKQEAgLTMwNTgsMzcgKzMyNzcsMzggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyBpbnZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+blZpcnR1YWxpemVyRm9yY2VkRGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSB1bmxlc3MgY29uZmlndXJhdGlvbiBpcyBmb3JjZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OlZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKIAotICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgdmlydHVhbGl6ZXIgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBiZSBjaGFuZ2VkIGJ5IHRoZSBFTkFCTEUvRElTQUJMRSBjb21tYW5kCiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlZCBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAotCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHJlLWVuYWJsZSBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIGVsc2UgdmlydHVhbGl6YXRpb24gbW9kZSBpcyBmb3JjZWQgdG8gYSBjZXJ0YWluIGRldmljZSwgbm90aGluZyB0byBkbwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMzMwYmIzMi4uNDIwZjk3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTczLDYgKzczLDggQEAKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzVGVtcERpc2FibGVkOyAgICAgICAgLyogRmxhZyBmb3IgQmFzcyB0byBiZSByZS1lbmFibGVkICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJFbmFibGVkOyAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7IC8qIEZsYWcgZm9yIGVmZmVjdCB0byBiZSByZS1lbmFibGVkICovCisgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgICBuT3V0cHV0RGV2aWNlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgZm9yIHRoZSBlZmZlY3QgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBhNzk2ZDJmLi40ZGM4YjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bmV3PgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG5ldz4KKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RSZXZlcmIuaCIKIC8vIGZyb20gUmV2ZXJiL2xpYgogI2luY2x1ZGUgIkxWUkVWLmgiCkBAIC0xODEsNyArMTgzLDcgQEAKIGludCAgUmV2ZXJiX3NldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIGludCAgUmV2ZXJiX2dldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKIGludCBSZXZlcmJfTG9hZFByZXNldCAgICAgICAoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCk7CiAKQEAgLTI2OSw3ICsyNzEsNyBAQAogICAgIHBDb250ZXh0LT5JbkZyYW1lczMyICA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MoTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOwogCi0gICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICVkIiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICV6dSIsIHBDb250ZXh0LCBzaXplb2YoUmV2ZXJiQ29udGV4dCkpOwogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmRcbiIpOwogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCkBAIC01NzAsMTUgKzU3MiwxNSBAQAogICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gU1RBUlQgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKIAogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gRU5EICAgZnJlZWluZyAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogZnJlZSgpIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJSIgUFJJdTMyICIgYnl0ZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KQEAgLTc3MSwxMSArNzczLDEyIEBACiAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOwogCiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwogICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJSIgUFJJdTMyCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzg3LDExICs3OTAsMTEgQEAKICAgICBpZihiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSl7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7CiAgICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSAtIE5vdCBmcmVlaW5nXG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwogICAgICAgICAgICAgfQpAQCAtMTUzNCw3ICsxNTM3LDcgQEAKIAogaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSl7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOwpAQCAtMTk3NCw3ICsxOTc3LDcgQEAKIAogICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6UmV2ZXJiX2dldFBhcmFtZXRlcihwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCA5ZThjYjgzLi5lYTNjNTlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDcgQEAKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKLWlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKLUxPQ0FMX0xETElCUyArPSAtbGRsCi1lbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi1lbmRpZgotCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggYmU0ZmE3ZS4uNmRkNDQzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtNzcsNyArNzcsNyBAQAogICAgIHZvaWQgKCogZW5hYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgdm9pZCAoKiBkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7CiAgICAgaW50ICgqIHNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdm9pZCAqdmFsdWUpOwotICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHNpemVfdCAqc2l6ZSwgdm9pZCAqdmFsdWUpOworICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHVpbnQzMl90ICpzaXplLCB2b2lkICp2YWx1ZSk7CiAgICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOwogfTsKIApAQCAtMjkxLDcgKzI5MSw3IEBACiAKIGludCBBZ2NHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTQ1Miw5ICs0NTIsOSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICAgICplZmZlY3QsCitpbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAqcFZhbHVlU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSkKIHsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTg4MSw4ICs4ODEsOCBAQAogaW50IFNlc3Npb25fU2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKIHsKICAgICB1aW50MzJfdCBzcjsKLSAgICB1aW50MzJfdCBpbkNubCA9IHBvcGNvdW50KGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIHVpbnQzMl90IG91dENubCA9IHBvcGNvdW50KGNvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSB8fAogICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAgICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgdWludDMyX3QgaW5DbmwgPSBwb3Bjb3VudChjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICB1aW50MzJfdCBpbkNubCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBpbnQgc3RhdHVzID0gc2Vzc2lvbi0+YXBtLT5zZXRfbnVtX3JldmVyc2VfY2hhbm5lbHMoaW5DbmwpOwogICAgIGlmIChzdGF0dXMgPCAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTIzNSw4ICsxMjM1LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzSW47Ci0gICAgICAgICAgICBzaXplX3QgZnJPdXQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZySW4gPSBzZXNzaW9uLT5mcmFtZXNJbjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTEyOTIsOCArMTI5Miw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJPdXQgPSBzZXNzaW9uLT5mcmFtZUNvdW50OwogICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpIHsKICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnQoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+Z2V0X3BhcmFtZXRlcikgewogICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogICAgICAgICAgICAgfQpAQCAtMTc1Nyw4ICsxNzU3LDggQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNSZXYgPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKLSAgICAgICAgICAgIHNpemVfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CisgICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc1JldjsKKyAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmFwbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5yZXZSZXNhbXBsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggOGQwMDIwNi4uM2NiMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMTE1LDcgKzExNSw3IEBACiAKIGludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCk7CiBpbnQgRXF1YWxpemVyX3NldENvbmZpZyhFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCBzaXplX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdWludDMyX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CiBpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKIAogCkBAIC0zNjAsNyArMzYwLDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKQoraW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHVpbnQzMl90ICpwVmFsdWVTaXplLCB2b2lkICpwVmFsdWUpCiB7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKQEAgLTY2Miw4ICs2NjIsOCBAQAogICAgICAgICBFcXVhbGl6ZXJfc2V0Q29uZmlnKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKICAgICAgICAgQUxPR1YoIkVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGEgJXAiLAogICAgICAgICAgICAgIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCmluZGV4IGMzN2YzOTIuLmYwNTZkMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLWludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwKK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLAogICAgICAgICB2b2lkICpwVmFsdWUpIHsKICAgICBpbnQzMl90ICpwVmFsdWUzMjsKICAgICBpbnQxNl90ICpwVmFsdWUxNjsKQEAgLTc1OCw3ICs3NTgsNyBAQAogICAgIGludDMyX3QgaTsKICAgICBpbnQzMl90IHRlbXA7CiAgICAgaW50MzJfdCB0ZW1wMjsKLSAgICBzaXplX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBzaXplOwogCiAgICAgaWYgKHBSZXZlcmItPm1fUHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8ICpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewpAQCAtMTAzMyw3ICsxMDMzLDcgQEAKICAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgdm9pZCAqcFZhbHVlKSB7CiAgICAgaW50MzJfdCB2YWx1ZTMyOwogICAgIGludDE2X3QgdmFsdWUxNjsKQEAgLTEwNDQsNyArMTA0NCw3IEBACiAgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0OwogICAgIGludCBtYXhTYW1wbGVzOwogICAgIGludDMyX3QgYXZlcmFnZURlbGF5OwotICAgIHNpemVfdCBwYXJhbVNpemU7CisgICAgdWludDMyX3QgcGFyYW1TaXplOwogCiAgICAgQUxPR1YoIlJldmVyYl9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKICAgICAgICAgICAgIHBSZXZlcmIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RSZXZlcmIuaAppbmRleCBlNTI0OGZlLi43NTZjNWVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmgKQEAgLTMzMCw4ICszMzAsOCBAQAogdm9pZCBSZXZlcmJfZ2V0Q29uZmlnKHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKIHZvaWQgUmV2ZXJiX1Jlc2V0KHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgYm9vbCBpbml0KTsKIAotaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIgKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogUmV2ZXJiVXBkYXRlWGZhZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggZGQyZDMwNi4uYzkyYzU0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTE3LDcgKzE3LDYgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCBiZDI5Y2RjLi45MWY5ZmM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0xNiw4ICsxNiw5IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0VmlzdWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bmV3PgpAQCAtMjA3LDcgKzIwOCw4IEBACiAgICAgcENvbnRleHQtPm1TY2FsaW5nTW9kZSA9IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQ7CiAKICAgICAvLyBtZWFzdXJlbWVudCBpbml0aWFsaXphdGlvbgotICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0gcG9wY291bnQocENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgPSBNRUFTVVJFTUVOVF9NT0RFX05PTkU7CiAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMgPSBNRUFTVVJFTUVOVF9XSU5ET1dfTUFYX1NJWkVfSU5fQlVGRkVSUzsKICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKQEAgLTIyNyw4ICsyMjksOCBAQAogLy8KIAogaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qaW9JZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CkBAIC00MTksNyArNDIxLDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0vLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisvLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00ODUsMTkgKzQ4NywxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoKih1aW50MzJfdCAqKXAtPmRhdGEpIHsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKICAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fU0NBTElOR19NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlZCIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOworICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bVNjYWxpbmdNb2RlOwogICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9NRUFTVVJFTUVOVF9NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGU7CiAgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAqcmVwbHlTaXplICs9IHNpemVvZih1aW50MzJfdCk7CkBAIC01MjEsMTkgKzUyMywxOSBAQAogICAgICAgICBzd2l0Y2ggKCoodWludDMyX3QgKilwLT5kYXRhKSB7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICVkIiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX1NDQUxJTkdfTU9ERToKICAgICAgICAgICAgIHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPSAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJWQiLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWToKICAgICAgICAgICAgIHBDb250ZXh0LT5tTGF0ZW5jeSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTGF0ZW5jeSA9ICVkIiwgcENvbnRleHQtPm1MYXRlbmN5KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbUxhdGVuY3kgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTGF0ZW5jeSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX01FQVNVUkVNRU5UX01PREU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CkBAIC01NTMsNDkgKzU1NSw0OSBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgPT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zID0gcENvbnRleHQtPm1MYXRlbmN5OwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGVsdGFNcyA9IFZpc3VhbGl6ZXJfZ2V0RGVsdGFUaW1lTXNGcm9tVXBkYXRlZFRpbWUocENvbnRleHQpOwotICAgICAgICAgICAgbGF0ZW5jeU1zIC09IGRlbHRhTXM7Ci0gICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgewotICAgICAgICAgICAgICAgIGxhdGVuY3lNcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPSBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOwotCi0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVQb2ludCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeCAtIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7Ci0gICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVTaXplID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgIGlmIChjYXB0dXJlUG9pbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGNhcHR1cmVTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjYXB0dXJlU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIENBUFRVUkVfQlVGX1NJWkUgKyBjYXB0dXJlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPSAoY2hhciAqKXBSZXBseURhdGEgKyBzaXplOwotICAgICAgICAgICAgICAgIGNhcHR1cmVTaXplIC09IHNpemU7Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAotICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKLSAgICAgICAgICAgICAgICAgICBjYXB0dXJlU2l6ZSk7Ci0KIAogICAgICAgICAgICAgLy8gaWYgYXVkaW8gZnJhbWV3b3JrIGhhcyBzdG9wcGVkIHBsYXlpbmcgYXVkaW8gYWx0aG91Z2ggdGhlIGVmZmVjdCBpcyBzdGlsbAogICAgICAgICAgICAgLy8gYWN0aXZlIHdlIG11c3QgY2xlYXIgdGhlIGNhcHR1cmUgYnVmZmVyIHRvIHJldHVybiBzaWxlbmNlCiAgICAgICAgICAgICBpZiAoKHBDb250ZXh0LT5tTGFzdENhcHR1cmVJZHggPT0gcENvbnRleHQtPm1DYXB0dXJlSWR4KSAmJgotICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPm1CdWZmZXJVcGRhdGVUaW1lLnR2X3NlYyAhPSAwKSkgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YU1zID4gTUFYX1NUQUxMX1RJTUVfTVMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHBDb250ZXh0LT5tQnVmZmVyVXBkYXRlVGltZS50dl9zZWMgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbHRhTXMgPiBNQVhfU1RBTExfVElNRV9NUykpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNhcHR1cmUgZ29pbmcgdG8gaWRsZSIpOwogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUJ1ZmZlclVwZGF0ZVRpbWUudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQocFJlcGx5RGF0YSwgMHg4MCwgY2FwdHVyZVNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxhdGVuY3lNcyA9IHBDb250ZXh0LT5tTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICBsYXRlbmN5TXMgLT0gZGVsdGFNczsKKyAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsYXRlbmN5TXMgPSAwOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWx0YVNtcGwgPQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBsYXRlbmN5TXMgLyAxMDAwOworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwdHVyZVBvaW50ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4IC0gY2FwdHVyZVNpemUgLSBkZWx0YVNtcGw7CisKKyAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVBvaW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBjYXB0dXJlU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNhcHR1cmVTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1DYXB0dXJlQnVmICsgQ0FQVFVSRV9CVUZfU0laRSArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID0gKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUgLT0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVBvaW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZiArIGNhcHR1cmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNpemUpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwQ29udGV4dC0+bUxhc3RDYXB0dXJlSWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgbWVtc2V0KHBSZXBseURhdGEsIDB4ODAsIGNhcHR1cmVTaXplKTsKICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgIH0gYnJlYWs7CiAKICAgICBjYXNlIFZJU1VBTElaRVJfQ01EX01FQVNVUkU6IHsKICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApAQCAtNjEzLDcgKzYxNSw3IEBACiAgICAgICAgIC8vIG1lYXN1cmVtZW50cyBhcmVuJ3QgcmVsZXZhbnQgYW55bW9yZSBhbmQgc2hvdWxkbid0IGJpYXMgdGhlIG5ldyBvbmUpCiAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsYXlNcyA9IFZpc3VhbGl6ZXJfZ2V0RGVsdGFUaW1lTXNGcm9tVXBkYXRlZFRpbWUocENvbnRleHQpOwogICAgICAgICBpZiAoZGVsYXlNcyA+IERJU0NBUkRfTUVBU1VSRU1FTlRTX1RJTUVfTVMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIG1lYXN1cmVtZW50cywgbGFzdCBtZWFzdXJlbWVudCBpcyAlZG1zIG9sZCIsIGRlbGF5TXMpOworICAgICAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgbWVhc3VyZW1lbnRzLCBsYXN0IG1lYXN1cmVtZW50IGlzICUiIFBSSWQzMiAibXMgb2xkIiwgZGVsYXlNcyk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8cENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMgOyBpKyspIHsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbaV0ubUlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbaV0ubVBlYWtVMTYgPSAwOwpAQCAtNjQ3LDE0ICs2NDksMTQgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBJbnRSZXBseURhdGFbTUVBU1VSRU1FTlRfSURYX1BFQUtdID0gKGludDMyX3QpICgyMDAwICogbG9nMTAocGVha1UxNiAvIDMyNzY3LjBmKSk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZJU1VBTElaRVJfQ01EX01FQVNVUkUgcGVhaz0lZCAoJWRtQiksIHJtcz0lLjFmICglZG1CKSIsCisgICAgICAgIEFMT0dWKCJWSVNVQUxJWkVSX0NNRF9NRUFTVVJFIHBlYWs9JSIgUFJJdTE2ICIgKCUiIFBSSWQzMiAibUIpLCBybXM9JS4xZiAoJSIgUFJJZDMyICJtQikiLAogICAgICAgICAgICAgICAgIHBlYWtVMTYsIHBJbnRSZXBseURhdGFbTUVBU1VSRU1FTlRfSURYX1BFQUtdLAogICAgICAgICAgICAgICAgIHJtcywgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUk1TXSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVmlzdWFsaXplcl9jb21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJWaXN1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggNmRiY2E1MS4uYjFmYmI1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC0yNSw2ICsyNSw5IEBACiAgICAgQXVkaW9SZWNvcmQuY3BwIFwKICAgICBBdWRpb1N5c3RlbS5jcHAgXAogICAgIG1lZGlhcGxheWVyLmNwcCBcCisgICAgSU1lZGlhQ29kZWNMaXN0LmNwcCBcCisgICAgSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIFwKKyAgICBJTWVkaWFIVFRQU2VydmljZS5jcHAgXAogICAgIElNZWRpYUxvZ1NlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBcCiAgICAgSU1lZGlhUGxheWVyQ2xpZW50LmNwcCBcCkBAIC0zNCw2ICszNyw3IEBACiAgICAgSVJlbW90ZURpc3BsYXkuY3BwIFwKICAgICBJUmVtb3RlRGlzcGxheUNsaWVudC5jcHAgXAogICAgIElTdHJlYW1Tb3VyY2UuY3BwIFwKKyAgICBNZWRpYUNvZGVjSW5mby5jcHAgXAogICAgIE1lZGlhVXRpbHMuY3BwIFwKICAgICBNZXRhZGF0YS5jcHAgXAogICAgIG1lZGlhcmVjb3JkZXIuY3BwIFwKQEAgLTQzLDkgKzQ3LDEwIEBACiAgICAgSmV0UGxheWVyLmNwcCBcCiAgICAgSU9NWC5jcHAgXAogICAgIElBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBcCiAgICAgTWVkaWFTY2FubmVyLmNwcCBcCiAgICAgTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBcCi0gICAgYXV0b2RldGVjdC5jcHAgXAorICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIFwKICAgICBJTWVkaWFEZWF0aE5vdGlmaWVyLmNwcCBcCiAgICAgTWVkaWFQcm9maWxlcy5jcHAgXAogICAgIElFZmZlY3QuY3BwIFwKQEAgLTU5LDI2ICs2NCwzNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgKz0gLi4vbGlibmJhaW8vcm91bmR1cC5jCiAKLSMgZm9yIDxjdXRpbHMvYXRvbWljLWlubGluZS5oPgotTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9TTVA9JChpZiAkKGZpbmRzdHJpbmcgdHJ1ZSwkKFRBUkdFVF9DUFVfU01QKSksMSwwKQotTE9DQUxfU1JDX0ZJTEVTICs9IFNpbmdsZVN0YXRlUXVldWUuY3BwCi1MT0NBTF9DRkxBR1MgKz0gLURTSU5HTEVfU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTaW5nbGVTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLSMgQ29uc2lkZXIgYSBzZXBhcmF0ZSBhIGxpYnJhcnkgZm9yIFNpbmdsZVN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy4KLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJleHBhdCBcCisJbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJpY3VpMThuIGxpYmV4cGF0IFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMKKyAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMgbGlibmJhaW8KIAotTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUlkgOj0gbGlibWVkaWFfaGVscGVyCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJtZWRpYV9oZWxwZXIKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWEKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgIGV4dGVybmFsL2ljdTRjL2NvbW1vbiBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS8gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKyAgICAkKFRPUCkvZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9jb21tb24gXAorICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIGZvciA8Y3V0aWxzL2F0b21pYy1pbmxpbmUuaD4KK0xPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfU01QPSQoaWYgJChmaW5kc3RyaW5nIHRydWUsJChUQVJHRVRfQ1BVX1NNUCkpLDEsMCkKK0xPQ0FMX1NSQ19GSUxFUyArPSBTaW5nbGVTdGF0ZVF1ZXVlLmNwcAorTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1NUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJpbnN0YW50c3NxCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKaW5kZXggOGRmZmZiMy4uMGQ1ZDdlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApAQCAtMTQ1LDE1ICsxNDUsMTkgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQogCi0gICAgbUlFZmZlY3QgPSBpRWZmZWN0OwogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrLT5idWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogCiAgICAgaUVmZmVjdC0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwotICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCIsIHRoaXMsIG1EZXNjcmlwdG9yLm5hbWUsIG1JZCwKLSAgICAgICAgICAgIG1TdGF0dXMsIG1FbmFibGVkKTsKKyAgICBtQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCBwaWQgJWQiLCB0aGlzLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsCisgICAgICAgICAgICBtU3RhdHVzLCBtRW5hYmxlZCwgbUNsaWVudFBpZCk7CisKKyAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOworICAgIH0KIAogICAgIHJldHVybiBtU3RhdHVzOwogfQpAQCAtMTY0LDYgKzE2OCw5IEBACiAgICAgQUxPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKIAogICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SIHx8IG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgaWYgKG1TZXNzaW9uSWQgPiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1JRWZmZWN0ICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1JRWZmZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICBtSUVmZmVjdC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtSUVmZmVjdENsaWVudCk7CkBAIC0zODAsOSArMzg3LDkgQEAKIH0KIAogdm9pZCBBdWRpb0VmZmVjdDo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXBseURhdGEpCiB7CiAgICAgaWYgKGNtZERhdGEgPT0gTlVMTCB8fCByZXBseURhdGEgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGNjYmM1YTMuLjllN2JhODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTE4LDcgKzE4LDkgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZWNvcmQiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTQxLDM3ICs0MywzMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIGRlZmF1bHQgdG8gMCBpbiBjYXNlIG9mIGVycm9yCi0gICAgKmZyYW1lQ291bnQgPSAwOwotCi0gICAgc2l6ZV90IHNpemUgPSAwOworICAgIHNpemVfdCBzaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJnNpemUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtIGNvdWxkIG5vdCBxdWVyeSB0aGUgaW5wdXQgYnVmZmVyIHNpemU7IHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3Igc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4OyBzdGF0dXMgJWQiLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAvLyBXZSBkb3VibGUgdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGZvciBwaW5nIHBvbmcgdXNlIG9mIHJlY29yZCBidWZmZXIuCisgICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICBpZiAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgKgorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSkgPT0gMCkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIFdlIGRvdWJsZSB0aGUgc2l6ZSBvZiBpbnB1dCBidWZmZXIgZm9yIHBpbmcgcG9uZyB1c2Ugb2YgcmVjb3JkIGJ1ZmZlci4KLSAgICBzaXplIDw8PSAxOwotCi0gICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7Ci0gICAgc2l6ZSAvPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0KLSAgICAqZnJhbWVDb3VudCA9IHNpemU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKCkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoMCksCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLCBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCkKIHsKIH0KQEAgLTgxLDIwICs3NiwyMCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBpbnQgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZCgwKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUHJveHkoTlVMTCkKIHsKICAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBjYmYsIHVzZXIsCi0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtMTEwLDEyICsxMDUsMTIgQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb1JlY29yZC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7Ci0gICAgICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQorICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOworICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKKyAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgLTEpOwogICAgIH0KIH0KIApAQCAtMTI0LDE1ICsxMTksMjAgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnRJbnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhLAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKKyAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MpOworCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCB0aHJlYWRDYW5DYWxsSmF2YSkgewpAQCAtMTU2LDIzICsxNTYsMTUgQEAKICAgICB9CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgLy8gRklYTUUgImludCIgaGVyZSBpcyBsZWdhY3kgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgc2l6ZV90IGxhdGVyCi0gICAgaWYgKGZyYW1lQ291bnRJbnQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIGNvdW50ICVkIiwgZnJhbWVDb3VudEludCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudEludDsKLQotICAgIEFMT0dWKCJzZXQoKTogc2FtcGxlUmF0ZSAldSwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV1Iiwgc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBmcmFtZUNvdW50KTsKLQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKIAorICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewogICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KQEAgLTE5MSwxMiArMTgzLDEyIEBACiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJWQiLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gVGVtcG9yYXJ5IHJlc3RyaWN0aW9uOiBBdWRpb0ZsaW5nZXIgY3VycmVudGx5IHN1cHBvcnRzIDE2LWJpdCBQQ00gb25seQogICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIkZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IHN1cHBvcnRlZCIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CkBAIC0yMDYsNjEgKzE5OCw1MCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChjaGFubmVsTWFzayk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKLSAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgZWxzZSBzaXplb2YodWludDhfdCkKLSAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotCi0gICAgLy8gdmFsaWRhdGUgZnJhbWVjb3VudAotICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1JlY29yZDo6Z2V0TWluRnJhbWVDb3VudCgmbWluRnJhbWVDb3VudCwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldE1pbkZyYW1lQ291bnQoKSBmYWlsZWQ7IHN0YXR1cyAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GcmFtZVNpemUgPSBzaXplb2YodWludDhfdCk7CiAgICAgfQotICAgIEFMT0dWKCJBdWRpb1JlY29yZDo6c2V0KCkgbWluRnJhbWVDb3VudCA9ICVkIiwgbWluRnJhbWVDb3VudCk7CiAKLSAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwotICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKLSAgICAgICAgQUxPR0UoImZyYW1lQ291bnQgJXUgPCBtaW5GcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBtRnJhbWVDb3VudCBpcyBpbml0aWFsaXplZCBpbiBvcGVuUmVjb3JkX2wKKyAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOworICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gb3BlblJlY29yZF9sCiAKLSAgICBpZiAoc2Vzc2lvbklkID09IDAgKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAgICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CiAKICAgICBtRmxhZ3MgPSBmbGFnczsKLQotICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQorICAgIG1DYmYgPSBjYmY7CiAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gbmV3IEF1ZGlvUmVjb3JkVGhyZWFkKCp0aGlzLCB0aHJlYWRDYW5DYWxsSmF2YSk7CiAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cnVuKCJBdWRpb1JlY29yZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIH0KIAorICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovKTsKKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9SZWNvcmQuaAorICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgLy8gVXBkYXRlIGJ1ZmZlciBzaXplIGluIGNhc2UgaXQgaGFzIGJlZW4gbGltaXRlZCBieSBBdWRpb0ZsaW5nZXIgZHVyaW5nIHRyYWNrIGNyZWF0aW9uCi0gICAgbUZyYW1lQ291bnQgPSBtQ2Jsay0+ZnJhbWVDb3VudF87Ci0KICAgICBtQWN0aXZlID0gZmFsc2U7Ci0gICAgbUNiZiA9IGNiZjsKLSAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKICAgICAvLyBUT0RPOiBhZGQgYXVkaW8gaGFyZHdhcmUgaW5wdXQgbGF0ZW5jeSBoZXJlCiAgICAgbUxhdGVuY3kgPSAoMTAwMCptRnJhbWVDb3VudCkgLyBzYW1wbGVSYXRlOwpAQCAtMjY4LDcgKzI0OSw3IEBACiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlcXVlbmNlID0gMTsKICAgICBtT2JzZXJ2ZWRTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBtSW5PdmVycnVuID0gZmFsc2U7CkBAIC0yODksNiArMjcwLDkgQEAKIAogICAgIC8vIHJlc2V0IGN1cnJlbnQgcG9zaXRpb24gYXMgc2VlbiBieSBjbGllbnQgdG8gMAogICAgIG1Qcm94eS0+c2V0RXBvY2gobVByb3h5LT5nZXRFcG9jaCgpIC0gbVByb3h5LT5nZXRQb3NpdGlvbigpKTsKKyAgICAvLyBmb3JjZSByZWZyZXNoIG9mIHJlbWFpbmluZyBmcmFtZXMgYnkgcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgbGFzdAorICAgIC8vIHJlYWQgYmVmb3JlIHN0b3AgY291bGQgYmUgcGFydGlhbC4KKyAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOwogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT5tRmxhZ3MpOwpAQCAtMzUyLDYgKzMzNiw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNYXJrZXJQb3NpdGlvbih1aW50MzJfdCBtYXJrZXIpCiB7CisgICAgLy8gVGhlIG9ubHkgcHVycG9zZSBvZiBzZXR0aW5nIG1hcmtlciBwb3NpdGlvbiBpcyB0byBnZXQgYSBjYWxsYmFjawogICAgIGlmIChtQ2JmID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTM3Nyw2ICszNjIsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgdXBkYXRlUGVyaW9kKQogeworICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCiAgICAgaWYgKG1DYmYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNDEyLDcgKzM5OCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi11bnNpZ25lZCBpbnQgQXVkaW9SZWNvcmQ6OmdldElucHV0RnJhbWVzTG9zdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKIHsKICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIG1BY3RpdmUsIGJlY2F1c2UgaWYgaW5hY3RpdmUgdGhpcyB3aWxsIHJldHVybiAwLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChnZXRJbnB1dCgpKTsKQEAgLTQzMCw1NiArNDE2LDc5IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgdHJhY2tGbGFncyA9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQ7Ci0gICAgcGlkX3QgdGlkID0gLTE7CisgICAgLy8gRmFzdCB0cmFja3MgbXVzdCBiZSBhdCB0aGUgcHJpbWFyeSBfb3V0cHV0XyBbc2ljXSBzYW1wbGluZyByYXRlLAorICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgY3VycmVudGx5IG5vIGNvbmNlcHQgb2YgYSBwcmltYXJ5IGlucHV0IHNhbXBsaW5nIHJhdGUKKyAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGUgPSBBdWRpb1N5c3RlbTo6Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOworICAgIGlmIChhZlNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HVygiZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSBmYWlsZWQiKTsKKyAgICB9CiAKICAgICAvLyBDbGllbnQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCi0gICAgLy8gVGhlIG9ubHkgc3VwcG9ydGVkIHVzZSBjYXNlIGZvciBGQVNUIGlzIGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUuCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICYmICEoCisgICAgICAgICAgICAvLyB1c2UgY2FzZTogY2FsbGJhY2sgdHJhbnNmZXIgbW9kZQorICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSykgJiYKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCisgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKKyAgICAgICAgQUxPR1coIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50Iik7CisgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZAorICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOworICAgIH0KKworICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgdHJhY2tGbGFncyA9IElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQ7CisKKyAgICBwaWRfdCB0aWQgPSAtMTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgIGlmICgobVRyYW5zZmVyICE9IFRSQU5TRkVSX0NBTExCQUNLKSB8fCAobUF1ZGlvUmVjb3JkVGhyZWFkID09IDApKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKLSAgICAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZAotICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVDsKKyAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOworICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIHRpZCA9IG1BdWRpb1JlY29yZFRocmVhZC0+Z2V0VGlkKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKLQotICAgIGlmICghKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgb3ZlcnJ1bgotICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwIHx8IG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPiBtRnJhbWVDb3VudC8yKSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbUZyYW1lQ291bnQvMjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQpOwotICAgIGlmIChpbnB1dCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgbUlucHV0U291cmNlKTsKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgbUZsYWdzKTsKKyAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gaW5wdXQgZm9yIHJlY29yZCBzb3VyY2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgJSN4LCBzZXNzaW9uICVkLCBmbGFncyAlI3giLAorICAgICAgICAgICAgICBtSW5wdXRTb3VyY2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsIG1GbGFncyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKKyAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCiAKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IG1SZXFGcmFtZUNvdW50OworICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwogICAgIGludCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisKKyAgICAvLyBUaGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50IGlzIHRoZSBwZXJpb2QgYmV0d2VlbiBjYWxsYmFja3MsIGFzIHN1Z2dlc3RlZCBieSB0aGUgc2VydmVyLgorICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOworCisgICAgc3A8SU1lbW9yeT4gaU1lbTsgICAgICAgICAgIC8vIGZvciBjYmxrCisgICAgc3A8SU1lbW9yeT4gYnVmZmVyTWVtOwogICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gYXVkaW9GbGluZ2VyLT5vcGVuUmVjb3JkKGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKLSAgICBBTE9HRV9JRihvcmlnaW5hbFNlc3Npb25JZCAhPSAwICYmIG1TZXNzaW9uSWQgIT0gb3JpZ2luYWxTZXNzaW9uSWQsCisgICAgQUxPR0VfSUYob3JpZ2luYWxTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSAmJiBtU2Vzc2lvbklkICE9IG9yaWdpbmFsU2Vzc2lvbklkLAogICAgICAgICAgICAgInNlc3Npb24gSUQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb3JpZ2luYWxTZXNzaW9uSWQsIG1TZXNzaW9uSWQpOwogCi0gICAgaWYgKHJlY29yZCA9PSAwIHx8IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW5wdXQpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQotICAgIHNwPElNZW1vcnk+IGlNZW0gPSByZWNvcmQtPmdldENibGsoKTsKKyAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CisKKyAgICAvLyBBdWRpb0ZsaW5nZXIgbm93IG93bnMgdGhlIHJlZmVyZW5jZSB0byB0aGUgSS9PIGhhbmRsZSwKKyAgICAvLyBzbyB3ZSBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisKICAgICBpZiAoaU1lbSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODksMzcgKzQ5OCw2NyBAQAogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKKworICAgIC8vIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgYnVmZmVycyBpbiBzaGFyZWQgbWVtb3J5LgorICAgIC8vIFRoZSBidWZmZXJzIGFyZSBlaXRoZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnRyb2wgYmxvY2ssCisgICAgLy8gb3IgaW4gYSBzZXBhcmF0ZSBhcmVhIGF0IGRpc2NyZXRpb24gb2Ygc2VydmVyLgorICAgIHZvaWQgKmJ1ZmZlcnM7CisgICAgaWYgKGJ1ZmZlck1lbSA9PSAwKSB7CisgICAgICAgIGJ1ZmZlcnMgPSBjYmxrICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJzID0gYnVmZmVyTWVtLT5wb2ludGVyKCk7CisgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewogICAgICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KLSAgICBtSW5wdXQgPSBpbnB1dDsKICAgICBtQXVkaW9SZWNvcmQgPSByZWNvcmQ7CiAgICAgbUNibGtNZW1vcnkgPSBpTWVtOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKKyAgICBtQnVmZmVyTWVtb3J5ID0gYnVmZmVyTWVtOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKwogICAgIG1DYmxrID0gY2JsazsKLSAgICAvLyBGSVhNRSBtaXNzaW5nIGZhc3QgdHJhY2sgZnJhbWVDb3VudCBsb2dpYworICAgIC8vIG5vdGUgdGhhdCB0ZW1wIGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgZnJhbWVDb3VudAorICAgIGlmICh0ZW1wIDwgZnJhbWVDb3VudCB8fCAoZnJhbWVDb3VudCA9PSAwICYmIHRlbXAgPT0gMCkpIHsKKyAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICB9CisgICAgZnJhbWVDb3VudCA9IHRlbXA7CisKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXUiLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsIGR1ZSB0byB0aWdodGVyIHNjaGVkdWxpbmcKLSAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IG1GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV1IiwgbUZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR1YoIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0ZBU1QpOwotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbUZyYW1lQ291bnQvMikgewotICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtRnJhbWVDb3VudC8yOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gc3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkKLSAgICB2b2lkICpidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuCisgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lcyA9PSAwIHx8IG5vdGlmaWNhdGlvbkZyYW1lcyA+IGZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coIlJlY2VpdmVkIG5vdGlmaWNhdGlvbkZyYW1lcyAlenUgZm9yIGZyYW1lQ291bnQgJXp1Iiwgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICB9CisgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG5vdGlmaWNhdGlvbkZyYW1lczsKKworICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQorICAgIG1JbnB1dCA9IGlucHV0OworICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKKworICAgIG1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAvLyBJZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAorICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgorICAgIGlmIChmcmFtZUNvdW50ID4gbVJlcUZyYW1lQ291bnQpIHsKKyAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQogICAgIG1Qcm94eSA9IG5ldyBBdWRpb1JlY29yZENsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKQEAgLTUzMCw2ICs1NjksMTQgQEAKICAgICBtQXVkaW9SZWNvcmQtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQpCkBAIC01ODAsNiArNjI3LDcgQEAKICAgICAgICAgLy8ga2VlcCB0aGVtIGZyb20gZ29pbmcgYXdheSBpZiBhbm90aGVyIHRocmVhZCByZS1jcmVhdGVzIHRoZSB0cmFjayBkdXJpbmcgb2J0YWluQnVmZmVyKCkKICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnRQcm94eT4gcHJveHk7CiAgICAgICAgIHNwPElNZW1vcnk+IGlNZW07CisgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlck1lbTsKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RhcnQgb2YgbG9jayBzY29wZQogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtNTkxLDYgKzYzOSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKG5ld1NlcXVlbmNlID09IG9sZFNlcXVlbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgib2J0YWluQnVmZmVyIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tRnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubVJhdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIubU5vbkNvbnRpZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTYwMCw2ICs2NTEsNyBAQAogICAgICAgICAgICAgLy8gS2VlcCB0aGUgZXh0cmEgcmVmZXJlbmNlcwogICAgICAgICAgICAgcHJveHkgPSBtUHJveHk7CiAgICAgICAgICAgICBpTWVtID0gbUNibGtNZW1vcnk7CisgICAgICAgICAgICBidWZmZXJNZW0gPSBtQnVmZmVyTWVtb3J5OwogCiAgICAgICAgICAgICAvLyBOb24tYmxvY2tpbmcgaWYgdHJhY2sgaXMgc3RvcHBlZAogICAgICAgICAgICAgaWYgKCFtQWN0aXZlKSB7CkBAIC02NjAsNyArNzEyLDcgQEAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBzYW5pdHktY2hlY2suIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1JlY29yZDo6cmVhZChidWZmZXI9JXAsIHNpemU9JXUgKCVkKSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC02OTIsNyArNzQ0LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1uc2Vjc190IEF1ZGlvUmVjb3JkOjpwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCituc2Vjc190IEF1ZGlvUmVjb3JkOjpwcm9jZXNzQXVkaW9CdWZmZXIoKQogewogICAgIG1Mb2NrLmxvY2soKTsKICAgICBpZiAobUF3YWl0Qm9vc3QpIHsKQEAgLTc2MCwxNyArODEyLDE3IEBACiAgICAgfQogCiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgotICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OworICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CiAgICAgaWYgKG1SZWZyZXNoUmVtYWluaW5nKSB7CiAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nID0gZmFsc2U7CiAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgPSBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlciA9IGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgbWlzYWxpZ25tZW50ID0gbVByb3h5LT5nZXRNaXNhbGlnbm1lbnQoKTsKLSAgICBpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOworICAgIHVpbnQzMl90IHNlcXVlbmNlID0gbVNlcXVlbmNlOwogCiAgICAgLy8gVGhlc2UgZmllbGRzIGRvbid0IG5lZWQgdG8gYmUgY2FjaGVkLCBiZWNhdXNlIHRoZXkgYXJlIGFzc2lnbmVkIG9ubHkgYnkgc2V0KCk6Ci0gICAgLy8gICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbVNhbXBsZVJhdGUKKyAgICAvLyAgICAgIG1UcmFuc2ZlciwgbUNiZiwgbVVzZXJEYXRhLCBtU2FtcGxlUmF0ZSwgbUZyYW1lU2l6ZQogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAKQEAgLTg0MSwxMSArODkzLDExIEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV1ID0gJXUgKyAldSIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZyk7CisgICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAorICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04NzIsOCArOTI0LDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICVkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgKGludCkgcmVhZFNpemUpOworICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtOTMyLDcgKzk4NCw3IEBACiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCi0gICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1JlY29yZCwgbUNibGtNZW1vcnkgYW5kIG1DYmxrLgorICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5LCBtQ2JsaywgbUJ1ZmZlck1lbW9yeS4KICAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9SZWNvcmQgYW5kIElNZW1vcnkKICAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCk7CiAgICAgbU5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwpAQCAtOTU0LDcgKzEwMDYsNyBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQgPSBtQXVkaW9SZWNvcmQucHJvbW90ZSgpOwogICAgIGlmIChhdWRpb1JlY29yZCAhPSAwKSB7CkBAIC05NjYsNyArMTAxOCw4IEBACiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCkKKyAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCisgICAgICBtSWdub3JlTmV4dFBhdXNlZEludChmYWxzZSkKIHsKIH0KIApAQCAtOTgzLDYgKzEwMzYsMTAgQEAKICAgICAgICAgICAgIC8vIGNhbGxlciB3aWxsIGNoZWNrIGZvciBleGl0UGVuZGluZygpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAobUlnbm9yZU5leHRQYXVzZWRJbnQpIHsKKyAgICAgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1QYXVzZWRJbnQpIHsKICAgICAgICAgICAgIGlmIChtUGF1c2VkTnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIG1NeUNvbmQud2FpdFJlbGF0aXZlKG1NeUxvY2ssIG1QYXVzZWROcyk7CkBAIC05OTMsNyArMTA1MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBuc2Vjc190IG5zID0gIG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIodGhpcyk7CisgICAgbnNlY3NfdCBucyA9ICBtUmVjZWl2ZXIucHJvY2Vzc0F1ZGlvQnVmZmVyKCk7CiAgICAgc3dpdGNoIChucykgewogICAgIGNhc2UgMDoKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMDA3LDcgKzEwNjQsNyBAQAogICAgICAgICBucyA9IDEwMDAwMDAwMDBMTDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTAxNywxMiArMTA3NCw3IEBACiB7CiAgICAgLy8gbXVzdCBiZSBpbiB0aGlzIG9yZGVyIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24KICAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0KCk7Ci0gICAgQXV0b011dGV4IF9sKG1NeUxvY2spOwotICAgIGlmIChtUGF1c2VkIHx8IG1QYXVzZWRJbnQpIHsKLSAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7Ci0gICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7Ci0gICAgfQorICAgIHJlc3VtZSgpOwogfQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6cGF1c2UoKQpAQCAtMTAzNCw2ICsxMDg2LDcgQEAKIHZvaWQgQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpyZXN1bWUoKQogewogICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBtSWdub3JlTmV4dFBhdXNlZEludCA9IHRydWU7CiAgICAgaWYgKG1QYXVzZWQgfHwgbVBhdXNlZEludCkgewogICAgICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgICAgIG1QYXVzZWRJbnQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA4MDMzYzJjLi5kZGEzNjU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0zNSwxNiArMzUsMTcgQEAKIHNwPElBdWRpb0ZsaW5nZXI+IEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyOwogc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudD4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXJDbGllbnQ7CiBhdWRpb19lcnJvcl9jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z0F1ZGlvRXJyb3JDYWxsYmFjayA9IE5VTEw7Ci0vLyBDYWNoZWQgdmFsdWVzCiAKLURlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKDApOworLy8gQ2FjaGVkIHZhbHVlcyBmb3Igb3V0cHV0IGhhbmRsZXMKK0RlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKj4gQXVkaW9TeXN0ZW06OmdPdXRwdXRzKE5VTEwpOwogCiAvLyBDYWNoZWQgdmFsdWVzIGZvciByZWNvcmRpbmcgcXVlcmllcywgYWxsIHByb3RlY3RlZCBieSBnTG9jawotdWludDMyX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5TYW1wbGluZ1JhdGUgPSAxNjAwMDsKLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci1hdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJbkNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05POwotc2l6ZV90IEF1ZGlvU3lzdGVtOjpnSW5CdWZmU2l6ZSA9IDA7Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZTsKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0OworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5DaGFubmVsTWFzazsKK3NpemVfdCBBdWRpb1N5c3RlbTo6Z0luQnVmZlNpemUgPSAwOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAKK3NwPEF1ZGlvU3lzdGVtOjpBdWRpb1BvcnRDYWxsYmFjaz4gQXVkaW9TeXN0ZW06OmdBdWRpb1BvcnRDYWxsYmFjazsKIAogLy8gZXN0YWJsaXNoIGJpbmRlciBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIHNlcnZpY2UKIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKQpAQCAtODQsMTMgKzg1LDE1IEBACiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Om11dGVNaWNyb3Bob25lKGJvb2wgc3RhdGUpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldE1pY011dGUoc3RhdGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoYm9vbCogc3RhdGUpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjppc01pY3JvcGhvbmVNdXRlZChib29sKiBzdGF0ZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICpzdGF0ZSA9IGFmLT5nZXRNaWNNdXRlKCk7CkBAIC0xNzUsMTMgKzE3OCwxNSBAQAogICAgIHJldHVybiBhZi0+c2V0TW9kZShtb2RlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRQYXJhbWV0ZXJzKGlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzKTsKIH0KIAotU3RyaW5nOCBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgeworU3RyaW5nOCBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzgoIiIpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gcmVzdWx0OwpAQCAtMTkwLDYgKzE5NSwxNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIGtleVZhbHVlUGFpcnMpOworfQorCitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpCit7CisgICAgcmV0dXJuIGdldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIGtleXMpOworfQorCiAvLyBjb252ZXJ0IHZvbHVtZSBzdGVwcyB0byBuYXR1cmFsIGxvZyBzY2FsZQogCiAvLyBjaGFuZ2UgdGhpcyB2YWx1ZSB0byBjaGFuZ2Ugdm9sdW1lIHNjYWxpbmcKQEAgLTIyNywxMSArMjQyLDIzIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc3RyZWFtVHlwZSwgc2FtcGxpbmdSYXRlKTsKKyAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc2FtcGxpbmdSYXRlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yQXR0cihhdHRyKTsKKyAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gZ2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc2FtcGxpbmdSYXRlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNhbXBsaW5nUmF0ZSkKIHsKICAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjOwpAQCAtMjQ5LDkgKzI3NiwxMiBAQAogICAgICAgICAqc2FtcGxpbmdSYXRlID0gb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlOwogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CisgICAgaWYgKCpzYW1wbGluZ1JhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZSBmYWlsZWQgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi0gICAgQUxPR1YoImdldFNhbXBsaW5nUmF0ZSgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgc2FtcGxpbmcgcmF0ZSAldSIsIHN0cmVhbVR5cGUsIG91dHB1dCwKLSAgICAgICAgICAgICpzYW1wbGluZ1JhdGUpOworICAgIEFMT0dWKCJnZXRTYW1wbGluZ1JhdGUoKSBvdXRwdXQgJWQsIHNhbXBsaW5nIHJhdGUgJXUiLCBvdXRwdXQsICpzYW1wbGluZ1JhdGUpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMjY1LDE1ICsyOTUsMTQgQEAKICAgICB9CiAKICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtVHlwZSk7Ci0gICAgaWYgKG91dHB1dCA9PSAwKSB7CisgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGdldEZyYW1lQ291bnQob3V0cHV0LCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50KTsKKyAgICByZXR1cm4gZ2V0RnJhbWVDb3VudChvdXRwdXQsIGZyYW1lQ291bnQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQpCiB7CiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKQEAgLTI4OSw5ICszMTgsMTIgQEAKICAgICAgICAgKmZyYW1lQ291bnQgPSBvdXRwdXREZXNjLT5mcmFtZUNvdW50OwogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CisgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50IGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBBTE9HVigiZ2V0RnJhbWVDb3VudCgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgZnJhbWVDb3VudCAlZCIsIHN0cmVhbVR5cGUsIG91dHB1dCwKLSAgICAgICAgICAgICpmcmFtZUNvdW50KTsKKyAgICBBTE9HVigiZ2V0RnJhbWVDb3VudCgpIG91dHB1dCAlZCwgZnJhbWVDb3VudCAlenUiLCBvdXRwdXQsICpmcmFtZUNvdW50KTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTMwNSwxNSArMzM3LDE0IEBACiAgICAgfQogCiAgICAgb3V0cHV0ID0gZ2V0T3V0cHV0KHN0cmVhbVR5cGUpOwotICAgIGlmIChvdXRwdXQgPT0gMCkgeworICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHJldHVybiBnZXRMYXRlbmN5KG91dHB1dCwgc3RyZWFtVHlwZSwgbGF0ZW5jeSk7CisgICAgcmV0dXJuIGdldExhdGVuY3kob3V0cHV0LCBsYXRlbmN5KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldExhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGxhdGVuY3kpCiB7CiAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYzsKQEAgLTMzMCw3ICszNjEsNyBAQAogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0TGF0ZW5jeSgpIHN0cmVhbVR5cGUgJWQsIG91dHB1dCAlZCwgbGF0ZW5jeSAlZCIsIHN0cmVhbVR5cGUsIG91dHB1dCwgKmxhdGVuY3kpOworICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgb3V0cHV0LCAqbGF0ZW5jeSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zNDksNiArMzgwLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgIH0KICAgICAgICAgaW5CdWZmU2l6ZSA9IGFmLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbkJ1ZmZTaXplID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3ggY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSBoZXJlOiB3ZSBjb3VsZCBvdmVyd3JpdGUgYSBmcmVzaGVyIGNhY2hlIGVudHJ5CiAgICAgICAgIGdMb2NrLmxvY2soKTsKICAgICAgICAgLy8gc2F2ZSB0aGUgcmVxdWVzdCBwYXJhbXMKICAgICAgICAgZ1ByZXZJblNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC0zNzAsNTYgKzQwNyw2MCBAQAogICAgIHJldHVybiBhZi0+c2V0Vm9pY2VWb2x1bWUodmFsdWUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzaXplX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmRzcEZyYW1lcywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCB1aW50MzJfdCAqaGFsRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkc3BGcmFtZXMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLQotICAgIGlmIChvdXRwdXQgPT0gMCkgewotICAgICAgICBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtKTsKLSAgICB9Ci0KICAgICByZXR1cm4gYWYtPmdldFJlbmRlclBvc2l0aW9uKGhhbEZyYW1lcywgZHNwRnJhbWVzLCBvdXRwdXQpOwogfQogCi1zaXplX3QgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgewordWludDMyX3QgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKK3sKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICB1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gcmVzdWx0OwotICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm4gcmVzdWx0OworICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgcmV0dXJuIHJlc3VsdDsKIAogICAgIHJlc3VsdCA9IGFmLT5nZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWludCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKSB7CithdWRpb191bmlxdWVfaWRfdCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCgpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBhZi0+bmV3QXVkaW9TZXNzaW9uSWQoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURTsKKyAgICByZXR1cm4gYWYtPm5ld0F1ZGlvVW5pcXVlSWQoKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCit7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgYWYtPmFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICBhZi0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbiwgcGlkKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQorewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiAhPSAwKSB7Ci0gICAgICAgIGFmLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgfQogfQogCithdWRpb19od19zeW5jX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOworICAgIHJldHVybiBhZi0+Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKHNlc3Npb25JZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCit7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CiAKICAgICBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlci5jbGVhcigpOwpAQCAtNDM4LDcgKzQ3OSw3IEBACiAgICAgY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqZGVzYzsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKIAotICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm47CisgICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKIApAQCAtNDU1LDcgKzQ5Niw3IEBACiAKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7CiAgICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICVkIGNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAldSAiCisgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXp1ICIKICAgICAgICAgICAgICAgICAibGF0ZW5jeSAlZCIsCiAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5mb3JtYXQsIG91dHB1dERlc2MtPmNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmZyYW1lQ291bnQsIG91dHB1dERlc2MtPmxhdGVuY3kpOwpAQCAtNDc5LDggKzUyMCw4IEBACiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7CiAgICAgICAgIGRlc2MgPSAoY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKIAotICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3Igb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICVkIGNoYW5uZWwgbWFzayAlI3ggIgotICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICVkIGxhdGVuY3kgJWQiLAorICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3Igb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKKyAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgbGF0ZW5jeSAlZCIsCiAgICAgICAgICAgICAgICAgaW9IYW5kbGUsIGRlc2MtPnNhbXBsaW5nUmF0ZSwgZGVzYy0+Zm9ybWF0LAogICAgICAgICAgICAgICAgIGRlc2MtPmNoYW5uZWxNYXNrLCBkZXNjLT5mcmFtZUNvdW50LCBkZXNjLT5sYXRlbmN5KTsKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IGdPdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNDk2LDEyICs1MzcsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpIHsKK3ZvaWQgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpCit7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICBnQXVkaW9FcnJvckNhbGxiYWNrID0gY2I7CiB9CiAKLWJvb2wgQXVkaW9TeXN0ZW06OnJvdXRlZFRvQTJkcE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKworYm9vbCBBdWRpb1N5c3RlbTo6cm91dGVkVG9BMmRwT3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKICAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgpAQCAtNTM5LDcgKzU4MywxMiBAQAogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOwogICAgICAgICBnQXVkaW9Qb2xpY3lTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZT4oYmluZGVyKTsKICAgICAgICAgZ0xvY2sudW5sb2NrKCk7CisgICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBjbGllbnQgdGFrZXMgdGhlIEF1ZGlvUG9saWN5U2VydmljZSBsb2NrLgorICAgICAgICAvLyBEb24ndCBob2xkIHRoZSBBdWRpb1N5c3RlbSBsb2NrIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgIGdBdWRpb1BvbGljeVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOwogICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlIGV4aXN0cyBhIGJlbmlnbiByYWNlIGNvbmRpdGlvbiB3aGVyZSBnQXVkaW9Qb2xpY3lTZXJ2aWNlCisgICAgICAgIC8vIGlzIHNldCwgYnV0IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgaXMgbm90IHlldCByZWdpc3RlcmVkLgogICAgICAgICBnTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIGdBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC02MDgsNiArNjU3LDE5IEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOwogfQogCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGlmIChhdHRyID09IE5VTEwpIHJldHVybiAwOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKQEAgLTYzNywzMiArNjk5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXQoaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gYXBzLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uSWQsIGZsYWdzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIGFwcy0+c3RvcElucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQordm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47Ci0gICAgYXBzLT5yZWxlYXNlSW5wdXQoaW5wdXQpOworICAgIGFwcy0+cmVsZWFzZUlucHV0KGlucHV0LCBzZXNzaW9uKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC03MDIsMTQgKzc2OCwxNSBAQAogYXVkaW9fZGV2aWNlc190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkwOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKTsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEIGhlcmUKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7CiB9CiAKQEAgLTgwMiwxMyArODY5LDExMiBAQAogICAgIHJldHVybiBhcHMtPmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgbnVtX3BvcnRzLCBwb3J0cywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRBdWRpb1BvcnQocG9ydCk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcywgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKwordm9pZCBBdWRpb1N5c3RlbTo6c2V0QXVkaW9Qb3J0Q2FsbGJhY2soc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+IGNhbGxCYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ0F1ZGlvUG9ydENhbGxiYWNrID0gY2FsbEJhY2s7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvU3lzdGVtOjpnZXRQaG9uZVN0YXRlKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICByZXR1cm4gYXBzLT5nZXRQaG9uZVN0YXRlKCk7Cit9CisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uU2VydmljZURpZWQoKTsKKyAgICB9CiAgICAgQXVkaW9TeXN0ZW06OmdBdWRpb1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKIAogICAgIEFMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CiAKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnQXVkaW9Qb3J0Q2FsbGJhY2sgIT0gMCkgeworICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IGUyOTA2MjcuLjBhODlmYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC0xNSwxNyArMTUsMjAgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIAotCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvVHJhY2siCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAxMAogI2RlZmluZSBXQUlUX1NUUkVBTV9FTkRfVElNRU9VVF9TRUMgICAgIDEyMApAQCAtMzQsNiArMzcsMTkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdGF0aWMgaW50NjRfdCBjb252ZXJ0VGltZXNwZWNUb1VzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAmdHYpCit7CisgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOworfQorCisvLyBjdXJyZW50IG1vbm90b25pYyB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KK3N0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHY7CisgICAgKHZvaWQpIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHYpOworICAgIHJldHVybiBjb252ZXJ0VGltZXNwZWNUb1VzKHR2KTsKK30KKwogLy8gc3RhdGljCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50KAogICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQsCkBAIC00NCw5ICs2MCw2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gZGVmYXVsdCB0byAwIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAqZnJhbWVDb3VudCA9IDA7Ci0KICAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgY29kZSBpbiBjcmVhdGVUcmFja19sKCksIGV4Y2VwdCB3ZSdyZSBtaXNzaW5nCiAgICAgLy8gICAgICAgc29tZSBpbmZvcm1hdGlvbiBoZXJlIHRoYXQgaXMgYXZhaWxhYmxlIGluIGNyZWF0ZVRyYWNrX2woKToKICAgICAvLyAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKQEAgLTU0LDE2ICs2NywyNiBAQAogICAgIC8vICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrCiAgICAgLy8gICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MKICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CkBAIC03Myw4ICs5NiwxNSBAQAogICAgIH0KIAogICAgICpmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUgPT0gMCkgPyBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCA6Ci0gICAgICAgICAgICBhZkZyYW1lQ291bnQgKiBtaW5CdWZDb3VudCAqIHNhbXBsZVJhdGUgLyBhZlNhbXBsZVJhdGU7Ci0gICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JWQ6IGFmRnJhbWVDb3VudD0lZCwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKKyAgICAgICAgICAgIGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3Qoc2FtcGxlUmF0ZSkgLyBhZlNhbXBsZVJhdGU7CisgICAgLy8gVGhlIGZvcm11bGEgYWJvdmUgc2hvdWxkIGFsd2F5cyBwcm9kdWNlIGEgbm9uLXplcm8gdmFsdWUsIGJ1dCByZXR1cm4gYW4gZXJyb3IKKyAgICAvLyBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KKyAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJWQiLAorICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JWQsIGFmTGF0ZW5jeT0lZCIsCiAgICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTg4LDYgKzExOCwxMCBAQAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApCiB7CisgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV047CisgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBBVURJT19VU0FHRV9VTktOT1dOOworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gMHgwOworICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC05NSwxNSArMTI5LDE3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGludCB1aWQpCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCkBAIC0xMTMsNyArMTQ5LDcgQEAKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsCi0gICAgICAgICAgICBvZmZsb2FkSW5mbywgdWlkKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMpOwogfQogCiBBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKApAQCAtMTI1LDExICsxNjEsMTMgQEAKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGludCB1aWQpCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCkBAIC0xMzgsNyArMTc2LDggQEAKIHsKICAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCB1aWQpOworICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywKKyAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvVHJhY2s6On5BdWRpb1RyYWNrKCkKQEAgLTE1Niw4ICsxOTUsMTIgQEAKICAgICAgICAgfQogICAgICAgICBtQXVkaW9UcmFjay0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CisgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CisgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQpOworICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KIH0KIApAQCAtMTY2LDE4ICsyMDksMjUgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgaW50IGZyYW1lQ291bnRJbnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgaW50IHVpZCkKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogeworICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQiLAorICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUpOworCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewpAQCAtMjExLDE5ICsyNjEsMTMgQEAKICAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgLy8gRklYTUUgImludCIgaGVyZSBpcyBsZWdhY3kgYW5kIHdpbGwgYmUgcmVwbGFjZWQgYnkgc2l6ZV90IGxhdGVyCi0gICAgaWYgKGZyYW1lQ291bnRJbnQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIGNvdW50ICVkIiwgZnJhbWVDb3VudEludCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudEludDsKLQogICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKKyAgICBBTE9HVigic2V0KCkgc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0yMzMsMTkgKzI3NywzOSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbU91dHB1dCA9IDA7Ci0KICAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZXMgZmlyc3QuCiAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKICAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICB9CiAKLSAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBzYW1wbGVSYXRlID0gYWZTYW1wbGVSYXRlOworICAgICAgICBzZXRBdHRyaWJ1dGVzRnJvbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSk7CisgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKHBBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMtPnVzYWdlLCBwQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBwQXR0cmlidXRlcy0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZXMtPnRhZ3MpOworICAgICAgICB9CisgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZUZvckF0dHIoJnNhbXBsZVJhdGUsICZtQXR0cmlidXRlcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgIH0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAKQEAgLTI1MywxNSArMzE3LDIxIEBACiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0gICAgaWYgKGNoYW5uZWxNYXNrID09IDApIHsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgfQogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKICAgICAvLyBBdWRpb0ZsaW5nZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgOC1iaXQgZGF0YSBpbiBzaGFyZWQgbWVtb3J5CiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSB7CkBAIC0yODEsNTAgKzM1MSw1NiBAQAogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG93IGRlZXAgYnVmZmVyaW5nIGZvciBtdXNpYyBzdHJlYW0gdHlwZQotICAgIGlmIChzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgIGlmIChtU3RyZWFtVHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1DaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKLSAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOwotICAgICAgICBtRnJhbWVTaXplQUYgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICB9CisgICAgICAgIG1GcmFtZVNpemVBRiA9IG1GcmFtZVNpemU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKLSAgICAgICAgbUZyYW1lU2l6ZUFGID0gc2l6ZW9mKHVpbnQ4X3QpOworICAgICAgICBBTE9HX0FTU0VSVChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpOworICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICBtRnJhbWVTaXplQUYgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBmb3JtYXQpOworICAgICAgICAvLyBjcmVhdGVUcmFjayB3aWxsIHJldHVybiBhbiBlcnJvciBpZiBQQ00gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyLAorICAgICAgICAvLyBzbyBubyBuZWVkIHRvIGNoZWNrIGZvciBzcGVjaWZpYyBQQ00gZm9ybWF0cyBoZXJlCiAgICAgfQogCi0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbyk7Ci0KLSAgICBpZiAob3V0cHV0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIC8vIE1ha2UgY29weSBvZiBpbnB1dCBwYXJhbWV0ZXIgb2ZmbG9hZEluZm8gc28gdGhhdCBpbiB0aGUgZnV0dXJlOgorICAgIC8vICAoYSkgY3JlYXRlVHJhY2tfbCBkb2Vzbid0IG5lZWQgaXQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyCisgICAgLy8gIChiKSB3ZSBjYW4gc3VwcG9ydCByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzCisgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgbU9mZmxvYWRJbmZvQ29weSA9ICpvZmZsb2FkSW5mbzsKKyAgICAgICAgbU9mZmxvYWRJbmZvID0gJm1PZmZsb2FkSW5mb0NvcHk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9mZmxvYWRJbmZvID0gTlVMTDsKICAgICB9CiAKLSAgICBtVm9sdW1lW0xFRlRdID0gMS4wZjsKLSAgICBtVm9sdW1lW1JJR0hUXSA9IDEuMGY7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdID0gMS4wZjsKKyAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdID0gMS4wZjsKICAgICBtU2VuZExldmVsID0gMC4wZjsKLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgLy8gbUZyYW1lQ291bnQgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlVHJhY2tfbAogICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxID0gbm90aWZpY2F0aW9uRnJhbWVzOwogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwogICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgaWYgKHVpZCA9PSAtMSB8fCAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSkgeworICAgIGludCBjYWxsaW5ncGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBteXBpZCA9IGdldHBpZCgpOworICAgIGlmICh1aWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFVpZCA9IHVpZDsKICAgICB9CisgICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdwaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IHBpZDsKKyAgICB9CiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtQ2JmID0gY2JmOwpAQCAtMzM1LDE0ICs0MTEsNyBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVUcmFja19sKHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyplcG9jaCovKTsKKyAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CkBAIC0zNTAsMTcgKzQxOSwxMCBAQAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQotICAgICAgICAvL1VzZSBvZiBkaXJlY3QgYW5kIG9mZmxvYWRlZCBvdXRwdXQgc3RyZWFtcyBpcyByZWYgY291bnRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KLSAgICAgICAgLy8gQXMgZ2V0T3V0cHV0IHdhcyBjYWxsZWQgYWJvdmUgYW5kIHJlc3VsdGVkIGluIGFuIG91dHB1dCBzdHJlYW0gdG8gYmUgb3BlbmVkLAotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wUGVyaW9kID0gMDsKQEAgLTM2OCwxMSArNDMwLDE0IEBACiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKICAgICBtTmV3UG9zaXRpb24gPSAwOwogICAgIG1VcGRhdGVQZXJpb2QgPSAwOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCk7CisgICAgbVNlcnZlciA9IDA7CisgICAgbVBvc2l0aW9uID0gMDsKKyAgICBtUmVsZWFzZWQgPSAwOworICAgIG1TdGFydFVzID0gMDsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKLSAgICBtT3V0cHV0ID0gb3V0cHV0OwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzk1LDE0ICs0NjAsMjEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAgICAgfQorICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CiAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBwcmV2aW91c1N0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKICAgICAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCi0gICAgICAgIG1Qcm94eS0+c2V0RXBvY2gobVByb3h5LT5nZXRFcG9jaCgpIC0gbVByb3h5LT5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgbVBvc2l0aW9uID0gMDsKKyAgICAgICAgLy8gRm9yIG9mZmxvYWRlZCB0cmFja3MsIHdlIGRvbid0IGtub3cgaWYgdGhlIGhhcmR3YXJlIGNvdW50ZXJzIGFyZSByZWFsbHkgemVybyBoZXJlLAorICAgICAgICAvLyBzaW5jZSB0aGUgZmx1c2ggaXMgYXN5bmNocm9ub3VzIGFuZCBzdG9wIG1heSBub3QgZnVsbHkgZHJhaW4uCisgICAgICAgIC8vIFdlIHNhdmUgdGhlIHRpbWUgd2hlbiB0aGUgdHJhY2sgaXMgc3RhcnRlZCB0byBsYXRlciB2ZXJpZnkgd2hldGhlcgorICAgICAgICAvLyB0aGUgY291bnRlcnMgYXJlIHJlYWxpc3RpYyAoaS5lLiBzdGFydCBmcm9tIHplcm8gYWZ0ZXIgdGhpcyB0aW1lKS4KKyAgICAgICAgbVN0YXJ0VXMgPSBnZXROb3dVcygpOworCiAgICAgICAgIC8vIGZvcmNlIHJlZnJlc2ggb2YgcmVtYWluaW5nIGZyYW1lcyBieSBwcm9jZXNzQXVkaW9CdWZmZXIoKSBhcyBsYXN0CiAgICAgICAgIC8vIHdyaXRlIGJlZm9yZSBzdG9wIGNvdWxkIGJlIHBhcnRpYWwuCiAgICAgICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKICAgICB9Ci0gICAgbU5ld1Bvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVVwZGF0ZVBlcmlvZDsKKyAgICBtTmV3UG9zaXRpb24gPSBtUG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwogICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKTsKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKQEAgLTQ0OCwxNSArNTIwLDE1IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICAvLyBGSVhNRSBwYXVzZSB0aGVuIHN0b3Agc2hvdWxkIG5vdCBiZSBhIG5vcAotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFKSB7CisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQSU5HOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CisgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCiAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKQEAgLTQ3NSw3ICs1NDcsNyBAQAogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgaWYgKCFpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgICAgICB0LT5wYXVzZSgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTUxMyw3ICs1ODUsOCBAQAogICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKIAogICAgIG1TdGF0ZSA9IFNUQVRFX0ZMVVNIRUQ7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBtUmVsZWFzZWQgPSAwOworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKICAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICB9CiAgICAgbVByb3h5LT5mbHVzaCgpOwpAQCAtNTMzLDExICs2MDYsMjAgQEAKICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgIGlmIChpc09mZmxvYWRlZF9sKCkpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIC8vIEFuIG9mZmxvYWQgb3V0cHV0IGNhbiBiZSByZS11c2VkIGJldHdlZW4gdHdvIGF1ZGlvIHRyYWNrcyBoYXZpbmcKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uIEEgdGltZXN0YW1wIHF1ZXJ5IGZvciBhIHBhdXNlZCB0cmFjaworICAgICAgICAgICAgLy8gd2hpbGUgdGhlIG90aGVyIGlzIHJ1bm5pbmcgd291bGQgcmV0dXJuIGFuIGluY29ycmVjdCB0aW1lLgorICAgICAgICAgICAgLy8gVG8gZml4IHRoaXMsIGNhY2hlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvbiBhIHBhdXNlKCkgYW5kIHJldHVybgorICAgICAgICAgICAgLy8gdGhpcyB0aW1lIHdoZW4gcmVxdWVzdGVkIHVudGlsIHRoZSB0cmFjayBpcyByZXN1bWVkLgorCisgICAgICAgICAgICAvLyBPZmZsb2FkVGhyZWFkIHNlbmRzIEhBTCBwYXVzZSBpbiBpdHMgdGhyZWFkTG9vcC4gVGltZSBzYXZlZAorICAgICAgICAgICAgLy8gaGVyZSBjYW4gYmUgc2xpZ2h0bHkgb2ZmLgorCisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayByZXR1cm4gY29kZSBmb3IgZ2V0UmVuZGVyUG9zaXRpb24uCisKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKLSAgICAgICAgICAgIC8vIE9mZmxvYWRUaHJlYWQgc2VuZHMgSEFMIHBhdXNlIGluIGl0cyB0aHJlYWRMb29wLi4gdGltZSBzYXZlZAotICAgICAgICAgICAgLy8gaGVyZSBjYW4gYmUgc2xpZ2h0bHkgb2ZmCiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0UmVuZGVyUG9zaXRpb24obU91dHB1dCwgJmhhbEZyYW1lcywgJm1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICBBTE9HVigiQXVkaW9UcmFjazo6cGF1c2UgZm9yIG9mZmxvYWQsIGNhY2hlIGN1cnJlbnQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CkBAIC01NDYsMTcgKzYyOCwxOSBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCiB7Ci0gICAgaWYgKGxlZnQgPCAwLjBmIHx8IGxlZnQgPiAxLjBmIHx8IHJpZ2h0IDwgMC4wZiB8fCByaWdodCA+IDEuMGYpIHsKKyAgICAvLyBUaGlzIGR1cGxpY2F0ZXMgYSB0ZXN0IGJ5IEF1ZGlvVHJhY2sgSk5JLCBidXQgdGhhdCBpcyBub3QgdGhlIG9ubHkgY2FsbGVyCisgICAgaWYgKGlzbmFuZihsZWZ0KSB8fCBsZWZ0IDwgR0FJTl9GTE9BVF9aRVJPIHx8IGxlZnQgPiBHQUlOX0ZMT0FUX1VOSVRZIHx8CisgICAgICAgICAgICBpc25hbmYocmlnaHQpIHx8IHJpZ2h0IDwgR0FJTl9GTE9BVF9aRVJPIHx8IHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtVm9sdW1lW0xFRlRdID0gbGVmdDsKLSAgICBtVm9sdW1lW1JJR0hUXSA9IHJpZ2h0OworICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSA9IGxlZnQ7CisgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSA9IHJpZ2h0OwogCi0gICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QocmlnaHQgKiAweDEwMDApKSA8PCAxNikgfCB1aW50MTZfdChsZWZ0ICogMHgxMDAwKSk7CisgICAgbVByb3h5LT5zZXRWb2x1bWVMUihnYWluX21pbmlmbG9hdF9wYWNrKGdhaW5fZnJvbV9mbG9hdChsZWZ0KSwgZ2Fpbl9mcm9tX2Zsb2F0KHJpZ2h0KSkpOwogCi0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5zaWduYWwoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTY5LDcgKzY1Myw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKIHsKLSAgICBpZiAobGV2ZWwgPCAwLjBmIHx8IGxldmVsID4gMS4wZikgeworICAgIC8vIFRoaXMgZHVwbGljYXRlcyBhIHRlc3QgYnkgQXVkaW9UcmFjayBKTkksIGJ1dCB0aGF0IGlzIG5vdCB0aGUgb25seSBjYWxsZXIKKyAgICBpZiAoaXNuYW5mKGxldmVsKSB8fCBsZXZlbCA8IEdBSU5fRkxPQVRfWkVSTyB8fCBsZXZlbCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU4OSwxNiArNjc0LDE1IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKLSAgICBpZiAobUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIHVpbnQzMl90IGFmU2FtcGxpbmdSYXRlOwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsaW5nUmF0ZSwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGVGb3JBdHRyKCZhZlNhbXBsaW5nUmF0ZSwgJm1BdHRyaWJ1dGVzKSAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgLy8gUmVzYW1wbGVyIGltcGxlbWVudGF0aW9uIGxpbWl0cyBpbnB1dCBzYW1wbGluZyByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxpbmcgcmF0ZS4KLSAgICBpZiAocmF0ZSA9PSAwIHx8IHJhdGUgPiBhZlNhbXBsaW5nUmF0ZSoyICkgeworICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC02MjAsMTAgKzcwNCwxMCBAQAogICAgIC8vIHNhbXBsZSByYXRlIGNhbiBiZSB1cGRhdGVkIGR1cmluZyBwbGF5YmFjayBieSB0aGUgb2ZmbG9hZGVkIGRlY29kZXIgc28gd2UgbmVlZCB0bwogICAgIC8vIHF1ZXJ5IHRoZSBIQUwgYW5kIHVwZGF0ZSBpZiBuZWVkZWQuCiAvLyBGSVhNRSB1c2UgUHJveHkgcmV0dXJuIGNoYW5uZWwgdG8gdXBkYXRlIHRoZSByYXRlIGZyb20gc2VydmVyIGFuZCBhdm9pZCBwb2xsaW5nIGhlcmUKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgewotICAgICAgICBpZiAobU91dHB1dCAhPSAwKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CisgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUobU91dHB1dCwgbVN0cmVhbVR5cGUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUobU91dHB1dCwgJnNhbXBsZVJhdGUpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KQEAgLTYzNCw3ICs3MTgsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRMb29wKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkIHx8IGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC02NjAsNyArNzQ0LDcgQEAKIHsKICAgICAvLyBGSVhNRSBJZiBzZXR0aW5nIGEgbG9vcCBhbHNvIHNldHMgcG9zaXRpb24gdG8gc3RhcnQgb2YgbG9vcCwgdGhlbgogICAgIC8vICAgICAgIHRoaXMgaXMgY29ycmVjdC4gIE90aGVyd2lzZSBpdCBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgbUxvb3BQZXJpb2QgPSBsb29wQ291bnQgIT0gMCA/IGxvb3BFbmQgLSBsb29wU3RhcnQgOiAwOwogICAgIG1TdGF0aWNQcm94eS0+c2V0TG9vcChsb29wU3RhcnQsIGxvb3BFbmQsIGxvb3BDb3VudCk7CiB9CkBAIC02NjgsNyArNzUyLDcgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90IG1hcmtlcikKIHsKICAgICAvLyBUaGUgb25seSBwdXJwb3NlIG9mIHNldHRpbmcgbWFya2VyIHBvc2l0aW9uIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNjgxLDcgKzc2NSw3IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldE1hcmtlclBvc2l0aW9uKHVpbnQzMl90ICptYXJrZXIpIGNvbnN0CiB7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKG1hcmtlciA9PSBOVUxMKSB7CkBAIC02OTcsMTkgKzc4MSwyMCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UG9zaXRpb25VcGRhdGVQZXJpb2QodWludDMyX3QgdXBkYXRlUGVyaW9kKQogewogICAgIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2Ygc2V0dGluZyBwb3NpdGlvbiB1cGRhdGUgcGVyaW9kIGlzIHRvIGdldCBhIGNhbGxiYWNrCi0gICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1DYmYgPT0gTlVMTCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyB1cGRhdGVQZXJpb2Q7CisgICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgdXBkYXRlUGVyaW9kOwogICAgIG1VcGRhdGVQZXJpb2QgPSB1cGRhdGVQZXJpb2Q7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uVXBkYXRlUGVyaW9kKHVpbnQzMl90ICp1cGRhdGVQZXJpb2QpIGNvbnN0CiB7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKHVwZGF0ZVBlcmlvZCA9PSBOVUxMKSB7CkBAIC03MjQsNyArODA5LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UG9zaXRpb24odWludDMyX3QgcG9zaXRpb24pCiB7Ci0gICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAocG9zaXRpb24gPiBtRnJhbWVDb3VudCkgewpAQCAtNzQxLDcgKzgyNiw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyBtVXBkYXRlUGVyaW9kOworICAgIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgbUxvb3BQZXJpb2QgPSAwOwogICAgIC8vIEZJWE1FIENoZWNrIHdoZXRoZXIgbG9vcHMgYW5kIHNldHRpbmcgcG9zaXRpb24gYXJlIGluY29tcGF0aWJsZSBpbiBvbGQgY29kZS4KICAgICAvLyBJZiB3ZSB1c2Ugc2V0TG9vcCBmb3IgYm90aCBwdXJwb3NlcyB3ZSBsb3NlIHRoZSBjYXBhYmlsaXR5IHRvIHNldCB0aGUgcG9zaXRpb24gd2hpbGUgbG9vcGluZy4KQEAgLTc1MCwzNiArODM1LDM4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0CitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pCiB7CiAgICAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKGlzT2ZmbG9hZGVkKCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKICAgICAgICAgdWludDMyX3QgZHNwRnJhbWVzID0gMDsKIAotICAgICAgICBpZiAoKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQpIHx8IChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1NUT1BQSU5HKSkgeworICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSkgewogICAgICAgICAgICAgQUxPR1YoImdldFBvc2l0aW9uIGNhbGxlZCBpbiBwYXVzZWQgc3RhdGUsIHJldHVybiBjYWNoZWQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICAgICAgKnBvc2l0aW9uID0gbVBhdXNlZFBvc2l0aW9uOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1PdXRwdXQgIT0gMCkgeworICAgICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZkc3BGcmFtZXMpOwogICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBkc3BGcmFtZXMgbWF5IG5vdCBiZSB6ZXJvIGluIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkKKyAgICAgICAgLy8gZHVlIHRvIGhhcmR3YXJlIGxhdGVuY3kuIFdlIGxlYXZlIHRoaXMgYmVoYXZpb3IgZm9yIG5vdy4KICAgICAgICAgKnBvc2l0aW9uID0gZHNwRnJhbWVzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIElBdWRpb1RyYWNrOjpzdG9wKCkgaXNuJ3Qgc3luY2hyb25vdXM7IHdlIGRvbid0IGtub3cgd2hlbiBwcmVzZW50YXRpb24gY29tcGxldGVzCi0gICAgICAgICpwb3NpdGlvbiA9IChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgPyAwIDoKLSAgICAgICAgICAgICAgICBtUHJveHktPmdldFBvc2l0aW9uKCk7CisgICAgICAgICpwb3NpdGlvbiA9IChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBtU3RhdGUgPT0gU1RBVEVfRkxVU0hFRCkgPworICAgICAgICAgICAgICAgIDAgOiB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0QnVmZmVyUG9zaXRpb24oc2l6ZV90ICpwb3NpdGlvbikKK3N0YXR1c190IEF1ZGlvVHJhY2s6OmdldEJ1ZmZlclBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikKIHsKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwIHx8IG1Jc1RpbWVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTc5NSw3ICs4ODIsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpyZWxvYWQoKQogewotICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgbUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTgxMiwyMyArODk5LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1RyYWNrOjpnZXRPdXRwdXQoKQorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0KCkgY29uc3QKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1PdXRwdXQ7CiB9CiAKLS8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQotewotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRmxhZ3MpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC04NDIsMTUgKzkxOCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggbUxvY2sgaGVsZAotc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICBzaXplX3QgZXBvY2gpCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtODU5LDQxICs5MjcsNTQgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyaWJ1dGVzLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbUZsYWdzLCBtT2ZmbG9hZEluZm8pOworICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCBmb3JtYXQgJSN4LCIKKyAgICAgICAgICAgICAgIiBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3giLAorICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwgbUF0dHJpYnV0ZXMudXNhZ2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHsKKyAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKKyAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCisKICAgICAvLyBOb3QgYWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgbmVlZGVkIHVuZGVyIGFsbCBjb25kaXRpb25zLCBidXQgaXQgaXMgZWFzaWVyIHRvIGdldCB0aGVtIGFsbAogCiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG91dHB1dCwgc3RyZWFtVHlwZSwgJmFmTGF0ZW5jeSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmYWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCBzdHJlYW1UeXBlLCAmYWZGcmFtZUNvdW50KTsKKyAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsICZhZkZyYW1lQ291bnQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnQob3V0cHV0PSVkLCBzdHJlYW1UeXBlPSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0cmVhbVR5cGUsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KIAogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgc3RyZWFtVHlwZSwgJmFmU2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShvdXRwdXQsICZhZlNhbXBsZVJhdGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQsIHN0cmVhbVR5cGU9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RyZWFtVHlwZSwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIEFMT0dFKCJnZXRTYW1wbGluZ1JhdGUob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7CisgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAKICAgICAvLyBDbGllbnQgZGVjaWRlcyB3aGV0aGVyIHRoZSB0cmFjayBpcyBUSU1FRCAoc2VlIGJlbG93KSwgYnV0IGNhbiBvbmx5IGV4cHJlc3MgYSBwcmVmZXJlbmNlCiAgICAgLy8gZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCi0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICYmICEoCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAmJiAhKCgKICAgICAgICAgICAgIC8vIGVpdGhlciBvZiB0aGVzZSB1c2UgY2FzZXM6CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAxOiBzaGFyZWQgYnVmZmVyCi0gICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApIHx8Ci0gICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayBoYW5kbGVyCi0gICAgICAgICAgICAobUNiZiAhPSBOVUxMKSkpIHsKKyAgICAgICAgICAgIChtU2hhcmVkQnVmZmVyICE9IDApIHx8CisgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSkgJiYKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHNhbXBsZSByYXRlCisgICAgICAgICAgICAobVNhbXBsZVJhdGUgPT0gYWZTYW1wbGVSYXRlKSkpIHsKICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOwogICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZAotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgIH0KICAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIG91dHB1dCAlZCBhZkxhdGVuY3kgJWQiLCBvdXRwdXQsIGFmTGF0ZW5jeSk7CiAKQEAgLTkwNCw2NCArOTg1LDcwIEBACiAgICAgLy8gIG4gPSAzICAgbm9ybWFsIHRyYWNrLCB3aXRoIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KICAgICAvLyAgICAgICAgICAocGVzc2ltaXN0aWM7IHNvbWUgbm9uLTE6MSBjb252ZXJzaW9uIHJhdGlvcyBkb24ndCBhY3R1YWxseSBuZWVkIHRyaXBsZS1idWZmZXJpbmcpCiAgICAgLy8gIG4gPiAzICAgdmVyeSBoaWdoIGxhdGVuY3kgb3IgdmVyeSBzbWFsbCBub3RpZmljYXRpb24gaW50ZXJ2YWw7IG5CdWZmZXJpbmcgaXMgaWdub3JlZAotICAgIGNvbnN0IHVpbnQzMl90IG5CdWZmZXJpbmcgPSAoc2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CisgICAgY29uc3QgdWludDMyX3QgbkJ1ZmZlcmluZyA9IChtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGUpID8gMiA6IDM7CiAKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKIAotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKIAotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKICAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBhZkZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgfSBlbHNlIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgYWxpZ25tZW50IG1hdGNoZXMgY2hhbm5lbCBjb3VudAogICAgICAgICAvLyA4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSAvKiBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/IDEgOiAqLyAyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IG1Gb3JtYXQpOworICAgICAgICBpZiAoYWxpZ25tZW50ICYgMSkgeworICAgICAgICAgICAgYWxpZ25tZW50ID0gMTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA+IDEpIHsKICAgICAgICAgICAgIC8vIE1vcmUgdGhhbiAyIGNoYW5uZWxzIGRvZXMgbm90IHJlcXVpcmUgc3Ryb25nZXIgYWxpZ25tZW50IHRoYW4gc3RlcmVvCiAgICAgICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCgoc2l6ZV90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7CisgICAgICAgIGlmICgoKHVpbnRwdHJfdCltU2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoYWxpZ25tZW50IC0gMSkpICE9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbm1lbnQ6IGFkZHJlc3MgJXAsIGNoYW5uZWwgY291bnQgJXUiLAotICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgbUNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byByZWxlYXNlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIGNvbnN0cnVjdG9ycywKICAgICAgICAgLy8gdGhlcmUncyBubyBmcmFtZUNvdW50IHBhcmFtZXRlci4KICAgICAgICAgLy8gQnV0IHdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBzZXQoKSwKICAgICAgICAgLy8gdGhlcmUgX2lzXyBhIGZyYW1lQ291bnQgcGFyYW1ldGVyLiAgV2Ugc2lsZW50bHkgaWdub3JlIGl0LgotICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCkvbUNoYW5uZWxDb3VudC9zaXplb2YoaW50MTZfdCk7CisgICAgICAgIGZyYW1lQ291bnQgPSBtU2hhcmVkQnVmZmVyLT5zaXplKCkgLyBtRnJhbWVTaXplQUY7CiAKLSAgICB9IGVsc2UgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgeworICAgIH0gZWxzZSBpZiAoIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewogCiAgICAgICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgY2FsY3VsYXRpb25zIGFuZCBhc3NvY2lhdGVkIGNoZWNrcyB0byBzZXJ2ZXIKIAogICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKICAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JWQsIG1pbkJ1ZkNvdW50PSVkLCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0lZCIsCisgICAgICAgIEFMT0dWKCJhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JWQiLAogICAgICAgICAgICAgICAgIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDw9IG5CdWZmZXJpbmcpIHsKICAgICAgICAgICAgIG1pbkJ1ZkNvdW50ID0gbkJ1ZmZlcmluZzsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gKGFmRnJhbWVDb3VudCpzYW1wbGVSYXRlKm1pbkJ1ZkNvdW50KS9hZlNhbXBsZVJhdGU7Ci0gICAgICAgIEFMT0dWKCJtaW5GcmFtZUNvdW50OiAldSwgYWZGcmFtZUNvdW50PSVkLCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgorICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3QobVNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOworICAgICAgICBBTE9HVigibWluRnJhbWVDb3VudDogJXp1LCBhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgogICAgICAgICAgICAgICAgICIsIGFmTGF0ZW5jeT0lZCIsCi0gICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgc2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgICAgICAgICAgICAgIG1pbkZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgbWluQnVmQ291bnQsIG1TYW1wbGVSYXRlLCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIC8vIG5vdCBBTE9HVyBiZWNhdXNlIGl0IGhhcHBlbnMgYWxsIHRoZSB0aW1lIHdoZW4gcGxheWluZyBrZXkgY2xpY2tzIG92ZXIgQTJEUAotICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgQUxPR1YoIk1pbmltdW0gYnVmZmVyIHNpemUgY29ycmVjdGVkIGZyb20gJXp1IHRvICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9CkBAIC05ODAsNDIgKzEwNjcsNTggQEAKICAgICB9CiAKICAgICBwaWRfdCB0aWQgPSAtMTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwogICAgICAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgdGlkID0gbUF1ZGlvVHJhY2tUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CiAgICAgICAgIHRyYWNrRmxhZ3MgfD0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRDsKICAgICB9CiAKLSAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVRyYWNrKHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgdHJhY2tGbGFncyB8PSBJQXVkaW9GbGluZ2VyOjpUUkFDS19ESVJFQ1Q7CisgICAgfQorCisgICAgc2l6ZV90IHRlbXAgPSBmcmFtZUNvdW50OyAgIC8vIHRlbXAgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgcmV2aXNlZCB2YWx1ZSBvZiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbHNvCisgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9GbGluZ2VyIG9ubHkgc2VlcyAxNi1iaXQgUENNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAotICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQorICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOworCisgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCisgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgorCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKKyAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwpAQCAtMTAyMywyMiArMTEyNiwyNSBAQAogICAgIH0KICAgICBtQXVkaW9UcmFjayA9IHRyYWNrOwogICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKLSAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtLT5wb2ludGVyKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgc2l6ZV90IHRlbXAgPSBjYmxrLT5mcmFtZUNvdW50XzsKKyAgICAvLyBub3RlIHRoYXQgdGVtcCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIGZyYW1lQ291bnQKICAgICBpZiAodGVtcCA8IGZyYW1lQ291bnQgfHwgKGZyYW1lQ291bnQgPT0gMCAmJiB0ZW1wID09IDApKSB7CiAgICAgICAgIC8vIEluIGN1cnJlbnQgZGVzaWduLCBBdWRpb1RyYWNrIGNsaWVudCBjaGVja3MgYW5kIGVuc3VyZXMgZnJhbWUgY291bnQgdmFsaWRpdHkgYmVmb3JlCiAgICAgICAgIC8vIHBhc3NpbmcgaXQgdG8gQXVkaW9GbGluZ2VyIHNvIEF1ZGlvRmxpbmdlciBzaG91bGQgbm90IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSBleGNlcHQKICAgICAgICAgLy8gZm9yIGZhc3QgdHJhY2sgYXMgaXQgdXNlcyBhIHNwZWNpYWwgbWV0aG9kIG9mIGFzc2lnbmluZyBmcmFtZSBjb3VudC4KLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCwgdGVtcCk7CisgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7CiAgICAgfQogICAgIGZyYW1lQ291bnQgPSB0ZW1wOworCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCiAgICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRpZ2h0ZXIgc2NoZWR1bGluZy4gIEJ1dCBpbiBwcmFjdGljZSwgdG8gYWNjb21tb2RhdGUga2VybmVscyB3aXRoCiAgICAgICAgICAgICAgICAgLy8gc2NoZWR1bGluZyBqaXR0ZXIsIGFuZCBhcHBzIHdpdGggY29tcHV0YXRpb24gaml0dGVyLCB3ZSB1c2UgZG91YmxlLWJ1ZmZlcmluZy4KQEAgLTEwNDcsMjggKzExNTMsMzkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV1IiwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IGZyYW1lQ291bnQvbkJ1ZmZlcmluZykgewogICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC9uQnVmZmVyaW5nOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19PRkZMT0FEKSB7CiAgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBzdWNjZXNzZnVsIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfT0ZGTE9BRCBkZW5pZWQgYnkgc2VydmVyIik7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOwotICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IsIHNvIGRvbid0IHJldHVybiBlcnJvciBzdGF0dXMKKyAgICAgICAgICAgIC8vcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICBpZiAodHJhY2tGbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RJUkVDVCkgeworICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCBzdWNjZXNzZnVsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIGRlbmllZCBieSBzZXJ2ZXIiKTsKKyAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBpcyBhIHdhcm5pbmcsIG5vdCBhbiBlcnJvciwgc28gZG9uJ3QgcmV0dXJuIGVycm9yIHN0YXR1cworICAgICAgICAgICAgLy9yZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQorICAgIG1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCiAgICAgLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiBidWZmZXJzIGluIHNoYXJlZCBtZW1vcnkuICBJZiB0aGVyZSBpcyBhIHNoYXJlZCBidWZmZXIsIGJ1ZmZlcnMKQEAgLTEwNzYsMTUgKzExOTMsMTYgQEAKICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY29udHJvbCBibG9jay4gIFRoaXMgYWRkcmVzcyBpcyBmb3IgdGhlIG1hcHBpbmcgd2l0aGluIGNsaWVudAogICAgIC8vIGFkZHJlc3Mgc3BhY2UuICBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6bUJ1ZmZlciBpcyBmb3IgdGhlIHNlcnZlciBhZGRyZXNzIHNwYWNlLgogICAgIHZvaWQqIGJ1ZmZlcnM7Ci0gICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CisgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJzID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgfQogCiAgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgIC8vIEZJWE1FIGRvbid0IGJlbGlldmUgdGhpcyBsaWUKLSAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKKyAgICBtTGF0ZW5jeSA9IGFmTGF0ZW5jeSArICgxMDAwKmZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CisKICAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgLy8gSWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAogICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgpAQCAtMTA5MywyNCArMTIxMSwzMCBAQAogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQotICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICAgbVN0YXRpY1Byb3h5LmNsZWFyKCk7CiAgICAgICAgIG1Qcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZUFGKTsKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemVBRik7CiAgICAgICAgIG1Qcm94eSA9IG1TdGF0aWNQcm94eTsKICAgICB9Ci0gICAgbVByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QobVZvbHVtZVtSSUdIVF0gKiAweDEwMDApKSA8PCAxNikgfAotICAgICAgICAgICAgdWludDE2X3QobVZvbHVtZVtMRUZUXSAqIDB4MTAwMCkpOworICAgIG1Qcm94eS0+c2V0Vm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKTsKICAgICBtUHJveHktPnNldFNlbmRMZXZlbChtU2VuZExldmVsKTsKICAgICBtUHJveHktPnNldFNhbXBsZVJhdGUobVNhbXBsZVJhdGUpOwotICAgIG1Qcm94eS0+c2V0RXBvY2goZXBvY2gpOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgbUF1ZGlvVHJhY2stPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKK3JlbGVhc2U6CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQob3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKQEAgLTEyMzEsNiArMTM1NSw3IEBACiAgICAgYnVmZmVyLm1SYXcgPSBhdWRpb0J1ZmZlci0+cmF3OwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIG1SZWxlYXNlZCArPSBzdGVwQ291bnQ7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAKQEAgLTEyMzgsOCArMTM2Myw3IEBACiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBuYW1lPSVzIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1OYW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgdGhpcyk7CiAgICAgICAgICAgICAvLyBGSVhNRSBpZ25vcmluZyBzdGF0dXMKICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICB9CkBAIC0xMjQ4LDE2ICsxMzcyLDI2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSkKK3NzaXplX3QgQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUsIGJvb2wgYmxvY2tpbmcpCiB7CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9TWU5DIHx8IG1Jc1RpbWVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoaXNEaXJlY3QoKSkgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGludDMyX3QgZmxhZ3MgPSBhbmRyb2lkX2F0b21pY19hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfihDQkxLX1VOREVSUlVOIHwgQ0JMS19MT09QX0NZQ0xFIHwgQ0JMS19MT09QX0ZJTkFMIHwgQ0JMS19CVUZGRVJfRU5EKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNibGstPm1GbGFncyk7CisgICAgICAgIGlmIChmbGFncyAmIENCTEtfSU5WQUxJRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gU2FuaXR5LWNoZWNrOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6d3JpdGUoYnVmZmVyPSVwLCBzaXplPSV1ICglZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTI2Nyw3ICsxNDAxLDggQEAKICAgICB3aGlsZSAodXNlclNpemUgPj0gbUZyYW1lU2l6ZSkgewogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUgLyBtRnJhbWVTaXplOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsICZDbGllbnRQcm94eTo6a0ZvcmV2ZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJsb2NraW5nID8gJkNsaWVudFByb3h5OjprRm9yZXZlciA6ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM2Myw3ICsxNDk4LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1uc2Vjc190IEF1ZGlvVHJhY2s6OnByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiYgdGhyZWFkKQorbnNlY3NfdCBBdWRpb1RyYWNrOjpwcm9jZXNzQXVkaW9CdWZmZXIoKQogewogICAgIC8vIEN1cnJlbnRseSB0aGUgQXVkaW9UcmFjayB0aHJlYWQgaXMgbm90IGNyZWF0ZWQgaWYgdGhlcmUgYXJlIG5vIGNhbGxiYWNrcy4KICAgICAvLyBXb3VsZCBpdCBldmVyIG1ha2Ugc2Vuc2UgdG8gcnVuIHRoZSB0aHJlYWQsIGV2ZW4gd2l0aG91dCBjYWxsYmFja3M/CkBAIC0xNDAxLDcgKzE1MzYsNyBAQAogICAgICAgICAvLyBmb3Igb2ZmbG9hZGVkIHRyYWNrcyByZXN0b3JlVHJhY2tfbCgpIHdpbGwganVzdCB1cGRhdGUgdGhlIHNlcXVlbmNlIGFuZCBjbGVhcgogICAgICAgICAvLyBBdWRpb1N5c3RlbSBjYWNoZS4gV2Ugc2hvdWxkIG5vdCBleGl0IGhlcmUgYnV0IGFmdGVyIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHNvCiAgICAgICAgIC8vIHRoYXQgdGhlIHVwcGVyIGxheWVycyBjYW4gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmICghaXNPZmZsb2FkZWQoKSB8fCAobVNlcXVlbmNlID09IG1PYnNlcnZlZFNlcXVlbmNlKSkgeworICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseSwgYnV0IHdpdGggYSBuZXcgSUF1ZGlvVHJhY2sKQEAgLTE0MzMsNyArMTU2OCw3IEBACiAgICAgfQogCiAgICAgLy8gR2V0IGN1cnJlbnQgcG9zaXRpb24gb2Ygc2VydmVyCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpOworICAgIHNpemVfdCBwb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKTsKIAogICAgIC8vIE1hbmFnZSBtYXJrZXIgY2FsbGJhY2sKICAgICBib29sIG1hcmtlclJlYWNoZWQgPSBmYWxzZTsKQEAgLTE0NTYsNyArMTU5MSw3IEBACiAgICAgLy8gQ2FjaGUgb3RoZXIgZmllbGRzIHRoYXQgd2lsbCBiZSBuZWVkZWQgc29vbgogICAgIHVpbnQzMl90IGxvb3BQZXJpb2QgPSBtTG9vcFBlcmlvZDsKICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7CisgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE0OTEsNiArMTYyNiw3IEBACiAgICAgICAgICAgICAgICAgd2FpdFN0cmVhbUVuZCA9IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgICAgICBpZiAod2FpdFN0cmVhbUVuZCkgewogICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOworICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh3YWl0U3RyZWFtRW5kICYmIHN0YXR1cyAhPSBERUFEX09CSkVDVCkgewpAQCAtMTUyNyw3ICsxNjYzLDcgQEAKICAgICAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBzZXF1ZW5jZTsKICAgICAgICAgbUNiZihFVkVOVF9ORVdfSUFVRElPVFJBQ0ssIG1Vc2VyRGF0YSwgTlVMTCk7CiAgICAgICAgIC8vIGZvciBvZmZsb2FkZWQgdHJhY2tzLCBqdXN0IHdhaXQgZm9yIHRoZSB1cHBlciBsYXllcnMgdG8gcmVjcmVhdGUgdGhlIHRyYWNrCi0gICAgICAgIGlmIChpc09mZmxvYWRlZCgpKSB7CisgICAgICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKICAgICAgICAgICAgIHJldHVybiBOU19JTkFDVElWRTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1ODUsMTAgKzE3MjEsMTAgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXUgPSAldSArICV1IGVyciAlZCIsCisgICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAogICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSIHx8CkBAIC0xNjIwLDEyICsxNzU2LDExIEBACiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKICAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgc2l6ZV90IHdyaXR0ZW5GcmFtZXMgPSB3cml0dGVuU2l6ZSAvIG1GcmFtZVNpemU7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3Qod3JpdHRlblNpemUpIDwgMCB8fCB3cml0dGVuU2l6ZSA+IHJlcVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIChpbnQpIHdyaXR0ZW5TaXplKTsKKyAgICAgICAgICAgIEFMT0dFKCJFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTE2ODYsMzcgKzE4MjEsMzEgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7CiAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWRlZCIgOiAiUENNIiwgZnJvbSk7CisgICAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAgICAgc3RhdHVzX3QgcmVzdWx0OwogCiAgICAgLy8gcmVmcmVzaCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBjYWNoZSBpbiB0aGlzIHByb2Nlc3MgdG8gbWFrZSBzdXJlIHdlIGdldCBuZXcKLSAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBnZXRPdXRwdXRfbCgpIGFuZCBjcmVhdGVUcmFja19sKCkKKyAgICAvLyBvdXRwdXQgcGFyYW1ldGVycyBpbiBjcmVhdGVUcmFja19sKCkKICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICAvLyBGSVhNRSByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgdHJhY2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KIAotICAgIC8vIGZvcmNlIG5ldyBvdXRwdXQgcXVlcnkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlcjsKLSAgICBtT3V0cHV0ID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRfbCgpOworICAgIC8vIHNhdmUgdGhlIG9sZCBzdGF0aWMgYnVmZmVyIHBvc2l0aW9uCisgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uID0gbVN0YXRpY1Byb3h5ICE9IE5VTEwgPyBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uKCkgOiAwOwogCi0gICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9UcmFjayBpcyBjcmVhdGVkLCBjcmVhdGVUcmFja19sKCkgd2lsbCBtb2RpZnkgdGhlCisgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvVHJhY2ssIG1DYmxrTWVtb3J5IGFuZCBtQ2Jsay4KLSAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9UcmFjayBhbmQgSU1lbW9yeQorICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1RyYWNrIGFuZCBJTWVtb3J5LgorICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCisgICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCiAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCi0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVByb3h5LT5nZXRQb3NpdGlvbigpICsgbVByb3h5LT5nZXRGcmFtZXNGaWxsZWQoKTsKLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7Ci0gICAgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbChtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgLy8gc28gdGhhdCBmcmFtZSBjb3VudCBuZXZlciBnb2VzIGRvd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAvKmVwb2NoKi8pOworICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgbVBvc2l0aW9uID0gbVJlbGVhc2VkOwogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBjb250aW51ZSBwbGF5YmFjayBmcm9tIGxhc3Qga25vd24gcG9zaXRpb24sIGJ1dApAQCAtMTc0NCwxNyArMTg3MywzNSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy9Vc2Ugb2YgZGlyZWN0IGFuZCBvZmZsb2FkZWQgb3V0cHV0IHN0cmVhbXMgaXMgcmVmIGNvdW50ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCi0gICAgICAgIC8vIEFzIGdldE91dHB1dCB3YXMgY2FsbGVkIGFib3ZlIGFuZCByZXN1bHRlZCBpbiBhbiBvdXRwdXQgc3RyZWFtIHRvIGJlIG9wZW5lZCwKLSAgICAgICAgLy8gd2UgbmVlZCB0byByZWxlYXNlIGl0LgotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQpOwogICAgICAgICBBTE9HVygicmVzdG9yZVRyYWNrX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCit1aW50MzJfdCBBdWRpb1RyYWNrOjp1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkKK3sKKyAgICAvLyBUaGlzIGlzIHRoZSBzb2xlIHBsYWNlIHRvIHJlYWQgc2VydmVyIGNvbnN1bWVkIGZyYW1lcworICAgIHVpbnQzMl90IG5ld1NlcnZlciA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKTsKKyAgICBpbnQzMl90IGRlbHRhID0gbmV3U2VydmVyIC0gbVNlcnZlcjsKKyAgICBtU2VydmVyID0gbmV3U2VydmVyOworICAgIC8vIFRPRE8gVGhlcmUgaXMgY29udHJvdmVyc3kgYWJvdXQgd2hldGhlciB0aGVyZSBjYW4gYmUgIm5lZ2F0aXZlIGppdHRlciIgaW4gc2VydmVyIHBvc2l0aW9uLgorICAgIC8vICAgICAgVGhpcyBzaG91bGQgYmUgaW52ZXN0aWdhdGVkIGZ1cnRoZXIsIGFuZCBpZiBwb3NzaWJsZSwgaXQgc2hvdWxkIGJlIGFkZHJlc3NlZC4KKyAgICAvLyAgICAgIEEgbW9yZSBkZWZpbml0ZSBmYWlsdXJlIG1vZGUgaXMgaW5mcmVxdWVudCBwb2xsaW5nIGJ5IGNsaWVudC4KKyAgICAvLyAgICAgIE9uZSBjb3VsZCBjYWxsICh2b2lkKWdldFBvc2l0aW9uX2woKSBpbiByZWxlYXNlQnVmZmVyKCksCisgICAgLy8gICAgICBzbyBtUmVsZWFzZWQgYW5kIG1Qb3NpdGlvbiBhcmUgYWx3YXlzIGxvY2stc3RlcCBhcyBiZXN0IHBvc3NpYmxlLgorICAgIC8vICAgICAgVGhhdCBzaG91bGQgZW5zdXJlIGRlbHRhIG5ldmVyIGdvZXMgbmVnYXRpdmUgZm9yIGluZnJlcXVlbnQgcG9sbGluZworICAgIC8vICAgICAgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIG1vcmUgdGhhbiAyXjMxIGZyYW1lcyBpbiBpdHMgYnVmZmVyLAorICAgIC8vICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgdXNlIG9mIHVpbnQzMl90IGZvciB0aGVzZSBjb3VudGVycyBoYXMgYmlnZ2VyIGlzc3Vlcy4KKyAgICBpZiAoZGVsdGEgPCAwKSB7CisgICAgICAgIEFMT0dFKCJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLCBkZWx0YSk7CisgICAgICAgIGRlbHRhID0gMDsKKyAgICB9CisgICAgcmV0dXJuIG1Qb3NpdGlvbiArPSAodWludDMyX3QpIGRlbHRhOworfQorCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTc2OCwyNiArMTkxNSwxMjggQEAKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFNUQVRFX0FDVElWRToKKyAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgYnJlYWs7IC8vIGhhbmRsZSBiZWxvdworICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKKyAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOgorICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOgorICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBvZmZsb2FkZWQgdHJhY2tzIGhhbmRsZWQgYmVsb3cKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBicmVhazsKICAgICB9CisKKyAgICAvLyBUaGUgcHJlc2VudGVkIGZyYW1lIGNvdW50IG11c3QgYWx3YXlzIGxhZyBiZWhpbmQgdGhlIGNvbnN1bWVkIGZyYW1lIGNvdW50LgorICAgIC8vIFRvIGF2b2lkIGEgcmFjZSwgcmVhZCB0aGUgcHJlc2VudGVkIGZyYW1lcyBmaXJzdC4gIFRoaXMgZW5zdXJlcyB0aGF0IHByZXNlbnRlZCA8PSBjb25zdW1lZC4KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uICs9IG1Qcm94eS0+Z2V0RXBvY2goKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBXT1VMRF9CTE9DSywgImdldFRpbWVzdGFtcCBlcnJvcjolI3giLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKKyAgICAgICAgaWYgKGlzT2ZmbG9hZGVkX2woKSAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRCB8fCBtU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1NUT1BQSU5HKSkgeworICAgICAgICAgICAgLy8gdXNlIGNhY2hlZCBwYXVzZWQgcG9zaXRpb24gaW4gY2FzZSBhbm90aGVyIG9mZmxvYWRlZCB0cmFjayBpcyBydW5uaW5nLgorICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdGltZXN0YW1wLm1UaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwZW5kaW5nIGZsdXNoIG9yIHN0b3AgaGFzIGNvbXBsZXRlZCwgYXMgdGhvc2UgY29tbWFuZHMgbWF5CisgICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2guCisgICAgICAgIGlmIChtU3RhcnRVcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOworCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVOb3cgPSBnZXROb3dVcygpOworCisgICAgICAgICAgICBpZiAodGltZU5vdyA8IG1TdGFydFVzICsgazFTZWNVcykgeyAvLyB3aXRoaW4gZmlyc3Qgc2Vjb25kIG9mIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBUaW1lVXMgPSBjb252ZXJ0VGltZXNwZWNUb1VzKHRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFRpbWVVcyA8IG1TdGFydFVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsgIC8vIHN0YWxlIHRpbWVzdGFtcCB0aW1lLCBvY2N1cnMgYmVmb3JlIHN0YXJ0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhVGltZVVzID0gdGltZXN0YW1wVGltZVVzIC0gbVN0YXJ0VXM7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IHRpbWVzdGFtcC5tUG9zaXRpb24gKiAxMDAwMDAwTEwgLyBtU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uQnlVcyA+IGRlbHRhVGltZVVzICsga1RpbWVKaXR0ZXJVcykgeworICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY291bnRlciBjYW4ndCBjb3VudCBmYXN0ZXIgdGhhbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcGxldGVseSBmbHVzaCBvciBzdG9wIHRoZSBwcmV2aW91cyBwbGF5aW5nIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW5jb21wbGV0ZSBmbHVzaCBvciBzdG9wOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIG5vIG5lZWQgdG8gY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWVzdGFtcCBoYXMgZWl0aGVyIGV4cGlyZWQgb3IgdW5uZWVkZWQuCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgdGhlIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBjb25zdW1lZCAobVBvc2l0aW9uKSBhbmQgc2VydmVyIGNvbnN1bWVkIChtU2VydmVyKQorICAgICAgICAodm9pZCkgdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOworICAgICAgICAvLyBTZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpIGFuZCBwcmVzZW50ZWQgYm90aCB1c2UgdGhlIHNhbWUgc2VydmVyIHRpbWUgYmFzZSwKKyAgICAgICAgLy8gYW5kIHNlcnZlciBjb25zdW1lZCBpcyBhbHdheXMgPj0gcHJlc2VudGVkLgorICAgICAgICAvLyBUaGUgZGVsdGEgYmV0d2VlbiB0aGVzZSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBidWZmZXIgcGlwZWxpbmUuCisgICAgICAgIC8vIElmIHRoaXMgZGVsdGEgYmV0d2VlbiB0aGVzZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNsaWVudCBwb3NpdGlvbiwgaXQgbWVhbnMgdGhhdAorICAgICAgICAvLyBhY3R1YWxseSBwcmVzZW50ZWQgaXMgc3RpbGwgc3R1Y2sgYXQgdGhlIHN0YXJ0aW5nIGxpbmUgKGZpZ3VyYXRpdmVseSBzcGVha2luZyksCisgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBmaXJzdCBmcmFtZSB0byBnbyBieS4gIFNvIHdlIGNhbid0IHJlcG9ydCBhIHZhbGlkIHRpbWVzdGFtcCB5ZXQuCisgICAgICAgIGlmICgodWludDMyX3QpIChtU2VydmVyIC0gdGltZXN0YW1wLm1Qb3NpdGlvbikgPiBtUG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0IHRpbWVzdGFtcCBwb3NpdGlvbiBmcm9tIHNlcnZlciB0aW1lIGJhc2UgdG8gY2xpZW50IHRpbWUgYmFzZS4KKyAgICAgICAgLy8gVE9ETyBUaGUgZm9sbG93aW5nIGNvZGUgc2hvdWxkIHdvcmsgT0sgbm93IGJlY2F1c2UgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyAzMi1iaXQuCisgICAgICAgIC8vIEJ1dCBpZiB3ZSBjaGFuZ2UgaXQgdG8gNjQtYml0IHRoZW4gdGhpcyBjb3VsZCBmYWlsLgorICAgICAgICAvLyBJZiAobVBvc2l0aW9uIC0gbVNlcnZlcikgY2FuIGJlIG5lZ2F0aXZlIHRoZW4gc2hvdWxkIHVzZToKKyAgICAgICAgLy8gICAoaW50MzJfdCkobVBvc2l0aW9uIC0gbVNlcnZlcikKKyAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiArPSBtUG9zaXRpb24gLSBtU2VydmVyOworICAgICAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgdG8gZ2V0UG9zaXRpb25fbCgpLCBtUG9zaXRpb24gYW5kCisgICAgICAgIC8vIG1TZXJ2ZXIgYm90aCByZXByZXNlbnQgdGhlIHNhbWUgZnJhbWUgcG9zaXRpb24uICBtUG9zaXRpb24gaXMKKyAgICAgICAgLy8gaW4gY2xpZW50J3MgcG9pbnQgb2YgdmlldywgYW5kIG1TZXJ2ZXIgaXMgaW4gc2VydmVyJ3MgcG9pbnQgb2YKKyAgICAgICAgLy8gdmlldy4gIFNvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgImZ1ZGdlIGZhY3RvciIKKyAgICAgICAgLy8gYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciB2aWV3cyBkdWUgdG8gc3RvcCgpIGFuZC9vciBuZXcKKyAgICAgICAgLy8gSUF1ZGlvVHJhY2suICBBbmQgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyBpbml0aWFsbHkgaW4gc2VydmVyJ3MKKyAgICAgICAgLy8gcG9pbnQgb2Ygdmlldywgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgc2FtZSBmdWRnZSBmYWN0b3IgdG8gaXQuCiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIFN0cmluZzggQXVkaW9UcmFjazo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKQogewotICAgIGlmIChtT3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhtT3V0cHV0LCBrZXlzKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXQoKTsKKyAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhvdXRwdXQsIGtleXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0Citib29sIEF1ZGlvVHJhY2s6OmlzT2ZmbG9hZGVkKCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGlzT2ZmbG9hZGVkX2woKTsKK30KKworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc0RpcmVjdF9sKCk7Cit9CisKK2Jvb2wgQXVkaW9UcmFjazo6aXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHJldHVybiBpc09mZmxvYWRlZE9yRGlyZWN0X2woKTsKK30KKworCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgY29uc3QKIHsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTc5Niw5ICsyMDQ1LDkgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CisgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCVkKVxuIiwgbUZvcm1hdCwKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgZm9ybWF0KCVkKSwgY2hhbm5lbCBjb3VudCglZCksIGZyYW1lIGNvdW50KCV6dSlcbiIsIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBtRnJhbWVDb3VudCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBzYW1wbGUgcmF0ZSgldSksIHN0YXR1cyglZClcbiIsIG1TYW1wbGVSYXRlLCBtU3RhdHVzKTsKQEAgLTE4MTUsOSArMjA2NCwxNDYgQEAKICAgICByZXR1cm4gbVByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpOwogfQogCit2b2lkIEF1ZGlvVHJhY2s6OnNldEF0dHJpYnV0ZXNGcm9tU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IDB4MDsKKworICAgIHN3aXRjaChzdHJlYW1UeXBlKSB7CisgICAgY2FzZSBBVURJT19TVFJFQU1fREVGQVVMVDoKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX01FRElBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzICB8PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQ7CisgICAgICAgIC8vIGludGVuZGVkIGZhbGwgdGhyb3VnaCwgYXR0cmlidXRlcyBpbiBjb21tb24gd2l0aCBTVFJFQU1fU1lTVEVNCisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FMQVJNOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzIHw9IEFVRElPX0ZMQUdfU0NPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgorICAgICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIOworICAgICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJWQgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCBzdHJlYW1UeXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9UcmFjazo6c2V0U3RyZWFtVHlwZUZyb21BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYWEpIHsKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhYS5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChhYS5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYWEudXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgLy8gVE9ETyBvbmNlIEF1ZGlvUG9saWN5TWFuYWdlciBmdWxseSBzdXBwb3J0cyBhdWRpb19hdHRyaWJ1dGVzX3QsCisgICAgICAgIC8vICAgcmVtb3ZlIHN0cmVhbSBjaGFuZ2UgYmFzZWQgb24gcGhvbmUgc3RhdGUKKyAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSkgeworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vLyBGQUxMIFRIUk9VR0gKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9TWVNURU07CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKyAgICAgICAgcmV0dXJuOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIH0KK30KKworYm9vbCBBdWRpb1RyYWNrOjppc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSkgeworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTykpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaGFzIGtub3duIHVzYWdlPworICAgIHN3aXRjaCAocGFhLT51c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBBdWRpb1RyYWNrOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvVHJhY2s6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxBdWRpb1RyYWNrPiBhdWRpb1RyYWNrID0gbUF1ZGlvVHJhY2sucHJvbW90ZSgpOwogICAgIGlmIChhdWRpb1RyYWNrICE9IDApIHsKQEAgLTE4NjEsNyArMjI0NywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbnNlY3NfdCBucyA9IG1SZWNlaXZlci5wcm9jZXNzQXVkaW9CdWZmZXIodGhpcyk7CisgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBuc2Vjc190IG5zID0gbVJlY2VpdmVyLnByb2Nlc3NBdWRpb0J1ZmZlcigpOwogICAgIHN3aXRjaCAobnMpIHsKICAgICBjYXNlIDA6CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTg3NSw3ICsyMjY0LDcgQEAKICAgICAgICAgbnMgPSAxMDAwMDAwMDAwTEw7CiAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJWxsZCIsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKaW5kZXggY2FhNzkwMC4uZWVjMDI1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAKQEAgLTE5LDE1ICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICIuLi9wcml2YXRlL2Jpb25pY19mdXRleC5oIgotfQorCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGF1ZGlvX3RyYWNrX2NibGtfdDo6YXVkaW9fdHJhY2tfY2Jsa190KCkKLSAgICA6IG1TZXJ2ZXIoMCksIGZyYW1lQ291bnRfKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApLAotICAgIG1Wb2x1bWVMUigweDEwMDAxMDAwKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQorICAgIDogbVNlcnZlcigwKSwgbUZ1dGV4KDApLCBtTWluaW11bSgwKSwKKyAgICBtVm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCksIG1GbGFncygwKQogewogICAgIG1lbXNldCgmdSwgMCwgc2l6ZW9mKHUpKTsKIH0KQEAgLTEzNCwxMCArMTM0LDE3IEBACiAgICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKLSAgICAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGlmIChtSXNPdXQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGluZyBkb3duIiwgZmlsbGVkLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3IgaW5wdXQsIHN5bmMgdXAgb24gb3ZlcnJ1bgorICAgICAgICAgICAgZmlsbGVkID0gMDsKKyAgICAgICAgICAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQgPSByZWFyOworICAgICAgICAgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfT1ZFUlJVTiwgJmNibGstPm1GbGFncyk7CiAgICAgICAgIH0KICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgZmlsbGluZyBwaXBlIGJleW9uZCB0aGUgbm9taW5hbCBzaXplCiAgICAgICAgIHNpemVfdCBhdmFpbCA9IG1Jc091dCA/IG1GcmFtZUNvdW50IC0gZmlsbGVkIDogZmlsbGVkOwpAQCAtMjAwLDE4ICsyMDcsMTggQEAKICAgICAgICAgICAgIHRzID0gJnJlbWFpbmluZzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvYnRhaW5CdWZmZXIoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CiAgICAgICAgICAgICB0cyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgaW50IHJjOwogICAgICAgICAgICAgaWYgKG1lYXN1cmUgJiYgIWJlZm9yZUlzVmFsaWQpIHsKICAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmJlZm9yZSk7CiAgICAgICAgICAgICAgICAgYmVmb3JlSXNWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcmV0ID0gX19mdXRleF9zeXNjYWxsNCgmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwKICAgICAgICAgICAgICAgICAgICAgbUNsaWVudEluU2VydmVyID8gRlVURVhfV0FJVF9QUklWQVRFIDogRlVURVhfV0FJVCwgb2xkICYgfkNCTEtfRlVURVhfV0FLRSwgdHMpOwogICAgICAgICAgICAgLy8gdXBkYXRlIHRvdGFsIGVsYXBzZWQgdGltZSBzcGVudCB3YWl0aW5nCiAgICAgICAgICAgICBpZiAobWVhc3VyZSkgewpAQCAtMjMwLDE2ICsyMzcsMTYgQEAKICAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKICAgICAgICAgICAgICAgICBiZWZvcmVJc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKLSAgICAgICAgICAgIGNhc2UgLUVXT1VMREJMT0NLOiAgLy8gYmVuaWduIHJhY2UgY29uZGl0aW9uIHdpdGggc2VydmVyCi0gICAgICAgICAgICBjYXNlIC1FSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKLSAgICAgICAgICAgIGNhc2UgLUVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAorICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKKyAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKKyAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCisgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoZXNlIGVycm9yL25vbi0wIHN0YXR1cyBhcmUgYmVpbmcgZHJvcHBlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1yZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuZXhwZWN0ZWQgZXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3Ioc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI5NSw3ICszMDIsNyBAQAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJmNibGstPm1GbGFncykgJiBDQkxLX0lOVkFMSUQpKSB7CiAgICAgICAgIC8vIGl0IHNlZW1zIHRoYXQgYSBGVVRFWF9XQUtFX1BSSVZBVEUgd2lsbCBub3Qgd2FrZSBhIEZVVEVYX1dBSVQsIGV2ZW4gd2l0aGluIHNhbWUgcHJvY2VzcwotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAorICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAogICAgICAgICAgICAgICAgIDEpOwogICAgIH0KIH0KQEAgLTMwNCw3ICszMTEsNyBAQAogewogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGlmICghKGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5URVJSVVBULCAmY2Jsay0+bUZsYWdzKSAmIENCTEtfSU5URVJSVVBUKSkgewotICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAorICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBtQ2xpZW50SW5TZXJ2ZXIgPyBGVVRFWF9XQUtFX1BSSVZBVEUgOiBGVVRFWF9XQUtFLAogICAgICAgICAgICAgICAgIDEpOwogICAgIH0KIH0KQEAgLTMzMSw3ICszMzgsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKKyAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gKHNpemVfdClmaWxsZWQ7CkBAIC00MjksMjQgKzQzNiwyNCBAQAogICAgICAgICAgICAgdHMgPSAmcmVtYWluaW5nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoIndhaXRTdHJlYW1FbmREb25lKCkgdGltZW91dD0lZCIsIHRpbWVvdXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgid2FpdFN0cmVhbUVuZERvbmUoKSB0aW1lb3V0PSVkIiwgdGltZW91dCk7CiAgICAgICAgICAgICB0cyA9IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgaW50IHJjOwotICAgICAgICAgICAgaW50IHJldCA9IF9fZnV0ZXhfc3lzY2FsbDQoJmNibGstPm1GdXRleCwKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBSVRfUFJJVkFURSA6IEZVVEVYX1dBSVQsIG9sZCAmIH5DQkxLX0ZVVEVYX1dBS0UsIHRzKTsKLSAgICAgICAgICAgIHN3aXRjaCAocmV0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKLSAgICAgICAgICAgIGNhc2UgLUVXT1VMREJMT0NLOiAgLy8gYmVuaWduIHJhY2UgY29uZGl0aW9uIHdpdGggc2VydmVyCi0gICAgICAgICAgICBjYXNlIC1FSU5UUjogICAgICAgIC8vIHdhaXQgd2FzIGludGVycnVwdGVkIGJ5IHNpZ25hbCBvciBvdGhlciBzcHVyaW91cyB3YWtldXAKLSAgICAgICAgICAgIGNhc2UgLUVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAorICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgIC8vIG5vcm1hbCB3YWtldXAgYnkgc2VydmVyLCBvciBieSBiaW5kZXJEaWVkKCkKKyAgICAgICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAvLyBiZW5pZ24gcmFjZSBjb25kaXRpb24gd2l0aCBzZXJ2ZXIKKyAgICAgICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAvLyB3YWl0IHdhcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwgb3Igb3RoZXIgc3B1cmlvdXMgd2FrZXVwCisgICAgICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgLy8gdGltZS1vdXQgZXhwaXJlZAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5leHBlY3RlZCBlcnJvciAlZCIsIF9fZnVuY19fLCByZXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1yZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZXJybm87CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHVuZXhwZWN0ZWQgZXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyZXJyb3Ioc3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3MCwxNCArNDc3LDE5IEBACiAKIHZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpmbHVzaCgpCiB7Ci0gICAgTE9HX0ZBVEFMKCJzdGF0aWMgZmx1c2giKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzdGF0aWMgZmx1c2giKTsKIH0KIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHk6OnNldExvb3Aoc2l6ZV90IGxvb3BTdGFydCwgc2l6ZV90IGxvb3BFbmQsIGludCBsb29wQ291bnQpCiB7CisgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gb24gYSA2NC1iaXQgY2xpZW50CisgICAgaWYgKGxvb3BTdGFydCA+IFVJTlQzMl9NQVggfHwgbG9vcEVuZCA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gRklYTUUgU2hvdWxkIHJldHVybiBhbiBlcnJvciBzdGF0dXMKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgbmV3U3RhdGU7Ci0gICAgbmV3U3RhdGUubUxvb3BTdGFydCA9IGxvb3BTdGFydDsKLSAgICBuZXdTdGF0ZS5tTG9vcEVuZCA9IGxvb3BFbmQ7CisgICAgbmV3U3RhdGUubUxvb3BTdGFydCA9ICh1aW50MzJfdCkgbG9vcFN0YXJ0OworICAgIG5ld1N0YXRlLm1Mb29wRW5kID0gKHVpbnQzMl90KSBsb29wRW5kOwogICAgIG5ld1N0YXRlLm1Mb29wQ291bnQgPSBsb29wQ291bnQ7CiAgICAgbUJ1ZmZlclBvc2l0aW9uID0gbG9vcFN0YXJ0OwogICAgICh2b2lkKSBtTXV0YXRvci5wdXNoKG5ld1N0YXRlKTsKQEAgLTQ4Nyw3ICs0OTksNyBAQAogewogICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbjsKICAgICBpZiAobU11dGF0b3IuYWNrKCkpIHsKLSAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtQ2Jsay0+dS5tU3RhdGljLm1CdWZmZXJQb3NpdGlvbjsKKyAgICAgICAgYnVmZmVyUG9zaXRpb24gPSAoc2l6ZV90KSBtQ2Jsay0+dS5tU3RhdGljLm1CdWZmZXJQb3NpdGlvbjsKICAgICAgICAgaWYgKGJ1ZmZlclBvc2l0aW9uID4gbUZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbUZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTUzMCw3ICs1NDIsNyBAQAogICAgICAgICAgICAgaWYgKGZyb250ICE9IHJlYXIpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX29yKENCTEtfRlVURVhfV0FLRSwgJmNibGstPm1GdXRleCk7CiAgICAgICAgICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgICAgICAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LAorICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU0Myw3ICs1NTUsNyBAQAogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lZCk7IHNodXR0aW5nIGRvd24iLCBmaWxsZWQpOworICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgIH0KICAgICBpZiAobUlzU2h1dGRvd24pIHsKQEAgLTYxNiwxMyArNjI4LDEzIEBACiAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoc3RlcENvdW50ICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CiAgICAgfQogCi0gICAgbUNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OworICAgIGNibGstPm1TZXJ2ZXIgKz0gc3RlcENvdW50OwogCiAgICAgc2l6ZV90IGhhbGYgPSBtRnJhbWVDb3VudCAvIDI7CiAgICAgaWYgKGhhbGYgPT0gMCkgewogICAgICAgICBoYWxmID0gMTsKICAgICB9Ci0gICAgc2l6ZV90IG1pbmltdW0gPSBjYmxrLT5tTWluaW11bTsKKyAgICBzaXplX3QgbWluaW11bSA9IChzaXplX3QpIGNibGstPm1NaW5pbXVtOwogICAgIGlmIChtaW5pbXVtID09IDApIHsKICAgICAgICAgbWluaW11bSA9IG1Jc091dCA/IGhhbGYgOiAxOwogICAgIH0gZWxzZSBpZiAobWluaW11bSA+IGhhbGYpIHsKQEAgLTYzMCwxMCArNjQyLDEwIEBACiAgICAgfQogICAgIC8vIEZJWE1FIEF1ZGlvUmVjb3JkIHdha2V1cCBuZWVkcyB0byBiZSBvcHRpbWl6ZWQ7IGl0IGN1cnJlbnRseSB3YWtlcyB1cCBjbGllbnQgZXZlcnkgdGltZQogICAgIGlmICghbUlzT3V0IHx8IChtQXZhaWxUb0NsaWVudCArIHN0ZXBDb3VudCA+PSBtaW5pbXVtKSkgewotICAgICAgICBBTE9HVigibUF2YWlsVG9DbGllbnQ9JXUgc3RlcENvdW50PSV1IG1pbmltdW09JXUiLCBtQXZhaWxUb0NsaWVudCwgc3RlcENvdW50LCBtaW5pbXVtKTsKKyAgICAgICAgQUxPR1YoIm1BdmFpbFRvQ2xpZW50PSV6dSBzdGVwQ291bnQ9JXp1IG1pbmltdW09JXp1IiwgbUF2YWlsVG9DbGllbnQsIHN0ZXBDb3VudCwgbWluaW11bSk7CiAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAgICAgaWYgKCEob2xkICYgQ0JMS19GVVRFWF9XQUtFKSkgewotICAgICAgICAgICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJmNibGstPm1GdXRleCwKKyAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsCiAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsIDEpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjYzLDcgKzY3NSw3IEBACiAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JWQpOyBzaHV0dGluZyBkb3duIiwgZmlsbGVkKTsKKyAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkKTsgc2h1dHRpbmcgZG93biIsIGZpbGxlZCk7CiAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjc0LDEwICs2ODYsMTEgQEAKIH0KIAogYm9vbCAgQXVkaW9UcmFja1NlcnZlclByb3h5OjpzZXRTdHJlYW1FbmREb25lKCkgeworICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIGJvb2wgb2xkID0KLSAgICAgICAgICAgIChhbmRyb2lkX2F0b21pY19vcihDQkxLX1NUUkVBTV9FTkRfRE9ORSwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19TVFJFQU1fRU5EX0RPTkUpICE9IDA7CisgICAgICAgICAgICAoYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19TVFJFQU1fRU5EX0RPTkUsICZjYmxrLT5tRmxhZ3MpICYgQ0JMS19TVFJFQU1fRU5EX0RPTkUpICE9IDA7CiAgICAgaWYgKCFvbGQpIHsKLSAgICAgICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJm1DYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZjYmxrLT5tRnV0ZXgsIG1DbGllbnRJblNlcnZlciA/IEZVVEVYX1dBS0VfUFJJVkFURSA6IEZVVEVYX1dBS0UsCiAgICAgICAgICAgICAgICAgMSk7CiAgICAgfQogICAgIHJldHVybiBvbGQ7CkBAIC02ODUsMTAgKzY5OCwxMSBAQAogCiB2b2lkIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50KQogewotICAgIG1DYmxrLT51Lm1TdHJlYW1pbmcubVVuZGVycnVuRnJhbWVzICs9IGZyYW1lQ291bnQ7CisgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1VbmRlcnJ1bkZyYW1lcyArPSBmcmFtZUNvdW50OwogCiAgICAgLy8gRklYTUUgYWxzbyB3YWtlIGZ1dGV4IHNvIHRoYXQgdW5kZXJydW4gaXMgbm90aWNlZCBtb3JlIHF1aWNrbHkKLSAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19VTkRFUlJVTiwgJm1DYmxrLT5tRmxhZ3MpOworICAgICh2b2lkKSBhbmRyb2lkX2F0b21pY19vcihDQkxLX1VOREVSUlVOLCAmY2Jsay0+bUZsYWdzKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03NjAsMTIgKzc3NCwxMyBAQAogICAgICAgICAgICAgbUlzU2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIChzc2l6ZV90KSBOT19JTklUOwogICAgICAgICB9Ci0gICAgICAgIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIC8vIFRoaXMgbWF5IG92ZXJmbG93LCBidXQgY2xpZW50IGlzIG5vdCBzdXBwb3NlZCB0byByZWx5IG9uIGl0CisgICAgICAgIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBwb3NpdGlvbjsKICAgICB9CiAgICAgcmV0dXJuIChzc2l6ZV90KSBwb3NpdGlvbjsKIH0KIAotc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBidWZmZXIsIGJvb2wgYWNrRmx1c2gpCitzdGF0dXNfdCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCBfX3VudXNlZCkKIHsKICAgICBpZiAobUlzU2h1dGRvd24pIHsKICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb3VudCA9IDA7CkBAIC04MTksNyArODM0LDcgQEAKICAgICBzaXplX3QgbmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIHN0ZXBDb3VudDsKICAgICBpbnQzMl90IHNldEZsYWdzID0gMDsKICAgICBpZiAoIShwb3NpdGlvbiA8PSBuZXdQb3NpdGlvbiAmJiBuZXdQb3NpdGlvbiA8PSBtRnJhbWVDb3VudCkpIHsKLSAgICAgICAgQUxPR1coIiVzIG5ld1Bvc2l0aW9uICV1IG91dHNpZGUgWyV1LCAldV0iLCBfX2Z1bmNfXywgbmV3UG9zaXRpb24sIHBvc2l0aW9uLCBtRnJhbWVDb3VudCk7CisgICAgICAgIEFMT0dXKCIlcyBuZXdQb3NpdGlvbiAlenUgb3V0c2lkZSBbJXp1LCAlenVdIiwgX19mdW5jX18sIG5ld1Bvc2l0aW9uLCBwb3NpdGlvbiwgbUZyYW1lQ291bnQpOwogICAgICAgICBuZXdQb3NpdGlvbiA9IG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgIT0gMCAmJiBuZXdQb3NpdGlvbiA9PSBtU3RhdGUubUxvb3BFbmQpIHsKICAgICAgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID09IC0xIHx8IC0tbVN0YXRlLm1Mb29wQ291bnQgIT0gMCkgewpAQCAtODM2LDcgKzg1MSw4IEBACiAgICAgbVBvc2l0aW9uID0gbmV3UG9zaXRpb247CiAKICAgICBjYmxrLT5tU2VydmVyICs9IHN0ZXBDb3VudDsKLSAgICBjYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgLy8gVGhpcyBtYXkgb3ZlcmZsb3csIGJ1dCBjbGllbnQgaXMgbm90IHN1cHBvc2VkIHRvIHJlbHkgb24gaXQKKyAgICBjYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBuZXdQb3NpdGlvbjsKICAgICBpZiAoc2V0RmxhZ3MgIT0gMCkgewogICAgICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3Ioc2V0RmxhZ3MsICZjYmxrLT5tRmxhZ3MpOwogICAgICAgICAvLyB0aGlzIHdvdWxkIGJlIGEgZ29vZCBwbGFjZSB0byB3YWtlIGEgZnV0ZXgKQEAgLTg0Nyw3ICs4NjMsNyBAQAogICAgIGJ1ZmZlci0+bU5vbkNvbnRpZyA9IDA7CiB9CiAKLXZvaWQgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp0YWxseVVuZGVycnVuRnJhbWVzKHVpbnQzMl90IGZyYW1lQ291bnQpCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50IF9fdW51c2VkKQogewogICAgIC8vIFVubGlrZSBBdWRpb1RyYWNrU2VydmVyUHJveHk6OnRhbGx5VW5kZXJydW5GcmFtZXMoKSB1c2VkIGZvciBzdHJlYW1pbmcgdHJhY2tzLAogICAgIC8vIHdlIGRvbid0IGhhdmUgYSBsb2NhdGlvbiB0byBjb3VudCB1bmRlcnJ1biBmcmFtZXMuICBUaGUgdW5kZXJydW4gZnJhbWUgY291bnRlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk5NGRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNoYXJhY3RlckVuY29kaW5nRGVjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgorI2luY2x1ZGUgIkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3JUYWJsZXMuaCIKKworI2luY2x1ZGUgInV0aWxzL1ZlY3Rvci5oIgorI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjc2RldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKSB7CisKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBtVXRmOENvbnYgPSB1Y252X29wZW4oIlVURi04IiwgJnN0YXR1cyk7CisgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgY3JlYXRlIFVDb252ZXJ0ZXIgZm9yIFVURi04Iik7CisgICAgICAgIG1VdGY4Q29udiA9IE5VTEw7CisgICAgfQorfQorCitDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjp+Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpIHsKKyAgICB1Y252X2Nsb3NlKG1VdGY4Q29udik7Cit9CisKK3ZvaWQgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvcjo6YWRkVGFnKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgbU5hbWVzLnB1c2hfYmFjayhuYW1lKTsKKyAgICBtVmFsdWVzLnB1c2hfYmFjayh2YWx1ZSk7Cit9CisKK3NpemVfdCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpzaXplKCkgeworICAgIHJldHVybiBtTmFtZXMuc2l6ZSgpOworfQorCitzdGF0dXNfdCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpnZXRUYWcoaW50IGluZGV4LCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhcioqdmFsdWUpIHsKKyAgICBpZiAoaW5kZXggPj0gbU5hbWVzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGluZGV4KTsKKyAgICAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGluZGV4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIGlzUHJpbnRhYmxlQXNjaWkoY29uc3QgY2hhciAqdmFsdWUsIHNpemVfdCBsZW4pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmICgodmFsdWVbaV0gJiAweDgwKSB8fCB2YWx1ZVtpXSA8IDB4MjAgfHwgdmFsdWVbaV0gPT0gMHg3ZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OmRldGVjdEFuZENvbnZlcnQoKSB7CisKKyAgICBpbnQgc2l6ZSA9IG1OYW1lcy5zaXplKCk7CisgICAgQUxPR1YoIiVkIHRhZ3MgYmVmb3JlIGNvbnZlcnNpb24iLCBzaXplKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBBTE9HVigiJXM6ICVzIiwgbU5hbWVzLmdldEVudHJ5KGkpLCBtVmFsdWVzLmdldEVudHJ5KGkpKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAmJiBtVXRmOENvbnYpIHsKKworICAgICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgICAgVUNoYXJzZXREZXRlY3RvciAqY3NkID0gdWNzZGV0X29wZW4oJnN0YXR1cyk7CisgICAgICAgIGNvbnN0IFVDaGFyc2V0TWF0Y2ggKnVjbTsKKworICAgICAgICAvLyB0cnkgY29tYmluZWQgZGV0ZWN0aW9uIG9mIGFydGlzdC9hbGJ1bS90aXRsZSBldGMuCisgICAgICAgIGNoYXIgYnVmWzEwMjRdOworICAgICAgICBidWZbMF0gPSAwOworICAgICAgICBpbnQgaWR4OworICAgICAgICBib29sIGFsbHByaW50YWJsZSA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUgPSBtVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaWYgKCFpc1ByaW50YWJsZUFzY2lpKHZhbHVlLCBzdHJsZW4odmFsdWUpKSAmJiAoCisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW1hcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiY29tcG9zZXIiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiZ2VucmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW0iKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAidGl0bGUiKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgdmFsdWUsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZSB0YWdzIGJ5IHNwYWNlIHNvIElDVSdzIG5ncmFtIGRldGVjdG9yIGNhbiBkbyBpdHMgam9iCisgICAgICAgICAgICAgICAgc3RybGNhdChidWYsICIgIiwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIGFsbHByaW50YWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29tYmluZWRlbmMgPSAiVVRGLTgiOworICAgICAgICBpZiAoYWxscHJpbnRhYmxlKSB7CisgICAgICAgICAgICAvLyBzaW5jZSAnYnVmJyBpcyBlbXB0eSwgSUNVIHdvdWxkIHJldHVybiBhIFVURi04IG1hdGNoZXIgd2l0aCBsb3cgY29uZmlkZW5jZSwgc28KKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZXZlbiBjYWxsIGl0CisgICAgICAgICAgICBBTE9HVigiYWxsIHRhZ3MgYXJlIHByaW50YWJsZSwgYXNzdW1pbmcgYXNjaWkgKCV6dSkiLCBzdHJsZW4oYnVmKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIGJ1Ziwgc3RybGVuKGJ1ZiksICZzdGF0dXMpOworICAgICAgICAgICAgaW50MzJfdCBtYXRjaGVzOworICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCoqIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOworICAgICAgICAgICAgYm9vbCBnb29kbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgaW50IGhpZ2hlc3QgPSAwOworICAgICAgICAgICAgY29uc3QgVUNoYXJzZXRNYXRjaCogYmVzdENvbWJpbmVkTWF0Y2ggPSBnZXRQcmVmZXJyZWQoYnVmLCBzdHJsZW4oYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgdWNtYSwgbWF0Y2hlcywgJmdvb2RtYXRjaCwgJmhpZ2hlc3QpOworCisgICAgICAgICAgICBBTE9HVigiZ29vZG1hdGNoOiAlcywgaGlnaGVzdDogJWQiLCBnb29kbWF0Y2ggPyAidHJ1ZSIgOiAiZmFsc2UiLCBoaWdoZXN0KTsKKyAgICAgICAgICAgIGlmICghZ29vZG1hdGNoICYmIChoaWdoZXN0IDwgMTUgfHwgc3RybGVuKGJ1ZikgPCAyMCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibm90IGEgZ29vZCBtYXRjaCwgdHJ5aW5nIHdpdGggbW9yZSBkYXRhIik7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJpbmcgbWlnaHQgYmUgdG9vIHNob3J0IGZvciBJQ1UgdG8gZG8gYW55dGhpbmcgdXNlZnVsIHdpdGguCisgICAgICAgICAgICAgICAgLy8gKHJlYWwgd29ybGQgZXhhbXBsZTogIkJqw7ZyayIgaW4gSVNPLTg4NTktMSBtaWdodCBiZSBkZXRlY3RlZCBhcyBHQjE4MDMwLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gIHRoZSBJU08gZGV0ZWN0b3IgcmVwb3J0cyBhIGNvbmZpZGVuY2Ugb2YgMCwgd2hpbGUgdGhlIEdCMTgwMzAgZGV0ZWN0b3IgcmVwb3J0cworICAgICAgICAgICAgICAgIC8vICBhIGNvbmZpZGVuY2Ugb2YgMTAgd2l0aCBubyBpbnZhbGlkIGNoYXJhY3RlcnMpCisgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGFydGlzdCwgYWxidW0gYW5kIHRpdGxlIGlmIHRoZXkgd2VyZSBwcmV2aW91c2x5IG9taXR0ZWQgYmVjYXVzZSB0aGV5CisgICAgICAgICAgICAgICAgLy8gd2VyZSBwcmludGFibGUgYXNjaWkuCisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtTmFtZXMuZ2V0RW50cnkoaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkodmFsdWUsIHN0cmxlbih2YWx1ZSkpICYmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYXJ0aXN0IikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiYWxidW0iKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJ0aXRsZSIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChidWYsIHZhbHVlLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGJ1ZiwgIiAiLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHVjc2RldF9zZXRUZXh0KGNzZCwgYnVmLCBzdHJsZW4oYnVmKSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHVjbWEgPSB1Y3NkZXRfZGV0ZWN0QWxsKGNzZCwgJm1hdGNoZXMsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBiZXN0Q29tYmluZWRNYXRjaCA9IGdldFByZWZlcnJlZChidWYsIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjbWEsIG1hdGNoZXMsICZnb29kbWF0Y2gsICZoaWdoZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnb29kbWF0Y2ggJiYgaGlnaGVzdCA8PSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0aWxsIG5vdCBhIGdvb2QgbWF0Y2ggYWZ0ZXIgYWRkaW5nIHByaW50YWJsZSB0YWdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Q29tYmluZWRNYXRjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibm8gcHJpbnRhYmxlIHRhZ3MgdG8gYWRkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmVzdENvbWJpbmVkTWF0Y2ggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gdWNzZGV0X2dldE5hbWUoYmVzdENvbWJpbmVkTWF0Y2gsICZzdGF0dXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZGVuYyA9ICJJU08tODg1OS0xIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbU5hbWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLmdldEVudHJ5KGkpOworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigoY2hhciAqKXNyYyk7CisgICAgICAgICAgICB1aW50OF90KiBkZXN0ID0gc3JjOworCisgICAgICAgICAgICBBTE9HVigiQEBAIGNoZWNraW5nICVzIiwgbmFtZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgIGludDMyX3QgaW5wdXRMZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICplbmM7CisKKyAgICAgICAgICAgIGlmICghYWxscHJpbnRhYmxlICYmICghc3RyY21wKG5hbWUsICJhcnRpc3QiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bWFydGlzdCIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgImNvbXBvc2VyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChuYW1lLCAiZ2VucmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJhbGJ1bSIpIHx8CisgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobmFtZSwgInRpdGxlIikpKSB7CisgICAgICAgICAgICAgICAgLy8gdXNlIGVuY29kaW5nIGRldGVybWluZWQgZnJvbSB0aGUgY29tYmluYXRpb24gb2YgYXJ0aXN0L2FsYnVtL3RpdGxlIGV0Yy4KKyAgICAgICAgICAgICAgICBlbmMgPSBjb21iaW5lZGVuYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUHJpbnRhYmxlQXNjaWkocywgaW5wdXRMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuYyA9ICJVVEYtOCI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJAQEBAICVzIGlzIGFzY2lpIiwgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1Y3NkZXRfc2V0VGV4dChjc2QsIHMsIGlucHV0TGVuZ3RoLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgdWNtID0gdWNzZGV0X2RldGVjdChjc2QsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXVjbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVZhbHVlcy5zZXRFbnRyeShpLCAiPz8/Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmMgPSB1Y3NkZXRfZ2V0TmFtZSh1Y20sICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQEBAQCByZWNvZ25pemVkIGNoYXJzZXQ6ICVzIGZvciAlcyBjb25maWRlbmNlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMsIG1OYW1lcy5nZXRFbnRyeShpKSwgdWNzZGV0X2dldENvbmZpZGVuY2UodWNtLCAmc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyY21wKGVuYywiVVRGLTgiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBjb252ZXJ0IGlmIHRoZSBzb3VyY2UgZW5jb2RpbmcgaXNuJ3QgYWxyZWFkeSBVVEYtOAorICAgICAgICAgICAgICAgIEFMT0dWKCJAQEAgdXNpbmcgY29udmVydGVyICVzIGZvciAlcyIsIGVuYywgbU5hbWVzLmdldEVudHJ5KGkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAgICAgVUNvbnZlcnRlciAqY29udiA9IHVjbnZfb3BlbihlbmMsICZzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciAlcyAoJWQpLCBmYWxsaW5nIGJhY2sgdG8gSVNPLTg4NTktMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIGNvbnYgPSB1Y252X29wZW4oIklTTy04ODU5LTEiLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBJU08tODg1OS0xIGVpdGhlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gbmF0aXZlIGVuY29kaW5nIHRvIFVURi04CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlID0gbVZhbHVlcy5nZXRFbnRyeShpKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gbGVuICogMyArIDE7CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbdGFyZ2V0TGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjaGVjayBmb3IgTlVMTCwgYnV0IGluIHRoaXMgY2FzZSB0YXJnZXRMZW5ndGggbWF5IGJlIGxhcmdlCisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNoYXIqIHRhcmdldCA9IGJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIHVjbnZfY29udmVydEV4KG1VdGY4Q29udiwgY29udiwgJnRhcmdldCwgdGFyZ2V0ICsgdGFyZ2V0TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgc291cmNlICsgc3RybGVuKHNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKKworICAgICAgICAgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidWNudl9jb252ZXJ0RXggZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIG1WYWx1ZXMuc2V0RW50cnkoaSwgIj8/PyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gdGVybWluYXRlCisgICAgICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tdGFyZ2V0ID4gYnVmZmVyICYmICp0YXJnZXQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGxlYWRpbmcgc3BhY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0YXJ0ID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKnN0YXJ0ID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtVmFsdWVzLnNldEVudHJ5KGksIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisKKyAgICAgICAgICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgaWYgKHN0cmxlbihtVmFsdWVzLmdldEVudHJ5KGkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImVyYXNpbmcgJXMgYmVjYXVzZSBlbnRyeSBpcyBlbXB0eSIsIG1OYW1lcy5nZXRFbnRyeShpKSk7CisgICAgICAgICAgICAgICAgbU5hbWVzLmVyYXNlKGkpOworICAgICAgICAgICAgICAgIG1WYWx1ZXMuZXJhc2UoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1Y3NkZXRfY2xvc2UoY3NkKTsKKyAgICB9Cit9CisKKy8qCisgKiBXaGVuIElDVSBkZXRlY3RzIG11bHRpcGxlIGVuY29kaW5nIG1hdGNoZXMsIGFwcGx5IGFkZGl0aW9uYWwgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG9uZSBpcyB0aGUgYmVzdCBtYXRjaCwgc2luY2UgSUNVIGNhbid0IGFsd2F5cyBiZSB0cnVzdGVkIHRvIG1ha2UgdGhlIHJpZ2h0IGNob2ljZS4KKyAqCisgKiBXaGF0IHRoaXMgbWV0aG9kIGRvZXMgaXM6CisgKiAtIGRlY29kZSB0aGUgaW5wdXQgdXNpbmcgZWFjaCBvZiB0aGUgbWF0Y2hlcyBmb3VuZAorICogLSByZWNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgY29uZmlkZW5jZSBsZXZlbCBmb3IgbXVsdGlieXRlIGVuY29kaW5ncyB1c2luZyBhIGRpZmZlcmVudAorICogICBhbGdvcml0aG0gYW5kIGxhcmdlciBmcmVxdWVudCBjaGFyYWN0ZXIgbGlzdHMgdGhhbiBJQ1UKKyAqIC0gZGV2YWx1ZSBlbmNvZGluZyB3aGVyZSB0aGUgY29udmVyc2lvbiBjb250YWlucyB1bmxpa2VseSBjaGFyYWN0ZXJzIChzeW1ib2xzLCByZXNlcnZlZCwgZXRjKQorICogLSBwaWNrIHRoZSBoaWdoZXN0IG1hdGNoCisgKiAtIHNpZ25hbCB0byB0aGUgY2FsbGVyIHdoZXRoZXIgdGhpcyBtYXRjaCBpcyBjb25zaWRlcmVkIGdvb2Q6IGNvbmZpZGVuY2UgPiAxNSwgYW5kIGNvbmZpZGVuY2UKKyAqICAgZGVsdGEgd2l0aCB0aGUgbmV4dCBydW5uZXIgdXAgPiAxNQorICovCitjb25zdCBVQ2hhcnNldE1hdGNoICpDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjpnZXRQcmVmZXJyZWQoCisgICAgICAgIGNvbnN0IGNoYXIgKmlucHV0LCBzaXplX3QgbGVuLAorICAgICAgICBjb25zdCBVQ2hhcnNldE1hdGNoKiogdWNtYSwgc2l6ZV90IG51bW1hdGNoZXMsCisgICAgICAgIGJvb2wgKmdvb2RtYXRjaCwgaW50ICpoaWdoZXN0bWF0Y2gpIHsKKworICAgICpnb29kbWF0Y2ggPSBmYWxzZTsKKyAgICBWZWN0b3I8Y29uc3QgVUNoYXJzZXRNYXRjaCo+IG1hdGNoZXM7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisKKyAgICBBTE9HVigiJXp1IG1hdGNoZXMiLCBudW1tYXRjaGVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bW1hdGNoZXM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICplbmNuYW1lID0gdWNzZGV0X2dldE5hbWUodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UodWNtYVtpXSwgJnN0YXR1cyk7CisgICAgICAgIEFMT0dWKCIlenU6ICVzICVkIiwgaSwgZW5jbmFtZSwgY29uZmlkZW5jZSk7CisgICAgICAgIG1hdGNoZXMucHVzaF9iYWNrKHVjbWFbaV0pOworICAgIH0KKworICAgIHNpemVfdCBudW0gPSBtYXRjaGVzLnNpemUoKTsKKyAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW0gPT0gMSkgeworICAgICAgICBpbnQgY29uZmlkZW5jZSA9IHVjc2RldF9nZXRDb25maWRlbmNlKG1hdGNoZXNbMF0sICZzdGF0dXMpOworICAgICAgICBpZiAoY29uZmlkZW5jZSA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlc1swXTsKKyAgICB9CisKKyAgICBBTE9HVigiY29uc2lkZXJpbmcgJXp1IG1hdGNoZXMiLCBudW0pOworCisgICAgLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSAic3BlY2lhbCIgY2hhcmFjdGVycyByZXN1bHQgd2hlbiBjb252ZXJ0aW5nIHRoZSBpbnB1dCB1c2luZyBlYWNoCisgICAgLy8gZW5jb2RpbmcKKyAgICBWZWN0b3I8aW50PiBuZXdjb25maWRlbmNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmZyZXFkYXRhID0gTlVMTDsKKyAgICAgICAgZmxvYXQgZnJlcWNvdmVyYWdlID0gMDsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBjb25zdCBjaGFyICplbmNuYW1lID0gdWNzZGV0X2dldE5hbWUobWF0Y2hlc1tpXSwgJnN0YXR1cyk7CisgICAgICAgIGludCBjb25maWRlbmNlID0gdWNzZGV0X2dldENvbmZpZGVuY2UobWF0Y2hlc1tpXSwgJnN0YXR1cyk7CisgICAgICAgIGlmICghc3RyY21wKCJHQjE4MDMwIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfemhDTjsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X3poQ05fY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQmlnNSIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X3poVFc7CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF96aFRXX2NvdmVyYWdlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkVVQy1LUiIsIGVuY25hbWUpKSB7CisgICAgICAgICAgICBmcmVxZGF0YSA9IGZyZXF1ZW50X2tvOworICAgICAgICAgICAgZnJlcWNvdmVyYWdlID0gZnJlcXVlbnRfa29fY292ZXJhZ2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiRVVDLUpQIiwgZW5jbmFtZSkpIHsKKyAgICAgICAgICAgIGZyZXFkYXRhID0gZnJlcXVlbnRfamE7CisgICAgICAgICAgICBmcmVxY292ZXJhZ2UgPSBmcmVxdWVudF9qYV9jb3ZlcmFnZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJTaGlmdF9KSVMiLCBlbmNuYW1lKSkgeworICAgICAgICAgICAgZnJlcWRhdGEgPSBmcmVxdWVudF9qYTsKKyAgICAgICAgICAgIGZyZXFjb3ZlcmFnZSA9IGZyZXF1ZW50X2phX2NvdmVyYWdlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiV6dTogJXMgJWQiLCBpLCBlbmNuYW1lLCBjb25maWRlbmNlKTsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKGVuY25hbWUsICZzdGF0dXMpOworICAgICAgICBpbnQgZGVtZXJpdCA9IDA7CisgICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byBvcGVuICVzOiAlZCIsIGVuY25hbWUsIHN0YXR1cyk7CisgICAgICAgICAgICBjb25maWRlbmNlID0gMDsKKyAgICAgICAgICAgIGRlbWVyaXQgKz0gMTAwMDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICpzb3VyY2UgPSBpbnB1dDsKKyAgICAgICAgY29uc3QgY2hhciAqc291cmNlTGltaXQgPSBpbnB1dCArIGxlbjsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBpbnQgZnJlcXVlbnRjaGFycyA9IDA7CisgICAgICAgIGludCB0b3RhbGNoYXJzID0gMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIC8vIGRlbWVyaXQgdGhlIGN1cnJlbnQgZW5jb2RpbmcgZm9yIGVhY2ggInNwZWNpYWwiIGNoYXJhY3RlciBmb3VuZCBhZnRlciBjb252ZXJzaW9uLgorICAgICAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkZW1lcml0IGlzIHNvbWV3aGF0IGFyYml0cmFyaWx5IGNob3Nlbi4KKyAgICAgICAgICAgIGludCBpbmNoYXI7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IHNvdXJjZUxpbWl0KSB7CisgICAgICAgICAgICAgICAgaW5jaGFyID0gKHNvdXJjZVswXSA8PCA4KSArIHNvdXJjZVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVDaGFyMzIgYyA9IHVjbnZfZ2V0TmV4dFVDaGFyKGNvbnYsICZzb3VyY2UsIHNvdXJjZUxpbWl0LCAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjIDwgMHgyMCB8fCAoYyA+PSAweDdmICYmIGMgPD0gMHgwMDlmKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjb250cm9sIGNoYXJhY3RlciAleCIsIGMpOworICAgICAgICAgICAgICAgIGRlbWVyaXQgKz0gMTAwOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYyA9PSAweGEwKSAgICAgICAgICAgICAgICAgICAgICAvLyBuby1icmVhayBzcGFjZQorICAgICAgICAgICAgICAgICAgICB8fCAoYyA+PSAweGEyICYmIGMgPD0gMHhiZSkgICAgICAgICAvLyBzeW1ib2xzLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICAgICAgfHwgKGMgPT0gMHhkNykgfHwgKGMgPT0gMHhmNykgICAgICAgLy8gbXVsdGlwbGljYXRpb24gYW5kIGRpdmlzaW9uIHNpZ25zCisgICAgICAgICAgICAgICAgICAgIHx8IChjID49IDB4MjAwMCAmJiBjIDw9IDB4MjA5ZikpIHsgIC8vIHB1bmN0dWF0aW9uLCBzdXBlcnNjcmlwdHMKKyAgICAgICAgICAgICAgICBBTE9HVigidW5saWtlbHkgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGUwMDAgJiYgYyA8PSAweGY4ZmYpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicHJpdmF0ZSB1c2UgY2hhcmFjdGVyICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAzMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweDIxOTAgJiYgYyA8PSAweDJiZmYpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHJhbmdlIGNvbXByaXNlcyB2YXJpb3VzIHN5bWJvbCByYW5nZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gYXBwZWFyIGluCisgICAgICAgICAgICAgICAgLy8gbXVzaWMgZmlsZSBtZXRhZGF0YS4KKyAgICAgICAgICAgICAgICBBTE9HVigic3ltYm9sICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSAxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAweGZmZmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwbGFjZW1lbnQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAweGZmZjAgJiYgYyA8PSAweGZmZmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidW5pY29kZSBzcGVjaWFsICV4IiwgYyk7CisgICAgICAgICAgICAgICAgZGVtZXJpdCArPSA1MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJlcWRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRvdGFsY2hhcnMrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNGcmVxdWVudChmcmVxZGF0YSwgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlcXVlbnRjaGFycysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnJlcWRhdGEgIT0gTlVMTCAmJiB0b3RhbGNoYXJzICE9IDApIHsKKyAgICAgICAgICAgIGludCBteWNvbmZpZGVuY2UgPSAxMCArIGZsb2F0KCgxMDAgKiBmcmVxdWVudGNoYXJzKSAvIHRvdGFsY2hhcnMpIC8gZnJlcWNvdmVyYWdlOworICAgICAgICAgICAgQUxPR1YoIklDVSBjb25maWRlbmNlOiAlZCwgbXkgY29uZmlkZW5jZTogJWQgKCVkICVkKSIsIGNvbmZpZGVuY2UsIG15Y29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdG90YWxjaGFycywgZnJlcXVlbnRjaGFycyk7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlID4gMTAwKSBteWNvbmZpZGVuY2UgPSAxMDA7CisgICAgICAgICAgICBpZiAobXljb25maWRlbmNlIDwgMCkgbXljb25maWRlbmNlID0gMDsKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBteWNvbmZpZGVuY2U7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVkLSVkPSVkIiwgY29uZmlkZW5jZSwgZGVtZXJpdCwgY29uZmlkZW5jZSAtIGRlbWVyaXQpOworICAgICAgICBuZXdjb25maWRlbmNlLnB1c2hfYmFjayhjb25maWRlbmNlIC0gZGVtZXJpdCk7CisgICAgICAgIHVjbnZfY2xvc2UoY29udik7CisgICAgICAgIGlmIChpID09IDAgJiYgKGNvbmZpZGVuY2UgLSBkZW1lcml0KSA9PSAxMDApIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgYW55IGZ1cnRoZXIsIHdlJ2xsIGVuZCB1cCB1c2luZyB0aGlzIG1hdGNoIGFueXdheQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaW5kIG1hdGNoIHdpdGggaGlnaGVzdCBjb25maWRlbmNlIGFmdGVyIGFkanVzdGluZyBmb3IgdW5saWtlbHkgY2hhcmFjdGVycworICAgIGludCBoaWdoZXN0ID0gbmV3Y29uZmlkZW5jZVswXTsKKyAgICBzaXplX3QgaGlnaGVzdGlkeCA9IDA7CisgICAgaW50IHJ1bm5lcnVwID0gLTEwMDAwOworICAgIGludCBydW5uZXJ1cGlkeCA9IC0xMDAwMDsKKyAgICBudW0gPSBuZXdjb25maWRlbmNlLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGlmIChuZXdjb25maWRlbmNlW2ldID4gaGlnaGVzdCkgeworICAgICAgICAgICAgcnVubmVydXAgPSBoaWdoZXN0OworICAgICAgICAgICAgcnVubmVydXBpZHggPSBoaWdoZXN0aWR4OworICAgICAgICAgICAgaGlnaGVzdCA9IG5ld2NvbmZpZGVuY2VbaV07CisgICAgICAgICAgICBoaWdoZXN0aWR4ID0gaTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdjb25maWRlbmNlW2ldID4gcnVubmVydXApeworICAgICAgICAgICAgcnVubmVydXAgPSBuZXdjb25maWRlbmNlW2ldOworICAgICAgICAgICAgcnVubmVydXBpZHggPSBpOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBBTE9HVigic2VsZWN0aW5nOiAnJXMnIHcvICVkIGNvbmZpZGVuY2UiLAorICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1toaWdoZXN0aWR4XSwgJnN0YXR1cyksIGhpZ2hlc3QpOworICAgIGlmIChydW5uZXJ1cGlkeCA8IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHJ1bm5lciB1cCIpOworICAgICAgICBpZiAoaGlnaGVzdCA+IDE1KSB7CisgICAgICAgICAgICAqZ29vZG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJydW5uZXIgdXA6ICclcycgdy8gJWQgY29uZmlkZW5jZSIsCisgICAgICAgICAgICAgICAgdWNzZGV0X2dldE5hbWUobWF0Y2hlc1tydW5uZXJ1cGlkeF0sICZzdGF0dXMpLCBydW5uZXJ1cCk7CisgICAgICAgIGlmIChydW5uZXJ1cCA8IDApIHsKKyAgICAgICAgICAgIHJ1bm5lcnVwID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGhpZ2hlc3QgLSBydW5uZXJ1cCkgPiAxNSkgeworICAgICAgICAgICAgKmdvb2RtYXRjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgKmhpZ2hlc3RtYXRjaCA9IGhpZ2hlc3Q7CisgICAgcmV0dXJuIG1hdGNoZXNbaGlnaGVzdGlkeF07Cit9CisKKworYm9vbCBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yOjppc0ZyZXF1ZW50KGNvbnN0IHVpbnQxNl90ICp2YWx1ZXMsIHVpbnQzMl90IGMpIHsKKworICAgIGludCBzdGFydCA9IDA7CisgICAgaW50IGVuZCA9IDUxMTsgLy8gQWxsIHRoZSB0YWJsZXMgaGF2ZSA1MTIgZW50cmllcworICAgIGludCBtaWQgPSAoc3RhcnQrZW5kKS8yOworCisgICAgd2hpbGUoc3RhcnQgPD0gZW5kKSB7CisgICAgICAgIGlmKGMgPT0gdmFsdWVzW21pZF0pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGMgPiB2YWx1ZXNbbWlkXSkgeworICAgICAgICAgICAgc3RhcnQgPSBtaWQgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kID0gbWlkIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIG1pZCA9IChzdGFydCArIGVuZCkgLyAyOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvclRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTExMzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yVGFibGVzLmgKQEAgLTAsMCArMSwyMDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIHpoQ04gbGFuZ3VhZ2UgaW4gYSBzYW1wbGUgb2YgdGhlIEludGVybmV0LgorLy8gT3JkZXJlZCBieSBjb2RlcG9pbnQsIGNvbW1lbnQgc2hvd3MgY2hhcmFjdGVyIGFuZCByYW5raW5nIGJ5IGZyZXF1ZW5jeQorY29uc3QgdWludDE2X3QgZnJlcXVlbnRfemhDTltdID0geworICAgIDB4NEUwMCwgLy8g5LiALCAjMgorICAgIDB4NEUwNywgLy8g5LiHLCAjMzA2CisgICAgMHg0RTA5LCAvLyDkuIksICMxMzgKKyAgICAweDRFMEEsIC8vIOS4iiwgIzE2CisgICAgMHg0RTBCLCAvLyDkuIssICMyNQorICAgIDB4NEUwRCwgLy8g5LiNLCAjNworICAgIDB4NEUwRSwgLy8g5LiOLCAjMTMzCisgICAgMHg0RTEzLCAvLyDkuJMsICMxNTEKKyAgICAweDRFMTYsIC8vIOS4liwgIzM0NgorICAgIDB4NEUxQSwgLy8g5LiaLCAjMzkKKyAgICAweDRFMUMsIC8vIOS4nCwgIzE5NworICAgIDB4NEUyNCwgLy8g5LikLCAjMzc2CisgICAgMHg0RTJBLCAvLyDkuKosICMyMworICAgIDB4NEUyRCwgLy8g5LitLCAjNAorICAgIDB4NEUzQSwgLy8g5Li6LCAjMzEKKyAgICAweDRFM0IsIC8vIOS4uywgIzk1CisgICAgMHg0RTNFLCAvLyDkuL4sICM0MTgKKyAgICAweDRFNDgsIC8vIOS5iCwgIzkzCisgICAgMHg0RTRCLCAvLyDkuYssICMxMzEKKyAgICAweDRFNTAsIC8vIOS5kCwgIzEzMAorICAgIDB4NEU1RiwgLy8g5LmfLCAjMTQ1CisgICAgMHg0RTY2LCAvLyDkuaYsICMyODMKKyAgICAweDRFNzAsIC8vIOS5sCwgIzQ4MworICAgIDB4NEU4NiwgLy8g5LqGLCAjMTMKKyAgICAweDRFOEIsIC8vIOS6iywgIzE2OAorICAgIDB4NEU4QywgLy8g5LqMLCAjMjE4CisgICAgMHg0RThFLCAvLyDkuo4sICM2NAorICAgIDB4NEU5NCwgLy8g5LqULCAjNDMwCisgICAgMHg0RTlBLCAvLyDkuposICM0NjgKKyAgICAweDRFOUIsIC8vIOS6mywgIzM2NgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjQzCisgICAgMHg0RUE3LCAvLyDkuqcsICM4NgorICAgIDB4NEVBQiwgLy8g5LqrLCAjMzQ1CisgICAgMHg0RUFDLCAvLyDkuqwsICMyMDYKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzI4NworICAgIDB4NEVDQiwgLy8g5LuLLCAjNDc4CisgICAgMHg0RUNFLCAvLyDku44sICMzODEKKyAgICAweDRFRDYsIC8vIOS7liwgIzEyOQorICAgIDB4NEVFMywgLy8g5LujLCAjMjQxCisgICAgMHg0RUU1LCAvLyDku6UsICM1MQorICAgIDB4NEVFQywgLy8g5LusLCAjODMKKyAgICAweDRFRjYsIC8vIOS7tiwgIzE0MQorICAgIDB4NEVGNywgLy8g5Lu3LCAjMTQwCisgICAgMHg0RUZCLCAvLyDku7ssICMzODMKKyAgICAweDRGMDEsIC8vIOS8gSwgIzQzOQorICAgIDB4NEYxOCwgLy8g5LyYLCAjMzc0CisgICAgMHg0RjFBLCAvLyDkvJosICMyOQorICAgIDB4NEYyMCwgLy8g5LygLCAjMjIyCisgICAgMHg0RjQ2LCAvLyDkvYYsICM0NTEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwOAorICAgIDB4NEY1MywgLy8g5L2TLCAjOTgKKyAgICAweDRGNTUsIC8vIOS9lSwgIzMzOQorICAgIDB4NEY1QywgLy8g5L2cLCAjNDQKKyAgICAweDRGNjAsIC8vIOS9oCwgIzc2CisgICAgMHg0RjdGLCAvLyDkvb8sICMyNzIKKyAgICAweDRGOUIsIC8vIOS+mywgIzM3NQorICAgIDB4NEZERCwgLy8g5L+dLCAjMTgwCisgICAgMHg0RkUxLCAvLyDkv6EsICM4NAorICAgIDB4NEZFRSwgLy8g5L+uLCAjNDM3CisgICAgMHg1MDNDLCAvLyDlgLwsICM0NTAKKyAgICAweDUwNUEsIC8vIOWBmiwgIzM2OAorICAgIDB4NTA2NSwgLy8g5YGlLCAjNDg0CisgICAgMHg1MENGLCAvLyDlg48sICM0ODcKKyAgICAweDUxM0YsIC8vIOWEvywgIzMyNgorICAgIDB4NTE0MywgLy8g5YWDLCAjMjAyCisgICAgMHg1MTQ4LCAvLyDlhYgsICM0ODUKKyAgICAweDUxNDksIC8vIOWFiSwgIzI1NAorICAgIDB4NTE0QiwgLy8g5YWLLCAjNTAzCisgICAgMHg1MTRELCAvLyDlhY0sICMzNDkKKyAgICAweDUxNjUsIC8vIOWFpSwgIzE1NgorICAgIDB4NTE2OCwgLy8g5YWoLCAjNDcKKyAgICAweDUxNkMsIC8vIOWFrCwgIzM1CisgICAgMHg1MTcxLCAvLyDlhbEsICM0NDgKKyAgICAweDUxNzMsIC8vIOWFsywgIzQ5CisgICAgMHg1MTc2LCAvLyDlhbYsICMxOTUKKyAgICAweDUxNzcsIC8vIOWFtywgIzMyOQorICAgIDB4NTE4NSwgLy8g5YaFLCAjMTA5CisgICAgMHg1MThDLCAvLyDlhowsICMyMjUKKyAgICAweDUxOUIsIC8vIOWGmywgIzQ2NgorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNTMKKyAgICAweDUxRkIsIC8vIOWHuywgIzM1OQorICAgIDB4NTIwNiwgLy8g5YiGLCAjMjIKKyAgICAweDUyMTcsIC8vIOWIlywgIzQxMAorICAgIDB4NTIxQiwgLy8g5YibLCAjMzk5CisgICAgMHg1MjI5LCAvLyDliKksICMyOTYKKyAgICAweDUyMkIsIC8vIOWIqywgIzM3MgorICAgIDB4NTIzMCwgLy8g5YiwLCAjMzMKKyAgICAweDUyMzYsIC8vIOWItiwgIzE5MgorICAgIDB4NTI0RCwgLy8g5YmNLCAjMTE3CisgICAgMHg1MjlCLCAvLyDlipssICMxNzMKKyAgICAweDUyOUUsIC8vIOWKniwgIzQzNgorICAgIDB4NTI5RiwgLy8g5YqfLCAjNDU1CisgICAgMHg1MkEwLCAvLyDliqAsICM5NworICAgIDB4NTJBMSwgLy8g5YqhLCAjMTAwCisgICAgMHg1MkE4LCAvLyDliqgsICM0NgorICAgIDB4NTJBOSwgLy8g5YqpLCAjMzY1CisgICAgMHg1MzA1LCAvLyDljIUsICMzMzEKKyAgICAweDUzMTYsIC8vIOWMliwgIzE1NQorICAgIDB4NTMxNywgLy8g5YyXLCAjMTk0CisgICAgMHg1MzNBLCAvLyDljLosICMxMDUKKyAgICAweDUzM0IsIC8vIOWMuywgIzIzNAorICAgIDB4NTM0MSwgLy8g5Y2BLCAjMjk0CisgICAgMHg1MzRFLCAvLyDljY4sICMyMDUKKyAgICAweDUzNTUsIC8vIOWNlSwgIzI1OQorICAgIDB4NTM1NywgLy8g5Y2XLCAjMTgyCisgICAgMHg1MzVBLCAvLyDljZosICMxNTMKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMzMgorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMjcxCisgICAgMHg1M0JCLCAvLyDljrssICMyODIKKyAgICAweDUzQzIsIC8vIOWPgiwgIzUwMAorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMjU1CisgICAgMHg1M0NCLCAvLyDlj4ssICMxODYKKyAgICAweDUzQ0QsIC8vIOWPjSwgIzQyMgorICAgIDB4NTNEMSwgLy8g5Y+RLCAjMTUKKyAgICAweDUzRDcsIC8vIOWPlywgIzUwNworICAgIDB4NTNEOCwgLy8g5Y+YLCAjMzk1CisgICAgMHg1M0UzLCAvLyDlj6MsICMyOTMKKyAgICAweDUzRUEsIC8vIOWPqiwgIzM0MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjNDUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzI2NworICAgIDB4NTNGNywgLy8g5Y+3LCAjMTIxCisgICAgMHg1M0Y4LCAvLyDlj7gsICMxNTAKKyAgICAweDU0MDQsIC8vIOWQhCwgIzQ5MQorICAgIDB4NTQwOCwgLy8g5ZCILCAjMTE1CisgICAgMHg1NDBDLCAvLyDlkIwsICMxODkKKyAgICAweDU0MEQsIC8vIOWQjSwgIzEyNworICAgIDB4NTQwRSwgLy8g5ZCOLCAjNzUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQ1OQorICAgIDB4NTQyNywgLy8g5ZCnLCAjMzUzCisgICAgMHg1NDRBLCAvLyDlkYosICMzMTgKKyAgICAweDU0NTgsIC8vIOWRmCwgIzIzMgorICAgIDB4NTQ2OCwgLy8g5ZGoLCAjMzQ3CisgICAgMHg1NDhDLCAvLyDlkowsICM0MworICAgIDB4NTRDMSwgLy8g5ZOBLCAjMzYKKyAgICAweDU1NDYsIC8vIOWVhiwgIzE0OAorICAgIDB4NTY2OCwgLy8g5ZmoLCAjMjI4CisgICAgMHg1NkRCLCAvLyDlm5ssICMzNTIKKyAgICAweDU2REUsIC8vIOWbniwgIzM4CisgICAgMHg1NkUwLCAvLyDlm6AsICMzNTUKKyAgICAweDU2RTIsIC8vIOWboiwgIzQxMgorICAgIDB4NTZFRCwgLy8g5ZutLCAjNDcwCisgICAgMHg1NkZELCAvLyDlm70sICMxMgorICAgIDB4NTZGRSwgLy8g5Zu+LCAjMzIKKyAgICAweDU3MjgsIC8vIOWcqCwgIzEwCisgICAgMHg1NzMwLCAvLyDlnLAsICMzMAorICAgIDB4NTczQSwgLy8g5Zy6LCAjMTc3CisgICAgMHg1NzVCLCAvLyDlnZssICMzNjQKKyAgICAweDU3OEIsIC8vIOWeiywgIzI3NAorICAgIDB4NTdDRSwgLy8g5Z+OLCAjMTcyCisgICAgMHg1N0ZBLCAvLyDln7osICMzMTUKKyAgICAweDU4RUIsIC8vIOWjqywgIzQzNAorICAgIDB4NThGMCwgLy8g5aOwLCAjMzk3CisgICAgMHg1OTA0LCAvLyDlpIQsICM0MTYKKyAgICAweDU5MDcsIC8vIOWkhywgIzI3MAorICAgIDB4NTkwRCwgLy8g5aSNLCAjMTIyCisgICAgMHg1OTE2LCAvLyDlpJYsICMxOTAKKyAgICAweDU5MUEsIC8vIOWkmiwgIzQwCisgICAgMHg1OTI3LCAvLyDlpKcsICM4CisgICAgMHg1OTI5LCAvLyDlpKksICM1MgorICAgIDB4NTkyQSwgLy8g5aSqLCAjNDU2CisgICAgMHg1OTM0LCAvLyDlpLQsICMyNTgKKyAgICAweDU5NzMsIC8vIOWlsywgIzY1CisgICAgMHg1OTdELCAvLyDlpb0sICM2MgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTM1CisgICAgMHg1QTMxLCAvLyDlqLEsICM0NTIKKyAgICAweDVCNTAsIC8vIOWtkCwgIzM3CisgICAgMHg1QjU3LCAvLyDlrZcsICMyODUKKyAgICAweDVCNjYsIC8vIOWtpiwgIzE5CisgICAgMHg1Qjg5LCAvLyDlroksICMxNDQKKyAgICAweDVCOEMsIC8vIOWujCwgIzQ2OQorICAgIDB4NUI5QSwgLy8g5a6aLCAjMTc5CisgICAgMHg1QjlELCAvLyDlrp0sICMxODgKKyAgICAweDVCOUUsIC8vIOWuniwgIzE1NAorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTc0CisgICAgMHg1QkI2LCAvLyDlrrYsICMyNgorICAgIDB4NUJCOSwgLy8g5a65LCAjMzA3CisgICAgMHg1QkM2LCAvLyDlr4YsICM0NzEKKyAgICAweDVCRjksIC8vIOWvuSwgIzkwCisgICAgMHg1QkZDLCAvLyDlr7wsICMzNDgKKyAgICAweDVDMDYsIC8vIOWwhiwgIzI2NQorICAgIDB4NUMwRiwgLy8g5bCPLCAjMjgKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3OQorICAgIDB4NUMxNCwgLy8g5bCULCAjNDkwCisgICAgMHg1QzMxLCAvLyDlsLEsICMxMDEKKyAgICAweDVDNTUsIC8vIOWxlSwgIzI5MQorICAgIDB4NUM3MSwgLy8g5bGxLCAjMjM5CisgICAgMHg1RERFLCAvLyDlt54sICMyMjcKKyAgICAweDVERTUsIC8vIOW3pSwgIzczCisgICAgMHg1REYxLCAvLyDlt7EsICM0ODAKKyAgICAweDVERjIsIC8vIOW3siwgIzMxMAorICAgIDB4NUUwMiwgLy8g5biCLCAjNzgKKyAgICAweDVFMDMsIC8vIOW4gywgIzM1MAorICAgIDB4NUUwOCwgLy8g5biILCAjMjc3CisgICAgMHg1RTE2LCAvLyDluJYsICMzOTYKKyAgICAweDVFMjYsIC8vIOW4piwgIzQ0OQorICAgIDB4NUUyRSwgLy8g5biuLCAjNDYxCisgICAgMHg1RTM4LCAvLyDluLgsICMzMTkKKyAgICAweDVFNzMsIC8vIOW5sywgIzIxNworICAgIDB4NUU3NCwgLy8g5bm0LCAjMjAKKyAgICAweDVFNzYsIC8vIOW5tiwgIzQ0MAorICAgIDB4NUU3RiwgLy8g5bm/LCAjMTY2CisgICAgMHg1RTkzLCAvLyDlupMsICM0NDYKKyAgICAweDVFOTQsIC8vIOW6lCwgIzE4NworICAgIDB4NUU5NywgLy8g5bqXLCAjMzIwCisgICAgMHg1RUE2LCAvLyDluqYsICMxMTQKKyAgICAweDVFQjcsIC8vIOW6tywgIzQ5OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjExCisgICAgMHg1RjAwLCAvLyDlvIAsICM3MgorICAgIDB4NUYwRiwgLy8g5byPLCAjMjA3CisgICAgMHg1RjE1LCAvLyDlvJUsICM0OTUKKyAgICAweDVGMjAsIC8vIOW8oCwgIzM4NQorICAgIDB4NUYzQSwgLy8g5by6LCAjNDA0CisgICAgMHg1RjUzLCAvLyDlvZMsICMyMzMKKyAgICAweDVGNTUsIC8vIOW9lSwgIzE0NgorICAgIDB4NUY2MiwgLy8g5b2iLCAjNDk0CisgICAgMHg1RjY5LCAvLyDlvaksICMzNTYKKyAgICAweDVGNzEsIC8vIOW9sSwgIzIxNAorICAgIDB4NUY4OCwgLy8g5b6ILCAjMzAwCisgICAgMHg1Rjk3LCAvLyDlvpcsICMxOTMKKyAgICAweDVGQUUsIC8vIOW+riwgIzI0NQorICAgIDB4NUZDMywgLy8g5b+DLCAjNzAKKyAgICAweDVGRUIsIC8vIOW/qywgIzMyNAorICAgIDB4NjAwMSwgLy8g5oCBLCAjNTA4CisgICAgMHg2MDBFLCAvLyDmgI4sICMzNzAKKyAgICAweDYwMjcsIC8vIOaApywgIzk5CisgICAgMHg2MDNCLCAvLyDmgLssICMzOTgKKyAgICAweDYwNkYsIC8vIOaBrywgIzE3NgorICAgIDB4NjBBOCwgLy8g5oKoLCAjMjUxCisgICAgMHg2MEM1LCAvLyDmg4UsICM4NworICAgIDB4NjBGMywgLy8g5oOzLCAjMjkwCisgICAgMHg2MTBGLCAvLyDmhI8sICMxODQKKyAgICAweDYxMUYsIC8vIOaEnywgIzI1MworICAgIDB4NjIwRiwgLy8g5oiPLCAjMjM3CisgICAgMHg2MjEwLCAvLyDmiJAsICM3MQorICAgIDB4NjIxMSwgLy8g5oiRLCAjMTEKKyAgICAweDYyMTYsIC8vIOaIliwgIzMyMQorICAgIDB4NjIxOCwgLy8g5oiYLCAjMzY5CisgICAgMHg2MjM3LCAvLyDmiLcsICMyMTUKKyAgICAweDYyM0YsIC8vIOaIvywgIzIzNgorICAgIDB4NjI0MCwgLy8g5omALCAjMTQ3CisgICAgMHg2MjRCLCAvLyDmiYssICM1NQorICAgIDB4NjI0RCwgLy8g5omNLCAjNDA3CisgICAgMHg2MjUzLCAvLyDmiZMsICMyODEKKyAgICAweDYyODAsIC8vIOaKgCwgIzIwMworICAgIDB4NjI5NSwgLy8g5oqVLCAjNDA4CisgICAgMHg2MkE0LCAvLyDmiqQsICM1MDIKKyAgICAweDYyQTUsIC8vIOaKpSwgIzExMworICAgIDB4NjJEQiwgLy8g5oubLCAjMzYzCisgICAgMHg2MzAxLCAvLyDmjIEsICM0MDMKKyAgICAweDYzMDcsIC8vIOaMhywgIzQxNAorICAgIDB4NjM2RSwgLy8g5o2uLCAjNDA5CisgICAgMHg2MzkyLCAvLyDmjpIsICMzNzcKKyAgICAweDYzQTUsIC8vIOaOpSwgIzI2NgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMjQ0CisgICAgMHg2M0QwLCAvLyDmj5AsICMxODEKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMwMQorICAgIDB4NjRBRCwgLy8g5pKtLCAjNDAxCisgICAgMHg2NTJGLCAvLyDmlK8sICM0MDAKKyAgICAweDY1MzYsIC8vIOaUtiwgIzE1OAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzE3CisgICAgMHg2NTNGLCAvLyDmlL8sICMzODAKKyAgICAweDY1NDgsIC8vIOaViCwgIzQ5NgorICAgIDB4NjU1OSwgLy8g5pWZLCAjMTcwCisgICAgMHg2NTcwLCAvLyDmlbAsICMxMzYKKyAgICAweDY1ODcsIC8vIOaWhywgIzIxCisgICAgMHg2NTk5LCAvLyDmlpksICMyOTUKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3MworICAgIDB4NjVCMCwgLy8g5pawLCAjMTQKKyAgICAweDY1QjksIC8vIOaWuSwgIzY4CisgICAgMHg2NUM1LCAvLyDml4UsICM0NTcKKyAgICAweDY1RTAsIC8vIOaXoCwgIzE2NAorICAgIDB4NjVFNSwgLy8g5pelLCAjNTAKKyAgICAweDY1RjYsIC8vIOaXtiwgIzE4CisgICAgMHg2NjBFLCAvLyDmmI4sICMxMzIKKyAgICAweDY2MTMsIC8vIOaYkywgIzQyOAorICAgIDB4NjYxRiwgLy8g5pifLCAjMjQwCisgICAgMHg2NjJGLCAvLyDmmK8sICM2CisgICAgMHg2NjNFLCAvLyDmmL4sICM0ODYKKyAgICAweDY2RjQsIC8vIOabtCwgIzEwMworICAgIDB4NjcwMCwgLy8g5pyALCAjNjEKKyAgICAweDY3MDgsIC8vIOaciCwgIzgwCisgICAgMHg2NzA5LCAvLyDmnIksICM1CisgICAgMHg2NzBELCAvLyDmnI0sICM5NAorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJDLCAvLyDmnKwsICM1NgorICAgIDB4NjcyRiwgLy8g5pyvLCAjMjE2CisgICAgMHg2NzNBLCAvLyDmnLosICMyNworICAgIDB4Njc0MywgLy8g5p2DLCAjMjUwCisgICAgMHg2NzYxLCAvLyDmnaEsICMzMDkKKyAgICAweDY3NjUsIC8vIOadpSwgIzQyCisgICAgMHg2NzdGLCAvLyDmnb8sICM1MDUKKyAgICAweDY3OTcsIC8vIOaelywgIzQ3NQorICAgIDB4Njc5QywgLy8g5p6cLCAjMjEyCisgICAgMHg2N0U1LCAvLyDmn6UsICMxNjUKKyAgICAweDY4MDcsIC8vIOaghywgIzI2OQorICAgIDB4NjgyMSwgLy8g5qChLCAjNDYyCisgICAgMHg2ODM3LCAvLyDmoLcsICMzMTQKKyAgICAweDY4M0MsIC8vIOagvCwgIzIzOAorICAgIDB4Njg0OCwgLy8g5qGILCAjMzc4CisgICAgMHg2OTdDLCAvLyDmpbwsICMzNDIKKyAgICAweDZBMjEsIC8vIOaooSwgIzQxMworICAgIDB4NkIyMSwgLy8g5qyhLCAjMjYzCisgICAgMHg2QjIyLCAvLyDmrKIsICM0NDMKKyAgICAweDZCM0UsIC8vIOasviwgIzM1OAorICAgIDB4NkI2MywgLy8g5q2jLCAjMjE5CisgICAgMHg2QjY0LCAvLyDmraQsICMzNjIKKyAgICAweDZCRDQsIC8vIOavlCwgIzI5OAorICAgIDB4NkMxMSwgLy8g5rCRLCAjMjc5CisgICAgMHg2QzE0LCAvLyDmsJQsICMzMDMKKyAgICAweDZDMzQsIC8vIOawtCwgIzE2MworICAgIDB4NkM0MiwgLy8g5rGCLCAjMzczCisgICAgMHg2QzVGLCAvLyDmsZ8sICMzMzYKKyAgICAweDZDQTEsIC8vIOayoSwgIzIyOQorICAgIDB4NkNCQiwgLy8g5rK7LCAjNDI1CisgICAgMHg2Q0Q1LCAvLyDms5UsICM4NQorICAgIDB4NkNFOCwgLy8g5rOoLCAjMTE5CisgICAgMHg2RDNCLCAvLyDmtLssICMyMzEKKyAgICAweDZENDEsIC8vIOa1gSwgIzI4MAorICAgIDB4NkQ0QiwgLy8g5rWLLCAjNDYwCisgICAgMHg2RDc3LCAvLyDmtbcsICMxMjQKKyAgICAweDZEODgsIC8vIOa2iCwgIzQxNQorICAgIDB4NkRGMSwgLy8g5rexLCAjNDc3CisgICAgMHg2RTA1LCAvLyDmuIUsICMzMTEKKyAgICAweDZFMzgsIC8vIOa4uCwgIzgxCisgICAgMHg2RTkwLCAvLyDmupAsICMzMjUKKyAgICAweDcwNkIsIC8vIOeBqywgIzQ5OAorICAgIDB4NzBCOSwgLy8g54K5LCAjNTgKKyAgICAweDcwRUQsIC8vIOeDrSwgIzE4MworICAgIDB4NzEzNiwgLy8g54S2LCAjMzA4CisgICAgMHg3MTY3LCAvLyDnhacsICM0MzEKKyAgICAweDcyMzEsIC8vIOeIsSwgIzIyMworICAgIDB4NzI0NywgLy8g54mHLCAjMTI4CisgICAgMHg3MjQ4LCAvLyDniYgsICM5MQorICAgIDB4NzI0QywgLy8g54mMLCAjNDI5CisgICAgMHg3MjY5LCAvLyDniaksICMxNjkKKyAgICAweDcyNzksIC8vIOeJuSwgIzIyNAorICAgIDB4NzM4QiwgLy8g546LLCAjMzUxCisgICAgMHg3M0E5LCAvLyDnjqksICM0NzYKKyAgICAweDczQjAsIC8vIOeOsCwgIzEyNQorICAgIDB4NzQwMywgLy8g55CDLCAjMzY3CisgICAgMHg3NDA2LCAvLyDnkIYsICM2OQorICAgIDB4NzUxRiwgLy8g55SfLCAjMjQKKyAgICAweDc1MjgsIC8vIOeUqCwgIzE3CisgICAgMHg3NTMxLCAvLyDnlLEsICM0NDEKKyAgICAweDc1MzUsIC8vIOeUtSwgIzM0CisgICAgMHg3NTM3LCAvLyDnlLcsICMyNzUKKyAgICAweDc1NEMsIC8vIOeVjCwgIzQxOQorICAgIDB4NzVDNSwgLy8g55eFLCAjMzcxCisgICAgMHg3NjdCLCAvLyDnmbssICMyMDQKKyAgICAweDc2N0QsIC8vIOeZvSwgIzMzOAorICAgIDB4NzY3RSwgLy8g55m+LCAjMTU3CisgICAgMHg3Njg0LCAvLyDnmoQsICMxCisgICAgMHg3NkQ4LCAvLyDnm5gsICM0OTMKKyAgICAweDc2RUUsIC8vIOebriwgIzI2MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzkxCisgICAgMHg3NkY4LCAvLyDnm7gsICMxNDMKKyAgICAweDc3MDEsIC8vIOecgSwgIzQ2NAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTQKKyAgICAweDc3MUYsIC8vIOecnywgIzI0OQorICAgIDB4Nzc0MCwgLy8g552ALCAjMzAyCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNDIKKyAgICAweDc4MDEsIC8vIOeggSwgIzI1NworICAgIDB4NzgxNCwgLy8g56CULCAjMzg3CisgICAgMHg3OTNBLCAvLyDnpLosICMzMzQKKyAgICAweDc5M0UsIC8vIOekviwgIzM0MworICAgIDB4Nzk1RSwgLy8g56WeLCAjMzMwCisgICAgMHg3OThGLCAvLyDnpo8sICM1MDkKKyAgICAweDc5QkIsIC8vIOemuywgIzQ1NAorICAgIDB4NzlDRCwgLy8g56eNLCAjMjc4CisgICAgMHg3OUQxLCAvLyDnp5EsICMxMjYKKyAgICAweDc5RUYsIC8vIOenrywgIzM5MAorICAgIDB4N0EwQiwgLy8g56iLLCAjMjA5CisgICAgMHg3QTc2LCAvLyDnqbYsICM1MDQKKyAgICAweDdBN0EsIC8vIOepuiwgIzMxMgorICAgIDB4N0FDQiwgLy8g56uLLCAjMzkzCisgICAgMHg3QUQ5LCAvLyDnq5ksICMxMDcKKyAgICAweDdBRTAsIC8vIOeroCwgIzMwNAorICAgIDB4N0IyQywgLy8g56ysLCAjOTYKKyAgICAweDdCNDksIC8vIOetiSwgIzIxMAorICAgIDB4N0I1NCwgLy8g562ULCAjMjU2CisgICAgMHg3QjgwLCAvLyDnroAsICM0NzQKKyAgICAweDdCQTEsIC8vIOeuoSwgIzIyMQorICAgIDB4N0M3QiwgLy8g57G7LCAjMjQ2CisgICAgMHg3Q0JFLCAvLyDnsr4sICMyMjYKKyAgICAweDdDRkIsIC8vIOezuywgIzg5CisgICAgMHg3RDIyLCAvLyDntKIsICMzNTQKKyAgICAweDdFQTIsIC8vIOe6oiwgIzQxNworICAgIDB4N0VBNywgLy8g57qnLCAjMTc4CisgICAgMHg3RUJGLCAvLyDnur8sICMxMDgKKyAgICAweDdFQzQsIC8vIOe7hCwgIzM4OQorICAgIDB4N0VDNiwgLy8g57uGLCAjNDQyCisgICAgMHg3RUNGLCAvLyDnu48sICM3NAorICAgIDB4N0VEMywgLy8g57uTLCAjMzMzCisgICAgMHg3RUQ5LCAvLyDnu5ksICMzODQKKyAgICAweDdFREMsIC8vIOe7nCwgIzQ3MgorICAgIDB4N0VERiwgLy8g57ufLCAjMzQ0CisgICAgMHg3RjE2LCAvLyDnvJYsICM0MjQKKyAgICAweDdGNTEsIC8vIOe9kSwgIzkKKyAgICAweDdGNkUsIC8vIOe9riwgIzQxMQorICAgIDB4N0Y4RSwgLy8g576OLCAjNjAKKyAgICAweDgwMDEsIC8vIOiAgSwgIzI5MgorICAgIDB4ODAwMywgLy8g6ICDLCAjMjg4CisgICAgMHg4MDA1LCAvLyDogIUsICMxMDYKKyAgICAweDgwMEMsIC8vIOiAjCwgIzI5NworICAgIDB4ODA1NCwgLy8g6IGULCAjMTU5CisgICAgMHg4MEIyLCAvLyDogrIsICMzMjcKKyAgICAweDgwRkQsIC8vIOiDvSwgIzU5CisgICAgMHg4MUVBLCAvLyDoh6osICM3NworICAgIDB4ODI3MiwgLy8g6ImyLCAjMTk4CisgICAgMHg4MjgyLCAvLyDoioIsICMzNjEKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI5OQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzE2CisgICAgMHg4MzUwLCAvLyDojZAsICM0MDIKKyAgICAweDgzNkYsIC8vIOiNrywgIzQ4MQorICAgIDB4ODQyNSwgLy8g6JClLCAjMzk0CisgICAgMHg4NUNGLCAvLyDol48sICMzMzcKKyAgICAweDg4NEMsIC8vIOihjCwgIzQxCisgICAgMHg4ODY4LCAvLyDooagsICMxMDQKKyAgICAweDg4QUIsIC8vIOiiqywgIzI4OQorICAgIDB4ODhDNSwgLy8g6KOFLCAjMTYxCisgICAgMHg4OTdGLCAvLyDopb8sICMxOTkKKyAgICAweDg5ODEsIC8vIOimgSwgIzQ4CisgICAgMHg4OUMxLCAvLyDop4EsICMzNjAKKyAgICAweDg5QzIsIC8vIOingiwgIzQyMworICAgIDB4ODlDNCwgLy8g6KeELCAjNDUzCisgICAgMHg4OUM2LCAvLyDop4YsICMxMjAKKyAgICAweDg5RTMsIC8vIOinoywgIzI2NAorICAgIDB4OEEwMCwgLy8g6KiALCAjNDMzCisgICAgMHg4QkExLCAvLyDorqEsICMxOTEKKyAgICAweDhCQTQsIC8vIOiupCwgIzQ4MgorICAgIDB4OEJBOSwgLy8g6K6pLCAjNDIxCisgICAgMHg4QkFFLCAvLyDorq4sICM0MjcKKyAgICAweDhCQUYsIC8vIOiurywgIzM4OAorICAgIDB4OEJCMCwgLy8g6K6wLCAjMjczCisgICAgMHg4QkJBLCAvLyDorrosICM2NgorICAgIDB4OEJCRSwgLy8g6K6+LCAjMTYyCisgICAgMHg4QkMxLCAvLyDor4EsICMyMDEKKyAgICAweDhCQzQsIC8vIOivhCwgIzExMQorICAgIDB4OEJDNiwgLy8g6K+GLCAjNDYzCisgICAgMHg4QkQ1LCAvLyDor5UsICMzMjMKKyAgICAweDhCREQsIC8vIOivnSwgIzI0NworICAgIDB4OEJFMiwgLy8g6K+iLCAjNDMyCisgICAgMHg4QkU1LCAvLyDor6UsICM0NDcKKyAgICAweDhCRTYsIC8vIOivpiwgIzQ5NworICAgIDB4OEJFRCwgLy8g6K+tLCAjMjY4CisgICAgMHg4QkY0LCAvLyDor7QsICMxMTIKKyAgICAweDhCRjcsIC8vIOivtywgIzIxMworICAgIDB4OEJGQiwgLy8g6K+7LCAjMzQxCisgICAgMHg4QzAzLCAvLyDosIMsICM0MzgKKyAgICAweDhEMjIsIC8vIOi0oiwgIzQ4OAorICAgIDB4OEQyOCwgLy8g6LSoLCAjMzg2CisgICAgMHg4RDJELCAvLyDotK0sICMyNjAKKyAgICAweDhEMzQsIC8vIOi0tCwgIzUxMAorICAgIDB4OEQzOSwgLy8g6LS5LCAjMjQyCisgICAgMHg4RDQ0LCAvLyDotYQsICMxMTYKKyAgICAweDhENzcsIC8vIOi1tywgIzIyMAorICAgIDB4OEQ4NSwgLy8g6LaFLCAjNDA2CisgICAgMHg4REVGLCAvLyDot68sICMyMzUKKyAgICAweDhFQUIsIC8vIOi6qywgIzI2MgorICAgIDB4OEY2NiwgLy8g6L2mLCAjODIKKyAgICAweDhGNkMsIC8vIOi9rCwgIzMyMgorICAgIDB4OEY3RCwgLy8g6L29LCAjMTc1CisgICAgMHg4RkJFLCAvLyDovr4sICM0MzUKKyAgICAweDhGQzcsIC8vIOi/hywgIzExOAorICAgIDB4OEZEMCwgLy8g6L+QLCAjMzU3CisgICAgMHg4RkQxLCAvLyDov5EsICM0OTIKKyAgICAweDhGRDgsIC8vIOi/mCwgIzE3MQorICAgIDB4OEZEOSwgLy8g6L+ZLCAjNTcKKyAgICAweDhGREIsIC8vIOi/mywgIzE2MAorICAgIDB4OEZERSwgLy8g6L+eLCAjNDg5CisgICAgMHg5MDA5LCAvLyDpgIksICMzMjgKKyAgICAweDkwMUEsIC8vIOmAmiwgIzEzNworICAgIDB4OTAxRiwgLy8g6YCfLCAjNDU4CisgICAgMHg5MDIwLCAvLyDpgKAsICM1MTEKKyAgICAweDkwNTMsIC8vIOmBkywgIzc5CisgICAgMHg5MEEzLCAvLyDpgqMsICMzMDUKKyAgICAweDkwRTgsIC8vIOmDqCwgIzEwMgorICAgIDB4OTBGRCwgLy8g6YO9LCAjMTY3CisgICAgMHg5MTRELCAvLyDphY0sICM0NzkKKyAgICAweDkxNTIsIC8vIOmFkiwgIzQ0NAorICAgIDB4OTFDQywgLy8g6YeMLCAjMTk2CisgICAgMHg5MUNELCAvLyDph40sICMyMzAKKyAgICAweDkxQ0YsIC8vIOmHjywgIzI0OAorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM0CisgICAgMHg5NTAwLCAvLyDplIAsICM0NjUKKyAgICAweDk1N0YsIC8vIOmVvywgIzE1MgorICAgIDB4OTVFOCwgLy8g6ZeoLCAjMTg1CisgICAgMHg5NUVFLCAvLyDpl64sICM5MgorICAgIDB4OTVGNCwgLy8g6Ze0LCAjODgKKyAgICAweDk1RkIsIC8vIOmXuywgIzMxMworICAgIDB4OTYwNSwgLy8g6ZiFLCAjNDY3CisgICAgMHg5NjMzLCAvLyDpmLMsICM0MjAKKyAgICAweDk2NDUsIC8vIOmZhSwgIzUwMQorICAgIDB4OTY1MCwgLy8g6ZmQLCAjMjg2CisgICAgMHg5NjYyLCAvLyDpmaIsICMyNzYKKyAgICAweDk2QzYsIC8vIOmbhiwgIzI4NAorICAgIDB4OTcwMCwgLy8g6ZyALCAjNDA1CisgICAgMHg5NzYyLCAvLyDpnaIsICMxMjMKKyAgICAweDk3RjMsIC8vIOmfsywgIzMzNQorICAgIDB4OTg3NSwgLy8g6aG1LCAjNjMKKyAgICAweDk4NzksIC8vIOmhuSwgIzUwNgorICAgIDB4OTg5MSwgLy8g6aKRLCAjMjAwCisgICAgMHg5ODk4LCAvLyDpopgsICMxMTAKKyAgICAweDk4Q0UsIC8vIOmjjiwgIzI1MgorICAgIDB4OThERiwgLy8g6aOfLCAjNDQ1CisgICAgMHg5OTk2LCAvLyDpppYsICMxNDkKKyAgICAweDk5OTksIC8vIOmmmSwgIzUxMgorICAgIDB4OUE2QywgLy8g6amsLCAjMzkyCisgICAgMHg5QThDLCAvLyDpqowsICMzODIKKyAgICAweDlBRDgsIC8vIOmrmCwgIzY3CisgICAgMHg5Rjk5LCAvLyDpvpksICM0MjYKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF96aENOX2NvdmVyYWdlPTAuNzE4OTUwMzY5MzM5OTczOworCisvLyBUaGUgNTEyIG1vc3QgZnJlcXVlbnRseSBvY2N1cmluZyBjaGFyYWN0ZXJzIGZvciB0aGUgemhUVyBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF96aFRXW10gPSB7CisgICAgMHg0RTAwLCAvLyDkuIAsICMyCisgICAgMHg0RTA5LCAvLyDkuIksICMxMzEKKyAgICAweDRFMEEsIC8vIOS4iiwgIzEyCisgICAgMHg0RTBCLCAvLyDkuIssICMzNworICAgIDB4NEUwRCwgLy8g5LiNLCAjNgorICAgIDB4NEUxNiwgLy8g5LiWLCAjMzEyCisgICAgMHg0RTI2LCAvLyDkuKYsICM0MzQKKyAgICAweDRFMkQsIC8vIOS4rSwgIzkKKyAgICAweDRFM0IsIC8vIOS4uywgIzk3CisgICAgMHg0RTRCLCAvLyDkuYssICM1NQorICAgIDB4NEU1RiwgLy8g5LmfLCAjOTUKKyAgICAweDRFODYsIC8vIOS6hiwgIzE5CisgICAgMHg0RThCLCAvLyDkuossICMxMjgKKyAgICAweDRFOEMsIC8vIOS6jCwgIzE4NworICAgIDB4NEU5NCwgLy8g5LqULCAjMzM5CisgICAgMHg0RTlCLCAvLyDkupssICM0MzUKKyAgICAweDRFOUUsIC8vIOS6niwgIzQzMgorICAgIDB4NEVBNCwgLy8g5LqkLCAjMjY0CisgICAgMHg0RUFCLCAvLyDkuqssICMxNjAKKyAgICAweDRFQkEsIC8vIOS6uiwgIzMKKyAgICAweDRFQzAsIC8vIOS7gCwgIzQ4MworICAgIDB4NEVDQSwgLy8g5LuKLCAjMzgwCisgICAgMHg0RUNCLCAvLyDku4ssICM0NjgKKyAgICAweDRFRDYsIC8vIOS7liwgIzY1CisgICAgMHg0RUUzLCAvLyDku6MsICMyODQKKyAgICAweDRFRTUsIC8vIOS7pSwgIzI2CisgICAgMHg0RUY2LCAvLyDku7YsICMyMzQKKyAgICAweDRFRkIsIC8vIOS7uywgIzM4MQorICAgIDB4NEVGRCwgLy8g5Lu9LCAjNDQ3CisgICAgMHg0RjQ2LCAvLyDkvYYsICMyODEKKyAgICAweDRGNEQsIC8vIOS9jSwgIzIwMgorICAgIDB4NEY0RiwgLy8g5L2PLCAjNDcxCisgICAgMHg0RjU1LCAvLyDkvZUsICMzMzQKKyAgICAweDRGNUMsIC8vIOS9nCwgIzU2CisgICAgMHg0RjYwLCAvLyDkvaAsICM2NAorICAgIDB4NEY3RiwgLy8g5L2/LCAjMjM2CisgICAgMHg0Rjg2LCAvLyDkvoYsICMzOAorICAgIDB4NEY5QiwgLy8g5L6bLCAjMzk3CisgICAgMHg0RkJGLCAvLyDkvr8sICM0NDAKKyAgICAweDRGQzIsIC8vIOS/giwgIzUwNgorICAgIDB4NEZERCwgLy8g5L+dLCAjMTYxCisgICAgMHg0RkUxLCAvLyDkv6EsICMyNjgKKyAgICAweDRGRUUsIC8vIOS/riwgIzQ3MworICAgIDB4NTAwQiwgLy8g5YCLLCAjMjcKKyAgICAweDUwMTEsIC8vIOWAkSwgIzEwOQorICAgIDB4NTA1QSwgLy8g5YGaLCAjMzgzCisgICAgMHg1MDY1LCAvLyDlgaUsICM0MTUKKyAgICAweDUwOTksIC8vIOWCmSwgIzQ2MQorICAgIDB4NTBCMywgLy8g5YKzLCAjMjc3CisgICAgMHg1MENGLCAvLyDlg48sICM0MDMKKyAgICAweDUwRjksIC8vIOWDuSwgIzkzCisgICAgMHg1MTJBLCAvLyDlhKosICMzOTYKKyAgICAweDUxNDMsIC8vIOWFgywgIzE1OAorICAgIDB4NTE0OCwgLy8g5YWILCAjMzgyCisgICAgMHg1MTQ5LCAvLyDlhYksICMyMTYKKyAgICAweDUxNEQsIC8vIOWFjSwgIzMyMQorICAgIDB4NTE1MiwgLy8g5YWSLCAjMzc0CisgICAgMHg1MTY1LCAvLyDlhaUsICM1OAorICAgIDB4NTE2NywgLy8g5YWnLCAjMTA2CisgICAgMHg1MTY4LCAvLyDlhagsICM2NworICAgIDB4NTE2OSwgLy8g5YWpLCAjMzIyCisgICAgMHg1MTZDLCAvLyDlhawsICM1MworICAgIDB4NTE2RCwgLy8g5YWtLCAjNDkzCisgICAgMHg1MTcxLCAvLyDlhbEsICM0NTYKKyAgICAweDUxNzYsIC8vIOWFtiwgIzE0OAorICAgIDB4NTE3NywgLy8g5YW3LCAjMzI4CisgICAgMHg1MThBLCAvLyDlhoosICMzNjAKKyAgICAweDUxOEQsIC8vIOWGjSwgIzMxMQorICAgIDB4NTFGQSwgLy8g5Ye6LCAjNDQKKyAgICAweDUyMDYsIC8vIOWIhiwgIzE1CisgICAgMHg1MjE3LCAvLyDliJcsICMyNTkKKyAgICAweDUyMjUsIC8vIOWIpSwgIzM2MQorICAgIDB4NTIyOSwgLy8g5YipLCAjMjUxCisgICAgMHg1MjMwLCAvLyDliLAsICMyOQorICAgIDB4NTI0NywgLy8g5YmHLCAjNTExCisgICAgMHg1MjRELCAvLyDliY0sICM4MgorICAgIDB4NTI3NSwgLy8g5Ym1LCAjNDA5CisgICAgMHg1MjlCLCAvLyDlipssICMxNzYKKyAgICAweDUyOUYsIC8vIOWKnywgIzQzMAorICAgIDB4NTJBMCwgLy8g5YqgLCAjODcKKyAgICAweDUyQTksIC8vIOWKqSwgIzQ2NQorICAgIDB4NTJENSwgLy8g5YuVLCAjNDgKKyAgICAweDUyRDksIC8vIOWLmSwgIzEwMgorICAgIDB4NTMwNSwgLy8g5YyFLCAjMjQ4CisgICAgMHg1MzE2LCAvLyDljJYsICMyMjMKKyAgICAweDUzMTcsIC8vIOWMlywgIzE0NQorICAgIDB4NTM0MCwgLy8g5Y2ALCAjNjAKKyAgICAweDUzNDEsIC8vIOWNgSwgIzI0MgorICAgIDB4NTM1NywgLy8g5Y2XLCAjMjYxCisgICAgMHg1MzVBLCAvLyDljZosICM0ODQKKyAgICAweDUzNjEsIC8vIOWNoSwgIzMyNworICAgIDB4NTM3MCwgLy8g5Y2wLCAjNDk4CisgICAgMHg1MzczLCAvLyDljbMsICMzNTEKKyAgICAweDUzOUYsIC8vIOWOnywgIzIzNworICAgIDB4NTNCQiwgLy8g5Y67LCAjMTkwCisgICAgMHg1M0MzLCAvLyDlj4MsICM0NDQKKyAgICAweDUzQzgsIC8vIOWPiCwgIzQyNgorICAgIDB4NTNDQSwgLy8g5Y+KLCAjMTM2CisgICAgMHg1M0NCLCAvLyDlj4ssICMxNDIKKyAgICAweDUzRDYsIC8vIOWPliwgIzQyMgorICAgIDB4NTNENywgLy8g5Y+XLCAjNDEwCisgICAgMHg1M0UzLCAvLyDlj6MsICMzNTcKKyAgICAweDUzRUEsIC8vIOWPqiwgIzI1MAorICAgIDB4NTNFRiwgLy8g5Y+vLCAjMzUKKyAgICAweDUzRjAsIC8vIOWPsCwgIzM0CisgICAgMHg1M0Y4LCAvLyDlj7gsICMyMjYKKyAgICAweDU0MDMsIC8vIOWQgywgIzM2MgorICAgIDB4NTQwNCwgLy8g5ZCELCAjNDU0CisgICAgMHg1NDA4LCAvLyDlkIgsICMxNDcKKyAgICAweDU0MEMsIC8vIOWQjCwgIzE3MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjMTA4CisgICAgMHg1NDRBLCAvLyDlkYosICMxODYKKyAgICAweDU0OEMsIC8vIOWSjCwgIzEzMAorICAgIDB4NTRDMSwgLy8g5ZOBLCAjMjMKKyAgICAweDU0RTEsIC8vIOWToSwgIzE1MAorICAgIDB4NTU0NiwgLy8g5ZWGLCAjNzUKKyAgICAweDU1NEYsIC8vIOWVjywgIzEyMAorICAgIDB4NTU5QywgLy8g5ZacLCAjNTAyCisgICAgMHg1NUFFLCAvLyDllq4sICMyMTAKKyAgICAweDU1Q0UsIC8vIOWXjiwgIzQ0MworICAgIDB4NTY2OCwgLy8g5ZmoLCAjMzA1CisgICAgMHg1NkRCLCAvLyDlm5ssICMzMTgKKyAgICAweDU2REUsIC8vIOWbniwgIzU5CisgICAgMHg1NkUwLCAvLyDlm6AsICMyNTMKKyAgICAweDU3MEIsIC8vIOWciywgIzIxCisgICAgMHg1NzEyLCAvLyDlnJIsICMzNDUKKyAgICAweDU3MTYsIC8vIOWcliwgIzczCisgICAgMHg1NzE4LCAvLyDlnJgsICMzMzgKKyAgICAweDU3MjgsIC8vIOWcqCwgIzExCisgICAgMHg1NzMwLCAvLyDlnLAsICM1MAorICAgIDB4NTc4QiwgLy8g5Z6LLCAjMjcwCisgICAgMHg1N0NFLCAvLyDln44sICM0NjYKKyAgICAweDU3RkEsIC8vIOWfuiwgIzM0OQorICAgIDB4NTgzMSwgLy8g5aCxLCAjMTI3CisgICAgMHg1ODM0LCAvLyDloLQsICMxNjUKKyAgICAweDU4RUIsIC8vIOWjqywgIzM3MgorICAgIDB4NTkxNiwgLy8g5aSWLCAjMTUyCisgICAgMHg1OTFBLCAvLyDlpJosICM1NAorICAgIDB4NTkyNywgLy8g5aSnLCAjOAorICAgIDB4NTkyOSwgLy8g5aSpLCAjNDMKKyAgICAweDU5MkEsIC8vIOWkqiwgIzM0MworICAgIDB4NTk0NywgLy8g5aWHLCAjMzI1CisgICAgMHg1OTczLCAvLyDlpbMsICM4NQorICAgIDB4NTk3OSwgLy8g5aW5LCAjNDIwCisgICAgMHg1OTdELCAvLyDlpb0sICMyMgorICAgIDB4NTk4MiwgLy8g5aaCLCAjMTQ0CisgICAgMHg1QjUwLCAvLyDlrZAsICM0NgorICAgIDB4NUI1NywgLy8g5a2XLCAjMjc1CisgICAgMHg1Qjc4LCAvLyDlrbgsICM0OQorICAgIDB4NUI4OSwgLy8g5a6JLCAjMjM5CisgICAgMHg1QjhDLCAvLyDlrowsICMzMjAKKyAgICAweDVCOUEsIC8vIOWumiwgIzE1OQorICAgIDB4NUJBMiwgLy8g5a6iLCAjMTg4CisgICAgMHg1QkI2LCAvLyDlrrYsICMzMQorICAgIDB4NUJCOSwgLy8g5a65LCAjMjQ0CisgICAgMHg1QkU2LCAvLyDlr6YsICMxOTgKKyAgICAweDVCRjYsIC8vIOWvtiwgIzM2NworICAgIDB4NUMwNywgLy8g5bCHLCAjMjMyCisgICAgMHg1QzA4LCAvLyDlsIgsICMxMzMKKyAgICAweDVDMEIsIC8vIOWwiywgIzM1MgorICAgIDB4NUMwRCwgLy8g5bCNLCAjMTI2CisgICAgMHg1QzBFLCAvLyDlsI4sICM0MTgKKyAgICAweDVDMEYsIC8vIOWwjywgIzIwCisgICAgMHg1QzExLCAvLyDlsJEsICMzNjgKKyAgICAweDVDMzEsIC8vIOWwsSwgIzYzCisgICAgMHg1QzU1LCAvLyDlsZUsICMzNDEKKyAgICAweDVDNzEsIC8vIOWxsSwgIzI3MworICAgIDB4NURFNSwgLy8g5belLCAjMTIxCisgICAgMHg1REYxLCAvLyDlt7EsICM0MDIKKyAgICAweDVERjIsIC8vIOW3siwgIzI5OQorICAgIDB4NUUwMiwgLy8g5biCLCAjODEKKyAgICAweDVFMkIsIC8vIOW4qywgIzI2MgorICAgIDB4NUUzNiwgLy8g5bi2LCAjNDcwCisgICAgMHg1RTM4LCAvLyDluLgsICMzMDMKKyAgICAweDVFNzMsIC8vIOW5sywgIzI5NworICAgIDB4NUU3NCwgLy8g5bm0LCAjMzAKKyAgICAweDVFOTcsIC8vIOW6lywgIzE3MQorICAgIDB4NUVBNiwgLy8g5bqmLCAjMjIwCisgICAgMHg1RUI3LCAvLyDlurcsICM0NDEKKyAgICAweDVFRTMsIC8vIOW7oywgIzI3OQorICAgIDB4NUVGQSwgLy8g5bu6LCAjMjU0CisgICAgMHg1RjBGLCAvLyDlvI8sICMxNTUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NgorICAgIDB4NUYzNSwgLy8g5by1LCAjMzY2CisgICAgMHg1RjM3LCAvLyDlvLcsICM0MzcKKyAgICAweDVGNzEsIC8vIOW9sSwgIzk0CisgICAgMHg1Rjg4LCAvLyDlvogsICMxNzcKKyAgICAweDVGOEMsIC8vIOW+jCwgIzY2CisgICAgMHg1Rjk3LCAvLyDlvpcsICMxMTMKKyAgICAweDVGOUUsIC8vIOW+niwgIzQzNgorICAgIDB4NUZDMywgLy8g5b+DLCAjNTcKKyAgICAweDVGRUIsIC8vIOW/qywgIzI5MgorICAgIDB4NjAyNywgLy8g5oCnLCAjMTc1CisgICAgMHg2MDZGLCAvLyDmga8sICMzNzgKKyAgICAweDYwQTgsIC8vIOaCqCwgIzI1MgorICAgIDB4NjBDNSwgLy8g5oOFLCAjMTIzCisgICAgMHg2MEYzLCAvLyDmg7MsICMxNzgKKyAgICAweDYxMEYsIC8vIOaEjywgIzE2OAorICAgIDB4NjExQiwgLy8g5oSbLCAjMTI1CisgICAgMHg2MTFGLCAvLyDmhJ8sICMyMTEKKyAgICAweDYxQzksIC8vIOaHiSwgIzE2NAorICAgIDB4NjIxMCwgLy8g5oiQLCAjODYKKyAgICAweDYyMTEsIC8vIOaIkSwgIzcKKyAgICAweDYyMTYsIC8vIOaIliwgIzE5OQorICAgIDB4NjIzMCwgLy8g5oiwLCAjNDM4CisgICAgMHg2MjMyLCAvLyDmiLIsICMzMDkKKyAgICAweDYyMzYsIC8vIOaItiwgIzQ5NworICAgIDB4NjIzRiwgLy8g5oi/LCAjMjc0CisgICAgMHg2MjQwLCAvLyDmiYAsICM3OQorICAgIDB4NjI0QiwgLy8g5omLLCAjNjgKKyAgICAweDYyNEQsIC8vIOaJjSwgIzQwMAorICAgIDB4NjI1MywgLy8g5omTLCAjMjc4CisgICAgMHg2MjdFLCAvLyDmib4sICM0NDkKKyAgICAweDYyODAsIC8vIOaKgCwgIzMzMgorICAgIDB4NjI5NSwgLy8g5oqVLCAjNDI1CisgICAgMHg2MkM5LCAvLyDmi4ksICM1MDAKKyAgICAweDYyQ0QsIC8vIOaLjSwgIzM5OAorICAgIDB4NjMwNywgLy8g5oyHLCAjNDA3CisgICAgMHg2MzkyLCAvLyDmjpIsICM0NTgKKyAgICAweDYzQTUsIC8vIOaOpSwgIzMyNgorICAgIDB4NjNBOCwgLy8g5o6oLCAjMTUzCisgICAgMHg2M0QwLCAvLyDmj5AsICMyMzUKKyAgICAweDY0MUMsIC8vIOaQnCwgIzMxNAorICAgIDB4NjQ2OSwgLy8g5pGpLCAjNDcyCisgICAgMHg2NTM2LCAvLyDmlLYsICMyNDkKKyAgICAweDY1MzksIC8vIOaUuSwgIzUwOAorICAgIDB4NjUzRSwgLy8g5pS+LCAjMzMxCisgICAgMHg2NTNGLCAvLyDmlL8sICMyOTUKKyAgICAweDY1NTksIC8vIOaVmSwgIzE4NAorICAgIDB4NjU3NCwgLy8g5pW0LCAjMzk0CisgICAgMHg2NTc4LCAvLyDmlbgsICMxMzQKKyAgICAweDY1ODcsIC8vIOaWhywgIzE2CisgICAgMHg2NTk5LCAvLyDmlpksICMxNjcKKyAgICAweDY1QUYsIC8vIOaWrywgIzQ3NgorICAgIDB4NjVCMCwgLy8g5pawLCAjMTAKKyAgICAweDY1QjksIC8vIOaWuSwgIzk2CisgICAgMHg2NUJDLCAvLyDmlrwsICM3MAorICAgIDB4NjVDNSwgLy8g5peFLCAjMjg5CisgICAgMHg2NUU1LCAvLyDml6UsICMxOAorICAgIDB4NjYwRSwgLy8g5piOLCAjMTE4CisgICAgMHg2NjEzLCAvLyDmmJMsICM0ODIKKyAgICAweDY2MUYsIC8vIOaYnywgIzIwNQorICAgIDB4NjYyRiwgLy8g5pivLCAjNQorICAgIDB4NjY0MiwgLy8g5pmCLCAjMTMKKyAgICAweDY2RjQsIC8vIOabtCwgIzE0OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMjA5CisgICAgMHg2NzAwLCAvLyDmnIAsICM1MQorICAgIDB4NjcwMywgLy8g5pyDLCAjMTQKKyAgICAweDY3MDgsIC8vIOaciCwgIzI1CisgICAgMHg2NzA5LCAvLyDmnIksICM0CisgICAgMHg2NzBELCAvLyDmnI0sICM5OQorICAgIDB4NjcxRiwgLy8g5pyfLCAjMTM5CisgICAgMHg2NzJBLCAvLyDmnKosICM0MDQKKyAgICAweDY3MkMsIC8vIOacrCwgIzQ1CisgICAgMHg2NzcxLCAvLyDmnbEsICMyMjEKKyAgICAweDY3N0YsIC8vIOadvywgIzM2NAorICAgIDB4Njc5NywgLy8g5p6XLCAjMzMwCisgICAgMHg2NzlDLCAvLyDmnpwsICMxNzkKKyAgICAweDY3RTUsIC8vIOafpSwgIzI4MworICAgIDB4NjgzQywgLy8g5qC8LCAjMTU3CisgICAgMHg2ODQ4LCAvLyDmoYgsICMzOTIKKyAgICAweDY4OUQsIC8vIOainSwgIzQwNgorICAgIDB4Njk2RCwgLy8g5qWtLCAjMTAzCisgICAgMHg2QTAyLCAvLyDmqIIsICMxMTYKKyAgICAweDZBMTMsIC8vIOaokywgIzQxMQorICAgIDB4NkExOSwgLy8g5qiZLCAjMzg0CisgICAgMHg2QTIzLCAvLyDmqKMsICMzMDYKKyAgICAweDZBNUYsIC8vIOapnywgIzQwCisgICAgMHg2QUEyLCAvLyDmqqIsICMzNTkKKyAgICAweDZCMEEsIC8vIOasiiwgIzIyOAorICAgIDB4NkIyMSwgLy8g5qyhLCAjMjI3CisgICAgMHg2QjNFLCAvLyDmrL4sICMyNzYKKyAgICAweDZCNEMsIC8vIOatjCwgIzQ5NgorICAgIDB4NkI2MSwgLy8g5q2hLCAjNDI3CisgICAgMHg2QjYzLCAvLyDmraMsICMyMDYKKyAgICAweDZCNjQsIC8vIOatpCwgIzI0NworICAgIDB4NkJDRiwgLy8g5q+PLCAjMzkxCisgICAgMHg2QkQ0LCAvLyDmr5QsICMyNTcKKyAgICAweDZDMTEsIC8vIOawkSwgIzIzMAorICAgIDB4NkMyMywgLy8g5rCjLCAjMjAwCisgICAgMHg2QzM0LCAvLyDmsLQsICMxNDAKKyAgICAweDZDNDIsIC8vIOaxgiwgIzUwMQorICAgIDB4NkM5MiwgLy8g5rKSLCAjMTYyCisgICAgMHg2Q0Q1LCAvLyDms5UsICM4OQorICAgIDB4NkQzQiwgLy8g5rS7LCAjMTI0CisgICAgMHg2RDQxLCAvLyDmtYEsICMzMTUKKyAgICAweDZENzcsIC8vIOa1tywgIzI1OAorICAgIDB4NkQ4OCwgLy8g5raILCAjMzQyCisgICAgMHg2RTA1LCAvLyDmuIUsICMzMjkKKyAgICAweDZFMkYsIC8vIOa4rywgIzI5MworICAgIDB4NkYxNCwgLy8g5ryULCAjNDkxCisgICAgMHg3MDYzLCAvLyDngaMsICMxOTUKKyAgICAweDcwQkEsIC8vIOeCuiwgIzM5CisgICAgMHg3MTIxLCAvLyDnhKEsICMxMDcKKyAgICAweDcxMzYsIC8vIOeEtiwgIzIxNQorICAgIDB4NzE2NywgLy8g54WnLCAjMzc2CisgICAgMHg3MUIxLCAvLyDnhrEsICMyNDUKKyAgICAweDcyNDcsIC8vIOeJhywgIzkwCisgICAgMHg3MjQ4LCAvLyDniYgsICMxMTIKKyAgICAweDcyNEMsIC8vIOeJjCwgIzQ2NworICAgIDB4NzI2OSwgLy8g54mpLCAjMTEwCisgICAgMHg3Mjc5LCAvLyDnibksICMxODMKKyAgICAweDczOEIsIC8vIOeOiywgIzI4NworICAgIDB4NzNBOSwgLy8g546pLCAjMzU0CisgICAgMHg3M0ZFLCAvLyDnj74sICMxNDMKKyAgICAweDc0MDMsIC8vIOeQgywgIzM1MAorICAgIDB4NzQwNiwgLy8g55CGLCAjMTA1CisgICAgMHg3NTFGLCAvLyDnlJ8sICMyNAorICAgIDB4NzUyMiwgLy8g55SiLCAjMjAxCisgICAgMHg3NTI4LCAvLyDnlKgsICMxNworICAgIDB4NzUzMSwgLy8g55SxLCAjMjg4CisgICAgMHg3NTM3LCAvLyDnlLcsICMyOTgKKyAgICAweDc1NEMsIC8vIOeVjCwgIzM5OQorICAgIDB4NzU1OSwgLy8g55WZLCAjMjE4CisgICAgMHg3NTZCLCAvLyDnlassICM0MTIKKyAgICAweDc1NzYsIC8vIOeVtiwgIzE4NQorICAgIDB4NzY3QiwgLy8g55m7LCAjMTM4CisgICAgMHg3NjdDLCAvLyDnmbwsICMyOAorICAgIDB4NzY3RCwgLy8g55m9LCAjMzc3CisgICAgMHg3NjdFLCAvLyDnmb4sICMzOTMKKyAgICAweDc2ODQsIC8vIOeahCwgIzEKKyAgICAweDc2RUUsIC8vIOebriwgIzI3MQorICAgIDB4NzZGNCwgLy8g55u0LCAjMzc5CisgICAgMHg3NkY4LCAvLyDnm7gsICM5OAorICAgIDB4NzcwQiwgLy8g55yLLCAjNTIKKyAgICAweDc3MUYsIC8vIOecnywgIzE4MAorICAgIDB4NzczQywgLy8g55y8LCAjNDMzCisgICAgMHg3N0U1LCAvLyDnn6UsICMxNzAKKyAgICAweDc4QkMsIC8vIOeivCwgIzQ4MQorICAgIDB4NzkzQSwgLy8g56S6LCAjMzUzCisgICAgMHg3OTNFLCAvLyDnpL4sICMzMzMKKyAgICAweDc5NUUsIC8vIOelniwgIzMwNAorICAgIDB4Nzk2OCwgLy8g56WoLCAjNDc3CisgICAgMHg3OThGLCAvLyDnpo8sICM0OTQKKyAgICAweDc5QzEsIC8vIOengSwgIzUwNworICAgIDB4NzlEMSwgLy8g56eRLCAjMjgwCisgICAgMHg3QTBCLCAvLyDnqIssICMyNzIKKyAgICAweDdBMkUsIC8vIOeoriwgIzMzNworICAgIDB4N0E0RCwgLy8g56mNLCAjMzg1CisgICAgMHg3QTdBLCAvLyDnqbosICMzMjQKKyAgICAweDdBQ0IsIC8vIOeriywgIzI4NgorICAgIDB4N0FEOSwgLy8g56uZLCAjMTE3CisgICAgMHg3QUUwLCAvLyDnq6AsICMxNDEKKyAgICAweDdCMkMsIC8vIOesrCwgIzEzNQorICAgIDB4N0I0OSwgLy8g562JLCAjMjQwCisgICAgMHg3QkExLCAvLyDnrqEsICMzNDAKKyAgICAweDdCQzAsIC8vIOevgCwgIzQzMQorICAgIDB4N0JDNywgLy8g56+HLCAjNDc5CisgICAgMHg3QzIxLCAvLyDnsKEsICM0OTkKKyAgICAweDdDQkUsIC8vIOeyviwgIzIxMworICAgIDB4N0NGQiwgLy8g57O7LCAjMjEyCisgICAgMHg3RDA0LCAvLyDntIQsICM0NjIKKyAgICAweDdEMDUsIC8vIOe0hSwgIzQ1MgorICAgIDB4N0QxQSwgLy8g57SaLCAjMjY3CisgICAgMHg3RDMwLCAvLyDntLAsICM0ODYKKyAgICAweDdENDQsIC8vIOe1hCwgIzMzNQorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjQzCisgICAgMHg3RDY2LCAvLyDntaYsICMzNTUKKyAgICAweDdENzEsIC8vIOe1sSwgIzM3NQorICAgIDB4N0Q5MywgLy8g57aTLCAjMTExCisgICAgMHg3REIyLCAvLyDntrIsICMzMgorICAgIDB4N0REQSwgLy8g57eaLCAjMTUxCisgICAgMHg3RTIzLCAvLyDnuKMsICM0MzkKKyAgICAweDdFM0QsIC8vIOe4vSwgIzM3MAorICAgIDB4N0Y4RSwgLy8g576OLCAjNDEKKyAgICAweDdGQTksIC8vIOe+qSwgIzUwNAorICAgIDB4ODAwMSwgLy8g6ICBLCAjMjkwCisgICAgMHg4MDAzLCAvLyDogIMsICM0MjgKKyAgICAweDgwMDUsIC8vIOiAhSwgIzkyCisgICAgMHg4MDBDLCAvLyDogIwsICMyMTcKKyAgICAweDgwNUUsIC8vIOiBniwgIzE4MQorICAgIDB4ODA2RiwgLy8g6IGvLCAjMzEwCisgICAgMHg4MDcyLCAvLyDogbIsICM0MTMKKyAgICAweDgwQTEsIC8vIOiCoSwgIzM5MAorICAgIDB4ODBCMiwgLy8g6IKyLCAjNDUzCisgICAgMHg4MEZELCAvLyDog70sICM3MQorICAgIDB4ODE2NiwgLy8g6IWmLCAjNDA4CisgICAgMHg4MUVBLCAvLyDoh6osICM2MQorICAgIDB4ODFGMywgLy8g6IezLCAjMzQ0CisgICAgMHg4MjA3LCAvLyDoiIcsICM4NAorICAgIDB4ODIwOSwgLy8g6IiJLCAjNDYzCisgICAgMHg4MjcyLCAvLyDoibIsICMxOTIKKyAgICAweDgyQjEsIC8vIOiKsSwgIzI1NQorICAgIDB4ODJGMSwgLy8g6IuxLCAjMzQ4CisgICAgMHg4M0VGLCAvLyDoj68sICMxOTYKKyAgICAweDg0MkMsIC8vIOiQrCwgIzMxNgorICAgIDB4ODQzRCwgLy8g6JC9LCAjMzA4CisgICAgMHg4NDU3LCAvLyDokZcsICMyMzMKKyAgICAweDg1QTYsIC8vIOiWpiwgIzQwMQorICAgIDB4ODVDRiwgLy8g6JePLCAjNTAzCisgICAgMHg4NURELCAvLyDol50sICM0ODgKKyAgICAweDg2NTUsIC8vIOiZlSwgIzQxOQorICAgIDB4ODY1RiwgLy8g6JmfLCAjMTkxCisgICAgMHg4ODRDLCAvLyDooYwsICM0NworICAgIDB4ODg1MywgLy8g6KGTLCAjMzk1CisgICAgMHg4ODY4LCAvLyDooagsICM3NworICAgIDB4ODhBQiwgLy8g6KKrLCAjMjkxCisgICAgMHg4OERELCAvLyDoo50sICMyNTYKKyAgICAweDg4RTEsIC8vIOijoSwgIzM2OQorICAgIDB4ODhGRCwgLy8g6KO9LCAjNTEwCisgICAgMHg4OTdGLCAvLyDopb8sICMzMDAKKyAgICAweDg5ODEsIC8vIOimgSwgIzM2CisgICAgMHg4OThCLCAvLyDopossICMzMDcKKyAgICAweDg5OTYsIC8vIOimliwgIzIwNAorICAgIDB4ODlCQSwgLy8g6Ka6LCAjNDUwCisgICAgMHg4OUJELCAvLyDopr0sICMzODcKKyAgICAweDg5QzAsIC8vIOingCwgIzM2NQorICAgIDB4ODlFMywgLy8g6KejLCAjMzIzCisgICAgMHg4QTAwLCAvLyDoqIAsICMxNjkKKyAgICAweDhBMDIsIC8vIOiogiwgIzQyMworICAgIDB4OEEwOCwgLy8g6KiILCAjMjI1CisgICAgMHg4QTBBLCAvLyDoqIosICMxNTYKKyAgICAweDhBMEUsIC8vIOiojiwgIzM3MworICAgIDB4OEExOCwgLy8g6KiYLCAjMjIyCisgICAgMHg4QTJELCAvLyDoqK0sICMxNzQKKyAgICAweDhBM0IsIC8vIOiouywgIzM1NgorICAgIDB4OEE1NSwgLy8g6KmVLCAjMjQ2CisgICAgMHg4QTY2LCAvLyDoqaYsICM0NDgKKyAgICAweDhBNzEsIC8vIOipsSwgIzIyOQorICAgIDB4OEE3MiwgLy8g6KmyLCAjNDQ2CisgICAgMHg4QThELCAvLyDoqo0sICM0NjQKKyAgICAweDhBOUUsIC8vIOiqniwgIzM3MQorICAgIDB4OEFBQSwgLy8g6KqqLCAjOTEKKyAgICAweDhBQkYsIC8vIOiqvywgIzUwOQorICAgIDB4OEFDQiwgLy8g6KuLLCAjMTE5CisgICAgMHg4QUQ2LCAvLyDoq5YsICMxMTQKKyAgICAweDhCMUQsIC8vIOisnSwgIzM4OQorICAgIDB4OEI0OSwgLy8g6K2JLCAjNDI5CisgICAgMHg4QjU4LCAvLyDorZgsICM0MTYKKyAgICAweDhCNzAsIC8vIOitsCwgIzQ4NQorICAgIDB4OEI3NywgLy8g6K23LCAjNDc1CisgICAgMHg4QjgwLCAvLyDoroAsICMzODYKKyAgICAweDhCOEEsIC8vIOiuiiwgIzM4OAorICAgIDB4OEI5MywgLy8g6K6TLCAjMzM2CisgICAgMHg4Q0E4LCAvLyDosqgsICMzMTMKKyAgICAweDhDQjcsIC8vIOiytywgIzI2MAorICAgIDB4OENCQiwgLy8g6LK7LCAjMjAzCisgICAgMHg4Q0M3LCAvLyDos4csICM2MgorICAgIDB4OENFMywgLy8g6LOjLCAjMjk0CisgICAgMHg4Q0VBLCAvLyDos6osICM0NTcKKyAgICAweDhDRkMsIC8vIOizvCwgIzE4OQorICAgIDB4OEQ3NywgLy8g6LW3LCAjMjE0CisgICAgMHg4RDg1LCAvLyDotoUsICMyOTYKKyAgICAweDhEREYsIC8vIOi3nywgIzQ4OQorICAgIDB4OERFRiwgLy8g6LevLCAjMTM3CisgICAgMHg4RUFCLCAvLyDouqssICMxOTcKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzc2CisgICAgMHg4RjA5LCAvLyDovIksICMzMDEKKyAgICAweDhGNDksIC8vIOi9iSwgIzI4MgorICAgIDB4OEZEMSwgLy8g6L+RLCAjNDE0CisgICAgMHg5MDAxLCAvLyDpgIEsICMzNjMKKyAgICAweDkwMTksIC8vIOmAmSwgIzQyCisgICAgMHg5MDFBLCAvLyDpgJosICMyMDcKKyAgICAweDkwMUYsIC8vIOmAnywgIzQ5NQorICAgIDB4OTAyMCwgLy8g6YCgLCAjNDU1CisgICAgMHg5MDIzLCAvLyDpgKMsICMyODUKKyAgICAweDkwMzIsIC8vIOmAsiwgIzIzMQorICAgIDB4OTA0QSwgLy8g6YGKLCAjMTMyCisgICAgMHg5MDRCLCAvLyDpgYssICMyMTkKKyAgICAweDkwNEUsIC8vIOmBjiwgIzEwMQorICAgIDB4OTA1MywgLy8g6YGTLCAjMTQ2CisgICAgMHg5MDU0LCAvLyDpgZQsICM0MTcKKyAgICAweDkwNzgsIC8vIOmBuCwgIzE4MgorICAgIDB4OTA4NCwgLy8g6YKELCAjMTU0CisgICAgMHg5MDhBLCAvLyDpgoosICM0ODcKKyAgICAweDkwQTMsIC8vIOmCoywgIzI2OQorICAgIDB4OTBFOCwgLy8g6YOoLCAjNzgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzEwNAorICAgIDB4OTE0RCwgLy8g6YWNLCAjNDIxCisgICAgMHg5MTUyLCAvLyDphZIsICM1MTIKKyAgICAweDkxQUIsIC8vIOmGqywgIzM1OAorICAgIDB4OTFDRCwgLy8g6YeNLCAjMjI0CisgICAgMHg5MUNGLCAvLyDph48sICMzMTkKKyAgICAweDkxRDEsIC8vIOmHkSwgIzExNQorICAgIDB4OTMwNCwgLy8g6YyELCAjMzAyCisgICAgMHg5NTc3LCAvLyDplbcsICMxNzIKKyAgICAweDk1ODAsIC8vIOmWgCwgIzE5MworICAgIDB4OTU4QiwgLy8g6ZaLLCAjNzIKKyAgICAweDk1OTMsIC8vIOmWkywgIzgwCisgICAgMHg5NUIxLCAvLyDplrEsICM0MDUKKyAgICAweDk1REMsIC8vIOmXnCwgIzc0CisgICAgMHg5NjNGLCAvLyDpmL8sICM0NjAKKyAgICAweDk2NTAsIC8vIOmZkCwgIzI2NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDc0CisgICAgMHg5NjY0LCAvLyDpmaQsICM0NzgKKyAgICAweDk2OUIsIC8vIOmamywgIzQ1OQorICAgIDB4OTZDNiwgLy8g6ZuGLCAjMzQ3CisgICAgMHg5NkUyLCAvLyDpm6IsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzMzCisgICAgMHg5NzAwLCAvLyDpnIAsICM0NDUKKyAgICAweDk3NUUsIC8vIOmdniwgIzQ1MQorICAgIDB4OTc2MiwgLy8g6Z2iLCAjMTI5CisgICAgMHg5N0YzLCAvLyDpn7MsICMxOTQKKyAgICAweDk4MDEsIC8vIOmggSwgIzgzCisgICAgMHg5ODJELCAvLyDpoK0sICMyMzgKKyAgICAweDk4NEMsIC8vIOmhjCwgIzEyMgorICAgIDB4OTg1RSwgLy8g6aGeLCAjMTYzCisgICAgMHg5OEE4LCAvLyDpoqgsICMyNjYKKyAgICAweDk4REYsIC8vIOmjnywgIzIwOAorICAgIDB4OTkxMCwgLy8g6aSQLCAjNDY5CisgICAgMHg5OTI4LCAvLyDppKgsICM0MjQKKyAgICAweDk5OTYsIC8vIOmmliwgIzE2NgorICAgIDB4OTk5OSwgLy8g6aaZLCAjMjYzCisgICAgMHg5OUFDLCAvLyDppqwsICMzMTcKKyAgICAweDlBNTcsIC8vIOmplywgIzQ5MgorICAgIDB4OUFENCwgLy8g6auULCAjMTAwCisgICAgMHg5QUQ4LCAvLyDpq5gsICM4OAorICAgIDB4OUVCQywgLy8g6bq8LCAjMjQxCisgICAgMHg5RUMzLCAvLyDpu4MsICM0ODAKKyAgICAweDlFRDEsIC8vIOm7kSwgIzQ5MAorICAgIDB4OUVERSwgLy8g6bueLCAjNjkKKyAgICAweDlGOEQsIC8vIOm+jSwgIzUwNQorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X3poVFdfY292ZXJhZ2U9MC43MDQ4NDEyMDAwMjY4Nzc7CisKKy8vIFRoZSA1MTIgbW9zdCBmcmVxdWVudGx5IG9jY3VyaW5nIGNoYXJhY3RlcnMgZm9yIHRoZSBqYSBsYW5ndWFnZSBpbiBhIHNhbXBsZSBvZiB0aGUgSW50ZXJuZXQuCisvLyBPcmRlcmVkIGJ5IGNvZGVwb2ludCwgY29tbWVudCBzaG93cyBjaGFyYWN0ZXIgYW5kIHJhbmtpbmcgYnkgZnJlcXVlbmN5Citjb25zdCB1aW50MTZfdCBmcmVxdWVudF9qYVtdID0geworICAgIDB4MzAwNSwgLy8g44CFLCAjMzUyCisgICAgMHgzMDQxLCAvLyDjgYEsICM0ODYKKyAgICAweDMwNDIsIC8vIOOBgiwgIzUwCisgICAgMHgzMDQ0LCAvLyDjgYQsICMyCisgICAgMHgzMDQ2LCAvLyDjgYYsICMzMworICAgIDB4MzA0OCwgLy8g44GILCAjODMKKyAgICAweDMwNEEsIC8vIOOBiiwgIzM3CisgICAgMHgzMDRCLCAvLyDjgYssICMyMQorICAgIDB4MzA0QywgLy8g44GMLCAjMTcKKyAgICAweDMwNEQsIC8vIOOBjSwgIzUxCisgICAgMHgzMDRFLCAvLyDjgY4sICMzMjQKKyAgICAweDMwNEYsIC8vIOOBjywgIzM4CisgICAgMHgzMDUwLCAvLyDjgZAsICMzMzQKKyAgICAweDMwNTEsIC8vIOOBkSwgIzYwCisgICAgMHgzMDUyLCAvLyDjgZIsICMyOTYKKyAgICAweDMwNTMsIC8vIOOBkywgIzM0CisgICAgMHgzMDU0LCAvLyDjgZQsICMxMDAKKyAgICAweDMwNTUsIC8vIOOBlSwgIzMxCisgICAgMHgzMDU2LCAvLyDjgZYsICMzNzgKKyAgICAweDMwNTcsIC8vIOOBlywgIzQKKyAgICAweDMwNTgsIC8vIOOBmCwgIzEyMQorICAgIDB4MzA1OSwgLy8g44GZLCAjMTIKKyAgICAweDMwNUEsIC8vIOOBmiwgIzIxNQorICAgIDB4MzA1QiwgLy8g44GbLCAjODYKKyAgICAweDMwNUQsIC8vIOOBnSwgIzY4CisgICAgMHgzMDVGLCAvLyDjgZ8sICMxMQorICAgIDB4MzA2MCwgLy8g44GgLCAjNDIKKyAgICAweDMwNjEsIC8vIOOBoSwgIzY3CisgICAgMHgzMDYzLCAvLyDjgaMsICMyMworICAgIDB4MzA2NCwgLy8g44GkLCAjNzMKKyAgICAweDMwNjYsIC8vIOOBpiwgIzcKKyAgICAweDMwNjcsIC8vIOOBpywgIzYKKyAgICAweDMwNjgsIC8vIOOBqCwgIzE0CisgICAgMHgzMDY5LCAvLyDjgaksICM3NQorICAgIDB4MzA2QSwgLy8g44GqLCAjOAorICAgIDB4MzA2QiwgLy8g44GrLCAjNQorICAgIDB4MzA2RCwgLy8g44GtLCAjMTIzCisgICAgMHgzMDZFLCAvLyDjga4sICMxCisgICAgMHgzMDZGLCAvLyDjga8sICMxNgorICAgIDB4MzA3MCwgLy8g44GwLCAjMTUwCisgICAgMHgzMDcxLCAvLyDjgbEsICMyNTkKKyAgICAweDMwNzIsIC8vIOOBsiwgIzM2NAorICAgIDB4MzA3MywgLy8g44GzLCAjMjY2CisgICAgMHgzMDc1LCAvLyDjgbUsICM0ODQKKyAgICAweDMwNzYsIC8vIOOBtiwgIzMzMAorICAgIDB4MzA3OCwgLy8g44G4LCAjMTQ2CisgICAgMHgzMDc5LCAvLyDjgbksICMyMDcKKyAgICAweDMwN0IsIC8vIOOBuywgIzI1NAorICAgIDB4MzA3RSwgLy8g44G+LCAjMTgKKyAgICAweDMwN0YsIC8vIOOBvywgIzc0CisgICAgMHgzMDgwLCAvLyDjgoAsICMyODUKKyAgICAweDMwODEsIC8vIOOCgSwgIzc4CisgICAgMHgzMDgyLCAvLyDjgoIsICMzMgorICAgIDB4MzA4MywgLy8g44KDLCAjMTExCisgICAgMHgzMDg0LCAvLyDjgoQsICM4NQorICAgIDB4MzA4NiwgLy8g44KGLCAjMzkyCisgICAgMHgzMDg3LCAvLyDjgocsICMyMjQKKyAgICAweDMwODgsIC8vIOOCiCwgIzYzCisgICAgMHgzMDg5LCAvLyDjgoksICMyOQorICAgIDB4MzA4QSwgLy8g44KKLCAjMjgKKyAgICAweDMwOEIsIC8vIOOCiywgIzkKKyAgICAweDMwOEMsIC8vIOOCjCwgIzM1CisgICAgMHgzMDhELCAvLyDjgo0sICMxMjcKKyAgICAweDMwOEYsIC8vIOOCjywgIzg4CisgICAgMHgzMDkyLCAvLyDjgpIsICMxOQorICAgIDB4MzA5MywgLy8g44KTLCAjMjIKKyAgICAweDMwQTEsIC8vIOOCoSwgIzE5MworICAgIDB4MzBBMiwgLy8g44KiLCAjMjcKKyAgICAweDMwQTMsIC8vIOOCoywgIzcwCisgICAgMHgzMEE0LCAvLyDjgqQsICMxNQorICAgIDB4MzBBNiwgLy8g44KmLCAjODkKKyAgICAweDMwQTcsIC8vIOOCpywgIzEzNAorICAgIDB4MzBBOCwgLy8g44KoLCAjODEKKyAgICAweDMwQTksIC8vIOOCqSwgIzIyNQorICAgIDB4MzBBQSwgLy8g44KqLCAjNzYKKyAgICAweDMwQUIsIC8vIOOCqywgIzUyCisgICAgMHgzMEFDLCAvLyDjgqwsICMxNDcKKyAgICAweDMwQUQsIC8vIOOCrSwgIzY2CisgICAgMHgzMEFFLCAvLyDjgq4sICMyNDYKKyAgICAweDMwQUYsIC8vIOOCrywgIzI1CisgICAgMHgzMEIwLCAvLyDjgrAsICMzOQorICAgIDB4MzBCMSwgLy8g44KxLCAjMTM3CisgICAgMHgzMEIyLCAvLyDjgrIsICMyMDAKKyAgICAweDMwQjMsIC8vIOOCsywgIzQ2CisgICAgMHgzMEI0LCAvLyDjgrQsICMxODMKKyAgICAweDMwQjUsIC8vIOOCtSwgIzY0CisgICAgMHgzMEI2LCAvLyDjgrYsICMyMjEKKyAgICAweDMwQjcsIC8vIOOCtywgIzQ4CisgICAgMHgzMEI4LCAvLyDjgrgsICM1NQorICAgIDB4MzBCOSwgLy8g44K5LCAjMTMKKyAgICAweDMwQkEsIC8vIOOCuiwgIzEwMworICAgIDB4MzBCQiwgLy8g44K7LCAjMTA5CisgICAgMHgzMEJDLCAvLyDjgrwsICM0OTkKKyAgICAweDMwQkQsIC8vIOOCvSwgIzE3NQorICAgIDB4MzBCRiwgLy8g44K/LCAjNDUKKyAgICAweDMwQzAsIC8vIOODgCwgIzEwNAorICAgIDB4MzBDMSwgLy8g44OBLCAjNzEKKyAgICAweDMwQzMsIC8vIOODgywgIzIwCisgICAgMHgzMEM0LCAvLyDjg4QsICMxMTkKKyAgICAweDMwQzYsIC8vIOODhiwgIzU5CisgICAgMHgzMEM3LCAvLyDjg4csICM4MgorICAgIDB4MzBDOCwgLy8g44OILCAjMTAKKyAgICAweDMwQzksIC8vIOODiSwgIzQ0CisgICAgMHgzMENBLCAvLyDjg4osICMxMDIKKyAgICAweDMwQ0IsIC8vIOODiywgIzcyCisgICAgMHgzMENELCAvLyDjg40sICMxMTcKKyAgICAweDMwQ0UsIC8vIOODjiwgIzE5MgorICAgIDB4MzBDRiwgLy8g44OPLCAjMTY0CisgICAgMHgzMEQwLCAvLyDjg5AsICM2MgorICAgIDB4MzBEMSwgLy8g44ORLCAjOTAKKyAgICAweDMwRDIsIC8vIOODkiwgIzM5OAorICAgIDB4MzBEMywgLy8g44OTLCAjNzcKKyAgICAweDMwRDQsIC8vIOODlCwgIzEzNQorICAgIDB4MzBENSwgLy8g44OVLCAjNDcKKyAgICAweDMwRDYsIC8vIOODliwgIzU2CisgICAgMHgzMEQ3LCAvLyDjg5csICM0MworICAgIDB4MzBEOCwgLy8g44OYLCAjMjY4CisgICAgMHgzMEQ5LCAvLyDjg5ksICMxNTcKKyAgICAweDMwREEsIC8vIOODmiwgIzEyNQorICAgIDB4MzBEQiwgLy8g44ObLCAjMTU1CisgICAgMHgzMERDLCAvLyDjg5wsICMxNjgKKyAgICAweDMwREQsIC8vIOODnSwgIzExNAorICAgIDB4MzBERSwgLy8g44OeLCAjNTcKKyAgICAweDMwREYsIC8vIOODnywgIzk3CisgICAgMHgzMEUwLCAvLyDjg6AsICM2OQorICAgIDB4MzBFMSwgLy8g44OhLCAjNTMKKyAgICAweDMwRTIsIC8vIOODoiwgIzE0MgorICAgIDB4MzBFMywgLy8g44OjLCAjOTMKKyAgICAweDMwRTQsIC8vIOODpCwgIzI1OAorICAgIDB4MzBFNSwgLy8g44OlLCAjNzkKKyAgICAweDMwRTYsIC8vIOODpiwgIzQwNQorICAgIDB4MzBFNywgLy8g44OnLCAjOTgKKyAgICAweDMwRTksIC8vIOODqSwgIzI2CisgICAgMHgzMEVBLCAvLyDjg6osICMzMAorICAgIDB4MzBFQiwgLy8g44OrLCAjMjQKKyAgICAweDMwRUMsIC8vIOODrCwgIzQxCisgICAgMHgzMEVELCAvLyDjg60sICM0MAorICAgIDB4MzBFRiwgLy8g44OvLCAjMTQ0CisgICAgMHgzMEYzLCAvLyDjg7MsICMzCisgICAgMHgzMEY0LCAvLyDjg7QsICM0ODMKKyAgICAweDMwRkQsIC8vIOODvSwgIzUwMQorICAgIDB4NEUwMCwgLy8g5LiALCAjODQKKyAgICAweDRFMDcsIC8vIOS4hywgIzMzNworICAgIDB4NEUwOSwgLy8g5LiJLCAjMzIzCisgICAgMHg0RTBBLCAvLyDkuIosICMxMzMKKyAgICAweDRFMEIsIC8vIOS4iywgIzE4MAorICAgIDB4NEUwRCwgLy8g5LiNLCAjMjc3CisgICAgMHg0RTE2LCAvLyDkuJYsICMzODUKKyAgICAweDRFMkQsIC8vIOS4rSwgIzg3CisgICAgMHg0RTNCLCAvLyDkuLssICM0MzIKKyAgICAweDRFODgsIC8vIOS6iCwgIzMyNgorICAgIDB4NEU4QiwgLy8g5LqLLCAjOTUKKyAgICAweDRFOEMsIC8vIOS6jCwgIzM5NAorICAgIDB4NEU5NSwgLy8g5LqVLCAjNDY4CisgICAgMHg0RUE0LCAvLyDkuqQsICM0MTAKKyAgICAweDRFQUMsIC8vIOS6rCwgIzI2MAorICAgIDB4NEVCQSwgLy8g5Lq6LCAjNjEKKyAgICAweDRFQ0EsIC8vIOS7iiwgIzE4NAorICAgIDB4NEVDQiwgLy8g5LuLLCAjMzU4CisgICAgMHg0RUQ1LCAvLyDku5UsICMzOTEKKyAgICAweDRFRDYsIC8vIOS7liwgIzI1NgorICAgIDB4NEVEOCwgLy8g5LuYLCAjMjQzCisgICAgMHg0RUUzLCAvLyDku6MsICMyODAKKyAgICAweDRFRTUsIC8vIOS7pSwgIzIxNgorICAgIDB4NEVGNiwgLy8g5Lu2LCAjMTkwCisgICAgMHg0RjFBLCAvLyDkvJosICMxMDUKKyAgICAweDRGNEQsIC8vIOS9jSwgIzE3NworICAgIDB4NEY0RiwgLy8g5L2PLCAjMzc2CisgICAgMHg0RjUzLCAvLyDkvZMsICMyMjMKKyAgICAweDRGNTUsIC8vIOS9lSwgIzI5NAorICAgIDB4NEY1QywgLy8g5L2cLCAjMTU0CisgICAgMHg0RjdGLCAvLyDkvb8sICMyMzMKKyAgICAweDRGOUIsIC8vIOS+mywgIzUwMworICAgIDB4NEZBMSwgLy8g5L6hLCAjMjE3CisgICAgMHg0RkJGLCAvLyDkvr8sICM1MTEKKyAgICAweDRGREQsIC8vIOS/nSwgIzI3OQorICAgIDB4NEZFMSwgLy8g5L+hLCAjMjcxCisgICAgMHg1MDBCLCAvLyDlgIssICM0MTUKKyAgICAweDUwQ0YsIC8vIOWDjywgIzE3OAorICAgIDB4NTEyQSwgLy8g5YSqLCAjNDAzCisgICAgMHg1MTQzLCAvLyDlhYMsICMzODQKKyAgICAweDUxNDgsIC8vIOWFiCwgIzMxMQorICAgIDB4NTE0OSwgLy8g5YWJLCAjNDg4CisgICAgMHg1MTY1LCAvLyDlhaUsICMxMTUKKyAgICAweDUxNjgsIC8vIOWFqCwgIzE3MworICAgIDB4NTE2QywgLy8g5YWsLCAjMjg3CisgICAgMHg1MTc3LCAvLyDlhbcsICM0NDcKKyAgICAweDUxODUsIC8vIOWGhSwgIzE2OQorICAgIDB4NTE4NiwgLy8g5YaGLCAjMTMxCisgICAgMHg1MTk5LCAvLyDlhpksICMyNzUKKyAgICAweDUxRkEsIC8vIOWHuiwgIzExMAorICAgIDB4NTIwNiwgLy8g5YiGLCAjMTMwCisgICAgMHg1MjA3LCAvLyDliIcsICM0MDEKKyAgICAweDUyMUQsIC8vIOWInSwgIzMxOQorICAgIDB4NTIyNSwgLy8g5YilLCAjMjkwCisgICAgMHg1MjI5LCAvLyDliKksICMyMjYKKyAgICAweDUyMzYsIC8vIOWItiwgIzUwNworICAgIDB4NTI0RCwgLy8g5YmNLCAjMTI0CisgICAgMHg1MjlCLCAvLyDlipssICMyNzIKKyAgICAweDUyQTAsIC8vIOWKoCwgIzI0OQorICAgIDB4NTJENSwgLy8g5YuVLCAjMTIwCisgICAgMHg1MkQ5LCAvLyDli5ksICM0MjEKKyAgICAweDUyREYsIC8vIOWLnywgIzQ3NgorICAgIDB4NTMxNiwgLy8g5YyWLCAjMzA4CisgICAgMHg1MzE3LCAvLyDljJcsICMzNDEKKyAgICAweDUzM0EsIC8vIOWMuiwgIzM0OAorICAgIDB4NTM5RiwgLy8g5Y6fLCAjMzIxCisgICAgMHg1M0MyLCAvLyDlj4IsICM0NTIKKyAgICAweDUzQ0IsIC8vIOWPiywgIzQ1MQorICAgIDB4NTNENiwgLy8g5Y+WLCAjMjM3CisgICAgMHg1M0Q3LCAvLyDlj5csICMzNTQKKyAgICAweDUzRTMsIC8vIOWPoywgIzI4OQorICAgIDB4NTNFNCwgLy8g5Y+kLCAjMzM5CisgICAgMHg1M0VGLCAvLyDlj68sICMyOTgKKyAgICAweDUzRjAsIC8vIOWPsCwgIzQzOQorICAgIDB4NTNGNywgLy8g5Y+3LCAjMzYxCisgICAgMHg1NDA4LCAvLyDlkIgsICMxMTgKKyAgICAweDU0MEMsIC8vIOWQjCwgIzI2MworICAgIDB4NTQwRCwgLy8g5ZCNLCAjNjUKKyAgICAweDU0MTEsIC8vIOWQkSwgIzQzNAorICAgIDB4NTQ0QSwgLy8g5ZGKLCAjMzg2CisgICAgMHg1NDY4LCAvLyDlkagsICMzOTMKKyAgICAweDU0NzMsIC8vIOWRsywgIzI5OQorICAgIDB4NTQ4QywgLy8g5ZKMLCAjMzUwCisgICAgMHg1NEMxLCAvLyDlk4EsICM5NgorICAgIDB4NTRFMSwgLy8g5ZOhLCAjMjkzCisgICAgMHg1NTQ2LCAvLyDllYYsICMxOTgKKyAgICAweDU1NEYsIC8vIOWVjywgIzE1OAorICAgIDB4NTVCNiwgLy8g5Za2LCAjNDM4CisgICAgMHg1NjY4LCAvLyDlmagsICMzNjYKKyAgICAweDU2REUsIC8vIOWbniwgIzE0MworICAgIDB4NTZGMywgLy8g5ZuzLCAjNDQ0CisgICAgMHg1NkZELCAvLyDlm70sICMxNTMKKyAgICAweDU3MTIsIC8vIOWckiwgIzQzNQorICAgIDB4NTcxRiwgLy8g5ZyfLCAjMjM5CisgICAgMHg1NzI4LCAvLyDlnKgsICMzNTEKKyAgICAweDU3MzAsIC8vIOWcsCwgIzE2MworICAgIDB4NTc4QiwgLy8g5Z6LLCAjNDMwCisgICAgMHg1ODMxLCAvLyDloLEsICMxMTIKKyAgICAweDU4MzQsIC8vIOWgtCwgIzEzOQorICAgIDB4NThGMiwgLy8g5aOyLCAjMjMyCisgICAgMHg1OTA5LCAvLyDlpIksICMzMDYKKyAgICAweDU5MTYsIC8vIOWkliwgIzIyMgorICAgIDB4NTkxQSwgLy8g5aSaLCAjMzM2CisgICAgMHg1OTI3LCAvLyDlpKcsICM4MAorICAgIDB4NTkyOSwgLy8g5aSpLCAjMjc4CisgICAgMHg1OTczLCAvLyDlpbMsICMxNjEKKyAgICAweDU5N0QsIC8vIOWlvSwgIzM0OQorICAgIDB4NUE1QSwgLy8g5amaLCAjNDc5CisgICAgMHg1QjUwLCAvLyDlrZAsICMxMTMKKyAgICAweDVCNTcsIC8vIOWtlywgIzQ5MgorICAgIDB4NUI2NiwgLy8g5a2mLCAjMTMyCisgICAgMHg1Qjg5LCAvLyDlroksICMyOTUKKyAgICAweDVCOUEsIC8vIOWumiwgIzE0NQorICAgIDB4NUI5RiwgLy8g5a6fLCAjMjIwCisgICAgMHg1QkE0LCAvLyDlrqQsICM0ODIKKyAgICAweDVCQUUsIC8vIOWuriwgIzQ4NworICAgIDB4NUJCNiwgLy8g5a62LCAjMjExCisgICAgMHg1QkI5LCAvLyDlrrksICMzMzMKKyAgICAweDVCRkUsIC8vIOWvviwgIzI1MgorICAgIDB4NUMwMiwgLy8g5bCCLCAjNDc0CisgICAgMHg1QzBGLCAvLyDlsI8sICMyMTIKKyAgICAweDVDMTEsIC8vIOWwkSwgIzM3NworICAgIDB4NUM0QiwgLy8g5bGLLCAjMjg0CisgICAgMHg1QzcxLCAvLyDlsbEsICMyMDYKKyAgICAweDVDQTEsIC8vIOWyoSwgIzQyOQorICAgIDB4NUNGNiwgLy8g5bO2LCAjMjk3CisgICAgMHg1RERELCAvLyDlt50sICMyNTMKKyAgICAweDVERTUsIC8vIOW3pSwgIzM3NAorICAgIDB4NUUwMiwgLy8g5biCLCAjMTU5CisgICAgMHg1RTJGLCAvLyDluK8sICM0MTYKKyAgICAweDVFMzgsIC8vIOW4uCwgIzQzNworICAgIDB4NUU3MywgLy8g5bmzLCAjMzkwCisgICAgMHg1RTc0LCAvLyDlubQsICM1NAorICAgIDB4NUU4MywgLy8g5bqDLCAjMzY3CisgICAgMHg1RTk3LCAvLyDlupcsICMxNDkKKyAgICAweDVFQTYsIC8vIOW6piwgIzI2OQorICAgIDB4NUVBQiwgLy8g5bqrLCAjMzgwCisgICAgMHg1RjBGLCAvLyDlvI8sICMyNjUKKyAgICAweDVGMTUsIC8vIOW8lSwgIzM0NQorICAgIDB4NUYzNywgLy8g5by3LCAjNDQ2CisgICAgMHg1RjUzLCAvLyDlvZMsICMyNDAKKyAgICAweDVGNjIsIC8vIOW9oiwgIzUwMgorICAgIDB4NUY4QywgLy8g5b6MLCAjMjMwCisgICAgMHg1Rjk3LCAvLyDlvpcsICM0OTAKKyAgICAweDVGQzMsIC8vIOW/gywgIzMwNworICAgIDB4NUZDNSwgLy8g5b+FLCAjNDIyCisgICAgMHg1RkRDLCAvLyDlv5wsICMzNTYKKyAgICAweDYwMUQsIC8vIOaAnSwgIzE4OQorICAgIDB4NjAyNywgLy8g5oCnLCAjMjAxCisgICAgMHg2MDc1LCAvLyDmgbUsICM0MDAKKyAgICAweDYwQzUsIC8vIOaDhSwgIzE0MAorICAgIDB4NjBGMywgLy8g5oOzLCAjNDc3CisgICAgMHg2MTBGLCAvLyDmhI8sICMzMDUKKyAgICAweDYxMUIsIC8vIOaEmywgIzI3MworICAgIDB4NjExRiwgLy8g5oSfLCAjMjU3CisgICAgMHg2MjEwLCAvLyDmiJAsICMyNjIKKyAgICAweDYyMjYsIC8vIOaIpiwgIzM2NQorICAgIDB4NjI0MCwgLy8g5omALCAjMjM2CisgICAgMHg2MjRCLCAvLyDmiYssICMxNjAKKyAgICAweDYyOTUsIC8vIOaKlSwgIzEyOQorICAgIDB4NjMwMSwgLy8g5oyBLCAjMzU1CisgICAgMHg2MzA3LCAvLyDmjIcsICM0MjUKKyAgICAweDYzQTIsIC8vIOaOoiwgIzM2OQorICAgIDB4NjNCMiwgLy8g5o6yLCAjMzk5CisgICAgMHg2NDNBLCAvLyDmkLosICM0NTkKKyAgICAweDY1MkYsIC8vIOaUrywgIzUxMgorICAgIDB4NjUzRSwgLy8g5pS+LCAjNDY5CisgICAgMHg2NTU5LCAvLyDmlZksICMyNzAKKyAgICAweDY1NzAsIC8vIOaVsCwgIzE4MQorICAgIDB4NjU4NywgLy8g5paHLCAjMjAyCisgICAgMHg2NTk5LCAvLyDmlpksICMxMDYKKyAgICAweDY1QjAsIC8vIOaWsCwgIzk5CisgICAgMHg2NUI5LCAvLyDmlrksICMxMjYKKyAgICAweDY1QzUsIC8vIOaXhSwgIzQ0NQorICAgIDB4NjVFNSwgLy8g5pelLCAjMzYKKyAgICAweDY2MEUsIC8vIOaYjiwgIzMwMAorICAgIDB4NjYyMCwgLy8g5pigLCAjNDE4CisgICAgMHg2NjQyLCAvLyDmmYIsICMxMDcKKyAgICAweDY2RjQsIC8vIOabtCwgIzM1OQorICAgIDB4NjZGOCwgLy8g5pu4LCAjMTc0CisgICAgMHg2NzAwLCAvLyDmnIAsICMxNTIKKyAgICAweDY3MDgsIC8vIOaciCwgIzQ5CisgICAgMHg2NzA5LCAvLyDmnIksICMzMDIKKyAgICAweDY3MUYsIC8vIOacnywgIzMzMgorICAgIDB4NjcyOCwgLy8g5pyoLCAjMjAzCisgICAgMHg2NzJDLCAvLyDmnKwsICM5MgorICAgIDB4Njc1MCwgLy8g5p2QLCAjNDg5CisgICAgMHg2NzUxLCAvLyDmnZEsICM0NjYKKyAgICAweDY3NjUsIC8vIOadpSwgIzI2NworICAgIDB4Njc3MSwgLy8g5p2xLCAjMTkxCisgICAgMHg2NzdGLCAvLyDmnb8sICM0MTEKKyAgICAweDY3OUMsIC8vIOaenCwgIzQ0MQorICAgIDB4NjgyMSwgLy8g5qChLCAjMzI3CisgICAgMHg2ODJBLCAvLyDmoKosICM0MTIKKyAgICAweDY4M0MsIC8vIOagvCwgIzIyOAorICAgIDB4NjkxQywgLy8g5qScLCAjMTc5CisgICAgMHg2OTZELCAvLyDmpa0sICMxNjYKKyAgICAweDY5N0QsIC8vIOalvSwgIzE3MgorICAgIDB4NjlEOCwgLy8g5qeYLCAjMjU1CisgICAgMHg2QTVGLCAvLyDmqZ8sICMyMzUKKyAgICAweDZCMjEsIC8vIOasoSwgIzMxOAorICAgIDB4NkI2MiwgLy8g5q2iLCAjNDc1CisgICAgMHg2QjYzLCAvLyDmraMsICMzMTIKKyAgICAweDZDMTcsIC8vIOawlywgIzExNgorICAgIDB4NkMzNCwgLy8g5rC0LCAjMTY1CisgICAgMHg2QzQyLCAvLyDmsYIsICM0NjUKKyAgICAweDZDN0EsIC8vIOaxuiwgIzM3MAorICAgIDB4NkNCQiwgLy8g5rK7LCAjNTA1CisgICAgMHg2Q0MxLCAvLyDms4EsICM0NjIKKyAgICAweDZDRDUsIC8vIOazlSwgIzIyNworICAgIDB4NkNFOCwgLy8g5rOoLCAjMzcyCisgICAgMHg2RDNCLCAvLyDmtLssICMzMDMKKyAgICAweDZENDEsIC8vIOa1gSwgIzQ4MAorICAgIDB4NkQ3NywgLy8g5rW3LCAjMjc0CisgICAgMHg2RTA4LCAvLyDmuIgsICM0MTcKKyAgICAweDZGMTQsIC8vIOa8lCwgIzUwNAorICAgIDB4NzA2QiwgLy8g54GrLCAjMjY0CisgICAgMHg3MEI5LCAvLyDngrksICMzMzEKKyAgICAweDcxMjEsIC8vIOeEoSwgIzU4CisgICAgMHg3MjQ4LCAvLyDniYgsICM0MDkKKyAgICAweDcyNjksIC8vIOeJqSwgIzE3MAorICAgIDB4NzI3OSwgLy8g54m5LCAjMjQyCisgICAgMHg3MkI2LCAvLyDnirYsICM0NTgKKyAgICAweDczRkUsIC8vIOePviwgIzMyMgorICAgIDB4NzQwNiwgLy8g55CGLCAjMTYyCisgICAgMHg3NTFGLCAvLyDnlJ8sICMxMjIKKyAgICAweDc1MjMsIC8vIOeUoywgIzMyMAorICAgIDB4NzUyOCwgLy8g55SoLCAjOTQKKyAgICAweDc1MzAsIC8vIOeUsCwgIzE5NQorICAgIDB4NzUzNywgLy8g55S3LCAjMzczCisgICAgMHg3NTNBLCAvLyDnlLosICMzMTQKKyAgICAweDc1M0IsIC8vIOeUuywgIzkxCisgICAgMHg3NTRDLCAvLyDnlYwsICM0MzYKKyAgICAweDc1NkEsIC8vIOeVqiwgIzI2MQorICAgIDB4NzVDNSwgLy8g55eFLCAjNDI4CisgICAgMHg3NjdBLCAvLyDnmbosICMxOTQKKyAgICAweDc2N0IsIC8vIOeZuywgIzIzMQorICAgIDB4NzY3RCwgLy8g55m9LCAjNDE5CisgICAgMHg3Njg0LCAvLyDnmoQsICMyNTEKKyAgICAweDc2RUUsIC8vIOebriwgIzE5NworICAgIDB4NzZGNCwgLy8g55u0LCAjNDk3CisgICAgMHg3NkY4LCAvLyDnm7gsICMyODYKKyAgICAweDc3MEMsIC8vIOecjCwgIzE5OQorICAgIDB4NzcxRiwgLy8g55yfLCAjMjE5CisgICAgMHg3NzQwLCAvLyDnnYAsICMyODMKKyAgICAweDc3RTUsIC8vIOefpSwgIzE4NQorICAgIDB4NzdGMywgLy8g55+zLCAjNTAwCisgICAgMHg3OEJBLCAvLyDnorosICMzODMKKyAgICAweDc5M0EsIC8vIOekuiwgIzI0MQorICAgIDB4NzkzRSwgLy8g56S+LCAjMTY3CisgICAgMHg3OTVFLCAvLyDnpZ4sICMzMTUKKyAgICAweDc5OEYsIC8vIOemjywgIzQyMworICAgIDB4NzlDMSwgLy8g56eBLCAjMzQ3CisgICAgMHg3OUQxLCAvLyDnp5EsICM0MjAKKyAgICAweDdBMEUsIC8vIOeojiwgIzM2OAorICAgIDB4N0EyRSwgLy8g56iuLCAjNDU1CisgICAgMHg3QTNGLCAvLyDnqL8sICMxNDgKKyAgICAweDdBN0EsIC8vIOepuiwgIzQyNworICAgIDB4N0FDQiwgLy8g56uLLCAjMzA5CisgICAgMHg3QjExLCAvLyDnrJEsICM0NTQKKyAgICAweDdCMkMsIC8vIOesrCwgIzMxNworICAgIDB4N0I0OSwgLy8g562JLCAjNDU3CisgICAgMHg3QjU0LCAvLyDnrZQsICM0MjYKKyAgICAweDdCQTEsIC8vIOeuoSwgIzQ4MQorICAgIDB4N0NGQiwgLy8g57O7LCAjNDA4CisgICAgMHg3RDA0LCAvLyDntIQsICMyNzYKKyAgICAweDdEMjAsIC8vIOe0oCwgIzQwNworICAgIDB4N0QyMiwgLy8g57SiLCAjMjE0CisgICAgMHg3RDMwLCAvLyDntLAsICMzODEKKyAgICAweDdEMzksIC8vIOe0uSwgIzQ3MQorICAgIDB4N0Q0MiwgLy8g57WCLCAjNDU2CisgICAgMHg3RDQ0LCAvLyDntYQsICM0MjQKKyAgICAweDdENEMsIC8vIOe1jCwgIzM2MAorICAgIDB4N0Q1MCwgLy8g57WQLCAjMjkxCisgICAgMHg3RDlBLCAvLyDntposICMzNTcKKyAgICAweDdEQ0YsIC8vIOe3jywgIzQ2NworICAgIDB4N0REQSwgLy8g57eaLCAjMzM4CisgICAgMHg3REU4LCAvLyDnt6gsICM0NTMKKyAgICAweDdGOEUsIC8vIOe+jiwgIzIwNAorICAgIDB4ODAwMywgLy8g6ICDLCAjMzg3CisgICAgMHg4MDA1LCAvLyDogIUsICMxNTEKKyAgICAweDgwNUUsIC8vIOiBniwgIzQ2MworICAgIDB4ODA3NywgLy8g6IG3LCAjMzYzCisgICAgMHg4MEIyLCAvLyDogrIsICM0MzMKKyAgICAweDgwRkQsIC8vIOiDvSwgIzI1MAorICAgIDB4ODE3OSwgLy8g6IW5LCAjMzk2CisgICAgMHg4MUVBLCAvLyDoh6osICMxNTYKKyAgICAweDgyNkYsIC8vIOiJrywgIzMyOQorICAgIDB4ODI3MiwgLy8g6ImyLCAjNDAyCisgICAgMHg4MkIxLCAvLyDoirEsICM0NDAKKyAgICAweDgyQjgsIC8vIOiKuCwgIzQxMworICAgIDB4ODJGMSwgLy8g6IuxLCAjNDg1CisgICAgMHg4NDQ5LCAvLyDokYksICM0NzIKKyAgICAweDg4NEMsIC8vIOihjCwgIzEyOAorICAgIDB4ODg1MywgLy8g6KGTLCAjNDYwCisgICAgMHg4ODY4LCAvLyDooagsICMyMDkKKyAgICAweDg4RkQsIC8vIOijvSwgIzQzMQorICAgIDB4ODk3RiwgLy8g6KW/LCAjNDA2CisgICAgMHg4OTgxLCAvLyDopoEsICMzMTMKKyAgICAweDg5OEIsIC8vIOimiywgIzEwMQorICAgIDB4ODk4RiwgLy8g6KaPLCAjMzc1CisgICAgMHg4OUE3LCAvLyDopqcsICMxNzEKKyAgICAweDg5RTMsIC8vIOinoywgIzM4OAorICAgIDB4OEEwMCwgLy8g6KiALCAjMjEwCisgICAgMHg4QTA4LCAvLyDoqIgsICMzNDMKKyAgICAweDhBMTgsIC8vIOiomCwgIzEzNgorICAgIDB4OEEyRCwgLy8g6KitLCAjMjkyCisgICAgMHg4QTcxLCAvLyDoqbEsICMyMTMKKyAgICAweDhBNzMsIC8vIOipsywgIzM3MQorICAgIDB4OEE4RCwgLy8g6KqNLCAjNDA0CisgICAgMHg4QTlFLCAvLyDoqp4sICMyMzQKKyAgICAweDhBQUMsIC8vIOiqrCwgIzQ5NAorICAgIDB4OEFBRCwgLy8g6KqtLCAjMzAxCisgICAgMHg4QUJGLCAvLyDoqr8sICM0NDMKKyAgICAweDhBQzcsIC8vIOirhywgIzQ0OAorICAgIDB4OEI3NywgLy8g6K23LCAjNTA5CisgICAgMHg4QzM3LCAvLyDosLcsICM1MDYKKyAgICAweDhDQTksIC8vIOiyqSwgIzM2MgorICAgIDB4OENCNywgLy8g6LK3LCAjMzQ2CisgICAgMHg4Q0M3LCAvLyDos4csICM0NzMKKyAgICAweDhDRUEsIC8vIOizqiwgIzI4MQorICAgIDB4OENGQywgLy8g6LO8LCAjNDk1CisgICAgMHg4RUFCLCAvLyDouqssICM0NzAKKyAgICAweDhFQ0EsIC8vIOi7iiwgIzIwNQorICAgIDB4OEVFMiwgLy8g6LuiLCAjMzM1CisgICAgMHg4RjA5LCAvLyDovIksICMzNDIKKyAgICAweDhGQkMsIC8vIOi+vCwgIzIyOQorICAgIDB4OEZEMSwgLy8g6L+RLCAjMzA0CisgICAgMHg4RkQ0LCAvLyDov5QsICM0NjEKKyAgICAweDhGRkQsIC8vIOi/vSwgIzM3OQorICAgIDB4OTAwMSwgLy8g6YCBLCAjMTg2CisgICAgMHg5MDFBLCAvLyDpgJosICMxODIKKyAgICAweDkwMUYsIC8vIOmAnywgIzM0MAorICAgIDB4OTAyMywgLy8g6YCjLCAjMjQ0CisgICAgMHg5MDRCLCAvLyDpgYssICMzODIKKyAgICAweDkwNEUsIC8vIOmBjiwgIzQ5OAorICAgIDB4OTA1MywgLy8g6YGTLCAjMjgyCisgICAgMHg5MDU0LCAvLyDpgZQsICM0NTAKKyAgICAweDkwNTUsIC8vIOmBlSwgIzQxNAorICAgIDB4OTA3OCwgLy8g6YG4LCAjMjg4CisgICAgMHg5MEU4LCAvLyDpg6gsICMyMDgKKyAgICAweDkwRkQsIC8vIOmDvSwgIzM0NAorICAgIDB4OTE0RCwgLy8g6YWNLCAjMzg5CisgICAgMHg5MUNELCAvLyDph40sICM0NzgKKyAgICAweDkxQ0UsIC8vIOmHjiwgIzI0NQorICAgIDB4OTFEMSwgLy8g6YeRLCAjMTM4CisgICAgMHg5MzMyLCAvLyDpjLIsICMyMzgKKyAgICAweDk1NzcsIC8vIOmVtywgIzI0NworICAgIDB4OTU4MCwgLy8g6ZaALCAjNTA4CisgICAgMHg5NThCLCAvLyDplossICMyNDgKKyAgICAweDk1OTMsIC8vIOmWkywgIzE0MQorICAgIDB4OTVBMiwgLy8g6ZaiLCAjMTg4CisgICAgMHg5NjJBLCAvLyDpmKosICM0OTYKKyAgICAweDk2NTAsIC8vIOmZkCwgIzM5NQorICAgIDB4OTY2MiwgLy8g6ZmiLCAjNDQ5CisgICAgMHg5NjY0LCAvLyDpmaQsICM1MTAKKyAgICAweDk2OUIsIC8vIOmamywgIzQ5MworICAgIDB4OTZDNiwgLy8g6ZuGLCAjMTk2CisgICAgMHg5NkQxLCAvLyDpm5EsICM0NDIKKyAgICAweDk2RkIsIC8vIOmbuywgIzE4NworICAgIDB4OTc2MiwgLy8g6Z2iLCAjMzI4CisgICAgMHg5N0YzLCAvLyDpn7MsICMzMjUKKyAgICAweDk4NEMsIC8vIOmhjCwgIzMxMAorICAgIDB4OTg1RSwgLy8g6aGeLCAjNDkxCisgICAgMHg5OEE4LCAvLyDpoqgsICMzNTMKKyAgICAweDk4REYsIC8vIOmjnywgIzIxOAorICAgIDB4OTkyOCwgLy8g6aSoLCAjNDY0CisgICAgMHg5OUM1LCAvLyDpp4UsICMzMTYKKyAgICAweDlBMTMsIC8vIOmokywgIzM5NworICAgIDB4OUFEOCwgLy8g6auYLCAjMTc2CisgICAgMHhGRjU3LCAvLyDvvZcsICMxMDgKK307CisvLyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgc2FtcGxlIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNoYXJhY3RlcnMKK3N0YXRpYyBjb25zdCBmbG9hdCBmcmVxdWVudF9qYV9jb3ZlcmFnZT0wLjg4MDU2OTU4OTEyMDE2MjsKKworLy8gVGhlIDUxMiBtb3N0IGZyZXF1ZW50bHkgb2NjdXJpbmcgY2hhcmFjdGVycyBmb3IgdGhlIGtvIGxhbmd1YWdlIGluIGEgc2FtcGxlIG9mIHRoZSBJbnRlcm5ldC4KKy8vIE9yZGVyZWQgYnkgY29kZXBvaW50LCBjb21tZW50IHNob3dzIGNoYXJhY3RlciBhbmQgcmFua2luZyBieSBmcmVxdWVuY3kKK2NvbnN0IHVpbnQxNl90IGZyZXF1ZW50X2tvW10gPSB7CisgICAgMHgzMTRCLCAvLyDjhYssICMxNDgKKyAgICAweDMxNEUsIC8vIOOFjiwgIzM5MAorICAgIDB4MzE2MCwgLy8g44WgLCAjMzU0CisgICAgMHgzMThELCAvLyDjho0sICM0MzkKKyAgICAweEFDMDAsIC8vIOqwgCwgIzYKKyAgICAweEFDMDEsIC8vIOqwgSwgIzIzMQorICAgIDB4QUMwNCwgLy8g6rCELCAjMTA2CisgICAgMHhBQzA4LCAvLyDqsIgsICMzNjIKKyAgICAweEFDMTAsIC8vIOqwkCwgIzEyMgorICAgIDB4QUMxMSwgLy8g6rCRLCAjNDkzCisgICAgMHhBQzE1LCAvLyDqsJUsICMxNTUKKyAgICAweEFDMTksIC8vIOqwmSwgIzI2NAorICAgIDB4QUMxQywgLy8g6rCcLCAjODcKKyAgICAweEFDMUQsIC8vIOqwnSwgIzE5OAorICAgIDB4QUMyNCwgLy8g6rCkLCAjNDU3CisgICAgMHhBQzcwLCAvLyDqsbAsICM5MQorICAgIDB4QUM3NCwgLy8g6rG0LCAjMTYxCisgICAgMHhBQzc4LCAvLyDqsbgsICMzMzgKKyAgICAweEFDODAsIC8vIOqygCwgIzE4NAorICAgIDB4QUM4MywgLy8g6rKDLCAjMTE2CisgICAgMHhBQzhDLCAvLyDqsowsICMzNgorICAgIDB4QUNBMCwgLy8g6rKgLCAjMjMzCisgICAgMHhBQ0E4LCAvLyDqsqgsICMzNDEKKyAgICAweEFDQTksIC8vIOqyqSwgIzI0NQorICAgIDB4QUNBQywgLy8g6rKsLCAjNDEzCisgICAgMHhBQ0IwLCAvLyDqsrAsICMyMDIKKyAgICAweEFDQkQsIC8vIOqyvSwgIzYyCisgICAgMHhBQ0M0LCAvLyDqs4QsICMxNDIKKyAgICAweEFDRTAsIC8vIOqzoCwgIzEyCisgICAgMHhBQ0UxLCAvLyDqs6EsICM0NDQKKyAgICAweEFDRTgsIC8vIOqzqCwgIzM3OQorICAgIDB4QUNGMywgLy8g6rOzLCAjMzg4CisgICAgMHhBQ0Y1LCAvLyDqs7UsICM1OQorICAgIDB4QUNGQywgLy8g6rO8LCAjNjkKKyAgICAweEFEMDAsIC8vIOq0gCwgIzk1CisgICAgMHhBRDExLCAvLyDqtJEsICMyMzUKKyAgICAweEFENTAsIC8vIOq1kCwgIzEyOAorICAgIDB4QUQ2QywgLy8g6rWsLCAjNTIKKyAgICAweEFENkQsIC8vIOq1rSwgIzg1CisgICAgMHhBRDcwLCAvLyDqtbAsICMyOTMKKyAgICAweEFENzQsIC8vIOq1tCwgIzQ4NworICAgIDB4QUQ4MSwgLy8g6raBLCAjNDQxCisgICAgMHhBRDhDLCAvLyDqtowsICMxOTIKKyAgICAweEFEQzAsIC8vIOq3gCwgIzM4NgorICAgIDB4QUREQywgLy8g6recLCAjMzY3CisgICAgMHhBREY4LCAvLyDqt7gsICMzMAorICAgIDB4QURGOSwgLy8g6re5LCAjNDI0CisgICAgMHhBREZDLCAvLyDqt7wsICMyNDEKKyAgICAweEFFMDAsIC8vIOq4gCwgIzYxCisgICAgMHhBRTA4LCAvLyDquIgsICMxMzgKKyAgICAweEFFMDksIC8vIOq4iSwgIzI2OQorICAgIDB4QUUzMCwgLy8g6riwLCAjMworICAgIDB4QUUzNCwgLy8g6ri0LCAjNDY1CisgICAgMHhBRTM4LCAvLyDquLgsICMyOTcKKyAgICAweEFFNDAsIC8vIOq5gCwgIzIwNQorICAgIDB4QUU0QywgLy8g6rmMLCAjMTcxCisgICAgMHhBRUQ4LCAvLyDqu5gsICMyNzMKKyAgICAweEFGNDMsIC8vIOq9gywgIzQ3NQorICAgIDB4QjA1RCwgLy8g64GdLCAjNTA1CisgICAgMHhCMDdDLCAvLyDrgbwsICM0OTAKKyAgICAweEIwOTgsIC8vIOuCmCwgIzM5CisgICAgMHhCMDlDLCAvLyDrgpwsICMyNzQKKyAgICAweEIwQTAsIC8vIOuCoCwgIzI5MgorICAgIDB4QjBBOCwgLy8g64KoLCAjMTM5CisgICAgMHhCMEI0LCAvLyDrgrQsICM1NgorICAgIDB4QjEwOCwgLy8g64SILCAjMjcyCisgICAgMHhCMTEwLCAvLyDrhJAsICM0NzYKKyAgICAweEIxMTgsIC8vIOuEmCwgIzQ5MgorICAgIDB4QjEyNCwgLy8g64SkLCAjMTAwCisgICAgMHhCMTM3LCAvLyDrhLcsICMzMjkKKyAgICAweEIxNDAsIC8vIOuFgCwgIzI4OAorICAgIDB4QjE0NCwgLy8g64WELCAjMTUxCisgICAgMHhCMTc4LCAvLyDrhbgsICMxNDkKKyAgICAweEIxN0MsIC8vIOuFvCwgIzQ5MQorICAgIDB4QjE4MCwgLy8g64aALCAjNDY0CisgICAgMHhCMThELCAvLyDrho0sICM0NDIKKyAgICAweEIyMDQsIC8vIOuIhCwgIzMxOQorICAgIDB4QjIwOCwgLy8g64iILCAjMzgzCisgICAgMHhCMjc0LCAvLyDribQsICMxNzMKKyAgICAweEIyOTAsIC8vIOuKkCwgIzM2OAorICAgIDB4QjI5NCwgLy8g64qULCAjNQorICAgIDB4QjI5OCwgLy8g64qYLCAjMzIyCisgICAgMHhCMkE1LCAvLyDriqUsICMxOTAKKyAgICAweEIyQzgsIC8vIOuLiCwgIzE2CisgICAgMHhCMkQ4LCAvLyDri5gsICMxNTMKKyAgICAweEIyRTQsIC8vIOuLpCwgIzIKKyAgICAweEIyRTgsIC8vIOuLqCwgIzEzNAorICAgIDB4QjJFQiwgLy8g64urLCAjMTk1CisgICAgMHhCMkVDLCAvLyDri6wsICMyNDMKKyAgICAweEIyRjQsIC8vIOuLtCwgIzI1NAorICAgIDB4QjJGNSwgLy8g64u1LCAjMjg3CisgICAgMHhCMkY5LCAvLyDri7ksICMxNTkKKyAgICAweEIzMDAsIC8vIOuMgCwgIzMzCisgICAgMHhCMzEzLCAvLyDrjJMsICMzMDMKKyAgICAweEIzNTQsIC8vIOuNlCwgIzE0MAorICAgIDB4QjM1OCwgLy8g642YLCAjMjUyCisgICAgMHhCMzY3LCAvLyDrjacsICM0NjMKKyAgICAweEIzNzAsIC8vIOuNsCwgIzEwNAorICAgIDB4QjM3OCwgLy8g6424LCAjNDI5CisgICAgMHhCM0M0LCAvLyDrj4QsICMyNQorICAgIDB4QjNDNSwgLy8g64+FLCAjMzAxCisgICAgMHhCM0NDLCAvLyDrj4wsICMzMDkKKyAgICAweEIzRDksIC8vIOuPmSwgIzU4CisgICAgMHhCNDE4LCAvLyDrkJgsICM4MgorICAgIDB4QjQxQywgLy8g65CcLCAjMTg5CisgICAgMHhCNDIwLCAvLyDrkKAsICM0MDgKKyAgICAweEI0MjksIC8vIOuQqSwgIzMzMgorICAgIDB4QjQ1MCwgLy8g65GQLCAjMTk5CisgICAgMHhCNEE0LCAvLyDrkqQsICM0OTYKKyAgICAweEI0REMsIC8vIOuTnCwgIzQwCisgICAgMHhCNEUwLCAvLyDrk6AsICMyODMKKyAgICAweEI0RTQsIC8vIOuTpCwgIzU0CisgICAgMHhCNEVGLCAvLyDrk68sICM0NzgKKyAgICAweEI0RjEsIC8vIOuTsSwgIzkwCisgICAgMHhCNTE0LCAvLyDrlJQsICMxMzMKKyAgICAweEI1MjksIC8vIOuUqSwgIzQ2MgorICAgIDB4QjUzMCwgLy8g65SwLCAjMzMzCisgICAgMHhCNTRDLCAvLyDrlYwsICMyNDAKKyAgICAweEI2MTAsIC8vIOuYkCwgIzMxMworICAgIDB4Qjc3QywgLy8g6528LCAjNDIKKyAgICAweEI3N0QsIC8vIOudvSwgIzM1NQorICAgIDB4Qjc4MCwgLy8g656ALCAjMjkwCisgICAgMHhCNzhDLCAvLyDrnowsICMyNDYKKyAgICAweEI3OEQsIC8vIOuejSwgIzQyMAorICAgIDB4Qjc5MSwgLy8g656RLCAjMjcwCisgICAgMHhCNzk4LCAvLyDrnpgsICMxNzQKKyAgICAweEI3OTksIC8vIOuemSwgIzM4MQorICAgIDB4Qjc5QywgLy8g656cLCAjMzU3CisgICAgMHhCN0E4LCAvLyDrnqgsICMzNTkKKyAgICAweEI3QTksIC8vIOueqSwgIzQwMgorICAgIDB4QjdDOSwgLy8g65+JLCAjMzQ2CisgICAgMHhCN0VDLCAvLyDrn6wsICMxMzAKKyAgICAweEI3RjAsIC8vIOufsCwgIzMxMgorICAgIDB4QjdGQywgLy8g65+8LCAjMzI3CisgICAgMHhCN0ZELCAvLyDrn70sICM0NDcKKyAgICAweEI4MDcsIC8vIOughywgIzQxMgorICAgIDB4QjgwOCwgLy8g66CILCAjMTE0CisgICAgMHhCODBDLCAvLyDroIwsICMzOTUKKyAgICAweEI4MjQsIC8vIOugpCwgIzE1OAorICAgIDB4QjgyNSwgLy8g66ClLCAjMTk0CisgICAgMHhCODI4LCAvLyDroKgsICMzMjYKKyAgICAweEI4MzksIC8vIOuguSwgIzM4OQorICAgIDB4Qjg1QywgLy8g66GcLCAjNAorICAgIDB4Qjg1RCwgLy8g66GdLCAjODQKKyAgICAweEI4NjAsIC8vIOuhoCwgIzM2NgorICAgIDB4QjhDQywgLy8g66OMLCAjMTU0CisgICAgMHhCOEU4LCAvLyDro6gsICMyMzYKKyAgICAweEI5NTgsIC8vIOulmCwgIzI2NQorICAgIDB4Qjk3NCwgLy8g66W0LCAjMjEyCisgICAgMHhCOTc4LCAvLyDrpbgsICMyNTAKKyAgICAweEI5N0MsIC8vIOulvCwgIzM1CisgICAgMHhCOTg0LCAvLyDrpoQsICMyNzYKKyAgICAweEI5QUMsIC8vIOumrCwgIzE5CisgICAgMHhCOUFELCAvLyDrpq0sICMzOTQKKyAgICAweEI5QjAsIC8vIOumsCwgIzI1OQorICAgIDB4QjlCNCwgLy8g66a0LCAjNDg1CisgICAgMHhCOUJDLCAvLyDrprwsICMzMDUKKyAgICAweEI5QkQsIC8vIOumvSwgIzIxNworICAgIDB4QjlDMSwgLy8g66eBLCAjMzUxCisgICAgMHhCOUM4LCAvLyDrp4gsICM2NworICAgIDB4QjlDOSwgLy8g66eJLCAjMzEwCisgICAgMHhCOUNDLCAvLyDrp4wsICM2NQorICAgIDB4QjlDRSwgLy8g66eOLCAjMjU3CisgICAgMHhCOUQwLCAvLyDrp5AsICMxODgKKyAgICAweEI5REIsIC8vIOunmywgIzM5NworICAgIDB4QjlERCwgLy8g66edLCAjMzcwCisgICAgMHhCOURFLCAvLyDrp54sICMzOTkKKyAgICAweEI5RTQsIC8vIOunpCwgIzEyNQorICAgIDB4QjlFOCwgLy8g66eoLCAjNDIyCisgICAgMHhCQTM4LCAvLyDrqLgsICMzMTEKKyAgICAweEJBMzksIC8vIOuouSwgIzM3NworICAgIDB4QkEzQywgLy8g66i8LCAjNDY5CisgICAgMHhCQTU0LCAvLyDrqZQsICMxNDcKKyAgICAweEJBNzAsIC8vIOupsCwgIzE5MQorICAgIDB4QkE3NCwgLy8g66m0LCAjNzIKKyAgICAweEJBODUsIC8vIOuqhSwgIzEzMQorICAgIDB4QkFBOCwgLy8g66qoLCAjNzMKKyAgICAweEJBQTksIC8vIOuqqSwgIzE1NworICAgIDB4QkFCMCwgLy8g66qwLCAjNDAxCisgICAgMHhCQUI4LCAvLyDrqrgsICM0MzcKKyAgICAweEJBQkIsIC8vIOuquywgIzMzNgorICAgIDB4QkIzNCwgLy8g66y0LCAjODAKKyAgICAweEJCMzgsIC8vIOusuCwgIzU3CisgICAgMHhCQjNDLCAvLyDrrLwsICM5NAorICAgIDB4QkJBNCwgLy8g666kLCAjNDMxCisgICAgMHhCQkY4LCAvLyDrr7gsICM3NgorICAgIDB4QkJGQywgLy8g66+8LCAjMjAwCisgICAgMHhCQzAwLCAvLyDrsIAsICMzMDgKKyAgICAweEJDMEYsIC8vIOuwjywgIzI0OQorICAgIDB4QkMxNCwgLy8g67CULCAjODkKKyAgICAweEJDMTUsIC8vIOuwlSwgIzIyNgorICAgIDB4QkMxOCwgLy8g67CYLCAjMTc1CisgICAgMHhCQzFCLCAvLyDrsJssICMyNDgKKyAgICAweEJDMUMsIC8vIOuwnCwgIzE2NAorICAgIDB4QkMyOSwgLy8g67CpLCAjOTIKKyAgICAweEJDMzAsIC8vIOuwsCwgIzE2MgorICAgIDB4QkMzMSwgLy8g67CxLCAjMjU2CisgICAgMHhCQzg0LCAvLyDrsoQsICMxMTEKKyAgICAweEJDODgsIC8vIOuyiCwgIzE2NworICAgIDB4QkM4QywgLy8g67KMLCAjNDIzCisgICAgMHhCQzk0LCAvLyDrspQsICM0MjcKKyAgICAweEJDOTUsIC8vIOuylSwgIzIwNworICAgIDB4QkNBMCwgLy8g67KgLCAjMjgxCisgICAgMHhCQ0E0LCAvLyDrsqQsICMzNzgKKyAgICAweEJDQTgsIC8vIOuyqCwgIzM4NworICAgIDB4QkNDMCwgLy8g67OALCAjMjUzCisgICAgMHhCQ0M0LCAvLyDrs4QsICMyNjIKKyAgICAweEJDRDEsIC8vIOuzkSwgIzM0MAorICAgIDB4QkNGNCwgLy8g67O0LCAjMjAKKyAgICAweEJDRjUsIC8vIOuztSwgIzIwNAorICAgIDB4QkNGOCwgLy8g67O4LCAjMTgyCisgICAgMHhCQ0ZDLCAvLyDrs7wsICMzODUKKyAgICAweEJEMDksIC8vIOu0iSwgIzQwNQorICAgIDB4QkQ4MCwgLy8g67aALCAjNDYKKyAgICAweEJEODEsIC8vIOu2gSwgIzI2MQorICAgIDB4QkQ4NCwgLy8g67aELCAjMTA1CisgICAgMHhCRDg4LCAvLyDrtogsICMyMjUKKyAgICAweEJERjAsIC8vIOu3sCwgIzM1MAorICAgIDB4QkUwQywgLy8g67iMLCAjMjE0CisgICAgMHhCRTE0LCAvLyDruJQsICM5OQorICAgIDB4QkU0NCwgLy8g67mELCAjNTUKKyAgICAweEJFNEMsIC8vIOu5jCwgIzUxMAorICAgIDB4QkU2MCwgLy8g67mgLCAjMzk4CisgICAgMHhDMEFDLCAvLyDsgqwsICMxNAorICAgIDB4QzBBRCwgLy8g7IKtLCAjMzQyCisgICAgMHhDMEIwLCAvLyDsgrAsICMxMjEKKyAgICAweEMwQjQsIC8vIOyCtCwgIzI3OQorICAgIDB4QzBCQywgLy8g7IK8LCAjMzQ4CisgICAgMHhDMEMxLCAvLyDsg4EsICM0MQorICAgIDB4QzBDOCwgLy8g7IOILCAjMjgyCisgICAgMHhDMEM5LCAvLyDsg4ksICMxODEKKyAgICAweEMwREQsIC8vIOyDnSwgIzEwOQorICAgIDB4QzExQywgLy8g7IScLCAjMjEKKyAgICAweEMxMUQsIC8vIOyEnSwgIzIzNAorICAgIDB4QzEyMCwgLy8g7ISgLCAjMTA3CisgICAgMHhDMTI0LCAvLyDshKQsICMxNzAKKyAgICAweEMxMzEsIC8vIOyEsSwgIzUwCisgICAgMHhDMTM4LCAvLyDshLgsICM2MAorICAgIDB4QzEzOSwgLy8g7IS5LCAjNDU2CisgICAgMHhDMTNDLCAvLyDshLwsICMyNjcKKyAgICAweEMxNTQsIC8vIOyFlCwgIzQ1NQorICAgIDB4QzE1OCwgLy8g7IWYLCAjMjM3CisgICAgMHhDMTVDLCAvLyDshZwsICM0NDgKKyAgICAweEMxNjgsIC8vIOyFqCwgIzQyMQorICAgIDB4QzE4QywgLy8g7IaMLCAjNTEKKyAgICAweEMxOEQsIC8vIOyGjSwgIzIxOQorICAgIDB4QzE5MCwgLy8g7IaQLCAjMzIzCisgICAgMHhDMUExLCAvLyDshqEsICMyMDMKKyAgICAweEMxQzQsIC8vIOyHhCwgIzUwMQorICAgIDB4QzFGQywgLy8g7Ie8LCAjMzY0CisgICAgMHhDMjE4LCAvLyDsiJgsICMyNworICAgIDB4QzIxOSwgLy8g7IiZLCAjNDY3CisgICAgMHhDMjFDLCAvLyDsiJwsICMyNTgKKyAgICAweEMyMjAsIC8vIOyIoCwgIzMwMgorICAgIDB4QzI2QywgLy8g7ImsLCAjNTExCisgICAgMHhDMjg4LCAvLyDsiogsICMzODQKKyAgICAweEMyQTQsIC8vIOyKpCwgIzExCisgICAgMHhDMkFDLCAvLyDsiqwsICM0MzgKKyAgICAweEMyQjQsIC8vIOyKtCwgIzUwNAorICAgIDB4QzJCNSwgLy8g7Iq1LCAjNzcKKyAgICAweEMyQjksIC8vIOyKuSwgIzI5OQorICAgIDB4QzJEQywgLy8g7IucLCAjMTMKKyAgICAweEMyREQsIC8vIOyLnSwgIzEzNworICAgIDB4QzJFMCwgLy8g7IugLCAjNDcKKyAgICAweEMyRTQsIC8vIOyLpCwgIzEzMgorICAgIDB4QzJFQywgLy8g7IusLCAjMTk2CisgICAgMHhDMkVELCAvLyDsi60sICM0ODIKKyAgICAweEMyRjYsIC8vIOyLtiwgIzM1MgorICAgIDB4QzJGOCwgLy8g7Iu4LCAjNDE5CisgICAgMHhDNEYwLCAvLyDsk7AsICMyNzgKKyAgICAweEM1MjgsIC8vIOyUqCwgIzM2MAorICAgIDB4QzU0NCwgLy8g7JWELCAjMjMKKyAgICAweEM1NDUsIC8vIOyVhSwgIzI5NgorICAgIDB4QzU0OCwgLy8g7JWILCAjNzEKKyAgICAweEM1NEEsIC8vIOyViiwgIzIwOQorICAgIDB4QzU0QywgLy8g7JWMLCAjMjIyCisgICAgMHhDNTU0LCAvLyDslZQsICM0NjAKKyAgICAweEM1NTgsIC8vIOyVmCwgIzM0OQorICAgIDB4QzU1OSwgLy8g7JWZLCAjNDczCisgICAgMHhDNTVFLCAvLyDslZ4sICM0MzQKKyAgICAweEM1NjAsIC8vIOyVoCwgIzI3MQorICAgIDB4QzU2MSwgLy8g7JWhLCAjNDE1CisgICAgMHhDNTcxLCAvLyDslbEsICM0NzcKKyAgICAweEM1N0MsIC8vIOyVvCwgIzEyNAorICAgIDB4QzU3RCwgLy8g7JW9LCAjMjI5CisgICAgMHhDNTkxLCAvLyDslpEsICMxNzcKKyAgICAweEM1QjQsIC8vIOyWtCwgIzI0CisgICAgMHhDNUI1LCAvLyDslrUsICM0MDcKKyAgICAweEM1QjgsIC8vIOyWuCwgIzI5NAorICAgIDB4QzVCQywgLy8g7Ja8LCAjMzU2CisgICAgMHhDNUM0LCAvLyDsl4QsICM0MjYKKyAgICAweEM1QzUsIC8vIOyXhSwgIzExOAorICAgIDB4QzVDNiwgLy8g7JeGLCAjMTc4CisgICAgMHhDNUM4LCAvLyDsl4gsICMxNjUKKyAgICAweEM1RDAsIC8vIOyXkCwgIzkKKyAgICAweEM1RDQsIC8vIOyXlCwgIzM3NQorICAgIDB4QzVEOCwgLy8g7JeYLCAjNTA2CisgICAgMHhDNUVDLCAvLyDsl6wsICM2NgorICAgIDB4QzVFRCwgLy8g7JetLCAjMTg2CisgICAgMHhDNUVFLCAvLyDsl64sICM0ODgKKyAgICAweEM1RjAsIC8vIOyXsCwgIzk2CisgICAgMHhDNUY0LCAvLyDsl7QsICMyNjYKKyAgICAweEM1RkMsIC8vIOyXvCwgIzQ0OQorICAgIDB4QzYwMCwgLy8g7JiALCAjMzc0CisgICAgMHhDNjAxLCAvLyDsmIEsICM4MworICAgIDB4QzYwOCwgLy8g7JiILCAjMTY4CisgICAgMHhDNjI0LCAvLyDsmKQsICM3NQorICAgIDB4QzYyOCwgLy8g7JioLCAjMzAwCisgICAgMHhDNjJDLCAvLyDsmKwsICMzMDYKKyAgICAweEM2NDAsIC8vIOyZgCwgIzExOQorICAgIDB4QzY0NCwgLy8g7JmELCAjMzYxCisgICAgMHhDNjU0LCAvLyDsmZQsICM0ODkKKyAgICAweEM2NTUsIC8vIOyZlSwgIzQxOAorICAgIDB4QzY3OCwgLy8g7Jm4LCAjMjE4CisgICAgMHhDNjk0LCAvLyDsmpQsICM0MworICAgIDB4QzY5NSwgLy8g7JqVLCAjNDc5CisgICAgMHhDNkE5LCAvLyDsmqksICM0OAorICAgIDB4QzZCMCwgLy8g7JqwLCAjNjQKKyAgICAweEM2QjEsIC8vIOyasSwgIzUwMworICAgIDB4QzZCNCwgLy8g7Jq0LCAjMTA4CisgICAgMHhDNkI4LCAvLyDsmrgsICMyMjMKKyAgICAweEM2QzAsIC8vIOybgCwgIzMxNworICAgIDB4QzZDMywgLy8g7JuDLCAjNDA0CisgICAgMHhDNkNDLCAvLyDsm4wsICMyODAKKyAgICAweEM2RDAsIC8vIOybkCwgIzQ1CisgICAgMHhDNkQ0LCAvLyDsm5QsICMxNTAKKyAgICAweEM2RTgsIC8vIOybqCwgIzQ0NgorICAgIDB4QzZGOSwgLy8g7Ju5LCAjNTAwCisgICAgMHhDNzA0LCAvLyDsnIQsICM3OAorICAgIDB4QzcyMCwgLy8g7JygLCAjODEKKyAgICAweEM3MjEsIC8vIOycoSwgIzMyMQorICAgIDB4QzcyNCwgLy8g7JykLCAjNDE2CisgICAgMHhDNzNDLCAvLyDsnLwsICM0OQorICAgIDB4Qzc0MCwgLy8g7J2ALCAjMzEKKyAgICAweEM3NDQsIC8vIOydhCwgIzE3CisgICAgMHhDNzRDLCAvLyDsnYwsICMxMTIKKyAgICAweEM3NTEsIC8vIOydkSwgIzQ2MQorICAgIDB4Qzc1OCwgLy8g7J2YLCAjOAorICAgIDB4Qzc3NCwgLy8g7J20LCAjMQorICAgIDB4Qzc3NSwgLy8g7J21LCAjNDAzCisgICAgMHhDNzc4LCAvLyDsnbgsICMxOAorICAgIDB4Qzc3QywgLy8g7J28LCAjMjgKKyAgICAweEM3ODQsIC8vIOyehCwgIzE2MAorICAgIDB4Qzc4NSwgLy8g7J6FLCAjOTMKKyAgICAweEM3ODgsIC8vIOyeiCwgIzQ0CisgICAgMHhDNzkwLCAvLyDsnpAsICMyMgorICAgIDB4Qzc5MSwgLy8g7J6RLCAjODgKKyAgICAweEM3OTgsIC8vIOyemCwgIzM0NworICAgIDB4QzdBMSwgLy8g7J6hLCAjMzcyCisgICAgMHhDN0E1LCAvLyDsnqUsICM1MworICAgIDB4QzdBQywgLy8g7J6sLCAjMTIwCisgICAgMHhDN0MxLCAvLyDsn4EsICM0ODMKKyAgICAweEM4MDAsIC8vIOyggCwgIzk4CisgICAgMHhDODAxLCAvLyDsoIEsICM5NworICAgIDB4QzgwNCwgLy8g7KCELCAjMzQKKyAgICAweEM4MDgsIC8vIOygiCwgIzMyMAorICAgIDB4QzgxMCwgLy8g7KCQLCAjMjAxCisgICAgMHhDODExLCAvLyDsoJEsICMzMzEKKyAgICAweEM4MTUsIC8vIOyglSwgIzI2CisgICAgMHhDODFDLCAvLyDsoJwsICMyOQorICAgIDB4QzgzOCwgLy8g7KC4LCAjNDE0CisgICAgMHhDODcwLCAvLyDsobAsICM4NgorICAgIDB4Qzg3MSwgLy8g7KGxLCAjMzczCisgICAgMHhDODc0LCAvLyDsobQsICM0MzIKKyAgICAweEM4ODAsIC8vIOyigCwgIzQ3MAorICAgIDB4Qzg4NSwgLy8g7KKFLCAjMjA4CisgICAgMHhDODhCLCAvLyDsoossICMyMzkKKyAgICAweEM4RTAsIC8vIOyjoCwgIzQ1MQorICAgIDB4QzhGQywgLy8g7KO8LCAjMzgKKyAgICAweEM4RkQsIC8vIOyjvSwgIzQ3MQorICAgIDB4QzkwMCwgLy8g7KSALCAjMjg2CisgICAgMHhDOTA0LCAvLyDspIQsICMzOTIKKyAgICAweEM5MTEsIC8vIOykkSwgIzEwMworICAgIDB4Qzk4OCwgLy8g7KaILCAjMjU1CisgICAgMHhDOThDLCAvLyDspowsICM1MDcKKyAgICAweEM5OTAsIC8vIOymkCwgIzM3MQorICAgIDB4Qzk5RCwgLy8g7KadLCAjMjYwCisgICAgMHhDOUMwLCAvLyDsp4AsICMxMAorICAgIDB4QzlDMSwgLy8g7KeBLCAjMjE2CisgICAgMHhDOUM0LCAvLyDsp4QsICM3OQorICAgIDB4QzlDOCwgLy8g7KeILCAjMjM4CisgICAgMHhDOUQxLCAvLyDsp5EsICMyMDYKKyAgICAweEM5REMsIC8vIOynnCwgIzQxMQorICAgIDB4QzlGOCwgLy8g7Ke4LCAjNDk0CisgICAgMHhDQUJELCAvLyDsqr0sICM0MzUKKyAgICAweENDMjgsIC8vIOywqCwgIzE0NgorICAgIDB4Q0MyOSwgLy8g7LCpLCAjNDQzCisgICAgMHhDQzJDLCAvLyDssKwsICM0ODEKKyAgICAweENDMzAsIC8vIOywsCwgIzQ0MAorICAgIDB4Q0MzOCwgLy8g7LC4LCAjMzQzCisgICAgMHhDQzNELCAvLyDssL0sICMzMDQKKyAgICAweENDM0UsIC8vIOywviwgIzMzNQorICAgIDB4Q0M0NCwgLy8g7LGELCAjMjg0CisgICAgMHhDQzQ1LCAvLyDssYUsICMyOTgKKyAgICAweENDOTgsIC8vIOyymCwgIzI0MgorICAgIDB4Q0M5QywgLy8g7LKcLCAjMTQzCisgICAgMHhDQ0EwLCAvLyDssqAsICMzODAKKyAgICAweENDQTgsIC8vIOyyqCwgIzQ1MgorICAgIDB4Q0NBQiwgLy8g7LKrLCAjNDg0CisgICAgMHhDQ0FELCAvLyDssq0sICMxOTcKKyAgICAweENDQjQsIC8vIOyytCwgIzEyNgorICAgIDB4Q0NEMCwgLy8g7LOQLCAjNDcyCisgICAgMHhDRDA4LCAvLyDstIgsICMyMjAKKyAgICAweENEMUQsIC8vIOy0nSwgIzQwNgorICAgIDB4Q0Q1QywgLy8g7LWcLCAjMTc5CisgICAgMHhDRDk0LCAvLyDstpQsICMxMzYKKyAgICAweENEOTUsIC8vIOy2lSwgIzMzNworICAgIDB4Q0Q5QywgLy8g7LacLCAjMTY2CisgICAgMHhDREE5LCAvLyDstqksICMzNjkKKyAgICAweENERTgsIC8vIOy3qCwgIzIxMAorICAgIDB4Q0UyMCwgLy8g7LigLCAjMjE1CisgICAgMHhDRTIxLCAvLyDsuKEsICM0NjgKKyAgICAweENFMzUsIC8vIOy4tSwgIzUxMgorICAgIDB4Q0U1OCwgLy8g7LmYLCAjMTAyCisgICAgMHhDRTVDLCAvLyDsuZwsICMzMjUKKyAgICAweENFNjgsIC8vIOy5qCwgIzI2MworICAgIDB4Q0U3NCwgLy8g7Lm0LCAjMTE1CisgICAgMHhDRTdDLCAvLyDsubwsICM0NjYKKyAgICAweENFOTAsIC8vIOy6kCwgIzQ1NAorICAgIDB4Q0VFNCwgLy8g7LukLCAjMjg1CisgICAgMHhDRUU4LCAvLyDsu6gsICMzMjgKKyAgICAweENFRjQsIC8vIOy7tCwgIzQxNworICAgIDB4Q0YwMCwgLy8g7LyALCAjMzM5CisgICAgMHhDRjEzLCAvLyDsvJMsICM1MDkKKyAgICAweENGMUMsIC8vIOy8nCwgIzUwOAorICAgIDB4Q0Y1NCwgLy8g7L2ULCAjMTkzCisgICAgMHhDRjU4LCAvLyDsvZgsICMzOTEKKyAgICAweENGRTAsIC8vIOy/oCwgIzM5MworICAgIDB4RDAzNSwgLy8g7YC1LCAjNDUzCisgICAgMHhEMDZDLCAvLyDtgawsICMxMDEKKyAgICAweEQwNzAsIC8vIO2BsCwgIzQ5NQorICAgIDB4RDA3NCwgLy8g7YG0LCAjMjg5CisgICAgMHhEMEE0LCAvLyDtgqQsICMyMzAKKyAgICAweEQwQzAsIC8vIO2DgCwgIzEyNworICAgIDB4RDBDMSwgLy8g7YOBLCAjMzE0CisgICAgMHhEMEM0LCAvLyDtg4QsICM0NTAKKyAgICAweEQwQzgsIC8vIO2DiCwgIzQzNgorICAgIDB4RDBEQywgLy8g7YOcLCAjMjIxCisgICAgMHhEMERELCAvLyDtg50sICMyNzUKKyAgICAweEQxMzAsIC8vIO2EsCwgIzcwCisgICAgMHhEMTRDLCAvLyDthYwsICMyMTMKKyAgICAweEQxNTAsIC8vIO2FkCwgIzMyNAorICAgIDB4RDE1NCwgLy8g7YWULCAjNDMwCisgICAgMHhEMTVDLCAvLyDthZwsICMzODIKKyAgICAweEQxQTAsIC8vIO2GoCwgIzE0NQorICAgIDB4RDFCNSwgLy8g7Ya1LCAjMTU2CisgICAgMHhEMjJDLCAvLyDtiKwsICMyMjcKKyAgICAweEQyQjgsIC8vIO2KuCwgIzM3CisgICAgMHhEMkI5LCAvLyDtirksICMyNDcKKyAgICAweEQyRjAsIC8vIO2LsCwgIzE4NworICAgIDB4RDMwNSwgLy8g7YyFLCAjNDEwCisgICAgMHhEMzBDLCAvLyDtjIwsICMxNDEKKyAgICAweEQzMTAsIC8vIO2MkCwgIzE2MworICAgIDB4RDMxNCwgLy8g7YyULCAjNDk5CisgICAgMHhEMzI4LCAvLyDtjKgsICMzMDcKKyAgICAweEQzMkMsIC8vIO2MrCwgIzQ1OQorICAgIDB4RDMzOCwgLy8g7Yy4LCAjNDMzCisgICAgMHhEMzdDLCAvLyDtjbwsICMzNDQKKyAgICAweEQzOTgsIC8vIO2OmCwgIzE3MgorICAgIDB4RDNCOCwgLy8g7Y64LCAjMjUxCisgICAgMHhEM0M5LCAvLyDtj4ksICMyOTEKKyAgICAweEQzRUMsIC8vIO2PrCwgIzY4CisgICAgMHhEM0VELCAvLyDtj60sICM0NDUKKyAgICAweEQzRjAsIC8vIO2PsCwgIzMxOAorICAgIDB4RDQ1QywgLy8g7ZGcLCAjMjMyCisgICAgMHhENDgwLCAvLyDtkoAsICM0OTcKKyAgICAweEQ0ODgsIC8vIO2SiCwgIzExMworICAgIDB4RDQ4RCwgLy8g7ZKNLCAjNDI1CisgICAgMHhENTA0LCAvLyDtlIQsICMxMTAKKyAgICAweEQ1MDgsIC8vIO2UiCwgIzQ5OAorICAgIDB4RDUwQywgLy8g7ZSMLCAjMjExCisgICAgMHhENTNDLCAvLyDtlLwsICMxNjkKKyAgICAweEQ1NDQsIC8vIO2VhCwgIzI5NQorICAgIDB4RDU1MSwgLy8g7ZWRLCAjMzc2CisgICAgMHhENTU4LCAvLyDtlZgsICM3CisgICAgMHhENTU5LCAvLyDtlZksICMxMjkKKyAgICAweEQ1NUMsIC8vIO2VnCwgIzE1CisgICAgMHhENTYwLCAvLyDtlaAsICMxNDQKKyAgICAweEQ1NjgsIC8vIO2VqCwgIzE1MgorICAgIDB4RDU2OSwgLy8g7ZWpLCAjMTIzCisgICAgMHhENTZELCAvLyDtla0sICMyNjgKKyAgICAweEQ1NzQsIC8vIO2VtCwgIzMyCisgICAgMHhENTg4LCAvLyDtlogsICMxODAKKyAgICAweEQ1ODksIC8vIO2WiSwgIzEzNQorICAgIDB4RDVBNSwgLy8g7ZalLCAjMzQ1CisgICAgMHhENUM4LCAvLyDtl4gsICMzOTYKKyAgICAweEQ1RDgsIC8vIO2XmCwgIzMxNgorICAgIDB4RDVFNCwgLy8g7ZekLCAjNDc0CisgICAgMHhENjA0LCAvLyDtmIQsICMxODUKKyAgICAweEQ2MTEsIC8vIO2YkSwgIzMxNQorICAgIDB4RDYxNSwgLy8g7ZiVLCAjMjQ0CisgICAgMHhENjFDLCAvLyDtmJwsICM0MjgKKyAgICAweEQ2MzgsIC8vIO2YuCwgIzExNworICAgIDB4RDYzQywgLy8g7Zi8LCAjMzU4CisgICAgMHhENjQ4LCAvLyDtmYgsICMzMzAKKyAgICAweEQ2NEQsIC8vIO2ZjSwgIzM2MworICAgIDB4RDY1NCwgLy8g7ZmULCAjNjMKKyAgICAweEQ2NTUsIC8vIO2ZlSwgIzE4MworICAgIDB4RDY1OCwgLy8g7ZmYLCAjMjI0CisgICAgMHhENjVDLCAvLyDtmZwsICMyNzcKKyAgICAweEQ2NjksIC8vIO2ZqSwgIzM1MworICAgIDB4RDY4QywgLy8g7ZqMLCAjNzQKKyAgICAweEQ2OEQsIC8vIO2ajSwgIzQ1OAorICAgIDB4RDY5RiwgLy8g7ZqfLCAjNDA5CisgICAgMHhENkE4LCAvLyDtmqgsICM0MDAKKyAgICAweEQ2QzQsIC8vIO2bhCwgIzE3NgorICAgIDB4RDZDOCwgLy8g7ZuILCAjNDg2CisgICAgMHhENzM0LCAvLyDtnLQsICMzNjUKKyAgICAweEQ3NTQsIC8vIO2dlCwgIzQ4MAorICAgIDB4RDc2QywgLy8g7Z2sLCAjMzM0CisgICAgMHhENzg4LCAvLyDtnogsICMyMjgKKyAgICAweEQ3OTgsIC8vIO2emCwgIzUwMgorfTsKKy8vIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzYW1wbGUgY292ZXJlZCBieSB0aGUgYWJvdmUgY2hhcmFjdGVycworc3RhdGljIGNvbnN0IGZsb2F0IGZyZXF1ZW50X2tvX2NvdmVyYWdlPTAuOTQ4MTU3MDIxNDY0MTg0OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDk4ZDNkZWUuLmFjMmQxYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgUkVTVE9SRV9PVVRQVVQsCiAgICAgT1BFTl9JTlBVVCwKICAgICBDTE9TRV9JTlBVVCwKLSAgICBTRVRfU1RSRUFNX09VVFBVVCwKKyAgICBJTlZBTElEQVRFX1NUUkVBTSwKICAgICBTRVRfVk9JQ0VfVk9MVU1FLAogICAgIEdFVF9SRU5ERVJfUE9TSVRJT04sCiAgICAgR0VUX0lOUFVUX0ZSQU1FU19MT1NULApAQCAtNzQsOCArNzQsMTcgQEAKICAgICBHRVRfUFJJTUFSWV9PVVRQVVRfU0FNUExJTkdfUkFURSwKICAgICBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQsCiAgICAgU0VUX0xPV19SQU1fREVWSUNFLAorICAgIExJU1RfQVVESU9fUE9SVFMsCisgICAgR0VUX0FVRElPX1BPUlQsCisgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgTElTVF9BVURJT19QQVRDSEVTLAorICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRywKKyAgICBHRVRfQVVESU9fSFdfU1lOQwogfTsKIAorI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCiBjbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgogewogcHVibGljOgpAQCAtODksMTMgKzk4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKQEAgLTEwNiw5ICsxMTQsMTEgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZyYW1lQ291bnQpOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHBGcmFtZUNvdW50ICE9IE5VTEwgPyAqcEZyYW1lQ291bnQgOiAwOworICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgIHRyYWNrX2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6ICh0cmFja19mbGFnc190KSBUUkFDS19ERUZBVUxUOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobEZsYWdzKTsKKyAgICAgICAgLy8gaGF2ZVNoYXJlZEJ1ZmZlcgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMih0cnVlKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2hhcmVkQnVmZmVyLT5hc0JpbmRlcigpKTsKQEAgLTExNyw3ICsxMjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB0aWQpOwotICAgICAgICBpbnQgbFNlc3Npb25JZCA9IDA7CisgICAgICAgIGludCBsU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfQpAQCAtMTI3LDYgKzEzNywxMCBAQAogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7CisgICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsRmxhZ3MgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChmbGFncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmZsYWdzID0gbEZsYWdzOwpAQCAtMTM1LDExICsxNDksMjEgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFtZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICB0cmFjayA9IGludGVyZmFjZV9jYXN0PElBdWRpb1RyYWNrPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvVHJhY2siKTsKKyAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgYW4gSUF1ZGlvVHJhY2sgYnV0IHdpdGggc3RhdHVzICVkIiwgbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJhY2s7CkBAIC0xNTAsMTAgKzE3NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xNjMsMTkgKzE5MCwyNyBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgdHJhY2tfZmxhZ3NfdCBsRmxhZ3MgPSBmbGFncyAhPSBOVUxMID8gKmZsYWdzIDogKHRyYWNrX2ZsYWdzX3QpIFRSQUNLX0RFRkFVTFQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHRpZCk7Ci0gICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKICAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihsU2Vzc2lvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lcyAhPSBOVUxMID8gKm5vdGlmaWNhdGlvbkZyYW1lcyA6IDApOworICAgICAgICBjYmxrLmNsZWFyKCk7CisgICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKICAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7CisgICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsRmxhZ3MgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChmbGFncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmZsYWdzID0gbEZsYWdzOwpAQCAtMTg0LDIxICsyMTksNDIgQEAKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IGxOb3RpZmljYXRpb25GcmFtZXMgPSAoc2l6ZV90KSByZXBseS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBsTm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVjb3JkID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwICYmIGJ1ZmZlcnMtPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkIik7CiAgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHNob3VsZCBoYXZlIHJldHVybmVkIGEgY2JsayIpOworICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGlzIHBlcm1pdHRlZCB0byBiZSAwCiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCByZXR1cm5lZCBhbiBJQXVkaW9SZWNvcmQgYnV0IHdpdGggc3RhdHVzICVkIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCB8fCBjYmxrICE9IDAgfHwgYnVmZmVycyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCwgY2JsaywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYnVmZmVycyBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKICAgICAgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZWNvcmQ7CkBAIC0yMjgsNyArMjg0LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZSQU1FX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdApAQCAtMzc4LDUzICs0MzQsNDMgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRCVUZGRVJTSVpFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2VzID09IE5VTEwgfHwgbGF0ZW5jeU1zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gcExhdGVuY3lNcyAhPSBOVUxMID8gKnBMYXRlbmN5TXMgOiAwOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZHVsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobGF0ZW5jeSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2VzKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgZmxhZ3MpOwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZShvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICBsYXRlbmN5ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwTGF0ZW5jeU1zICE9IE5VTEwpICpwTGF0ZW5jeU1zID0gbGF0ZW5jeTsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsICpvdXRwdXQpOworICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICpkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKmxhdGVuY3lNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC00NjUsMzYgKzUxMSw0MCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQogICAgIHsKKyAgICAgICAgaWYgKGlucHV0ID09IE5VTEwgfHwgY29uZmlnID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IHBEZXZpY2VzICE9IE5VTEwgPyAqcERldmljZXMgOiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IHBTYW1wbGluZ1JhdGUgIT0gTlVMTCA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcEZvcm1hdCAhPSBOVUxMID8gKnBGb3JtYXQgOiBBVURJT19GT1JNQVRfREVGQVVMVDsKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBwQ2hhbm5lbE1hc2sgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgKnBDaGFubmVsTWFzayA6IChhdWRpb19jaGFubmVsX21hc2tfdCkwOwotCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZXMpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocERldmljZXMgIT0gTlVMTCkgKnBEZXZpY2VzID0gZGV2aWNlczsKLSAgICAgICAgc2FtcGxpbmdSYXRlID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwU2FtcGxpbmdSYXRlICE9IE5VTEwpICpwU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSAqcEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgKnBDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqZGV2aWNlKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWRkcmVzcyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzb3VyY2UpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICppbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChpbnQgaW5wdXQpCkBAIC01MDYsMTMgKzU1NiwxMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1PdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TVFJFQU1fT1VUUFVULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU5WQUxJREFURV9TVFJFQU0sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTUyNSw3ICs1NzQsNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNTM1LDUxICs1ODQsNTYgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHVpbnQzMl90IHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGhhbEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGhhbEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmhhbEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGRzcEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGRzcEZyYW1lcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IHRtcDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc2l6ZV90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRlJBTUVTX0xPU1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodWludDMyX3QpIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkKKyAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE5FV19BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpbnQgaWQgPSAwOworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEU7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlkID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIGludCBwaWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY1Nyw3ICs3MTEsNyBAQAogCiAgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwotICAgICAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjc1LDcgKzcyOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKmlkID0gdG1wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC02ODUsNyArNzM5LDcgQEAKICAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICAgICAgfQogCkBAIC03MjYsNyArNzgwLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKQEAgLTczNyw3ICs3OTEsMTEyIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTE9XX1JBTV9ERVZJQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICpudW1fcG9ydHMgPT0gMCB8fCBwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BvcnRzKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUE9SVFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChwb3J0cywgKm51bV9wb3J0cyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKKyAgICB7CisgICAgICAgIGlmIChwb3J0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BVURJT19QT1JULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKm51bV9wYXRjaGVzID09IDAgfHwgcGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BhdGNoZXMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QQVRDSEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCAqbnVtX3BhdGNoZXMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX0hXX1NZTkMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhdWRpb19od19zeW5jX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwpAQCAtNzU0LDcgKzkxMyw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgZmxhZ3MgPSAodHJhY2tfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGJvb2wgaGF2ZVNoYXJlZEJ1ZmZlciA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcjsKQEAgLTc2NSw3ICs5MjQsNiBAQAogICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzggbmFtZTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrOwogICAgICAgICAgICAgaWYgKChoYXZlU2hhcmVkQnVmZmVyICYmIChidWZmZXIgPT0gMCkpIHx8CkBAIC03NzUsMTIgKzkzMywxMyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0cmFjayA9IGNyZWF0ZVRyYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAmZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmc2Vzc2lvbklkLCBuYW1lLCBjbGllbnRVaWQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAmc2Vzc2lvbklkLCBjbGllbnRVaWQsICZzdGF0dXMpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHRyYWNrICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgobmFtZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHRyYWNrLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTc5MSwxOCArOTUwLDI3IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgZmxhZ3MgPSAodHJhY2tfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHRpZCA9IChwaWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBvcGVuUmVjb3JkKGlucHV0LAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgY2JsaywgYnVmZmVycywgJnN0YXR1cyk7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChyZWNvcmQgIT0gMCkgIT0gKHN0YXR1cyA9PSBOT19FUlJPUikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocmVjb3JkLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYmxrLT5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXJzLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTQU1QTEVfUkFURTogewpAQCAtODE3LDcgKzk4NSw3IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRlJBTUVfQ09VTlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggZnJhbWVDb3VudCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCggZnJhbWVDb3VudCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTEFURU5DWTogewpAQCAtOTE2LDM4ICsxMDg0LDMxIEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBPUEVOX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJvb2wgaGFzT2ZmbG9hZEluZm8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgIGlmIChoYXNPZmZsb2FkSW5mbykgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmb2ZmbG9hZEluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG9wZW5PdXRwdXQobW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKLSAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVwIiwgb3V0cHV0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3kpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3Blbk91dHB1dChtb2R1bGUsICZvdXRwdXQsICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VzLCBhZGRyZXNzLCAmbGF0ZW5jeU1zLCBmbGFncyk7CisgICAgICAgICAgICBBTE9HVigiT1BFTl9PVVRQVVQgb3V0cHV0LCAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW91dHB1dCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3lNcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgT1BFTl9EVVBMSUNBVEVfT1VUUFVUOiB7CkBAIC05NzUsMjEgKzExMzYsMjQgQEAKICAgICAgICAgY2FzZSBPUEVOX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IChhdWRpb19pb19oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IG9wZW5JbnB1dChtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBpbnB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2hhbm5lbE1hc2spOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlbklucHV0KG1vZHVsZSwgJmlucHV0LCAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDTE9TRV9JTlBVVDogewpAQCAtOTk3LDExICsxMTYxLDEwIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjbG9zZUlucHV0KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fT1VUUFVUOiB7CisgICAgICAgIGNhc2UgSU5WQUxJREFURV9TVFJFQU06IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0U3RyZWFtT3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIG91dHB1dCkpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGludmFsaWRhdGVTdHJlYW0oc3RyZWFtKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewpAQCAtMTAxMyw4ICsxMTc2LDggQEAKICAgICAgICAgY2FzZSBHRVRfUkVOREVSX1BPU0lUSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGhhbEZyYW1lcyA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHNwRnJhbWVzID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lcyA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UmVuZGVyUG9zaXRpb24oJmhhbEZyYW1lcywgJmRzcEZyYW1lcywgb3V0cHV0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0xMDI2LDI0ICsxMTg5LDI2IEBACiAgICAgICAgIGNhc2UgR0VUX0lOUFVUX0ZSQU1FU19MT1NUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBnZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBORVdfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG5ld0F1ZGlvU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobmV3QXVkaW9VbmlxdWVJZCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgaW50IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUVVFUllfTlVNX0VGRkVDVFM6IHsKQEAgLTExMjEsNyArMTI4Niw3IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX1BSSU1BUllfT1VUUFVUX0ZSQU1FX0NPVU5UOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6IHsKQEAgLTExMzAsNiArMTI5NSwxMDkgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMoJm51bVBvcnRzLCBwb3J0cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBkYXRhLnJlYWQoJnBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1QYXRjaGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzID0gbnVtUGF0Y2hlc1JlcTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcGF0Y2ggKiljYWxsb2MobnVtUGF0Y2hlc1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBpZiAocGF0Y2hlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1QYXRjaGVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IG51bVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtUGF0Y2hlc1JlcSA9IG51bVBhdGNoZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShwYXRjaGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnOworICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FVRElPX0hXX1NZTkM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKaW5kZXggM2MwZDRjZi4uMWMyOTlmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5zYW1wbGluZ1JhdGUpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmZvcm1hdCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Y2hhbm5lbE1hc2spOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmZyYW1lQ291bnQpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDY0KGRlc2MtPmZyYW1lQ291bnQpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmxhdGVuY3kpOwogICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJT19DT05GSUdfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIGRlc2MuZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgICAgIGRlc2MuY2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgICAgIGRlc2MubGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICAgICAgcGFyYW0yID0gJmRlc2M7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDBkYWI3ZTMuLmU4NDA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC01OCw5ICs1OCwyMiBAQAogICAgIFFVRVJZX0RFRkFVTFRfUFJFX1BST0NFU1NJTkcsCiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCi0gICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQKKyAgICBJU19PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICBMSVNUX0FVRElPX1BPUlRTLAorICAgIEdFVF9BVURJT19QT1JULAorICAgIENSRUFURV9BVURJT19QQVRDSCwKKyAgICBSRUxFQVNFX0FVRElPX1BBVENILAorICAgIExJU1RfQVVESU9fUEFUQ0hFUywKKyAgICBTRVRfQVVESU9fUE9SVF9DT05GSUcsCisgICAgUkVHSVNURVJfQ0xJRU5ULAorICAgIEdFVF9PVVRQVVRfRk9SX0FUVFIsCisgICAgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwKKyAgICBSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLAorICAgIEdFVF9QSE9ORV9TVEFURQogfTsKIAorI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgogewogcHVibGljOgpAQCAtMTM4LDYgKzE1MSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOworICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwogICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQ4LDYgKzE2MiwzNiBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJXcml0aW5nIE5VTEwgYXVkaW8gYXR0cmlidXRlcyAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGF1ZGlvX2lvX2hhbmRsZV90KSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZShhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlKG9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1VUUFVUX0ZPUl9BVFRSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQpAQCAtMTg3LDcgKzIzMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0xOTYsMzMgKzI0MSw0MCBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihmb3JtYXQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMzkwLDcgKzQ0MiwxODYgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUoJmluZm8sIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfT0ZGTE9BRF9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gKHBvcnRzID09IE5VTEwpID8gMCA6ICpudW1fcG9ydHM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyb2xlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHR5cGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUG9ydHNSZXEpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QT1JUUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bV9wb3J0cyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gKm51bV9wb3J0cykgeworICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gKm51bV9wb3J0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQorICAgIHsKKyAgICAgICAgaWYgKHBvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX1BPUlQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKKyAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXBseS5yZWFkKHBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIGlmIChwYXRjaCA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUocGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgZGF0YS53cml0ZShoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0FVRElPX1BBVENILCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKKyAgICB7CisgICAgICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1QYXRjaGVzUmVxID0gKHBhdGNoZXMgPT0gTlVMTCkgPyAwIDogKm51bV9wYXRjaGVzOworICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtUGF0Y2hlc1JlcSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BBVENIRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgICpudW1fcGF0Y2hlcyA9ICh1bnNpZ25lZCBpbnQpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAqbnVtX3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBudW1QYXRjaGVzUmVxID0gKm51bV9wYXRjaGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCBudW1QYXRjaGVzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmdlbmVyYXRpb24gPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCB8fCBpb0hhbmRsZSA9PSBOVUxMIHx8IGRldmljZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKmRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QSE9ORV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGF1ZGlvX21vZGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC00NzQsMTMgKzcwNSwzOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGRhdGEucmVhZChhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvOworICAgICAgICAgICAgaWYgKGhhc09mZmxvYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXRGb3JBdHRyKGF0dHIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGhhc09mZmxvYWRJbmZvID8gJm9mZmxvYWRJbmZvIDogTlVMTCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBjYXNlIFNUQVJUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXJ0T3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00ODgsMTAgKzc0NCwxMSBAQAogICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNTEwLDExICs3NjcsMTMgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBnZXRJbnB1dChpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KGlucHV0KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC01MjIsMjEgKzc4MSwyNCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0KSkpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUT1BfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCkpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3Nlc3Npb25fdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChpbnB1dCwgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTYzNCw3ICs4OTYsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIGluUGFzdE1zKSApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTY0Miw3ICs5MDQsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSwgaW5QYXN0TXMpICk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC02ODcsNiArOTQ5LDE1NyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSA9IChhdWRpb19wb3J0X3R5cGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzID0gbnVtUG9ydHNSZXE7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BvcnQgKiljYWxsb2MobnVtUG9ydHNSZXEsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOworICAgICAgICAgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBvcnRzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IG51bVBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gbnVtUG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShwb3J0cywgbnVtUG9ydHNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MTIyMDIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmcG9ydCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmcGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTEyMjAyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlcyA9IG51bVBhdGNoZXNSZXE7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BhdGNoICopY2FsbG9jKG51bVBhdGNoZXNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICAgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzLCAmZ2VuZXJhdGlvbik7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUGF0Y2hlcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBudW1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBudW1QYXRjaGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocGF0Y2hlcywgbnVtUGF0Y2hlc1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocGF0Y2hlcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVHSVNURVJfQ0xJRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0ge307CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHt9OworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9QSE9ORV9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWdldFBob25lU3RhdGUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODAyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgUEFUQ0hfTElTVF9VUERBVEUKK307CisKK2NsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBPUlRfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUEFUQ0hfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgUE9SVF9MSVNUX1VQREFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgUEFUQ0hfTElTVF9VUERBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCmluZGV4IDRhN2RlNjUuLjhhNGEzODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcApAQCAtMjksNyArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKLSAgICBHRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgVU5VU0VEX1dBU19HRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgU1RBUlQsCiAgICAgU1RPUAogfTsKQEAgLTQyLDE4ICs0Miw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0Q2JsaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElNZW1vcnk+IGNibGs7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9SZWNvcmQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNibGs7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsIGludCB0cmlnZ2VyU2Vzc2lvbikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTg2LDExICs3NCw2IEBACiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfQ0JMSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1JlY29yZCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU1RBUlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9SZWNvcmQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCA9IGRhdGEucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggM2NkOWNmZC4uMjY1YmIxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcApAQCAtNjAsNiArNjAsOSBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKICAgICB9CkBAIC0xMTUsMTMgKzExOCwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVUaW1lZEJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8SU1lbW9yeT4qIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ0FURV9USU1FRF9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAqYnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlciAhPSAwICYmICgqYnVmZmVyKS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMzIsNyArMjM4LDcgQEAKICAgICAgICAgY2FzZSBBTExPQ0FURV9USU1FRF9CVUZGRVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWxsb2NhdGVUaW1lZEJ1ZmZlcihkYXRhLnJlYWRJbnQzMigpLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFsbG9jYXRlVGltZWRCdWZmZXIoZGF0YS5yZWFkSW50NjQoKSwgJmJ1ZmZlcik7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihidWZmZXItPmFzQmluZGVyKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAppbmRleCA5MThkNzI1Li4xODMyNWM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQ3J5cHRvLmNwcApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgIGRhdGEud3JpdGUoc3ViU2FtcGxlcywgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXMpOwogCiAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWRzdFB0cik7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihkc3RQdHIpKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVDUllQVCwgZGF0YSwgJnJlcGx5KTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAgICAgICAgICAgICB2b2lkICpzZWN1cmVCdWZmZXJJZCwgKmRzdFB0cjsKICAgICAgICAgICAgIGlmIChzZWN1cmUpIHsKLSAgICAgICAgICAgICAgICBzZWN1cmVCdWZmZXJJZCA9ICh2b2lkICopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICAgICAgc2VjdXJlQnVmZmVySWQgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihkYXRhLnJlYWRJbnQ2NCgpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGRzdFB0ciA9IG1hbGxvYyh0b3RhbFNpemUpOwogICAgICAgICAgICAgICAgIG1lbXNldChkc3RQdHIsIDAsIHRvdGFsU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCmluZGV4IGYxYTZhOWYuLjE5MDQ4MzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwCkBAIC01Myw3ICs1Myw4IEBACiAgICAgU0lHTiwKICAgICBTSUdOX1JTQSwKICAgICBWRVJJRlksCi0gICAgU0VUX0xJU1RFTkVSCisgICAgU0VUX0xJU1RFTkVSLAorICAgIFVOUFJPVklTSU9OX0RFVklDRQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTIyOSw2ICsyMzAsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5wcm92aXNpb25EZXZpY2UoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUFJPVklTSU9OX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNjE5LDYgKzYyOSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBVTlBST1ZJU0lPTl9ERVZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB1bnByb3Zpc2lvbkRldmljZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1NFQ1VSRV9TVE9QUzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKaW5kZXggMWU1NGNhOC4uOGNkMTU4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKQEAgLTExOSw2ICsxMTksOSBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNibGsgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCAmJiBjYmxrLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2JsazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBDUkVBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIENPVU5UX0NPREVDUywKKyAgICBHRVRfQ09ERUNfSU5GTywKKyAgICBGSU5EX0NPREVDX0JZX1RZUEUsCisgICAgRklORF9DT0RFQ19CWV9OQU1FLAorfTsKKworY2xhc3MgQnBNZWRpYUNvZGVjTGlzdDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4KK3sKK3B1YmxpYzoKKyAgICBCcE1lZGlhQ29kZWNMaXN0KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElNZWRpYUNvZGVjTGlzdD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgY291bnRDb2RlY3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhQ29kZWNMaXN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09VTlRfQ09ERUNTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxNZWRpYUNvZGVjSW5mbz4gZ2V0Q29kZWNJbmZvKHNpemVfdCBpbmRleCkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT0RFQ19JTkZPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcodHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmNvZGVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXJ0SW5kZXgpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRklORF9DT0RFQ19CWV9UWVBFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjTGlzdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5EX0NPREVDX0JZX05BTUUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhQ29kZWNMaXN0LCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFDb2RlY0xpc3QiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbk1lZGlhQ29kZWNMaXN0OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgQ09VTlRfQ09ERUNTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBjb3VudENvZGVjcygpOworICAgICAgICAgICAgaWYgKGNvdW50ID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfQ09ERUNfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjTGlzdCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gZ2V0Q29kZWNJbmZvKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihPSyk7CisgICAgICAgICAgICAgICAgaW5mby0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKC1FUkFOR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBzdGFydEluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBmaW5kQ29kZWNCeVR5cGUodHlwZSwgaXNFbmNvZGVyLCBzdGFydEluZGV4KTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9OQU1FOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmRDb2RlY0J5TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IElOVDMyX01BWCB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAppbmRleCA0YWMwYmU0Li4xMDYyMDVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcApAQCAtNzUsNyArNzUsNyBAQAogfQogCiB2b2lkCi1JTWVkaWFEZWF0aE5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKK0lNZWRpYURlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIEFMT0dXKCJtZWRpYSBzZXJ2ZXIgZGllZCIpOwogCiAgICAgLy8gTmVlZCB0byBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaGVsZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTM3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklNZWRpYUhUVFBDb25uZWN0aW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgRElTQ09OTkVDVCwKKyAgICBSRUFEX0FULAorICAgIEdFVF9TSVpFLAorICAgIEdFVF9NSU1FX1RZUEUsCisgICAgR0VUX1VSSQorfTsKKworc3RydWN0IEJwTWVkaWFIVFRQQ29ubmVjdGlvbiA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFIVFRQQ29ubmVjdGlvbj4geworICAgIEJwTWVkaWFIVFRQQ29ubmVjdGlvbihjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQQ29ubmVjdGlvbj4oaW1wbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKKyAgICAgICAgICAgICAgICBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBTdHJpbmcxNiB0bXAodXJpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KHRtcCk7CisKKyAgICAgICAgdG1wID0gU3RyaW5nMTYoIiIpOworICAgICAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYWRlcnMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nMTYga2V5KGhlYWRlcnMtPmtleUF0KGkpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNiB2YWwoaGVhZGVycy0+dmFsdWVBdChpKS5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGtleSk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiOiAiKSk7CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCh2YWwpOworICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoU3RyaW5nMTYoIlxyXG4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KHRtcCk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTk5FQ1QsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIG1NZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihiaW5kZXIpOworCisgICAgICAgIHJldHVybiBtTWVtb3J5ICE9IE5VTEw7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDY0KG9mZnNldCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVBRF9BVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoInJlbW90ZSByZWFkQXQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIGlmIChsZW4gPiBzaXplKSB7CisgICAgICAgICAgICBBTE9HRSgicmVxdWVzdGVkICV6dSwgZ290ICV6dSIsIHNpemUsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPiBtTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnb3QgJXp1LCBidXQgbWVtb3J5IGhhcyAlenUiLCBsZW4sIG1NZW1vcnktPnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgbU1lbW9yeS0+cG9pbnRlcigpLCBsZW4pOworCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorCisgICAgdmlydHVhbCBvZmY2NF90IGdldFNpemUoKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0laRSwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnQzMl90IGV4Y2VwdGlvbkNvZGUgPSByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpOworCisgICAgICAgIGlmIChleGNlcHRpb25Db2RlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoIiIpOworCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAorICAgICAgICAgICAgICAgIElNZWRpYUhUVFBDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlNRV9UWVBFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgICAgICAqdXJpID0gU3RyaW5nOCgiIik7CisKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9VUkksIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqdXJpID0gU3RyaW5nOChyZXBseS5yZWFkU3RyaW5nMTYoKSk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKAorICAgICAgICBNZWRpYUhUVFBDb25uZWN0aW9uLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFIVFRQQ29ubmVjdGlvbiIpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MDU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJJTWVkaWFIVFRQU2VydmljZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBNQUtFX0hUVFAgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorfTsKKworc3RydWN0IEJwTWVkaWFIVFRQU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4geworICAgIEJwTWVkaWFIVFRQU2VydmljZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4oaW1wbCkgeworICAgIH0KKworICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCisgICAgICAgICAgICAgICAgSU1lZGlhSFRUUFNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1BS0VfSFRUUCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCisgICAgICAgIE1lZGlhSFRUUFNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBTZXJ2aWNlIik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMzMyMzlhNy4uOGE2NmM3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTG9nU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWQtPmFzQmluZGVyKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoKGludDY0X3QpIHNpemUpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX1dSSVRFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgLy8gRklYTUUgaWdub3JlcyBzdGF0dXMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgY2FzZSBSRUdJU1RFUl9XUklURVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFMb2dTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgcmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCBiYjA2NmEwLi4zOGY3MTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0xNSw5ICsxNSwxMiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC04NCwxNyArODcsMjMgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjVXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaHR0cFNlcnZpY2UgIT0gTlVMTCk7CisgICAgICAgIGlmIChodHRwU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGh0dHBTZXJ2aWNlLT5hc0JpbmRlcigpKTsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhzcmNVcmwpOwogCiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0aGUgaGVhZGVycwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGhlYWRlcnMtPnNpemUoKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50NjQoaGVhZGVycy0+c2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChoZWFkZXJzLT5rZXlBdChpKSk7CiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoaGVhZGVycy0+dmFsdWVBdChpKSk7CkBAIC0xMTgsNyArMTI3LDcgQEAKIAogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQogICAgIHsKLSAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJWxsZCB1cykgYW5kIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CisgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0aW1lVXMpOwpAQCAtMTk1LDE4ICsyMDQsMjYgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgICAgICAgICAgaWYgKGRhdGEucmVhZEludDMyKCkpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmljZSA9CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNyY1VybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKIAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKLSAgICAgICAgICAgIGludDMyX3QgbnVtSGVhZGVycyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUhlYWRlcnM7ICsraSkgeworICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMgPSAoc2l6ZV90KSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShzcmNVcmwsIG51bUhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwU2VydmljZSwgc3JjVXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yMjIsNyArMjM5LDcgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50IG9wdGlvbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0VGltZUF0VGltZTogdGltZSglbGxkIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRUaW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBhbmQgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKICNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCiAgICAgICAgICAgICBzZXRTY2hlZFBvbGljeShkYXRhKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggMmE1YzdhNy4uYTI5YTdkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KIApAQCAtNzUsMTEgKzc2LDE3IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciogdXJsLAorICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4qIGhlYWRlcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHVybCk7CiAgICAgICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTM1NSw2ICszNjIsMTMgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfVVJMOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOwogICAgICAgICAgICAgaW50MzJfdCBudW1IZWFkZXJzID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTM2Myw3ICszNzcsOCBAQAogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHVybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwU2VydmljZSwgdXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9EQVRBX1NPVVJDRV9GRDogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCAzYzIyYjRjLi4yZTAyZDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUhEQ1AuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KQEAgLTQ4LDcgKzUwLDcgQEAKICAgICBBRERfQkFUVEVSWV9EQVRBLAogICAgIFBVTExfQkFUVEVSWV9EQVRBLAogICAgIExJU1RFTl9GT1JfUkVNT1RFX0RJU1BMQVksCi0gICAgVVBEQVRFX1BST1hZX0NPTkZJRywKKyAgICBHRVRfQ09ERUNfTElTVCwKIH07CiAKIGNsYXNzIEJwTWVkaWFQbGF5ZXJTZXJ2aWNlOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUGxheWVyU2VydmljZT4KQEAgLTg2LDEyICs4OCwyMSBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY29kZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsZVJhdGUsCisgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICAgICAgc2l6ZV90ICpwU2l6ZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihodHRwU2VydmljZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaHR0cFNlcnZpY2UtPmFzQmluZGVyKCkpOworICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKHVybCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoaGVhcC0+YXNCaW5kZXIoKSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChERUNPREVfVVJMLCBkYXRhLCAmcmVwbHkpOwpAQCAtMTgzLDIzICsxOTQsMTEgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElSZW1vdGVEaXNwbGF5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0KICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChob3N0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGhvc3QpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZXhjbHVzaW9uTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVBEQVRFX1BST1hZX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ09ERUNfTElTVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjTGlzdD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiB9OwogCkBAIC0yMjIsMTMgKzIyMSwyNSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFQ09ERV9VUkw6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgICAgICBpbnQgbnVtQ2hhbm5lbHM7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlY29kZSh1cmwsICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMsICZmb3JtYXQsIGhlYXAsICZzaXplKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgZGVjb2RlKGh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlYXAsCisgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2FtcGxlUmF0ZSk7CkBAIC0zMTYsMjQgKzMyNywxMiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGRpc3BsYXktPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFVQREFURV9QUk9YWV9DT05GSUc6Ci0gICAgICAgIHsKKyAgICAgICAgY2FzZSBHRVRfQ09ERUNfTElTVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCA9IE5VTEw7Ci0gICAgICAgICAgICBpbnQzMl90IHBvcnQgPSAwOwotICAgICAgICAgICAgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWRJbnQzMigpKSB7Ci0gICAgICAgICAgICAgICAgaG9zdCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBwb3J0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBleGNsdXNpb25MaXN0ID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih1cGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBnZXRDb2RlY0xpc3QoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihtY2wtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggOGU1ODE2Mi4uOTVhZjAwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtMTcsNiArMTcsMTAgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJJTWVkaWFSZWNvcmRlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KQEAgLTI0LDggKzI4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE2Nyw3ICsxNjksNyBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggOGQ4ZmU2YS4uZTZlOGU2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTU2LDYgKzU2LDcgQEAKICAgICBHRVRfR1JBUEhJQ19CVUZGRVJfVVNBR0UsCiAgICAgU0VUX0lOVEVSTkFMX09QVElPTiwKICAgICBVUERBVEVfR1JBUEhJQ19CVUZGRVJfSU5fTUVUQSwKKyAgICBDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREUsCiB9OwogCiBjbGFzcyBCcE9NWCA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YPiB7CkBAIC02Nyw3ICs2OCw3IEBACiAgICAgdmlydHVhbCBib29sIGxpdmVzTG9jYWxseShub2RlX2lkIG5vZGUsIHBpZF90IHBpZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExJVkVTX0xPQ0FMTFksIGRhdGEsICZyZXBseSk7CiAKQEAgLTEwNiw3ICsxMDcsNyBAQAogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAqbm9kZSA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICAqbm9kZSA9IChub2RlX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKm5vZGUgPSAwOwogICAgICAgICB9CkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZyZWVOb2RlKG5vZGVfaWQgbm9kZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRlJFRV9OT0RFLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTEyNyw3ICsxMjgsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGFyYW0pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VORF9DT01NQU5ELCBkYXRhLCAmcmVwbHkpOwpAQCAtMTQwLDkgKzE0MSw5IEBACiAgICAgICAgICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUEFSQU1FVEVSLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0xNjEsOSArMTYyLDkgQEAKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIGRhdGEud3JpdGUocGFyYW1zLCBzaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QQVJBTUVURVIsIGRhdGEsICZyZXBseSk7CiAKQEAgLTE3NSw5ICsxNzYsOSBAQAogICAgICAgICAgICAgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzaXplKTsKICAgICAgICAgZGF0YS53cml0ZShwYXJhbXMsIHNpemUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKIApAQCAtMTk2LDkgKzE5Nyw5IEBACiAgICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKHBhcmFtcywgc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09ORklHLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0yMDksNyArMjEwLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1NUQVRFVFlQRSogc3RhdGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVEFURSwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICAqc3RhdGUgPSBzdGF0aWNfY2FzdDxPTVhfU1RBVEVUWVBFPihyZXBseS5yZWFkSW50MzIoKSk7CkBAIC0yMjAsNyArMjIxLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfR1JBUEhJQ19CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjMzLDcgKzIzNCw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX1UzMiogdXNhZ2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0dSQVBISUNfQlVGRkVSX1VTQUdFLCBkYXRhLCAmcmVwbHkpOwogCkBAIC0yNDcsNyArMjQ4LDcgQEAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCAvKiBjcm9zc1Byb2Nlc3MgKi8pIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHBhcmFtcy0+YXNCaW5kZXIoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChVU0VfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjU5LDcgKzI2MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgKmJ1ZmZlciA9ICh2b2lkKilyZXBseS5yZWFkSW50UHRyKCk7CisgICAgICAgICpidWZmZXIgPSAoYnVmZmVyX2lkKXJlcGx5LnJlYWRJbnQzMigpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjcwLDcgKzI3MSw3IEBACiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkICpidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlKCpncmFwaGljQnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVTRV9HUkFQSElDX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKQEAgLTI4Miw3ICsyODMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTI5MiwxMCArMjkzLDEwIEBACiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkIGJ1ZmZlcikgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGUoKmdyYXBoaWNCdWZmZXIpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVQREFURV9HUkFQSElDX0JVRkZFUl9JTl9NRVRBLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMzA4LDcgKzMwOSw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX0lOUFVUX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMzMSw3ICszMzIsNyBAQAogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTSUdOQUxfRU5EX09GX0lOUFVUX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKQEAgLTM0NSw3ICszNDYsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1JFX01FVEFfREFUQV9JTl9CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwpAQCAtMzU5LDcgKzM2MCw3IEBACiAgICAgICAgICAgICBPTVhfVTMyIG1heF93aWR0aCwgT01YX1UzMiBtYXhfaGVpZ2h0KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWVuYWJsZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtYXhfd2lkdGgpOwpAQCAtMzcwLDE0ICszNzEsMzMgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUgKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCl0dW5uZWxlZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb0h3U3luYyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREUsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc2lkZWJhbmRIYW5kbGUpIHsKKyAgICAgICAgICAgICpzaWRlYmFuZEhhbmRsZSA9IChuYXRpdmVfaGFuZGxlX3QgKilyZXBseS5yZWFkTmF0aXZlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgdm9pZCAqKmJ1ZmZlcl9kYXRhKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0X2luZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc2l6ZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ19CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zODcsOCArNDA3LDggQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICAqYnVmZmVyID0gKHZvaWQgKilyZXBseS5yZWFkSW50UHRyKCk7Ci0gICAgICAgICpidWZmZXJfZGF0YSA9ICh2b2lkICopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKmJ1ZmZlcl9kYXRhID0gKHZvaWQgKilyZXBseS5yZWFkSW50NjQoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTM5OCw3ICs0MTgsNyBAQAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIocGFyYW1zLT5hc0JpbmRlcigpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUl9XSVRIX0JBQ0tVUCwgZGF0YSwgJnJlcGx5KTsKQEAgLTQxMCw3ICs0MzAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgICpidWZmZXIgPSAodm9pZCopcmVwbHkucmVhZEludFB0cigpOworICAgICAgICAqYnVmZmVyID0gKGJ1ZmZlcl9pZClyZXBseS5yZWFkSW50MzIoKTsKIAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTQxOSw5ICs0MzksOSBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZSRUVfQlVGRkVSLCBkYXRhLCAmcmVwbHkpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQzMCw4ICs0NTAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSUxMX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00NDQsOCArNDY0LDggQEAKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihyYW5nZV9vZmZzZXQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocmFuZ2VfbGVuZ3RoKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKQEAgLTQ2MSw3ICs0ODEsNyBAQAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludFB0cigoaW50cHRyX3Qpbm9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcocGFyYW1ldGVyX25hbWUpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRVhURU5TSU9OX0lOREVYLCBkYXRhLCAmcmVwbHkpOwpAQCAtNDg0LDkgKzUwNCw5IEBACiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50UHRyKChpbnRwdHJfdClub2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOwogICAgICAgICBkYXRhLndyaXRlKG9wdGlvbkRhdGEsIHNpemUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSU5URVJOQUxfT1BUSU9OLCBkYXRhLCAmcmVwbHkpOwpAQCAtNTExLDcgKzUzMSw3IEBACiAgICAgICAgIGNhc2UgTElWRVNfTE9DQUxMWToKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCAqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGl2ZXNMb2NhbGx5KG5vZGUsIHBpZCkpOwogCkBAIC01NTUsNyArNTc1LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm5vZGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KW5vZGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01NjUsNyArNTg1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZyZWVOb2RlKG5vZGUpKTsKIApAQCAtNTc2LDcgKzU5Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBPTVhfQ09NTUFORFRZUEUgY21kID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NTUFORFRZUEU+KGRhdGEucmVhZEludDMyKCkpOwpAQCAtNTk1LDEwICs2MTUsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4ID0gc3RhdGljX2Nhc3Q8T01YX0lOREVYVFlQRT4oZGF0YS5yZWFkSW50MzIoKSk7CiAKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50NjQoKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9UX0VOT1VHSF9EQVRBOwogICAgICAgICAgICAgdm9pZCAqcGFyYW1zID0gTlVMTDsKQEAgLTY4OCw3ICs3MDgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9TVEFURVRZUEUgc3RhdGUgPSBPTVhfU3RhdGVJbnZhbGlkOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRTdGF0ZShub2RlLCAmc3RhdGUpOwpAQCAtNzAyLDcgKzcyMiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOwogCkBAIC03MTYsNyArNzM2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBPTVhfVTMyIHVzYWdlID0gMDsKQEAgLTczMSw3ICs3NTEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBwYXJhbXMgPQogICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKQEAgLTc0Miw3ICs3NjIsNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludFB0cigoaW50cHRyX3QpYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClidWZmZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03NTIsNyArNzcyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CiAgICAgICAgICAgICBkYXRhLnJlYWQoKmdyYXBoaWNCdWZmZXIpOwpAQCAtNzYzLDcgKzc4Myw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTc3MywxMSArNzkzLDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOwogICAgICAgICAgICAgZGF0YS5yZWFkKCpncmFwaGljQnVmZmVyKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKGJ1ZmZlcl9pZClkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhKAogICAgICAgICAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBncmFwaGljQnVmZmVyLCBidWZmZXIpOwpAQCAtNzkwLDcgKzgxMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CkBAIC04MTAsNyArODMwLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obm9kZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwpAQCAtODIyLDcgKzg0Miw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOwogCkBAIC04MzksNyArODU5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIG1heF93aWR0aCA9IGRhdGEucmVhZEludDMyKCk7CkBAIC04NTIsMTEgKzg3MiwzMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBDT05GSUdVUkVfVklERU9fVFVOTkVMX01PREU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIE9NWF9CT09MIHR1bm5lbGVkID0gKE9NWF9CT09MKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvX2h3X3N5bmMgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnNpZGViYW5kX2hhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHR1bm5lbGVkLCBhdWRpb19od19zeW5jLCAmc2lkZWJhbmRfaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisgICAgICAgICAgICBpZihlcnIgPT0gT0speworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZU5hdGl2ZUhhbmRsZShzaWRlYmFuZF9oYW5kbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEFMTE9DX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKCFpc1NlY3VyZShub2RlKSB8fCBwb3J0X2luZGV4ICE9IDAgLyoga1BvcnRJbmRleElucHV0ICovKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjQzMTA0MjMiKTsKQEAgLTg2NCw3ICs5MDQsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCiAgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyOwogICAgICAgICAgICAgdm9pZCAqYnVmZmVyX2RhdGE7CkBAIC04NzMsOCArOTEzLDggQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnRQdHIoKGludHB0cl90KWJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXJfZGF0YSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCgodWludHB0cl90KWJ1ZmZlcl9kYXRhKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtODg0LDcgKzkyNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IHBhcmFtcyA9CiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwpAQCAtODk2LDcgKzkzNiw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50UHRyKChpbnRwdHJfdClidWZmZXIpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KWJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTkwNiw5ICs5NDYsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9IChidWZmZXJfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZyZWVCdWZmZXIobm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyKSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTkxOCw4ICs5NTgsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOwotICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciA9ICh2b2lkKilkYXRhLnJlYWRJbnRQdHIoKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSA9IChub2RlX2lkKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKGJ1ZmZlcl9pZClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmlsbEJ1ZmZlcihub2RlLCBidWZmZXIpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTI5LDggKzk2OSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwogCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAodm9pZCopZGF0YS5yZWFkSW50UHRyKCk7Ci0gICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX2xlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTk0OCw3ICs5ODgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKIAotICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKHZvaWQqKWRhdGEucmVhZEludFB0cigpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlcl9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwogCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwpAQCAtOTgxLDYgKzEwMjEsOCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWE9ic2VydmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKCZtc2csIHNpemVvZihtc2cpKTsKIAorICAgICAgICBBTE9HVigib25NZXNzYWdlIHdyaXRpbmcgbWVzc2FnZSAlZCwgc2l6ZSAlenUiLCBtc2cudHlwZSwgc2l6ZW9mKG1zZykpOworCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9PTl9NU0csIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC05OTcsNiArMTAzOSw4IEBACiAgICAgICAgICAgICBvbXhfbWVzc2FnZSBtc2c7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJm1zZywgc2l6ZW9mKG1zZykpOwogCisgICAgICAgICAgICBBTE9HVigib25UcmFuc2FjdCByZWFkaW5nIG1lc3NhZ2UgJWQsIHNpemUgJXp1IiwgbXNnLnR5cGUsIHNpemVvZihtc2cpKTsKKwogICAgICAgICAgICAgLy8gWFhYIENvdWxkIHVzZSByZWFkSW5wbGFjZSBtYXliZT8KICAgICAgICAgICAgIG9uTWVzc2FnZShtc2cpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCmluZGV4IDY4ZmZjYTguLmZlMmNjNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCkBAIC02Miw3ICs2Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEJ1ZmZlcnMoY29uc3QgVmVjdG9yPHNwPElNZW1vcnk+ID4gJmJ1ZmZlcnMpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN0cmVhbVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlcnMuc2l6ZSgpKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihidWZmZXJzLnNpemUoKSkpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoYnVmZmVycy5pdGVtQXQoaSktPmFzQmluZGVyKCkpOwogICAgICAgICB9CkBAIC03Miw3ICs3Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyQXZhaWxhYmxlKHNpemVfdCBpbmRleCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3RyZWFtU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5kZXgpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KGluZGV4KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdCgKICAgICAgICAgICAgICAgICBPTl9CVUZGRVJfQVZBSUxBQkxFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgY2FzZSBTRVRfQlVGRkVSUzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdHJlYW1Tb3VyY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNpemVfdCBuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBuID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQ2NCgpKTsKICAgICAgICAgICAgIFZlY3RvcjxzcDxJTWVtb3J5PiA+IGJ1ZmZlcnM7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgY2FzZSBPTl9CVUZGRVJfQVZBSUxBQkxFOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN0cmVhbVNvdXJjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgb25CdWZmZXJBdmFpbGFibGUoc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICBvbkJ1ZmZlckF2YWlsYWJsZShzdGF0aWNfY2FzdDxzaXplX3Q+KGRhdGEucmVhZEludDY0KCkpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0NSw4ICsxNDUsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdHJlYW1MaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGluZGV4KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihzaXplKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihpbmRleCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oc2l6ZSkpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChRVUVVRV9CVUZGRVIsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KQEAgLTE3Nyw4ICsxNzcsOCBAQAogICAgICAgICBjYXNlIFFVRVVFX0JVRkZFUjoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdHJlYW1MaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oZGF0YS5yZWFkSW50NjQoKSk7CiAKICAgICAgICAgICAgIHF1ZXVlQnVmZmVyKGluZGV4LCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggZTkxNGIzNC4uZjBmMTgzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgICAgICBwTGliQ29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgbVRyYWNrQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIChzaXplX3QpIG1UcmFja0J1ZmZlclNpemUsCiAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKIAogICAgIC8vIGNyZWF0ZSByZW5kZXIgYW5kIHBsYXliYWNrIHRocmVhZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGM0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0luZm8iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdCB7CisgICAgcHJvZmlsZUxldmVscy0+Y2xlYXIoKTsKKyAgICBwcm9maWxlTGV2ZWxzLT5hcHBlbmRWZWN0b3IobVByb2ZpbGVMZXZlbHMpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldFN1cHBvcnRlZENvbG9yRm9ybWF0cygKKyAgICAgICAgVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdCB7CisgICAgY29sb3JGb3JtYXRzLT5jbGVhcigpOworICAgIGNvbG9yRm9ybWF0cy0+YXBwZW5kVmVjdG9yKG1Db2xvckZvcm1hdHMpOworfQorCit1aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRGbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZsYWdzOworfQorCitjb25zdCBzcDxBTWVzc2FnZT4gTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RGV0YWlscygpIGNvbnN0IHsKKyAgICByZXR1cm4gbURldGFpbHM7Cit9CisKK01lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkNhcGFiaWxpdGllcygpCisgIDogbUZsYWdzKDApIHsKKyAgICBtRGV0YWlscyA9IG5ldyBBTWVzc2FnZTsKK30KKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKAorICAgICAgICBjb25zdCBQYXJjZWwgJnBhcmNlbCkgeworICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPSBuZXcgQ2FwYWJpbGl0aWVzKCk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgICAgIHByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgICAgICAgY2Fwcy0+bVByb2ZpbGVMZXZlbHMucHVzaF9iYWNrKHByb2ZpbGVMZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB1aW50MzJfdCBjb2xvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2hfYmFjayhjb2xvcik7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDMyX3QgZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IEFNZXNzYWdlOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKGNhcHMgIT0gTlVMTCkgeworICAgICAgICBjYXBzLT5tRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgY2Fwcy0+bURldGFpbHMgPSBkZXRhaWxzOworICAgIH0KKyAgICByZXR1cm4gY2FwczsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIENIRUNLX0xFKG1Qcm9maWxlTGV2ZWxzLnNpemUoKSwgSU5UMzJfTUFYKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobVByb2ZpbGVMZXZlbHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9maWxlTGV2ZWxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUHJvZmlsZUxldmVscy5pdGVtQXQoaSkubVByb2ZpbGUpOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobVByb2ZpbGVMZXZlbHMuaXRlbUF0KGkpLm1MZXZlbCk7CisgICAgfQorICAgIENIRUNLX0xFKG1Db2xvckZvcm1hdHMuc2l6ZSgpLCBJTlQzMl9NQVgpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29sb3JGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ29sb3JGb3JtYXRzLml0ZW1BdChpKSk7CisgICAgfQorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOworICAgIG1EZXRhaWxzLT53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1lZGlhQ29kZWNJbmZvOjppc0VuY29kZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0VuY29kZXI7Cit9CisKK2Jvb2wgTWVkaWFDb2RlY0luZm86Omhhc1F1aXJrKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbVF1aXJrcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgaWYgKG1RdWlya3MuaXRlbUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0IHsKKyAgICBtaW1lcy0+Y2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgIG1pbWVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKKyAgICB9Cit9CisKK2NvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+CitNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgIHJldHVybiBtQ2Fwcy52YWx1ZUF0KGl4KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKk1lZGlhQ29kZWNJbmZvOjpnZXRDb2RlY05hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OYW1lLmNfc3RyKCk7Cit9CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlY0luZm8+IE1lZGlhQ29kZWNJbmZvOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgQVN0cmluZyBuYW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbyhuYW1lLCBpc0VuY29kZXIsIE5VTEwpOworICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFTdHJpbmcgcXVpcmsgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluZm8tPm1RdWlya3MucHVzaF9iYWNrKHF1aXJrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEFTdHJpbmcgbWltZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluZm8tPm1DYXBzLmFkZChtaW1lLCBjYXBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5mbzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBtTmFtZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc0VuY29kZXIpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUXVpcmtzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUXVpcmtzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1RdWlya3MuaXRlbUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYXBzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2Fwcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQ2Fwcy5rZXlBdChpKS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIG1DYXBzLnZhbHVlQXQoaSktPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IE1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gaXg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oQVN0cmluZyBuYW1lLCBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUpCisgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgIG1Jc0VuY29kZXIoZW5jb2RlciksCisgICAgICBtSGFzU29sZU1pbWUoZmFsc2UpIHsKKyAgICBpZiAobWltZSAhPSBOVUxMKSB7CisgICAgICAgIGFkZE1pbWUobWltZSk7CisgICAgICAgIG1IYXNTb2xlTWltZSA9IHRydWU7CisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7CisgICAgaWYgKG1IYXNTb2xlTWltZSkgeworICAgICAgICBBTE9HRSgiQ29kZWMgJyVzJyBhbHJlYWR5IGhhZCBpdHMgdHlwZSBzcGVjaWZpZWQiLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgICAgbUN1cnJlbnRDYXBzID0gbUNhcHMudmFsdWVBdChpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1cnJlbnRDYXBzID0gbmV3IENhcGFiaWxpdGllcygpOworICAgICAgICBtQ2Fwcy5hZGQoQVN0cmluZyhtaW1lKSwgbUN1cnJlbnRDYXBzKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgIG1DYXBzLnJlbW92ZUl0ZW1zQXQoaXgpOworICAgICAgICAvLyBtQ3VycmVudENhcHMgd2lsbCBiZSByZW1vdmVkIHdoZW4gY29tcGxldGVkCisgICAgfQorfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBDb2RlY0NhcGFiaWxpdGllcyAmY2FwcykgeworICAgIG1DdXJyZW50Q2Fwcy0+bVByb2ZpbGVMZXZlbHMuY2xlYXIoKTsKKyAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMuY2xlYXIoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmc3JjID0gY2Fwcy5tUHJvZmlsZUxldmVscy5pdGVtQXQoaSk7CisKKyAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKKyAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3JjLm1Qcm9maWxlOworICAgICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gc3JjLm1MZXZlbDsKKyAgICAgICAgbUN1cnJlbnRDYXBzLT5tUHJvZmlsZUxldmVscy5wdXNoX2JhY2socHJvZmlsZUxldmVsKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHMubUNvbG9yRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICBtQ3VycmVudENhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNhcHMubUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOworICAgIH0KKworICAgIG1DdXJyZW50Q2Fwcy0+bUZsYWdzID0gY2Fwcy5tRmxhZ3M7CisgICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscyA9IG5ldyBBTWVzc2FnZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkUXVpcmsoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmICghaGFzUXVpcmsobmFtZSkpIHsKKyAgICAgICAgbVF1aXJrcy5wdXNoKG5hbWUpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Y29tcGxldGUoKSB7CisgICAgbUN1cnJlbnRDYXBzID0gTlVMTDsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRGV0YWlsKGNvbnN0IEFTdHJpbmcgJmtleSwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjphZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSkgeworICAgIEFTdHJpbmcgdGFnID0gImZlYXR1cmUtIjsKKyAgICB0YWcuYXBwZW5kKGtleSk7CisgICAgbUN1cnJlbnRDYXBzLT5tRGV0YWlscy0+c2V0SW50MzIodGFnLmNfc3RyKCksIHZhbHVlKTsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6YWRkRmVhdHVyZShjb25zdCBBU3RyaW5nICZrZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgQVN0cmluZyB0YWcgPSAiZmVhdHVyZS0iOworICAgIHRhZy5hcHBlbmQoa2V5KTsKKyAgICBtQ3VycmVudENhcHMtPm1EZXRhaWxzLT5zZXRTdHJpbmcodGFnLmNfc3RyKCksIHZhbHVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKaW5kZXggODMxOWNkNy4uZTJlNjA0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAKQEAgLTY5LDYgKzY5LDcgQEAKICAgICB7IjQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV80ODBQfSwKICAgICB7IjcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV83MjBQfSwKICAgICB7IjEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFB9LAorICAgIHsiMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV8yMTYwUH0sCiAgICAgeyJxdmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQX0sCiAKICAgICB7InRpbWVsYXBzZWxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPV30sCkBAIC03OCwxMSArNzksMjUgQEAKICAgICB7InRpbWVsYXBzZTQ4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzQ4MFB9LAogICAgIHsidGltZWxhcHNlNzIwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNzIwUH0sCiAgICAgeyJ0aW1lbGFwc2UxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9LAorICAgIHsidGltZWxhcHNlMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQfSwKICAgICB7InRpbWVsYXBzZXF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0F9LAorCisgICAgeyJoaWdoc3BlZWRsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1d9LAorICAgIHsiaGlnaHNwZWVkaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfSElHSH0sCisgICAgeyJoaWdoc3BlZWQ0ODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80ODBQfSwKKyAgICB7ImhpZ2hzcGVlZDcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFB9LAorICAgIHsiaGlnaHNwZWVkMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQfSwKKyAgICB7ImhpZ2hzcGVlZDIxNjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUH0sCiB9OwogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRUQgX191bnVzZWQKKyNlbHNlCisjZGVmaW5lIFVOVVNFRAorI2VuZGlmCisKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9Db2RlYyhjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjJiBjb2RlYykKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyYgY29kZWMgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlbyBjb2RlYzoiKTsKICAgICBBTE9HVigiY29kZWMgPSAlZCIsIGNvZGVjLm1Db2RlYyk7CkBAIC05Myw3ICsxMDgsNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvQ29kZWMoY29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyYgY29kZWMpCitNZWRpYVByb2ZpbGVzOjpsb2dBdWRpb0NvZGVjKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMmIGNvZGVjIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWM6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjb2RlYy5tQ29kZWMpOwpAQCAtMTAzLDcgKzExOCw3IEBACiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FbmNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigidmlkZW8gZW5jb2RlciBjYXA6Iik7CiAgICAgQUxPR1YoImNvZGVjID0gJWQiLCBjYXAubUNvZGVjKTsKQEAgLTExNCw3ICsxMjksNyBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoImF1ZGlvIGVuY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CkBAIC0xMjQsMjEgKzEzOSwyMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQKLU1lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRGVjb2RlckNhcChjb25zdCBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAmIGNhcCBVTlVTRUQpCiB7CiAgICAgQUxPR1YoInZpZGVvIGRlY29kZXIgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwKQorTWVkaWFQcm9maWxlczo6bG9nQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRGVjb2RlckNhcCYgY2FwIFVOVVNFRCkKIHsKICAgICBBTE9HVigiYXVkaW8gY29kZWMgY2FwOiIpOwogICAgIEFMT0dWKCJjb2RlYyA9ICVkIiwgY2FwLm1Db2RlYyk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZAotTWVkaWFQcm9maWxlczo6bG9nVmlkZW9FZGl0b3JDYXAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9FZGl0b3JDYXAmIGNhcCkKK01lZGlhUHJvZmlsZXM6OmxvZ1ZpZGVvRWRpdG9yQ2FwKGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvRWRpdG9yQ2FwJiBjYXAgVU5VU0VEKQogewogICAgIEFMT0dWKCJ2aWRlb2VkaXRvciBjYXA6Iik7CiAgICAgQUxPR1YoIm1NYXhJbnB1dEZyYW1lV2lkdGggPSAlZCIsIGNhcC5tTWF4SW5wdXRGcmFtZVdpZHRoKTsKQEAgLTQ2Niw4ICs0ODEsMTMgQEAKICAgICAgICAgICAgcXVhbGl0eSA8PSBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EOwogfQogCitzdGF0aWMgYm9vbCBpc0hpZ2hTcGVlZFByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgeworICAgIHJldHVybiBxdWFsaXR5ID49IENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCAmJgorICAgICAgICAgICBxdWFsaXR5IDw9IENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQ7Cit9CisKIHZvaWQgTWVkaWFQcm9maWxlczo6aW5pdFJlcXVpcmVkUHJvZmlsZVJlZnMoY29uc3QgVmVjdG9yPGludD4mIGNhbWVyYUlkcykgewotICAgIEFMT0dWKCJOdW1iZXIgb2YgY2FtZXJhIGlkczogJWQiLCBjYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIGNhbWVyYSBpZHM6ICV6dSIsIGNhbWVyYUlkcy5zaXplKCkpOwogICAgIENIRUNLKGNhbWVyYUlkcy5zaXplKCkgPiAwKTsKICAgICBtUmVxdWlyZWRQcm9maWxlUmVmcyA9IG5ldyBSZXF1aXJlZFByb2ZpbGVzW2NhbWVyYUlkcy5zaXplKCldOwogICAgIGZvciAoc2l6ZV90IGkgPSAwLCBuID0gY2FtZXJhSWRzLnNpemUoKTsgaSA8IG47ICsraSkgewpAQCAtNTEzLDE0ICs1MzMsMTcgQEAKICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcmVmUXVhbGl0eTsKICAgICAgICAgVmlkZW9Db2RlYyAqY29kZWMgPSBOVUxMOwogCi0gICAgICAgIC8vIENoZWNrIGhpZ2ggYW5kIGxvdyBmcm9tIGVpdGhlciBjYW1jb3JkZXIgcHJvZmlsZSBvciB0aW1lbGFwc2UgcHJvZmlsZQotICAgICAgICAvLyBidXQgbm90IGJvdGguIERlZmF1bHQsIGNoZWNrIGNhbWNvcmRlciBwcm9maWxlCisgICAgICAgIC8vIENoZWNrIGhpZ2ggYW5kIGxvdyBmcm9tIGVpdGhlciBjYW1jb3JkZXIgcHJvZmlsZSwgdGltZWxhcHNlIHByb2ZpbGUKKyAgICAgICAgLy8gb3IgaGlnaCBzcGVlZCBwcm9maWxlLCBidXQgbm90IGFsbCBvZiB0aGVtLiBEZWZhdWx0LCBjaGVjayBjYW1jb3JkZXIgcHJvZmlsZQogICAgICAgICBzaXplX3QgaiA9IDA7CiAgICAgICAgIHNpemVfdCBvID0gMjsKICAgICAgICAgaWYgKGlzVGltZWxhcHNlUHJvZmlsZShxdWFsaXR5KSkgewogICAgICAgICAgICAgLy8gQ2hlY2sgdGltZWxhcHNlIHByb2ZpbGUgaW5zdGVhZC4KICAgICAgICAgICAgIGogPSAyOwogICAgICAgICAgICAgbyA9IGtOdW1SZXF1aXJlZFByb2ZpbGVzOworICAgICAgICB9IGVsc2UgaWYgKGlzSGlnaFNwZWVkUHJvZmlsZShxdWFsaXR5KSkgeworICAgICAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgZm9yIGhpZ2ggc3BlZWQgcHJvZmlsZS4KKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gTXVzdCBiZSBjYW1jb3JkZXIgcHJvZmlsZS4KICAgICAgICAgICAgIENIRUNLKGlzQ2FtY29yZGVyUHJvZmlsZShxdWFsaXR5KSk7CkBAIC01OTQsMTQgKzYxNywxNCBAQAogCiAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBwcm9maWxlLT5tUXVhbGl0eSk7CiAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQcm9maWxlIHF1YWxpdHkgJWQgZm9yIGNhbWVyYSAlZCBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQcm9maWxlIHF1YWxpdHkgJWQgZm9yIGNhbWVyYSAlenUgYWxyZWFkeSBleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVF1YWxpdHksIGNhbWVyYUlkKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaW5kZXggPT0gcmVmSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBwcm9maWxlCi0gICAgICAgICAgICAgICAgQUxPR1YoIkFkZCBhIHByb2ZpbGU6IHF1YWxpdHkgJWQ9PiVkIGZvciBjYW1lcmEgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJBZGQgYSBwcm9maWxlOiBxdWFsaXR5ICVkPT4lZCBmb3IgY2FtZXJhICV6dSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaW5mby0+bVJlZlByb2ZpbGVJbmRleF0tPm1RdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVF1YWxpdHksIGNhbWVyYUlkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjhiNWFhNy4uZGNiYjc2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0yMzcsNCArMjM3LDI0IEBACiAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogfQogCitNZWRpYUFsYnVtQXJ0ICpNZWRpYUFsYnVtQXJ0OjpjbG9uZSgpIHsKKyAgICBzaXplX3QgYnl0ZV9zaXplID0gdGhpcy0+c2l6ZSgpICsgc2l6ZW9mKE1lZGlhQWxidW1BcnQpOworICAgIE1lZGlhQWxidW1BcnQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtYWxsb2MoYnl0ZV9zaXplKSk7CisgICAgcmVzdWx0LT5tU2l6ZSA9IHRoaXMtPnNpemUoKTsKKyAgICBtZW1jcHkoJnJlc3VsdC0+bURhdGFbMF0sICZ0aGlzLT5tRGF0YVswXSwgdGhpcy0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIE1lZGlhQWxidW1BcnQ6OmluaXQoTWVkaWFBbGJ1bUFydCAqaW5zdGFuY2UsIGludDMyX3QgZGF0YVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgICBpbnN0YW5jZS0+bVNpemUgPSBkYXRhU2l6ZTsKKyAgICBtZW1jcHkoJmluc3RhbmNlLT5tRGF0YVswXSwgZGF0YSwgZGF0YVNpemUpOworfQorCitNZWRpYUFsYnVtQXJ0ICpNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShpbnQzMl90IGRhdGFTaXplLCBjb25zdCB2b2lkKiBkYXRhKSB7CisgICAgc2l6ZV90IGJ5dGVfc2l6ZSA9IHNpemVvZihNZWRpYUFsYnVtQXJ0KSArIGRhdGFTaXplOworICAgIE1lZGlhQWxidW1BcnQgKnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtYWxsb2MoYnl0ZV9zaXplKSk7CisgICAgaW5pdChyZXN1bHQsIGRhdGFTaXplLCBkYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lckNsaWVudC5jcHAKaW5kZXggOTNhNGE0Yy4uOWY4MDNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXJDbGllbnQuY3BwCkBAIC0xNCwyMTcgKzE0LDM4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2Nhbm5lckNsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPG1lZGlhL21lZGlhc2Nhbm5lci5oPgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oIgogI2luY2x1ZGUgIlN0cmluZ0FycmF5LmgiCiAKLSNpbmNsdWRlICJhdXRvZGV0ZWN0LmgiCi0jaW5jbHVkZSAidW5pY29kZS91Y252LmgiCi0jaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTWVkaWFTY2FubmVyQ2xpZW50OjpNZWRpYVNjYW5uZXJDbGllbnQoKQotICAgIDogICBtTmFtZXMoTlVMTCksCi0gICAgICAgIG1WYWx1ZXMoTlVMTCksCi0gICAgICAgIG1Mb2NhbGVFbmNvZGluZyhrRW5jb2RpbmdOb25lKQoteworTWVkaWFTY2FubmVyQ2xpZW50OjpNZWRpYVNjYW5uZXJDbGllbnQoKSB7CiB9CiAKLU1lZGlhU2Nhbm5lckNsaWVudDo6fk1lZGlhU2Nhbm5lckNsaWVudCgpCi17Ci0gICAgZGVsZXRlIG1OYW1lczsKLSAgICBkZWxldGUgbVZhbHVlczsKK01lZGlhU2Nhbm5lckNsaWVudDo6fk1lZGlhU2Nhbm5lckNsaWVudCgpIHsKIH0KIAogdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OnNldExvY2FsZShjb25zdCBjaGFyKiBsb2NhbGUpCiB7Ci0gICAgaWYgKCFsb2NhbGUpIHJldHVybjsKLQotICAgIGlmICghc3RybmNtcChsb2NhbGUsICJqYSIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdTaGlmdEpJUzsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJrbyIsIDIpKQotICAgICAgICBtTG9jYWxlRW5jb2RpbmcgPSBrRW5jb2RpbmdFVUNLUjsKLSAgICBlbHNlIGlmICghc3RybmNtcChsb2NhbGUsICJ6aCIsIDIpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGxvY2FsZSwgInpoX0NOIikpIHsKLSAgICAgICAgICAgIC8vIHNpbXBsaWZpZWQgY2hpbmVzZSBmb3IgbWFpbmxhbmQgQ2hpbmEKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0dCSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0cmFkaXRpb25hbCBmb3Igbm9uLW1haW5sYW5kIENoaW5lc2UgbG9jYWxlcyAoVGFpd2FuLCBIb25nIEtvbmcsIFNpbmdhcG9yZSkKLSAgICAgICAgICAgIG1Mb2NhbGVFbmNvZGluZyA9IGtFbmNvZGluZ0JpZzU7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbUxvY2FsZSA9IGxvY2FsZTsgLy8gbm90IGN1cnJlbnRseSB1c2VkCiB9CiAKLXZvaWQgTWVkaWFTY2FubmVyQ2xpZW50OjpiZWdpbkZpbGUoKQotewotICAgIG1OYW1lcyA9IG5ldyBTdHJpbmdBcnJheTsKLSAgICBtVmFsdWVzID0gbmV3IFN0cmluZ0FycmF5Owordm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmJlZ2luRmlsZSgpIHsKIH0KIAogc3RhdHVzX3QgTWVkaWFTY2FubmVyQ2xpZW50OjphZGRTdHJpbmdUYWcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpCiB7Ci0gICAgaWYgKG1Mb2NhbGVFbmNvZGluZyAhPSBrRW5jb2RpbmdOb25lKSB7Ci0gICAgICAgIC8vIGRvbid0IGJvdGhlciBjYWNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgYWxsIEFTQ0lJLgotICAgICAgICAvLyBjYWxsIGhhbmRsZVN0cmluZ1RhZyBkaXJlY3RseSBpbnN0ZWFkLgotICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdmFsdWUgKHdoaWNoIHNob3VsZCBiZSB1dGY4KSBoYXMgYW55IG5vbi1BU0NJSSBjaGFyYWN0ZXJzCi0gICAgICAgIGJvb2wgbm9uQXNjaWkgPSBmYWxzZTsKLSAgICAgICAgY29uc3QgY2hhciogY2hwID0gdmFsdWU7Ci0gICAgICAgIGNoYXIgY2g7Ci0gICAgICAgIHdoaWxlICgoY2ggPSAqY2hwKyspKSB7Ci0gICAgICAgICAgICBpZiAoY2ggJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgbm9uQXNjaWkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5vbkFzY2lpKSB7Ci0gICAgICAgICAgICAvLyBzYXZlIHRoZSBzdHJpbmdzIGZvciBsYXRlciBzbyB0aGV5IGNhbiBiZSB1c2VkIGZvciBuYXRpdmUgZW5jb2RpbmcgZGV0ZWN0aW9uCi0gICAgICAgICAgICBtTmFtZXMtPnB1c2hfYmFjayhuYW1lKTsKLSAgICAgICAgICAgIG1WYWx1ZXMtPnB1c2hfYmFjayh2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKLSAgICB9Ci0KLSAgICAvLyBhdXRvZGV0ZWN0aW9uIGlzIG5vdCBuZWNlc3NhcnksIHNvIG5vIG5lZWQgdG8gY2FjaGUgdGhlIHZhbHVlcwotICAgIC8vIHBhc3MgZGlyZWN0bHkgdG8gdGhlIGNsaWVudCBpbnN0ZWFkCi0gICAgcmV0dXJuIGhhbmRsZVN0cmluZ1RhZyhuYW1lLCB2YWx1ZSk7CisgICAgaGFuZGxlU3RyaW5nVGFnKG5hbWUsIHZhbHVlKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXRpYyB1aW50MzJfdCBwb3NzaWJsZUVuY29kaW5ncyhjb25zdCBjaGFyKiBzKQotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IGtFbmNvZGluZ0FsbDsKLSAgICAvLyBpZiBzIGNvbnRhaW5zIGEgbmF0aXZlIGVuY29kaW5nLCB0aGVuIGl0IHdhcyBtaXN0YWtlbmx5IGVuY29kZWQgaW4gdXRmOCBhcyBpZiBpdCB3ZXJlIGxhdGluLTEKLSAgICAvLyBzbyB3ZSBuZWVkIHRvIHJldmVyc2UgdGhlIGxhdGluLTEgLT4gdXRmOCBjb252ZXJzaW9uIHRvIGdldCB0aGUgbmF0aXZlIGNoYXJzIGJhY2sKLSAgICB1aW50OF90IGNoMSwgY2gyOwotICAgIHVpbnQ4X3QqIGNocCA9ICh1aW50OF90ICopczsKLQotICAgIHdoaWxlICgoY2gxID0gKmNocCsrKSkgewotICAgICAgICBpZiAoY2gxICYgMHg4MCkgewotICAgICAgICAgICAgY2gyID0gKmNocCsrOwotICAgICAgICAgICAgY2gxID0gKChjaDEgPDwgNikgJiAweEMwKSB8IChjaDIgJiAweDNGKTsKLSAgICAgICAgICAgIC8vIGNoMSBpcyBub3cgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHBvdGVudGlhbCBuYXRpdmUgY2hhcgotCi0gICAgICAgICAgICBjaDIgPSAqY2hwKys7Ci0gICAgICAgICAgICBpZiAoY2gyICYgMHg4MCkKLSAgICAgICAgICAgICAgICBjaDIgPSAoKGNoMiA8PCA2KSAmIDB4QzApIHwgKCpjaHArKyAmIDB4M0YpOwotICAgICAgICAgICAgLy8gY2gyIGlzIG5vdyB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHBvdGVudGlhbCBuYXRpdmUgY2hhcgotICAgICAgICAgICAgaW50IGNoID0gKGludCljaDEgPDwgOCB8IChpbnQpY2gyOwotICAgICAgICAgICAgcmVzdWx0ICY9IGZpbmRQb3NzaWJsZUVuY29kaW5ncyhjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBBU0NJSSBjaGFyYWN0ZXIsIHdoaWNoIGNvdWxkIGJlIGFueXRoaW5nCi0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmNvbnZlcnRWYWx1ZXModWludDMyX3QgZW5jb2RpbmcpCi17Ci0gICAgY29uc3QgY2hhciogZW5jID0gTlVMTDsKLSAgICBzd2l0Y2ggKGVuY29kaW5nKSB7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nU2hpZnRKSVM6Ci0gICAgICAgICAgICBlbmMgPSAic2hpZnQtamlzIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtFbmNvZGluZ0dCSzoKLSAgICAgICAgICAgIGVuYyA9ICJnYmsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga0VuY29kaW5nQmlnNToKLSAgICAgICAgICAgIGVuYyA9ICJCaWc1IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtFbmNvZGluZ0VVQ0tSOgotICAgICAgICAgICAgZW5jID0gIkVVQy1LUiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoZW5jKSB7Ci0gICAgICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwotCi0gICAgICAgIFVDb252ZXJ0ZXIgKmNvbnYgPSB1Y252X29wZW4oZW5jLCAmc3RhdHVzKTsKLSAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciAlcyIsIGVuYyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVUNvbnZlcnRlciAqdXRmOENvbnYgPSB1Y252X29wZW4oIlVURi04IiwgJnN0YXR1cyk7Ci0gICAgICAgIGlmIChVX0ZBSUxVUkUoc3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBjcmVhdGUgVUNvbnZlcnRlciBmb3IgVVRGLTgiKTsKLSAgICAgICAgICAgIHVjbnZfY2xvc2UoY29udik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3IgZWFjaCB2YWx1ZSBzdHJpbmcsIGNvbnZlcnQgZnJvbSBuYXRpdmUgZW5jb2RpbmcgdG8gVVRGLTgKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB3ZSBuZWVkIHRvIHVudGFuZ2xlIHRoZSB1dGY4IGFuZCBjb252ZXJ0IGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJ5dGVzCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgcmVkdWNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLCB3ZSBjYW4gZG8gdGhpcyBpbiBwbGFjZQotICAgICAgICAgICAgdWludDhfdCogc3JjID0gKHVpbnQ4X3QgKiltVmFsdWVzLT5nZXRFbnRyeShpKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilzcmMpOwotICAgICAgICAgICAgdWludDhfdCogZGVzdCA9IHNyYzsKLQotICAgICAgICAgICAgdWludDhfdCB1Y2g7Ci0gICAgICAgICAgICB3aGlsZSAoKHVjaCA9ICpzcmMrKykpIHsKLSAgICAgICAgICAgICAgICBpZiAodWNoICYgMHg4MCkKLSAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICgodWNoIDw8IDYpICYgMHhDMCkgfCAoKnNyYysrICYgMHgzRik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gdWNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRlc3QgPSAwOwotCi0gICAgICAgICAgICAvLyBub3cgY29udmVydCBmcm9tIG5hdGl2ZSBlbmNvZGluZyB0byBVVEYtOAotICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlID0gbVZhbHVlcy0+Z2V0RW50cnkoaSk7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gbGVuICogMyArIDE7Ci0gICAgICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhclt0YXJnZXRMZW5ndGhdOwotICAgICAgICAgICAgLy8gZG9uJ3Qgbm9ybWFsbHkgY2hlY2sgZm9yIE5VTEwsIGJ1dCBpbiB0aGlzIGNhc2UgdGFyZ2V0TGVuZ3RoIG1heSBiZSBsYXJnZQotICAgICAgICAgICAgaWYgKCFidWZmZXIpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjaGFyKiB0YXJnZXQgPSBidWZmZXI7Ci0KLSAgICAgICAgICAgIHVjbnZfY29udmVydEV4KHV0ZjhDb252LCBjb252LCAmdGFyZ2V0LCB0YXJnZXQgKyB0YXJnZXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICZzb3VyY2UsIChjb25zdCBjaGFyICopZGVzdCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgVFJVRSwgVFJVRSwgJnN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgidWNudl9jb252ZXJ0RXggZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgbVZhbHVlcy0+c2V0RW50cnkoaSwgIj8/PyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB6ZXJvIHRlcm1pbmF0ZQotICAgICAgICAgICAgICAgICp0YXJnZXQgPSAwOwotICAgICAgICAgICAgICAgIG1WYWx1ZXMtPnNldEVudHJ5KGksIGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHVjbnZfY2xvc2UoY29udik7Ci0gICAgICAgIHVjbnZfY2xvc2UodXRmOENvbnYpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmVuZEZpbGUoKQotewotICAgIGlmIChtTG9jYWxlRW5jb2RpbmcgIT0ga0VuY29kaW5nTm9uZSkgewotICAgICAgICBpbnQgc2l6ZSA9IG1OYW1lcy0+c2l6ZSgpOwotICAgICAgICB1aW50MzJfdCBlbmNvZGluZyA9IGtFbmNvZGluZ0FsbDsKLQotICAgICAgICAvLyBjb21wdXRlIGEgYml0IG1hc2sgY29udGFpbmluZyBhbGwgcG9zc2libGUgZW5jb2RpbmdzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU5hbWVzLT5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIGVuY29kaW5nICY9IHBvc3NpYmxlRW5jb2RpbmdzKG1WYWx1ZXMtPmdldEVudHJ5KGkpKTsKLQotICAgICAgICAvLyBpZiB0aGUgbG9jYWxlIGVuY29kaW5nIG1hdGNoZXMsIHRoZW4gYXNzdW1lIHdlIGhhdmUgYSBuYXRpdmUgZW5jb2RpbmcuCi0gICAgICAgIGlmIChlbmNvZGluZyAmIG1Mb2NhbGVFbmNvZGluZykKLSAgICAgICAgICAgIGNvbnZlcnRWYWx1ZXMobUxvY2FsZUVuY29kaW5nKTsKLQotICAgICAgICAvLyBmaW5hbGx5LCBwdXNoIGFsbCBuYW1lL3ZhbHVlIHBhaXJzIHRvIHRoZSBjbGllbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTmFtZXMtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYW5kbGVTdHJpbmdUYWcobU5hbWVzLT5nZXRFbnRyeShpKSwgbVZhbHVlcy0+Z2V0RW50cnkoaSkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGVsc2UgYWRkU3RyaW5nVGFnKCkgaGFzIGRvbmUgYWxsIHRoZSB3b3JrIHNvIHdlIGhhdmUgbm90aGluZyB0byBkbwotCi0gICAgZGVsZXRlIG1OYW1lczsKLSAgICBkZWxldGUgbVZhbHVlczsKLSAgICBtTmFtZXMgPSBOVUxMOwotICAgIG1WYWx1ZXMgPSBOVUxMOwordm9pZCBNZWRpYVNjYW5uZXJDbGllbnQ6OmVuZEZpbGUoKSB7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCmluZGV4IDgzYjhhZjMuLmEwMmNhNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCkBAIC0xNCwxMyArMTQsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLy8gZm9yIHByb3BlcnR5IGZ1bmN0aW9ucyBiZWxvdwotI2RlZmluZSBfX1NURElOVF9MSU1JVFMKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0KICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFVdGlscyIKICNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMyw0OSArMjYsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIGZvbGxvd2luZyBwcm9wZXJ0eSBmdW5jdGlvbnMgYm9ycm93ZWQgZnJvbSBsbXAgcHJvcGVydGllcy5jCi1zdGF0aWMgaW50bWF4X3QgcHJvcGVydHlfZ2V0X2ltYXgoY29uc3QgY2hhciAqa2V5LCBpbnRtYXhfdCBsb3dlcl9ib3VuZCwgaW50bWF4X3QgdXBwZXJfYm91bmQsCi0gICAgICAgIGludG1heF90IGRlZmF1bHRfdmFsdWUpIHsKLSAgICBpZiAoIWtleSkgewotICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0KLSAgICBpbnRtYXhfdCByZXN1bHQgPSBkZWZhdWx0X3ZhbHVlOwotICAgIGNoYXIgYnVmW1BST1BFUlRZX1ZBTFVFX01BWF0gPSB7J1wwJyx9OwotICAgIGNoYXIgKmVuZCA9IE5VTEw7Ci0KLSAgICBpbnQgbGVuID0gcHJvcGVydHlfZ2V0KGtleSwgYnVmLCAiIik7Ci0gICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHRtcCA9IGVycm5vOwotICAgICAgICBlcnJubyA9IDA7Ci0KLSAgICAgICAgLy8gSW5mZXIgYmFzZSBhdXRvbWF0aWNhbGx5Ci0gICAgICAgIHJlc3VsdCA9IHN0cnRvaW1heChidWYsICZlbmQsIC8qYmFzZSovMCk7Ci0gICAgICAgIGlmICgocmVzdWx0ID09IElOVE1BWF9NSU4gfHwgcmVzdWx0ID09IElOVE1BWF9NQVgpICYmIGVycm5vID09IEVSQU5HRSkgewotICAgICAgICAgICAgLy8gT3ZlciBvciB1bmRlcmZsb3cKLSAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7Ci0gICAgICAgICAgICBBTE9HVigiJXMoJXMsJSIgUFJJZE1BWCAiKSAtIG92ZXJmbG93IiwgX19GVU5DVElPTl9fLCBrZXksIGRlZmF1bHRfdmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA8IGxvd2VyX2JvdW5kIHx8IHJlc3VsdCA+IHVwcGVyX2JvdW5kKSB7Ci0gICAgICAgICAgICAvLyBPdXQgb2YgcmFuZ2Ugb2YgcmVxdWVzdGVkIGJvdW5kcwotICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgICAgIEFMT0dWKCIlcyglcywlIiBQUklkTUFYICIpIC0gb3V0IG9mIHJhbmdlIiwgX19GVU5DVElPTl9fLCBrZXksIGRlZmF1bHRfdmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PSBidWYpIHsKLSAgICAgICAgICAgIC8vIE51bWVyaWMgY29udmVyc2lvbiBmYWlsZWQKLSAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRfdmFsdWU7Ci0gICAgICAgICAgICBBTE9HVigiJXMoJXMsJSIgUFJJZE1BWCAiKSAtIG51bWVyaWMgY29udmVyc2lvbiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGtleSwgZGVmYXVsdF92YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnJubyA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50NjRfdCBwcm9wZXJ0eV9nZXRfaW50NjQoY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IGRlZmF1bHRfdmFsdWUpIHsKLSAgICByZXR1cm4gKGludDY0X3QpcHJvcGVydHlfZ2V0X2ltYXgoa2V5LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgZGVmYXVsdF92YWx1ZSk7Ci19Ci0KIHZvaWQgbGltaXRQcm9jZXNzTWVtb3J5KAogICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5LAogICAgIHNpemVfdCBudW1iZXJPZkJ5dGVzLApAQCAtMTIxLDUgKzcxLDQgQEAKIAogfQogCi0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKaW5kZXggZjAwNGNhNC4uNjZmNzE2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwIGIvbWVkaWEvbGlibWVkaWEvU291bmRQb29sLmNwcAppbmRleCBhMmI1ZTMwLi4yOWFkN2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Tb3VuZFBvb2wuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1NvdW5kUG9vbC5jcHAKQEAgLTE2LDE0ICsxNiwxOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlNvdW5kUG9vbCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2RlZmluZSBVU0VfU0hBUkVEX01FTV9CVUZGRVIKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvU291bmRQb29sLmg+CiAjaW5jbHVkZSAiU291bmRQb29sVGhyZWFkLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKQEAgLTM1LDEwICs0MCwxMCBAQAogc2l6ZV90IGtEZWZhdWx0SGVhcFNpemUgPSAxMDI0ICogMTAyNDsgLy8gMU1CCiAKIAotU291bmRQb29sOjpTb3VuZFBvb2woaW50IG1heENoYW5uZWxzLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGludCBzcmNRdWFsaXR5KQorU291bmRQb29sOjpTb3VuZFBvb2woaW50IG1heENoYW5uZWxzLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQogewotICAgIEFMT0dWKCJTb3VuZFBvb2wgY29uc3RydWN0b3I6IG1heENoYW5uZWxzPSVkLCBzdHJlYW1UeXBlPSVkLCBzcmNRdWFsaXR5PSVkIiwKLSAgICAgICAgICAgIG1heENoYW5uZWxzLCBzdHJlYW1UeXBlLCBzcmNRdWFsaXR5KTsKKyAgICBBTE9HVigiU291bmRQb29sIGNvbnN0cnVjdG9yOiBtYXhDaGFubmVscz0lZCwgYXR0ci51c2FnZT0lZCwgYXR0ci5mbGFncz0weCV4LCBhdHRyLnRhZ3M9JXMiLAorICAgICAgICAgICAgbWF4Q2hhbm5lbHMsIHBBdHRyaWJ1dGVzLT51c2FnZSwgcEF0dHJpYnV0ZXMtPmZsYWdzLCBwQXR0cmlidXRlcy0+dGFncyk7CiAKICAgICAvLyBjaGVjayBsaW1pdHMKICAgICBtTWF4Q2hhbm5lbHMgPSBtYXhDaGFubmVsczsKQEAgLTUyLDggKzU3LDcgQEAKIAogICAgIG1RdWl0ID0gZmFsc2U7CiAgICAgbURlY29kZVRocmVhZCA9IDA7Ci0gICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1TcmNRdWFsaXR5ID0gc3JjUXVhbGl0eTsKKyAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgIG1BbGxvY2F0ZWQgPSAwOwogICAgIG1OZXh0U2FtcGxlSUQgPSAwOwogICAgIG1OZXh0Q2hhbm5lbElEID0gMDsKQEAgLTIxMCw3ICsyMTQsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1pbnQgU291bmRQb29sOjpsb2FkKGNvbnN0IGNoYXIqIHBhdGgsIGludCBwcmlvcml0eSkKK2ludCBTb3VuZFBvb2w6OmxvYWQoY29uc3QgY2hhciogcGF0aCwgaW50IHByaW9yaXR5IF9fdW51c2VkKQogewogICAgIEFMT0dWKCJsb2FkOiBwYXRoPSVzLCBwcmlvcml0eT0lZCIsIHBhdGgsIHByaW9yaXR5KTsKICAgICBpbnQgc2FtcGxlSUQ7CkBAIC0yMzAsOSArMjM0LDkgQEAKICAgICByZXR1cm4gc2FtcGxlSUQ7CiB9CiAKLWludCBTb3VuZFBvb2w6OmxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSkKK2ludCBTb3VuZFBvb2w6OmxvYWQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBwcmlvcml0eSBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigibG9hZDogZmQ9JWQsIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCwgcHJpb3JpdHk9JWQiLAorICAgIEFMT0dWKCJsb2FkOiBmZD0lZCwgb2Zmc2V0PSUiIFBSSWQ2NCAiLCBsZW5ndGg9JSIgUFJJZDY0ICIsIHByaW9yaXR5PSVkIiwKICAgICAgICAgICAgIGZkLCBvZmZzZXQsIGxlbmd0aCwgcHJpb3JpdHkpOwogICAgIGludCBzYW1wbGVJRDsKICAgICB7CkBAIC00ODQsNyArNDg4LDggQEAKICAgICBtRmQgPSBkdXAoZmQpOwogICAgIG1PZmZzZXQgPSBvZmZzZXQ7CiAgICAgbUxlbmd0aCA9IGxlbmd0aDsKLSAgICBBTE9HVigiY3JlYXRlIHNhbXBsZUlEPSVkLCBmZD0lZCwgb2Zmc2V0PSVsbGQsIGxlbmd0aD0lbGxkIiwgbVNhbXBsZUlELCBtRmQsIG1MZW5ndGgsIG1PZmZzZXQpOworICAgIEFMT0dWKCJjcmVhdGUgc2FtcGxlSUQ9JWQsIGZkPSVkLCBvZmZzZXQ9JSIgUFJJZDY0ICIgbGVuZ3RoPSUiIFBSSWQ2NCwKKyAgICAgICAgbVNhbXBsZUlELCBtRmQsIG1MZW5ndGgsIG1PZmZzZXQpOwogfQogCiB2b2lkIFNhbXBsZTo6aW5pdCgpCkBAIC01MTksNyArNTI0LDE0IEBACiAKICAgICBBTE9HVigiU3RhcnQgZGVjb2RlIik7CiAgICAgaWYgKG1VcmwpIHsKLSAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZShtVXJsLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmZm9ybWF0LCBtSGVhcCwgJm1TaXplKTsKKyAgICAgICAgc3RhdHVzID0gTWVkaWFQbGF5ZXI6OmRlY29kZSgKKyAgICAgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLAorICAgICAgICAgICAgICAgIG1VcmwsCisgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICZmb3JtYXQsCisgICAgICAgICAgICAgICAgbUhlYXAsCisgICAgICAgICAgICAgICAgJm1TaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBNZWRpYVBsYXllcjo6ZGVjb2RlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscywgJmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhcCwgJm1TaXplKTsKQEAgLTUzMSw3ICs1NDMsNyBAQAogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGxvYWQgc2FtcGxlOiAlcyIsIG1VcmwpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBBTE9HVigicG9pbnRlciA9ICVwLCBzaXplID0gJXUsIHNhbXBsZVJhdGUgPSAldSwgbnVtQ2hhbm5lbHMgPSAlZCIsCisgICAgQUxPR1YoInBvaW50ZXIgPSAlcCwgc2l6ZSA9ICV6dSwgc2FtcGxlUmF0ZSA9ICV1LCBudW1DaGFubmVscyA9ICVkIiwKICAgICAgICAgICBtSGVhcC0+Z2V0QmFzZSgpLCBtU2l6ZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogCiAgICAgaWYgKHNhbXBsZVJhdGUgPiBrTWF4U2FtcGxlUmF0ZSkgewpAQCAtNTkxLDcgKzYwMyw3IEBACiAgICAgICAgIC8vIGluaXRpYWxpemUgdHJhY2sKICAgICAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU291bmRQb29sLT5zdHJlYW1UeXBlKCk7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUobVNvdW5kUG9vbC0+YXR0cmlidXRlcygpKTsKICAgICAgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBhZkZyYW1lQ291bnQgPSBrRGVmYXVsdEZyYW1lQ291bnQ7CiAgICAgICAgIH0KQEAgLTYwMiw3ICs2MTQsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gdWludDMyX3QoZmxvYXQoc2FtcGxlLT5zYW1wbGVSYXRlKCkpICogcmF0ZSArIDAuNSk7CiAgICAgICAgIHVpbnQzMl90IHRvdGFsRnJhbWVzID0gKGtEZWZhdWx0QnVmZmVyQ291bnQgKiBhZkZyYW1lQ291bnQgKiBzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKICAgICAgICAgdWludDMyX3QgYnVmZmVyRnJhbWVzID0gKHRvdGFsRnJhbWVzICsgKGtEZWZhdWx0QnVmZmVyQ291bnQgLSAxKSkgLyBrRGVmYXVsdEJ1ZmZlckNvdW50OwotICAgICAgICB1aW50MzJfdCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOwogCiAgICAgICAgIGlmIChsb29wKSB7CiAgICAgICAgICAgICBmcmFtZUNvdW50ID0gc2FtcGxlLT5zaXplKCkvbnVtQ2hhbm5lbHMvCkBAIC02MjMsMTYgKzYzNSwxNSBAQAogICAgICAgICAvLyB3cm9uZyBhdWRpbyBhdWRpbyBidWZmZXIgc2l6ZSAgKG1BdWRpb0J1ZmZlclNpemUpCiAgICAgICAgIHVuc2lnbmVkIGxvbmcgdG9nZ2xlID0gbVRvZ2dsZSBeIDE7CiAgICAgICAgIHZvaWQgKnVzZXJEYXRhID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGhpcyB8IHRvZ2dsZSk7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gKG51bUNoYW5uZWxzID09IDIpID8KLSAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gOiBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChudW1DaGFubmVscyk7CiAKICAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBhdWRpbyB0cmFjayBpZiBjdXJyZW50IHRyYWNrIGlzIGNvbXBhdGlibGUgd2l0aCBzYW1wbGUgcGFyYW1ldGVycwogI2lmZGVmIFVTRV9TSEFSRURfTUVNX0JVRkZFUgogICAgICAgICBuZXdUcmFjayA9IG5ldyBBdWRpb1RyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIHNhbXBsZS0+Zm9ybWF0KCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbHMsIHNhbXBsZS0+Z2V0SU1lbW9yeSgpLCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBzYW1wbGUtPmdldElNZW1vcnkoKSwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhKTsKICNlbHNlCiAgICAgICAgIG5ld1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgc2FtcGxlLT5mb3JtYXQoKSwKLSAgICAgICAgICAgICAgICBjaGFubmVscywgZnJhbWVDb3VudCwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCwgY2FsbGJhY2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBBVURJT19PVVRQVVRfRkxBR19GQVNULCBjYWxsYmFjaywgdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVzKTsKICNlbmRpZgogICAgICAgICBvbGRUcmFjayA9IG1BdWRpb1RyYWNrOwpAQCAtNzUzLDcgKzc2NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gYi0+c2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHAsIGNvdW50KTsKLS8vICAgICAgICAgICAgICBBTE9HVigiZmlsbDogcT0lcCwgcD0lcCwgbVBvcz0ldSwgYi0+c2l6ZT0ldSwgY291bnQ9JWQiLCBxLCBwLCBtUG9zLCBiLT5zaXplLCBjb3VudCk7CisvLyAgICAgICAgICAgICAgQUxPR1YoImZpbGw6IHE9JXAsIHA9JXAsIG1Qb3M9JXUsIGItPnNpemU9JXUsIGNvdW50PSVkIiwgcSwgcCwgbVBvcywgYi0+c2l6ZSwKKy8vICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBvcyA8IG1BdWRpb0J1ZmZlclNpemUpIHsKICAgICAgICAgICAgICAgICBjb3VudCA9IG1BdWRpb0J1ZmZlclNpemUgLSBtUG9zOwogICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IGItPnNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggYWRlZjNiZS4uNjFiNmQzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gbm90aWZpY2F0aW9uRnJhbWVzCiAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgLy8gc2hhcmVkQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhLAotICAgICAgICAgICAgICAgICAgICAgIDAsICAgIC8vIHNlc3Npb25JZAorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0spOwogCiAgICAgaWYgKG1wQXVkaW9UcmFjay0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2F1dG9kZXRlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWMzYjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJhdXRvZGV0ZWN0LmgiCi0KLXN0cnVjdCBDaGFyUmFuZ2UgewotICAgIHVpbnQxNl90IGZpcnN0OwotICAgIHVpbnQxNl90IGxhc3Q7Ci19OwotCi0jZGVmaW5lIEFSUkFZX1NJWkUoeCkgICAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCp4KSkKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTMyLlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrU2hpZnRKSVNSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MCwgMHg4MTdFIH0sCi0gICAgeyAweDgxODAsIDB4ODFBQyB9LAotICAgIHsgMHg4MUI4LCAweDgxQkYgfSwKLSAgICB7IDB4ODFDOCwgMHg4MUNFIH0sCi0gICAgeyAweDgxREEsIDB4ODFFOCB9LAotICAgIHsgMHg4MUYwLCAweDgxRjcgfSwKLSAgICB7IDB4ODFGQywgMHg4MUZDIH0sCi0gICAgeyAweDgyNEYsIDB4ODI1OCB9LAotICAgIHsgMHg4MjYwLCAweDgyNzkgfSwKLSAgICB7IDB4ODI4MSwgMHg4MjlBIH0sCi0gICAgeyAweDgyOUYsIDB4ODJGMSB9LAotICAgIHsgMHg4MzQwLCAweDgzN0UgfSwKLSAgICB7IDB4ODM4MCwgMHg4Mzk2IH0sCi0gICAgeyAweDgzOUYsIDB4ODNCNiB9LAotICAgIHsgMHg4M0JGLCAweDgzRDYgfSwKLSAgICB7IDB4ODQ0MCwgMHg4NDYwIH0sCi0gICAgeyAweDg0NzAsIDB4ODQ3RSB9LAotICAgIHsgMHg4NDgwLCAweDg0OTEgfSwKLSAgICB7IDB4ODQ5RiwgMHg4NEJFIH0sCi0gICAgeyAweDg3NDAsIDB4ODc1RCB9LAotICAgIHsgMHg4NzVGLCAweDg3NzUgfSwKLSAgICB7IDB4ODc3RSwgMHg4NzdFIH0sCi0gICAgeyAweDg3ODAsIDB4ODc5QyB9LAotICAgIHsgMHg4ODlGLCAweDg4RkMgfSwKLSAgICB7IDB4ODk0MCwgMHg4OTdFIH0sCi0gICAgeyAweDg5ODAsIDB4ODlGQyB9LAotICAgIHsgMHg4QTQwLCAweDhBN0UgfSwKLSAgICB7IDB4OEE4MCwgMHg4QUZDIH0sCi0gICAgeyAweDhCNDAsIDB4OEI3RSB9LAotICAgIHsgMHg4QjgwLCAweDhCRkMgfSwKLSAgICB7IDB4OEM0MCwgMHg4QzdFIH0sCi0gICAgeyAweDhDODAsIDB4OENGQyB9LAotICAgIHsgMHg4RDQwLCAweDhEN0UgfSwKLSAgICB7IDB4OEQ4MCwgMHg4REZDIH0sCi0gICAgeyAweDhFNDAsIDB4OEU3RSB9LAotICAgIHsgMHg4RTgwLCAweDhFRkMgfSwKLSAgICB7IDB4OEY0MCwgMHg4RjdFIH0sCi0gICAgeyAweDhGODAsIDB4OEZGQyB9LAotICAgIHsgMHg5MDQwLCAweDkwN0UgfSwKLSAgICB7IDB4OTA4MCwgMHg5MEZDIH0sCi0gICAgeyAweDkxNDAsIDB4OTE3RSB9LAotICAgIHsgMHg5MTgwLCAweDkxRkMgfSwKLSAgICB7IDB4OTI0MCwgMHg5MjdFIH0sCi0gICAgeyAweDkyODAsIDB4OTJGQyB9LAotICAgIHsgMHg5MzQwLCAweDkzN0UgfSwKLSAgICB7IDB4OTM4MCwgMHg5M0ZDIH0sCi0gICAgeyAweDk0NDAsIDB4OTQ3RSB9LAotICAgIHsgMHg5NDgwLCAweDk0RkMgfSwKLSAgICB7IDB4OTU0MCwgMHg5NTdFIH0sCi0gICAgeyAweDk1ODAsIDB4OTVGQyB9LAotICAgIHsgMHg5NjQwLCAweDk2N0UgfSwKLSAgICB7IDB4OTY4MCwgMHg5NkZDIH0sCi0gICAgeyAweDk3NDAsIDB4OTc3RSB9LAotICAgIHsgMHg5NzgwLCAweDk3RkMgfSwKLSAgICB7IDB4OTg0MCwgMHg5ODcyIH0sCi0gICAgeyAweDk4OUYsIDB4OThGQyB9LAotICAgIHsgMHg5OTQwLCAweDk5N0UgfSwKLSAgICB7IDB4OTk4MCwgMHg5OUZDIH0sCi0gICAgeyAweDlBNDAsIDB4OUE3RSB9LAotICAgIHsgMHg5QTgwLCAweDlBRkMgfSwKLSAgICB7IDB4OUI0MCwgMHg5QjdFIH0sCi0gICAgeyAweDlCODAsIDB4OUJGQyB9LAotICAgIHsgMHg5QzQwLCAweDlDN0UgfSwKLSAgICB7IDB4OUM4MCwgMHg5Q0ZDIH0sCi0gICAgeyAweDlENDAsIDB4OUQ3RSB9LAotICAgIHsgMHg5RDgwLCAweDlERkMgfSwKLSAgICB7IDB4OUU0MCwgMHg5RTdFIH0sCi0gICAgeyAweDlFODAsIDB4OUVGQyB9LAotICAgIHsgMHg5RjQwLCAweDlGN0UgfSwKLSAgICB7IDB4OUY4MCwgMHg5RkZDIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMDgwLCAweEUwRkMgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxODAsIDB4RTFGQyB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTI4MCwgMHhFMkZDIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFMzgwLCAweEUzRkMgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0ODAsIDB4RTRGQyB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTU4MCwgMHhFNUZDIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNjgwLCAweEU2RkMgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3ODAsIDB4RTdGQyB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RTg4MCwgMHhFOEZDIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOTgwLCAweEU5RkMgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBODAsIDB4RUFBNCB9LAotICAgIHsgMHhFRDQwLCAweEVEN0UgfSwKLSAgICB7IDB4RUQ4MCwgMHhFREZDIH0sCi0gICAgeyAweEVFNDAsIDB4RUU3RSB9LAotICAgIHsgMHhFRTgwLCAweEVFRUMgfSwKLSAgICB7IDB4RUVFRiwgMHhFRUZDIH0sCi0gICAgeyAweEZBNDAsIDB4RkE3RSB9LAotICAgIHsgMHhGQTgwLCAweEZBRkMgfSwKLSAgICB7IDB4RkI0MCwgMHhGQjdFIH0sCi0gICAgeyAweEZCODAsIDB4RkJGQyB9LAotICAgIHsgMHhGQzQwLCAweEZDNEIgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDkzNi5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0dCS1Jhbmdlc1tdID0gewotICAgIHsgMHg4MTQwLCAweDgxN0UgfSwKLSAgICB7IDB4ODE4MCwgMHg4MUZFIH0sCi0gICAgeyAweDgyNDAsIDB4ODI3RSB9LAotICAgIHsgMHg4MjgwLCAweDgyRkUgfSwKLSAgICB7IDB4ODM0MCwgMHg4MzdFIH0sCi0gICAgeyAweDgzODAsIDB4ODNGRSB9LAotICAgIHsgMHg4NDQwLCAweDg0N0UgfSwKLSAgICB7IDB4ODQ4MCwgMHg4NEZFIH0sCi0gICAgeyAweDg1NDAsIDB4ODU3RSB9LAotICAgIHsgMHg4NTgwLCAweDg1RkUgfSwKLSAgICB7IDB4ODY0MCwgMHg4NjdFIH0sCi0gICAgeyAweDg2ODAsIDB4ODZGRSB9LAotICAgIHsgMHg4NzQwLCAweDg3N0UgfSwKLSAgICB7IDB4ODc4MCwgMHg4N0ZFIH0sCi0gICAgeyAweDg4NDAsIDB4ODg3RSB9LAotICAgIHsgMHg4ODgwLCAweDg4RkUgfSwKLSAgICB7IDB4ODk0MCwgMHg4OTdFIH0sCi0gICAgeyAweDg5ODAsIDB4ODlGRSB9LAotICAgIHsgMHg4QTQwLCAweDhBN0UgfSwKLSAgICB7IDB4OEE4MCwgMHg4QUZFIH0sCi0gICAgeyAweDhCNDAsIDB4OEI3RSB9LAotICAgIHsgMHg4QjgwLCAweDhCRkUgfSwKLSAgICB7IDB4OEM0MCwgMHg4QzdFIH0sCi0gICAgeyAweDhDODAsIDB4OENGRSB9LAotICAgIHsgMHg4RDQwLCAweDhEN0UgfSwKLSAgICB7IDB4OEQ4MCwgMHg4REZFIH0sCi0gICAgeyAweDhFNDAsIDB4OEU3RSB9LAotICAgIHsgMHg4RTgwLCAweDhFRkUgfSwKLSAgICB7IDB4OEY0MCwgMHg4RjdFIH0sCi0gICAgeyAweDhGODAsIDB4OEZGRSB9LAotICAgIHsgMHg5MDQwLCAweDkwN0UgfSwKLSAgICB7IDB4OTA4MCwgMHg5MEZFIH0sCi0gICAgeyAweDkxNDAsIDB4OTE3RSB9LAotICAgIHsgMHg5MTgwLCAweDkxRkUgfSwKLSAgICB7IDB4OTI0MCwgMHg5MjdFIH0sCi0gICAgeyAweDkyODAsIDB4OTJGRSB9LAotICAgIHsgMHg5MzQwLCAweDkzN0UgfSwKLSAgICB7IDB4OTM4MCwgMHg5M0ZFIH0sCi0gICAgeyAweDk0NDAsIDB4OTQ3RSB9LAotICAgIHsgMHg5NDgwLCAweDk0RkUgfSwKLSAgICB7IDB4OTU0MCwgMHg5NTdFIH0sCi0gICAgeyAweDk1ODAsIDB4OTVGRSB9LAotICAgIHsgMHg5NjQwLCAweDk2N0UgfSwKLSAgICB7IDB4OTY4MCwgMHg5NkZFIH0sCi0gICAgeyAweDk3NDAsIDB4OTc3RSB9LAotICAgIHsgMHg5NzgwLCAweDk3RkUgfSwKLSAgICB7IDB4OTg0MCwgMHg5ODdFIH0sCi0gICAgeyAweDk4ODAsIDB4OThGRSB9LAotICAgIHsgMHg5OTQwLCAweDk5N0UgfSwKLSAgICB7IDB4OTk4MCwgMHg5OUZFIH0sCi0gICAgeyAweDlBNDAsIDB4OUE3RSB9LAotICAgIHsgMHg5QTgwLCAweDlBRkUgfSwKLSAgICB7IDB4OUI0MCwgMHg5QjdFIH0sCi0gICAgeyAweDlCODAsIDB4OUJGRSB9LAotICAgIHsgMHg5QzQwLCAweDlDN0UgfSwKLSAgICB7IDB4OUM4MCwgMHg5Q0ZFIH0sCi0gICAgeyAweDlENDAsIDB4OUQ3RSB9LAotICAgIHsgMHg5RDgwLCAweDlERkUgfSwKLSAgICB7IDB4OUU0MCwgMHg5RTdFIH0sCi0gICAgeyAweDlFODAsIDB4OUVGRSB9LAotICAgIHsgMHg5RjQwLCAweDlGN0UgfSwKLSAgICB7IDB4OUY4MCwgMHg5RkZFIH0sCi0gICAgeyAweEEwNDAsIDB4QTA3RSB9LAotICAgIHsgMHhBMDgwLCAweEEwRkUgfSwKLSAgICB7IDB4QTFBMSwgMHhBMUZFIH0sCi0gICAgeyAweEEyQTEsIDB4QTJBQSB9LAotICAgIHsgMHhBMkIxLCAweEEyRTIgfSwKLSAgICB7IDB4QTJFNSwgMHhBMkVFIH0sCi0gICAgeyAweEEyRjEsIDB4QTJGQyB9LAotICAgIHsgMHhBM0ExLCAweEEzRkUgfSwKLSAgICB7IDB4QTRBMSwgMHhBNEYzIH0sCi0gICAgeyAweEE1QTEsIDB4QTVGNiB9LAotICAgIHsgMHhBNkExLCAweEE2QjggfSwKLSAgICB7IDB4QTZDMSwgMHhBNkQ4IH0sCi0gICAgeyAweEE2RTAsIDB4QTZFQiB9LAotICAgIHsgMHhBNkVFLCAweEE2RjIgfSwKLSAgICB7IDB4QTZGNCwgMHhBNkY1IH0sCi0gICAgeyAweEE3QTEsIDB4QTdDMSB9LAotICAgIHsgMHhBN0QxLCAweEE3RjEgfSwKLSAgICB7IDB4QTg0MCwgMHhBODdFIH0sCi0gICAgeyAweEE4ODAsIDB4QTg5NSB9LAotICAgIHsgMHhBOEExLCAweEE4QkIgfSwKLSAgICB7IDB4QThCRCwgMHhBOEJFIH0sCi0gICAgeyAweEE4QzAsIDB4QThDMCB9LAotICAgIHsgMHhBOEM1LCAweEE4RTkgfSwKLSAgICB7IDB4QTk0MCwgMHhBOTU3IH0sCi0gICAgeyAweEE5NTksIDB4QTk1QSB9LAotICAgIHsgMHhBOTVDLCAweEE5NUMgfSwKLSAgICB7IDB4QTk2MCwgMHhBOTdFIH0sCi0gICAgeyAweEE5ODAsIDB4QTk4OCB9LAotICAgIHsgMHhBOTk2LCAweEE5OTYgfSwKLSAgICB7IDB4QTlBNCwgMHhBOUVGIH0sCi0gICAgeyAweEFBNDAsIDB4QUE3RSB9LAotICAgIHsgMHhBQTgwLCAweEFBQTAgfSwKLSAgICB7IDB4QUI0MCwgMHhBQjdFIH0sCi0gICAgeyAweEFCODAsIDB4QUJBMCB9LAotICAgIHsgMHhBQzQwLCAweEFDN0UgfSwKLSAgICB7IDB4QUM4MCwgMHhBQ0EwIH0sCi0gICAgeyAweEFENDAsIDB4QUQ3RSB9LAotICAgIHsgMHhBRDgwLCAweEFEQTAgfSwKLSAgICB7IDB4QUU0MCwgMHhBRTdFIH0sCi0gICAgeyAweEFFODAsIDB4QUVBMCB9LAotICAgIHsgMHhBRjQwLCAweEFGN0UgfSwKLSAgICB7IDB4QUY4MCwgMHhBRkEwIH0sCi0gICAgeyAweEIwNDAsIDB4QjA3RSB9LAotICAgIHsgMHhCMDgwLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MCwgMHhCMTdFIH0sCi0gICAgeyAweEIxODAsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQwLCAweEIyN0UgfSwKLSAgICB7IDB4QjI4MCwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDAsIDB4QjM3RSB9LAotICAgIHsgMHhCMzgwLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MCwgMHhCNDdFIH0sCi0gICAgeyAweEI0ODAsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQwLCAweEI1N0UgfSwKLSAgICB7IDB4QjU4MCwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDAsIDB4QjY3RSB9LAotICAgIHsgMHhCNjgwLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MCwgMHhCNzdFIH0sCi0gICAgeyAweEI3ODAsIDB4QjdGRSB9LAotICAgIHsgMHhCODQwLCAweEI4N0UgfSwKLSAgICB7IDB4Qjg4MCwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDAsIDB4Qjk3RSB9LAotICAgIHsgMHhCOTgwLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MCwgMHhCQTdFIH0sCi0gICAgeyAweEJBODAsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQwLCAweEJCN0UgfSwKLSAgICB7IDB4QkI4MCwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDAsIDB4QkM3RSB9LAotICAgIHsgMHhCQzgwLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MCwgMHhCRDdFIH0sCi0gICAgeyAweEJEODAsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQwLCAweEJFN0UgfSwKLSAgICB7IDB4QkU4MCwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDAsIDB4QkY3RSB9LAotICAgIHsgMHhCRjgwLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MCwgMHhDMDdFIH0sCi0gICAgeyAweEMwODAsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQwLCAweEMxN0UgfSwKLSAgICB7IDB4QzE4MCwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDAsIDB4QzI3RSB9LAotICAgIHsgMHhDMjgwLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MCwgMHhDMzdFIH0sCi0gICAgeyAweEMzODAsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQwLCAweEM0N0UgfSwKLSAgICB7IDB4QzQ4MCwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDAsIDB4QzU3RSB9LAotICAgIHsgMHhDNTgwLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MCwgMHhDNjdFIH0sCi0gICAgeyAweEM2ODAsIDB4QzZGRSB9LAotICAgIHsgMHhDNzQwLCAweEM3N0UgfSwKLSAgICB7IDB4Qzc4MCwgMHhDN0ZFIH0sCi0gICAgeyAweEM4NDAsIDB4Qzg3RSB9LAotICAgIHsgMHhDODgwLCAweEM4RkUgfSwKLSAgICB7IDB4Qzk0MCwgMHhDOTdFIH0sCi0gICAgeyAweEM5ODAsIDB4QzlGRSB9LAotICAgIHsgMHhDQTQwLCAweENBN0UgfSwKLSAgICB7IDB4Q0E4MCwgMHhDQUZFIH0sCi0gICAgeyAweENCNDAsIDB4Q0I3RSB9LAotICAgIHsgMHhDQjgwLCAweENCRkUgfSwKLSAgICB7IDB4Q0M0MCwgMHhDQzdFIH0sCi0gICAgeyAweENDODAsIDB4Q0NGRSB9LAotICAgIHsgMHhDRDQwLCAweENEN0UgfSwKLSAgICB7IDB4Q0Q4MCwgMHhDREZFIH0sCi0gICAgeyAweENFNDAsIDB4Q0U3RSB9LAotICAgIHsgMHhDRTgwLCAweENFRkUgfSwKLSAgICB7IDB4Q0Y0MCwgMHhDRjdFIH0sCi0gICAgeyAweENGODAsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMDQwLCAweEQwN0UgfSwKLSAgICB7IDB4RDA4MCwgMHhEMEZFIH0sCi0gICAgeyAweEQxNDAsIDB4RDE3RSB9LAotICAgIHsgMHhEMTgwLCAweEQxRkUgfSwKLSAgICB7IDB4RDI0MCwgMHhEMjdFIH0sCi0gICAgeyAweEQyODAsIDB4RDJGRSB9LAotICAgIHsgMHhEMzQwLCAweEQzN0UgfSwKLSAgICB7IDB4RDM4MCwgMHhEM0ZFIH0sCi0gICAgeyAweEQ0NDAsIDB4RDQ3RSB9LAotICAgIHsgMHhENDgwLCAweEQ0RkUgfSwKLSAgICB7IDB4RDU0MCwgMHhENTdFIH0sCi0gICAgeyAweEQ1ODAsIDB4RDVGRSB9LAotICAgIHsgMHhENjQwLCAweEQ2N0UgfSwKLSAgICB7IDB4RDY4MCwgMHhENkZFIH0sCi0gICAgeyAweEQ3NDAsIDB4RDc3RSB9LAotICAgIHsgMHhENzgwLCAweEQ3RjkgfSwKLSAgICB7IDB4RDg0MCwgMHhEODdFIH0sCi0gICAgeyAweEQ4ODAsIDB4RDhGRSB9LAotICAgIHsgMHhEOTQwLCAweEQ5N0UgfSwKLSAgICB7IDB4RDk4MCwgMHhEOUZFIH0sCi0gICAgeyAweERBNDAsIDB4REE3RSB9LAotICAgIHsgMHhEQTgwLCAweERBRkUgfSwKLSAgICB7IDB4REI0MCwgMHhEQjdFIH0sCi0gICAgeyAweERCODAsIDB4REJGRSB9LAotICAgIHsgMHhEQzQwLCAweERDN0UgfSwKLSAgICB7IDB4REM4MCwgMHhEQ0ZFIH0sCi0gICAgeyAweERENDAsIDB4REQ3RSB9LAotICAgIHsgMHhERDgwLCAweERERkUgfSwKLSAgICB7IDB4REU0MCwgMHhERTdFIH0sCi0gICAgeyAweERFODAsIDB4REVGRSB9LAotICAgIHsgMHhERjQwLCAweERGN0UgfSwKLSAgICB7IDB4REY4MCwgMHhERkZFIH0sCi0gICAgeyAweEUwNDAsIDB4RTA3RSB9LAotICAgIHsgMHhFMDgwLCAweEUwRkUgfSwKLSAgICB7IDB4RTE0MCwgMHhFMTdFIH0sCi0gICAgeyAweEUxODAsIDB4RTFGRSB9LAotICAgIHsgMHhFMjQwLCAweEUyN0UgfSwKLSAgICB7IDB4RTI4MCwgMHhFMkZFIH0sCi0gICAgeyAweEUzNDAsIDB4RTM3RSB9LAotICAgIHsgMHhFMzgwLCAweEUzRkUgfSwKLSAgICB7IDB4RTQ0MCwgMHhFNDdFIH0sCi0gICAgeyAweEU0ODAsIDB4RTRGRSB9LAotICAgIHsgMHhFNTQwLCAweEU1N0UgfSwKLSAgICB7IDB4RTU4MCwgMHhFNUZFIH0sCi0gICAgeyAweEU2NDAsIDB4RTY3RSB9LAotICAgIHsgMHhFNjgwLCAweEU2RkUgfSwKLSAgICB7IDB4RTc0MCwgMHhFNzdFIH0sCi0gICAgeyAweEU3ODAsIDB4RTdGRSB9LAotICAgIHsgMHhFODQwLCAweEU4N0UgfSwKLSAgICB7IDB4RTg4MCwgMHhFOEZFIH0sCi0gICAgeyAweEU5NDAsIDB4RTk3RSB9LAotICAgIHsgMHhFOTgwLCAweEU5RkUgfSwKLSAgICB7IDB4RUE0MCwgMHhFQTdFIH0sCi0gICAgeyAweEVBODAsIDB4RUFGRSB9LAotICAgIHsgMHhFQjQwLCAweEVCN0UgfSwKLSAgICB7IDB4RUI4MCwgMHhFQkZFIH0sCi0gICAgeyAweEVDNDAsIDB4RUM3RSB9LAotICAgIHsgMHhFQzgwLCAweEVDRkUgfSwKLSAgICB7IDB4RUQ0MCwgMHhFRDdFIH0sCi0gICAgeyAweEVEODAsIDB4RURGRSB9LAotICAgIHsgMHhFRTQwLCAweEVFN0UgfSwKLSAgICB7IDB4RUU4MCwgMHhFRUZFIH0sCi0gICAgeyAweEVGNDAsIDB4RUY3RSB9LAotICAgIHsgMHhFRjgwLCAweEVGRkUgfSwKLSAgICB7IDB4RjA0MCwgMHhGMDdFIH0sCi0gICAgeyAweEYwODAsIDB4RjBGRSB9LAotICAgIHsgMHhGMTQwLCAweEYxN0UgfSwKLSAgICB7IDB4RjE4MCwgMHhGMUZFIH0sCi0gICAgeyAweEYyNDAsIDB4RjI3RSB9LAotICAgIHsgMHhGMjgwLCAweEYyRkUgfSwKLSAgICB7IDB4RjM0MCwgMHhGMzdFIH0sCi0gICAgeyAweEYzODAsIDB4RjNGRSB9LAotICAgIHsgMHhGNDQwLCAweEY0N0UgfSwKLSAgICB7IDB4RjQ4MCwgMHhGNEZFIH0sCi0gICAgeyAweEY1NDAsIDB4RjU3RSB9LAotICAgIHsgMHhGNTgwLCAweEY1RkUgfSwKLSAgICB7IDB4RjY0MCwgMHhGNjdFIH0sCi0gICAgeyAweEY2ODAsIDB4RjZGRSB9LAotICAgIHsgMHhGNzQwLCAweEY3N0UgfSwKLSAgICB7IDB4Rjc4MCwgMHhGN0ZFIH0sCi0gICAgeyAweEY4NDAsIDB4Rjg3RSB9LAotICAgIHsgMHhGODgwLCAweEY4QTAgfSwKLSAgICB7IDB4Rjk0MCwgMHhGOTdFIH0sCi0gICAgeyAweEY5ODAsIDB4RjlBMCB9LAotICAgIHsgMHhGQTQwLCAweEZBN0UgfSwKLSAgICB7IDB4RkE4MCwgMHhGQUEwIH0sCi0gICAgeyAweEZCNDAsIDB4RkI3RSB9LAotICAgIHsgMHhGQjgwLCAweEZCQTAgfSwKLSAgICB7IDB4RkM0MCwgMHhGQzdFIH0sCi0gICAgeyAweEZDODAsIDB4RkNBMCB9LAotICAgIHsgMHhGRDQwLCAweEZEN0UgfSwKLSAgICB7IDB4RkQ4MCwgMHhGREEwIH0sCi0gICAgeyAweEZFNDAsIDB4RkU0RiB9LAotfTsKLQotLy8gZ2VuZXJhdGVkIGZyb20gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTQ5LlRYVAotc3RhdGljIGNvbnN0IENoYXJSYW5nZSBrRVVDS1JSYW5nZXNbXSA9IHsKLSAgICB7IDB4ODE0MSwgMHg4MTVBIH0sCi0gICAgeyAweDgxNjEsIDB4ODE3QSB9LAotICAgIHsgMHg4MTgxLCAweDgxRkUgfSwKLSAgICB7IDB4ODI0MSwgMHg4MjVBIH0sCi0gICAgeyAweDgyNjEsIDB4ODI3QSB9LAotICAgIHsgMHg4MjgxLCAweDgyRkUgfSwKLSAgICB7IDB4ODM0MSwgMHg4MzVBIH0sCi0gICAgeyAweDgzNjEsIDB4ODM3QSB9LAotICAgIHsgMHg4MzgxLCAweDgzRkUgfSwKLSAgICB7IDB4ODQ0MSwgMHg4NDVBIH0sCi0gICAgeyAweDg0NjEsIDB4ODQ3QSB9LAotICAgIHsgMHg4NDgxLCAweDg0RkUgfSwKLSAgICB7IDB4ODU0MSwgMHg4NTVBIH0sCi0gICAgeyAweDg1NjEsIDB4ODU3QSB9LAotICAgIHsgMHg4NTgxLCAweDg1RkUgfSwKLSAgICB7IDB4ODY0MSwgMHg4NjVBIH0sCi0gICAgeyAweDg2NjEsIDB4ODY3QSB9LAotICAgIHsgMHg4NjgxLCAweDg2RkUgfSwKLSAgICB7IDB4ODc0MSwgMHg4NzVBIH0sCi0gICAgeyAweDg3NjEsIDB4ODc3QSB9LAotICAgIHsgMHg4NzgxLCAweDg3RkUgfSwKLSAgICB7IDB4ODg0MSwgMHg4ODVBIH0sCi0gICAgeyAweDg4NjEsIDB4ODg3QSB9LAotICAgIHsgMHg4ODgxLCAweDg4RkUgfSwKLSAgICB7IDB4ODk0MSwgMHg4OTVBIH0sCi0gICAgeyAweDg5NjEsIDB4ODk3QSB9LAotICAgIHsgMHg4OTgxLCAweDg5RkUgfSwKLSAgICB7IDB4OEE0MSwgMHg4QTVBIH0sCi0gICAgeyAweDhBNjEsIDB4OEE3QSB9LAotICAgIHsgMHg4QTgxLCAweDhBRkUgfSwKLSAgICB7IDB4OEI0MSwgMHg4QjVBIH0sCi0gICAgeyAweDhCNjEsIDB4OEI3QSB9LAotICAgIHsgMHg4QjgxLCAweDhCRkUgfSwKLSAgICB7IDB4OEM0MSwgMHg4QzVBIH0sCi0gICAgeyAweDhDNjEsIDB4OEM3QSB9LAotICAgIHsgMHg4QzgxLCAweDhDRkUgfSwKLSAgICB7IDB4OEQ0MSwgMHg4RDVBIH0sCi0gICAgeyAweDhENjEsIDB4OEQ3QSB9LAotICAgIHsgMHg4RDgxLCAweDhERkUgfSwKLSAgICB7IDB4OEU0MSwgMHg4RTVBIH0sCi0gICAgeyAweDhFNjEsIDB4OEU3QSB9LAotICAgIHsgMHg4RTgxLCAweDhFRkUgfSwKLSAgICB7IDB4OEY0MSwgMHg4RjVBIH0sCi0gICAgeyAweDhGNjEsIDB4OEY3QSB9LAotICAgIHsgMHg4RjgxLCAweDhGRkUgfSwKLSAgICB7IDB4OTA0MSwgMHg5MDVBIH0sCi0gICAgeyAweDkwNjEsIDB4OTA3QSB9LAotICAgIHsgMHg5MDgxLCAweDkwRkUgfSwKLSAgICB7IDB4OTE0MSwgMHg5MTVBIH0sCi0gICAgeyAweDkxNjEsIDB4OTE3QSB9LAotICAgIHsgMHg5MTgxLCAweDkxRkUgfSwKLSAgICB7IDB4OTI0MSwgMHg5MjVBIH0sCi0gICAgeyAweDkyNjEsIDB4OTI3QSB9LAotICAgIHsgMHg5MjgxLCAweDkyRkUgfSwKLSAgICB7IDB4OTM0MSwgMHg5MzVBIH0sCi0gICAgeyAweDkzNjEsIDB4OTM3QSB9LAotICAgIHsgMHg5MzgxLCAweDkzRkUgfSwKLSAgICB7IDB4OTQ0MSwgMHg5NDVBIH0sCi0gICAgeyAweDk0NjEsIDB4OTQ3QSB9LAotICAgIHsgMHg5NDgxLCAweDk0RkUgfSwKLSAgICB7IDB4OTU0MSwgMHg5NTVBIH0sCi0gICAgeyAweDk1NjEsIDB4OTU3QSB9LAotICAgIHsgMHg5NTgxLCAweDk1RkUgfSwKLSAgICB7IDB4OTY0MSwgMHg5NjVBIH0sCi0gICAgeyAweDk2NjEsIDB4OTY3QSB9LAotICAgIHsgMHg5NjgxLCAweDk2RkUgfSwKLSAgICB7IDB4OTc0MSwgMHg5NzVBIH0sCi0gICAgeyAweDk3NjEsIDB4OTc3QSB9LAotICAgIHsgMHg5NzgxLCAweDk3RkUgfSwKLSAgICB7IDB4OTg0MSwgMHg5ODVBIH0sCi0gICAgeyAweDk4NjEsIDB4OTg3QSB9LAotICAgIHsgMHg5ODgxLCAweDk4RkUgfSwKLSAgICB7IDB4OTk0MSwgMHg5OTVBIH0sCi0gICAgeyAweDk5NjEsIDB4OTk3QSB9LAotICAgIHsgMHg5OTgxLCAweDk5RkUgfSwKLSAgICB7IDB4OUE0MSwgMHg5QTVBIH0sCi0gICAgeyAweDlBNjEsIDB4OUE3QSB9LAotICAgIHsgMHg5QTgxLCAweDlBRkUgfSwKLSAgICB7IDB4OUI0MSwgMHg5QjVBIH0sCi0gICAgeyAweDlCNjEsIDB4OUI3QSB9LAotICAgIHsgMHg5QjgxLCAweDlCRkUgfSwKLSAgICB7IDB4OUM0MSwgMHg5QzVBIH0sCi0gICAgeyAweDlDNjEsIDB4OUM3QSB9LAotICAgIHsgMHg5QzgxLCAweDlDRkUgfSwKLSAgICB7IDB4OUQ0MSwgMHg5RDVBIH0sCi0gICAgeyAweDlENjEsIDB4OUQ3QSB9LAotICAgIHsgMHg5RDgxLCAweDlERkUgfSwKLSAgICB7IDB4OUU0MSwgMHg5RTVBIH0sCi0gICAgeyAweDlFNjEsIDB4OUU3QSB9LAotICAgIHsgMHg5RTgxLCAweDlFRkUgfSwKLSAgICB7IDB4OUY0MSwgMHg5RjVBIH0sCi0gICAgeyAweDlGNjEsIDB4OUY3QSB9LAotICAgIHsgMHg5RjgxLCAweDlGRkUgfSwKLSAgICB7IDB4QTA0MSwgMHhBMDVBIH0sCi0gICAgeyAweEEwNjEsIDB4QTA3QSB9LAotICAgIHsgMHhBMDgxLCAweEEwRkUgfSwKLSAgICB7IDB4QTE0MSwgMHhBMTVBIH0sCi0gICAgeyAweEExNjEsIDB4QTE3QSB9LAotICAgIHsgMHhBMTgxLCAweEExRkUgfSwKLSAgICB7IDB4QTI0MSwgMHhBMjVBIH0sCi0gICAgeyAweEEyNjEsIDB4QTI3QSB9LAotICAgIHsgMHhBMjgxLCAweEEyRTcgfSwKLSAgICB7IDB4QTM0MSwgMHhBMzVBIH0sCi0gICAgeyAweEEzNjEsIDB4QTM3QSB9LAotICAgIHsgMHhBMzgxLCAweEEzRkUgfSwKLSAgICB7IDB4QTQ0MSwgMHhBNDVBIH0sCi0gICAgeyAweEE0NjEsIDB4QTQ3QSB9LAotICAgIHsgMHhBNDgxLCAweEE0RkUgfSwKLSAgICB7IDB4QTU0MSwgMHhBNTVBIH0sCi0gICAgeyAweEE1NjEsIDB4QTU3QSB9LAotICAgIHsgMHhBNTgxLCAweEE1QUEgfSwKLSAgICB7IDB4QTVCMCwgMHhBNUI5IH0sCi0gICAgeyAweEE1QzEsIDB4QTVEOCB9LAotICAgIHsgMHhBNUUxLCAweEE1RjggfSwKLSAgICB7IDB4QTY0MSwgMHhBNjVBIH0sCi0gICAgeyAweEE2NjEsIDB4QTY3QSB9LAotICAgIHsgMHhBNjgxLCAweEE2RTQgfSwKLSAgICB7IDB4QTc0MSwgMHhBNzVBIH0sCi0gICAgeyAweEE3NjEsIDB4QTc3QSB9LAotICAgIHsgMHhBNzgxLCAweEE3RUYgfSwKLSAgICB7IDB4QTg0MSwgMHhBODVBIH0sCi0gICAgeyAweEE4NjEsIDB4QTg3QSB9LAotICAgIHsgMHhBODgxLCAweEE4QTQgfSwKLSAgICB7IDB4QThBNiwgMHhBOEE2IH0sCi0gICAgeyAweEE4QTgsIDB4QThBRiB9LAotICAgIHsgMHhBOEIxLCAweEE4RkUgfSwKLSAgICB7IDB4QTk0MSwgMHhBOTVBIH0sCi0gICAgeyAweEE5NjEsIDB4QTk3QSB9LAotICAgIHsgMHhBOTgxLCAweEE5RkUgfSwKLSAgICB7IDB4QUE0MSwgMHhBQTVBIH0sCi0gICAgeyAweEFBNjEsIDB4QUE3QSB9LAotICAgIHsgMHhBQTgxLCAweEFBRjMgfSwKLSAgICB7IDB4QUI0MSwgMHhBQjVBIH0sCi0gICAgeyAweEFCNjEsIDB4QUI3QSB9LAotICAgIHsgMHhBQjgxLCAweEFCRjYgfSwKLSAgICB7IDB4QUM0MSwgMHhBQzVBIH0sCi0gICAgeyAweEFDNjEsIDB4QUM3QSB9LAotICAgIHsgMHhBQzgxLCAweEFDQzEgfSwKLSAgICB7IDB4QUNEMSwgMHhBQ0YxIH0sCi0gICAgeyAweEFENDEsIDB4QUQ1QSB9LAotICAgIHsgMHhBRDYxLCAweEFEN0EgfSwKLSAgICB7IDB4QUQ4MSwgMHhBREEwIH0sCi0gICAgeyAweEFFNDEsIDB4QUU1QSB9LAotICAgIHsgMHhBRTYxLCAweEFFN0EgfSwKLSAgICB7IDB4QUU4MSwgMHhBRUEwIH0sCi0gICAgeyAweEFGNDEsIDB4QUY1QSB9LAotICAgIHsgMHhBRjYxLCAweEFGN0EgfSwKLSAgICB7IDB4QUY4MSwgMHhBRkEwIH0sCi0gICAgeyAweEIwNDEsIDB4QjA1QSB9LAotICAgIHsgMHhCMDYxLCAweEIwN0EgfSwKLSAgICB7IDB4QjA4MSwgMHhCMEZFIH0sCi0gICAgeyAweEIxNDEsIDB4QjE1QSB9LAotICAgIHsgMHhCMTYxLCAweEIxN0EgfSwKLSAgICB7IDB4QjE4MSwgMHhCMUZFIH0sCi0gICAgeyAweEIyNDEsIDB4QjI1QSB9LAotICAgIHsgMHhCMjYxLCAweEIyN0EgfSwKLSAgICB7IDB4QjI4MSwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDEsIDB4QjM1QSB9LAotICAgIHsgMHhCMzYxLCAweEIzN0EgfSwKLSAgICB7IDB4QjM4MSwgMHhCM0ZFIH0sCi0gICAgeyAweEI0NDEsIDB4QjQ1QSB9LAotICAgIHsgMHhCNDYxLCAweEI0N0EgfSwKLSAgICB7IDB4QjQ4MSwgMHhCNEZFIH0sCi0gICAgeyAweEI1NDEsIDB4QjU1QSB9LAotICAgIHsgMHhCNTYxLCAweEI1N0EgfSwKLSAgICB7IDB4QjU4MSwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDEsIDB4QjY1QSB9LAotICAgIHsgMHhCNjYxLCAweEI2N0EgfSwKLSAgICB7IDB4QjY4MSwgMHhCNkZFIH0sCi0gICAgeyAweEI3NDEsIDB4Qjc1QSB9LAotICAgIHsgMHhCNzYxLCAweEI3N0EgfSwKLSAgICB7IDB4Qjc4MSwgMHhCN0ZFIH0sCi0gICAgeyAweEI4NDEsIDB4Qjg1QSB9LAotICAgIHsgMHhCODYxLCAweEI4N0EgfSwKLSAgICB7IDB4Qjg4MSwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDEsIDB4Qjk1QSB9LAotICAgIHsgMHhCOTYxLCAweEI5N0EgfSwKLSAgICB7IDB4Qjk4MSwgMHhCOUZFIH0sCi0gICAgeyAweEJBNDEsIDB4QkE1QSB9LAotICAgIHsgMHhCQTYxLCAweEJBN0EgfSwKLSAgICB7IDB4QkE4MSwgMHhCQUZFIH0sCi0gICAgeyAweEJCNDEsIDB4QkI1QSB9LAotICAgIHsgMHhCQjYxLCAweEJCN0EgfSwKLSAgICB7IDB4QkI4MSwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDEsIDB4QkM1QSB9LAotICAgIHsgMHhCQzYxLCAweEJDN0EgfSwKLSAgICB7IDB4QkM4MSwgMHhCQ0ZFIH0sCi0gICAgeyAweEJENDEsIDB4QkQ1QSB9LAotICAgIHsgMHhCRDYxLCAweEJEN0EgfSwKLSAgICB7IDB4QkQ4MSwgMHhCREZFIH0sCi0gICAgeyAweEJFNDEsIDB4QkU1QSB9LAotICAgIHsgMHhCRTYxLCAweEJFN0EgfSwKLSAgICB7IDB4QkU4MSwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDEsIDB4QkY1QSB9LAotICAgIHsgMHhCRjYxLCAweEJGN0EgfSwKLSAgICB7IDB4QkY4MSwgMHhCRkZFIH0sCi0gICAgeyAweEMwNDEsIDB4QzA1QSB9LAotICAgIHsgMHhDMDYxLCAweEMwN0EgfSwKLSAgICB7IDB4QzA4MSwgMHhDMEZFIH0sCi0gICAgeyAweEMxNDEsIDB4QzE1QSB9LAotICAgIHsgMHhDMTYxLCAweEMxN0EgfSwKLSAgICB7IDB4QzE4MSwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDEsIDB4QzI1QSB9LAotICAgIHsgMHhDMjYxLCAweEMyN0EgfSwKLSAgICB7IDB4QzI4MSwgMHhDMkZFIH0sCi0gICAgeyAweEMzNDEsIDB4QzM1QSB9LAotICAgIHsgMHhDMzYxLCAweEMzN0EgfSwKLSAgICB7IDB4QzM4MSwgMHhDM0ZFIH0sCi0gICAgeyAweEM0NDEsIDB4QzQ1QSB9LAotICAgIHsgMHhDNDYxLCAweEM0N0EgfSwKLSAgICB7IDB4QzQ4MSwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDEsIDB4QzU1QSB9LAotICAgIHsgMHhDNTYxLCAweEM1N0EgfSwKLSAgICB7IDB4QzU4MSwgMHhDNUZFIH0sCi0gICAgeyAweEM2NDEsIDB4QzY1MiB9LAotICAgIHsgMHhDNkExLCAweEM2RkUgfSwKLSAgICB7IDB4QzdBMSwgMHhDN0ZFIH0sCi0gICAgeyAweEM4QTEsIDB4QzhGRSB9LAotICAgIHsgMHhDQUExLCAweENBRkUgfSwKLSAgICB7IDB4Q0JBMSwgMHhDQkZFIH0sCi0gICAgeyAweENDQTEsIDB4Q0NGRSB9LAotICAgIHsgMHhDREExLCAweENERkUgfSwKLSAgICB7IDB4Q0VBMSwgMHhDRUZFIH0sCi0gICAgeyAweENGQTEsIDB4Q0ZGRSB9LAotICAgIHsgMHhEMEExLCAweEQwRkUgfSwKLSAgICB7IDB4RDFBMSwgMHhEMUZFIH0sCi0gICAgeyAweEQyQTEsIDB4RDJGRSB9LAotICAgIHsgMHhEM0ExLCAweEQzRkUgfSwKLSAgICB7IDB4RDRBMSwgMHhENEZFIH0sCi0gICAgeyAweEQ1QTEsIDB4RDVGRSB9LAotICAgIHsgMHhENkExLCAweEQ2RkUgfSwKLSAgICB7IDB4RDdBMSwgMHhEN0ZFIH0sCi0gICAgeyAweEQ4QTEsIDB4RDhGRSB9LAotICAgIHsgMHhEOUExLCAweEQ5RkUgfSwKLSAgICB7IDB4REFBMSwgMHhEQUZFIH0sCi0gICAgeyAweERCQTEsIDB4REJGRSB9LAotICAgIHsgMHhEQ0ExLCAweERDRkUgfSwKLSAgICB7IDB4RERBMSwgMHhEREZFIH0sCi0gICAgeyAweERFQTEsIDB4REVGRSB9LAotICAgIHsgMHhERkExLCAweERGRkUgfSwKLSAgICB7IDB4RTBBMSwgMHhFMEZFIH0sCi0gICAgeyAweEUxQTEsIDB4RTFGRSB9LAotICAgIHsgMHhFMkExLCAweEUyRkUgfSwKLSAgICB7IDB4RTNBMSwgMHhFM0ZFIH0sCi0gICAgeyAweEU0QTEsIDB4RTRGRSB9LAotICAgIHsgMHhFNUExLCAweEU1RkUgfSwKLSAgICB7IDB4RTZBMSwgMHhFNkZFIH0sCi0gICAgeyAweEU3QTEsIDB4RTdGRSB9LAotICAgIHsgMHhFOEExLCAweEU4RkUgfSwKLSAgICB7IDB4RTlBMSwgMHhFOUZFIH0sCi0gICAgeyAweEVBQTEsIDB4RUFGRSB9LAotICAgIHsgMHhFQkExLCAweEVCRkUgfSwKLSAgICB7IDB4RUNBMSwgMHhFQ0ZFIH0sCi0gICAgeyAweEVEQTEsIDB4RURGRSB9LAotICAgIHsgMHhFRUExLCAweEVFRkUgfSwKLSAgICB7IDB4RUZBMSwgMHhFRkZFIH0sCi0gICAgeyAweEYwQTEsIDB4RjBGRSB9LAotICAgIHsgMHhGMUExLCAweEYxRkUgfSwKLSAgICB7IDB4RjJBMSwgMHhGMkZFIH0sCi0gICAgeyAweEYzQTEsIDB4RjNGRSB9LAotICAgIHsgMHhGNEExLCAweEY0RkUgfSwKLSAgICB7IDB4RjVBMSwgMHhGNUZFIH0sCi0gICAgeyAweEY2QTEsIDB4RjZGRSB9LAotICAgIHsgMHhGN0ExLCAweEY3RkUgfSwKLSAgICB7IDB4RjhBMSwgMHhGOEZFIH0sCi0gICAgeyAweEY5QTEsIDB4RjlGRSB9LAotICAgIHsgMHhGQUExLCAweEZBRkUgfSwKLSAgICB7IDB4RkJBMSwgMHhGQkZFIH0sCi0gICAgeyAweEZDQTEsIDB4RkNGRSB9LAotICAgIHsgMHhGREExLCAweEZERkUgfSwKLX07Ci0KLS8vIGdlbmVyYXRlZCBmcm9tIGh0dHA6Ly91bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDk1MC5UWFQKLXN0YXRpYyBjb25zdCBDaGFyUmFuZ2Uga0JpZzVSYW5nZXNbXSA9IHsKLSAgICB7IDB4QTE0MCwgMHhBMTdFIH0sCi0gICAgeyAweEExQTEsIDB4QTFGRSB9LAotICAgIHsgMHhBMjQwLCAweEEyN0UgfSwKLSAgICB7IDB4QTJBMSwgMHhBMkZFIH0sCi0gICAgeyAweEEzNDAsIDB4QTM3RSB9LAotICAgIHsgMHhBM0ExLCAweEEzQkYgfSwKLSAgICB7IDB4QTNFMSwgMHhBM0UxIH0sCi0gICAgeyAweEE0NDAsIDB4QTQ3RSB9LAotICAgIHsgMHhBNEExLCAweEE0RkUgfSwKLSAgICB7IDB4QTU0MCwgMHhBNTdFIH0sCi0gICAgeyAweEE1QTEsIDB4QTVGRSB9LAotICAgIHsgMHhBNjQwLCAweEE2N0UgfSwKLSAgICB7IDB4QTZBMSwgMHhBNkZFIH0sCi0gICAgeyAweEE3NDAsIDB4QTc3RSB9LAotICAgIHsgMHhBN0ExLCAweEE3RkUgfSwKLSAgICB7IDB4QTg0MCwgMHhBODdFIH0sCi0gICAgeyAweEE4QTEsIDB4QThGRSB9LAotICAgIHsgMHhBOTQwLCAweEE5N0UgfSwKLSAgICB7IDB4QTlBMSwgMHhBOUZFIH0sCi0gICAgeyAweEFBNDAsIDB4QUE3RSB9LAotICAgIHsgMHhBQUExLCAweEFBRkUgfSwKLSAgICB7IDB4QUI0MCwgMHhBQjdFIH0sCi0gICAgeyAweEFCQTEsIDB4QUJGRSB9LAotICAgIHsgMHhBQzQwLCAweEFDN0UgfSwKLSAgICB7IDB4QUNBMSwgMHhBQ0ZFIH0sCi0gICAgeyAweEFENDAsIDB4QUQ3RSB9LAotICAgIHsgMHhBREExLCAweEFERkUgfSwKLSAgICB7IDB4QUU0MCwgMHhBRTdFIH0sCi0gICAgeyAweEFFQTEsIDB4QUVGRSB9LAotICAgIHsgMHhBRjQwLCAweEFGN0UgfSwKLSAgICB7IDB4QUZBMSwgMHhBRkZFIH0sCi0gICAgeyAweEIwNDAsIDB4QjA3RSB9LAotICAgIHsgMHhCMEExLCAweEIwRkUgfSwKLSAgICB7IDB4QjE0MCwgMHhCMTdFIH0sCi0gICAgeyAweEIxQTEsIDB4QjFGRSB9LAotICAgIHsgMHhCMjQwLCAweEIyN0UgfSwKLSAgICB7IDB4QjJBMSwgMHhCMkZFIH0sCi0gICAgeyAweEIzNDAsIDB4QjM3RSB9LAotICAgIHsgMHhCM0ExLCAweEIzRkUgfSwKLSAgICB7IDB4QjQ0MCwgMHhCNDdFIH0sCi0gICAgeyAweEI0QTEsIDB4QjRGRSB9LAotICAgIHsgMHhCNTQwLCAweEI1N0UgfSwKLSAgICB7IDB4QjVBMSwgMHhCNUZFIH0sCi0gICAgeyAweEI2NDAsIDB4QjY3RSB9LAotICAgIHsgMHhCNkExLCAweEI2RkUgfSwKLSAgICB7IDB4Qjc0MCwgMHhCNzdFIH0sCi0gICAgeyAweEI3QTEsIDB4QjdGRSB9LAotICAgIHsgMHhCODQwLCAweEI4N0UgfSwKLSAgICB7IDB4QjhBMSwgMHhCOEZFIH0sCi0gICAgeyAweEI5NDAsIDB4Qjk3RSB9LAotICAgIHsgMHhCOUExLCAweEI5RkUgfSwKLSAgICB7IDB4QkE0MCwgMHhCQTdFIH0sCi0gICAgeyAweEJBQTEsIDB4QkFGRSB9LAotICAgIHsgMHhCQjQwLCAweEJCN0UgfSwKLSAgICB7IDB4QkJBMSwgMHhCQkZFIH0sCi0gICAgeyAweEJDNDAsIDB4QkM3RSB9LAotICAgIHsgMHhCQ0ExLCAweEJDRkUgfSwKLSAgICB7IDB4QkQ0MCwgMHhCRDdFIH0sCi0gICAgeyAweEJEQTEsIDB4QkRGRSB9LAotICAgIHsgMHhCRTQwLCAweEJFN0UgfSwKLSAgICB7IDB4QkVBMSwgMHhCRUZFIH0sCi0gICAgeyAweEJGNDAsIDB4QkY3RSB9LAotICAgIHsgMHhCRkExLCAweEJGRkUgfSwKLSAgICB7IDB4QzA0MCwgMHhDMDdFIH0sCi0gICAgeyAweEMwQTEsIDB4QzBGRSB9LAotICAgIHsgMHhDMTQwLCAweEMxN0UgfSwKLSAgICB7IDB4QzFBMSwgMHhDMUZFIH0sCi0gICAgeyAweEMyNDAsIDB4QzI3RSB9LAotICAgIHsgMHhDMkExLCAweEMyRkUgfSwKLSAgICB7IDB4QzM0MCwgMHhDMzdFIH0sCi0gICAgeyAweEMzQTEsIDB4QzNGRSB9LAotICAgIHsgMHhDNDQwLCAweEM0N0UgfSwKLSAgICB7IDB4QzRBMSwgMHhDNEZFIH0sCi0gICAgeyAweEM1NDAsIDB4QzU3RSB9LAotICAgIHsgMHhDNUExLCAweEM1RkUgfSwKLSAgICB7IDB4QzY0MCwgMHhDNjdFIH0sCi0gICAgeyAweEM5NDAsIDB4Qzk3RSB9LAotICAgIHsgMHhDOUExLCAweEM5RkUgfSwKLSAgICB7IDB4Q0E0MCwgMHhDQTdFIH0sCi0gICAgeyAweENBQTEsIDB4Q0FGRSB9LAotICAgIHsgMHhDQjQwLCAweENCN0UgfSwKLSAgICB7IDB4Q0JBMSwgMHhDQkZFIH0sCi0gICAgeyAweENDNDAsIDB4Q0M3RSB9LAotICAgIHsgMHhDQ0ExLCAweENDRkUgfSwKLSAgICB7IDB4Q0Q0MCwgMHhDRDdFIH0sCi0gICAgeyAweENEQTEsIDB4Q0RGRSB9LAotICAgIHsgMHhDRTQwLCAweENFN0UgfSwKLSAgICB7IDB4Q0VBMSwgMHhDRUZFIH0sCi0gICAgeyAweENGNDAsIDB4Q0Y3RSB9LAotICAgIHsgMHhDRkExLCAweENGRkUgfSwKLSAgICB7IDB4RDA0MCwgMHhEMDdFIH0sCi0gICAgeyAweEQwQTEsIDB4RDBGRSB9LAotICAgIHsgMHhEMTQwLCAweEQxN0UgfSwKLSAgICB7IDB4RDFBMSwgMHhEMUZFIH0sCi0gICAgeyAweEQyNDAsIDB4RDI3RSB9LAotICAgIHsgMHhEMkExLCAweEQyRkUgfSwKLSAgICB7IDB4RDM0MCwgMHhEMzdFIH0sCi0gICAgeyAweEQzQTEsIDB4RDNGRSB9LAotICAgIHsgMHhENDQwLCAweEQ0N0UgfSwKLSAgICB7IDB4RDRBMSwgMHhENEZFIH0sCi0gICAgeyAweEQ1NDAsIDB4RDU3RSB9LAotICAgIHsgMHhENUExLCAweEQ1RkUgfSwKLSAgICB7IDB4RDY0MCwgMHhENjdFIH0sCi0gICAgeyAweEQ2QTEsIDB4RDZGRSB9LAotICAgIHsgMHhENzQwLCAweEQ3N0UgfSwKLSAgICB7IDB4RDdBMSwgMHhEN0ZFIH0sCi0gICAgeyAweEQ4NDAsIDB4RDg3RSB9LAotICAgIHsgMHhEOEExLCAweEQ4RkUgfSwKLSAgICB7IDB4RDk0MCwgMHhEOTdFIH0sCi0gICAgeyAweEQ5QTEsIDB4RDlGRSB9LAotICAgIHsgMHhEQTQwLCAweERBN0UgfSwKLSAgICB7IDB4REFBMSwgMHhEQUZFIH0sCi0gICAgeyAweERCNDAsIDB4REI3RSB9LAotICAgIHsgMHhEQkExLCAweERCRkUgfSwKLSAgICB7IDB4REM0MCwgMHhEQzdFIH0sCi0gICAgeyAweERDQTEsIDB4RENGRSB9LAotICAgIHsgMHhERDQwLCAweEREN0UgfSwKLSAgICB7IDB4RERBMSwgMHhEREZFIH0sCi0gICAgeyAweERFNDAsIDB4REU3RSB9LAotICAgIHsgMHhERUExLCAweERFRkUgfSwKLSAgICB7IDB4REY0MCwgMHhERjdFIH0sCi0gICAgeyAweERGQTEsIDB4REZGRSB9LAotICAgIHsgMHhFMDQwLCAweEUwN0UgfSwKLSAgICB7IDB4RTBBMSwgMHhFMEZFIH0sCi0gICAgeyAweEUxNDAsIDB4RTE3RSB9LAotICAgIHsgMHhFMUExLCAweEUxRkUgfSwKLSAgICB7IDB4RTI0MCwgMHhFMjdFIH0sCi0gICAgeyAweEUyQTEsIDB4RTJGRSB9LAotICAgIHsgMHhFMzQwLCAweEUzN0UgfSwKLSAgICB7IDB4RTNBMSwgMHhFM0ZFIH0sCi0gICAgeyAweEU0NDAsIDB4RTQ3RSB9LAotICAgIHsgMHhFNEExLCAweEU0RkUgfSwKLSAgICB7IDB4RTU0MCwgMHhFNTdFIH0sCi0gICAgeyAweEU1QTEsIDB4RTVGRSB9LAotICAgIHsgMHhFNjQwLCAweEU2N0UgfSwKLSAgICB7IDB4RTZBMSwgMHhFNkZFIH0sCi0gICAgeyAweEU3NDAsIDB4RTc3RSB9LAotICAgIHsgMHhFN0ExLCAweEU3RkUgfSwKLSAgICB7IDB4RTg0MCwgMHhFODdFIH0sCi0gICAgeyAweEU4QTEsIDB4RThGRSB9LAotICAgIHsgMHhFOTQwLCAweEU5N0UgfSwKLSAgICB7IDB4RTlBMSwgMHhFOUZFIH0sCi0gICAgeyAweEVBNDAsIDB4RUE3RSB9LAotICAgIHsgMHhFQUExLCAweEVBRkUgfSwKLSAgICB7IDB4RUI0MCwgMHhFQjdFIH0sCi0gICAgeyAweEVCQTEsIDB4RUJGRSB9LAotICAgIHsgMHhFQzQwLCAweEVDN0UgfSwKLSAgICB7IDB4RUNBMSwgMHhFQ0ZFIH0sCi0gICAgeyAweEVENDAsIDB4RUQ3RSB9LAotICAgIHsgMHhFREExLCAweEVERkUgfSwKLSAgICB7IDB4RUU0MCwgMHhFRTdFIH0sCi0gICAgeyAweEVFQTEsIDB4RUVGRSB9LAotICAgIHsgMHhFRjQwLCAweEVGN0UgfSwKLSAgICB7IDB4RUZBMSwgMHhFRkZFIH0sCi0gICAgeyAweEYwNDAsIDB4RjA3RSB9LAotICAgIHsgMHhGMEExLCAweEYwRkUgfSwKLSAgICB7IDB4RjE0MCwgMHhGMTdFIH0sCi0gICAgeyAweEYxQTEsIDB4RjFGRSB9LAotICAgIHsgMHhGMjQwLCAweEYyN0UgfSwKLSAgICB7IDB4RjJBMSwgMHhGMkZFIH0sCi0gICAgeyAweEYzNDAsIDB4RjM3RSB9LAotICAgIHsgMHhGM0ExLCAweEYzRkUgfSwKLSAgICB7IDB4RjQ0MCwgMHhGNDdFIH0sCi0gICAgeyAweEY0QTEsIDB4RjRGRSB9LAotICAgIHsgMHhGNTQwLCAweEY1N0UgfSwKLSAgICB7IDB4RjVBMSwgMHhGNUZFIH0sCi0gICAgeyAweEY2NDAsIDB4RjY3RSB9LAotICAgIHsgMHhGNkExLCAweEY2RkUgfSwKLSAgICB7IDB4Rjc0MCwgMHhGNzdFIH0sCi0gICAgeyAweEY3QTEsIDB4RjdGRSB9LAotICAgIHsgMHhGODQwLCAweEY4N0UgfSwKLSAgICB7IDB4RjhBMSwgMHhGOEZFIH0sCi0gICAgeyAweEY5NDAsIDB4Rjk3RSB9LAotICAgIHsgMHhGOUExLCAweEY5RkUgfSwKLX07Ci0KLXN0YXRpYyBib29sIGNoYXJNYXRjaGVzRW5jb2RpbmcoaW50IGNoLCBjb25zdCBDaGFyUmFuZ2UqIGVuY29kaW5nUmFuZ2VzLCBpbnQgcmFuZ2VDb3VudCkgewotICAgIC8vIFVzZSBiaW5hcnkgc2VhcmNoIHRvIHNlZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGNvbnRhaW5lZCBpbiB0aGUgZW5jb2RpbmcKLSAgICBpbnQgbG93ID0gMDsKLSAgICBpbnQgaGlnaCA9IHJhbmdlQ291bnQ7Ci0KLSAgICB3aGlsZSAobG93IDwgaGlnaCkgewotICAgICAgICBpbnQgaSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICAgIGNvbnN0IENoYXJSYW5nZSogcmFuZ2UgPSAmZW5jb2RpbmdSYW5nZXNbaV07Ci0gICAgICAgIGlmIChjaCA+PSByYW5nZS0+Zmlyc3QgJiYgY2ggPD0gcmFuZ2UtPmxhc3QpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGNoID4gcmFuZ2UtPmxhc3QpCi0gICAgICAgICAgICBsb3cgPSBpICsgMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGlnaCA9IGk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1leHRlcm4gdWludDMyX3QgZmluZFBvc3NpYmxlRW5jb2RpbmdzKGludCBjaCkKLXsKLSAgICAvLyBBU0NJSSBtYXRjaGVzIGV2ZXJ5dGhpbmcKLSAgICBpZiAoY2ggPCAyNTYpIHJldHVybiBrRW5jb2RpbmdBbGw7Ci0KLSAgICBpbnQgcmVzdWx0ID0ga0VuY29kaW5nTm9uZTsKLQotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrU2hpZnRKSVNSYW5nZXMsIEFSUkFZX1NJWkUoa1NoaWZ0SklTUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdTaGlmdEpJUzsKLSAgICBpZiAoY2hhck1hdGNoZXNFbmNvZGluZyhjaCwga0dCS1JhbmdlcywgQVJSQVlfU0laRShrR0JLUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdHQks7Ci0gICAgaWYgKGNoYXJNYXRjaGVzRW5jb2RpbmcoY2gsIGtCaWc1UmFuZ2VzLCBBUlJBWV9TSVpFKGtCaWc1UmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdCaWc1OwotICAgIGlmIChjaGFyTWF0Y2hlc0VuY29kaW5nKGNoLCBrRVVDS1JSYW5nZXMsIEFSUkFZX1NJWkUoa0VVQ0tSUmFuZ2VzKSkpCi0gICAgICAgIHJlc3VsdCB8PSBrRW5jb2RpbmdFVUNLUjsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmggYi9tZWRpYS9saWJtZWRpYS9hdXRvZGV0ZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzVkYjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYXV0b2RldGVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVVUT0RFVEVDVF9ICi0jZGVmaW5lIEFVVE9ERVRFQ1RfSAotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotLy8gZmxhZ3MgdXNlZCBmb3IgbmF0aXZlIGVuY29kaW5nIGRldGVjdGlvbgotZW51bSB7Ci0gICAga0VuY29kaW5nTm9uZSAgICAgICAgICAgICAgID0gMCwKLSAgICBrRW5jb2RpbmdTaGlmdEpJUyAgICAgICAgICAgPSAoMSA8PCAwKSwKLSAgICBrRW5jb2RpbmdHQksgICAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKLSAgICBrRW5jb2RpbmdCaWc1ICAgICAgICAgICAgICAgPSAoMSA8PCAyKSwKLSAgICBrRW5jb2RpbmdFVUNLUiAgICAgICAgICAgICAgPSAoMSA8PCAzKSwKLQotICAgIGtFbmNvZGluZ0FsbCAgICAgICAgICAgICAgICA9IChrRW5jb2RpbmdTaGlmdEpJUyB8IGtFbmNvZGluZ0dCSyB8IGtFbmNvZGluZ0JpZzUgfCBrRW5jb2RpbmdFVUNLUiksCi19OwotCi0KLS8vIHJldHVybnMgYSBiaXRmaWVsZCBjb250YWluaW5nIHRoZSBwb3NzaWJsZSBuYXRpdmUgZW5jb2RpbmdzIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi1leHRlcm4gdWludDMyX3QgZmluZFBvc3NpYmxlRW5jb2RpbmdzKGludCBjaCk7Ci0KLSNlbmRpZiAvLyBBVVRPREVURUNUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggMDg1NzQ2MS4uNjdkNDEzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTE4LDkgKzE4LDEyIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpAQCAtOTMsNyArOTYsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpzcmNVcmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQogewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEwNiwxMiArMTExLDEyIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KICAgICBBTE9HVigiZGF0YSBzb3VyY2UgKCVzKSIsIHNyY1VybCk7Ci0gICAgcmV0dXJuIG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2Uoc3JjVXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgc3JjVXJsLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUmV0cmlldmVyID09IDApIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKQEAgLTEyNiw3ICsxMzEsNyBAQAogCiBzcDxJTWVtb3J5PiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbikKIHsKLSAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJWxsZCB1cykgb3B0aW9uKCVkKSIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CkBAIC0xNTcsNyArMTYyLDcgQEAKICAgICByZXR1cm4gbVJldHJpZXZlci0+ZXh0cmFjdEFsYnVtQXJ0KCk7CiB9CiAKLXZvaWQgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Cit2b2lkIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OnNTZXJ2aWNlTG9jayk7CiAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6c1NlcnZpY2UuY2xlYXIoKTsKICAgICBBTE9HVygiTWVkaWFNZXRhZGF0YVJldHJpZXZlciBzZXJ2ZXIgZGllZCEiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCAzNzBiZDJkLi4zNTdlZjg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC0xNywxMiArMTcsMTQgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBtTGlzdGVuZXIgPSBOVUxMOwogICAgIG1Db29raWUgPSBOVUxMOwogICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9JRExFOwpAQCAtNTcsOCArNjAsOCBAQAogICAgIG1MZWZ0Vm9sdW1lID0gbVJpZ2h0Vm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKICAgICBtTG9ja1RocmVhZElkID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7CisgICAgbUF1ZGlvU2Vzc2lvbklkID0gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKKyAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIG1TZW5kTGV2ZWwgPSAwOwogICAgIG1SZXRyYW5zbWl0RW5kcG9pbnRWYWxpZCA9IGZhbHNlOwogfQpAQCAtNjYsNyArNjksMTEgQEAKIE1lZGlhUGxheWVyOjp+TWVkaWFQbGF5ZXIoKQogewogICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQpOworICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIH0KKyAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CkBAIC0xMzYsNiArMTQzLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJsKTsKQEAgLTE0NSw3ICsxNTMsNyBAQAogICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CiAgICAgICAgICAgICBpZiAoKE5PX0VSUk9SICE9IGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KHBsYXllcikpIHx8Ci0gICAgICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKSkgeworICAgICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpKSB7CiAgICAgICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBhdHRhY2hOZXdQbGF5ZXIocGxheWVyKTsKQEAgLTE1Niw3ICsxNjQsNyBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJWxsZCwgJWxsZCkiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKQEAgLTE5Myw3ICsyMDEsNyBAQAogICAgICAgICAgICAgKG1DdXJyZW50U3RhdGUgIT0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX0lETEUpICE9IE1FRElBX1BMQVlFUl9JRExFKTsKICAgICBpZiAoKG1QbGF5ZXIgIT0gTlVMTCkgJiYgaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgIEFMT0dWKCJpbnZva2UgJWQiLCByZXF1ZXN0LmRhdGFTaXplKCkpOworICAgICAgICBBTE9HVigiaW52b2tlICV6dSIsIHJlcXVlc3QuZGF0YVNpemUoKSk7CiAgICAgICAgIHJldHVybiAgbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKICAgICB9CiAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYIiwgbUN1cnJlbnRTdGF0ZSk7CkBAIC0yMzQsNiArMjQyLDkgQEAKIHsKICAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSX1NUT1BQRUQpICkgKSB7CiAgICAgICAgIG1QbGF5ZXItPnNldEF1ZGlvU3RyZWFtVHlwZShtU3RyZWFtVHlwZSk7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNldFBhcmFtZXRlcihLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMsICptQXVkaW9BdHRyaWJ1dGVzUGFyY2VsKTsKKyAgICAgICAgfQogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgIH0KQEAgLTI4MCwxNiArMjkxLDIxIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c3RhcnQoKQogewogICAgIEFMT0dWKCJzdGFydCIpOworCisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9TVEFSVEVEKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CisKKyAgICBtTG9ja1RocmVhZElkID0gZ2V0VGhyZWFkSWQoKTsKKworICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1NUQVJURUQpIHsKKyAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgfSBlbHNlIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfUFJFUEFSRUQgfAogICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUgfCBNRURJQV9QTEFZRVJfUEFVU0VEICkgKSApIHsKICAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7CiAgICAgICAgIG1QbGF5ZXItPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKICAgICAgICAgbVBsYXllci0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVJURUQ7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnN0YXJ0KCk7CisgICAgICAgIHJldCA9IG1QbGF5ZXItPnN0YXJ0KCk7CiAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfU1RBVEVfRVJST1I7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTcsMTAgKzMxMywxNCBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5YmFjayBjb21wbGV0ZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHN0YXJ0KCkiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJzdGFydCBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIEFMT0dFKCJzdGFydCBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzdG9wKCkKQEAgLTUzMCw2ICs1NTAsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSkKK3sKKyAgICBBTE9HVigiZ2V0QXVkaW9TdHJlYW1UeXBlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqdHlwZSA9IG1TdHJlYW1UeXBlOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApCiB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyOjpzZXRMb29waW5nIik7CkBAIC01NzUsOCArNjAzLDggQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHNlc3Npb25JZCAhPSBtQXVkaW9TZXNzaW9uSWQpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNjEzLDE1ICs2NDEsNDYgQEAKICAgICByZXR1cm4gbVBsYXllci0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKIH0KIAorLy8gYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQKK3N0YXR1c190IE1lZGlhUGxheWVyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkKK3sKKyAgICBzd2l0Y2goa2V5KSB7CisgICAgY2FzZSBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVJfU1RBUlRFRCB8CisgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSX1BBVVNFRCB8IE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkgKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjaworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCkKIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXI6OnNldFBhcmFtZXRlciglZCkiLCBrZXkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGNoZWNrU3RhdGVGb3JLZXlTZXRfbChrZXkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgewogICAgICAgICByZXR1cm4gIG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwogICAgIH0KLSAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN3aXRjaCAoa2V5KSB7CisgICAgY2FzZSBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6CisgICAgICAgIC8vIG5vIHBsYXllciwgc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7IH07CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkKQEAgLTY1NCw3ICs3MTMsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1lbXNldCgmbVJldHJhbnNtaXRFbmRwb2ludCwgMCwgc2l6ZW9mKCZtUmV0cmFuc21pdEVuZHBvaW50KSk7CisgICAgbWVtc2V0KCZtUmV0cmFuc21pdEVuZHBvaW50LCAwLCBzaXplb2YobVJldHJhbnNtaXRFbmRwb2ludCkpOwogICAgIG1SZXRyYW5zbWl0RW5kcG9pbnQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludC5zaW5fYWRkciAgID0gc2FkZHI7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludC5zaW5fcG9ydCAgID0gaHRvbnMocG9ydCk7CkBAIC02NzMsOCArNzMyLDggQEAKICAgICAvLyBydW5uaW5nIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlIG1lZGlhIHNlcnZlci4gSW4gdGhhdCBjYXNlLAogICAgIC8vIHRoaXMgd2lsbCBkZWFkbG9jay4KICAgICAvLwotICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlCi0gICAgLy8gYW5kIHNlZWtUbyB3aXRoaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAvLyBUaGUgdGhyZWFkSWQgaGFjayBiZWxvdyB3b3JrcyBhcm91bmQgdGhpcyBmb3IgdGhlIGNhcmUgb2YgcHJlcGFyZSwKKyAgICAvLyBzZWVrVG8gYW5kIHN0YXJ0IHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgogICAgIC8vIEZJWE1FOiBSZW1lbWJlciwgdGhpcyBpcyBhIGhhY2ssIGl0J3Mgbm90IGV2ZW4gYSBoYWNrIHRoYXQgaXMgYXBwbGllZAogICAgIC8vIGNvbnNpc3RlbnRseSBmb3IgYWxsIHVzZS1jYXNlcywgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQuCiAgICAgaWYgKG1Mb2NrVGhyZWFkSWQgIT0gZ2V0VGhyZWFkSWQoKSkgewpAQCAtNzc2LDE1ICs4MzUsMjAgQEAKICAgICB9CiB9CiAKLS8qc3RhdGljKi8gc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBOdW1DaGFubmVscywgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorLypzdGF0aWMqLyBzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZGVjb2RlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKKyAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgIHNpemVfdCAqcFNpemUpCiB7CiAgICAgQUxPR1YoImRlY29kZSglcykiLCB1cmwpOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICBzdGF0dXMgPSBzZXJ2aWNlLT5kZWNvZGUodXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IHNlcnZpY2UtPmRlY29kZShodHRwU2VydmljZSwgdXJsLCBwU2FtcGxlUmF0ZSwgcE51bUNoYW5uZWxzLCBwRm9ybWF0LCBoZWFwLCBwU2l6ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwogICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKQEAgLTgwNCw3ICs4NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSkKIHsKLSAgICBBTE9HVigiZGVjb2RlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgQUxPR1YoImRlY29kZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7CkBAIC04MzIsMTUgKzg5Niw0IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPnNldE5leHRQbGF5ZXIobmV4dCA9PSBOVUxMID8gTlVMTCA6IG5leHQtPm1QbGF5ZXIpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjo6dXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPSBnZXRNZWRpYVBsYXllclNlcnZpY2UoKTsKLQotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UtPnVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotICAgIH0KLQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggMDRjZjYwYi4uODg4ZWY2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTE3LDYgKzE3LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVJlY29yZGVyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0xODMsOCArMTg2LDExIEBACiAgICAgICAgIEFMT0dFKCJzZXRPdXRwdXRGb3JtYXQgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1Jc1ZpZGVvU291cmNlU2V0ICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX1JUUF9BVlAgJiYgb2YgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHMlRTKSB7IC8vZmlyc3Qgbm9uLXZpZGVvIG91dHB1dCBmb3JtYXQKLSAgICAgICAgQUxPR0UoIm91dHB1dCBmb3JtYXQgKCVkKSBpcyBtZWFudCBmb3IgYXVkaW8gcmVjb3JkaW5nIG9ubHkgYW5kIGluY29tcGF0aWJsZSB3aXRoIHZpZGVvIHJlY29yZGluZyIsIG9mKTsKKyAgICBpZiAobUlzVmlkZW9Tb3VyY2VTZXQKKyAgICAgICAgICAgICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCAvL2ZpcnN0IG5vbi12aWRlbyBvdXRwdXQgZm9ybWF0CisgICAgICAgICAgICAmJiBvZiA8IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9FTkQpIHsKKyAgICAgICAgQUxPR0UoIm91dHB1dCBmb3JtYXQgKCVkKSBpcyBtZWFudCBmb3IgYXVkaW8gcmVjb3JkaW5nIG9ubHkiCisgICAgICAgICAgICAgICIgYW5kIGluY29tcGF0aWJsZSB3aXRoIHZpZGVvIHJlY29yZGluZyIsIG9mKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMjg2LDcgKzI5Miw3IEBACiAKIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0T3V0cHV0RmlsZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA4ZjIxNjMyLi4yY2Y1NzEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMjIsMTEgKzIyLDE0IEBACiAgICAgU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwICAgICAgIFwKICAgICBTdGFnZWZyaWdodFJlY29yZGVyLmNwcCAgICAgXAogICAgIFRlc3RQbGF5ZXJTdHViLmNwcCAgICAgICAgICBcCisgICAgVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAgICAgIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCiAgICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJjYW1lcmFfY2xpZW50ICAgICAgICAgICAgXAorICAgIGxpYmNyeXB0byAgICAgICAgICAgICAgICAgICBcCiAgICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKKyAgICBsaWJkcm1mcmFtZXdvcmsgICAgICAgICAgICAgXAogICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbGliZGwgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDUsMTUgKzQ4LDE3IEBACiAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5ICAgICAgICAgIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggICAgICAgICAgICAgICAgICBcCiAgICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCiAKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCmluZGV4IGQ1MDAzN2YuLmQyMjIzMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwCkBAIC00MTcsNiArNDE3LDIzIEBACiAgICAgcmV0dXJuIG1QbHVnaW4tPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShyZXNwb25zZSwgY2VydGlmaWNhdGUsIHdyYXBwZWRLZXkpOwogfQogCitzdGF0dXNfdCBEcm06OnVucHJvdmlzaW9uRGV2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVNT1ZFX0RSTV9DRVJUSUZJQ0FURVMiKSkgeworICAgICAgICByZXR1cm4gLUVQRVJNOworICAgIH0KKworICAgIHJldHVybiBtUGx1Z2luLT51bnByb3Zpc2lvbkRldmljZSgpOworfQogCiBzdGF0dXNfdCBEcm06OmdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAppbmRleCAzZDRiMGZjLi45ZTIzZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCkBAIC03NSw2ICs3NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZjZXJ0aWZpY2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnByb3Zpc2lvbkRldmljZSgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5jcHAKaW5kZXggYzJhYzFhMy4uYWZlMzkzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcApAQCAtMTA3LDExICsxMDcsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICAvLyBUTy1ETzoKLSAgICAvLyBPbmx5IHN1cHBvcnQgSERDUF9DQVBTX0VOQ1JZUFQgKGJ5dGUtYXJyYXkgdG8gYnl0ZS1hcnJheSkgZm9yIG5vdy4KLSAgICAvLyB1c2UgbUhEQ1BNb2R1bGUtPmdldENhcHMoKSB3aGVuIHRoZSBIRENQIGxpYnJhcmllcyBnZXQgdXBkYXRlZC4KLSAgICAvL3JldHVybiBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpOwotICAgIHJldHVybiBIRENQTW9kdWxlOjpIRENQX0NBUFNfRU5DUllQVDsKKyAgICByZXR1cm4gbUhEQ1BNb2R1bGUtPmdldENhcHMoKTsKIH0KIAogc3RhdHVzX3QgSERDUDo6ZW5jcnlwdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggOTBhZWQzOS4uM2UwZmMwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTYwLDE0ICs2MCwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotcGxheWVyX3R5cGUgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXREZWZhdWx0UGxheWVyVHlwZSgpIHsKK3N0YXRpYyBwbGF5ZXJfdHlwZSBnZXREZWZhdWx0UGxheWVyVHlwZSgpIHsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQudXNlLW51cGxheWVyIiwgdmFsdWUsIE5VTEwpCisgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQudXNlLWF3ZXNvbWUiLCB2YWx1ZSwgTlVMTCkKICAgICAgICAgICAgICYmICghc3RyY21wKCIxIiwgdmFsdWUpIHx8ICFzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpKSkgewotICAgICAgICByZXR1cm4gTlVfUExBWUVSOworICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwogICAgIH0KIAotICAgIHJldHVybiBTVEFHRUZSSUdIVF9QTEFZRVI7CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgRVhQRVJJTUVOVEFMIGRldmVsb3BlciBzZXR0aW5ncyBwcm9wZXJ0eQorICAgIGlmIChwcm9wZXJ0eV9nZXQoInBlcnNpc3Quc3lzLm1lZGlhLnVzZS1hd2Vzb21lIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcCgidHJ1ZSIsIHZhbHVlKSkgeworICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOworICAgIH0KKworICAgIHJldHVybiBOVV9QTEFZRVI7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyRmFjdG9yeTo6cmVnaXN0ZXJGYWN0b3J5KElGYWN0b3J5KiBmYWN0b3J5LApAQCAtMTcwLDIxICsxNzYsMjQgQEAKIGNsYXNzIFN0YWdlZnJpZ2h0UGxheWVyRmFjdG9yeSA6CiAgICAgcHVibGljIE1lZGlhUGxheWVyRmFjdG9yeTo6SUZhY3RvcnkgewogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7Ci0gICAgICAgIGNoYXIgYnVmWzIwXTsKLSAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypsZW5ndGgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsKKyAgICAgICAgaWYgKGdldERlZmF1bHRQbGF5ZXJUeXBlKCkKKyAgICAgICAgICAgICAgICA9PSBTVEFHRUZSSUdIVF9QTEFZRVIpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzIwXTsKKyAgICAgICAgICAgIGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgbHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpOwogCi0gICAgICAgIGxvbmcgaWRlbnQgPSAqKChsb25nKilidWYpOworICAgICAgICAgICAgdWludDMyX3QgaWRlbnQgPSAqKCh1aW50MzJfdCopYnVmKTsKIAotICAgICAgICAvLyBPZ2cgdm9yYmlzPwotICAgICAgICBpZiAoaWRlbnQgPT0gMHg1MzY3Njc0ZikgLy8gJ09nZ1MnCi0gICAgICAgICAgICByZXR1cm4gMS4wOworICAgICAgICAgICAgLy8gT2dnIHZvcmJpcz8KKyAgICAgICAgICAgIGlmIChpZGVudCA9PSAweDUzNjc2NzRmKSAvLyAnT2dnUycKKyAgICAgICAgICAgICAgICByZXR1cm4gMS4wOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CkBAIC0xOTcsNyArMjA2LDcgQEAKIAogY2xhc3MgTnVQbGF5ZXJGYWN0b3J5IDogcHVibGljIE1lZGlhUGxheWVyRmFjdG9yeTo6SUZhY3RvcnkgewogICBwdWJsaWM6Ci0gICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAorICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7CiAgICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrT3VyU2NvcmUgPSAwLjg7CkBAIC0yMjksOSArMjM4LDkgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeworICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4mIC8qc291cmNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CiAgICAgICAgIHJldHVybiAxLjA7CiAgICAgfQogCkBAIC0yNDMsNyArMjUyLDcgQEAKIAogY2xhc3MgU29uaXZveFBsYXllckZhY3RvcnkgOiBwdWJsaWMgTWVkaWFQbGF5ZXJGYWN0b3J5OjpJRmFjdG9yeSB7CiAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCisgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtPdXJTY29yZSA9IDAuNDsKQEAgLTI3NCw3ICsyODMsNyBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KIAotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCwKQEAgLTMxMiw5ICszMjEsOSBAQAogCiBjbGFzcyBUZXN0UGxheWVyRmFjdG9yeSA6IHB1YmxpYyBNZWRpYVBsYXllckZhY3Rvcnk6OklGYWN0b3J5IHsKICAgcHVibGljOgotICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qY3VyU2NvcmUqLykgewogICAgICAgICBpZiAoVGVzdFBsYXllclN0dWI6OmNhbkJlVXNlZCh1cmwpKSB7CiAgICAgICAgICAgICByZXR1cm4gMS4wOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKaW5kZXggZmU4OTcyYi4uNTVmZjkxOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaApAQCAtMjksMTkgKzI5LDE5IEBACiAgICAgICBwdWJsaWM6CiAgICAgICAgIHZpcnR1YWwgfklGYWN0b3J5KCkgeyB9CiAKLSAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGN1clNjb3JlKSB7IHJldHVybiAwLjA7IH0KKyAgICAgICAgdmlydHVhbCBmbG9hdCBzY29yZUZhY3RvcnkoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgLypjbGllbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogLyp1cmwqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7IHJldHVybiAwLjA7IH0KIAotICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJTY29yZSkgeyByZXR1cm4gMC4wOyB9CisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmZkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKmxlbmd0aCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCi0gICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3VyU2NvcmUpIHsgcmV0dXJuIDAuMDsgfQorICAgICAgICB2aXJ0dWFsIGZsb2F0IHNjb3JlRmFjdG9yeShjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiAvKmNsaWVudCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7IHJldHVybiAwLjA7IH0KIAogICAgICAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKCkgPSAwOwogICAgIH07CkBAIC03MSw3ICs3MSw2IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJGYWN0b3J5X2woSUZhY3RvcnkqIGZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcl90eXBlIHR5cGUpOwotICAgIHN0YXRpYyBwbGF5ZXJfdHlwZSBnZXREZWZhdWx0UGxheWVyVHlwZSgpOwogCiAgICAgc3RhdGljIE11dGV4ICAgICAgIHNMb2NrOwogICAgIHN0YXRpYyB0RmFjdG9yeU1hcCBzRmFjdG9yeU1hcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYzNkYmMxYi4uMmI0NDk1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtNDIsOCArNDMsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KQEAgLTUyLDYgKzU1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTE4NSw2ICsxODksNjQgQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogCituYW1lc3BhY2UgewordXNpbmcgYW5kcm9pZDo6UGFyY2VsOwordXNpbmcgYW5kcm9pZDo6U3RyaW5nMTY7CisKKy8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCisvLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCitjb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKKworLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6CisvLworLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8KKy8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCisvLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKKy8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KK3ZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKQoreworICAgIGF0dHJpYnV0ZXMtPnVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUgPSAoYXVkaW9fY29udGVudF90eXBlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBhdHRyaWJ1dGVzLT5mbGFncyA9IChhdWRpb19mbGFnc19tYXNrX3QpIHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBjb25zdCBib29sIGhhc0ZsYXR0ZW5lZFRhZyA9IChwYXJjZWwucmVhZEludDMyKCkgPT0ga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MpOworICAgIGlmIChoYXNGbGF0dGVuZWRUYWcpIHsKKyAgICAgICAgLy8gdGhlIHRhZ3MgYXJlIFVURjE2LCBjb252ZXJ0IHRvIFVURjgKKyAgICAgICAgU3RyaW5nMTYgdGFncyA9IHBhcmNlbC5yZWFkU3RyaW5nMTYoKTsKKyAgICAgICAgc3NpemVfdCByZWFsVGFnU2l6ZSA9IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKHRhZ3Muc3RyaW5nKCksIHRhZ3Muc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlYWxUYWdTaXplIDw9IDApIHsKKyAgICAgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjb3B5IHRoZSBmbGF0dGVuZWQgc3RyaW5nIGludG8gdGhlIGF0dHJpYnV0ZXMgYXMgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY29udmVyc2lvbjoKKyAgICAgICAgICAgIC8vIGNvcHlpbmcgYXJyYXkgc2l6ZSAtMSwgYXJyYXkgZm9yIHRhZ3Mgd2FzIGNhbGxvYydkLCBubyBuZWVkIHRvIE5VTEwtdGVybWluYXRlIGl0CisgICAgICAgICAgICBzaXplX3QgdGFnU2l6ZSA9IHJlYWxUYWdTaXplID4gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA/CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgOiByZWFsVGFnU2l6ZTsKKyAgICAgICAgICAgIHV0ZjE2X3RvX3V0ZjgodGFncy5zdHJpbmcoKSwgdGFnU2l6ZSwgYXR0cmlidXRlcy0+dGFncywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3MpIC8gc2l6ZW9mKGF0dHJpYnV0ZXMtPnRhZ3NbMF0pKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJ1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKCkgcmVjZWl2ZWQgdW5mbGF0dGVuZWQgdGFncywgaWdub3JpbmcgdGFnIHZhbHVlcyIpOworICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOworICAgIH0KK30KK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IGNoYXIqIHBlcm1pc3Npb25TdHJpbmcpIHsKQEAgLTIyMCw2ICsyODIsMjAgQEAKICAgICAvLyBzcGVha2VyIGlzIG9uIGJ5IGRlZmF1bHQKICAgICBtQmF0dGVyeUF1ZGlvLmRldmljZU9uW1NQRUFLRVJdID0gMTsKIAorICAgIC8vIHJlc2V0IGJhdHRlcnkgc3RhdHMKKyAgICAvLyBpZiB0aGUgbWVkaWFzZXJ2ZXIgaGFzIGNyYXNoZWQsIGJhdHRlcnkgc3RhdHMgY291bGQgYmUgbGVmdAorICAgIC8vIGluIGJhZCBzdGF0ZSwgcmVzZXQgdGhlIHN0YXRlIHVwb24gc2VydmljZSBzdGFydC4KKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gTlVMTCkgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVN0YXRzID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChiYXR0ZXJ5U3RhdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICAgICAgYmF0dGVyeVN0YXRzLT5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9CisgICAgfQorCiAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpyZWdpc3RlckJ1aWx0aW5GYWN0b3JpZXMoKTsKIH0KIApAQCAtMjc1LDYgKzM1MSwxMCBAQAogICAgIHJldHVybiBjOwogfQogCitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0Q29kZWNMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBNZWRpYUNvZGVjTGlzdDo6Z2V0TG9jYWxJbnN0YW5jZSgpOworfQorCiBzcDxJT01YPiBNZWRpYVBsYXllclNlcnZpY2U6OmdldE9NWCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zMDYsMTIgKzM4Niw3IEBACiAgICAgcmV0dXJuIG5ldyBSZW1vdGVEaXNwbGF5KGNsaWVudCwgaWZhY2Uuc3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICByZXR1cm4gSFRUUEJhc2U6OlVwZGF0ZVByb3h5Q29uZmlnKGhvc3QsIHBvcnQsIGV4Y2x1c2lvbkxpc3QpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyphcmdzKi8pIGNvbnN0CiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0zMTksNyArMzk0LDcgQEAKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb0NhY2hlXG4iKTsKICAgICBpZiAobUhlYXAgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgaGVhcCBiYXNlKCVwKSwgc2l6ZSglZCksIGZsYWdzKCVkKVxuIiwKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGhlYXAgYmFzZSglcCksIHNpemUoJXp1KSwgZmxhZ3MoJWQpXG4iLAogICAgICAgICAgICAgICAgIG1IZWFwLT5nZXRCYXNlKCksIG1IZWFwLT5nZXRTaXplKCksIG1IZWFwLT5nZXRGbGFncygpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KQEAgLTUxOCw2ICs1OTMsNyBAQAogICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOwogICAgIG1VSUQgPSB1aWQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgIEFMT0dEKCJjcmVhdGUgQW50YWdvbml6ZXIiKTsKQEAgLTUzMiw2ICs2MDgsOSBAQAogICAgIHdwPENsaWVudD4gY2xpZW50KHRoaXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGNsaWVudCk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpCkBAIC01OTYsNyArNjc1LDggQEAKICAgICB9CiAKICAgICBpZiAoIXAtPmhhcmR3YXJlT3V0cHV0KCkpIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKICAgICB9CiAKQEAgLTYyOCw3ICs3MDgsOSBAQAogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIGlmICh1cmwgPT0gTlVMTCkKQEAgLTY2Myw3ICs3NDUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KIAotICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QocCwgcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKTsKKyAgICAgICAgc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycykpOwogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CiB9CkBAIC02ODAsOCArNzYyLDggQEAKIAogICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHNiLnN0X2Rldik7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwotICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc2Iuc3RfdWlkKTsKLSAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHNiLnN0X2dpZCk7CisgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKKyAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwogICAgIEFMT0dWKCJzdF9zaXplID0gJWxsdSIsIHNiLnN0X3NpemUpOwogCiAgICAgaWYgKG9mZnNldCA+PSBzYi5zdF9zaXplKSB7CkBAIC04MTAsNyArODkyLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldE1ldGFkYXRhKAotICAgICAgICBib29sIHVwZGF0ZV9vbmx5LCBib29sIGFwcGx5X2ZpbHRlciwgUGFyY2VsICpyZXBseSkKKyAgICAgICAgYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKmFwcGx5X2ZpbHRlciovLCBQYXJjZWwgKnJlcGx5KQogewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcGxheWVyID0gZ2V0UGxheWVyKCk7CiAgICAgaWYgKHBsYXllciA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKQEAgLTk3OSw2ICsxMDYxLDIyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpCit7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeyBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOyB9CisgICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRMb29waW5nKGludCBsb29wKQogewogICAgIEFMT0dWKCJbJWRdIHNldExvb3BpbmcoJWQpIiwgbUNvbm5JZCwgbG9vcCk7CkBAIC0xMDI3LDkgKzExMjUsMTcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKICAgICBBTE9HVigiWyVkXSBzZXRQYXJhbWV0ZXIoJWQpIiwgbUNvbm5JZCwga2V5KTsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKLSAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgc3dpdGNoIChrZXkpIHsKKyAgICBjYXNlIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICAgICAgaWYgKHAgPT0gMCkgeyByZXR1cm4gVU5LTk9XTl9FUlJPUjsgfQorICAgICAgICByZXR1cm4gcC0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKQEAgLTExODYsOSArMTI5MiwxNCBAQAogfQogI2VuZGlmCiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHVybCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90KiBwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3QgKnBTaXplKQorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpkZWNvZGUoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICBpbnQqIHBOdW1DaGFubmVscywKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgc2l6ZV90ICpwU2l6ZSkKIHsKICAgICBBTE9HVigiZGVjb2RlKCVzKSIsIHVybCk7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwbGF5ZXI7CkBAIC0xMjE2LDcgKzEzMjcsNyBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocGxheWVyLmdldCgpKS0+c2V0QXVkaW9TaW5rKGNhY2hlKTsKIAogICAgIC8vIHNldCBkYXRhIHNvdXJjZQotICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UodXJsKSAhPSBOT19FUlJPUikgZ290byBFeGl0OworICAgIGlmIChwbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCkgIT0gTk9fRVJST1IpIGdvdG8gRXhpdDsKIAogICAgIEFMT0dWKCJwcmVwYXJlIik7CiAgICAgcGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKQEAgLTEzMDYsMTMgKzE0MTcsMTUgQEAKIAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TaW5rIgotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6QXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCkKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGludCBzZXNzaW9uSWQsIGludCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKICAgICA6IG1DYWxsYmFjayhOVUxMKSwKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtQnl0ZXNXcml0dGVuKDApLAogICAgICAgbVNlc3Npb25JZChzZXNzaW9uSWQpLAogICAgICAgbVVpZCh1aWQpLAorICAgICAgbVBpZChwaWQpLAogICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKICAgICBBTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKQEAgLTEzMjQsNiArMTQzNyw3IEBACiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtU2VuZExldmVsID0gMC4wOwogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbUF0dHJpYnV0ZXMgPSBhdHRyOwogfQogCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp+QXVkaW9PdXRwdXQoKQpAQCAtMTM5NCw2ICsxNTA4LDEyIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdAoreworICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QKIHsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwpAQCAtMTQxMyw2ICsxNTMzLDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcykgeworICAgIG1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKK30KKwogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpkZWxldGVSZWN5Y2xlZFRyYWNrKCkKIHsKICAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFjayIpOwpAQCAtMTQ2MCw3ICsxNTg0LDcgQEAKICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgdWludDMyX3QgZnJhbWVDb3VudDsKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CkBAIC0xNTYxLDcgKzE2ODUsOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSywKICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgICAgIG1VaWQpOworICAgICAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLApAQCAtMTU3NiwxMyArMTcwMiwxOSBAQAogICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICAgICAgbVVpZCk7CisgICAgICAgICAgICAgICAgICAgIG1VaWQsCisgICAgICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAorICAgICAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSB0LT5zdHJlYW1UeXBlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2ODIsMTIgKzE4MTQsMTQgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIExPR19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKICAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gcmV0OworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTc4Nyw3ICsxOTIxLDggQEAKICAgICAgICAgICAgICAgICBtZSwgYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSwgbWUtPm1DYWxsYmFja0Nvb2tpZSwKICAgICAgICAgICAgICAgICBDQl9FVkVOVF9GSUxMX0JVRkZFUik7CiAKLSAgICAgICAgaWYgKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKKyAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKICAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgogCkBAIC0xODMzLDcgKzE5NjgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb0NhY2hlIgogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpBdWRpb0NhY2hlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgOgogICAgIG1IZWFwKGhlYXApLCBtQ2hhbm5lbENvdW50KDApLCBtRnJhbWVDb3VudCgxMDI0KSwgbVNhbXBsZVJhdGUoMCksIG1TaXplKDApLAotICAgIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQorICAgIG1GcmFtZVNpemUoMSksIG1FcnJvcihOT19FUlJPUiksICBtQ29tbWFuZENvbXBsZXRlKGZhbHNlKQogewogfQogCkBAIC0xODUwLDE0ICsxOTg1LDIzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKIHsKICAgICBpZiAocG9zaXRpb24gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqcG9zaXRpb24gPSBtU2l6ZTsKKyAgICAqcG9zaXRpb24gPSBtU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0Cit7CisgICAgdHMubVBvc2l0aW9uID0gbVNpemUgLyBtRnJhbWVTaXplOworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHRzLm1UaW1lLnR2X3NlYyA9IG5vdyAvIDEwMDAwMDAwMDBMTDsKKyAgICB0cy5tVGltZS50dl9uc2VjID0gbm93IC0gKDEwMDAwMDAwMDBMTCAqIHRzLm1UaW1lLnR2X3NlYyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6OmdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKndyaXR0ZW4pIGNvbnN0CiB7CiAgICAgaWYgKHdyaXR0ZW4gPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqd3JpdHRlbiA9IG1TaXplOworICAgICp3cml0dGVuID0gbVNpemUgLyBtRnJhbWVTaXplOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMTkxOSw2ICsyMDYzLDggQEAKIAogICAgIGlmIChhY3R1YWxTaXplID4gMCkgewogICAgICAgICBzaW5rLT53cml0ZShtQnVmZmVyLCBhY3R1YWxTaXplKTsKKyAgICAgICAgLy8gQ291bGQgcmV0dXJuIGZhbHNlIG9uIHNpbmstPndyaXRlKCkgZXJyb3Igb3Igc2hvcnQgY291bnQuCisgICAgICAgIC8vIE5vdCBuZWNlc3NhcmlseSBhcHByb3ByaWF0ZSBidXQgd291bGQgd29yayBmb3IgQXVkaW9DYWNoZSBiZWhhdmlvci4KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE5MjksOCArMjA3NSw4IEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvQ2FjaGU6Om9wZW4oCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLywKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QqIC8qb2ZmbG9hZEluZm8qLykKIHsKICAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLCBmb3JtYXQsIGJ1ZmZlckNvdW50KTsKICAgICBpZiAobUhlYXAtPmdldEhlYXBJRCgpIDwgMCkgewpAQCAtMTk0MSw2ICsyMDg3LDkgQEAKICAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KWNoYW5uZWxDb3VudDsKICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKKyAgICBtRnJhbWVTaXplID0gIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkKKyAgICAgICAgICAgID8gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCkgOiAxOworICAgIG1GcmFtZUNvdW50ID0gbUhlYXAtPmdldFNpemUoKSAvIG1GcmFtZVNpemU7CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewogICAgICAgICBtQ2FsbGJhY2tUaHJlYWQgPSBuZXcgQ2FsbGJhY2tUaHJlYWQodGhpcywgY2IsIGNvb2tpZSk7CkBAIC0xOTcwLDEyICsyMTE5LDI2IEBACiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcCArPSBtU2l6ZTsKICAgICBBTE9HVigibWVtY3B5KCVwLCAlcCwgJXUpIiwgcCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobVNpemUgKyBzaXplID4gbUhlYXAtPmdldFNpemUoKSkgeworCisgICAgYm9vbCBvdmVyZmxvdyA9IG1TaXplICsgc2l6ZSA+IG1IZWFwLT5nZXRTaXplKCk7CisgICAgaWYgKG92ZXJmbG93KSB7CiAgICAgICAgIEFMT0dFKCJIZWFwIHNpemUgb3ZlcmZsb3chIHJlcSBzaXplOiAlZCwgbWF4IHNpemU6ICVkIiwgKG1TaXplICsgc2l6ZSksIG1IZWFwLT5nZXRTaXplKCkpOwogICAgICAgICBzaXplID0gbUhlYXAtPmdldFNpemUoKSAtIG1TaXplOwogICAgIH0KKyAgICBzaXplIC09IHNpemUgJSBtRnJhbWVTaXplOyAvLyBjb25zdW1lIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBmcmFtZSBzaXplCiAgICAgbWVtY3B5KHAsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgbVNpemUgKz0gc2l6ZTsKKworICAgIGlmIChvdmVyZmxvdykgeworICAgICAgICAvLyBTaWduYWwgaGVhcCBmaWxsZWQgaGVyZSAobGFzdCBmcmFtZSBtYXkgYmUgdHJ1bmNhdGVkKS4KKyAgICAgICAgLy8gQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbW9yZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZQorICAgICAgICAvLyBoZWFwIGlzIGZpbGxlZCBhbmQgdGhlIEF1ZGlvQ2FjaGUgc2hvdWxkIGJlIGVmZmVjdGl2ZWx5CisgICAgICAgIC8vIGltbXV0YWJsZSB3aXRoIHJlc3BlY3QgdG8gZnV0dXJlIHdyaXRlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSXQgaXMgdGh1cyBzYWZlIGZvciBhbm90aGVyIHRocmVhZCB0byByZWFkIHRoZSBBdWRpb0NhY2hlLgorICAgICAgICBtQ29tbWFuZENvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgbVNpZ25hbC5zaWduYWwoKTsKKyAgICB9CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTE5OTcsNyArMjE2MCw3IEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb0NhY2hlOjpub3RpZnkoCi0gICAgICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikKKyAgICAgICAgdm9pZCogY29va2llLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCogLypvYmoqLykKIHsKICAgICBBTE9HVigibm90aWZ5KCVwLCAlZCwgJWQsICVkKSIsIGNvb2tpZSwgbXNnLCBleHQxLCBleHQyKTsKICAgICBBdWRpb0NhY2hlKiBwID0gc3RhdGljX2Nhc3Q8QXVkaW9DYWNoZSo+KGNvb2tpZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggNTViZjNjZC4uOWVmMjE4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkLCBpbnQgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCwgaW50IHVpZCwgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CiAKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVhZHkoKSBjb25zdCB7IHJldHVybiBtVHJhY2sgIT0gMDsgfQpAQCAtODQsNiArODUsNyBAQAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMTA0LDYgKzEwNiw3IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKTsKQEAgLTEzMyw2ICsxMzYsNyBAQAogICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICptQXR0cmlidXRlczsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZVBlcm1pbGxlOwpAQCAtMTQwLDYgKzE0NCw3IEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7CkBAIC0xOTAsMTAgKzE5NSwxMSBAQAogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gZnJhbWVTaXplKCkgKiBtRnJhbWVDb3VudDsgfQogICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KICAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUNoYW5uZWxDb3VudDsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBzc2l6ZV90KG1DaGFubmVsQ291bnQgKiAoKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpP3NpemVvZihpbnQxNl90KTpzaXplb2YodV9pbnQ4X3QpKSk7IH0KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgZnJhbWVTaXplKCkgY29uc3QgeyByZXR1cm4gKHNzaXplX3QpbUZyYW1lU2l6ZTsgfQogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwpAQCAtMjExLDEyICsyMTcsMTIgQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZmx1c2goKSB7fQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBwYXVzZSgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCkge30KLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkge30KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSBfX3VudXNlZCkge30KICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gdHlwZSBpcyBub3QgdXNlZCBmb3IgQXVkaW9DYWNoZQogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7IH0KIAotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHt9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIHt9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlIF9fdW51c2VkKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1TaXplOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUVycm9yOwogICAgICAgICBib29sICAgICAgICAgICAgICAgIG1Db21tYW5kQ29tcGxldGU7CiAKQEAgLTI1NiwxMyArMjYzLDIwIEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGF1ZGlvU2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoY29uc3QgY2hhciogdXJsLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCAqcFNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBkZWNvZGUoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAorICAgICAgICAgICAgaW50KiBwTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwKKyAgICAgICAgICAgIHNpemVfdCAqcFNpemUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCogcEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90ICpwU2l6ZSk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKTsKICAgICB2aXJ0dWFsIHNwPElDcnlwdG8+ICAgICAgICAgbWFrZUNyeXB0bygpOwogICAgIHZpcnR1YWwgc3A8SURybT4gICAgICAgICAgICBtYWtlRHJtKCk7CkBAIC0yNzIsOSArMjg2LDYgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGlmYWNlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpOwotCiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZUNsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGhhc0NsaWVudCh3cDxDbGllbnQ+IGNsaWVudCk7CiAKQEAgLTM1Nyw2ICszNjgsNyBAQAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBjcmVhdGVQbGF5ZXIocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTQwNiw2ICs0MTgsOCBAQAogICAgICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgQU5hdGl2ZVdpbmRvdy4KICAgICAgICAgdm9pZCBkaXNjb25uZWN0TmF0aXZlV2luZG93KCk7CiAKKyAgICAgICAgc3RhdHVzX3Qgc2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKKwogICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgICAgICBtUGxheWVyOwogICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+ICAgICAgbVNlcnZpY2U7CkBAIC00MTYsNiArNDMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUNvbm5JZDsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVUlEOwogICAgICAgICAgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRXaW5kb3dCaW5kZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggYTk4MjBlMC4uMTk0YWJiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtOTUsNyArOTUsOCBAQAogc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0VmlkZW9Tb3VyY2UoaW50IHZzKQogewogICAgIEFMT0dWKCJzZXRWaWRlb1NvdXJjZSglZCkiLCB2cyk7Ci0gICAgaWYgKCFjaGVja1Blcm1pc3Npb24oY2FtZXJhUGVybWlzc2lvbikpIHsKKyAgICAvLyBDaGVjayBjYW1lcmEgcGVybWlzc2lvbiBmb3Igc291cmNlcyBvdGhlciB0aGFuIFNVUkZBQ0UKKyAgICBpZiAodnMgIT0gVklERU9fU09VUkNFX1NVUkZBQ0UgJiYgIWNoZWNrUGVybWlzc2lvbihjYW1lcmFQZXJtaXNzaW9uKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCmluZGV4IDdlOTA5MjQuLmFhNThiMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgpAQCAtNTYsNyArNTcsNyBAQAogICAgIGRpc2Nvbm5lY3QoKTsKIH0KIAotc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAorc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3QKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTEwNiw3ICsxMDcsOSBAQAogfQogCiBzdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTEyNyw3ICsxMzAsNyBAQAogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+IHAgPSBjcmVhdGVSZXRyaWV2ZXIocGxheWVyVHlwZSk7CiAgICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpOworICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgbVJldHJpZXZlciA9IHA7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTE0NCw4ICsxNDcsOCBAQAogICAgIH0KICAgICBBTE9HVigic3RfZGV2ICA9ICVsbHUiLCBzYi5zdF9kZXYpOwogICAgIEFMT0dWKCJzdF9tb2RlID0gJXUiLCBzYi5zdF9tb2RlKTsKLSAgICBBTE9HVigic3RfdWlkICA9ICVsdSIsIHNiLnN0X3VpZCk7Ci0gICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzYi5zdF9naWQpOworICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfdWlkKSk7CisgICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF9naWQpKTsKICAgICBBTE9HVigic3Rfc2l6ZSA9ICVsbHUiLCBzYi5zdF9zaXplKTsKIAogICAgIGlmIChvZmZzZXQgPj0gc2Iuc3Rfc2l6ZSkgewpAQCAtMjMxLDcgKzIzNCw3IEBACiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZXh0cmFjdCBhbiBhbGJ1bSBhcnQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKE1lZGlhQWxidW1BcnQpICsgYWxidW1BcnQtPm1TaXplOworICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKE1lZGlhQWxidW1BcnQpICsgYWxidW1BcnQtPnNpemUoKTsKICAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQiKTsKICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIE1lbW9yeURlYWxlciBvYmplY3QiKTsKQEAgLTI0NCwxMSArMjQ3LDkgQEAKICAgICAgICAgZGVsZXRlIGFsYnVtQXJ0OwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgTWVkaWFBbGJ1bUFydCAqYWxidW1BcnRDb3B5ID0gc3RhdGljX2Nhc3Q8TWVkaWFBbGJ1bUFydCAqPihtQWxidW1BcnQtPnBvaW50ZXIoKSk7Ci0gICAgYWxidW1BcnRDb3B5LT5tU2l6ZSA9IGFsYnVtQXJ0LT5tU2l6ZTsKLSAgICBhbGJ1bUFydENvcHktPm1EYXRhID0gKHVpbnQ4X3QgKilhbGJ1bUFydENvcHkgKyBzaXplb2YoTWVkaWFBbGJ1bUFydCk7Ci0gICAgbWVtY3B5KGFsYnVtQXJ0Q29weS0+bURhdGEsIGFsYnVtQXJ0LT5tRGF0YSwgYWxidW1BcnQtPm1TaXplKTsKLSAgICBkZWxldGUgYWxidW1BcnQ7ICAvLyBGaXggbWVtb3J5IGxlYWthZ2UKKyAgICBNZWRpYUFsYnVtQXJ0Ojppbml0KChNZWRpYUFsYnVtQXJ0ICopIG1BbGJ1bUFydC0+cG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxidW1BcnQtPnNpemUoKSwgYWxidW1BcnQtPmRhdGEoKSk7CisgICAgZGVsZXRlIGFsYnVtQXJ0OyAgLy8gV2UndmUgdGFrZW4gb3VyIGNvcHkuCiAgICAgcmV0dXJuIG1BbGJ1bUFydDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBmMDhmOTMzLi45ZDNmYmU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtMzAsNiArMzAsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVBsYXllclNlcnZpY2U7CiBjbGFzcyBNZW1vcnlEZWFsZXI7CiAKQEAgLTQzLDcgKzQ0LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAppbmRleCAwYTZhYTkwLi43NDllZjk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKQEAgLTExNCw3ICsxMTQsOSBAQAogfQogCiBzdGF0dXNfdCBNaWRpRmlsZTo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciogcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKikgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJiAvKmh0dHBTZXJ2aWNlKi8sCisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICopIHsKICAgICBBTE9HVigiTWlkaUZpbGU6OnNldERhdGFTb3VyY2UgdXJsPSVzIiwgcGF0aCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAppbmRleCAyNGQ1OWI0Li44MmU0ZTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuaApAQCAtMzIsMTEgKzMyLDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIC8qYnVmZmVyUHJvZHVjZXIqLykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKTsKQEAgLTUxLDEzICs1MywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldExvb3BpbmcoaW50IGxvb3ApOwogICAgIHZpcnR1YWwgcGxheWVyX3R5cGUgcGxheWVyVHlwZSgpIHsgcmV0dXJuIFNPTklWT1hfUExBWUVSOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbnZva2UoY29uc3QgUGFyY2VsJiAvKnJlcXVlc3QqLywgUGFyY2VsKiAvKnJlcGx5Ki8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQgLyprZXkqLywgY29uc3QgUGFyY2VsICYvKnJlcXVlc3QqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBhcmFtZXRlcihpbnQgLyprZXkqLywgUGFyY2VsKiAvKnJlcGx5Ki8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA0NjUyMDlmLi5mM2NmNmVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgIk1pZGlNZXRhZGF0YVJldHJpZXZlci5oIgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9PUEVOID0gLTE7CkBAIC0zNiw3ICszOCw5IEBACiB9CiAKIHN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKIHsKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZTogJXMiLCB1cmw/IHVybDogIk5VTEwgcG9pbnRlciIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTQ0LDcgKzQ4LDcgQEAKICAgICBpZiAobU1pZGlQbGF5ZXIgPT0gMCkgewogICAgICAgICBtTWlkaVBsYXllciA9IG5ldyBNaWRpRmlsZSgpOwogICAgIH0KLSAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICByZXR1cm4gbU1pZGlQbGF5ZXItPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CiB9CiAKIHN0YXR1c190IE1pZGlNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpTWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCA0Y2VlNDJkLi5iODIxNGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0zMiw3ICszMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5NaWRpTWV0YWRhdGFSZXRyaWV2ZXIoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAppbmRleCBkZTYxZDliLi5iMzdhZWUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKQEAgLTU0LDggKzU0LDEwIEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UGxheWVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogfQogCiAvLyBXYXJuaW5nOiBUaGUgZmlsZWRlc2NyaXB0b3IgcGFzc2VkIGludG8gdGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIHZhbGlkIHVudGlsCkBAIC0xODcsNyArMTg5LDcgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpIHsKKyAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIC8qIGlkcyAqLywgUGFyY2VsICpyZWNvcmRzKSB7CiAgICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwogCiAgICAgdWludDMyX3QgZmxhZ3MgPSBtUGxheWVyLT5mbGFncygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAppbmRleCA2MDA5NDVlLi5lNmMzMGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaApAQCAtMzQsNyArMzQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggZjlkOTAyMC4uY2FkZDY5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMTYsMTYgKzE2LDIxIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRSZWNvcmRlciIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiV2VibVdyaXRlci5oIgogI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CkBAIC0zNSwxMyArNDAsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC03MSw4ICs3NSw3IEBACiAgICAgICBtQXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0NOVCksCiAgICAgICBtVmlkZW9Tb3VyY2UoVklERU9fU09VUkNFX0xJU1RfRU5EKSwKICAgICAgIG1DYXB0dXJlVGltZUxhcHNlKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogICAgIHJlc2V0KCk7CkBAIC04MSwxMCArODQsMTkgQEAKIFN0YWdlZnJpZ2h0UmVjb3JkZXI6On5TdGFnZWZyaWdodFJlY29yZGVyKCkgewogICAgIEFMT0dWKCJEZXN0cnVjdG9yIik7CiAgICAgc3RvcCgpOworCisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjppbml0KCkgewogICAgIEFMT0dWKCJpbml0Iik7CisKKyAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUxvb3Blci0+c2V0TmFtZSgicmVjb3JkZXJfbG9vcGVyIik7CisgICAgbUxvb3Blci0+c3RhcnQoKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtOTMsNyArMTA1LDcgQEAKIC8vIHdoaWxlIGVuY29kaW5nIEdMIEZyYW1lcwogc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSBjb25zdCB7CiAgICAgQUxPR1YoIkdldCBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICByZXR1cm4gbVN1cmZhY2VNZWRpYVNvdXJjZS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0QXVkaW9Tb3VyY2UoYXVkaW9fc291cmNlX3QgYXMpIHsKQEAgLTE3MiwxMSArMTg0LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBpZiAodmUgPT0gVklERU9fRU5DT0RFUl9ERUZBVUxUKSB7Ci0gICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX0gyNjM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVZpZGVvRW5jb2RlciA9IHZlOwotICAgIH0KKyAgICBtVmlkZW9FbmNvZGVyID0gdmU7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMzMsNyArMjQxLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICogLyogcGF0aCAqLykgewogICAgIEFMT0dFKCJzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqKSBtdXN0IG5vdCBiZSBjYWxsZWQiKTsKICAgICAvLyBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHRoaXMgYXQgYWxsLCBhcyB0aGUgbWVkaWFfc2VydmVyIHByb2Nlc3MKICAgICAvLyBubyBsb25nZXIgaGFzIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBmaWxlcy4KQEAgLTY4MCwxMCArNjg4LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lTGFwc2VFbmFibGUodGltZUxhcHNlRW5hYmxlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ0aW1lLWJldHdlZW4tdGltZS1sYXBzZS1mcmFtZS1jYXB0dXJlIikgewotICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlTXM7Ci0gICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcykpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgMTAwMExMICogdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVNcyk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcjogZmFpbGVkIHRvIGZpbmQga2V5ICVzIiwga2V5LnN0cmluZygpKTsKQEAgLTczOCwxOSArNzQ2LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwcmVwYXJlKCkgewotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnQoKSB7Ci0gICAgQ0hFQ0tfR0UobU91dHB1dEZkLCAwKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnByZXBhcmVJbnRlcm5hbCgpIHsKKyAgICBBTE9HVigicHJlcGFyZSIpOworICAgIGlmIChtT3V0cHV0RmQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIC8vIEdldCBVSUQgaGVyZSBmb3IgcGVybWlzc2lvbiBjaGVja2luZwogICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKIApAQCAtNzU4LDI1ICs3NjIsMjYgQEAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0RFRkFVTFQ6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHXzQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydE1QRUc0UmVjb3JkaW5nKCk7CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9XRUJNOgorICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9OQjoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9XQjoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0QU1SUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBzZXR1cEFNUlJlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGFydEFBQ1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBBQUNSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgotICAgICAgICAgICAgc3RhdHVzID0gc3RhcnRSVFBSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKLSAgICAgICAgICAgIHN0YXR1cyA9IHN0YXJ0TVBFRzJUU1JlY29yZGluZygpOworICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNzg1LDYgKzc5MCw3NyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6cHJlcGFyZSgpIHsKKyAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIHJldHVybiBwcmVwYXJlSW50ZXJuYWwoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGZpbGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBPSzsKKworICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgc3RhdHVzID0gcHJlcGFyZUludGVybmFsKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVdyaXRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGaWxlIHdyaXRlciBpcyBub3QgYXZhaWFsYmxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHN3aXRjaCAobU91dHB1dEZvcm1hdCkgeworICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX01QRUdfNDoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1dFQk06CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNNUEVHNCA9IHRydWU7CisgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgICAgICBpc01QRUc0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgIHNldHVwTVBFRzRvcldFQk1NZXRhRGF0YSgmbWV0YSk7CisgICAgICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9OQjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FNUl9XQjoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX0FBQ19BRElGOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgbVdyaXRlci5jbGVhcigpOworICAgICAgICBtV3JpdGVyID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAoKHN0YXR1cyA9PSBPSykgJiYgKCFtU3RhcnRlZCkpIHsKICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCkBAIC04MTYsNTggKzg5Miw1OCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gZW5jTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgc3dpdGNoIChtQXVkaW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfTkI6CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9ERUZBVUxUOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX1dCOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDOgotICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLSAgICAgICAgICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlBQUNQcm9maWxlLCBPTVhfQVVESU9fQUFDT2JqZWN0TEMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0TEMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9IRV9BQUM6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUFBQ1Byb2ZpbGUsIE9NWF9BVURJT19BQUNPYmplY3RIRSk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RIRSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6Ci0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotICAgICAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUFBQ1Byb2ZpbGUsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGVuY01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwogICAgIENIRUNLKGF1ZGlvU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgIGtLZXlNYXhJbnB1dFNpemUsICZtYXhJbnB1dFNpemUpKTsKIAotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7Ci0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUF1ZGlvQ2hhbm5lbHMpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1BdWRpb0JpdFJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgbWF4SW5wdXRTaXplKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbUF1ZGlvQ2hhbm5lbHMpOworICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgbVNhbXBsZVJhdGUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtQXVkaW9CaXRSYXRlKTsKICAgICBpZiAobUF1ZGlvVGltZVNjYWxlID4gMCkgewotICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtQXVkaW9UaW1lU2NhbGUpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ0aW1lLXNjYWxlIiwgbUF1ZGlvVGltZVNjYWxlKTsKICAgICB9CiAKLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlciA9Ci0gICAgICAgIE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBlbmNNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgYXVkaW9Tb3VyY2UpOworICAgICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKG1Mb29wZXIsIGZvcm1hdCwgYXVkaW9Tb3VyY2UpOwogICAgIG1BdWRpb1NvdXJjZU5vZGUgPSBhdWRpb1NvdXJjZTsKIAorICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBhdWRpbyBlbmNvZGVyIik7CisgICAgfQorCiAgICAgcmV0dXJuIGF1ZGlvRW5jb2RlcjsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBQUNSZWNvcmRpbmcoKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFBQ1JlY29yZGluZygpIHsKICAgICAvLyBGSVhNRToKICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRgogICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMpOwpAQCAtODc4LDE2ICs5NTQsMTAgQEAKICAgICBDSEVDSyhtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCk7CiAKICAgICBtV3JpdGVyID0gbmV3IEFBQ1dyaXRlcihtT3V0cHV0RmQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgbVdyaXRlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydEFNUlJlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQU1SUmVjb3JkaW5nKCkgewogICAgIENIRUNLKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIgfHwKICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX1dCKTsKIApAQCAtOTA3LDE1ICs5NzcsMTAgQEAKICAgICB9CiAKICAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihtT3V0cHV0RmQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmF3QXVkaW9SZWNvcmRpbmcoKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgbVdyaXRlciA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRSYXdBdWRpb1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKSB7CiAgICAgaWYgKG1BdWRpb1NvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTQxLDEyICsxMDA2LDExIEBACiAgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKICAgICB9CiAgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKLSAgICBtV3JpdGVyLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJUUFJlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwUlRQUmVjb3JkaW5nKCkgewogICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCk7CiAKICAgICBpZiAoKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UCkBAIC05NjYsNiArMTAzMCw3IEBACiAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgIHNvdXJjZSA9IGNyZWF0ZUF1ZGlvU291cmNlKCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cE1lZGlhU291cmNlKCZtZWRpYVNvdXJjZSk7CkBAIC05NzMsNyArMTAzOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIG1WaWRlb0JpdFJhdGUsICZzb3VyY2UpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJnNvdXJjZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KQEAgLTk4MywxMCArMTA0OCwxMCBAQAogICAgIG1Xcml0ZXItPmFkZFNvdXJjZShzb3VyY2UpOwogICAgIG1Xcml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7CiAKLSAgICByZXR1cm4gbVdyaXRlci0+c3RhcnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0TVBFRzJUU1JlY29yZGluZygpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzJUU1JlY29yZGluZygpIHsKICAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX01QRUcyVFMpOwogCiAgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHMlRTV3JpdGVyKG1PdXRwdXRGZCk7CkBAIC0xMDA3LDYgKzEwNzIsNyBAQAogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSA8IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewogICAgICAgICBpZiAobVZpZGVvRW5jb2RlciAhPSBWSURFT19FTkNPREVSX0gyNjQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNUEVHMlRTIHJlY29yZGluZyBvbmx5IHN1cHBvcnRzIEguMjY0IGVuY29kaW5nISIpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKQEAgLTEwMTcsNyArMTA4Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIG1WaWRlb0JpdFJhdGUsICZlbmNvZGVyKTsKKyAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsICZlbmNvZGVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTAzNiwxMSArMTEwMiwxNyBAQAogCiAgICAgbVdyaXRlciA9IHdyaXRlcjsKIAotICAgIHJldHVybiBtV3JpdGVyLT5zdGFydCgpOworICAgIHJldHVybiBPSzsKIH0KIAogdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZVJhdGUoKSB7CiAgICAgQUxPR1YoImNsaXBWaWRlb0ZyYW1lUmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtRnJhbWVSYXRlID09IC0xKSB7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgInZpZC5mcHMiLCBtQ2FtZXJhSWQsIENBTUNPUkRFUl9RVUFMSVRZX0xPVyk7CisgICAgICAgIEFMT0dXKCJVc2luZyBkZWZhdWx0IHZpZGVvIGZwcyAlZCIsIG1GcmFtZVJhdGUpOworICAgIH0KKwogICAgIGludCBtaW5GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmZwcy5taW4iLCBtVmlkZW9FbmNvZGVyKTsKICAgICBpbnQgbWF4RnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCkBAIC0xMTAwLDYgKzExNzIsNyBAQAogICAgICAgICAgICAgY2xpZW50LmludGVyZmFjZSgpLAogICAgICAgICAgICAgKG1WaWRlb0VuY29kZXIgPT0gVklERU9fRU5DT0RFUl9IMjYzID8gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MyA6CiAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9PSBWSURFT19FTkNPREVSX01QRUdfNF9TUCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0IDoKKyAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDoKICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfSDI2NCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA6ICIiKSwKICAgICAgICAgICAgIGZhbHNlIC8qIGRlY29kZXIgKi8sIHRydWUgLyogaHdDb2RlYyAqLywgJmNvZGVjcyk7CiAgICAgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlID0gY29kZWNzLnNpemUoKSA+IDA7CkBAIC0xMTcyLDYgKzEyNDUsMzEgQEAKICAgICAgICAgaWYgKHZpZGVvQ29kZWMgPT0gVklERU9fRU5DT0RFUl9IMjY0KSB7CiAgICAgICAgICAgICBBTE9HSSgiRm9yY2UgdG8gdXNlIEFWQyBiYXNlbGluZSBwcm9maWxlIik7CiAgICAgICAgICAgICBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSk7CisgICAgICAgICAgICAvLyBzZXQgMCBmb3IgaW52YWxpZCBsZXZlbHMgLSB0aGlzIHdpbGwgYmUgcmVqZWN0ZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb2RlYyBpZiBpdCBjYW5ub3QgaGFuZGxlIGl0IGR1cmluZyBjb25maWd1cmUKKyAgICAgICAgICAgIHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoQUNvZGVjOjpnZXRBVkNMZXZlbEZvcigKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZVdpZHRoLCB2aWRlb0ZyYW1lSGVpZ2h0LCB2aWRlb0ZyYW1lUmF0ZSwgdmlkZW9CaXRSYXRlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCkgeworICAgIGlmIChtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfREVGQVVMVCkgeworICAgICAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gVlA4IGZvciBXRUJNIHJlY29yZGluZworICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9IFZJREVPX0VOQ09ERVJfVlA4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcGljayB0aGUgZGVmYXVsdCBlbmNvZGVyIGZvciBDQU1DT1JERVJfUVVBTElUWV9MT1cKKyAgICAgICAgICAgIGludCB2aWRlb0NvZGVjID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAidmlkLmNvZGVjIiwgbUNhbWVyYUlkLCBDQU1DT1JERVJfUVVBTElUWV9MT1cpOworCisgICAgICAgICAgICBpZiAodmlkZW9Db2RlYyA+IFZJREVPX0VOQ09ERVJfREVGQVVMVCAmJgorICAgICAgICAgICAgICAgIHZpZGVvQ29kZWMgPCBWSURFT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvRW5jb2RlciA9ICh2aWRlb19lbmNvZGVyKXZpZGVvQ29kZWM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gSC4yNjQgaWYgY2FtY29yZGVyIHByb2ZpbGUgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX0gyNjQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xMjc3LDQ5ICsxMzc1LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgICptZWRpYVNvdXJjZSA9IGNhbWVyYVNvdXJjZTsKLSAgICB9IGVsc2UgaWYgKG1WaWRlb1NvdXJjZSA9PSBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIpIHsKLSAgICAgICAgLy8gSWYgdXNpbmcgR1JBbGxvYyBidWZmZXJzLCBzZXR1cCBzdXJmYWNlbWVkaWFzb3VyY2UuCi0gICAgICAgIC8vIExhdGVyIGEgaGFuZGxlIHRvIHRoYXQgd2lsbCBiZSBwYXNzZWQKLSAgICAgICAgLy8gdG8gdGhlIGNsaWVudCBzaWRlIHdoZW4gcXVlcmllZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICptZWRpYVNvdXJjZSA9IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX1NVUkZBQ0UpIHsKKyAgICAgICAgKm1lZGlhU291cmNlID0gTlVMTDsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotLy8gc2V0dXBTdXJmYWNlTWVkaWFTb3VyY2UgY3JlYXRlcyBhIHNvdXJjZSB3aXRoIHRoZSBnaXZlbgotLy8gd2lkdGggYW5kIGhlaWdodCBhbmQgZnJhbWVyYXRlLgotLy8gVE9ETzogVGhpcyBjb3VsZCBnbyBpbiBhIHN0YXRpYyBmdW5jdGlvbiBpbnNpZGUgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBzaW1pbGFyIHRvIHRoYXQgaW4gQ2FtZXJhU291cmNlCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFN1cmZhY2VNZWRpYVNvdXJjZSgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBtU3VyZmFjZU1lZGlhU291cmNlID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICBpZiAobVN1cmZhY2VNZWRpYVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGlmIChtRnJhbWVSYXRlID09IC0xKSB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gMDsKLSAgICAgICAgQ0hFQ0sgKG1TdXJmYWNlTWVkaWFTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleUZyYW1lUmF0ZSwgJmZyYW1lUmF0ZSkpOwotICAgICAgICBBTE9HSSgiRnJhbWUgcmF0ZSBpcyBub3QgZXhwbGljaXRseSBzZXQuIFVzZSB0aGUgY3VycmVudCBmcmFtZSAiCi0gICAgICAgICAgICAgInJhdGUgKCVkIGZwcykiLCBmcmFtZVJhdGUpOwotICAgICAgICBtRnJhbWVSYXRlID0gZnJhbWVSYXRlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1TdXJmYWNlTWVkaWFTb3VyY2UtPnNldEZyYW1lUmF0ZShtRnJhbWVSYXRlKTsKLSAgICB9Ci0gICAgQ0hFQ0sobUZyYW1lUmF0ZSAhPSAtMSk7Ci0KLSAgICBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0KLSAgICAgICAgbVN1cmZhY2VNZWRpYVNvdXJjZS0+aXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBDYW1lcmFTb3VyY2UoCiAgICAgICAgIHNwPENhbWVyYVNvdXJjZT4gKmNhbWVyYVNvdXJjZSkgewogICAgIHN0YXR1c190IGVyciA9IE9LOwpAQCAtMTM4MywyNSArMTQ0NiwyNiBAQAogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cFZpZGVvRW5jb2RlcigKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCiAgICAgICAgIHNwPE1lZGlhU291cmNlPiAqc291cmNlKSB7CiAgICAgc291cmNlLT5jbGVhcigpOwogCi0gICAgc3A8TWV0YURhdGE+IGVuY19tZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgdmlkZW9CaXRSYXRlKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwogCiAgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJREVPX0VOQ09ERVJfTVBFR180X1NQOgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgotICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX1ZQODoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDA5LDU5ICsxNDczLDgwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKGNhbWVyYVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTbGljZUhlaWdodCwgJnNsaWNlSGVpZ2h0KSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOwogCi0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKLSAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7Ci0gICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgc3RyaWRlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0Iiwgc2xpY2VIZWlnaHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBjb2xvckZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBtVmlkZW9XaWR0aCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInN0cmlkZSIsIG1WaWRlb1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgbVZpZGVvV2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CisKKyAgICAgICAgLy8gc2V0IHVwIHRpbWUgbGFwc2Uvc2xvdyBtb3Rpb24gZm9yIHN1cmZhY2Ugc291cmNlCisgICAgICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSkgeworICAgICAgICAgICAgaWYgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBtVGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyB2YWx1ZTogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgidGltZS1sYXBzZSIsCisgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJmcmFtZS1yYXRlIiwgbUZyYW1lUmF0ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOworCiAgICAgaWYgKG1WaWRlb1RpbWVTY2FsZSA+IDApIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1WaWRlb1RpbWVTY2FsZSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInRpbWUtc2NhbGUiLCBtVmlkZW9UaW1lU2NhbGUpOwogICAgIH0KICAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKICAgICB9CiAgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgewotICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgbVZpZGVvRW5jb2RlckxldmVsKTsKICAgICB9CiAKLSAgICBPTVhDbGllbnQgY2xpZW50OwotICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICB1aW50MzJfdCBlbmNvZGVyX2ZsYWdzID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgaWYgKG1Jc01ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMpIHsKLSAgICAgICAgZW5jb2Rlcl9mbGFncyB8PSBPTVhDb2RlYzo6a1N0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVyczsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY1NvdXJjZTo6RkxBR19VU0VfTUVUQURBVEFfSU5QVVQ7CiAgICAgfQogCi0gICAgLy8gRG8gbm90IHdhaXQgZm9yIGFsbCB0aGUgaW5wdXQgYnVmZmVycyB0byBiZWNvbWUgYXZhaWxhYmxlLgotICAgIC8vIFRoaXMgZ2l2ZSB0aW1lbGFwc2UgdmlkZW8gcmVjb3JkaW5nIGZhc3RlciByZXNwb25zZSBpbgotICAgIC8vIHJlY2VpdmluZyBvdXRwdXQgZnJvbSB2aWRlbyBlbmNvZGVyIGNvbXBvbmVudC4KLSAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKLSAgICAgICAgZW5jb2Rlcl9mbGFncyB8PSBPTVhDb2RlYzo6a09ubHlTdWJtaXRPbmVJbnB1dEJ1ZmZlckF0T25lVGltZTsKKyAgICBpZiAoY2FtZXJhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY1NvdXJjZTo6RkxBR19VU0VfU1VSRkFDRV9JTlBVVDsKICAgICB9CiAKLSAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAotICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UsCi0gICAgICAgICAgICBOVUxMLCBlbmNvZGVyX2ZsYWdzKTsKKyAgICBzcDxNZWRpYUNvZGVjU291cmNlPiBlbmNvZGVyID0KKyAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGNhbWVyYVNvdXJjZSwgZmxhZ3MpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgdmlkZW8gZW5jb2RlciIpOwogICAgICAgICAvLyBXaGVuIHRoZSBlbmNvZGVyIGZhaWxzIHRvIGJlIGNyZWF0ZWQsIHdlIG5lZWQKICAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2FtZXJhIHNvdXJjZSBkdWUgdG8gdGhlIGNhbWVyYSdzIGxvY2sKICAgICAgICAgLy8gYW5kIHVubG9jayBtZWNoYW5pc20uCi0gICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoY2FtZXJhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNhbWVyYVNvdXJjZS0+c3RvcCgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChjYW1lcmFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gZW5jb2Rlci0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfQorCiAgICAgKnNvdXJjZSA9IGVuY29kZXI7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNDk1LDE4ICsxNTgwLDIwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cE1QRUc0UmVjb3JkaW5nKAotICAgICAgICBpbnQgb3V0cHV0RmQsCi0gICAgICAgIGludDMyX3QgdmlkZW9XaWR0aCwgaW50MzJfdCB2aWRlb0hlaWdodCwKLSAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgIGludDMyX3QgKnRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWVkaWFXcml0ZXI+ICptZWRpYVdyaXRlcikgewotICAgIG1lZGlhV3JpdGVyLT5jbGVhcigpOwotICAgICp0b3RhbEJpdFJhdGUgPSAwOworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpIHsKKyAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgbVRvdGFsQml0UmF0ZSA9IDA7CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG91dHB1dEZkKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyOworICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICB3cml0ZXIgPSBuZXcgV2VibVdyaXRlcihtT3V0cHV0RmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihtT3V0cHV0RmQpOworICAgIH0KIAogICAgIGlmIChtVmlkZW9Tb3VyY2UgPCBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKICAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogICAgICAgICBlcnIgPSBzZXR1cE1lZGlhU291cmNlKCZtZWRpYVNvdXJjZSk7CkBAIC0xNTE1LDMxICsxNjAyLDM0IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlcjsKLSAgICAgICAgZXJyID0gc2V0dXBWaWRlb0VuY29kZXIobWVkaWFTb3VyY2UsIHZpZGVvQml0UmF0ZSwgJmVuY29kZXIpOworICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtZWRpYVNvdXJjZSwgJmVuY29kZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKICAgICAgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7Ci0gICAgICAgICp0b3RhbEJpdFJhdGUgKz0gdmlkZW9CaXRSYXRlOworICAgICAgICBtVG90YWxCaXRSYXRlICs9IG1WaWRlb0JpdFJhdGU7CiAgICAgfQogCi0gICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgotICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgotICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UgJiYgKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSkgewotICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAqdG90YWxCaXRSYXRlICs9IG1BdWRpb0JpdFJhdGU7Ci0gICAgfQorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCisgICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KKyAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgorICAgICAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgICAgICB9CiAKLSAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgewotICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgotICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7Ci0gICAgfQotICAgIGlmIChtTG9uZ2l0dWRleDEwMDAwID4gLTM2MDAwMDAgJiYgbUxhdGl0dWRleDEwMDAwID4gLTM2MDAwMDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldEdlb0RhdGEobUxhdGl0dWRleDEwMDAwLCBtTG9uZ2l0dWRleDEwMDAwKTsKKyAgICAgICAgaWYgKG1JbnRlcmxlYXZlRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TVBFRzRXcml0ZXIgKj4od3JpdGVyLmdldCgpKS0+CisgICAgICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Mb25naXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCAmJiBtTGF0aXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCkgeworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KKyAgICAgICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25VcyAhPSAwKSB7CiAgICAgICAgIHdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CkBAIC0xNTQ3LDU0ICsxNjM3LDM5IEBACiAgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKICAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgfQotCi0gICAgbVN0YXJ0VGltZU9mZnNldE1zID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMobUNhbWVyYUlkKTsKKyAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCisgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgeworICAgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRTdGFydFRpbWVPZmZzZXRNcyhtQ2FtZXJhSWQpOworICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9TVVJGQUNFKSB7CisgICAgICAgIC8vIHN1cmZhY2Ugc291cmNlIGRvZXNuJ3QgbmVlZCBsYXJnZSBpbml0aWFsIGRlbGF5CisgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IDIwMDsKKyAgICB9CiAgICAgaWYgKG1TdGFydFRpbWVPZmZzZXRNcyA+IDApIHsKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgIHNldFN0YXJ0VGltZU9mZnNldE1zKG1TdGFydFRpbWVPZmZzZXRNcyk7CisgICAgICAgIHdyaXRlci0+c2V0U3RhcnRUaW1lT2Zmc2V0TXMobVN0YXJ0VGltZU9mZnNldE1zKTsKICAgICB9CiAKICAgICB3cml0ZXItPnNldExpc3RlbmVyKG1MaXN0ZW5lcik7Ci0gICAgKm1lZGlhV3JpdGVyID0gd3JpdGVyOworICAgIG1Xcml0ZXIgPSB3cml0ZXI7CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRNZXRhRGF0YShpbnQ2NF90IHN0YXJ0VGltZVVzLCBpbnQzMl90IHRvdGFsQml0UmF0ZSwKLSAgICAgICAgc3A8TWV0YURhdGE+ICptZXRhKSB7Cit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwTVBFRzRvcldFQk1NZXRhRGF0YShzcDxNZXRhRGF0YT4gKm1ldGEpIHsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOwogICAgICgqbWV0YSktPnNldEludDMyKGtLZXlGaWxlVHlwZSwgbU91dHB1dEZvcm1hdCk7Ci0gICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIHRvdGFsQml0UmF0ZSk7Ci0gICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1Ub3RhbEJpdFJhdGUpOwogICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7CiAgICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CiAgICAgfQotICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgewotICAgICAgICAoKm1ldGEpLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKKyAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgbVVzZTY0Qml0RmlsZU9mZnNldCk7CisgICAgICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICAgICAgKCptZXRhKS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAobVJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgICgqbWV0YSktPnNldEludDMyKGtLZXlSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydE1QRUc0UmVjb3JkaW5nKCkgewotICAgIGludDMyX3QgdG90YWxCaXRSYXRlOwotICAgIHN0YXR1c190IGVyciA9IHNldHVwTVBFRzRSZWNvcmRpbmcoCi0gICAgICAgICAgICBtT3V0cHV0RmQsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQsCi0gICAgICAgICAgICBtVmlkZW9CaXRSYXRlLCAmdG90YWxCaXRSYXRlLCAmbVdyaXRlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIHNldHVwTVBFRzRNZXRhRGF0YShzdGFydFRpbWVVcywgdG90YWxCaXRSYXRlLCAmbWV0YSk7Ci0KLSAgICBlcnIgPSBtV3JpdGVyLT5zdGFydChtZXRhLmdldCgpKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwYXVzZSgpIHsKQEAgLTE2MzYsNiArMTcxMSw4IEBACiAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICB9CiAKKyAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNsZWFyKCk7CisKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgICAgICBtT3V0cHV0RmQgPSAtMTsKQEAgLTE2NTUsNyArMTczMiw2IEBACiAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CiAgICAgfQogCi0KICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0xNjc3LDcgKzE3NTMsNyBAQAogICAgIC8vIERlZmF1bHQgcGFyYW1ldGVycwogICAgIG1PdXRwdXRGb3JtYXQgID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgbUF1ZGlvRW5jb2RlciAgPSBBVURJT19FTkNPREVSX0FNUl9OQjsKLSAgICBtVmlkZW9FbmNvZGVyICA9IFZJREVPX0VOQ09ERVJfSDI2MzsKKyAgICBtVmlkZW9FbmNvZGVyICA9IFZJREVPX0VOQ09ERVJfREVGQVVMVDsKICAgICBtVmlkZW9XaWR0aCAgICA9IDE3NjsKICAgICBtVmlkZW9IZWlnaHQgICA9IDE0NDsKICAgICBtRnJhbWVSYXRlICAgICA9IC0xOwpAQCAtMTcwNyw2ICsxNzgzLDcgQEAKICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKICAgICBtTGF0aXR1ZGV4MTAwMDAgPSAtMzYwMDAwMDsKICAgICBtTG9uZ2l0dWRleDEwMDAwID0gLTM2MDAwMDA7CisgICAgbVRvdGFsQml0UmF0ZSA9IDA7CiAKICAgICBtT3V0cHV0RmQgPSAtMTsKIApAQCAtMTc0NywxNSArMTgyNCwxNSBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgZm9ybWF0OiAlZFxuIiwgbU91dHB1dEZvcm1hdCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgc2l6ZSAoYnl0ZXMpOiAlbGxkXG4iLCBtTWF4RmlsZVNpemVCeXRlcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBzaXplIChieXRlcyk6ICUiIFBSSWQ2NCAiXG4iLCBtTWF4RmlsZVNpemVCeXRlcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgTWF4IGZpbGUgZHVyYXRpb24gKHVzKTogJWxsZFxuIiwgbU1heEZpbGVEdXJhdGlvblVzKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE1heCBmaWxlIGR1cmF0aW9uICh1cyk6ICUiIFBSSWQ2NCAiXG4iLCBtTWF4RmlsZUR1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgb2Zmc2V0IGxlbmd0aCAoYml0cyk6ICVkXG4iLCBtVXNlNjRCaXRGaWxlT2Zmc2V0PyA2NDogMzIpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEludGVybGVhdmUgZHVyYXRpb24gKHVzKTogJWRcbiIsIG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgUHJvZ3Jlc3Mgbm90aWZpY2F0aW9uOiAlbGxkIHVzXG4iLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFByb2dyZXNzIG5vdGlmaWNhdGlvbjogJSIgUFJJZDY0ICIgdXNcbiIsIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBBdWRpb1xuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggMzFmMDllMC4uNTRjMzhkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0zNyw2ICszNyw3IEBACiBjbGFzcyBNZWRpYVByb2ZpbGVzOwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIGNsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZTsKK2NsYXNzIEFMb29wZXI7CiAKIHN0cnVjdCBTdGFnZWZyaWdodFJlY29yZGVyIDogcHVibGljIE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBTdGFnZWZyaWdodFJlY29yZGVyKCk7CkBAIC0xMDYsNiArMTA3LDcgQEAKICAgICBpbnQzMl90IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQzMl90IG1Mb25naXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CisgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOwogCiAgICAgYm9vbCBtQ2FwdHVyZVRpbWVMYXBzZTsKICAgICBpbnQ2NF90IG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOwpAQCAtMTIyLDIyICsxMjQsMTcgQEAKICAgICAvLyBBbiA8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcG9pbnRlcgogICAgIC8vIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHNpZGUgdXNpbmcgd2hpY2ggdGhlCiAgICAgLy8gZnJhbWUgYnVmZmVycyB3aWxsIGJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQKLSAgICBzcDxTdXJmYWNlTWVkaWFTb3VyY2U+IG1TdXJmYWNlTWVkaWFTb3VyY2U7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogCi0gICAgc3RhdHVzX3Qgc2V0dXBNUEVHNFJlY29yZGluZygKLSAgICAgICAgaW50IG91dHB1dEZkLAotICAgICAgICBpbnQzMl90IHZpZGVvV2lkdGgsIGludDMyX3QgdmlkZW9IZWlnaHQsCi0gICAgICAgIGludDMyX3QgdmlkZW9CaXRSYXRlLAotICAgICAgICBpbnQzMl90ICp0b3RhbEJpdFJhdGUsCi0gICAgICAgIHNwPE1lZGlhV3JpdGVyPiAqbWVkaWFXcml0ZXIpOwotICAgIHZvaWQgc2V0dXBNUEVHNE1ldGFEYXRhKGludDY0X3Qgc3RhcnRUaW1lVXMsIGludDMyX3QgdG90YWxCaXRSYXRlLAotICAgICAgICBzcDxNZXRhRGF0YT4gKm1ldGEpOwotICAgIHN0YXR1c190IHN0YXJ0TVBFRzRSZWNvcmRpbmcoKTsKLSAgICBzdGF0dXNfdCBzdGFydEFNUlJlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0QUFDUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRSYXdBdWRpb1JlY29yZGluZygpOwotICAgIHN0YXR1c190IHN0YXJ0UlRQUmVjb3JkaW5nKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRNUEVHMlRTUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUludGVybmFsKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBNUEVHNG9yV0VCTVJlY29yZGluZygpOworICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CisgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzZXR1cFJUUFJlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVBdWRpb1NvdXJjZSgpOwogICAgIHN0YXR1c190IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgYm9vbCAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpOwpAQCAtMTQ3LDE0ICsxNDQsOCBAQAogICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgdmlkZW9zb3VyY2UgdHlwZQogICAgIHN0YXR1c190IHNldHVwTWVkaWFTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+ICptZWRpYVNvdXJjZSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBDYW1lcmFTb3VyY2Uoc3A8Q2FtZXJhU291cmNlPiAqY2FtZXJhU291cmNlKTsKLSAgICAvLyBzZXR1cCB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGZvciB0aGUgZW5jb2RlcgotICAgIHN0YXR1c190IHNldHVwU3VyZmFjZU1lZGlhU291cmNlKCk7Ci0KICAgICBzdGF0dXNfdCBzZXR1cEF1ZGlvRW5jb2Rlcihjb25zdCBzcDxNZWRpYVdyaXRlcj4mIHdyaXRlcik7Ci0gICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gY2FtZXJhU291cmNlLAotICAgICAgICAgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUsCi0gICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKnNvdXJjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+IGNhbWVyYVNvdXJjZSwgc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpOwogCiAgICAgLy8gRW5jb2RpbmcgcGFyYW1ldGVyIGhhbmRsaW5nIHV0aWxpdGllcwogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKTsKQEAgLTE4Nyw2ICsxNzgsNyBAQAogICAgIHZvaWQgY2xpcEF1ZGlvU2FtcGxlUmF0ZSgpOwogICAgIHZvaWQgY2xpcE51bWJlck9mQXVkaW9DaGFubmVscygpOwogICAgIHZvaWQgc2V0RGVmYXVsdFByb2ZpbGVJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgc2V0RGVmYXVsdFZpZGVvRW5jb2RlcklmTmVjZXNzYXJ5KCk7CiAKIAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RhZ2VmcmlnaHRSZWNvcmRlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuY3BwCmluZGV4IDVkOTcyOGEuLjU3OTU3NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1Rlc3RQbGF5ZXJTdHViLmNwcApAQCAtMTEzLDcgKzExMyw5IEBACiAvLyBDcmVhdGUgdGhlIHRlc3QgcGxheWVyLgogLy8gQ2FsbCBzZXREYXRhU291cmNlIG9uIHRoZSB0ZXN0IHBsYXllciB3aXRoIHRoZSB1cmwgaW4gcGFyYW0uCiBzdGF0dXNfdCBUZXN0UGxheWVyU3R1Yjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgaWYgKCFpc1Rlc3RVcmwodXJsKSB8fCBOVUxMICE9IG1IYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIH0KIAogICAgIG1QbGF5ZXIgPSAoKm1OZXdQbGF5ZXIpKCk7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldERhdGFTb3VyY2UobUNvbnRlbnRVcmwsIGhlYWRlcnMpOworICAgIHJldHVybiBtUGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCBtQ29udGVudFVybCwgaGVhZGVycyk7CiB9CiAKIC8vIEludGVybmFsIGNsZWFudXAuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVGVzdFBsYXllclN0dWIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCmluZGV4IGEzODAyZWIuLjU1YmYyYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9UZXN0UGxheWVyU3R1Yi5oCkBAIC02Niw3ICs2Niw5IEBACiAKICAgICAvLyBAcGFyYW0gdXJsIFNob3VsZCBiZSBhIHRlc3QgdXJsLiBTZWUgY2xhc3MgY29tbWVudC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICAvLyBUZXN0IHBsYXllciBmb3IgYSBmaWxlIGRlc2NyaXB0b3Igc291cmNlIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCwgaW50NjRfdCwgaW50NjRfdCkgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgorI2luY2x1ZGUgPHVpL0Rpc3BsYXlTdGF0SW5mby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSAiVmlkZW9GcmFtZVNjaGVkdWxlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtOYW5vc0luMXMgPSAxMDAwMDAwMDAwOworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RhdGljIGludCBjb21wYXJlKGNvbnN0IFQgKmxocywgY29uc3QgVCAqcmhzKSB7CisgICAgaWYgKCpsaHMgPCAqcmhzKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCpsaHMgPiAqcmhzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdGFydFByaW1lID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0b3BQcmltZSA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlcjo6a0hpc3RvcnlTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgLy8gMSUKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0ga05hbm9zSW4xczsgICAgIC8vIDEgc2VjCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluUGVyaW9kID0ga05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICoga05hbm9zSW4xczsgLy8gMTAgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6UExMKCkKKyAgICA6IG1QZXJpb2QoLTEpLAorICAgICAgbVBoYXNlKDApLAorICAgICAgbVByaW1lZChmYWxzZSksCisgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nKDApLAorICAgICAgbUxhc3RUaW1lKC0xKSwKKyAgICAgIG1OdW1TYW1wbGVzKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpyZXN0YXJ0KCkgeworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtUGhhc2UgPSAtMTsKK30KKworI2lmIDAKKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnRlc3QoKSB7CisgICAgbnNlY3NfdCBwZXJpb2QgPSBrTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OmZpdCgKKyAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1bVggPSAwOworICAgIGludDY0X3Qgc3VtWFggPSAwOworICAgIGludDY0X3Qgc3VtWFkgPSAwOworICAgIGludDY0X3Qgc3VtWVkgPSAwOworICAgIGludDY0X3Qgc3VtWSA9IDA7CisKKyAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKKyAgICBuc2Vjc190IGxhc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCisgICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKKyAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKKyAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KKyAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7CisgICAgICAgIHN1bVggKz0geDsKKyAgICAgICAgc3VtWSArPSB5OworICAgICAgICBzdW1YWCArPSB4ICogeDsKKyAgICAgICAgc3VtWFkgKz0geCAqIHk7CisgICAgICAgIHN1bVlZICs9IHkgKiB5OworICAgICAgICBsYXN0VGltZSA9IHRpbWU7CisgICAgfQorCisgICAgaW50NjRfdCBkaXYgICA9IG51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7CisgICAgaWYgKGRpdiA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGFfbm9tID0gbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKKyAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7CisgICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKKyAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOworICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAorICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7CisgICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgbnVtU2FtcGxlc1RvVXNlLCBtUGhhc2UsIG1QZXJpb2QpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1ZzeW5jUmVmcmVzaFBlcmlvZCA9IGtOYW5vc0luMXM7ICAgICAgIC8vIDEgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXI6OlZpZGVvRnJhbWVTY2hlZHVsZXIoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6dXBkYXRlVnN5bmMoKSB7CisgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKKyAgICBtVnN5bmNQZXJpb2QgPSAwOworICAgIG1Wc3luY1RpbWUgPSAwOworCisgICAgLy8gVE9ETzogc2NoZWR1bGUgZnJhbWVzIGZvciB0aGUgZGVzdGluYXRpb24gc3VyZmFjZQorICAgIC8vIEZvciBub3csIHN1cmZhY2UgZmxpbmdlciBvbmx5IHNjaGVkdWxlcyBmcmFtZXMgb24gdGhlIHByaW1hcnkgZGlzcGxheQorICAgIGlmIChtQ29tcG9zZXIgPT0gTlVMTCkgeworICAgICAgICBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIG1Db21wb3NlciA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlQ29tcG9zZXI+KHNtLT5jaGVja1NlcnZpY2UobmFtZSkpOworICAgIH0KKyAgICBpZiAobUNvbXBvc2VyICE9IE5VTEwpIHsKKyAgICAgICAgRGlzcGxheVN0YXRJbmZvIHN0YXRzOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtQ29tcG9zZXItPmdldERpc3BsYXlTdGF0cyhOVUxMIC8qIGRpc3BsYXkgKi8sICZzdGF0cyk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJ2c3luYyB0aW1lOiVsbGQgcGVyaW9kOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXRzLnZzeW5jVGltZSwgKGxvbmcgbG9uZylzdGF0cy52c3luY1BlcmlvZCk7CisgICAgICAgICAgICBtVnN5bmNUaW1lID0gc3RhdHMudnN5bmNUaW1lOworICAgICAgICAgICAgbVZzeW5jUGVyaW9kID0gc3RhdHMudnN5bmNQZXJpb2Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheVN0YXRzIHJldHVybmVkICVkIiwgcmVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHN1cmZhY2UgbUNvbXBvc2VyIHNlcnZpY2UiKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6aW5pdChmbG9hdCB2aWRlb0ZwcykgeworICAgIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZXN0YXJ0KCkgeworICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7CisgICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKKworICAgIG1QbGwucmVzdGFydCgpOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgeworICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOworCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKKyAgICAgICAgdXBkYXRlVnN5bmMoKTsKKyAgICB9CisKKyAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKyAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgICAgIHJldHVybiByZW5kZXJUaW1lOworICAgIH0KKworICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCisgICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgeworICAgICAgICBtVnN5bmNUaW1lIC09CisgICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOworICAgIH0KKworICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKKyAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQorICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKworICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZworICAgICAgICBzaXplX3QgTiA9IDEyOworICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9CisgICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKKyAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKKyAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KKyAgICAgICAgICAgIE4gPSAyMDsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0KKyAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgfQorICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIE47CisgICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOworICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OworICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyBOIC0gbVZzeW5jUGVyaW9kIC8gMik7CisgICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKKyAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQorICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQorICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9CisgICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKKworICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZWxlYXNlKCkgeworICAgIG1Db21wb3Nlci5jbGVhcigpOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyOjp+VmlkZW9GcmFtZVNjaGVkdWxlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMjdiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9WaWRlb0ZyYW1lU2NoZWR1bGVyLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IElTdXJmYWNlQ29tcG9zZXI7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKworICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgorICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKKyAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKKyAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKKyAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7CisKKyAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKKyAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7CisKKyAgICB2b2lkIHJlbGVhc2UoKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUExMIHsKKyAgICAgICAgUExMKCk7CisKKyAgICAgICAgLy8gcmVzZXQgUExMIHRvIG5ldyBQTEwKKyAgICAgICAgdm9pZCByZXNldChmbG9hdCBmcHMgPSAtMSk7CisgICAgICAgIC8vIGtlZXAgY3VycmVudCBlc3RpbWF0ZSwgYnV0IHJlc3RhcnQgcGhhc2UKKyAgICAgICAgdm9pZCByZXN0YXJ0KCk7CisgICAgICAgIC8vIHJldHVybnMgcGVyaW9kCisgICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBuc2Vjc190IG1QZXJpb2Q7CisgICAgICAgIG5zZWNzX3QgbVBoYXNlOworCisgICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKKyAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOworCisgICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQorICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0CisKKyAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCisgICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07CisKKyAgICAgICAgdm9pZCB0ZXN0KCk7CisgICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7CisgICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOworICAgIH07CisKKyAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5CisgICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7CisgICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KKworICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCisgICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50CisKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawppbmRleCBmOTQ2YzFjLi42NzZjMGE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawpAQCAtNiwxOCArNiwyMCBAQAogICAgICAgICBIVFRQTGl2ZVNvdXJjZS5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTnVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyRGVjb2Rlci5jcHAgICAgICAgICAgICAgXAorICAgICAgICBOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAgIFwKICAgICAgICAgTnVQbGF5ZXJEcml2ZXIuY3BwICAgICAgICAgICAgICBcCiAgICAgICAgIE51UGxheWVyUmVuZGVyZXIuY3BwICAgICAgICAgICAgXAogICAgICAgICBOdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcCAgICAgIFwKICAgICAgICAgUlRTUFNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFN0cmVhbWluZ1NvdXJjZS5jcHAgICAgICAgICAgICAgXAotICAgICAgICBtcDQvTVA0U291cmNlLmNwcCAgICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCAgICAgICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0ICAgICAgICAgICBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlICAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9udXBsYXllcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IGIwNGU3YTYuLjU0MDY4MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTE0LDEwICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJHZW5lcmljU291cmNlIgorCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI4LDU3ICszMiwxNjEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6R2VuZXJpY1NvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCiAgICAgICAgIGJvb2wgdWlkVmFsaWQsCiAgICAgICAgIHVpZF90IHVpZCkKICAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKDApLAogICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKLSAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSB7CisgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCisgICAgICBtSXNXaWRldmluZShmYWxzZSksCisgICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCisgICAgICBtTWV0YURhdGFTaXplKC0xbGwpLAorICAgICAgbUJpdHJhdGUoLTFsbCksCisgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCisgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CiAgICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVybCwgaGVhZGVycyk7Ci0gICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKLQotICAgIGluaXRGcm9tRGF0YVNvdXJjZShkYXRhU291cmNlKTsKIH0KIAotTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkdlbmVyaWNTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLSAgICA6IFNvdXJjZShub3RpZnkpLAotICAgICAgbUR1cmF0aW9uVXMoMGxsKSwKLSAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSB7Ci0gICAgRGF0YVNvdXJjZTo6UmVnaXN0ZXJEZWZhdWx0U25pZmZlcnMoKTsKLQotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCBvZmZzZXQsIGxlbmd0aCk7Ci0KLSAgICBpbml0RnJvbURhdGFTb3VyY2UoZGF0YVNvdXJjZSk7Cit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZXNldERhdGFTb3VyY2UoKSB7CisgICAgbUF1ZGlvVGltZVVzID0gMDsKKyAgICBtVmlkZW9UaW1lVXMgPSAwOworICAgIG1IVFRQU2VydmljZS5jbGVhcigpOworICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgbVVyaS5jbGVhcigpOworICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CisgICAgbUZkID0gLTE7CisgICAgbU9mZnNldCA9IDA7CisgICAgbUxlbmd0aCA9IDA7CisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RPUCwgMCk7CisgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1TdG9wUmVhZCA9IHRydWU7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmluaXRGcm9tRGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpIHsKLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CiAKLSAgICBDSEVDSyhleHRyYWN0b3IgIT0gTlVMTCk7CisgICAgbUhUVFBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7CisgICAgbVVyaSA9IHVybDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICBpZiAoaGVhZGVycykgeworICAgICAgICBtVXJpSGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIC8vIGRlbGF5IGRhdGEgc291cmNlIGNyZWF0aW9uIHRvIHByZXBhcmVBc3luYygpIHRvIGF2b2lkIGJsb2NraW5nCisgICAgLy8gdGhlIGNhbGxpbmcgdGhyZWFkIGluIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CisKKyAgICBtRmQgPSBkdXAoZmQpOworICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgbUxlbmd0aCA9IGxlbmd0aDsKKworICAgIC8vIGRlbGF5IGRhdGEgc291cmNlIGNyZWF0aW9uIHRvIHByZXBhcmVBc3luYygpIHRvIGF2b2lkIGJsb2NraW5nCisgICAgLy8gdGhlIGNhbGxpbmcgdGhyZWFkIGluIHNldERhdGFTb3VyY2UgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lLgorICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZpbGVNZXRhOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgeworICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7CisKKyAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKKworICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICBTdHJpbmc4IG1pbWVUeXBlOworICAgICAgICBmbG9hdCBjb25maWRlbmNlOworICAgICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CisgICAgICAgIGJvb2wgc3VjY2VzczsKKworICAgICAgICBzdWNjZXNzID0gU25pZmZXVk0obURhdGFTb3VyY2UsICZtaW1lVHlwZSwgJmNvbmZpZGVuY2UsICZkdW1teSk7CisgICAgICAgIGlmICghc3VjY2VzcworICAgICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoCisgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHdpZGV2aW5lIG1pbWU6ICVzIiwgbWltZVR5cGUuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtV1ZNRXh0cmFjdG9yID0gbmV3IFdWTUV4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldEFkYXB0aXZlU3RyZWFtaW5nTW9kZSh0cnVlKTsKKyAgICAgICAgaWYgKG1VSURWYWxpZCkgeworICAgICAgICAgICAgbVdWTUV4dHJhY3Rvci0+c2V0VUlEKG1VSUQpOworICAgICAgICB9CisgICAgICAgIGV4dHJhY3RvciA9IG1XVk1FeHRyYWN0b3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShtRGF0YVNvdXJjZSwKKyAgICAgICAgICAgICAgICBtU25pZmZlZE1JTUUuZW1wdHkoKSA/IE5VTEw6IG1TbmlmZmVkTUlNRS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGV4dHJhY3Rvci0+Z2V0RHJtRmxhZygpKSB7CisgICAgICAgIGNoZWNrRHJtU3RhdHVzKG1EYXRhU291cmNlKTsKKyAgICB9CisKKyAgICBtRmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHRvdGFsQml0cmF0ZSA9IDA7CisKKyAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIGlmIChudW10cmFja3MgPT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiB0cmFjayA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2s7Ci0KKyAgICAgICAgLy8gRG8gdGhlIHN0cmluZyBjb21wYXJlIGltbWVkaWF0ZWx5IHdpdGggIm1pbWUiLAorICAgICAgICAvLyB3ZSBjYW4ndCBhc3N1bWUgIm1pbWUiIHdvdWxkIHN0YXkgdmFsaWQgYWZ0ZXIgYW5vdGhlcgorICAgICAgICAvLyBleHRyYWN0b3Igb3BlcmF0aW9uLCBzb21lIGV4dHJhY3RvcnMgbWlnaHQgbW9kaWZ5IG1ldGEKKyAgICAgICAgLy8gZHVyaW5nIGdldFRyYWNrKCkgYW5kIG1ha2UgaXQgaW52YWxpZC4KICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tU291cmNlID0gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobUF1ZGlvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvSXNWb3JiaXMgPSB0cnVlOwpAQCAtODgsMzcgKzE5NiwxNzggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CiAgICAgICAgICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVNvdXJjZSA9IHRyYWNrOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOwogCi0gICAgICAgIGlmICh0cmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNvdXJjZSByZXF1aXJlcyBzZWN1cmUgYnVmZmVycworICAgICAgICAgICAgICAgIGludDMyX3Qgc2VjdXJlOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycywgJnNlY3VyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlY3VyZSkgeworICAgICAgICAgICAgICAgICAgICBtSXNXaWRldmluZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci0+c2V0VUlEKG1VSUQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbVNvdXJjZXMucHVzaCh0cmFjayk7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiBtRHVyYXRpb25VcykgeworICAgICAgICAgICAgICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgaWYgKHRvdGFsQml0cmF0ZSA+PSAwICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICB0b3RhbEJpdHJhdGUgKz0gYml0cmF0ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvdGFsQml0cmF0ZSA9IC0xOworICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNzA1Njk1Iik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1CaXRyYXRlID0gdG90YWxCaXRyYXRlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpjaGVja0RybVN0YXR1cyhjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSkgeworICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8obURlY3J5cHRIYW5kbGUsICZtRHJtTWFuYWdlckNsaWVudCk7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBpZiAoUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQgIT0gbURlY3J5cHRIYW5kbGUtPnN0YXR1cykgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtTm9MaWNlbnNlKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQ2NF90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRMYXN0UmVhZFBvc2l0aW9uKCkgeworICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1RpbWVVczsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVZpZGVvVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldEJ1ZmZlcnMoCisgICAgICAgIGJvb2wgYXVkaW8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmYnVmZmVycykgeworICAgIGlmIChtSXNXaWRldmluZSAmJiAhYXVkaW8gJiYgbVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtVmlkZW9UcmFjay5tU291cmNlLT5zZXRCdWZmZXJzKGJ1ZmZlcnMpOworICAgIH0KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKIE51UGxheWVyOjpHZW5lcmljU291cmNlOjp+R2VuZXJpY1NvdXJjZSgpIHsKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoImdlbmVyaWMiKTsKKyAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVBc3luYywgaWQoKSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUHJlcGFyZUFzeW5jKCkgeworICAgIC8vIGRlbGF5ZWQgZGF0YSBzb3VyY2UgY3JlYXRpb24KKyAgICBpZiAobURhdGFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOworICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSAhc3RybmNhc2VjbXAodXJpLCAid2lkZXZpbmU6Ly8iLCAxMSk7CisKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpCisgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpCisgICAgICAgICAgICAgICAgICAgIHx8IG1Jc1dpZGV2aW5lKSB7CisgICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJm1Db250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGZpcnN0LCBpZiB0aGUgZXh0cmFjdG9yCisgICAgICAgICAgICAvLyBjb21lcyBiYWNrIGFzIHNlY3VyZSwgc2V0IGl0IHRvIHRydWUgdGhlbi4KKyAgICAgICAgICAgIG1Jc1dpZGV2aW5lID0gZmFsc2U7CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UobUZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNXaWRldmluZSB8fCBtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2hlY2sgaW5pdGlhbCBjYWNoaW5nIHN0YXR1cworICAgIHN0YXR1c190IGVyciA9IHByZWZpbGxDYWNoZUlmTmVjZXNzYXJ5KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIGlkKCkpKS0+cG9zdCgyMDAwMDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwcmVmaWxsIGRhdGEgY2FjaGUhIik7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXQgZXh0cmF0b3IgZnJvbSBkYXRhIHNvdXJjZQorICAgIGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvVHJhY2subVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLQotICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGRvR2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKTsKKyAgICAgICAgaWYoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKG1zZyk7CiAgICAgfQogCiAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKAotICAgICAgICAgICAgRkxBR19DQU5fUEFVU0UKKyAgICAgICAgICAgIChtSXNXaWRldmluZSA/IEZMQUdfU0VDVVJFIDogMCkKKyAgICAgICAgICAgIHwgRkxBR19DQU5fUEFVU0UKICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFS19CQUNLV0FSRAogICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0ZPUldBUkQKICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFSyk7CkBAIC0xMjYsMzMgKzM3NSw0NzIgQEAKICAgICBub3RpZnlQcmVwYXJlZCgpOwogfQogCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtTWV0YURhdGFTaXplID0gLTFsbDsKKyAgICAgICAgbUNvbnRlbnRUeXBlID0gIiI7CisgICAgICAgIG1TbmlmZmVkTUlNRSA9ICIiOworICAgICAgICB7CisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IGNhY2hlZFNvdXJjZSA9IG1DYWNoZWRTb3VyY2U7CisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EaXNjb25uZWN0TG9jayk7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgICAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIH0KKyAgICBub3RpZnlQcmVwYXJlZChlcnIpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKSB7CisgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIG5vIHByZWZpbGwgaWYgdGhlIGRhdGEgc291cmNlIGlzIG5vdCBjYWNoZWQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIFdlJ3JlIG5vdCBkb2luZyB0aGlzIGZvciBzdHJlYW1zIHRoYXQgYXBwZWFyIHRvIGJlIGF1ZGlvLW9ubHkKKyAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CisgICAgLy8gcGxheWluZyBiYWNrIGZhaXJseSBpbnN0YW50bHkuCisgICAgaWYgKCFzdHJuY2FzZWNtcChtQ29udGVudFR5cGUuc3RyaW5nKCksICJhdWRpby8iLCA2KSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gV2UncmUgZ29pbmcgdG8gcHJlZmlsbCB0aGUgY2FjaGUgYmVmb3JlIHRyeWluZyB0byBpbnN0YW50aWF0ZQorICAgIC8vIHRoZSBleHRyYWN0b3IgYmVsb3csIGFzIHRoZSBsYXR0ZXIgaXMgYW4gb3BlcmF0aW9uIHRoYXQgb3RoZXJ3aXNlCisgICAgLy8gY291bGQgYmxvY2sgb24gdGhlIGRhdGFzb3VyY2UgZm9yIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRpbWUuCisgICAgLy8gRHVyaW5nIHRoYXQgdGltZSB3ZSdkIGJlIHVuYWJsZSB0byBhYm9ydCB0aGUgcHJlcGFyYXRpb24gcGhhc2UKKyAgICAvLyB3aXRob3V0IHRoaXMgcHJlZmlsbC4KKworICAgIC8vIEluaXRpYWxseSBtYWtlIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCAxOTIgS0IgZm9yIHRoZSBzbmlmZgorICAgIC8vIHRvIGNvbXBsZXRlIHdpdGhvdXQgYmxvY2tpbmcuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluQnl0ZXNGb3JTbmlmZmluZyA9IDE5MiAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdE1ldGFTaXplID0gMjAwMDAwOworCisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisKKyAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9CisgICAgICAgICAgICBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7CisKKyAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0sgfHwgKG1NZXRhRGF0YVNpemUgPj0gMAorICAgICAgICAgICAgJiYgKG9mZjY0X3QpY2FjaGVkRGF0YVJlbWFpbmluZyA+PSBtTWV0YURhdGFTaXplKSkgeworICAgICAgICBBTE9HVigic3RvcCBjYWNoaW5nLCBzdGF0dXMgJWQsICIKKyAgICAgICAgICAgICAgICAibWV0YURhdGFTaXplICVsbGQsIGNhY2hlZERhdGFSZW1haW5pbmcgJXp1IiwKKyAgICAgICAgICAgICAgICBmaW5hbFN0YXR1cywgbU1ldGFEYXRhU2l6ZSwgY2FjaGVkRGF0YVJlbWFpbmluZyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigibm93IGNhY2hlZCAlenUgYnl0ZXMgb2YgZGF0YSIsIGNhY2hlZERhdGFSZW1haW5pbmcpOworCisgICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwCisgICAgICAgICAgICAmJiBjYWNoZWREYXRhUmVtYWluaW5nID49IGtNaW5CeXRlc0ZvclNuaWZmaW5nKSB7CisgICAgICAgIFN0cmluZzggdG1wOworICAgICAgICBmbG9hdCBjb25maWRlbmNlOworICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKKyAgICAgICAgaWYgKCFtQ2FjaGVkU291cmNlLT5zbmlmZigmdG1wLCAmY29uZmlkZW5jZSwgJm1ldGEpKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIHRoZSBmaWxlJ3MgZXh0cmFjdG9yIHRvCisgICAgICAgIC8vIGJlLCByZW1lbWJlciB0aGlzIG1pbWUgdHlwZSBzbyB3ZSBkb24ndCBoYXZlIHRvCisgICAgICAgIC8vIHNuaWZmIGl0IGFnYWluIHdoZW4gd2UgY2FsbCBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKCkKKyAgICAgICAgbVNuaWZmZWRNSU1FID0gdG1wLnN0cmluZygpOworCisgICAgICAgIGlmIChtZXRhID09IE5VTEwKKyAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KCJtZXRhLWRhdGEtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDY0X3QqPigmbU1ldGFEYXRhU2l6ZSkpKSB7CisgICAgICAgICAgICBtTWV0YURhdGFTaXplID0ga0RlZmF1bHRNZXRhU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTWV0YURhdGFTaXplIDwgMGxsKSB7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtZXRhRGF0YVNpemUgPSAlbGxkIGJ5dGVzIiwgbU1ldGFEYXRhU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtRUFHQUlOOworfQorCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HSSgic3RhcnQiKTsKIAorICAgIG1TdG9wUmVhZCA9IGZhbHNlOwogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvVHJhY2subVNvdXJjZS0+c3RhcnQoKSwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICBtQXVkaW9UcmFjay5tUGFja2V0cyA9Ci0gICAgICAgICAgICBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtQXVkaW9UcmFjay5tU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgcmVhZEJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CiAgICAgfQogCiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBDSEVDS19FUShtVmlkZW9UcmFjay5tU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0KLSAgICAgICAgICAgIG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1WaWRlb1RyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLQotICAgICAgICByZWFkQnVmZmVyKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CiAgICAgfQorCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIGdldExhc3RSZWFkUG9zaXRpb24oKSAvIDEwMDApOworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RvcCgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVE9QLCAwKTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAvLyBGb3IgYSB3aWRldmluZSBzb3VyY2Ugd2UgbmVlZCB0byBwcmV2ZW50IGFueSBmdXJ0aGVyIHJlYWRzLgorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcFdpZGV2aW5lLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgICAgICAodm9pZCkgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cGF1c2UoKSB7CisgICAgLy8gbm90aGluZyB0byBkbywganVzdCBhY2NvdW50IGZvciBEUk0gcGxheWJhY2sgc3RhdHVzCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6UEFVU0UsIDApOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlc3VtZSgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvLCBqdXN0IGFjY291bnQgZm9yIERSTSBwbGF5YmFjayBzdGF0dXMKKyAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkaXNjb25uZWN0KCkgeworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UsIGh0dHBTb3VyY2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgICAgICBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CisgICAgfQorCisgICAgaWYgKGRhdGFTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCisgICAgICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihkYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChodHRwU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oaHR0cFNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgIH0KKyAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpOworICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpjYW5jZWxQb2xsQnVmZmVyaW5nKCkgeworICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50IHBlcmNlbnRhZ2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gZHVwTm90aWZ5KCk7CisgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QnVmZmVyaW5nVXBkYXRlKTsKKyAgICBtc2ctPnNldEludDMyKCJwZXJjZW50YWdlIiwgcGVyY2VudGFnZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gMGxsOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworCisgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlID0gMGxsOworICAgICAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMGxsIC8gbUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVdWTUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGNhY2hlZER1cmF0aW9uVXMKKyAgICAgICAgICAgID0gbVdWTUV4dHJhY3Rvci0+Z2V0Q2FjaGVkRHVyYXRpb25VcygmZmluYWxTdGF0dXMpOworICAgIH0KKworICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgICAgICBjYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGNhY2hlZER1cmF0aW9uVXMgPiAwbGwgJiYgbUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKKyAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CisgICAgICAgIH0KKworICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUocGVyY2VudGFnZSk7CisgICAgfQorCisgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Cit9CisKKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgorICAgICAgeworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEZldGNoVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0U3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRDaGFuZ2VBVlNvdXJjZToKKyAgICAgIHsKKyAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisKKyAgICAgICAgICBUcmFjayogdHJhY2s7CisgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgY291bnRlcnBhcnRUeXBlOworICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgY291bnRlcnBhcnRUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTzs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSk7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOzsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHRyYWNrLT5tU291cmNlID0gc291cmNlOworICAgICAgICAgIHRyYWNrLT5tU291cmNlLT5zdGFydCgpOworICAgICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OworCisgICAgICAgICAgc3RhdHVzX3QgYXZhaWw7CisgICAgICAgICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmYXZhaWwpKSB7CisgICAgICAgICAgICAgIC8vIHN5bmMgZnJvbSBvdGhlciBzb3VyY2UKKyAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGFjdHVhbFRpbWVVczsKKyAgICAgICAgICBjb25zdCBib29sIGZvcm1hdENoYW5nZSA9IHRydWU7CisgICAgICAgICAgc3A8QU1lc3NhZ2U+IGxhdGVzdE1ldGEgPSB0cmFjay0+bVBhY2tldHMtPmdldExhdGVzdEVucXVldWVkTWV0YSgpOworICAgICAgICAgIENIRUNLKGxhdGVzdE1ldGEgIT0gTlVMTCAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSwgdGltZVVzLCAmYWN0dWFsVGltZVVzLCBmb3JtYXRDaGFuZ2UpOworICAgICAgICAgIHJlYWRCdWZmZXIoY291bnRlcnBhcnRUeXBlLCAtMSwgTlVMTCwgZm9ybWF0Q2hhbmdlKTsKKyAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCB0aW1lVXMsIGFjdHVhbFRpbWVVcyk7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgorICAgICAgeworICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgIG9uUG9sbEJ1ZmZlcmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEdldEZvcm1hdDoKKyAgICAgIHsKKyAgICAgICAgICBvbkdldEZvcm1hdE1ldGEobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CisgICAgICB7CisgICAgICAgICAgb25HZXRTZWxlY3RlZFRyYWNrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWxlY3RUcmFjazoKKyAgICAgIHsKKyAgICAgICAgICBvblNlbGVjdFRyYWNrKG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgeworICAgICAgICAgIG9uU2Vlayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0UmVhZEJ1ZmZlcjoKKyAgICAgIHsKKyAgICAgICAgICBvblJlYWRCdWZmZXIobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFN0b3BXaWRldmluZToKKyAgICAgIHsKKyAgICAgICAgICAvLyBtU3RvcFJlYWQgaXMgb25seSB1c2VkIGZvciBXaWRldmluZSB0byBwcmV2ZW50IHRoZSB2aWRlbyBzb3VyY2UKKyAgICAgICAgICAvLyBmcm9tIGJlaW5nIHJlYWQgd2hpbGUgdGhlIGFzc29jaWF0ZWQgdmlkZW8gZGVjb2RlciBpcyBzaHV0dGluZyBkb3duLgorICAgICAgICAgIG1TdG9wUmVhZCA9IHRydWU7CisgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICBtVmlkZW9UcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmZldGNoVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHNlbmRXaGF0LAorICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgYXZhaWw7CisgICAgaWYgKHBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmYXZhaWwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaW50NjRfdCBzdWJUaW1lVXM7CisgICAgcmVhZEJ1ZmZlcih0eXBlLCB0aW1lVXMsICZzdWJUaW1lVXMpOworCisgICAgaW50NjRfdCBkZWxheVVzID0gc3ViVGltZVVzIC0gdGltZVVzOworICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7CisgICAgICAgIGNvbnN0IGludDY0X3Qgb25lU2VjVXMgPSAxMDAwMDAwbGw7CisgICAgICAgIGRlbGF5VXMgLT0gb25lU2VjVXM7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKHNlbmRXaGF0LCBpZCgpKTsKKyAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1zZ0dlbmVyYXRpb24pOworICAgIG1zZzItPnBvc3QoZGVsYXlVcyA8IDAgPyAwIDogZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNlbmRUZXh0RGF0YSgKKyAgICAgICAgdWludDMyX3Qgd2hhdCwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICBpbnQzMl90IGN1ckdlbiwKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0cywKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICBpZiAocGFja2V0cy0+bmV4dEJ1ZmZlclRpbWUoJnN1YlRpbWVVcykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgbmV4dFN1YlRpbWVVczsKKyAgICByZWFkQnVmZmVyKHR5cGUsIC0xLCAmbmV4dFN1YlRpbWVVcyk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgZGVxdWV1ZVN0YXR1cyA9IHBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgIGlmIChkZXF1ZXVlU3RhdHVzID09IE9LKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgY29uc3QgaW50NjRfdCBkZWxheVVzID0gbmV4dFN1YlRpbWVVcyAtIHN1YlRpbWVVczsKKyAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworICAgIH0KK30KKwogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICB2b2lkICpmb3JtYXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZFBvaW50ZXIoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIChNZXRhRGF0YSAqKWZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uR2V0Rm9ybWF0TWV0YShzcDxBTWVzc2FnZT4gbXNnKSBjb25zdCB7CisgICAgaW50MzJfdCBhdWRpbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gZG9HZXRGb3JtYXRNZXRhKGF1ZGlvKTsKKyAgICByZXNwb25zZS0+c2V0UG9pbnRlcigiZm9ybWF0IiwgZm9ybWF0LmdldCgpKTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0IHsKICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tU291cmNlIDogbVZpZGVvVHJhY2subVNvdXJjZTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewpAQCAtMTcwLDE0ICs4NTgsNTMgQEAKICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9CiAKKyAgICBpZiAobUlzV2lkZXZpbmUgJiYgIWF1ZGlvKSB7CisgICAgICAgIC8vIHRyeSB0byByZWFkIGEgYnVmZmVyIGFzIHdlIG1heSBub3QgaGF2ZSBiZWVuIGFibGUgdG8gdGhlIGxhc3QgdGltZQorICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0ID09IE9LID8gLUVXT1VMREJMT0NLIDogZmluYWxSZXN1bHQ7CisgICAgICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT0gT0sgPyAtRVdPVUxEQkxPQ0sgOiBmaW5hbFJlc3VsdCk7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdHJhY2stPm1QYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAotICAgIHJlYWRCdWZmZXIoYXVkaW8sIC0xbGwpOworICAgIGlmICghdHJhY2stPm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7IC8vIGlnbm9yZWQKKyAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1TdWJ0aXRsZVRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTAorICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTg3LDI1ICs5MTQsMzg3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2VzLnNpemUoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1Tb3VyY2VzLnNpemUoKTsKKyAgICBpZiAodHJhY2tJbmRleCA+PSB0cmFja0NvdW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2VzLml0ZW1BdCh0cmFja0luZGV4KS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGludDMyX3QgdHJhY2tUeXBlOworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTjsKKyAgICB9CisgICAgZm9ybWF0LT5zZXRJbnQzMigidHlwZSIsIHRyYWNrVHlwZSk7CisKKyAgICBjb25zdCBjaGFyICpsYW5nOworICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsICZsYW5nKSkgeworICAgICAgICBsYW5nID0gInVuZCI7CisgICAgfQorICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZSk7CisKKyAgICAgICAgaW50MzJfdCBpc0F1dG9zZWxlY3QgPSAxLCBpc0RlZmF1bHQgPSAwLCBpc0ZvcmNlZCA9IDA7CisgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0F1dG9zZWxlY3QsICZpc0F1dG9zZWxlY3QpOworICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAmaXNEZWZhdWx0KTsKKyAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzRm9yY2VkLCAmaXNGb3JjZWQpOworCisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCAhIWlzQXV0b3NlbGVjdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCAhIWlzRGVmYXVsdCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsICEhaXNGb3JjZWQpOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3NzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBpbnQzMl90IGluZGV4OworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uR2V0U2VsZWN0ZWRUcmFjayhzcDxBTWVzc2FnZT4gbXNnKSBjb25zdCB7CisgICAgaW50MzJfdCB0bXBUeXBlOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgJnRtcFR5cGUpKTsKKyAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgIHNzaXplX3QgaW5kZXggPSBkb0dldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3NzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBjb25zdCBUcmFjayAqdHJhY2sgPSBOVUxMOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRyYWNrICE9IE5VTEwgJiYgdHJhY2stPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJhY2stPm1JbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBBTE9HVigiJXMgdHJhY2s6ICV6dSIsIHNlbGVjdCA/ICJzZWxlY3QiIDogImRlc2VsZWN0IiwgdHJhY2tJbmRleCk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CisgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblNlbGVjdFRyYWNrKHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBpbnQzMl90IHRyYWNrSW5kZXgsIHNlbGVjdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBkb1NlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvU2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKHRyYWNrSW5kZXggPj0gbVNvdXJjZXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKCFzZWxlY3QpIHsKKyAgICAgICAgVHJhY2sqIHRyYWNrID0gTlVMTDsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1TdWJ0aXRsZVRyYWNrLm1JbmRleCkgeworICAgICAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSBpZiAobVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFja0luZGV4ID09IG1UaW1lZFRleHRUcmFjay5tSW5kZXgpIHsKKyAgICAgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICB0cmFjay0+bVNvdXJjZSA9IE5VTEw7CisgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtU291cmNlcy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInRleHQvIiwgNSkpIHsKKyAgICAgICAgYm9vbCBpc1N1YnRpdGxlID0gc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICBUcmFjayAqdHJhY2sgPSBpc1N1YnRpdGxlID8gJm1TdWJ0aXRsZVRyYWNrIDogJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgaWYgKHRyYWNrLT5tU291cmNlICE9IE5VTEwgJiYgdHJhY2stPm1JbmRleCA9PSB0cmFja0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1JbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgIGlmICh0cmFjay0+bVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RvcCgpOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tU291cmNlID0gbVNvdXJjZXMuaXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZSh0cmFjay0+bVNvdXJjZS0+Z2V0Rm9ybWF0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zZXRGb3JtYXQodHJhY2stPm1Tb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3VidGl0bGUpIHsKKyAgICAgICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpIHx8ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworICAgICAgICBpZiAodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VBVlNvdXJjZSwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblNlZWsoc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgc3RhdHVzX3QgZXJyID0gZG9TZWVrKHNlZWtUaW1lVXMpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgLy8gSWYgdGhlIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkLCBkbyBub3QgYXR0ZW1wdCB0byByZWFkIGFueQorICAgIC8vIG1vcmUgYnVmZmVycy4KKyAgICBpZiAobVN0b3BSZWFkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBpbnQ2NF90IGFjdHVhbFRpbWVVczsKLSAgICAgICAgcmVhZEJ1ZmZlcihmYWxzZSAvKiBhdWRpbyAqLywgc2Vla1RpbWVVcywgJmFjdHVhbFRpbWVVcyk7CisgICAgICAgIHJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTywgc2Vla1RpbWVVcywgJmFjdHVhbFRpbWVVcyk7CiAKICAgICAgICAgc2Vla1RpbWVVcyA9IGFjdHVhbFRpbWVVczsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlYWRCdWZmZXIodHJ1ZSAvKiBhdWRpbyAqLywgc2Vla1RpbWVVcyk7CisgICAgICAgIHJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTywgc2Vla1RpbWVVcyk7CiAgICAgfQogCisgICAgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChQbGF5YmFjazo6U1RBUlQsIHNlZWtUaW1lVXMgLyAxMDAwKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCitzcDxBQnVmZmVyPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyKiBtYiwKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCisgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcykgeworICAgIGJvb2wgYXVkaW8gPSB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWI7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmICFhdWRpbykgeworICAgICAgICAvLyBkYXRhIGlzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIGJ1ZmZlcgorICAgICAgICBhYiA9IG5ldyBBQnVmZmVyKE5VTEwsIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIG1iLT5hZGRfcmVmKCk7CisgICAgICAgIGFiLT5zZXRNZWRpYUJ1ZmZlckJhc2UobWIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIob3V0TGVuZ3RoKTsKKyAgICAgICAgbWVtY3B5KGFiLT5kYXRhKCksCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1iLT5kYXRhKCkgKyBtYi0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBtYi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIH0KKworICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgeworICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOworICAgICAgICBpZiAoIW1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKKyAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBhYkVuZCA9IGFiLT5kYXRhKCkgKyBtYi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIG1lbWNweShhYkVuZCwgJm51bVBhZ2VTYW1wbGVzLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGFiLT5tZXRhKCk7CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtYi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgbVRpbWVkVGV4dFRyYWNrLm1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIG1ldGEtPnNldFN0cmluZygibWltZSIsIG1pbWUpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU3VidGl0bGVUcmFjay5tSW5kZXgpOworICAgIH0KKworICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKKyAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICBtYi0+cmVsZWFzZSgpOworICAgIG1iID0gTlVMTDsKKworICAgIHJldHVybiBhYjsKK30KKwordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKKworICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblJlYWRCdWZmZXIoc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIGludDMyX3QgdG1wVHlwZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tUeXBlIiwgJnRtcFR5cGUpKTsKKyAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7CisgICAgeworICAgICAgICAvLyBvbmx5IHByb3RlY3QgdGhlIHZhcmlhYmxlIGNoYW5nZSwgYXMgcmVhZEJ1ZmZlciBtYXkKKyAgICAgICAgLy8gdGFrZSBjb25zaWRlcmFibGUgdGltZS4gIFRoaXMgbWF5IHJlc3VsdCBpbiBvbmUgZXh0cmEKKyAgICAgICAgLy8gcmVhZCBiZWluZyBwcm9jZXNzZWQsIGJ1dCB0aGF0IGlzIGJlbmlnbi4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1SZWFkQnVmZmVyTG9jayk7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICY9IH4oMSA8PCB0cmFja1R5cGUpOworICAgIH0KKyAgICByZWFkQnVmZmVyKHRyYWNrVHlwZSk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlYWRCdWZmZXIoCi0gICAgICAgIGJvb2wgYXVkaW8sIGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsVGltZVVzKSB7Ci0gICAgVHJhY2sgKnRyYWNrID0gYXVkaW8gPyAmbUF1ZGlvVHJhY2sgOiAmbVZpZGVvVHJhY2s7Ci0gICAgQ0hFQ0sodHJhY2stPm1Tb3VyY2UgIT0gTlVMTCk7CisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBpbnQ2NF90IHNlZWtUaW1lVXMsIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKKyAgICAvLyBEbyBub3QgcmVhZCBkYXRhIGlmIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkCisgICAgaWYgKG1TdG9wUmVhZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRyYWNrICp0cmFjazsKKyAgICBzaXplX3QgbWF4QnVmZmVycyA9IDE7CisgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgICAgICBpZiAobUlzV2lkZXZpbmUpIHsKKyAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgICAgICB0cmFjayA9ICZtQXVkaW9UcmFjazsKKyAgICAgICAgICAgIGlmIChtSXNXaWRldmluZSkgeworICAgICAgICAgICAgICAgIG1heEJ1ZmZlcnMgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gNjQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgdHJhY2sgPSAmbVN1YnRpdGxlVHJhY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKKyAgICAgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaWYgKGFjdHVhbFRpbWVVcykgewogICAgICAgICAqYWN0dWFsVGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTIxNiw2NCArMTMwNSw1NiBAQAogICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOwogCiAgICAgaWYgKHNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzKTsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oc2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgICAgICBzZWVraW5nID0gdHJ1ZTsKICAgICB9CiAKLSAgICBmb3IgKDs7KSB7CisgICAgaWYgKG1Jc1dpZGV2aW5lICYmIHRyYWNrVHlwZSAhPSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgIG9wdGlvbnMuc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBudW1CdWZmZXJzID0gMDsgbnVtQnVmZmVycyA8IG1heEJ1ZmZlcnM7ICkgewogICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZjsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gdHJhY2stPm1Tb3VyY2UtPnJlYWQoJm1idWYsICZvcHRpb25zKTsKIAogICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgc2l6ZV90IG91dExlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgICAgICBpZiAoYXVkaW8gJiYgbUF1ZGlvSXNWb3JiaXMpIHsKLSAgICAgICAgICAgICAgICBvdXRMZW5ndGggKz0gc2l6ZW9mKGludDMyX3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOwotCi0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICBtYnVmLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewotICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtUGFnZVNhbXBsZXMgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJm51bVBhZ2VTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKLQotICAgICAgICAgICAgaWYgKGFjdHVhbFRpbWVVcykgewotICAgICAgICAgICAgICAgICphY3R1YWxUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtYnVmID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKHNlZWtpbmcpIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBOVUxMKTsKKyAgICAgICAgICAgIC8vIGZvcm1hdENoYW5nZSAmJiBzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgICAgICAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgIXNlZWtpbmc6IHRyYWNrIHdob3NlIHNvdXJjZSBpcyBub3QgY2hhbmdlZCBkdXJpbmcgc2VsZWN0aW9uCisgICAgICAgICAgICAvLyAhZm9ybWF0Q2hhbmdlOiBub3JtYWwgc2VlaworICAgICAgICAgICAgaWYgKChzZWVraW5nIHx8IGZvcm1hdENoYW5nZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSkgeworICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSA9IGZvcm1hdENoYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoc2Vla2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUs7CisgICAgICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoIHR5cGUsIE5VTEwsIHRydWUgLyogZGlzY2FyZCAqLyk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1lZGlhQnVmZmVyVG9BQnVmZmVyKG1idWYsIHRyYWNrVHlwZSwgYWN0dWFsVGltZVVzKTsKICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7CisgICAgICAgICAgICBmb3JtYXRDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgICAgIHNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICsrbnVtQnVmZmVyczsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CiAjaWYgMAogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkaXNjYXJkICovKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zaWduYWxFT1MoZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCmluZGV4IDJkYTY4MGMuLjFiNjgyODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaApAQCAtMjMsNTggKzIzLDE3NiBAQAogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERlY3J5cHRIYW5kbGU7CitjbGFzcyBEcm1NYW5hZ2VyQ2xpZW50Owogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgQVJUU1BDb250cm9sbGVyOwogc3RydWN0IERhdGFTb3VyY2U7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CitzdHJ1Y3QgV1ZNRXh0cmFjdG9yOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7Ci0gICAgR2VuZXJpY1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBib29sIHVpZFZhbGlkID0gZmFsc2UsCi0gICAgICAgICAgICB1aWRfdCB1aWQgPSAwKTsKKyAgICBHZW5lcmljU291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQpOwogCi0gICAgR2VuZXJpY1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CiAKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0OworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkdlbmVyaWNTb3VyY2UoKTsKIAorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOwogCiBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFByZXBhcmVBc3luYywKKyAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRGZXRjaFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0U2VuZFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRTZW5kVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRDaGFuZ2VBVlNvdXJjZSwKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nLAorICAgICAgICBrV2hhdEdldEZvcm1hdCwKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrLAorICAgICAgICBrV2hhdFNlbGVjdFRyYWNrLAorICAgICAgICBrV2hhdFNlZWssCisgICAgICAgIGtXaGF0UmVhZEJ1ZmZlciwKKyAgICAgICAga1doYXRTdG9wV2lkZXZpbmUsCisgICAgfTsKKworICAgIFZlY3RvcjxzcDxNZWRpYVNvdXJjZT4gPiBtU291cmNlczsKKwogICAgIHN0cnVjdCBUcmFjayB7CisgICAgICAgIHNpemVfdCBtSW5kZXg7CiAgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtUGFja2V0czsKICAgICB9OwogCiAgICAgVHJhY2sgbUF1ZGlvVHJhY2s7CisgICAgaW50NjRfdCBtQXVkaW9UaW1lVXM7CiAgICAgVHJhY2sgbVZpZGVvVHJhY2s7CisgICAgaW50NjRfdCBtVmlkZW9UaW1lVXM7CisgICAgVHJhY2sgbVN1YnRpdGxlVHJhY2s7CisgICAgVHJhY2sgbVRpbWVkVGV4dFRyYWNrOwogCisgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKICAgICBib29sIG1BdWRpb0lzVm9yYmlzOworICAgIGJvb2wgbUlzV2lkZXZpbmU7CisgICAgYm9vbCBtVUlEVmFsaWQ7CisgICAgdWlkX3QgbVVJRDsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOworICAgIEFTdHJpbmcgbVVyaTsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtVXJpSGVhZGVyczsKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CiAKLSAgICB2b2lkIGluaXRGcm9tRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOworICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOworICAgIHNwPFdWTUV4dHJhY3Rvcj4gbVdWTUV4dHJhY3RvcjsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU3RvcFJlYWQ7CisgICAgU3RyaW5nOCBtQ29udGVudFR5cGU7CisgICAgQVN0cmluZyBtU25pZmZlZE1JTUU7CisgICAgb2ZmNjRfdCBtTWV0YURhdGFTaXplOworICAgIGludDY0X3QgbUJpdHJhdGU7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgdWludDMyX3QgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXM7CisgICAgbXV0YWJsZSBNdXRleCBtUmVhZEJ1ZmZlckxvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7CiAKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgdm9pZCByZXNldERhdGFTb3VyY2UoKTsKKworICAgIHN0YXR1c190IGluaXRGcm9tRGF0YVNvdXJjZSgpOworICAgIHZvaWQgY2hlY2tEcm1TdGF0dXMoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworICAgIGludDY0X3QgZ2V0TGFzdFJlYWRQb3NpdGlvbigpOworICAgIHZvaWQgc2V0RHJtUGxheWJhY2tTdGF0dXNJZk5lZWRlZChpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworCisgICAgc3RhdHVzX3QgcHJlZmlsbENhY2hlSWZOZWNlc3NhcnkoKTsKKworICAgIHZvaWQgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycik7CisKKyAgICB2b2lkIG9uR2V0Rm9ybWF0TWV0YShzcDxBTWVzc2FnZT4gbXNnKSBjb25zdDsKKyAgICBzcDxNZXRhRGF0YT4gZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0OworCisgICAgdm9pZCBvbkdldFNlbGVjdGVkVHJhY2soc3A8QU1lc3NhZ2U+IG1zZykgY29uc3Q7CisgICAgc3NpemVfdCBkb0dldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKworICAgIHZvaWQgb25TZWxlY3RUcmFjayhzcDxBTWVzc2FnZT4gbXNnKTsKKyAgICBzdGF0dXNfdCBkb1NlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CisKKyAgICB2b2lkIG9uU2VlayhzcDxBTWVzc2FnZT4gbXNnKTsKKyAgICBzdGF0dXNfdCBkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKKworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoKTsKKworICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRzLCBzcDxBTWVzc2FnZT4gbXNnKTsKKworICAgIHZvaWQgc2VuZFRleHREYXRhKAorICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldHMsIHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgc3A8QUJ1ZmZlcj4gbWVkaWFCdWZmZXJUb0FCdWZmZXIoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiwKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAorICAgICAgICAgICAgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCk7CisKKyAgICB2b2lkIHBvc3RSZWFkQnVmZmVyKG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKTsKKyAgICB2b2lkIG9uUmVhZEJ1ZmZlcihzcDxBTWVzc2FnZT4gbXNnKTsKICAgICB2b2lkIHJlYWRCdWZmZXIoCi0gICAgICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwsIGJvb2wgZm9ybWF0Q2hhbmdlID0gZmFsc2UpOworCisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludCBwZXJjZW50YWdlKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyaWNTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IGYxNzgyY2MuLmEwMDNjODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zNCwxMyArMzUsMTIgQEAKIAogTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpIVFRQTGl2ZVNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpCiAgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCiAgICAgICBtVVJMKHVybCksCi0gICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAotICAgICAgbVVJRCh1aWQpLAogICAgICAgbUZsYWdzKDApLAogICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKICAgICAgIG1PZmZzZXQoMCksCkBAIC02MiwyNSArNjIsMzEgQEAKIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6fkhUVFBMaXZlU291cmNlKCkgewogICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgewogICAgICAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7CiAKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbi0+aWQoKSk7CisgICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKICAgICAgICAgbUxpdmVMb29wZXItPnN0b3AoKTsKKworICAgICAgICBtTGl2ZVNlc3Npb24uY2xlYXIoKTsKICAgICAgICAgbUxpdmVMb29wZXIuY2xlYXIoKTsKICAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7Ci0gICAgbUxpdmVMb29wZXItPnN0YXJ0KCk7CisgICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOworICAgICAgICBtTGl2ZUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uTm90aWZ5LCBpZCgpKTsKIAogICAgIG1MaXZlU2Vzc2lvbiA9IG5ldyBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIG5vdGlmeSwKICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBMaXZlU2Vzc2lvbjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAotICAgICAgICAgICAgbVVJRFZhbGlkLAotICAgICAgICAgICAgbVVJRCk7CisgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOwogCiAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24pOwogCkBAIC0xMjEsOCArMTI3LDEyIEBACiAgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0RHVyYXRpb24oZHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tJbmZvKFBhcmNlbCAqcmVwbHkpIGNvbnN0IHsKLSAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0luZm8ocmVwbHkpOworc2l6ZV90IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKQEAgLTE0MCw3ICsxNTAsNyBAQAogICAgIC8vIExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjayByZXR1cm5zIEJBRF9WQUxVRSB3aGVuIHNlbGVjdGluZyB0aGUgY3VycmVudGx5CiAgICAgLy8gc2VsZWN0ZWQgdHJhY2ssIG9yIHVuc2VsZWN0aW5nIGEgbm9uLXNlbGVjdGVkIHRyYWNrLiBJbiB0aGlzIGNhc2UgaXQncyBhbgogICAgIC8vIG5vLW9wIHNvIHdlIHJldHVybiBPSy4KLSAgICByZXR1cm4gKGVyciA9PSBPSyB8fCBlcnIgPT0gQkFEX1ZBTFVFKSA/IE9LIDogZXJyOworICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gKHN0YXR1c190KU9LIDogZXJyOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKQEAgLTIwNyw5ICsyMTcsOSBAQAogICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwgJiYKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoZm9ybWF0KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgwLCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19DQU5fUEFVU0U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCmluZGV4IGJjYzNmOGIuLjZiNWY2YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5oCkBAIC0yOCwxMCArMjgsOSBAQAogc3RydWN0IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKICAgICBIVFRQTGl2ZVNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLAotICAgICAgICAgICAgdWlkX3QgdWlkID0gMCk7CisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CkBAIC00MSw3ICs0MCw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKTsKIApAQCAtNjEsMTAgKzYxLDkgQEAKICAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKICAgICB9OwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1VUkw7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOwogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggMjVkNTVhMy4uYTYzYTk0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0yMiwyNCArMjIsMjIgQEAKIAogI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCIKICNpbmNsdWRlICJOdVBsYXllckRyaXZlci5oIgogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgogI2luY2x1ZGUgIlJUU1BTb3VyY2UuaCIKICNpbmNsdWRlICJTdHJlYW1pbmdTb3VyY2UuaCIKICNpbmNsdWRlICJHZW5lcmljU291cmNlLmgiCi0jaW5jbHVkZSAibXA0L01QNFNvdXJjZS5oIgorI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCi0jaW5jbHVkZSAiU29mdHdhcmVSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtNTIsNiArNTAsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUT0RPIG9wdGltaXplIGJ1ZmZlciBzaXplIGZvciBwb3dlciBjb25zdW1wdGlvbgorLy8gVGhlIG9mZmxvYWQgcmVhZCBidWZmZXIgc2l6ZSBpcyAzMiBLQiBidXQgMjQgS0IgdXNlcyBsZXNzIHBvd2VyLgorY29uc3Qgc2l6ZV90IE51UGxheWVyOjprQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzID0gMjQgKiAxMDI0OworCiBzdHJ1Y3QgTnVQbGF5ZXI6OkFjdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBBY3Rpb24oKSB7fQogCkBAIC02MiwxNiArNjQsMTggQEAKIH07CiAKIHN0cnVjdCBOdVBsYXllcjo6U2Vla0FjdGlvbiA6IHB1YmxpYyBBY3Rpb24gewotICAgIFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzKQotICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpIHsKKyAgICBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KQorICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpLAorICAgICAgICAgIG1OZWVkTm90aWZ5KG5lZWROb3RpZnkpIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllciAqcGxheWVyKSB7Ci0gICAgICAgIHBsYXllci0+cGVyZm9ybVNlZWsobVNlZWtUaW1lVXMpOworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZWVrKG1TZWVrVGltZVVzLCBtTmVlZE5vdGlmeSk7CiAgICAgfQogCiBwcml2YXRlOgogICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgYm9vbCBtTmVlZE5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlZWtBY3Rpb24pOwogfTsKQEAgLTE0OCwyMiArMTUyLDI2IEBACiAgICAgOiBtVUlEVmFsaWQoZmFsc2UpLAogICAgICAgbVNvdXJjZUZsYWdzKDApLAogICAgICAgbVZpZGVvSXNBVkMoZmFsc2UpLAotICAgICAgbU5lZWRzU3dSZW5kZXJlcihmYWxzZSksCisgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKICAgICAgIG1WaWRlb0VPUyhmYWxzZSksCiAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1TY2FuU291cmNlc0dlbmVyYXRpb24oMCksCiAgICAgICBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbigwKSwKKyAgICAgIG1UaW1lZFRleHRHZW5lcmF0aW9uKDApLAogICAgICAgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZyhmYWxzZSksCiAgICAgICBtRmx1c2hpbmdBdWRpbyhOT05FKSwKICAgICAgIG1GbHVzaGluZ1ZpZGVvKE5PTkUpLAogICAgICAgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCiAgICAgICBtU2tpcFJlbmRlcmluZ1ZpZGVvVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKLSAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCiAgICAgICBtTnVtRnJhbWVzVG90YWwoMGxsKSwKICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDBsbCksCiAgICAgICBtVmlkZW9TY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKIH0KIAogTnVQbGF5ZXI6On5OdVBsYXllcigpIHsKQEAgLTE4MywxNCArMTkxLDcgQEAKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIGlkKCkpOwogCi0gICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQudXNlLW1wNHNvdXJjZSIsIHByb3AsIE5VTEwpCi0gICAgICAgICAgICAmJiAoIXN0cmNtcChwcm9wLCAiMSIpIHx8ICFzdHJjYXNlY21wKHByb3AsICJ0cnVlIikpKSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBuZXcgTVA0U291cmNlKG5vdGlmeSwgc291cmNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBTdHJlYW1pbmdTb3VyY2Uobm90aWZ5LCBzb3VyY2UpKTsKLSAgICB9Ci0KKyAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IFN0cmVhbWluZ1NvdXJjZShub3RpZnksIHNvdXJjZSkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC0yMTIsNyArMjEzLDEwIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYygKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgaWQoKSk7CiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOwogCkBAIC0yMjAsMTggKzIyNCwzMSBAQAogCiAgICAgc3A8U291cmNlPiBzb3VyY2U7CiAgICAgaWYgKElzSFRUUExpdmVVUkwodXJsKSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBIVFRQTGl2ZVNvdXJjZShub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHVybCwgInJ0c3A6Ly8iLCA3KSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2UoCisgICAgICAgICAgICAgICAgbm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzLCBtVUlEVmFsaWQsIG1VSUQpOwogICAgIH0gZWxzZSBpZiAoKCFzdHJuY2FzZWNtcCh1cmwsICJodHRwOi8vIiwgNykKICAgICAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkKICAgICAgICAgICAgICAgICAgICAgJiYgKChsZW4gPj0gNCAmJiAhc3RyY2FzZWNtcCgiLnNkcCIsICZ1cmxbbGVuIC0gNF0pKQogICAgICAgICAgICAgICAgICAgICB8fCBzdHJzdHIodXJsLCAiLnNkcD8iKSkpIHsKLSAgICAgICAgc291cmNlID0gbmV3IFJUU1BTb3VyY2Uobm90aWZ5LCB1cmwsIGhlYWRlcnMsIG1VSURWYWxpZCwgbVVJRCwgdHJ1ZSk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBSVFNQU291cmNlKAorICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlELCB0cnVlKTsKICAgICB9IGVsc2UgewotICAgICAgICBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIHVybCwgaGVhZGVycywgbVVJRFZhbGlkLCBtVUlEKTsKLSAgICB9CisgICAgICAgIHNwPEdlbmVyaWNTb3VyY2U+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IEZMQUdfU0VDVVJFIG9uIG1Tb3VyY2VGbGFncyBoZXJlIGZvciB3aWRldmluZS4KKyAgICAgICAgLy8gVGhlIGNvcnJlY3QgZmxhZ3Mgd2lsbCBiZSB1cGRhdGVkIGluIFNvdXJjZTo6a1doYXRGbGFnc0NoYW5nZWQKKyAgICAgICAgLy8gaGFuZGxlciB3aGVuICBHZW5lcmljU291cmNlIGlzIHByZXBhcmVkLgogCisgICAgICAgIHN0YXR1c190IGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc291cmNlID0gZ2VuZXJpY1NvdXJjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICB9CisgICAgfQogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjQxLDcgKzI1OCwxNiBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CiAKLSAgICBzcDxTb3VyY2U+IHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworCisgICAgc3RhdHVzX3QgZXJyID0gc291cmNlLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICBzb3VyY2UgPSBOVUxMOworICAgIH0KKwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjYwLDcgKzI4Niw3IEBACiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KAogICAgICAgICAgICAgICAgICJuYXRpdmUtd2luZG93IiwKICAgICAgICAgICAgICAgICBuZXcgTmF0aXZlV2luZG93V3JhcHBlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB0cnVlIC8qIGNvbnRyb2xsZWRCeUFwcCAqLykpKTsKICAgICB9CiAKICAgICBtc2ctPnBvc3QoKTsKQEAgLTI4NSwzMiArMzExLDUyIEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnJlc2V0QXN5bmMoKSB7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBEdXJpbmcgYSByZXNldCwgdGhlIGRhdGEgc291cmNlIG1pZ2h0IGJlIHVucmVzcG9uc2l2ZSBhbHJlYWR5LCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZXhwbGljaXRseSBzbyB0aGF0IHJlYWRzIGV4aXQgcHJvbXB0bHkuCisgICAgICAgIC8vIFdlIGNhbid0IHF1ZXVlIHRoZSBkaXNjb25uZWN0IHJlcXVlc3QgdG8gdGhlIGxvb3BlciwgYXMgaXQgbWlnaHQgYmUKKyAgICAgICAgLy8gcXVldWVkIGJlaGluZCBhIHN0dWNrIHJlYWQgYW5kIG5ldmVyIGdldHMgcHJvY2Vzc2VkLgorICAgICAgICAvLyBEb2luZyBhIGRpc2Nvbm5lY3Qgb3V0c2lkZSB0aGUgbG9vcGVyIHRvIGFsbG93cyB0aGUgcGVuZGluZyByZWFkcyB0byBleGl0CisgICAgICAgIC8vIChlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggZXJyb3IpLgorICAgICAgICBtU291cmNlLT5kaXNjb25uZWN0KCk7CisgICAgfQorCiAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCBpZCgpKSktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6c2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzKSB7Cit2b2lkIE51UGxheWVyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgbXNnLT5zZXRJbnQzMigibmVlZE5vdGlmeSIsIG5lZWROb3RpZnkpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi0vLyBzdGF0aWMKLWJvb2wgTnVQbGF5ZXI6OklzRmx1c2hpbmdTdGF0ZShGbHVzaFN0YXR1cyBzdGF0ZSwgYm9vbCAqbmVlZFNodXRkb3duKSB7Ci0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6Ci0gICAgICAgICAgICBpZiAobmVlZFNodXRkb3duICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqbmVlZFNodXRkb3duID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046Ci0gICAgICAgICAgICBpZiAobmVlZFNodXRkb3duICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqbmVlZFNodXRkb3duID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwordm9pZCBOdVBsYXllcjo6d3JpdGVUcmFja0luZm8oCisgICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiBmb3JtYXQpIGNvbnN0IHsKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigidHlwZSIsICZ0cmFja1R5cGUpKTsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTdHJpbmcgbGFuZzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoImxhbmd1YWdlIiwgJmxhbmcpKTsKKworICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KKyAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImF1dG8iLCAmaXNBdXRvKSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7CisKKyAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQXV0byk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGVmYXVsdCk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRm9yY2VkKTsKICAgICB9CiB9CiAKQEAgLTMyMiwxNyArMzY4LDE5IEBACiAKICAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CiAKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7Ci0KLSAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKLQotICAgICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtU291cmNlKTsKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChPSyk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKGVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzQ4LDE2ICszOTYsNTggQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKworICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgeworICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjaworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY1RyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DQ0RlY29kZXItPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgorICAgICAgICB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKKwogICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIAorICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzY3LDEzICs0NTcsNDAgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgaW50MzJfdCBzZWxlY3Q7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKKworICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ICYmIGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbmZvID0gbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5mby0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2tJbmRleCAtPSBpbmJhbmRUcmFja3M7CisKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IGNjVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1DQ0RlY29kZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC00MjEsNiArNTM4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpKTsKIAogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJc3N1ZSBhIHNlZWsgdG8gcmVmcmVzaCB0aGUgdmlkZW8gc2NyZWVuIG9ubHkgaWYgc3RhcnRlZCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBtYXkgbm90IHlldCBiZSBzdGFydGVkIGFuZCB3aWxsIGFzc2VydC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZGVvIGRlY29kZXIgaXMgbm90IHNldCAocGVyaGFwcyBhdWRpbyBvbmx5IGluIHRoaXMgY2FzZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHBlcmZvcm0gYSBzZWVrIGFzIGl0IGlzIG5vdCBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXcgc3VyZmFjZSB0ZXh0dXJlLCBpbnN0YW50aWF0ZSBkZWNvZGVycwogICAgICAgICAgICAgICAgIC8vIGFnYWluIGlmIHBvc3NpYmxlLgogICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKApAQCAtNDQ3LDE2ICs1NzYsMjYgQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7CiAKICAgICAgICAgICAgIG1WaWRlb0lzQVZDID0gZmFsc2U7Ci0gICAgICAgICAgICBtTmVlZHNTd1JlbmRlcmVyID0gZmFsc2U7CisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CiAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKICAgICAgICAgICAgIG1WaWRlb0VPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdBdWRpb1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzID0gLTE7Ci0gICAgICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7CiAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwgPSAwOwogICAgICAgICAgICAgbU51bUZyYW1lc0Ryb3BwZWQgPSAwOwogICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCisgICAgICAgICAgICAvKiBpbnN0YW50aWF0ZSBkZWNvZGVycyBub3cgZm9yIHNlY3VyZSBwbGF5YmFjayAqLworICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUsICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKQEAgLTQ2NSwxMiArNjA0LDM3IEBACiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfUkVBTF9USU1FOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmssCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCBpZCgpKSwKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworCisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0KKyAgICAgICAgICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgKHZpZGVvRm9ybWF0ICE9IE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc19zdHJlYW1pbmcgKi8sIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19PRkZMT0FEX0FVRElPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIGlkKCkpOworICAgICAgICAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgICAgICAgICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG5vdGlmeSwgZmxhZ3MpOworCisgICAgICAgICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKKworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGaWxlTWV0YSgpOworICAgICAgICAgICAgaW50MzJfdCByYXRlOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJnJhdGUpICYmIHJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zZXRWaWRlb0ZyYW1lUmF0ZShyYXRlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ5MywxMSArNjU3LDE4IEBACiAgICAgICAgICAgICBib29sIG1IYWRBbnlTb3VyY2VzQmVmb3JlID0KICAgICAgICAgICAgICAgICAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMKTsKIAorICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB2aWRlbyBiZWZvcmUgYXVkaW8gYmVjYXVzZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mCisgICAgICAgICAgICAvLyB2aWRlbyBtYXkgY2hhbmdlIGRlZXAgYnVmZmVyIG1vZGUgb2YgYXVkaW8uCiAgICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2Rlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGF1ZGlvIHNpbmsgZWFybHkgdW5kZXIgb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyphdWRpbyovKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkF1ZGlvU2luayhmb3JtYXQsIHRydWUgLypvZmZsb2FkT25seSovKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUsICZtQXVkaW9EZWNvZGVyKTsKICAgICAgICAgICAgIH0KIApAQCAtNTM4LDI0ICs3MDksNDAgQEAKICAgICAgICAgewogICAgICAgICAgICAgYm9vbCBhdWRpbyA9IG1zZy0+d2hhdCgpID09IGtXaGF0QXVkaW9Ob3RpZnk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBjb2RlY1JlcXVlc3Q7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJjb2RlYy1yZXF1ZXN0IiwgJmNvZGVjUmVxdWVzdCkpOworICAgICAgICAgICAgaW50MzJfdCBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gPQorICAgICAgICAgICAgICAgIChhdWRpbz8gbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24gOiBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgJXMgZGVjb2RlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgcmVxdWVzdGVyR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgICAgIGlmICghKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkRGVjb2RlcklucHV0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBjb2RlY1JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIG1zZyk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewogICAgICAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RU9TKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRFT1MpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCAlcyBkZWNvZGVyIEVPUyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwpAQCAtNTY2LDE3MCArNzUzLDkxIEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhhdWRpbywgZXJyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICBib29sIG5lZWRTaHV0ZG93bjsKLQotICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhJc0ZsdXNoaW5nU3RhdGUobUZsdXNoaW5nQXVkaW8sICZuZWVkU2h1dGRvd24pKTsKLSAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKElzRmx1c2hpbmdTdGF0ZShtRmx1c2hpbmdWaWRlbywgJm5lZWRTaHV0ZG93bikpOwotICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IEZMVVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlciAlcyBmbHVzaCBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAotICAgICAgICAgICAgICAgIGlmIChuZWVkU2h1dGRvd24pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImluaXRpYXRpbmcgJXMgZGVjb2RlciBzaHV0ZG93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXIpLT5pbml0aWF0ZVNodXRkb3duKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgdHJ1ZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2Rlcjo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgSHosICVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmlkZW8gZGVjb2RlcgotICAgICAgICAgICAgICAgICAgICAvLyBpcyBjcmVhdGVkIGFmdGVyIHdlIHJlY2VpdmUgdGhlIGZvcm1hdCBjaGFuZ2UgaW5kaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBjb2RlIHdpbGwganVzdCBtYWtlIHRoYXQgd2Ugc2VsZWN0IGRlZXAgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdmlkZW8gd2hpY2ggc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gYXMgaXQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBwcmV2ZW50IGZyb20ga2VlcGluZyBBL1Ygc3luYy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgPT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkF1ZGlvU2luayhmb3JtYXQsIGZhbHNlIC8qb2ZmbG9hZE9ubHkqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8KKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1JlcXVlc3QtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwbGF5V2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcGxheUhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKLQotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVkIHggJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICIoY3JvcDogJWQgeCAlZCBAICglZCwgJWQpKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHZpZGVvSW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGludG8gYWNjb3VudCBzYW1wbGUgYXNwZWN0IHJhdGlvIGlmIG5lY2Vzc2FyeToKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlkZW9JbnB1dEZvcm1hdC0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcldpZHRoLCBzYXJIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSAoZGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTmVlZHNTd1JlbmRlcmVyICYmIG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUmVxdWVzdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zZXRTb2Z0UmVuZGVyZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLCBtZXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdBdWRpbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdWaWRlbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RXJyb3IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgZXJyb3IgZnJvbSAlcyBkZWNvZGVyLCBhYm9ydGluZyBwbGF5YmFjay4iLAotICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0KLSAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKGF1ZGlvLCBVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RHJhaW5UaGlzQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgcmVuZGVyQnVmZmVyKGF1ZGlvLCBjb2RlY1JlcXVlc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IEFDb2RlYzo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNSZXF1ZXN0LT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgbU5lZWRzU3dSZW5kZXJlciA9IG5hbWUuc3RhcnRzV2l0aCgiT01YLmdvb2dsZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdEVycm9yKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpIHx8IGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCAhPSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZAotICAgICAgICAgICAgICAgICAgICAmJiB3aGF0ICE9IEFDb2RlYzo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBjb2RlYyBub3RpZmljYXRpb24gJWQgJyVjJWMlYyVjJy4iLAorCisgICAgICAgICAgICAgICAgLy8gRGVjb2RlciBlcnJvcnMgY2FuIGJlIGR1ZSB0byBTb3VyY2UgKGUuZy4gZnJvbSBzdHJlYW1pbmcpLAorICAgICAgICAgICAgICAgIC8vIG9yIGZyb20gZGVjb2RpbmcgY29ycnVwdGVkIGJpdHN0cmVhbXMsIG9yIGZyb20gb3RoZXIgZGVjb2RlcgorICAgICAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgb3BlcmF0aW9ucyAoZS5nLiBmcm9tIGFuIG9uZ29pbmcgcmVzZXQgb3Igc2VlaykuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSB0cnkgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGFmZmVjdGVkIGRlY29kZXIgaWYgcG9zc2libGUsCisgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZvcmNlIHRoZSBzaHV0ZG93biB3aXRoIHNvbWV0aGluZworICAgICAgICAgICAgICAgIC8vIHNpbWlsYXIgdG8gcGVyZm9ybVJlc2V0KCkuIFRoaXMgbWV0aG9kIGNhbiBsZWFkIHRvIGEgaGFuZworICAgICAgICAgICAgICAgIC8vIGlmIE1lZGlhQ29kZWMgZnVuY3Rpb25zIGJsb2NrIGFmdGVyIGFuIGVycm9yLCBidXQgdGhleSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGluc3RlYWQgb2YgYmxvY2tpbmcuCisKKyAgICAgICAgICAgICAgICBGbHVzaFN0YXR1cyAqZmx1c2hpbmcgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmVjZWl2ZWQgZXJyb3IoJSN4KSBmcm9tICVzIGRlY29kZXIsIGZsdXNoaW5nKCVkKSwgbm93IHNodXR0aW5nIGRvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCAqZmx1c2hpbmcpOworCisgICAgICAgICAgICAgICAgc3dpdGNoICgqZmx1c2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sICFhdWRpbyAvKiB2aWRlbyAqLykpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV047IC8vIGluaXRpYXRlIHNodXRkb3duIGFmdGVyIGZsdXNoLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0hVVFRJTkdfRE9XTl9ERUNPREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIHNodXRkb3duIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvICYmIG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsgLy8gSW4gdGhlIG1pZGRsZSBvZiBhIHNlZWsuCisgICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7ICAgICAvLyBTaHV0IGRvd24uCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUX0RPV046CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyOjprV2hhdERyYWluVGhpc0J1ZmZlcikgeworICAgICAgICAgICAgICAgIHJlbmRlckJ1ZmZlcihhdWRpbywgbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBkZWNvZGVyIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDE2KSAmIDB4ZmYsCkBAIC03NDIsNiArODUwLDE0IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlbmRlcmVyTm90aWZ5OgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBtUmVuZGVyZXJHZW5lcmF0aW9uIC0gMTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IG1SZW5kZXJlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgcmVuZGVyZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlckdlbmVyYXRpb24sIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaW50MzJfdCB3aGF0OwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwogCkBAIC03NzIsMzEgKzg4OCwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1WaWRlb0VPUyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0UG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInZpZGVvTGF0ZUJ5VXMiLCAmbVZpZGVvTGF0ZUJ5VXMpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UG9zaXRpb24ocG9zaXRpb25Vcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RnJhbWVTdGF0cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1RvdGFsLCBtTnVtRnJhbWVzRHJvcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKICAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIGZhbHNlIC8qIGlzRGVjb2RlciAqLyk7CisgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCkgewogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lORk8sIE1FRElBX0lORk9fUkVOREVSSU5HX1NUQVJULCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGVhciBkb3duIGF1ZGlvIG9mZmxvYWQsIGZhbGwgYmFjayB0byBzL3cgcGF0aCIpOworICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgicG9zaXRpb25VcyIsICZwb3NpdGlvblVzKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKyAgICAgICAgICAgICAgICBjbG9zZUF1ZGlvU2luaygpOworICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPmZsdXNoKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsocG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBSZW5kZXJlcjo6a0R1ZVRvRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtODI0LDE0ICs5NDcsMTggQEAKICAgICAgICAgY2FzZSBrV2hhdFNlZWs6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbmVlZE5vdGlmeTsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuZWVkTm90aWZ5IiwgJm5lZWROb3RpZnkpKTsKIAotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMiLCBzZWVrVGltZVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBuZWVkTm90aWZ5PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgbmVlZE5vdGlmeSk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjo6cGVyZm9ybURlY29kZXJGbHVzaCkpOwogCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzKSk7CisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcywgbmVlZE5vdGlmeSkpOwogCiAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTgzOSwxNyArOTY2LDM2IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDSyhtUmVuZGVyZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtU291cmNlLT5wYXVzZSgpOwotICAgICAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnBhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0sobVJlbmRlcmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7Ci0gICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHxtQXVkaW9EZWNvZGVyfCBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIGR1ZSB0byB0aGUgcGF1c2UgdGltZW91dCwgc28gcmUtY3JlYXRlIGl0IGlmCisgICAgICAgICAgICAvLyBuZWVkZWQuCisgICAgICAgICAgICBpZiAoYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTg1OSwzOSArMTAwNSw5NiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgb25DbG9zZWRDYXB0aW9uTm90aWZ5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpmaW5pc2hGbHVzaElmUG9zc2libGUoKSB7Ci0gICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQgJiYgbUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSB7Citib29sIE51UGxheWVyOjphdWRpb0RlY29kZXJTdGlsbE5lZWRlZCgpIHsKKyAgICAvLyBBdWRpbyBkZWNvZGVyIGlzIG5vIGxvbmdlciBuZWVkZWQgaWYgaXQncyBpbiBzaHV0L3NodXR0aW5nIGRvd24gc3RhdHVzLgorICAgIHJldHVybiAoKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgJiYgKG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRUSU5HX0RPV05fREVDT0RFUikpOworfQorCit2b2lkIE51UGxheWVyOjpoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKSB7CisgICAgLy8gV2Ugd2FpdCBmb3IgYm90aCB0aGUgZGVjb2RlciBmbHVzaCBhbmQgdGhlIHJlbmRlcmVyIGZsdXNoIHRvIGNvbXBsZXRlCisgICAgLy8gYmVmb3JlIGVudGVyaW5nIGVpdGhlciB0aGUgRkxVU0hFRCBvciB0aGUgU0hVVFRJTkdfRE9XTl9ERUNPREVSIHN0YXRlLgorCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2lzRGVjb2Rlcl0gPSB0cnVlOworICAgIGlmICghbUZsdXNoQ29tcGxldGVbYXVkaW9dWyFpc0RlY29kZXJdKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRCAmJiBtRmx1c2hpbmdWaWRlbyAhPSBTSFVUX0RPV04pIHsKKyAgICBGbHVzaFN0YXR1cyAqc3RhdGUgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICBzd2l0Y2ggKCpzdGF0ZSkgeworICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6CisgICAgICAgIHsKKyAgICAgICAgICAgICpzdGF0ZSA9IEZMVVNIRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOworCisgICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICBpZiAoIWF1ZGlvKSB7CisgICAgICAgICAgICAgICAgLy8gV2lkZXZpbmUgc291cmNlIHJlYWRzIG11c3Qgc3RvcCBiZWZvcmUgcmVsZWFzaW5nIHRoZSB2aWRlbyBkZWNvZGVyLgorICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwgJiYgbVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGRlY29kZXIgZmx1c2ggY29tcGxldGVzIG9ubHkgb2NjdXIgaW4gYSBmbHVzaGluZyBzdGF0ZS4KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXNEZWNvZGVyLCAiZGVjb2RlciBmbHVzaCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgKnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6ZmluaXNoRmx1c2hJZlBvc3NpYmxlKCkgeworICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FICYmIG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQKKyAgICAgICAgICAgICYmIG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nVmlkZW8gIT0gU0hVVF9ET1dOKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBBTE9HVigiYm90aCBhdWRpbyBhbmQgdmlkZW8gYXJlIGZsdXNoZWQgbm93LiIpOwogCisgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisKICAgICBpZiAobVRpbWVEaXNjb250aW51aXR5UGVuZGluZykgewogICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPSBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCAmJiBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVEKSB7CiAgICAgICAgIG1BdWRpb0RlY29kZXItPnNpZ25hbFJlc3VtZSgpOwogICAgIH0KIAotICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1GbHVzaGluZ1ZpZGVvID09IEZMVVNIRUQpIHsKICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKCk7CiAgICAgfQogCiAgICAgbUZsdXNoaW5nQXVkaW8gPSBOT05FOwogICAgIG1GbHVzaGluZ1ZpZGVvID0gTk9ORTsKIAorICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOworCiAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogfQogCkBAIC05MDcsNiArMTExMCwzOCBAQAogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOwogfQogCit2b2lkIE51UGxheWVyOjpvcGVuQXVkaW9TaW5rKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBib29sIG9mZmxvYWRPbmx5KSB7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGJvb2wgaGFzVmlkZW8gPSAobVZpZGVvRGVjb2RlciAhPSBOVUxMKTsKKyAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgdmlkZW8gZGVjb2RlcgorICAgIC8vIGlzIGNyZWF0ZWQgYWZ0ZXIgd2UgcmVjZWl2ZSB0aGUgZm9ybWF0IGNoYW5nZSBpbmRpY2F0aW9uLgorICAgIC8vIEN1cnJlbnQgY29kZSB3aWxsIGp1c3QgbWFrZSB0aGF0IHdlIHNlbGVjdCBkZWVwIGJ1ZmZlcgorICAgIC8vIHdpdGggdmlkZW8gd2hpY2ggc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gYXMgaXQgc2hvdWxkCisgICAgLy8gbm90IHByZXZlbnQgZnJvbSBrZWVwaW5nIEEvViBzeW5jLgorICAgIGlmIChoYXNWaWRlbyAmJgorICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCisgICAgICAgICAgICBkdXJhdGlvblVzCisgICAgICAgICAgICAgICAgPiBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUykgeworICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICB9CisKKyAgICBtT2ZmbG9hZEF1ZGlvID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzKTsKKworICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPQorICAgICAgICAgICAgICAgIG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgIHNlbmRNZXRhRGF0YVRvSGFsKG1BdWRpb1NpbmssIGF1ZGlvTWV0YSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtUmVuZGVyZXItPmNsb3NlQXVkaW9TaW5rKCk7Cit9CisKIHN0YXR1c190IE51UGxheWVyOjppbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2Rlcj4gKmRlY29kZXIpIHsKICAgICBpZiAoKmRlY29kZXIgIT0gTlVMTCkgewogICAgICAgICByZXR1cm4gT0s7CkBAIC05MjIsMTggKzExNTcsNTcgQEAKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogICAgICAgICBtVmlkZW9Jc0FWQyA9ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZS5jX3N0cigpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gY2NOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOworCisgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPQotICAgICAgICBuZXcgQU1lc3NhZ2UoYXVkaW8gPyBrV2hhdEF1ZGlvTm90aWZ5IDoga1doYXRWaWRlb05vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgIGlkKCkpOworICAgIGlmIChhdWRpbykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9Ob3RpZnksIGlkKCkpOworICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24pOwogCi0gICAgKmRlY29kZXIgPSBhdWRpbyA/IG5ldyBEZWNvZGVyKG5vdGlmeSkgOgotICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVjb2Rlcihub3RpZnksIG1OYXRpdmVXaW5kb3cpOwotICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIoKmRlY29kZXIpOworICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VmlkZW9Ob3RpZnksIGlkKCkpOworICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCisgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtTmF0aXZlV2luZG93KTsKKyAgICB9CisgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwogCisgICAgLy8gYWxsb2NhdGUgYnVmZmVycyB0byBkZWNyeXB0IHdpZGV2aW5lIHNvdXJjZSBidWZmZXJzCisgICAgaWYgKCFhdWRpbyAmJiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkpIHsKKyAgICAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gaW5wdXRCdWZzOworICAgICAgICBDSEVDS19FUSgoKmRlY29kZXIpLT5nZXRJbnB1dEJ1ZmZlcnMoJmlucHV0QnVmcyksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1lZGlhQnVmczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEJ1ZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSBpbnB1dEJ1ZnNbaV07CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgbWVkaWFCdWZzLnB1c2gobWJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zZXRCdWZmZXJzKGF1ZGlvLCBtZWRpYUJ1ZnMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhQnVmcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIG1lZGlhQnVmc1tpXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVkaWFCdWZzLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HRSgiU2VjdXJlIHNvdXJjZSBkaWRuJ3Qgc3VwcG9ydCBzZWN1cmUgbWVkaWFCdWZzLiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTk0MSw4ICsxMjE1LDkgQEAKICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKIAotICAgIGlmICgoYXVkaW8gJiYgSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ0F1ZGlvKSkKLSAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgSXNGbHVzaGluZ1N0YXRlKG1GbHVzaGluZ1ZpZGVvKSkpIHsKKyAgICBpZiAoKGF1ZGlvICYmIG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUpCisgICAgICAgICAgICB8fCAoIWF1ZGlvICYmIG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpCisgICAgICAgICAgICB8fCBtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBJTkZPX0RJU0NPTlRJTlVJVFkpOwogICAgICAgICByZXBseS0+cG9zdCgpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC05NTAsMTQgKzEyMjUsMzcgQEAKIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CiAKKyAgICAvLyBBZ2dyZWdhdGUgc21hbGxlciBidWZmZXJzIGludG8gYSBsYXJnZXIgYnVmZmVyLgorICAgIC8vIFRoZSBnb2FsIGlzIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbi4KKyAgICAvLyBOb3RlIHRoaXMgd2lsbCBub3Qgd29yayBpZiB0aGUgZGVjb2RlciByZXF1aXJlcyBvbmUgZnJhbWUgcGVyIGJ1ZmZlci4KKyAgICBib29sIGRvQnVmZmVyQWdncmVnYXRpb24gPSAoYXVkaW8gJiYgbU9mZmxvYWRBdWRpbyk7CisgICAgYm9vbCBuZWVkTW9yZURhdGEgPSBmYWxzZTsKKwogICAgIGJvb2wgZHJvcEFjY2Vzc1VuaXQ7CiAgICAgZG8gewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhdWRpbywgJmFjY2Vzc1VuaXQpOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIC8vIERpZCB3ZSBzYXZlIGFuIGFjY2Vzc1VuaXQgZWFybGllciBiZWNhdXNlIG9mIGEgZGlzY29udGludWl0eT8KKyAgICAgICAgaWYgKGF1ZGlvICYmIChtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCAhPSBOVUxMKSkgeworICAgICAgICAgICAgYWNjZXNzVW5pdCA9IG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0OworICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGVyciA9IG1QZW5kaW5nQXVkaW9FcnI7CisgICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSB1c2UgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGF1ZGlvLCAmYWNjZXNzVW5pdCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvQnVmZmVyQWdncmVnYXRpb24gJiYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBzbyBzYXZlIHRoaXMgZm9yIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvRXJyID0gZXJyOworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdCA9IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZlZWREZWNvZGVySW5wdXREYXRhKCkgc2F2ZSBkaXNjb250aW51aXR5IGZvciBsYXRlciIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwogICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKIApAQCAtMTAwMiwzNCArMTMwMCw0NCBAQAogICAgICAgICAgICAgICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPQogICAgICAgICAgICAgICAgICAgICBtVGltZURpc2NvbnRpbnVpdHlQZW5kaW5nIHx8IHRpbWVDaGFuZ2U7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIHx8IHRpbWVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gPT0gTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHdlJ2xsIHJlc3VtZSBzY2FubmluZyBzb3VyY2VzIG9uY2Ugd2UncmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmx1c2hpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfZnJvbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgc2VhbWxlc3MgZm9ybWF0IGNoYW5nZSBzZXBhcmF0ZWx5CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9ICFzZWFtbGVzc0Zvcm1hdENoYW5nZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzaHV0ZG93bk9yRmx1c2ggPSBmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlICYmICFkZWNvZGVyLT5zdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKG5ld0Zvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBxdWV1ZSB1cCBzY2FuLXNvdXJjZXMgb25seSBvbmNlIHBlciBkaXNjb250aW51aXR5LgorICAgICAgICAgICAgICAgIC8vIFdlIGNvbnRyb2wgdGhpcyBieSBkb2luZyBpdCBvbmx5IGlmIG5laXRoZXIgYXVkaW8gbm9yIHZpZGVvIGFyZQorICAgICAgICAgICAgICAgIC8vIGZsdXNoaW5nIG9yIHNodXR0aW5nIGRvd24uICAoQWZ0ZXIgaGFuZGxpbmcgMXN0IGRpc2NvbnRpbnVpdHksIG9uZQorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmbHVzaGluZyBzdGF0ZXMgd2lsbCBub3QgYmUgTk9ORS4pCisgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzY2FuIHNvdXJjZXMgaWYgdGhpcyBkaXNjb250aW51aXR5IGRvZXMgbm90IHJlc3VsdAorICAgICAgICAgICAgICAgIC8vIGluIGEgZmx1c2ggb3Igc2h1dGRvd24sIGFzIHRoZSBmbHVzaGluZyBzdGF0ZSB3aWxsIHN0YXkgTk9ORS4KKyAgICAgICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyA9PSBOT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bk9yRmx1c2gpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHdlJ2xsIHJlc3VtZSBzY2FubmluZyBzb3VyY2VzIG9uY2Ugd2UncmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaGluZy4KKyAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2Zyb250KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAvKiBub3Qgc2VhbWxlc3MgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBjaGFuZ2UgZGVjb2RlcgorICAgICAgICAgICAgICAgICAgICBmbHVzaERlY29kZXIoYXVkaW8sIC8qIG5lZWRTaHV0ZG93biA9ICovIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGZsdXNoCisgICAgICAgICAgICAgICAgICAgIGZsdXNoRGVjb2RlcihhdWRpbywgLyogbmVlZFNodXRkb3duID0gKi8gZmFsc2UsIG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhbWxlc3NGb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgZXhpc3RpbmcgZGVjb2RlciBhbmQgZG9uJ3QgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVjb2RlckZvcm1hdFdpdGhvdXRGbHVzaChhdWRpbywgbmV3Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBGTFVTSEVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7Ci0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDQ1LDEzICsxMzUzLDU4IEBACiAKICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSBmYWxzZTsKICAgICAgICAgaWYgKCFhdWRpbwotICAgICAgICAgICAgICAgICYmIG1WaWRlb0xhdGVCeVVzID4gMTAwMDAwbGwKKyAgICAgICAgICAgICAgICAmJiAhKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpCisgICAgICAgICAgICAgICAgJiYgbVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBsbAogICAgICAgICAgICAgICAgICYmIG1WaWRlb0lzQVZDCiAgICAgICAgICAgICAgICAgJiYgIUlzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCkpIHsKICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKICAgICAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CiAgICAgICAgIH0KLSAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCk7CisKKyAgICAgICAgc2l6ZV90IHNtYWxsU2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKyAgICAgICAgbmVlZE1vcmVEYXRhID0gZmFsc2U7CisgICAgICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGlmIG9ubHkgcm9vbSBmb3IgYSBmZXcgc21hbGwgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAmJiAoc21hbGxTaXplIDwgKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMgLyAzKSkpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIGxhcmdlciBidWZmZXIgZm9yIGNvbWJpbmluZyBzbWFsbGVyIGJ1ZmZlcnMgZnJvbSB0aGUgZXh0cmFjdG9yLgorICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMpOworICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7IC8vIHN0YXJ0IGVtcHR5CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9CdWZmZXJBZ2dyZWdhdGlvbiAmJiAobUFnZ3JlZ2F0ZUJ1ZmZlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpbnQ2NF90IGR1bW15OworICAgICAgICAgICAgYm9vbCBzbWFsbFRpbWVzdGFtcFZhbGlkID0gYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpOworICAgICAgICAgICAgYm9vbCBiaWdUaW1lc3RhbXBWYWxpZCA9IG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZHVtbXkpOworICAgICAgICAgICAgLy8gV2lsbCB0aGUgc21hbGxlciBidWZmZXIgZml0PworICAgICAgICAgICAgc2l6ZV90IGJpZ1NpemUgPSBtQWdncmVnYXRlQnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgcm9vbUxlZnQgPSBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpIC0gYmlnU2l6ZTsKKyAgICAgICAgICAgIC8vIFNob3VsZCB3ZSBzYXZlIHRoaXMgc21hbGwgYnVmZmVyIGZvciB0aGUgbmV4dCBiaWcgYnVmZmVyPworICAgICAgICAgICAgLy8gSWYgdGhlIGZpcnN0IHNtYWxsIGJ1ZmZlciBkaWQgbm90IGhhdmUgYSB0aW1lc3RhbXAgdGhlbiBzYXZlCisgICAgICAgICAgICAvLyBhbnkgYnVmZmVyIHRoYXQgZG9lcyBoYXZlIGEgdGltZXN0YW1wIHVudGlsIHRoZSBuZXh0IGJpZyBidWZmZXIuCisgICAgICAgICAgICBpZiAoKHNtYWxsU2l6ZSA+IHJvb21MZWZ0KQorICAgICAgICAgICAgICAgIHx8ICghYmlnVGltZXN0YW1wVmFsaWQgJiYgKGJpZ1NpemUgPiAwKSAmJiBzbWFsbFRpbWVzdGFtcFZhbGlkKSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBlcnI7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQgPSBhY2Nlc3NVbml0OworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gR3JhYiB0aW1lIGZyb20gZmlyc3Qgc21hbGwgYnVmZmVyIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICBpZiAoKGJpZ1NpemUgPT0gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBcHBlbmQgc21hbGwgYnVmZmVyIHRvIHRoZSBiaWdnZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgIG1lbWNweShtQWdncmVnYXRlQnVmZmVyLT5iYXNlKCkgKyBiaWdTaXplLCBhY2Nlc3NVbml0LT5kYXRhKCksIHNtYWxsU2l6ZSk7CisgICAgICAgICAgICAgICAgYmlnU2l6ZSArPSBzbWFsbFNpemU7CisgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2V0UmFuZ2UoMCwgYmlnU2l6ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgcnVuIG91dCBvZiByb29tIGluIHRoZSBtQWdncmVnYXRlQnVmZmVyLgorICAgICAgICAgICAgICAgIG5lZWRNb3JlRGF0YSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzbWFsbFNpemUgPSAlenUsIGJpZ1NpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsU2l6ZSwgYmlnU2l6ZSwgbUFnZ3JlZ2F0ZUJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCB8fCBuZWVkTW9yZURhdGEpOwogCiAgICAgLy8gQUxPR1YoInJldHVybmVkIGEgdmFsaWQgYnVmZmVyIG9mICVzIGRhdGEiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIApAQCAtMTA2Myw3ICsxNDE2LDE5IEBACiAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CiAjZW5kaWYKIAotICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworICAgIGlmICghYXVkaW8pIHsKKyAgICAgICAgbUNDRGVjb2Rlci0+ZGVjb2RlKGFjY2Vzc1VuaXQpOworICAgIH0KKworICAgIGlmIChkb0J1ZmZlckFnZ3JlZ2F0aW9uICYmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgIEFMT0dWKCJmZWVkRGVjb2RlcklucHV0RGF0YSgpIHJlcGx5IHdpdGggYWdncmVnYXRlZCBidWZmZXIsICV6dSIsCisgICAgICAgICAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgbUFnZ3JlZ2F0ZUJ1ZmZlcik7CisgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXIuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBhY2Nlc3NVbml0KTsKKyAgICB9CisKICAgICByZXBseS0+cG9zdCgpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTA3NSw3ICsxNDQwLDggQEAKICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CiAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKIAotICAgIGlmIChJc0ZsdXNoaW5nU3RhdGUoYXVkaW8gPyBtRmx1c2hpbmdBdWRpbyA6IG1GbHVzaGluZ1ZpZGVvKSkgeworICAgIGlmICgoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gIT0gTk9ORSkKKyAgICAgICAgICAgIHx8ICghYXVkaW8gJiYgbUZsdXNoaW5nVmlkZW8gIT0gTk9ORSkpIHsKICAgICAgICAgLy8gV2UncmUgY3VycmVudGx5IGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhlIGRlY29kZXIsIGluIG9yZGVyCiAgICAgICAgIC8vIHRvIGNvbXBsZXRlIHRoaXMsIHRoZSBkZWNvZGVyIHdhbnRzIGFsbCBpdHMgYnVmZmVycyBiYWNrLAogICAgICAgICAvLyBzbyB3ZSBkb24ndCB3YW50IGFueSBvdXRwdXQgYnVmZmVycyBpdCBzZW50IHVzIChmcm9tIGJlZm9yZQpAQCAtMTA5MSwxNCArMTQ1NywxNSBAQAogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAorICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisKICAgICBpbnQ2NF90ICZza2lwVW50aWxNZWRpYVRpbWVVcyA9CiAgICAgICAgIGF1ZGlvCiAgICAgICAgICAgICA/IG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzCiAgICAgICAgICAgICA6IG1Ta2lwUmVuZGVyaW5nVmlkZW9VbnRpbE1lZGlhVGltZVVzOwogCiAgICAgaWYgKHNraXBVbnRpbE1lZGlhVGltZVVzID49IDApIHsKLSAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKLSAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CiAKICAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgc2tpcFVudGlsTWVkaWFUaW1lVXMpIHsKICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyAlcyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLApAQCAtMTExMiw5ICsxNDc5LDc5IEBACiAgICAgICAgIHNraXBVbnRpbE1lZGlhVGltZVVzID0gLTE7CiAgICAgfQogCisgICAgaWYgKCFhdWRpbyAmJiBtQ0NEZWNvZGVyLT5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgbUNDRGVjb2Rlci0+ZGlzcGxheShtZWRpYVRpbWVVcyk7CisgICAgfQorCiAgICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcihhdWRpbywgYnVmZmVyLCByZXBseSk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBpZiAoaW5wdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiVW5rbm93biB2aWRlbyBzaXplLCByZXBvcnRpbmcgMHgwISIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRVRfVklERU9fU0laRSwgMCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKKyAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZFJlY3QoCisgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKKworICAgICAgICBkaXNwbGF5V2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7CisKKyAgICAgICAgQUxPR1YoIlZpZGVvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCB4ICVkICIKKyAgICAgICAgICAgICAiKGNyb3A6ICVkIHggJWQgQCAoJWQsICVkKSkiLAorICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJmRpc3BsYXlXaWR0aCkpOworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmZGlzcGxheUhlaWdodCkpOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBpbnB1dCBmb3JtYXQgJWQgeCAlZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfQorCisgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgc2FtcGxlIGFzcGVjdCByYXRpbyBpZiBuZWNlc3Nhcnk6CisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGlmIChpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCisgICAgICAgICAgICAmJiBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkpIHsKKyAgICAgICAgQUxPR1YoIlNhbXBsZSBhc3BlY3QgcmF0aW8gJWQgOiAlZCIsIHNhcldpZHRoLCBzYXJIZWlnaHQpOworCisgICAgICAgIGRpc3BsYXlXaWR0aCA9IChkaXNwbGF5V2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CisKKyAgICAgICAgQUxPR1YoImRpc3BsYXkgZGltZW5zaW9ucyAlZCB4ICVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWlucHV0Rm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgeworICAgICAgICBpbnQzMl90IHRtcCA9IGRpc3BsYXlXaWR0aDsKKyAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheUhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IHRtcDsKKyAgICB9CisKKyAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgIE1FRElBX1NFVF9WSURFT19TSVpFLAorICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewogICAgIGlmIChtRHJpdmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTEyOSw2MyArMTU2Niw3MiBAQAogICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIobXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OmZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bikgewordm9pZCBOdVBsYXllcjo6Zmx1c2hEZWNvZGVyKAorICAgICAgICBib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93biwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZuZXdGb3JtYXQpIHsKICAgICBBTE9HVigiWyVzXSBmbHVzaERlY29kZXIgbmVlZFNodXRkb3duPSVkIiwKICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBuZWVkU2h1dGRvd24pOwogCi0gICAgaWYgKChhdWRpbyAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHx8ICghYXVkaW8gJiYgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgIGNvbnN0IHNwPERlY29kZXI+ICZkZWNvZGVyID0gZ2V0RGVjb2RlcihhdWRpbyk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HSSgiZmx1c2hEZWNvZGVyICVzIHdpdGhvdXQgZGVjb2RlciBwcmVzZW50IiwKICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjb250aW51ZSB0byBzY2FuIHNvdXJjZXMgdW50aWwgd2UgZmluaXNoIGZsdXNoaW5nLgogICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CiAKLSAgICAoYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlciktPnNpZ25hbEZsdXNoKCk7CisgICAgZGVjb2Rlci0+c2lnbmFsRmx1c2gobmV3Rm9ybWF0KTsKICAgICBtUmVuZGVyZXItPmZsdXNoKGF1ZGlvKTsKIAogICAgIEZsdXNoU3RhdHVzIG5ld1N0YXR1cyA9CiAgICAgICAgIG5lZWRTaHV0ZG93biA/IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04gOiBGTFVTSElOR19ERUNPREVSOwogCisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2ZhbHNlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11bdHJ1ZSAvKiBpc0RlY29kZXIgKi9dID0gZmFsc2U7CiAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIENIRUNLKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUKLSAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBBV0FJVElOR19ESVNDT05USU5VSVRZKTsKLQorICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdBdWRpbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJhdWRpbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdBdWRpbyk7CiAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gbmV3U3RhdHVzOwotCi0gICAgICAgIGlmIChtRmx1c2hpbmdWaWRlbyA9PSBOT05FKSB7Ci0gICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgPyBBV0FJVElOR19ESVNDT05USU5VSVRZCi0gICAgICAgICAgICAgICAgOiBGTFVTSEVEOwotICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobUZsdXNoaW5nVmlkZW8gPT0gTk9ORQotICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ1ZpZGVvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkpOwotCisgICAgICAgIEFMT0dFX0lGKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUsCisgICAgICAgICAgICAgICAgInZpZGVvIGZsdXNoRGVjb2RlcigpIGlzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1GbHVzaGluZ1ZpZGVvKTsKICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBuZXdTdGF0dXM7CiAKLSAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUpIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICA/IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICA6IEZMVVNIRUQ7CisgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DQ0RlY29kZXItPmZsdXNoKCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXNwPEFNZXNzYWdlPiBOdVBsYXllcjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7Cit2b2lkIE51UGxheWVyOjp1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKAorICAgICAgICBib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIHVwZGF0ZURlY29kZXJGb3JtYXRXaXRob3V0Rmx1c2giLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAotICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29uc3Qgc3A8RGVjb2Rlcj4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKKyAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dJKCJ1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoICVzIHdpdGhvdXQgZGVjb2RlciBwcmVzZW50IiwKKyAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgZGVjb2Rlci0+c2lnbmFsVXBkYXRlRm9ybWF0KGZvcm1hdCk7Cit9CiAKLSAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Cit2b2lkIE51UGxheWVyOjpxdWV1ZURlY29kZXJTaHV0ZG93bigKKyAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIEFMT0dJKCJxdWV1ZURlY29kZXJTaHV0ZG93biBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOworCisgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICBuZXcgU2h1dGRvd25EZWNvZGVyQWN0aW9uKGF1ZGlvLCB2aWRlbykpOworCisgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKKworICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OnNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKSB7CkBAIC0xMjExLDYgKzE2NTcsMTkgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE51UGxheWVyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIGlkKCkpOwogICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwpAQCAtMTIxOSw5ICsxNjc4LDM1IEBACiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKIAorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE51UGxheWVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHNwPFJlbmRlcmVyPiByZW5kZXJlciA9IG1SZW5kZXJlcjsKKyAgICBpZiAocmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6Z2V0U3RhdHMoaW50NjRfdCAqbnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm51bUZyYW1lc0Ryb3BwZWQpIHsKKyAgICAqbnVtRnJhbWVzVG90YWwgPSBtTnVtRnJhbWVzVG90YWw7CisgICAgKm51bUZyYW1lc0Ryb3BwZWQgPSBtTnVtRnJhbWVzRHJvcHBlZDsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpnZXRGaWxlTWV0YSgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6c2NoZWR1bGVQb2xsRHVyYXRpb24oKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxEdXJhdGlvbiwgaWQoKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKTsKQEAgLTEyMzgsMTggKzE3MjMsNiBAQAogICAgICAgICAvLyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIGkuZS4gb25lIG1vcmUgbW9yZSBkZWNvZGVycyBhcmUgY3VycmVudGx5CiAgICAgICAgIC8vIGZsdXNoaW5nIG9yIHNodXR0aW5nIGRvd24uCiAKLSAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIGFuIGVkZ2UgY2FzZSB3aGVyZSB0aGUgcmVuZGVyZXIgb3ducyBhbGwgb3V0cHV0Ci0gICAgICAgICAgICAvLyBidWZmZXJzIGFuZCBpcyBwYXVzZWQsIHRoZXJlZm9yZSB0aGUgZGVjb2RlciB3aWxsIG5vdCByZWFkCi0gICAgICAgICAgICAvLyBtb3JlIGlucHV0IGRhdGEgYW5kIHdpbGwgbmV2ZXIgZW5jb3VudGVyIHRoZSBtYXRjaGluZwotICAgICAgICAgICAgLy8gZGlzY29udGludWl0eS4gVG8gYXZvaWQgdGhpcywgd2UgcmVzdW1lIHRoZSByZW5kZXJlci4KLQotICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEFXQUlUSU5HX0RJU0NPTlRJTlVJVFkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUZsdXNoaW5nVmlkZW8gPT0gQVdBSVRJTkdfRElTQ09OVElOVUlUWSkgewotICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSB8fCBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgZmx1c2hpbmcsIHBvc3Rwb25lIHRoZSByZXNldCB1bnRpbCB0aGF0J3MKICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KQEAgLTEyNjcsMTggKzE3NDAsMjkgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgewotICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcykiLAordm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpIHsKKyAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBuZWVkTm90aWZ5KCVkKSIsCiAgICAgICAgICAgc2Vla1RpbWVVcywKLSAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2LAorICAgICAgICAgIG5lZWROb3RpZnkpOwogCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKKyAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcyk7CisgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UG9zaXRpb24oc2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOworICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzEzLDE0ICsxNzk3LDYgQEAKIAogICAgIG1UaW1lRGlzY29udGludWl0eVBlbmRpbmcgPSB0cnVlOwogCi0gICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IE5PTkUgJiYgKCFhdWRpbyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKLSAgICB9Ci0KLSAgICBpZiAobUZsdXNoaW5nVmlkZW8gPT0gTk9ORSAmJiAoIXZpZGVvIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBGTFVTSEVEOwotICAgIH0KLQogICAgIGlmIChhdWRpbyAmJiBtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgZmx1c2hEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sIHRydWUgLyogbmVlZFNodXRkb3duICovKTsKICAgICB9CkBAIC0xMzQxLDEzICsxODE3LDE5IEBACiAgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwogICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKIAorICAgIGlmIChtUmVuZGVyZXJMb29wZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbVJlbmRlcmVyTG9vcGVyLmNsZWFyKCk7CisgICAgfQogICAgIG1SZW5kZXJlci5jbGVhcigpOworICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwogCi0gICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtU291cmNlLT5pZCgpKTsKLQogICAgICAgICBtU291cmNlLmNsZWFyKCk7CiAgICAgfQogCkBAIC0xNDA4LDE2ICsxODkwLDE1IEBACiAKICAgICAgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKGVycik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0NDYsMTEgKzE5MjcsMTkgQEAKIAogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRWaWRlb1NpemVDaGFuZ2VkOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TRVRfVklERU9fU0laRSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0QnVmZmVyaW5nVXBkYXRlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHBlcmNlbnRhZ2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGVyY2VudGFnZSIsICZwZXJjZW50YWdlKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ3MSwyMSArMTk2MCw0MCBAQAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKLSAgICAgICAgICAgIGludDMyX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgMCAvKiBiYXNlSW5kZXggKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRUaW1lZFRleHREYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2VuZXJhdGlvbiAhPSBtVGltZWRUZXh0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBwb3NNczsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKKyAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7CisgICAgICAgICAgICBwb3NVcyA9IHBvc01zICogMTAwMDsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLSAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgICAgICAgICBQYXJjZWwgaW47Ci0gICAgICAgICAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXgpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NChkdXJhdGlvblVzKTsKLSAgICAgICAgICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworICAgICAgICAgICAgaWYgKHBvc1VzIDwgdGltZVVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVRpbWVkVGV4dEdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QodGltZVVzIC0gcG9zVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZW5kVGltZWRUZXh0RGF0YShidWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTUwMiwxMyArMjAxMCwxMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtTm9MaWNlbnNlOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgRVJST1JfRFJNX05PX0xJQ0VOU0UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6Om9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBOdVBsYXllcjo6Q0NEZWNvZGVyOjprV2hhdENsb3NlZENhcHRpb25EYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBOdVBsYXllcjo6Q0NEZWNvZGVyOjprV2hhdFRyYWNrQWRkZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lORk8sIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKworfQorCit2b2lkIE51UGxheWVyOjpzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KSB7CisgICAgaW50MzJfdCB0cmFja0luZGV4OworICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKKworICAgIFBhcmNlbCBpbjsKKyAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOworICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKKyAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVUJUSVRMRV9EQVRBLCAwLCAwLCAmaW4pOworfQorCit2b2lkIE51UGxheWVyOjpzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKyAgICBDSEVDSyhzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSA9PSAwKTsKKworICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisgICAgICAgIFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJnBhcmNlbCk7CisgICAgfQorCisgICAgaWYgKChwYXJjZWwuZGF0YVNpemUoKSA+IDApKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1RJTUVEX1RFWFQsIDAsIDAsICZwYXJjZWwpOworICAgIH0gZWxzZSB7ICAvLyBzZW5kIGFuIGVtcHR5IHRpbWVkIHRleHQKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRURfVEVYVCwgMCwgMCk7CisgICAgfQorfQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAorc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhKGF1ZGlvKTsKKworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKworICAgIGlmKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwogdm9pZCBOdVBsYXllcjo6U291cmNlOjpub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmxhZ3NDaGFuZ2VkKTsKQEAgLTE1MTYsMTEgKzIxMjMsMTAgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Cit2b2lkIE51UGxheWVyOjpTb3VyY2U6Om5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKQEAgLTE1MzEsMjMgKzIxMzcsOCBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyOjpTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Cit2b2lkIE51UGxheWVyOjpTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIFRSRVNQQVNTKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAotICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBTaHV0ZG93bkRlY29kZXJBY3Rpb24oYXVkaW8sIHZpZGVvKSk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKLQotICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBQb3N0TWVzc2FnZUFjdGlvbihyZXBseSkpOwotCi0gICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCA1OTBlMWYyLi5kNjEyMGQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMjQsNyArMjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBQ29kZWM7CitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBNZXRhRGF0YTsKIHN0cnVjdCBOdVBsYXllckRyaXZlcjsKIApAQCAtMzgsNyArMzksOSBAQAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKQEAgLTU2LDEyICs1OSwyMCBAQAogICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5UmVzZXRDb21wbGV0ZSIgb25jZSBmaW5pc2hlZC4KICAgICB2b2lkIHJlc2V0QXN5bmMoKTsKIAotICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkLgotICAgIHZvaWQgc2Vla1RvQXN5bmMoaW50NjRfdCBzZWVrVGltZVVzKTsKKyAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVNlZWtDb21wbGV0ZSIgb25jZSBmaW5pc2hlZAorICAgIC8vIGFuZCBuZWVkTm90aWZ5IGlzIHRydWUuCisgICAgdm9pZCBzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSA9IGZhbHNlKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKICAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIHZvaWQgZ2V0U3RhdHMoaW50NjRfdCAqbU51bUZyYW1lc1RvdGFsLCBpbnQ2NF90ICptTnVtRnJhbWVzRHJvcHBlZCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGEoKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlczsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyKCk7CkBAIC03NCw2ICs4NSw4IEBACiAKIHByaXZhdGU6CiAgICAgc3RydWN0IERlY29kZXI7CisgICAgc3RydWN0IERlY29kZXJQYXNzVGhyb3VnaDsKKyAgICBzdHJ1Y3QgQ0NEZWNvZGVyOwogICAgIHN0cnVjdCBHZW5lcmljU291cmNlOwogICAgIHN0cnVjdCBIVFRQTGl2ZVNvdXJjZTsKICAgICBzdHJ1Y3QgUmVuZGVyZXI7CkBAIC05Niw2ICsxMDksNyBAQAogICAgICAgICBrV2hhdFNjYW5Tb3VyY2VzICAgICAgICAgICAgICAgID0gJ3NjYW4nLAogICAgICAgICBrV2hhdFZpZGVvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ3ZpZE4nLAogICAgICAgICBrV2hhdEF1ZGlvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ2F1ZE4nLAorICAgICAgICBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnkgICAgICAgID0gJ2NhcE4nLAogICAgICAgICBrV2hhdFJlbmRlcmVyTm90aWZ5ICAgICAgICAgICAgID0gJ3Jlbk4nLAogICAgICAgICBrV2hhdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgID0gJ3JzZXQnLAogICAgICAgICBrV2hhdFNlZWsgICAgICAgICAgICAgICAgICAgICAgID0gJ3NlZWsnLApAQCAtMTA0LDYgKzExOCw3IEBACiAgICAgICAgIGtXaGF0UG9sbER1cmF0aW9uICAgICAgICAgICAgICAgPSAncG9sRCcsCiAgICAgICAgIGtXaGF0U291cmNlTm90aWZ5ICAgICAgICAgICAgICAgPSAnc3JjTicsCiAgICAgICAgIGtXaGF0R2V0VHJhY2tJbmZvICAgICAgICAgICAgICAgPSAnZ1RySScsCisgICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjayAgICAgICAgICAgPSAnZ1NlbCcsCiAgICAgICAgIGtXaGF0U2VsZWN0VHJhY2sgICAgICAgICAgICAgICAgPSAnc2VsVCcsCiAgICAgfTsKIApAQCAtMTE2LDkgKzEzMSwxNCBAQAogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXI+IG1WaWRlb0RlY29kZXI7CiAgICAgYm9vbCBtVmlkZW9Jc0FWQzsKLSAgICBib29sIG1OZWVkc1N3UmVuZGVyZXI7CisgICAgYm9vbCBtT2ZmbG9hZEF1ZGlvOwogICAgIHNwPERlY29kZXI+IG1BdWRpb0RlY29kZXI7CisgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwogICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOworICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CiAKICAgICBMaXN0PHNwPEFjdGlvbj4gPiBtRGVmZXJyZWRBY3Rpb25zOwogCkBAIC0xMjksMTAgKzE0OSwxMCBAQAogICAgIGludDMyX3QgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKIAogICAgIGludDMyX3QgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIGVudW0gRmx1c2hTdGF0dXMgewogICAgICAgICBOT05FLAotICAgICAgICBBV0FJVElOR19ESVNDT05USU5VSVRZLAogICAgICAgICBGTFVTSElOR19ERUNPREVSLAogICAgICAgICBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOLAogICAgICAgICBTSFVUVElOR19ET1dOX0RFQ09ERVIsCkBAIC0xNDQsMzEgKzE2NCw2MCBAQAogICAgIC8vIG5vdGlvbiBvZiB0aW1lIGhhcyBjaGFuZ2VkLgogICAgIGJvb2wgbVRpbWVEaXNjb250aW51aXR5UGVuZGluZzsKIAorICAgIC8vIFN0YXR1cyBvZiBmbHVzaCByZXNwb25zZXMgZnJvbSB0aGUgZGVjb2RlciBhbmQgcmVuZGVyZXIuCisgICAgYm9vbCBtRmx1c2hDb21wbGV0ZVsyXVsyXTsKKworICAgIC8vIFVzZWQgYnkgZmVlZERlY29kZXJJbnB1dERhdGEgdG8gYWdncmVnYXRlIHNtYWxsIGJ1ZmZlcnMgaW50bworICAgIC8vIG9uZSBsYXJnZSBidWZmZXIuCisgICAgc3A8QUJ1ZmZlcj4gbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQ7CisgICAgc3RhdHVzX3QgICAgbVBlbmRpbmdBdWRpb0VycjsKKyAgICBzcDxBQnVmZmVyPiBtQWdncmVnYXRlQnVmZmVyOworCiAgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nQXVkaW87CiAgICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nVmlkZW87CiAKICAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nQXVkaW9VbnRpbE1lZGlhVGltZVVzOwogICAgIGludDY0X3QgbVNraXBSZW5kZXJpbmdWaWRlb1VudGlsTWVkaWFUaW1lVXM7CiAKLSAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOwogICAgIGludDY0X3QgbU51bUZyYW1lc1RvdGFsLCBtTnVtRnJhbWVzRHJvcHBlZDsKIAogICAgIGludDMyX3QgbVZpZGVvU2NhbGluZ01vZGU7CiAKICAgICBib29sIG1TdGFydGVkOwogCisgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXI+ICZnZXREZWNvZGVyKGJvb2wgYXVkaW8pIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgY2xlYXJGbHVzaENvbXBsZXRlKCkgeworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVsxXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVsxXSA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgb3BlbkF1ZGlvU2luayhjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgYm9vbCBvZmZsb2FkT25seSk7CisgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworCiAgICAgc3RhdHVzX3QgaW5zdGFudGlhdGVEZWNvZGVyKGJvb2wgYXVkaW8sIHNwPERlY29kZXI+ICpkZWNvZGVyKTsKIAorICAgIHZvaWQgdXBkYXRlVmlkZW9TaXplKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CisKICAgICBzdGF0dXNfdCBmZWVkRGVjb2RlcklucHV0RGF0YShib29sIGF1ZGlvLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCByZW5kZXJCdWZmZXIoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKIAorICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CiAgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKIAotICAgIHZvaWQgZmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKTsKKyAgICBib29sIGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCk7CiAKLSAgICBzdGF0aWMgYm9vbCBJc0ZsdXNoaW5nU3RhdGUoRmx1c2hTdGF0dXMgc3RhdGUsIGJvb2wgKm5lZWRTaHV0ZG93biA9IE5VTEwpOworICAgIHZvaWQgZmx1c2hEZWNvZGVyKAorICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbmV3Rm9ybWF0ID0gTlVMTCk7CisgICAgdm9pZCB1cGRhdGVEZWNvZGVyRm9ybWF0V2l0aG91dEZsdXNoKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIHZvaWQgcG9zdFNjYW5Tb3VyY2VzKCk7CiAKQEAgLTE3Nyw3ICsyMjYsNyBAQAogCiAgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CiAKLSAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisgICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSk7CiAgICAgdm9pZCBwZXJmb3JtRGVjb2RlckZsdXNoKCk7CiAgICAgdm9pZCBwZXJmb3JtRGVjb2RlclNodXRkb3duKGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8pOwogICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7CkBAIC0xODUsMTAgKzIzNCwxNiBAQAogICAgIHZvaWQgcGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJndyYXBwZXIpOwogCiAgICAgdm9pZCBvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNsb3NlZENhcHRpb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBxdWV1ZURlY29kZXJTaHV0ZG93bigKICAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOwogCisgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKKyAgICB2b2lkIHNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4gZm9ybWF0KSBjb25zdDsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggMjQyM2ZkNS4uMjdmNjEzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTE3LDE0ICsxNywxOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRlY29kZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNzAgKzM3LDY1MSBAQAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdykKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICBtQ29tcG9uZW50TmFtZSgiZGVjb2RlciIpIHsKKyAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucworICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworCisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXItQ0wiKTsKKyAgICBtQ29kZWNMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiB9CiAKIE51UGxheWVyOjpEZWNvZGVyOjp+RGVjb2RlcigpIHsKKyAgICBtRGVjb2Rlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgbURlY29kZXJMb29wZXItPnN0b3AoKTsKKworICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKK3N0YXRpYworc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCEoKnJlc3BvbnNlKS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LmNsZWFyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyA7ICsraSkgeworICAgICAgICBBU3RyaW5nIHRhZyA9ICJjc2QtIjsKKyAgICAgICAgdGFnLmFwcGVuZChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcih0YWcuY19zdHIoKSwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5wdXNoKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIENIRUNLKG1Db2RlYyA9PSBOVUxMKTsKIAorICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKICAgICBBU3RyaW5nIG1pbWU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnlNc2cgPQotICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgaWQoKSk7CisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IE5VTEw7CisgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICBzdXJmYWNlID0gbU5hdGl2ZVdpbmRvdy0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKTsKKyAgICB9CiAKLSAgICBtQ1NESW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgKytpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpKS5jX3N0cigpLCAmY3NkKSkgeworICAgIG1Db21wb25lbnROYW1lID0gbWltZTsKKyAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIiBkZWNvZGVyIik7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKHN1cmZhY2U9JXApIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3VyZmFjZS5nZXQoKSk7CisKKyAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobUNvZGVjTG9vcGVyLCBtaW1lLmNfc3RyKCksIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGludDMyX3Qgc2VjdXJlID0gMDsKKyAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInNlY3VyZSIsICZzZWN1cmUpICYmIHNlY3VyZSAhPSAwKSB7CisgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIi5zZWN1cmUiKTsKKyAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgQUxPR0koIlslc10gY3JlYXRpbmciLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjTG9vcGVyLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgJXMlcyBkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAoc2VjdXJlID8gInNlY3VyZSAiIDogIiIpLCBtaW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyB3aWxsIHJlY29ubmVjdAorICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KAorICAgICAgICAgICAgICAgIHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgLy8gV2UgdHJlYXQgdGhpcyBhcyBhIHdhcm5pbmcsIGFzIHRoaXMgaXMgYSBwcmVwYXJhdG9yeSBzdGVwLgorICAgICAgICAvLyBDb2RlYyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBzdXJmYWNlLCB3aGljaCBpcyB3aGVyZQorICAgICAgICAvLyBhbnkgZXJyb3Igc2lnbmFsaW5nIHdpbGwgb2NjdXIuCisgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc3VyZmFjZTogJWQiLCBlcnIpOworICAgIH0KKyAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIGZvcm1hdCwgc3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sIDAgLyogZmxhZ3MgKi8pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7CisKKyAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGluIGNvbmZpZ3VyZWQgc3RhdGUKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZtT3V0cHV0Rm9ybWF0KSk7CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldElucHV0Rm9ybWF0KCZtSW5wdXRGb3JtYXQpKTsKKworICAgIGVyciA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgJXMgZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgYWZ0ZXIgc3RhcnQKKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXJzKCZtSW5wdXRCdWZmZXJzKSk7CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJm1PdXRwdXRCdWZmZXJzKSk7CisgICAgQUxPR1YoIlslc10gZ290ICV6dSBpbnB1dCBhbmQgJXp1IG91dHB1dCBidWZmZXJzIiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisKKyAgICByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKKyAgICBtUGF1c2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgbU1lZGlhQnVmZmVyc1tpXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTWVkaWFCdWZmZXJzLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpKSA9IGZhbHNlOworICAgIH0KKworICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5jbGVhcigpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKSB7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgICAgICBtQ29kZWMtPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihyZXBseSk7CisgICAgfQorfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0KCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6c2lnbmFsVXBkYXRlRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFVwZGF0ZUZvcm1hdCwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0QnVmZmVycywgaWQoKSk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJidWZmZXJzIiwgYnVmZmVycyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCit7CisgICAgLy8gV2UgY2Fubm90IGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGNvZGVjIGR1ZSB0byBidWZmZXJzIHN0aWxsIG91dHN0YW5kaW5nCisgICAgLy8gaW4gdGhlIHJlbmRlcmVyLiAgV2Ugc2lnbmFsIHRvIHRoZSBwbGF5ZXIgdGhlIGVycm9yIHNvIGl0IGNhbiBzaHV0ZG93bi9yZWxlYXNlIHRoZQorICAgIC8vIGRlY29kZXIgYWZ0ZXIgZmx1c2hpbmcgYW5kIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB0byBkaXNjYXJkIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgorCisgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5JbnB1dEJ1ZmZlcigpIHsKKyAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmYnVmZmVySXgpOworICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIGlucHV0OiAlZCIsCisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMgPT0gT0sgPyAoaW50KWJ1ZmZlckl4IDogcmVzKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIGlucHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIGlmIChtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XSAhPSBOVUxMKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnNbYnVmZmVySXhdLT5yZWxlYXNlKCk7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBOVUxMOworICAgIH0KKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gdHJ1ZTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIGlmICghbUNTRHNUb1N1Ym1pdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7CisgICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKKyAgICAgICAgQ0hFQ0sob25JbnB1dEJ1ZmZlckZpbGxlZChyZXBseSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSAqbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCk7CisgICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZpbGxlZChtc2cpKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCi0gICAgICAgIG1DU0QucHVzaChjc2QpOworICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMuZXJhc2UobVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCkpOwogICAgIH0KIAotICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBtTmF0aXZlV2luZG93KTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCi0gICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCi0gICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKLSAgICAvLyBxdWV1ZS4KLSAgICBib29sIG5lZWREZWRpY2F0ZWRMb29wZXIgPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAidmlkZW8vIiwgNik7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZpbGxUaGlzQnVmZmVyKTsKKyAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgbUlucHV0QnVmZmVyc1tidWZmZXJJeF0pOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIG1Db2RlYyA9IG5ldyBBQ29kZWM7Citib29sIGFuZHJvaWQ6Ok51UGxheWVyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNCdWZmZXIgPSBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XTsKIAotICAgIGlmIChuZWVkRGVkaWNhdGVkTG9vcGVyICYmIG1Db2RlY0xvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlY0xvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtQ29kZWNMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2RlciIpOwotICAgICAgICBtQ29kZWNMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGJvb2wgaGFzQnVmZmVyID0gbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKKworICAgIC8vIGhhbmRsZSB3aWRldmluZSBjbGFzc2ljIHNvdXJjZSAtIHRoYXQgZmlsbHMgYW4gYXJiaXRyYXJ5IGlucHV0IGJ1ZmZlcgorICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKGhhc0J1ZmZlcikgeworICAgICAgICBtZWRpYUJ1ZmZlciA9IChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgaWYgKG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGxpa2VseSBmaWxsZWQgYW5vdGhlciBidWZmZXIgdGhhbiB3ZSByZXF1ZXN0ZWQ6IGFkanVzdCBidWZmZXIgaW5kZXgKKyAgICAgICAgICAgIHNpemVfdCBpeDsKKyAgICAgICAgICAgIGZvciAoaXggPSAwOyBpeCA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZiA9IG1JbnB1dEJ1ZmZlcnNbaXhdOworICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKSA9PSBtZWRpYUJ1ZmZlci0+ZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBpbnB1dCBidWZmZXJzIGFyZSBkZXF1ZXVlZCBvbiBzdGFydCwgaGVuY2UgdGhlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIGlmICghbUlucHV0QnVmZmVySXNEZXF1ZXVlZFtpeF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHJlY2VpdmVkIE1lZGlhQnVmZmVyIGZvciAjJXp1IGluc3RlYWQgb2YgIyV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGl4LCBidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiBuZWVkIGJ1ZmZlciBmb3IgdGhlIG1ldGFkYXRhLCBzbyBpbnN0ZWFkLCBzZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gY29kZWNCdWZmZXIgdG8gdGhlIHNhbWUgKHRob3VnaCBpbmNvcnJlY3QpIGJ1ZmZlciB0bworICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBhIG1lbWNweSBpbnRvIHRoZSBjb2RlY0J1ZmZlcgorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCA9IGl4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDSyhpeCA8IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIChuZWVkRGVkaWNhdGVkTG9vcGVyID8gbUNvZGVjTG9vcGVyIDogbG9vcGVyKCkpLT5yZWdpc3RlckhhbmRsZXIobUNvZGVjKTsKIAotICAgIG1Db2RlYy0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnlNc2cpOwotICAgIG1Db2RlYy0+aW5pdGlhdGVTZXR1cChmb3JtYXQpOworCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIC8qIGluY2x1ZGVzICFoYXNCdWZmZXIgKi8pIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1FcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJnN0cmVhbUVycikgfHwgIWhhc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciA9PSBPSykgeworICAgICAgICAgICAgLyogYnVmZmVycyBhcmUgcmV0dXJuZWQgdG8gaG9sZCBvbiB0byAqLworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdHRlbXB0IHRvIHF1ZXVlIEVPUworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBzdHJlYW1FcnIgPSBlcnI7CisgICAgICAgICAgICAvLyBlcnIgd2lsbCBub3QgYmUgRVJST1JfRU5EX09GX1NUUkVBTQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmVhbUVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBBTE9HRSgiU3RyZWFtIGVycm9yIGZvciAlcyAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKKyAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIGludDMyX3QgZW9zLCBjc2Q7CisgICAgICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfSBlbHNlIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmY3NkKSAmJiBjc2QpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weSBpbnRvIGNvZGVjIGJ1ZmZlcgorICAgICAgICBpZiAoYnVmZmVyICE9IGNvZGVjQnVmZmVyKSB7CisgICAgICAgICAgICBDSEVDS19MRShidWZmZXItPnNpemUoKSwgY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpOworICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAobWVkaWFCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXVlIGlucHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sobU1lZGlhQnVmZmVyc1tidWZmZXJJeF0gPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IG1lZGlhQnVmZmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyOjpoYW5kbGVBbk91dHB1dEJ1ZmZlcigpIHsKKyAgICBzaXplX3QgYnVmZmVySXggPSAtMTsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIGludDY0X3QgdGltZVVzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICZidWZmZXJJeCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7CisKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVkIG91dHB1dDogJWQgKHRpbWU9JWxsZCBmbGFncz0lIiBQUkl1MzIgIikiLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChpbnQpYnVmZmVySXgsIHRpbWVVcywgZmxhZ3MpOworICAgIH0KKworICAgIGlmIChyZXMgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0QnVmZmVycygmbU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVycyBmb3IgJXMgYWZ0ZXIgSU5GTyBldmVudCAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIE51UGxheWVyIGlnbm9yZXMgdGhpcworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IG91dHB1dCBmb3JtYXQgZm9yICVzIGFmdGVyIElORk8gZXZlbnQgKGVycj0lZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIGlmIChyZXMgIT0gLUVBR0FJTikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkZXF1ZXVlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtT3V0cHV0QnVmZmVycy5zaXplKCkpOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1PdXRwdXRCdWZmZXJzW2J1ZmZlckl4XTsKKyAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CisgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIH0KKyAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyQnVmZmVyLCBpZCgpKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgaGFuZGxlZCBhZnRlciByZW5kZXJpbmcgaXMgY29tcGxldGUsCisgICAgLy8gYnV0IFJlbmRlcmVyIG5lZWRzIGl0IG5vdworICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICBBTE9HVigicXVldWVpbmcgZW9zIFslc10iLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQzMl90IHJlbmRlcjsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSk7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShidWZmZXJJeCwgdGltZXN0YW1wTnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJeCk7CisgICAgfQorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXIgZm9yICVzIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5mbHVzaCgpOworICAgICAgICBtQ1NEc1RvU3VibWl0ID0gbUNTRHNGb3JDdXJyZW50Rm9ybWF0OyAvLyBjb3B5IG9wZXJhdG9yCisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZsdXNoICVzIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgorICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KKyAgICB9CisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QYXVzZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblJlc3VtZSgpIHsKKyAgICBtUGF1c2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uU2h1dGRvd24oKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byBzdXJmYWNlIGFzIE1lZGlhQ29kZWMgZGlzY29ubmVjdGVkIGZyb20gaXQKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0KKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXROYXRpdmVXaW5kb3coKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICBBTE9HV19JRihlcnJvciAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIlslc10gZmFpbGVkIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdywgZXJyb3I9JWQiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWUgPSAiZGVjb2RlciI7CisgICAgfQorCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSAlcyAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRTaHV0ZG93bkNvbXBsZXRlZC4KKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QYXVzZWQgPSB0cnVlOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0VXBkYXRlRm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0SW5wdXRCdWZmZXJzOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVyczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlcnMiLCAodm9pZCAqKikmZHN0QnVmZmVycykpOworCisgICAgICAgICAgICBkc3RCdWZmZXJzLT5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHN0QnVmZmVycy0+cHVzaChtSW5wdXRCdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENvZGVjTm90aWZ5OgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBudW1JbnB1dCwgbnVtT3V0cHV0OwogCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBBQ29kZWM6OmtXaGF0RmlsbFRoaXNCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBvbkZpbGxUaGlzQnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImNvZGVjLXJlcXVlc3QiLCBtc2cpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlucHV0LWJ1ZmZlcnMiLCAmbnVtSW5wdXQpKSB7CisgICAgICAgICAgICAgICAgICAgIG51bUlucHV0ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm91dHB1dC1idWZmZXJzIiwgJm51bU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobnVtSW5wdXQtLSA+IDAgJiYgaGFuZGxlQW5JbnB1dEJ1ZmZlcigpKSB7fQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChudW1PdXRwdXQtLSA+IDAgJiYgaGFuZGxlQW5PdXRwdXRCdWZmZXIoKSkge30KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRJbnB1dEJ1ZmZlckZpbGxlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGlmICghbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFvbklucHV0QnVmZmVyRmlsbGVkKG1zZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVuZGVyQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgb25SZW5kZXJCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoIm5ldy1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uRmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKKyAgICAgICAgeworICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvblNodXRkb3duKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMDUsNDcgKzY5MSwyMCBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GaWxsVGhpc0J1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFNZXNzYWdlPiByZXBseTsKLSAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOwotCi0jaWYgMAotICAgIHNwPEFCdWZmZXI+IG91dEJ1ZmZlcjsKLSAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZvdXRCdWZmZXIpKTsKLSNlbHNlCi0gICAgc3A8QUJ1ZmZlcj4gb3V0QnVmZmVyOwotI2VuZGlmCi0KLSAgICBpZiAobUNTREluZGV4IDwgbUNTRC5zaXplKCkpIHsKLSAgICAgICAgb3V0QnVmZmVyID0gbUNTRC5lZGl0SXRlbUF0KG1DU0RJbmRleCsrKTsKLSAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLQotICAgICAgICByZXBseS0+c2V0QnVmZmVyKCJidWZmZXIiLCBvdXRCdWZmZXIpOwotICAgICAgICByZXBseS0+cG9zdCgpOwotICAgICAgICByZXR1cm47Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxGbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSk7CisgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgibmV3LWZvcm1hdCIsIGZvcm1hdCk7CiAgICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiY29kZWMtcmVxdWVzdCIsIG1zZyk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OnNpZ25hbEZsdXNoKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPnNpZ25hbEZsdXNoKCk7Ci0gICAgfQorICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpzaWduYWxSZXN1bWUoKSB7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7Ci0gICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjppbml0aWF0ZVNodXRkb3duKCkgewotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtQ29kZWMtPmluaXRpYXRlU2h1dGRvd24oKTsKLSAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKSktPnBvc3QoKTsKIH0KIAogYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdCB7CkBAIC0xNjMsMTQgKzcyMiwxNiBAQAogICAgICAgICBjb25zdCBjaGFyICoga2V5c1tdID0geyAiY2hhbm5lbC1jb3VudCIsICJzYW1wbGUtcmF0ZSIsICJpcy1hZHRzIiB9OwogICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHNpemVvZihrZXlzKSAvIHNpemVvZihrZXlzWzBdKTsgaSsrKSB7CiAgICAgICAgICAgICBpbnQzMl90IG9sZFZhbCwgbmV3VmFsOwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm9sZFZhbCkgfHwgIXRhcmdldEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZuZXdWYWwpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9sZFZhbCAhPSBuZXdWYWwpIHsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKGtleXNbaV0sICZvbGRWYWwpIHx8CisgICAgICAgICAgICAgICAgICAgICF0YXJnZXRGb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmbmV3VmFsKSB8fAorICAgICAgICAgICAgICAgICAgICBvbGRWYWwgIT0gbmV3VmFsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gb2xkQnVmLCBuZXdCdWY7Ci0gICAgICAgIGlmIChtRm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZvbGRCdWYpICYmIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgeworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmb2xkQnVmKSAmJgorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgewogICAgICAgICAgICAgaWYgKG9sZEJ1Zi0+c2l6ZSgpICE9IG5ld0J1Zi0+c2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTgxLDcgKzc0Miw3IEBACiB9CiAKIGJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKLSAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xOTAsNyArNzUxLDcgQEAKICAgICB9CiAKICAgICBBU3RyaW5nIG9sZE1pbWUsIG5ld01pbWU7Ci0gICAgaWYgKCFtRm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCisgICAgaWYgKCFtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCiAgICAgICAgICAgICB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm5ld01pbWUpCiAgICAgICAgICAgICB8fCAhKG9sZE1pbWUgPT0gbmV3TWltZSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAxLDEyICs3NjIsMzQzIEBACiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIHNlYW1sZXNzID0gc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKHRhcmdldEZvcm1hdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VhbWxlc3MgPSBtQ29kZWMgIT0gTlVMTCAmJiBtQ29kZWMtPmlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2soKTsKKyAgICAgICAgaW50MzJfdCBpc0FkYXB0aXZlOworICAgICAgICBzZWFtbGVzcyA9IChtQ29kZWMgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsICZpc0FkYXB0aXZlKSAmJgorICAgICAgICAgICAgICAgIGlzQWRhcHRpdmUpOwogICAgIH0KIAogICAgIEFMT0dWKCIlcyBzZWFtbGVzcyBzdXBwb3J0IGZvciAlcyIsIHNlYW1sZXNzID8gInllcyIgOiAibm8iLCBvbGRNaW1lLmNfc3RyKCkpOwogICAgIHJldHVybiBzZWFtbGVzczsKIH0KIAorc3RydWN0IENDRGF0YSB7CisgICAgQ0NEYXRhKHVpbnQ4X3QgdHlwZSwgdWludDhfdCBkYXRhMSwgdWludDhfdCBkYXRhMikKKyAgICAgICAgOiBtVHlwZSh0eXBlKSwgbURhdGExKGRhdGExKSwgbURhdGEyKGRhdGEyKSB7CisgICAgfQorICAgIGJvb2wgZ2V0Q2hhbm5lbChzaXplX3QgKmNoYW5uZWwpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1EYXRhMSA+PSAweDEwICYmIG1EYXRhMSA8PSAweDFmKSB7CisgICAgICAgICAgICAqY2hhbm5lbCA9IChtRGF0YTEgPj0gMHgxOCA/IDEgOiAwKSArIChtVHlwZSA/IDIgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IG1UeXBlOworICAgIHVpbnQ4X3QgbURhdGExOworICAgIHVpbnQ4X3QgbURhdGEyOworfTsKKworc3RhdGljIGJvb2wgaXNOdWxsUGFkKENDRGF0YSAqY2MpIHsKKyAgICByZXR1cm4gY2MtPm1EYXRhMSA8IDB4MTAgJiYgY2MtPm1EYXRhMiA8IDB4MTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBCeXRlUGFpcihjb25zdCBzcDxBQnVmZmVyPiAmY2NCdWYpIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU3RyaW5nIG91dDsKKworICAgIHdoaWxlIChvZmZzZXQgPCBjY0J1Zi0+c2l6ZSgpKSB7CisgICAgICAgIGNoYXIgdG1wWzEyOF07CisKKyAgICAgICAgQ0NEYXRhICpjYyA9IChDQ0RhdGEgKikgKGNjQnVmLT5kYXRhKCkgKyBvZmZzZXQpOworCisgICAgICAgIGlmIChpc051bGxQYWQoY2MpKSB7CisgICAgICAgICAgICAvLyAxIG51bGwgcGFkIG9yIFhEUyBtZXRhZGF0YSwgaWdub3JlCisgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKENDRGF0YSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjYy0+bURhdGExID49IDB4MjAgJiYgY2MtPm1EYXRhMSA8PSAweDdmKSB7CisgICAgICAgICAgICAvLyAyIGJhc2ljIGNoYXJzCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIlslZF1CYXNpYzogJWMgJWMiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTEgfHwgY2MtPm1EYXRhMSA9PSAweDE5KQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MzAgJiYgY2MtPm1EYXRhMiA8PSAweDNmKSB7CisgICAgICAgICAgICAvLyAxIHNwZWNpYWwgY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdU3BlY2lhbDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEyIHx8IGNjLT5tRGF0YTEgPT0gMHgxQSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXVNwYW5pc2g6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoKGNjLT5tRGF0YTEgPT0gMHgxMyB8fCBjYy0+bURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICYmIGNjLT5tRGF0YTIgPj0gMHgyMCAmJiBjYy0+bURhdGEyIDw9IDB4M2YpeworICAgICAgICAgICAgLy8gMSBQb3J0dWd1ZXNlL0dlcm1hbi9EYW5pc2ggY2hhcgorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdR2VybWFuOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExID09IDB4MTEgfHwgY2MtPm1EYXRhMSA9PSAweDE5KQorICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKXsKKyAgICAgICAgICAgIC8vIE1pZC1Sb3cgQ29kZXMgKFRhYmxlIDY5KQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdTWlkLXJvdzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKGNjLT5tRGF0YTEgPT0gMHgxNCB8fCBjYy0+bURhdGExID09IDB4MWMpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKQorICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAoKGNjLT5tRGF0YTEgPT0gMHgxNyB8fCBjYy0+bURhdGExID09IDB4MWYpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjEgJiYgY2MtPm1EYXRhMiA8PSAweDIzKSl7CisgICAgICAgICAgICAvLyBNaXNjIENvbnRyb2wgQ29kZXMgKFRhYmxlIDcwKQorICAgICAgICAgICAgc3ByaW50Zih0bXAsICJbJWRdQ3RybDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSAmIDB4NzApID09IDB4MTAKKyAgICAgICAgICAgICAgICAmJiAoY2MtPm1EYXRhMiAmIDB4NDApID09IDB4NDAKKyAgICAgICAgICAgICAgICAmJiAoKGNjLT5tRGF0YTEgJiAweDA3KSB8fCAhKGNjLT5tRGF0YTIgJiAweDIwKSkgKSB7CisgICAgICAgICAgICAvLyBQcmVhbWJsZSBBZGRyZXNzIENvZGVzIChUYWJsZSA3MSkKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXVBBQzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKworICAgICAgICBvdXQuYXBwZW5kKHRtcCk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihDQ0RhdGEpOworICAgIH0KKworICAgIEFMT0dJKCIlcyIsIG91dC5jX3N0cigpKTsKK30KKworTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Q0NEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQorICAgIDogbU5vdGlmeShub3RpZnkpLAorICAgICAgbUN1cnJlbnRDaGFubmVsKDApLAorICAgICAgbVNlbGVjdGVkVHJhY2soLTEpIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKG1UcmFja0luZGljZXMpL3NpemVvZihtVHJhY2tJbmRpY2VzWzBdKTsgKytpKSB7CisgICAgICAgICAgbVRyYWNrSW5kaWNlc1tpXSA9IC0xOworICAgICAgfQorfQorCitzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvdW5kQ2hhbm5lbHMuc2l6ZSgpOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIGlmICghaXNUcmFja1ZhbGlkKGluZGV4KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4KTsKKyAgICAvL0NDMSwgZmllbGQgMCBjaGFubmVsIDAKKyAgICBib29sIGlzRGVmYXVsdEF1dG8gPSAobUZvdW5kQ2hhbm5lbHNbaW5kZXhdID09IDApOworICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8iLCBpc0RlZmF1bHRBdXRvKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgaXNEZWZhdWx0QXV0byk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiZm9yY2VkIiwgMCk7CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHNlbGVjdCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgYWxyZWFkeSBzZWxlY3RlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdCkgZ2V0VHJhY2tDb3VudCgpOworfQorCitib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5kZXggPCBnZXRUcmFja0NvdW50KCk7Cit9CisKK2ludDMyX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0VHJhY2tJbmRleChzaXplX3QgY2hhbm5lbCkgY29uc3QgeworICAgIGlmIChjaGFubmVsIDwgc2l6ZW9mKG1UcmFja0luZGljZXMpL3NpemVvZihtVHJhY2tJbmRpY2VzWzBdKSkgeworICAgICAgICByZXR1cm4gbVRyYWNrSW5kaWNlc1tjaGFubmVsXTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgc3A8QUJ1ZmZlcj4gc2VpOworICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKCJzZWkiLCAmc2VpKSB8fCBzZWkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICBOQUxCaXRSZWFkZXIgYnIoc2VpLT5kYXRhKCkgKyAxLCBzZWktPnNpemUoKSAtIDEpOworICAgIC8vIHNlaV9tZXNzYWdlKCkKKyAgICB3aGlsZSAoYnIuYXRMZWFzdE51bUJpdHNMZWZ0KDE2KSkgeyAvLyBhdCBsZWFzdCAxNi1iaXQgZm9yIHNlaV9tZXNzYWdlKCkKKyAgICAgICAgdWludDMyX3QgcGF5bG9hZF90eXBlID0gMDsKKyAgICAgICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IDA7CisgICAgICAgIHVpbnQ4X3QgbGFzdF9ieXRlOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3R5cGUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBsYXN0X2J5dGU7CisgICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKKworICAgICAgICAvLyBzZWlfcGF5bG9hZCgpCisgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gNCkgeworICAgICAgICAgICAgLy8gdXNlcl9kYXRhX3JlZ2lzdGVyZWRfaXR1X3RfdDM1KCkKKworICAgICAgICAgICAgLy8gQVRTQyBBLzcyOiA2LjQuMgorICAgICAgICAgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHVpbnQxNl90IGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID0gYnIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGVfY29kZSA9IGJyLmdldEJpdHMoOCk7CisKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSAxICsgMiArIDQgKyAxOworCisgICAgICAgICAgICBpZiAoaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1CisgICAgICAgICAgICAgICAgICAgICYmIGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID09IDB4MDAzMQorICAgICAgICAgICAgICAgICAgICAmJiB1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnCisgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzKSB7CisgICAgICAgICAgICAgICAgLy8gTVBFR19jY19kYXRhKCkKKyAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNTMgUGFydCA0OiA2LjIuMy4xCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vcHJvY2Vzc19lbV9kYXRhX2ZsYWcKKyAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NfY2NfZGF0YV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy9hZGRpdGlvbmFsX2RhdGFfZmxhZworICAgICAgICAgICAgICAgIHNpemVfdCBjY19jb3VudCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCk7IC8vIGVtX2RhdGE7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDI7CisKKyAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc19jY19kYXRhX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBvdXQ7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2NCdWYgPSBuZXcgQUJ1ZmZlcihjY19jb3VudCAqIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIDApOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXJrZXIgPSBici5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobWFya2VyLCAweDFmKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjY192YWxpZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX3R5cGUgPSBici5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9kZCBwYXJpdHkgYml0CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMSA9IGJyLmdldEJpdHMoOCkgJiAweDdmOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzIgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjX3ZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjY190eXBlID09IDAgfHwgY2NfdHlwZSA9PSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDRGF0YSBjYyhjY190eXBlLCBjY19kYXRhXzEsIGNjX2RhdGFfMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc051bGxQYWQoJmNjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjLmdldENoYW5uZWwoJmNoYW5uZWwpICYmIGdldFRyYWNrSW5kZXgoY2hhbm5lbCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tJbmRpY2VzW2NoYW5uZWxdID0gbUZvdW5kQ2hhbm5lbHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvdW5kQ2hhbm5lbHMucHVzaF9iYWNrKGNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNjQnVmLT5kYXRhKCkgKyBjY0J1Zi0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJmNjLCBzaXplb2YoY2MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NCdWYtPnNldFJhbmdlKDAsIGNjQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSBjY19jb3VudCAqIDM7CisKKyAgICAgICAgICAgICAgICAgICAgbUNDTWFwLmFkZCh0aW1lVXMsIGNjQnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTWFsZm9ybWVkIFNFSSBwYXlsb2FkIHR5cGUgNCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlVuc3VwcG9ydGVkIFNFSSBwYXlsb2FkIHR5cGUgJWQiLCBwYXlsb2FkX3R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcHBpbmcgcmVtYWluaW5nIGJpdHMgb2YgdGhpcyBwYXlsb2FkCisgICAgICAgIGJyLnNraXBCaXRzKHBheWxvYWRfc2l6ZSAqIDgpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCitzcDxBQnVmZmVyPiBOdVBsYXllcjo6Q0NEZWNvZGVyOjpmaWx0ZXJDQ0J1ZigKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmNjQnVmLCBzaXplX3QgaW5kZXgpIHsKKyAgICBzcDxBQnVmZmVyPiBmaWx0ZXJlZENDQnVmID0gbmV3IEFCdWZmZXIoY2NCdWYtPnNpemUoKSk7CisgICAgZmlsdGVyZWRDQ0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICBzaXplX3QgY2NfY291bnQgPSBjY0J1Zi0+c2l6ZSgpIC8gc2l6ZW9mKENDRGF0YSk7CisgICAgY29uc3QgQ0NEYXRhKiBjY19kYXRhID0gKGNvbnN0IENDRGF0YSopY2NCdWYtPmRhdGEoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjX2NvdW50OyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGNoYW5uZWw7CisgICAgICAgIGlmIChjY19kYXRhW2ldLmdldENoYW5uZWwoJmNoYW5uZWwpKSB7CisgICAgICAgICAgICBtQ3VycmVudENoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudENoYW5uZWwgPT0gbUZvdW5kQ2hhbm5lbHNbaW5kZXhdKSB7CisgICAgICAgICAgICBtZW1jcHkoZmlsdGVyZWRDQ0J1Zi0+ZGF0YSgpICsgZmlsdGVyZWRDQ0J1Zi0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZjY19kYXRhW2ldLCBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICBmaWx0ZXJlZENDQnVmLT5zZXRSYW5nZSgwLCBmaWx0ZXJlZENDQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmlsdGVyZWRDQ0J1ZjsKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBpZiAoZXh0cmFjdEZyb21TRUkoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgQUxPR0koIkZvdW5kIENFQS02MDggdHJhY2siKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUcmFja0FkZGVkKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIC8vIFRPRE86IGV4dHJhY3QgQ0MgZnJvbSBvdGhlciBzb3VyY2VzCit9CisKK3ZvaWQgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6ZGlzcGxheShpbnQ2NF90IHRpbWVVcykgeworICAgIGlmICghaXNUcmFja1ZhbGlkKG1TZWxlY3RlZFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgY3VycmVudCB0cmFjayhpbmRleD0lZCkiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUNDTWFwLmluZGV4T2ZLZXkodGltZVVzKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJjYyBmb3IgdGltZXN0YW1wICUiIFBSSWQ2NCAiIG5vdCBmb3VuZCIsIHRpbWVVcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBjY0J1ZiA9IGZpbHRlckNDQnVmKG1DQ01hcC52YWx1ZUF0KGluZGV4KSwgbVNlbGVjdGVkVHJhY2spOworCisgICAgaWYgKGNjQnVmLT5zaXplKCkgPiAwKSB7CisjaWYgMAorICAgICAgICBkdW1wQnl0ZVBhaXIoY2NCdWYpOworI2VuZGlmCisKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCBtU2VsZWN0ZWRUcmFjayk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIDBsbCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRDbG9zZWRDYXB0aW9uRGF0YSk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBjY0J1Zik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIC8vIHJlbW92ZSBhbGwgZW50cmllcyBiZWZvcmUgdGltZVVzCisgICAgbUNDTWFwLnJlbW92ZUl0ZW1zQXQoMCwgaW5kZXggKyAxKTsKK30KKwordm9pZCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpmbHVzaCgpIHsKKyAgICBtQ0NNYXAuY2xlYXIoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCmluZGV4IDc4ZWE3NGEuLmRiYTNlZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKQEAgLTI1LDIwICsyNSwzNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUNvZGVjOworc3RydWN0IE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbmF0aXZlV2luZG93ID0gTlVMTCk7CiAKLSAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKIAotICAgIHZvaWQgc2lnbmFsRmx1c2goKTsKLSAgICB2b2lkIHNpZ25hbFJlc3VtZSgpOwotICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOworICAgIHN0YXR1c190IGdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVycykgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFVwZGF0ZUZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CiAKLSAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGaWxsVGhpc0J1ZmZlciAgICAgID0gJ2ZsVEInLAorICAgICAgICBrV2hhdERyYWluVGhpc0J1ZmZlciAgICAgPSAnZHJUQicsCisgICAgICAgIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCA9ICdmbXRDJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlZCAgICAgID0gJ2Zsc0MnLAorICAgICAgICBrV2hhdFNodXRkb3duQ29tcGxldGVkICAgPSAnc2hEQycsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2VyciAnLAorICAgIH07CiAKIHByb3RlY3RlZDoKKwogICAgIHZpcnR1YWwgfkRlY29kZXIoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC00NiwyNyArNjIsOTAgQEAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgID0gJ2NkY04nLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRHZXRJbnB1dEJ1ZmZlcnMgICAgPSAnZ0luQicsCisgICAgICAgIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQgID0gJ2lucEYnLAorICAgICAgICBrV2hhdFJlbmRlckJ1ZmZlciAgICAgICA9ICdybmRyJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgID0gJ3NodUQnLAorICAgICAgICBrV2hhdFVwZGF0ZUZvcm1hdCAgICAgICA9ICd1Rm10JywKICAgICB9OwogCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CiAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKIAotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIHNwPEFDb2RlYz4gbUNvZGVjOworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3A8TWVkaWFDb2RlYz4gbUNvZGVjOwogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKKyAgICBzcDxBTG9vcGVyPiBtRGVjb2Rlckxvb3BlcjsKIAotICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0Q7Ci0gICAgc2l6ZV90IG1DU0RJbmRleDsKKyAgICBMaXN0PHNwPEFNZXNzYWdlPiA+IG1QZW5kaW5nSW5wdXRNZXNzYWdlczsKIAotICAgIHNwPEFNZXNzYWdlPiBtYWtlRm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUlucHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtT3V0cHV0QnVmZmVyczsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7CisgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUNTRHNUb1N1Ym1pdDsKKyAgICBWZWN0b3I8Ym9vbD4gbUlucHV0QnVmZmVySXNEZXF1ZXVlZDsKKyAgICBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gbU1lZGlhQnVmZmVyczsKIAotICAgIHZvaWQgb25GaWxsVGhpc0J1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBoYW5kbGVFcnJvcihpbnQzMl90IGVycik7CisgICAgYm9vbCBoYW5kbGVBbklucHV0QnVmZmVyKCk7CisgICAgYm9vbCBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpOworCisgICAgdm9pZCByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKyAgICB2b2lkIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgIGJvb2wgaXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgb25GbHVzaCgpOworICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICBib29sIG9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TaHV0ZG93bigpOworCisgICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKIAogICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2Rlcik7CiB9OwogCitzdHJ1Y3QgTnVQbGF5ZXI6OkNDRGVjb2RlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uRGF0YSwKKyAgICAgICAga1doYXRUcmFja0FkZGVkLAorICAgIH07CisKKyAgICBDQ0RlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CisgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBmbHVzaCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIEtleWVkVmVjdG9yPGludDY0X3QsIHNwPEFCdWZmZXI+ID4gbUNDTWFwOworICAgIHNpemVfdCBtQ3VycmVudENoYW5uZWw7CisgICAgaW50MzJfdCBtU2VsZWN0ZWRUcmFjazsKKyAgICBpbnQzMl90IG1UcmFja0luZGljZXNbNF07CisgICAgVmVjdG9yPHNpemVfdD4gbUZvdW5kQ2hhbm5lbHM7CisKKyAgICBib29sIGlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIGludDMyX3QgZ2V0VHJhY2tJbmRleChzaXplX3QgY2hhbm5lbCkgY29uc3Q7CisgICAgYm9vbCBleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgc3A8QUJ1ZmZlcj4gZmlsdGVyQ0NCdWYoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNjQnVmLCBzaXplX3QgaW5kZXgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NEZWNvZGVyKTsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTlVQTEFZRVJfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhYWNkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIgorCisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4Q2FjaGVkQnl0ZXMgPSAyMDAwMDA7CisvLyBUaGUgYnVmZmVycyB3aWxsIGNvbnRhaW4gYSBiaXQgbGVzcyB0aGFuIGtBZ2dyZWdhdGVCdWZmZXJTaXplQnl0ZXMuCisvLyBTbyB3ZSBjYW4gc3RhcnQgb2ZmIHdpdGgganVzdCBlbm91Z2ggYnVmZmVycyB0byBrZWVwIHRoZSBjYWNoZSBmdWxsLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGVuZGluZ0J1ZmZlcnMgPSAxICsgKGtNYXhDYWNoZWRCeXRlcyAvIE51UGxheWVyOjprQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzKTsKKworTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6RGVjb2RlclBhc3NUaHJvdWdoKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IERlY29kZXIobm90aWZ5KSwKKyAgICAgIG1Ob3RpZnkobm90aWZ5KSwKKyAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVJlYWNoZWRFT1ModHJ1ZSksCisgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwoMCksCisgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLAorICAgICAgbUNhY2hlZEJ5dGVzKDApLAorICAgICAgbUNvbXBvbmVudE5hbWUoInBhc3MgdGhyb3VnaCBkZWNvZGVyIikgeworICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoIik7CisgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Cit9CisKK051UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6On5EZWNvZGVyUGFzc1Rocm91Z2goKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmluaXQoKSB7CisgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpzaWduYWxGbHVzaCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjppbml0aWF0ZVNodXRkb3duKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogdGFyZ2V0Rm9ybWF0ICovKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgIG1DYWNoZWRCeXRlcyA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsID0gMDsKKyAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICByZXF1ZXN0TWF4QnVmZmVycygpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOworfQorCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnJlcXVlc3RBQnVmZmVyKCkgeworICAgIGlmIChtQ2FjaGVkQnl0ZXMgPj0ga01heENhY2hlZEJ5dGVzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG1DYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbUNhY2hlZEJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoIlslc10gcmVhY2hlZCBFT1MiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBpZCgpKTsKKyAgICByZXBseS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQnVmZmVyR2VuZXJhdGlvbik7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RmlsbFRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsKys7CisgICAgQUxPR1YoInJlcXVlc3RBQnVmZmVyOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSIsIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCwKKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgYW5kcm9pZDo6TnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25JbnB1dEJ1ZmZlckZpbGxlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRmlsbDsKKyAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FjaGVkQnl0ZXMgKz0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgaWQoKSk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgIHJlcGx5LT5zZXRJbnQzMigic2l6ZSIsIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXREcmFpblRoaXNCdWZmZXIpOworICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgKyttUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRmlsbGVkOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9GaWxsLCBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKSB7CisgICAgLS1tUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIG1DYWNoZWRCeXRlcyAtPSBzaXplOworICAgIEFMT0dWKCJvbkJ1ZmZlckNvbnN1bWVkOiAjVG9GaWxsID0gJXp1LCAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwsIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4sIG1DYWNoZWRCeXRlcyk7CisgICAgcmVxdWVzdEFCdWZmZXIoKTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkZsdXNoKCkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbCA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OnJlcXVlc3RNYXhCdWZmZXJzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFBlbmRpbmdCdWZmZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKCFyZXF1ZXN0QUJ1ZmZlcigpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblNodXRkb3duKCkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJbJXNdIG9uTWVzc2FnZTogJXMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgb25Db25maWd1cmUoZm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RBQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEFCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKKyAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyRmlsbGVkKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRCdWZmZXJDb25zdW1lZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2l6ZSIsICZzaXplKSk7CisgICAgICAgICAgICAgICAgb25CdWZmZXJDb25zdW1lZChzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25TaHV0ZG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyMDI1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCisKKyNkZWZpbmUgTlVQTEFZRVJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KKworI2luY2x1ZGUgIk51UGxheWVyLmgiCisKKyNpbmNsdWRlICJOdVBsYXllckRlY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaCA6IHB1YmxpYyBEZWNvZGVyIHsKKyAgICBEZWNvZGVyUGFzc1Rocm91Z2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOworCisgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5EZWNvZGVyUGFzc1Rocm91Z2goKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVxdWVzdEFCdWZmZXIgICAgID0gJ3JlcUInLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgPSAnaW5wRicsCisgICAgICAgIGtXaGF0QnVmZmVyQ29uc3VtZWQgICAgID0gJ2J1ZkMnLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICA9ICdmbHVzJywKKyAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgPSAnc2h1RCcsCisgICAgfTsKKworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNwPEFMb29wZXI+IG1EZWNvZGVyTG9vcGVyOworCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBhIGJ1ZmZlciB3YXMgcmVxdWVzdGVkLgorICAgICAqIFJldHVybnMgZmFsc2UgaWYgYXQgRU9TIG9yIGNhY2hlIGFscmVhZHkgZnVsbC4KKyAgICAgKi8KKyAgICBib29sIHJlcXVlc3RBQnVmZmVyKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdm9pZCBvbkZsdXNoKCk7CisgICAgdm9pZCBvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQnVmZmVyQ29uc3VtZWQoaW50MzJfdCBzaXplKTsKKyAgICB2b2lkIHJlcXVlc3RNYXhCdWZmZXJzKCk7CisgICAgdm9pZCBvblNodXRkb3duKCk7CisKKyAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIGJvb2wgICAgbVJlYWNoZWRFT1M7CisgICAgLy8gVE9ETyBtUGVuZGluZ0J1ZmZlcnNUb0ZpbGwgYW5kIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gYXJlIG9ubHkgZm9yCisgICAgLy8gZGVidWdnaW5nLiBUaGV5IGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlIHBvd2VyIGludmVzdGlnYXRpb24gaXMgZG9uZS4KKyAgICBzaXplX3QgIG1QZW5kaW5nQnVmZmVyc1RvRmlsbDsKKyAgICBzaXplX3QgIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgc2l6ZV90ICBtQ2FjaGVkQnl0ZXM7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJQYXNzVGhyb3VnaCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCA0NzgzNGZkLi5hYjQ2MDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdVBsYXllckRyaXZlciIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJEcml2ZXIuaCIKQEAgLTI1LDcgKzI2LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzYsMTIgKzM5LDE0IEBACiAgICAgICBtU2V0U3VyZmFjZUluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUR1cmF0aW9uVXMoLTEpLAogICAgICAgbVBvc2l0aW9uVXMoLTEpLAotICAgICAgbU51bUZyYW1lc1RvdGFsKDApLAotICAgICAgbU51bUZyYW1lc0Ryb3BwZWQoMCksCisgICAgICBtU2Vla0luUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtUGxheWVyRmxhZ3MoMCksCiAgICAgICBtQXRFT1MoZmFsc2UpLAorICAgICAgbUxvb3BpbmcoZmFsc2UpLAorICAgICAgbUF1dG9Mb29wKGZhbHNlKSwKICAgICAgIG1TdGFydHVwU2Vla1RpbWVVcygtMSkgeworICAgIEFMT0dWKCJOdVBsYXllckRyaXZlciglcCkiLCB0aGlzKTsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllckRyaXZlciBMb29wZXIiKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KApAQCAtNTYsNiArNjEsNyBAQAogfQogCiBOdVBsYXllckRyaXZlcjo6fk51UGxheWVyRHJpdmVyKCkgeworICAgIEFMT0dWKCJ+TnVQbGF5ZXJEcml2ZXIoJXApIiwgdGhpcyk7CiAgICAgbUxvb3Blci0+c3RvcCgpOwogfQogCkBAIC03MCw3ICs3NiwxMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIHVybCglcykiLCB0aGlzLCB1cmlEZWJ1Z1N0cmluZyh1cmwsIGZhbHNlKS5jX3N0cigpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CkBAIC03OSw3ICs4OCw3IEBACiAKICAgICBtU3RhdGUgPSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOwogCi0gICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKHVybCwgaGVhZGVycyk7CisgICAgbVBsYXllci0+c2V0RGF0YVNvdXJjZUFzeW5jKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOwogCiAgICAgd2hpbGUgKG1TdGF0ZSA9PSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKSB7CiAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CkBAIC04OSw2ICs5OCw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIGZpbGUoJWQpIiwgdGhpcywgZmQpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKQEAgLTEwNyw2ICsxMTcsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIHN0cmVhbSBzb3VyY2UiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9JRExFKSB7CkBAIC0xMjYsNiArMTM3LDcgQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgeworICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobVNldFN1cmZhY2VJblByb2dyZXNzKSB7CkBAIC0xNTMsNiArMTY1LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnByZXBhcmUoKSB7CisgICAgQUxPR1YoInByZXBhcmUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gcHJlcGFyZV9sKCk7CiB9CkBAIC0xNzEsMTIgKzE4NCwyMyBAQAogICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVhbGx5IGp1c3QgcGF1c2VkLiBoYW5kbGUgYXMgc2VlayB0byBzdGFydAorICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc7CisgICAgICAgICAgICBtSXNBc3luY1ByZXBhcmUgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDAsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgICAgICAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCkgPyBPSyA6IFVOS05PV05fRVJST1I7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewpAQCAtMTg1LDEyICsyMDksMjAgQEAKICAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CiAgICAgICAgICAgICBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgorICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkganVzdCBwYXVzZWQuIGhhbmRsZSBhcyBzZWVrIHRvIHN0YXJ0CisgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1Jc0FzeW5jUHJlcGFyZSA9IHRydWU7CisgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwLCB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzdGFydCgpIHsKKyAgICBBTE9HRCgic3RhcnQoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0yMTMsOSArMjQ1LDcgQEAKICAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlTZWVrQ29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cFNlZWtUaW1lVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKG1TdGFydHVwU2Vla1RpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yMjUsMTEgKzI1NSwyNiBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUF0RU9TKSB7CisgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgaWYgKG1BdEVPUykgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvblVzID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnJlc3VtZSgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjQzLDcgKzI4OCwzMSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RvcCgpIHsKLSAgICByZXR1cm4gcGF1c2UoKTsKKyAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorCisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU1RPUFBFRCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6cGF1c2UoKSB7CkBAIC0yNTUsNyArMzI0LDggQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKIAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QQVVTRUQpOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QQVVTRUQpOwogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0yNjMsOCArMzMzLDYgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI3Myw2ICszNDEsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2Vla1RvKGludCBtc2VjKSB7CisgICAgQUxPR0QoInNlZWtUbyglcCkgJWQgbXMiLCB0aGlzLCBtc2VjKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBsbDsKQEAgLTI4MSw2ICszNTAsMTAgQEAKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgewogICAgICAgICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgICAgIC8vIHByZXRlbmQgdGhhdCB0aGUgc2VlayBjb21wbGV0ZWQuIEl0IHdpbGwgYWN0dWFsbHkgaGFwcGVuIHdoZW4gc3RhcnRpbmcgcGxheWJhY2suCisgICAgICAgICAgICAvLyBUT0RPOiBhY3R1YWxseSBwZXJmb3JtIHRoZSBzZWVrIGhlcmUsIHNvIHRoZSBwbGF5ZXIgaXMgcmVhZHkgdG8gZ28gYXQgdGhlIG5ldworICAgICAgICAgICAgLy8gbG9jYXRpb24KKyAgICAgICAgICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yODgsOSArMzYxLDEwIEBACiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICB7CiAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TZWVrSW5Qcm9ncmVzcyA9IHRydWU7CiAgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1BBVVNFRCk7Ci0gICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYyhzZWVrVGltZVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfUEFVU0VEKTsKKyAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yOTgsMTggKzM3MiwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIG1Qb3NpdGlvblVzID0gc2Vla1RpbWVVczsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKSB7CisgICAgaW50NjRfdCB0ZW1wVXMgPSAwOworICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmdGVtcFVzKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVBvc2l0aW9uVXMgPCAwKSB7Ci0gICAgICAgICptc2VjID0gMDsKKyAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1TZWVrSW5Qcm9ncmVzcyBoZXJlIGJlY2F1c2UgbVBsYXllci0+c2Vla1RvQXN5bmMgaXMgYW4gYXN5bmMgY2FsbCwgd2hpY2gKKyAgICAvLyBtZWFucyBnZXRDdXJyZW50UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgc2VlayBpcyBjb21wbGV0ZWQuIElvdywgcmVuZGVyZXIgbWF5IHJldHVybiBhCisgICAgLy8gcG9zaXRpb24gdmFsdWUgdGhhdCdzIGRpZmZlcmVudCB0aGUgc2VlayB0byBwb3NpdGlvbi4KKyAgICBpZiAocmV0ICE9IE9LIHx8IG1TZWVrSW5Qcm9ncmVzcykgeworICAgICAgICB0ZW1wVXMgPSAobVBvc2l0aW9uVXMgPD0gMCkgPyAwIDogbVBvc2l0aW9uVXM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKm1zZWMgPSAobVBvc2l0aW9uVXMgKyA1MDBsbCkgLyAxMDAwOworICAgICAgICBtUG9zaXRpb25VcyA9IHRlbXBVczsKICAgICB9Ci0KKyAgICAqbXNlYyA9IChpbnQpZGl2Um91bmQodGVtcFVzLCAoaW50NjRfdCkoMTAwMCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzI2LDYgKzQwNiw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpyZXNldCgpIHsKKyAgICBBTE9HRCgicmVzZXQoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0zNDAsNyArNDIxLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0sobUlzQXN5bmNQcmVwYXJlKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfUFJFUEFSRUQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QUkVQQVJFRCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0zNDgsNyArNDI5LDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX1NUT1BQRUQpOworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NUT1BQRUQpOworICAgIH0KIAogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKQEAgLTM2MCwxMiArNDQzLDE0IEBACiAgICAgbUR1cmF0aW9uVXMgPSAtMTsKICAgICBtUG9zaXRpb25VcyA9IC0xOwogICAgIG1TdGFydHVwU2Vla1RpbWVVcyA9IC0xOworICAgIG1Mb29waW5nID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIG1Mb29waW5nID0gbG9vcCAhPSAwOworICAgIHJldHVybiBPSzsKIH0KIAogcGxheWVyX3R5cGUgTnVQbGF5ZXJEcml2ZXI6OnBsYXllclR5cGUoKSB7CkBAIC00MDksNiArNDk0LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovKTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCB0eXBlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUsIHJlcGx5KTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQxOCwxOCArNTA5LDIwIEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIHsKICAgICBtUGxheWVyLT5zZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKKyAgICBtQXVkaW9TaW5rID0gYXVkaW9TaW5rOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgeworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFBhcmFtZXRlcigKKyAgICAgICAgaW50IC8qIGtleSAqLywgY29uc3QgUGFyY2VsICYgLyogcmVxdWVzdCAqLykgewogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCAvKiBrZXkgKi8sIFBhcmNlbCAqIC8qIHJlcGx5ICovKSB7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgeworICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwpAQCAtNDU2LDYgKzU0OSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoKSB7CisgICAgQUxPR0QoIm5vdGlmeVJlc2V0Q29tcGxldGUoJXApIiwgdGhpcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpOwpAQCAtNDY0LDYgKzU1OCw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZSgpIHsKKyAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOwpAQCAtNDc3LDM0ICs1NzIsNDUgQEAKICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeVBvc2l0aW9uKGludDY0X3QgcG9zaXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVBvc2l0aW9uVXMgPSBwb3NpdGlvblVzOwotfQotCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGUoKSB7Ci0gICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU0VFS19DT01QTEVURSk7CisgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUZyYW1lU3RhdHMoCi0gICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwsIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbU51bUZyYW1lc1RvdGFsID0gbnVtRnJhbWVzVG90YWw7Ci0gICAgbU51bUZyYW1lc0Ryb3BwZWQgPSBudW1GcmFtZXNEcm9wcGVkOwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woKSB7CisgICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgICAgICBpZiAoIW1Jc0FzeW5jUHJlcGFyZSkgeworICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHByZXBhcmluZyBzeW5jaHJvbm91c2x5LCBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5vdGlmeUxpc3RlbmVyX2wod2FzU2Vla2luZyA/IE1FRElBX1NFRUtfQ09NUExFVEUgOiBNRURJQV9QUkVQQVJFRCk7CiB9CiAKLXN0YXR1c190IE51UGxheWVyRHJpdmVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgY29uc3QgeworICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWw7CisgICAgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkOworICAgIG1QbGF5ZXItPmdldFN0YXRzKCZudW1GcmFtZXNUb3RhbCwgJm51bUZyYW1lc0Ryb3BwZWQpOwogCiAgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CiAKICAgICBmcHJpbnRmKG91dCwgIiBOdVBsYXllclxuIik7Ci0gICAgZnByaW50ZihvdXQsICIgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCisgICAgZnByaW50ZihvdXQsICIgIG51bUZyYW1lc1RvdGFsKCUiIFBSSWQ2NCAiKSwgbnVtRnJhbWVzRHJvcHBlZCglIiBQUklkNjQgIiksICIKICAgICAgICAgICAgICAgICAgInBlcmNlbnRhZ2VEcm9wcGVkKCUuMmYpXG4iLAotICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNEcm9wcGVkLAotICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzVG90YWwgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IDAuMCA6IChkb3VibGUpbU51bUZyYW1lc0Ryb3BwZWQgLyBtTnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRHJvcHBlZCwKKyAgICAgICAgICAgICAgICAgbnVtRnJhbWVzVG90YWwgPT0gMAorICAgICAgICAgICAgICAgICAgICA/IDAuMCA6IChkb3VibGUpbnVtRnJhbWVzRHJvcHBlZCAvIG51bUZyYW1lc1RvdGFsKTsKIAogICAgIGZjbG9zZShvdXQpOwogICAgIG91dCA9IE5VTEw7CkBAIC01MTQsMTEgKzYyMCw0MSBAQAogCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Ci0gICAgaWYgKG1zZyA9PSBNRURJQV9QTEFZQkFDS19DT01QTEVURSB8fCBtc2cgPT0gTUVESUFfRVJST1IpIHsKLSAgICAgICAgbUF0RU9TID0gdHJ1ZTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUxpc3RlbmVyX2wobXNnLCBleHQxLCBleHQyLCBpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgKG1BdXRvTG9vcAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9TaW5rLT5yZWFsdGltZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX0VSUk9SOgorICAgICAgICB7CisgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgc2VuZEV2ZW50KG1zZywgZXh0MSwgZXh0MiwgaW4pOworICAgIG1Mb2NrLmxvY2soKTsKIH0KIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChzdGF0dXNfdCBlcnIpIHsKQEAgLTU0NywxNSArNjgzLDI0IEBACiAgICAgbUFzeW5jUmVzdWx0ID0gZXJyOwogCiAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBpZiAobUlzQXN5bmNQcmVwYXJlKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9QUkVQQVJFRCk7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHN0YXRlIGJlZm9yZSBub3RpZnlpbmcgY2xpZW50LCBzbyB0aGF0IGlmIGNsaWVudCBjYWxscyBiYWNrIGludG8gTnVQbGF5ZXJEcml2ZXIKKyAgICAgICAgLy8gaW4gcmVzcG9uc2UsIE51UGxheWVyRHJpdmVyIGhhcyB0aGUgcmlnaHQgc3RhdGUKICAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1VOUFJFUEFSRUQ7CisgICAgICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1QbGF5ZXItPmdldEZpbGVNZXRhKCk7CisgICAgaW50MzJfdCBsb29wOworICAgIGlmIChtZXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKKyAgICAgICAgbUF1dG9Mb29wID0gdHJ1ZTsKICAgICB9CiAKICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAppbmRleCA5OWY3MmE2Li41Y2JhN2Q5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApAQCAtMzEsNyArMzEsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VUlEKHVpZF90IHVpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCkBAIC02Niw5ICs2OCw4IEBACiAgICAgdm9pZCBub3RpZnlSZXNldENvbXBsZXRlKCk7CiAgICAgdm9pZCBub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoKTsKICAgICB2b2lkIG5vdGlmeUR1cmF0aW9uKGludDY0X3QgZHVyYXRpb25Vcyk7Ci0gICAgdm9pZCBub3RpZnlQb3NpdGlvbihpbnQ2NF90IHBvc2l0aW9uVXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKCk7Ci0gICAgdm9pZCBub3RpZnlGcmFtZVN0YXRzKGludDY0X3QgbnVtRnJhbWVzVG90YWwsIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGVfbCgpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKICAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncyk7CiAKQEAgLTg1LDYgKzg2LDkgQEAKICAgICAgICAgU1RBVEVfUlVOTklORywKICAgICAgICAgU1RBVEVfUEFVU0VELAogICAgICAgICBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUywKKyAgICAgICAgU1RBVEVfU1RPUFBFRCwgICAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRAorICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcsICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2Vla2luZworICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtMTAwLDE5ICsxMDQsMjIgQEAKICAgICBib29sIG1TZXRTdXJmYWNlSW5Qcm9ncmVzczsKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogICAgIGludDY0X3QgbVBvc2l0aW9uVXM7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzVG90YWw7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzRHJvcHBlZDsKKyAgICBib29sIG1TZWVrSW5Qcm9ncmVzczsKICAgICAvLyA8PDwKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgc3A8TnVQbGF5ZXI+IG1QbGF5ZXI7CisgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAogICAgIGJvb2wgbUF0RU9TOworICAgIGJvb2wgbUxvb3Bpbmc7CisgICAgYm9vbCBtQXV0b0xvb3A7CiAKICAgICBpbnQ2NF90IG1TdGFydHVwU2Vla1RpbWVVczsKIAogICAgIHN0YXR1c190IHByZXBhcmVfbCgpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXJEcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBiZjUyNzFlLi44NmNlMzg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yMCwyMyArMjAsNDQgQEAKIAogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKIAotI2luY2x1ZGUgIlNvZnR3YXJlUmVuZGVyZXIuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPFZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWF4aW11bSB0aW1lIGluIHBhdXNlZCBzdGF0ZSB3aGVuIG9mZmxvYWRpbmcgYXVkaW8gZGVjb21wcmVzc2lvbi4gV2hlbiBlbGFwc2VkLCB0aGUgQXVkaW9TaW5rCisvLyBpcyBjbG9zZWQgdG8gYWxsb3cgdGhlIGF1ZGlvIERTUCB0byBwb3dlciBkb3duLgorc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRQYXVzZU1heFVzID0gNjAwMDAwMDBsbDsKKwogLy8gc3RhdGljCiBjb25zdCBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6a01pblBvc2l0aW9uVXBkYXRlRGVsYXlVcyA9IDEwMDAwMGxsOwogCitzdGF0aWMgYm9vbCBzRnJhbWVBY2N1cmF0ZUFWc3luYyA9IGZhbHNlOworCitzdGF0aWMgdm9pZCByZWFkUHJvcGVydGllcygpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMubWVkaWEuYXZzeW5jIiwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIHNGcmFtZUFjY3VyYXRlQVZzeW5jID0KKyAgICAgICAgICAgICFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSk7CisgICAgfQorfQorCiBOdVBsYXllcjo6UmVuZGVyZXI6OlJlbmRlcmVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCi0gICAgICBtU29mdFJlbmRlcmVyKE5VTEwpLAogICAgICAgbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OdW1GcmFtZXNXcml0dGVuKDApLApAQCAtNDQsMjggKzY1LDM3IEBACiAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyhmYWxzZSksCiAgICAgICBtQXVkaW9RdWV1ZUdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZVJlYWxVcygtMSksCi0gICAgICBtRmx1c2hpbmdBdWRpbyhmYWxzZSksCi0gICAgICBtRmx1c2hpbmdWaWRlbyhmYWxzZSksCisgICAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbigtMSksCisgICAgICBtQW5jaG9yTWF4TWVkaWFVcygtMSksCisgICAgICBtVmlkZW9MYXRlQnlVcygwbGwpLAogICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCisgICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcygtMSksCisgICAgICBtRmx1c2hpbmdBdWRpbyhmYWxzZSksCisgICAgICBtRmx1c2hpbmdWaWRlbyhmYWxzZSksCiAgICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAogICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAotICAgICAgbUxhc3RQb3NpdGlvblVwZGF0ZVVzKC0xbGwpLAotICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSB7CisgICAgICBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb09mZmxvYWRUb3JuRG93bihmYWxzZSksCisgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvKEFVRElPX0lORk9fSU5JVElBTElaRVIpLAorICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKKyAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApIHsKKyAgICByZWFkUHJvcGVydGllcygpOwogfQogCiBOdVBsYXllcjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKLSAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLX0KLQotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFNvZnRSZW5kZXJlcihTb2Z0d2FyZVJlbmRlcmVyICpzb2Z0UmVuZGVyZXIpIHsKLSAgICBkZWxldGUgbVNvZnRSZW5kZXJlcjsKLSAgICBtU29mdFJlbmRlcmVyID0gc29mdFJlbmRlcmVyOworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cXVldWVCdWZmZXIoCkBAIC05MiwxMCArMTIyLDE0IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7CiAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgQ0hFQ0soIW1GbHVzaGluZ0F1ZGlvKTsKKyAgICAgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLKCFtRmx1c2hpbmdWaWRlbyk7CisgICAgICAgICAgICBpZiAobUZsdXNoaW5nVmlkZW8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRmx1c2hpbmdWaWRlbyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDYsMTMgKzE0MCwyMyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAvLyBDSEVDSyhtQXVkaW9RdWV1ZS5lbXB0eSgpKTsKICAgICAvLyBDSEVDSyhtVmlkZW9RdWV1ZS5lbXB0eSgpKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtQW5jaG9yVGltZVJlYWxVcyA9IC0xOworICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKC0xKTsKKyAgICBzZXRBbmNob3JUaW1lKC0xLCAtMSk7CisgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvLCBpZCgpKSktPnBvc3QoKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBhdXNlKCkgewogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CiB9CkBAIC0xMjEsOCArMTY1LDE2OCBAQAogICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOwogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCBpZCgpKTsKKyAgICBtc2ctPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZnBzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHJldHVybiBnZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uKAorICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgaWYgKCFtSGFzQXVkaW8gJiYgIW1IYXNWaWRlbykgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uVXMgPSAobm93VXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKyBtQW5jaG9yVGltZU1lZGlhVXM7CisKKyAgICBpZiAobVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgIT0gLTEpIHsKKyAgICAgICAgcG9zaXRpb25VcyAtPSAobm93VXMgLSBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyk7CisgICAgfQorCisgICAgLy8gbGltaXQgcG9zaXRpb24gdG8gdGhlIGxhc3QgcXVldWVkIG1lZGlhIHRpbWUgKGZvciB2aWRlbyBvbmx5IHN0cmVhbQorICAgIC8vIHBvc2l0aW9uIHdpbGwgYmUgZGlzY3JldGUgYXMgd2UgZG9uJ3Qga25vdyBob3cgbG9uZyBlYWNoIGZyYW1lIGxhc3RzKQorICAgIGlmIChtQW5jaG9yTWF4TWVkaWFVcyA+PSAwICYmICFhbGxvd1Bhc3RRdWV1ZWRWaWRlbykgeworICAgICAgICBpZiAocG9zaXRpb25VcyA+IG1BbmNob3JNYXhNZWRpYVVzKSB7CisgICAgICAgICAgICBwb3NpdGlvblVzID0gbUFuY2hvck1heE1lZGlhVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocG9zaXRpb25VcyA8IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgcG9zaXRpb25VcyA9IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXM7CisgICAgfQorCisgICAgKm1lZGlhVXMgPSAocG9zaXRpb25VcyA8PSAwKSA/IDAgOiBwb3NpdGlvblVzOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEhhc01lZGlhKGJvb2wgYXVkaW8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKGludDY0X3QgbWVkaWFVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBbmNob3JUaW1lKAorICAgICAgICBpbnQ2NF90IG1lZGlhVXMsIGludDY0X3QgcmVhbFVzLCBpbnQ2NF90IG51bUZyYW1lc1dyaXR0ZW4sIGJvb2wgcmVzdW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICBtQW5jaG9yVGltZVJlYWxVcyA9IHJlYWxVczsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG51bUZyYW1lc1dyaXR0ZW47CisgICAgaWYgKHJlc3VtZSkgeworICAgICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcyA9IC0xOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKKyAgICBtVmlkZW9MYXRlQnlVcyA9IGxhdGVVczsKK30KKworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFZpZGVvTGF0ZUJ5VXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgcmV0dXJuIG1WaWRlb0xhdGVCeVVzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOworICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gcmVhbFVzOworfQorCitib29sIE51UGxheWVyOjpSZW5kZXJlcjo6b3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9wZW5BdWRpb1NpbmssIGlkKCkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICBtc2ctPnNldEludDMyKCJvZmZsb2FkLW9ubHkiLCBvZmZsb2FkT25seSk7CisgICAgbXNnLT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOworICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKworICAgIGludDMyX3Qgb2ZmbG9hZDsKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJvZmZsb2FkIiwgJm9mZmxvYWQpKTsKKyAgICByZXR1cm4gKG9mZmxvYWQgIT0gMCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VBdWRpb1NpbmssIGlkKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T3BlbkF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgaW50MzJfdCBvZmZsb2FkT25seTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJvZmZsb2FkLW9ubHkiLCAmb2ZmbG9hZE9ubHkpKTsKKworICAgICAgICAgICAgaW50MzJfdCBoYXNWaWRlbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pKTsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAoaW50MzJfdCAqKSZmbGFncykpOworCisgICAgICAgICAgICBib29sIG9mZmxvYWQgPSBvbk9wZW5BdWRpb1NpbmsoZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJvZmZsb2FkIiwgb2ZmbG9hZCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDbG9zZUF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgb25DbG9zZUF1ZGlvU2luaygpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0RHJhaW5BdWRpb1F1ZXVlOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CkBAIC0xNDksNyArMzUzLDEwIEBACiAKICAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQogICAgICAgICAgICAgICAgIC8vIGhhcyBlbGFwc2VkLgotICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoZGVsYXlVcyAvIDIpOworICAgICAgICAgICAgICAgIC8vIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIGlzIHVzZWQgZm9yIG5vbi1vZmZsb2FkaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgLy8gYW5kIG1Mb2NrIGlzIHVzZWQgb25seSBmb3Igb2ZmbG9hZGluZyBtb2RlLiBUaGVyZWZvcmUsCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBhY3F1aXJlIG1Mb2NrIGhlcmUuCisgICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGRlbGF5VXMgLyAyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzAsNiArMzc3LDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFF1ZXVlQnVmZmVyOgogICAgICAgICB7CiAgICAgICAgICAgICBvblF1ZXVlQnVmZmVyKG1zZyk7CkBAIC0xOTQsNiArNDE0LDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvOgorICAgICAgICB7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgogICAgICAgICB7CiAgICAgICAgICAgICBvblBhdXNlKCk7CkBAIC0yMDYsMTQgKzQzMiw0MSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGZwczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZwcykpOworICAgICAgICAgICAgb25TZXRWaWRlb0ZyYW1lUmF0ZShmcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIE9mZmxvYWQgdGVhciBkb3duIGR1ZSB0byBwYXVzZSB0aW1lb3V0LiIpOworICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9UaW1lb3V0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5BdWRpb1F1ZXVlKGludDY0X3QgZGVsYXlVcykgewotICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtUGF1c2VkCisgICAgICAgICAgICB8fCBvZmZsb2FkaW5nQXVkaW8oKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMjcsMTAgKzQ4MCw2IEBACiAgICAgbXNnLT5wb3N0KGRlbGF5VXMpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCwgaWQoKSkpLT5wb3N0KCk7Ci19Ci0KIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpIHsKICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CiAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbVZpZGVvUXVldWVHZW5lcmF0aW9uOwpAQCAtMjQ4LDYgKzQ5NywxMDIgQEAKICAgICB9CiB9CiAKKy8vIHN0YXRpYworc2l6ZV90IE51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICogLyogYXVkaW9TaW5rICovLAorICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7CisgICAgTnVQbGF5ZXI6OlJlbmRlcmVyICptZSA9IChOdVBsYXllcjo6UmVuZGVyZXIgKiljb29raWU7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWUtPmZpbGxBdWRpb0J1ZmZlcihidWZmZXIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICB7CisgICAgICAgICAgICBtZS0+bm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV046CisgICAgICAgIHsKKyAgICAgICAgICAgIG1lLT5ub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc2l6ZV90IE51UGxheWVyOjpSZW5kZXJlcjo6ZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSB8fCBtUGF1c2VkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJvb2wgaGFzRU9TID0gZmFsc2U7CisKKyAgICBzaXplX3Qgc2l6ZUNvcGllZCA9IDA7CisgICAgYm9vbCBmaXJzdEVudHJ5ID0gdHJ1ZTsKKyAgICB3aGlsZSAoc2l6ZUNvcGllZCA8IHNpemUgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsgLy8gRU9TCisgICAgICAgICAgICBoYXNFT1MgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdEVudHJ5ICYmIGVudHJ5LT5tT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIGZpcnN0RW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQobWVkaWFUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplUmVtYWluaW5nID0gc2l6ZSAtIHNpemVDb3BpZWQ7CisgICAgICAgIGlmIChjb3B5ID4gc2l6ZVJlbWFpbmluZykgeworICAgICAgICAgICAgY29weSA9IHNpemVSZW1haW5pbmc7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKGNoYXIgKilidWZmZXIgKyBzaXplQ29waWVkLAorICAgICAgICAgICAgICAgZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LAorICAgICAgICAgICAgICAgY29weSk7CisKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gY29weTsKKyAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgZW50cnkgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemVDb3BpZWQgKz0gY29weTsKKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBzZXRBbmNob3JUaW1lKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMsIG5vd1VzIC0gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKSk7CisgICAgfQorCisgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgbXVjaCBkYXRhIHdlIGFyZSBxdWV1ZWluZyBmb3Igb2ZmbG9hZGVkIHRyYWNrcworICAgIG1BbmNob3JNYXhNZWRpYVVzID0gLTE7CisKKyAgICBpZiAoaGFzRU9TKSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCBpZCgpKSktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZUNvcGllZDsKK30KKwogYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uRHJhaW5BdWRpb1F1ZXVlKCkgewogICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKICAgICBpZiAobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCkgIT0gT0spIHsKQEAgLTI3MiwxMCArNjE3LDE1IEBACiAgICAgd2hpbGUgKG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSA+IDAgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CiAKKyAgICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQgPSBlbnRyeS0+bUJ1ZmZlck9yZGluYWw7CisKICAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgIC8vIEVPUwotCi0gICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCk7CisgICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7CiAKICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgZW50cnkgPSBOVUxMOwpAQCAtMjg1LDI2ICs2MzUsOCBAQAogICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0KICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotCi0gICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7Ci0gICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgPQotICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuIC0gbnVtRnJhbWVzUGxheWVkOwotCi0gICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lT2Zmc2V0VXMgPQotICAgICAgICAgICAgICAgIChtQXVkaW9TaW5rLT5sYXRlbmN5KCkgLyAyICAvKiBYWFggKi8KLSAgICAgICAgICAgICAgICAgICAgKyBudW1GcmFtZXNQZW5kaW5nUGxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpICogMTAwMGxsOwotCi0gICAgICAgICAgICAvLyBBTE9HSSgicmVhbFRpbWVPZmZzZXRVcyA9ICVsbGQgdXMiLCByZWFsVGltZU9mZnNldFVzKTsKLQotICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgIEFMb29wZXI6OkdldE5vd1VzKCkgKyByZWFsVGltZU9mZnNldFVzOworICAgICAgICAgICAgb25OZXdBdWRpb01lZGlhVGltZShtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKQEAgLTMxMiwxMSArNjQ0LDEzIEBACiAgICAgICAgICAgICBjb3B5ID0gbnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlOwogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+d3JpdGUoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwgY29weSksCi0gICAgICAgICAgICAgICAgIChzc2l6ZV90KWNvcHkpOworICAgICAgICBzc2l6ZV90IHdyaXR0ZW4gPSBtQXVkaW9TaW5rLT53cml0ZShlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsIGNvcHkpOworICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIC8vIEFuIGVycm9yIGluIEF1ZGlvU2luayB3cml0ZSBpcyBmYXRhbCBoZXJlLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQXVkaW9TaW5rIHdyaXRlIGVycm9yKCV6ZCkgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICB9CiAKLSAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gY29weTsKKyAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gd3JpdHRlbjsKICAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwpAQCAtMzI0LDIwICs2NTgsNzMgQEAKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSBjb3B5OwotICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gY29weSAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworICAgICAgICBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgLT0gd3JpdHRlbjsKKyAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IHdyaXR0ZW4gLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gY29waWVkRnJhbWVzOwogCiAgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7Ci0gICAgfQogCi0gICAgbm90aWZ5UG9zaXRpb24oKTsKKyAgICAgICAgaWYgKHdyaXR0ZW4gIT0gKHNzaXplX3QpY29weSkgeworICAgICAgICAgICAgLy8gQSBzaG9ydCBjb3VudCB3YXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1Npbms6OndyaXRlKCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBdWRpb1Npbmsgd3JpdGUgc2hvdWxkIGJsb2NrIHVudGlsIGV4YWN0bHkgdGhlIG51bWJlciBvZiBieXRlcyBhcmUgZGVsaXZlcmVkLgorICAgICAgICAgICAgLy8gQnV0IGl0IG1heSByZXR1cm4gd2l0aCBhIHNob3J0IGNvdW50ICh3aXRob3V0IGFuIGVycm9yKSB3aGVuOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIDEpIFNpemUgdG8gYmUgY29waWVkIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiBXZSBjb25zaWRlciB0aGlzIGZhdGFsLgorICAgICAgICAgICAgLy8gMikgQXVkaW9TaW5rIGlzIGFuIEF1ZGlvQ2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLCBhbmQgdGhlIEF1ZGlvQ2FjaGUgaXMgZXhjZWVkZWQuCisKKyAgICAgICAgICAgIC8vIChDYXNlIDEpCisgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuICBJZiBpdCBpcyBub3QgYSBtdWx0aXBsZSBvZiBhIGZyYW1lIHNpemUsIGl0CisgICAgICAgICAgICAvLyBuZWVkcyB0byBmYWlsLCBhcyB3ZSBzaG91bGQgbm90IGNhcnJ5IG92ZXIgZnJhY3Rpb25hbCBmcmFtZXMgYmV0d2VlbiBjYWxscy4KKyAgICAgICAgICAgIENIRUNLX0VRKGNvcHkgJSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKSwgMCk7CisKKyAgICAgICAgICAgIC8vIChDYXNlIDIpCisgICAgICAgICAgICAvLyBSZXR1cm4gZWFybHkgdG8gdGhlIGNhbGxlci4KKyAgICAgICAgICAgIC8vIEJld2FyZSBvZiBjYWxsaW5nIGltbWVkaWF0ZWx5IGFnYWluIGFzIHRoaXMgbWF5IGJ1c3ktbG9vcCBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLgorICAgICAgICAgICAgQUxPR1coIkF1ZGlvU2luayB3cml0ZSBzaG9ydCBmcmFtZSBjb3VudCAlemQgPCAlenUiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1BbmNob3JNYXhNZWRpYVVzID0KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkobWF4KChsb25nIGxvbmcpbU51bUZyYW1lc1dyaXR0ZW4gLSBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgMExMKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpOwogCiAgICAgcmV0dXJuICFtQXVkaW9RdWV1ZS5lbXB0eSgpOwogfQogCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3Qgd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyA9CisgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpOworICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKTsKK30KKworaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CisgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMsIG5vd1VzLCB0cnVlIC8qIGFsbG93UGFzdFF1ZXVlZFZpZGVvICovKSAhPSBPSykgeworICAgICAgICAvLyBJZiBmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgcG9zaXRpb24sIGUuZy4gZHVlIHRvIGF1ZGlvIGNsb2NrIGlzIG5vdCByZWFkeSwgdGhlbiBqdXN0CisgICAgICAgIC8vIHBsYXkgb3V0IHZpZGVvIGltbWVkaWF0ZWx5IHdpdGhvdXQgZGVsYXkuCisgICAgICAgIHJldHVybiBub3dVczsKKyAgICB9CisgICAgcmV0dXJuIChtZWRpYVRpbWVVcyAtIGN1cnJlbnRQb3NpdGlvblVzKSArIG5vd1VzOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgLy8gVFJJQ0tZOiB2b3JiaXMgZGVjb2RlciBnZW5lcmF0ZXMgbXVsdGlwbGUgZnJhbWVzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB0aW1lc3RhbXAsIHNvIG9ubHkgdXBkYXRlIG9uIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGEgZ2l2ZW4gdGltZXN0YW1wCisgICAgaWYgKG1lZGlhVGltZVVzID09IG1BbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQobWVkaWFUaW1lVXMpOworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHNldEFuY2hvclRpbWUoCisgICAgICAgICAgICBtZWRpYVRpbWVVcywgbm93VXMgKyBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25Vcyhub3dVcyksIG1OdW1GcmFtZXNXcml0dGVuKTsKK30KKwogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnBvc3REcmFpblZpZGVvUXVldWUoKSB7Ci0gICAgaWYgKG1EcmFpblZpZGVvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQpIHsKKyAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcKKyAgICAgICAgICAgIHx8IG1TeW5jUXVldWVzCisgICAgICAgICAgICB8fCAobVBhdXNlZCAmJiBtVmlkZW9TYW1wbGVSZWNlaXZlZCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzUwLDM2ICs3MzcsNjcgQEAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5WaWRlb1F1ZXVlLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvUXVldWVHZW5lcmF0aW9uKTsKIAotICAgIGludDY0X3QgZGVsYXlVczsKLQogICAgIGlmIChlbnRyeS5tQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gRU9TIGRvZXNuJ3QgY2FycnkgYSB0aW1lc3RhbXAuCi0gICAgICAgIGRlbGF5VXMgPSAwOwotICAgIH0gZWxzZSBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVczsKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CisgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7CiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLQotICAgICAgICBkZWxheVVzID0gbWVkaWFUaW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICByZWFsVGltZVVzID0gbWVkaWFUaW1lVXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgQ0hFQ0soZW50cnkubUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwogCiAgICAgICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7Ci0gICAgICAgICAgICBkZWxheVVzID0gMDsKLQotICAgICAgICAgICAgaWYgKCFtSGFzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRBbmNob3JUaW1lKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXMgPQotICAgICAgICAgICAgICAgIChtZWRpYVRpbWVVcyAtIG1BbmNob3JUaW1lTWVkaWFVcykgKyBtQW5jaG9yVGltZVJlYWxVczsKKyAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgIG1BbmNob3JNYXhNZWRpYVVzID0gbWVkaWFUaW1lVXMgKyAxMDAwMDA7IC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgIH0KIAotICAgICAgICAgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAvLyBIZXVyaXN0aWNzIHRvIGhhbmRsZSBzaXR1YXRpb24gd2hlbiBtZWRpYSB0aW1lIGNoYW5nZWQgd2l0aG91dCBhCisgICAgICAgIC8vIGRpc2NvbnRpbnVpdHkuIElmIHdlIGhhdmUgbm90IGRyYWluZWQgYW4gYXVkaW8gYnVmZmVyIHRoYXQgd2FzCisgICAgICAgIC8vIHJlY2VpdmVkIGFmdGVyIHRoaXMgYnVmZmVyLCByZXBvc3QgaW4gMTAgbXNlYy4gT3RoZXJ3aXNlIHJlcG9zdAorICAgICAgICAvLyBpbiA1MDAgbXNlYy4KKyAgICAgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKyAgICAgICAgaWYgKGRlbGF5VXMgPiA1MDAwMDApIHsKKyAgICAgICAgICAgIGludDY0X3QgcG9zdERlbGF5VXMgPSA1MDAwMDA7CisgICAgICAgICAgICBpZiAobUhhc0F1ZGlvICYmIChtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCAtIGVudHJ5Lm1CdWZmZXJPcmRpbmFsKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcG9zdERlbGF5VXMgPSAxMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0V2hhdChrV2hhdFBvc3REcmFpblZpZGVvUXVldWUpOworICAgICAgICAgICAgbXNnLT5wb3N0KHBvc3REZWxheVVzKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICAgICAgQUxPR0koInBvc3NpYmxlIHZpZGVvIHRpbWUganVtcCBvZiAlZG1zLCByZXRyeWluZyBpbiAlZG1zIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCkoZGVsYXlVcyAvIDEwMDApLCAoaW50KShwb3N0RGVsYXlVcyAvIDEwMDApKTsKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1zZy0+cG9zdChkZWxheVVzKTsKKyAgICByZWFsVGltZVVzID0gbVZpZGVvU2NoZWR1bGVyLT5zY2hlZHVsZShyZWFsVGltZVVzICogMTAwMCkgLyAxMDAwOworICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1WaWRlb1NjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKworICAgIEFMT0dXX0lGKGRlbGF5VXMgPiA1MDAwMDAsICJ1bnVzdWFsbHkgaGlnaCBkZWxheVVzOiAlIiBQUklkNjQsIGRlbGF5VXMpOworICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgIC8vIEZJWE1FIGN1cnJlbnRseSB0aGlzIGluY3JlYXNlcyBwb3dlciBjb25zdW1wdGlvbiwgc28gdW5sZXNzIGZyYW1lLWFjY3VyYXRlCisgICAgLy8gQVYgc3luYyBpcyByZXF1ZXN0ZWQsIHBvc3QgY2xvc2VyIHRvIHJlcXVpcmVkIHJlbmRlciB0aW1lIChhdCAwLjYzIHZzeW5jcykKKyAgICBpZiAoIXNGcmFtZUFjY3VyYXRlQVZzeW5jKSB7CisgICAgICAgIHR3b1ZzeW5jc1VzID4+PSA0OworICAgIH0KKyAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IHR3b1ZzeW5jc1VzID8gZGVsYXlVcyAtIHR3b1ZzeW5jc1VzIDogMCk7CiAKICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CiB9CkBAIC0zOTksMTIgKzgxNywxMSBAQAogICAgICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgZW50cnkgPSBOVUxMOwogCi0gICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMGxsOwotCi0gICAgICAgIG5vdGlmeVBvc2l0aW9uKCk7CisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpbnQ2NF90IG5vd1VzID0gLTE7CiAgICAgaW50NjRfdCByZWFsVGltZVVzOwogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgewogICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZyZWFsVGltZVVzKSk7CkBAIC00MTIsMzcgKzgyOSw1MSBAQAogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwogCi0gICAgICAgIHJlYWxUaW1lVXMgPSBtZWRpYVRpbWVVcyAtIG1BbmNob3JUaW1lTWVkaWFVcyArIG1BbmNob3JUaW1lUmVhbFVzOworICAgICAgICBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CiAgICAgfQogCi0gICAgbVZpZGVvTGF0ZUJ5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gcmVhbFRpbWVVczsKLSAgICBib29sIHRvb0xhdGUgPSAobVZpZGVvTGF0ZUJ5VXMgPiA0MDAwMCk7CisgICAgYm9vbCB0b29MYXRlID0gZmFsc2U7CiAKLSAgICBpZiAodG9vTGF0ZSkgewotICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKLSAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBpZiAobm93VXMgPT0gLTEpIHsKKyAgICAgICAgICAgIG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKG5vd1VzIC0gcmVhbFRpbWVVcyk7CisgICAgICAgIHRvb0xhdGUgPSAobVZpZGVvTGF0ZUJ5VXMgPiA0MDAwMCk7CisKKyAgICAgICAgaWYgKHRvb0xhdGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCisgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgorICAgICAgICAgICAgICAgICAgICAocmVhbFRpbWVVcyArIG1BbmNob3JUaW1lTWVkaWFVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSkgLyAxRTYpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6Ci0gICAgICAgICAgICAgICAgKHJlYWxUaW1lVXMgKyBtQW5jaG9yVGltZU1lZGlhVXMgLSBtQW5jaG9yVGltZVJlYWxVcykpIC8gMUU2KTsKLSAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNvZnRSZW5kZXJlci0+cmVuZGVyKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCksIGVudHJ5LT5tQnVmZmVyLT5zaXplKCksIE5VTEwpOworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOworICAgICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkICYmICFtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgYSBmbHVzaCB3b24ndCBiZSB1c2VkIGFzIGFuY2hvcgorICAgICAgICAgICAgLy8gd2hlbiByZW5kZXJlciBpcyBpbiBwYXVzZWQgc3RhdGUsIGJlY2F1c2UgcmVzdW1lIGNhbiBoYXBwZW4gYW55IHRpbWUgYWZ0ZXIgc2Vlay4KKyAgICAgICAgICAgIHNldEFuY2hvclRpbWUoLTEsIC0xKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlYWxUaW1lVXMgKiAxMDAwbGwpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDMyKCJyZW5kZXIiLCAhdG9vTGF0ZSk7CiAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwogICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOwogICAgIGVudHJ5ID0gTlVMTDsKIAotICAgIGlmICghbVZpZGVvUmVuZGVyaW5nU3RhcnRlZCkgewotICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gdHJ1ZTsKKworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7CiAgICAgfQotCi0gICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKLQotICAgIG5vdGlmeVBvc2l0aW9uKCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlWaWRlb1JlbmRlcmluZ1N0YXJ0KCkgewpAQCAtNDUxLDIyICs4ODIsMjkgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCkgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOwotICAgIG5vdGlmeS0+cG9zdCgpOworICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRUZWFyRG93biwgaWQoKSkpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBhdWRpbzsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAotICAgIGlmIChhdWRpbykgewotICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgc2V0SGFzTWVkaWEoYXVkaW8pOworCisgICAgaWYgKG1IYXNWaWRlbykgeworICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChkcm9wQnVmZmVyV2hpbGVGbHVzaGluZyhhdWRpbywgbXNnKSkgewpAQCAtNDg0LDE1ICs5MjIsMTggQEAKICAgICBlbnRyeS5tTm90aWZ5Q29uc3VtZWQgPSBub3RpZnlDb25zdW1lZDsKICAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKICAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBPSzsKKyAgICBlbnRyeS5tQnVmZmVyT3JkaW5hbCA9ICsrbVRvdGFsQnVmZmVyc1F1ZXVlZDsKIAogICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CiAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN5bmNRdWV1ZXMgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSB8fCBtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MDIsNyArOTQzLDcgQEAKIAogICAgIGlmIChmaXJzdEF1ZGlvQnVmZmVyID09IE5VTEwgfHwgZmlyc3RWaWRlb0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIEVPUyBzaWduYWxsZWQgb24gZWl0aGVyIHF1ZXVlLgotICAgICAgICBzeW5jUXVldWVzRG9uZSgpOworICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTUyNiwxMCArOTY3LDEwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzeW5jUXVldWVzRG9uZSgpOworICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN5bmNRdWV1ZXNEb25lKCkgewordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnN5bmNRdWV1ZXNEb25lX2woKSB7CiAgICAgaWYgKCFtU3luY1F1ZXVlcykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTM3LDcgKzk3OCw3IEBACiAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKIAogICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlKCk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwogICAgIH0KIAogICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewpAQCAtNTYxLDE0ICsxMDAyLDE2IEBACiAgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gZmluYWxSZXN1bHQ7CiAKICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKLSAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lKCk7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZSgpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgewotICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwpAQCAtNTc5LDYgKzEwMjIsMTUgQEAKICAgICBpbnQzMl90IGF1ZGlvOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwogCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7CisgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCiAgICAgLy8gYWxpZ25pbmcgdGhlIGZpcnN0IGF1ZGlvL3ZpZGVvIGJ1ZmZlciB0aW1lcyBhbmQgb25seSBvbmUgb2YgdGhlCiAgICAgLy8gdHdvIHF1ZXVlcyBoYXMgZGF0YSwgd2UgbWF5IHN0YXJ2ZSB0aGF0IHF1ZXVlIGJ5IG5vdCByZXF1ZXN0aW5nCkBAIC01ODcsMzEgKzEwMzksNDcgQEAKICAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgogICAgIC8vIFRoZXJlZm9yZSB3ZSdsbCBzdG9wIHN5bmNpbmcgdGhlIHF1ZXVlcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbQogICAgIC8vIGlzIGZsdXNoZWQuCi0gICAgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICB7CisgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICAgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcygtMSk7CisgICAgfQogCiAgICAgQUxPR1YoImZsdXNoaW5nICVzIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKIAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7Ci0gICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gZmFsc2U7CisgICAgICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisKKyAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwogCi0gICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwogCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRmx1c2hMb2NrKTsKLSAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBmYWxzZTsKLQogICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwogICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKIAorICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+cmVzdGFydCgpOworICAgICAgICB9CisKICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKICAgICB9CiAKKyAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IGZhbHNlOwogICAgIG5vdGlmeUZsdXNoQ29tcGxldGUoYXVkaW8pOwogfQogCkBAIC02NjEsNzAgKzExMjksNzMgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uQXVkaW9TaW5rQ2hhbmdlZCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBDSEVDSyghbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcpOwogICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOwogICAgIHVpbnQzMl90IHdyaXR0ZW47CiAgICAgaWYgKG1BdWRpb1NpbmstPmdldEZyYW1lc1dyaXR0ZW4oJndyaXR0ZW4pID09IE9LKSB7CiAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gd3JpdHRlbjsKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlQb3NpdGlvbigpIHsKLSAgICBpZiAobUFuY2hvclRpbWVSZWFsVXMgPCAwIHx8IG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgaWYgKG1MYXN0UG9zaXRpb25VcGRhdGVVcyA+PSAwCi0gICAgICAgICAgICAmJiBub3dVcyA8IG1MYXN0UG9zaXRpb25VcGRhdGVVcyArIGtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtTGFzdFBvc2l0aW9uVXBkYXRlVXMgPSBub3dVczsKLQotICAgIGludDY0X3QgcG9zaXRpb25VcyA9IChub3dVcyAtIG1BbmNob3JUaW1lUmVhbFVzKSArIG1BbmNob3JUaW1lTWVkaWFVczsKLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQb3NpdGlvbik7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgicG9zaXRpb25VcyIsIHBvc2l0aW9uVXMpOwotICAgIG5vdGlmeS0+c2V0SW50NjQoInZpZGVvTGF0ZUJ5VXMiLCBtVmlkZW9MYXRlQnlVcyk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUZsYWdzICY9IH5GTEFHX09GRkxPQURfQVVESU87CisgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblBhdXNlKCkgewotICAgIENIRUNLKCFtUGF1c2VkKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBBTE9HVygiUmVuZGVyZXI6Om9uUGF1c2UoKSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBwYXVzZWQhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgICAgICBzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgIH0KIAogICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247Ci0KICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwotCi0gICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKTsKIAogICAgIGlmIChtSGFzQXVkaW8pIHsKICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICB9CiAKICAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJWQgZW50cmllcywgdmlkZW8gaGFzICVkIGVudHJpZXMiLAogICAgICAgICAgIG1BdWRpb1F1ZXVlLnNpemUoKSwgbVZpZGVvUXVldWUuc2l6ZSgpKTsKLQotICAgIG1QYXVzZWQgPSB0cnVlOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25SZXN1bWUoKSB7CisgICAgcmVhZFByb3BlcnRpZXMoKTsKKwogICAgIGlmICghbVBhdXNlZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKG1IYXNBdWRpbykgeworICAgICAgICBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBpZiAobVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgIT0gLTEpIHsKKyAgICAgICAgaW50NjRfdCBuZXdBbmNob3JSZWFsVXMgPQorICAgICAgICAgICAgbUFuY2hvclRpbWVSZWFsVXMgKyBBTG9vcGVyOjpHZXROb3dVcygpIC0gbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7CisgICAgICAgIHNldEFuY2hvclRpbWUoCisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzLCBuZXdBbmNob3JSZWFsVXMsIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCB0cnVlIC8qIHJlc3VtZSAqLyk7CisgICAgfQogCiAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWUoKTsKKyAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CkBAIC03MzIsNSArMTIwMywyNDIgQEAKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgeworICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgIH0KKyAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKK30KKworLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25VcygpCisvLyBhcyBpdCBhY3F1aXJlcyBsb2NrcyBhbmQgbWF5IHF1ZXJ5IHRoZSBhdWRpbyBkcml2ZXIuCisvLworLy8gU29tZSBjYWxscyBjb3VsZCBjb25jZWl2YWJseSByZXRyaWV2ZSBleHRyYXBvbGF0ZWQgZGF0YSBpbnN0ZWFkIG9mCisvLyBhY2Nlc3NpbmcgZ2V0VGltZXN0YW1wKCkgb3IgZ2V0UG9zaXRpb24oKSBldmVyeSB0aW1lIGEgZGF0YSBidWZmZXIgd2l0aAorLy8gYSBtZWRpYSB0aW1lIGlzIHJlY2VpdmVkLgorLy8KK2ludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgeworICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0OworICAgIEF1ZGlvVGltZXN0YW1wIHRzOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTdGFsZVRpbWVzdGFtcDEwMG1zID0gMTAwMDAwOworCisgICAgc3RhdHVzX3QgcmVzID0gbUF1ZGlvU2luay0+Z2V0VGltZXN0YW1wKHRzKTsKKyAgICBpZiAocmVzID09IE9LKSB7ICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IG1peGluZyBhdWRpbyB0cmFja3MgYW5kIG9mZmxvYWRlZCB0cmFja3MuCisgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IHRzLm1Qb3NpdGlvbjsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXQgPQorICAgICAgICAgICAgdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7CisgICAgICAgIGNvbnN0IGludDY0X3QgdGltZXN0YW1wQWdlID0gbm93VXMgLSBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICAgICAgaWYgKHRpbWVzdGFtcEFnZSA+IGtTdGFsZVRpbWVzdGFtcDEwMG1zKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGF1ZGlvIEZJWE1FLgorICAgICAgICAgICAgLy8gZ2V0VGltZXN0YW1wIHJldHVybnMgYSB0aW1lc3RhbXAgd2hpY2ggbWF5IGNvbWUgZnJvbSBhdWRpbyBtaXhpbmcgdGhyZWFkcy4KKyAgICAgICAgICAgIC8vIEFmdGVyIHBhdXNpbmcsIHRoZSBNaXhlclRocmVhZCBtYXkgZ28gaWRsZSwgdGh1cyB0aGUgbVRpbWUgZXN0aW1hdGUgbWF5CisgICAgICAgICAgICAvLyBiZWNvbWUgc3RhbGUuIEFzc3VtaW5nIHRoYXQgdGhlIE1peGVyVGhyZWFkIHJ1bnMgMjBtcywgd2l0aCBGYXN0TWl4ZXIgYXQgNW1zLAorICAgICAgICAgICAgLy8gdGhlIG1heCBsYXRlbmN5IHNob3VsZCBiZSBhYm91dCAyNW1zIHdpdGggYW4gYXZlcmFnZSBhcm91bmQgMTJtcyAodG8gYmUgdmVyaWZpZWQpLgorICAgICAgICAgICAgLy8gRm9yIHNhZmV0eSB3ZSB1c2UgMTAwbXMuCisgICAgICAgICAgICBBTE9HVigiZ2V0VGltZXN0YW1wOiByZXR1cm5lZCBzdGFsZSB0aW1lc3RhbXAgbm93VXMoJWxsZCkgbnVtRnJhbWVzUGxheWVkQXQoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW5vd1VzLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0ID0gbm93VXMgLSBrU3RhbGVUaW1lc3RhbXAxMDBtczsKKyAgICAgICAgfQorICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IE9LICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOworICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSAwOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAorICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgorICAgICAgICByZXMgPSBtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKTsKKyAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCArPSAxMDAwTEwgKiBtQXVkaW9TaW5rLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KKyAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIG51bUZyYW1lc1BsYXllZEF0KTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgorICAgIC8vQ0hFQ0tfRVEobnVtRnJhbWVzUGxheWVkICYgKDEgPDwgMzEpLCAwKTsgIC8vIGNhbid0IGJlIG5lZ2F0aXZlIHVudGlsIDEyLjQgaHJzLCB0ZXN0CisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lc1BsYXllZCAqIDEwMDBMTCAqIG1BdWRpb1NpbmstPm1zZWNzUGVyRnJhbWUoKSkKKyAgICAgICAgICAgICsgbm93VXMgLSBudW1GcmFtZXNQbGF5ZWRBdDsKKyAgICBpZiAoZHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgLy8gT2NjdXJzIHdoZW4gbnVtRnJhbWVzUGxheWVkIHBvc2l0aW9uIGlzIHZlcnkgc21hbGwgYW5kIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIC8vICgxKSBJbiBjYXNlIDEsIHRoZSB0aW1lIG5vd1VzIGlzIGNvbXB1dGVkIGJlZm9yZSBnZXRUaW1lc3RhbXAoKSBpcyBjYWxsZWQgYW5kCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdCBpcyBncmVhdGVyIHRoYW4gbm93VXMgYnkgdGltZSBtb3JlIHRoYW4gbnVtRnJhbWVzUGxheWVkLgorICAgICAgICAvLyAoMikgSW4gY2FzZSAzLCB1c2luZyBnZXRQb3NpdGlvbiBhbmQgYWRkaW5nIG1BdWRpb1NpbmstPmxhdGVuY3koKSB0bworICAgICAgICAvLyAgICAgbnVtRnJhbWVzUGxheWVkQXQsIGJ5IGEgdGltZSBhbW91bnQgZ3JlYXRlciB0aGFuIG51bUZyYW1lc1BsYXllZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQm90aCBvZiB0aGVzZSBhcmUgdHJhbnNpdG9yeSBjb25kaXRpb25zLgorICAgICAgICBBTE9HVigiZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzOiBuZWdhdGl2ZSBkdXJhdGlvbiAlbGxkIHNldCB0byB6ZXJvIiwgKGxvbmcgbG9uZylkdXJhdGlvblVzKTsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorICAgIEFMT0dWKCJnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoJWxsZCkgbm93VXMoJWxsZCkgZnJhbWVzKCV1KSBmcmFtZXNBdCglbGxkKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uVXMsIChsb25nIGxvbmcpbm93VXMsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdCk7CisgICAgcmV0dXJuIGR1cmF0aW9uVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHJlYXNvbikgeworICAgIGlmIChtQXVkaW9PZmZsb2FkVG9ybkRvd24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQXVkaW9PZmZsb2FkVG9ybkRvd24gPSB0cnVlOworCisgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgIT0gT0spIHsKKyAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSAwOworICAgIH0KKworICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duKTsKKyAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCwgaWQoKSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdChrT2ZmbG9hZFBhdXNlTWF4VXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgKyttQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbjsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbk9wZW5BdWRpb1NpbmsoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCisgICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOworCisgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOworCisgICAgaW50MzJfdCBjaGFubmVsTWFzazsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7CisgICAgICAgIC8vIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGRlcml2ZSB0aGUgbWFzayBmcm9tIGNvdW50LgorICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKKworICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBtYXAgbWltZSBcIiVzXCIgdG8gYSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICJhdWRpb19mb3JtYXQiLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiTWltZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLCBhdWRpb0Zvcm1hdCk7CisKKyAgICAgICAgICAgIGludCBhdmdCaXRSYXRlID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiYml0LXJhdGUiLCAmYXZnQml0UmF0ZSk7CisKKyAgICAgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSA9IC0xOworICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUMKKyAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImFhYy1wcm9maWxlIiwgJmFhY1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBhcyBwZXIgYWFjIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJvZmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uVXMiLCAmb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uYml0X3JhdGUgPSBhdmdCaXRSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgICAgICAgICBvZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudE9mZmxvYWRJbmZvLCAmb2ZmbG9hZEluZm8sIHNpemVvZihvZmZsb2FkSW5mbykpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogbm8gY2hhbmdlIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZmxvYWRpbmdBdWRpbygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IHRyeSB0byBvcGVuIEF1ZGlvU2luayBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgICAgICBmbGFncyAmPSB+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncywKKyAgICAgICAgICAgICAgICAgICAgJm9mZmxvYWRJbmZvKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93LCB3ZSBwYXNzCisgICAgICAgICAgICAgICAgLy8gdGhlIEhBTCBzb21lIG1ldGFkYXRhIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQKKyAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGdvaW5nIHRocm91Z2ggdGhlIEF1ZGlvRmxpbmdlciBtaXhlcgorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFjaGluZyB0aGUgaGFyZHdhcmUuCisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBvZmZsb2FkSW5mbzsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgICAgIEFMT0dWX0lGKGVyciA9PSBPSywgIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgc3VjY2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAsIGZhbGwgYmFjayB0byBub24gb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFvZmZsb2FkT25seSAmJiAhb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgZmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvcGVuIEF1ZGlvU2luayBpbiBOT04tb2ZmbG9hZCBtb2RlIik7CisKKyAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7CisgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgOCAvKiBidWZmZXJDb3VudCAqLywKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKSwKKyAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICB9CisgICAgaWYgKGF1ZGlvU2lua0NoYW5nZWQpIHsKKyAgICAgICAgb25BdWRpb1NpbmtDaGFuZ2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIG9mZmxvYWRpbmdBdWRpbygpOworfQorCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25DbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCA5MTI0ZTAzLi43YjQ2YTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTIzLDE2ICsyMywyMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLWNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIEZMQUdfUkVBTF9USU1FID0gMSwKKyAgICAgICAgRkxBR19PRkZMT0FEX0FVRElPID0gMiwKICAgICB9OwogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCisgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCisgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUsCisgICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7CisKICAgICB2b2lkIHF1ZXVlQnVmZmVyKAogICAgICAgICAgICAgYm9vbCBhdWRpbywKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCkBAIC00NiwxOCArNTIsNDcgQEAKIAogICAgIHZvaWQgc2lnbmFsQXVkaW9TaW5rQ2hhbmdlZCgpOwogCisgICAgdm9pZCBzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisKICAgICB2b2lkIHBhdXNlKCk7CiAgICAgdm9pZCByZXN1bWUoKTsKIAorICAgIHZvaWQgc2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKworICAgIC8vIEZvbGxvd2luZyBzZXR0ZXJzIGFuZCBnZXR0ZXJzIGFyZSBwcm90ZWN0ZWQgYnkgbVRpbWVMb2NrLgorICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oCisgICAgICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvID0gZmFsc2UpOworICAgIHZvaWQgc2V0SGFzTWVkaWEoYm9vbCBhdWRpbyk7CisgICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZShpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0QW5jaG9yVGltZSgKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiA9IC0xLCBib29sIHJlc3VtZSA9IGZhbHNlKTsKKyAgICB2b2lkIHNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpOworICAgIGludDY0X3QgZ2V0VmlkZW9MYXRlQnlVcygpOworICAgIHZvaWQgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcyk7CisKKyAgICBib29sIG9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKwogICAgIGVudW0gewogICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCiAgICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZSAgICAgICA9ICdmbHVDJywKICAgICAgICAga1doYXRQb3NpdGlvbiAgICAgICAgICAgID0gJ3Bvc2knLAogICAgICAgICBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQgPSAndmRyZCcsCiAgICAgICAgIGtXaGF0TWVkaWFSZW5kZXJpbmdTdGFydCA9ICdtZHJkJywKKyAgICAgICAga1doYXRBdWRpb09mZmxvYWRUZWFyRG93biA9ICdhT1REJywKKyAgICAgICAga1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQgPSAnYU9QVCcsCiAgICAgfTsKIAotICAgIHZvaWQgc2V0U29mdFJlbmRlcmVyKFNvZnR3YXJlUmVuZGVyZXIgKnNvZnRSZW5kZXJlcik7CisgICAgZW51bSBBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiB7CisgICAgICAgIGtEdWVUb0Vycm9yID0gMCwKKyAgICAgICAga0R1ZVRvVGltZW91dCwKKyAgICB9OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UmVuZGVyZXIoKTsKQEAgLTY2LDE0ICsxMDEsMjAgQEAKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKLSAgICAgICAga1doYXREcmFpbkF1ZGlvUXVldWUgICAgPSAnZHJhQScsCi0gICAgICAgIGtXaGF0RHJhaW5WaWRlb1F1ZXVlICAgID0gJ2RyYVYnLAotICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICA9ICdxdWVCJywKLSAgICAgICAga1doYXRRdWV1ZUVPUyAgICAgICAgICAgPSAncUVPUycsCi0gICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgID0gJ2ZsdXMnLAotICAgICAgICBrV2hhdEF1ZGlvU2lua0NoYW5nZWQgICA9ICdhdVNDJywKLSAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgPSAncGF1cycsCi0gICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgID0gJ3Jlc20nLAorICAgICAgICBrV2hhdERyYWluQXVkaW9RdWV1ZSAgICAgPSAnZHJhQScsCisgICAgICAgIGtXaGF0RHJhaW5WaWRlb1F1ZXVlICAgICA9ICdkcmFWJywKKyAgICAgICAga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlID0gJ3BEVlEnLAorICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICAgPSAncXVlQicsCisgICAgICAgIGtXaGF0UXVldWVFT1MgICAgICAgICAgICA9ICdxRU9TJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdEF1ZGlvU2lua0NoYW5nZWQgICAgPSAnYXVTQycsCisgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgID0gJ3Jlc20nLAorICAgICAgICBrV2hhdE9wZW5BdWRpb1NpbmsgICAgICAgPSAnb3BuQScsCisgICAgICAgIGtXaGF0Q2xvc2VBdWRpb1NpbmsgICAgICA9ICdjbHNBJywKKyAgICAgICAga1doYXRTdG9wQXVkaW9TaW5rICAgICAgID0gJ3N0cEEnLAorICAgICAgICBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8gPSAnbm9PQScsCisgICAgICAgIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUgICA9ICdzVkZSJywKICAgICB9OwogCiAgICAgc3RydWN0IFF1ZXVlRW50cnkgewpAQCAtODEsNDQgKzEyMiw3MiBAQAogICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeUNvbnN1bWVkOwogICAgICAgICBzaXplX3QgbU9mZnNldDsKICAgICAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgICAgICBpbnQzMl90IG1CdWZmZXJPcmRpbmFsOwogICAgIH07CiAKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluUG9zaXRpb25VcGRhdGVEZWxheVVzOwogCiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0gICAgU29mdHdhcmVSZW5kZXJlciAqbVNvZnRSZW5kZXJlcjsKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBNdXRleCBtTG9jazsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKICAgICBpbnQzMl90IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKIAorICAgIE11dGV4IG1UaW1lTG9jazsKKyAgICAvLyB8bVRpbWVMb2NrfCBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIDcgbWVtYmVyIHZhcnMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aW1lLgorICAgIC8vIE5vdGU6IHRob3NlIG1lbWJlcnMgYXJlIG9ubHkgd3JpdHRlbiBvbiBSZW5kZXJlciB0aHJlYWQsIHNvIHJlYWRpbmcgb24gUmVuZGVyZXIgdGhyZWFkCisgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHByb3RlY3RlZC4gT3RoZXJ3aXNlIGFjY2Vzc2luZyB0aG9zZSBtZW1iZXJzIG11c3QgYmUgcHJvdGVjdGVkIGJ5CisgICAgLy8gfG1UaW1lTG9ja3wuCisgICAgLy8gVE9ETzogbW92ZSB0aG9zZSBtZW1iZXJzIHRvIGEgc2VwZXJhdGVkIG1lZGlhIGNsb2NrIGNsYXNzLgorICAgIGludDY0X3QgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lTWVkaWFVczsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lUmVhbFVzOworICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47CisgICAgaW50NjRfdCBtQW5jaG9yTWF4TWVkaWFVczsKKyAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOworICAgIGJvb2wgbUhhc0F1ZGlvOworICAgIGJvb2wgbUhhc1ZpZGVvOworICAgIGludDY0X3QgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7CiAKICAgICBNdXRleCBtRmx1c2hMb2NrOyAgLy8gcHJvdGVjdHMgdGhlIGZvbGxvd2luZyAyIG1lbWJlciB2YXJzLgogICAgIGJvb2wgbUZsdXNoaW5nQXVkaW87CiAgICAgYm9vbCBtRmx1c2hpbmdWaWRlbzsKIAotICAgIGJvb2wgbUhhc0F1ZGlvOwotICAgIGJvb2wgbUhhc1ZpZGVvOwogICAgIGJvb2wgbVN5bmNRdWV1ZXM7CiAKICAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKICAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7CiAgICAgaW50MzJfdCBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CiAKICAgICBpbnQ2NF90IG1MYXN0UG9zaXRpb25VcGRhdGVVczsKLSAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOworCisgICAgaW50MzJfdCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbjsKKyAgICBib29sIG1BdWRpb09mZmxvYWRUb3JuRG93bjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOworCisgICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOworICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7CisKKworICAgIHNpemVfdCBmaWxsQXVkaW9CdWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIG9uRHJhaW5BdWRpb1F1ZXVlKCk7Ci0gICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlKGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIGludDY0X3QgZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CisgICAgaW50NjRfdCBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CisgICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzID0gMCk7CisKKyAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOwogCiAgICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOwogICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwpAQCAtMTMwLDE4ICsxOTksMzMgQEAKICAgICB2b2lkIG9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25GbHVzaChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB2b2lkIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOwogICAgIHZvaWQgb25QYXVzZSgpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKyAgICB2b2lkIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKTsKKyAgICBib29sIG9uT3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCBvbkNsb3NlQXVkaW9TaW5rKCk7CiAKLSAgICB2b2lkIG5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CisgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwogICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKICAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CiAgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICB2b2lkIG5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCk7CiAKICAgICB2b2lkIGZsdXNoUXVldWUoTGlzdDxRdWV1ZUVudHJ5PiAqcXVldWUpOwogICAgIGJvb2wgZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc3luY1F1ZXVlc0RvbmUoKTsKKyAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKKworICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQorCisgICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZW5kZXJlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAppbmRleCBlNTA1MzNhLi4yZjA2YzMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApAQCAtMjEsMTEgKzIxLDE1IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgTWV0YURhdGE7CitzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBOdVBsYXllcjo6U291cmNlIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM0LDE2ICszOCwyMCBAQAogICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgICA9IDQsICAvLyB0aGUgIjEwIHNlYyBmb3J3YXJkIGJ1dHRvbiIKICAgICAgICAgRkxBR19DQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKICAgICAgICAgRkxBR19EWU5BTUlDX0RVUkFUSU9OICAgPSAxNiwKKyAgICAgICAgRkxBR19TRUNVUkUgICAgICAgICAgICAgPSAzMiwKICAgICB9OwogCiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0UHJlcGFyZWQsCiAgICAgICAgIGtXaGF0RmxhZ3NDaGFuZ2VkLAogICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nVXBkYXRlLAogICAgICAgICBrV2hhdEJ1ZmZlcmluZ1N0YXJ0LAogICAgICAgICBrV2hhdEJ1ZmZlcmluZ0VuZCwKICAgICAgICAga1doYXRTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0VGltZWRUZXh0RGF0YSwKICAgICAgICAga1doYXRRdWV1ZURlY29kZXJTaHV0ZG93biwKKyAgICAgICAga1doYXREcm1Ob0xpY2Vuc2UsCiAgICAgfTsKIAogICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cwpAQCAtNTksMjggKzY3LDQ1IEBACiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCkge30KICAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCkge30KIAorICAgIC8vIEV4cGxpY2l0bHkgZGlzY29ubmVjdCB0aGUgdW5kZXJsaW5nIGRhdGEgc291cmNlCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSB7fQorCiAgICAgLy8gUmV0dXJucyBPSyBpZmYgbW9yZSBkYXRhIHdhcyBhdmFpbGFibGUsCiAgICAgLy8gYW4gZXJyb3Igb3IgRVJST1JfRU5EX09GX1NUUkVBTSBpZiBub3QuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgLyogYXVkaW8gKi8pIHsgcmV0dXJuIE5VTEw7IH0KKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoCiAgICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICogLyogZHVyYXRpb25VcyAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgLyogdHJhY2tJbmRleCAqLykgY29uc3QgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgLyogdHJhY2tJbmRleCAqLywgYm9vbCAvKiBzZWxlY3QgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgLyogc2Vla1RpbWVVcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGJvb2wgLyogYXVkaW8gKi8sIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmLyogYnVmZmVycyAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC05MywxMiArMTE4LDEwIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7IHJldHVybiBOVUxMOyB9Ci0KICAgICBzcDxBTWVzc2FnZT4gZHVwTm90aWZ5KCkgY29uc3QgeyByZXR1cm4gbU5vdGlmeS0+ZHVwKCk7IH0KIAogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyID0gT0spOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDE4Y2Y2ZDEuLmZmYWNiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJNeUhhbmRsZXIuaCIKICNpbmNsdWRlICJTRFBMb2FkZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIApAQCAtMzMsMTIgKzM0LDE0IEBACiAKIE51UGxheWVyOjpSVFNQU291cmNlOjpSVFNQU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKICAgICAgICAgYm9vbCB1aWRWYWxpZCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBib29sIGlzU0RQKQogICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbVVSTCh1cmwpLAogICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKICAgICAgIG1VSUQodWlkKSwKQEAgLTY3LDYgKzcwLDcgQEAKIAogTnVQbGF5ZXI6OlJUU1BTb3VyY2U6On5SVFNQU291cmNlKCkgewogICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CiAgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKICAgICB9CiB9CkBAIC03NywxNCArODEsMTMgQEAKICAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCi0gICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8UlRTUFNvdXJjZT4odGhpcyk7Ci0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogICAgIH0KIAogICAgIENIRUNLKG1IYW5kbGVyID09IE5VTEwpOwogICAgIENIRUNLKG1TRFBMb2FkZXIgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBpZCgpKTsKIAogICAgIENIRUNLX0VRKG1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOwogICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CkBAIC05Miw3ICs5NSw3IEBACiAgICAgaWYgKG1Jc1NEUCkgewogICAgICAgICBtU0RQTG9hZGVyID0gbmV3IFNEUExvYWRlcihub3RpZnksCiAgICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IFNEUExvYWRlcjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAotICAgICAgICAgICAgICAgIG1VSURWYWxpZCwgbVVJRCk7CisgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlKTsKIAogICAgICAgICBtU0RQTG9hZGVyLT5sb2FkKAogICAgICAgICAgICAgICAgIG1VUkwuY19zdHIoKSwgbUV4dHJhSGVhZGVycy5pc0VtcHR5KCkgPyBOVUxMIDogJm1FeHRyYUhlYWRlcnMpOwpAQCAtMTE1LDcgKzExOCw3IEBACiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CiAKICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOwpAQCAtMzAyLDcgKzMwNSw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBlcmZvcm1TZWVrLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIGlkKCkpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21TZWVrR2VuZXJhdGlvbik7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgc2Vla1RpbWVVcyk7CiAgICAgbXNnLT5wb3N0KDIwMDAwMGxsKTsKQEAgLTM1Myw3ICszNTYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBvbkNvbm5lY3RlZCgpOwogCi0gICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwogCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAKQEAgLTUwMiw3ICs1MDUsMTAgQEAKICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CiAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssIE5VTEwpOworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1NFRUssCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXNjYXJkICovKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC02MDcsNyArNjEzLDcgQEAKICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCB1cmwgaW4gU0RQIik7CiAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCBpZCgpKTsKIAogICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHJ0c3BVcmkuY19zdHIoKSwgbm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOwogICAgICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCmluZGV4IDhjZjM0YTAuLmYxY2FlNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaApAQCAtMjIsOCArMjIsNiBAQAogCiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CkBAIC0zNCw2ICszMiw3IEBACiBzdHJ1Y3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7CiAgICAgUlRTUFNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAogICAgICAgICAgICAgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLApAQCAtODgsNiArODcsNyBAQAogICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7CiAgICAgfTsKIAorICAgIHNwPElNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVVJMOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CiAgICAgYm9vbCBtVUlEVmFsaWQ7CkBAIC0xMDAsNyArMTAwLDYgQEAKICAgICBib29sIG1CdWZmZXJpbmc7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPFJUU1BTb3VyY2U+ID4gbVJlZmxlY3RvcjsKICAgICBzcDxNeUhhbmRsZXI+IG1IYW5kbGVyOwogICAgIHNwPFNEUExvYWRlcj4gbVNEUExvYWRlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCAyOGYwZDUwLi4yZTlhMjlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtNDQsNyArNDQsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpTdHJlYW1pbmdTb3VyY2U6OnByZXBhcmVBc3luYygpIHsKLSAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKDAsIDApOworICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKICAgICBub3RpZnlGbGFnc0NoYW5nZWQoMCk7CiAgICAgbm90aWZ5UHJlcGFyZWQoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxZDk0Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvbXA0L01QNFNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNUDRTb3VyY2UuaCIKLQotI2luY2x1ZGUgIkZyYWdtZW50ZWRNUDRQYXJzZXIuaCIKLSNpbmNsdWRlICIuLi9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU3RyZWFtU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgU3RyZWFtU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbUxpc3RlbmVyKG5ldyBOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcihzb3VyY2UsIDApKSwKLSAgICAgICAgICBtUG9zaXRpb24oMCkgewotICAgICAgICBtTGlzdGVuZXItPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IG1Qb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIC1FUElQRTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChvZmZzZXQgPiBtUG9zaXRpb24pIHsKLSAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgICAgICAgICAgb2ZmNjRfdCBza2lwQnl0ZXMgPSBvZmZzZXQgLSBtUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAoc2tpcEJ5dGVzID4gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICBza2lwQnl0ZXMgPSBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhOwotICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIG4gPSBtTGlzdGVuZXItPnJlYWQoYnVmZmVyLCBza2lwQnl0ZXMsICZleHRyYSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkICVsZCBieXRlcyBhdCBvZmZzZXQgJWxsZCIsIG4sIG1Qb3NpdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUG9zaXRpb24gKz0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgd2hpbGUgKHRvdGFsIDwgc2l6ZSkgewotICAgICAgICAgICAgc3NpemVfdCBuID0gbUxpc3RlbmVyLT5yZWFkKAotICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWRhdGEgKyB0b3RhbCwgc2l6ZSAtIHRvdGFsLCAmZXh0cmEpOwotCi0gICAgICAgICAgICBpZiAobiA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb24gKz0gdG90YWw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRvdGFsICs9IG47Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigicmVhZCAlbGQgYnl0ZXMgYXQgb2Zmc2V0ICVsbGQiLCBuLCBtUG9zaXRpb24pOwotCi0gICAgICAgIG1Qb3NpdGlvbiArPSB0b3RhbDsKLQotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHNwPE51UGxheWVyOjpOdVBsYXllclN0cmVhbUxpc3RlbmVyPiBtTGlzdGVuZXI7Ci0gICAgb2ZmNjRfdCBtUG9zaXRpb247Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW1Tb3VyY2UpOwotfTsKLQotTVA0U291cmNlOjpNUDRTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKQotICAgIDogU291cmNlKG5vdGlmeSksCi0gICAgICBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKLSAgICAgIG1QYXJzZXIobmV3IEZyYWdtZW50ZWRNUDRQYXJzZXIpLAotICAgICAgbUVPUyhmYWxzZSkgewotICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGFyc2VyKTsKLX0KLQotTVA0U291cmNlOjp+TVA0U291cmNlKCkgewotfQotCi12b2lkIE1QNFNvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewotICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoMCwgMCk7Ci0gICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKDApOwotICAgIG5vdGlmeVByZXBhcmVkKCk7Ci19Ci0KLXZvaWQgTVA0U291cmNlOjpzdGFydCgpIHsKLSAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8pOwotICAgIG1QYXJzZXItPnN0YXJ0KG5ldyBTdHJlYW1Tb3VyY2UobVNvdXJjZSkpOwotfQotCi1zdGF0dXNfdCBNUDRTb3VyY2U6OmZlZWRNb3JlVFNEYXRhKCkgewotICAgIHJldHVybiBtRU9TID8gRVJST1JfRU5EX09GX1NUUkVBTSA6IChzdGF0dXNfdClPSzsKLX0KLQotc3A8QU1lc3NhZ2U+IE1QNFNvdXJjZTo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKLSAgICByZXR1cm4gbVBhcnNlci0+Z2V0Rm9ybWF0KGF1ZGlvKTsKLX0KLQotc3RhdHVzX3QgTVA0U291cmNlOjpkZXF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICByZXR1cm4gbVBhcnNlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYXVkaW8sIGFjY2Vzc1VuaXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9tcDQvTVA0U291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZWY2MjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL21wNC9NUDRTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QNF9TT1VSQ0VfSAotI2RlZmluZSBNUDRfU09VUkNFX0gKLQotI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI7Ci0KLXN0cnVjdCBNUDRTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSB7Ci0gICAgTVA0U291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKLQotICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDRTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxJU3RyZWFtU291cmNlPiBtU291cmNlOwotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8RnJhZ21lbnRlZE1QNFBhcnNlcj4gbVBhcnNlcjsKLSAgICBib29sIG1FT1M7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUDRTb3VyY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIE1QNF9TT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tayBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKaW5kZXggNjljNzViOC4uOTcwN2M0YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCkBAIC0zMSw5ICszMSw4IEBACiAgICAgbGliY29tbW9uX3RpbWVfY2xpZW50IFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYm1lZGlhCi0jIFRoaXMgZGVwZW5kZW5jeSBvbiBsaWJtZWRpYSBpcyBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgotIyBDb25zaWRlciBhIHNlcGFyYXRlIGEgbGlicmFyeSBmb3IgU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLgorICAgIGxpYmxvZworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmluc3RhbnRzc3EKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcAppbmRleCA3NGE2ZmRiLi41NTFmNTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmNwcApAQCAtMjQsMTEgKzI0LDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2U6OkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpIDoKICAgICBOQkFJT19Tb3VyY2UoZm9ybWF0KSwgbVByb3ZpZGVyKHByb3ZpZGVyKSwgbUNvbnN1bWVkKDApCiB7CiAgICAgQUxPR19BU1NFUlQocHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgQUxPR19BU1NFUlQoZm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKTsKKyAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNWYWxpZChmb3JtYXQpKTsKIH0KIAogQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZTo6fkF1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UoKQpAQCAtNjgsNyArNjgsNyBAQAogICAgIH0KICAgICAvLyBjb3VudCBjb3VsZCBiZSB6ZXJvLCBlaXRoZXIgYmVjYXVzZSBjb3VudCB3YXMgemVybyBvbiBlbnRyeSBvcgogICAgIC8vIGF2YWlsYWJsZSBpcyB6ZXJvLCBidXQgYm90aCBhcmUgdW5saWtlbHkgc28gZG9uJ3QgY2hlY2sgZm9yIHRoYXQKLSAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgPDwgbUJpdFNoaWZ0KSwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBtZW1jcHkoYnVmZmVyLCAoY2hhciAqKSBtQnVmZmVyLnJhdyArIChtQ29uc3VtZWQgKiBtRnJhbWVTaXplKSwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkoKG1Db25zdW1lZCArPSBjb3VudCkgPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSkgewogICAgICAgICBtUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwogICAgICAgICBtQnVmZmVyLnJhdyA9IE5VTEw7CkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgICAgIGNvdW50ID0gYXZhaWxhYmxlOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgY2hhciogcmVhZFRndCA9IChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgY2hhciogcmVhZFRndCA9IChjaGFyICopIG1CdWZmZXIucmF3ICsgKG1Db25zdW1lZCAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgc3NpemVfdCByZXQgPSB2aWEodXNlciwgcmVhZFRndCwgY291bnQsIHJlYWRQVFMpOwogICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHJldCA8PSAwKSkgewogICAgICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkoYWNjdW11bGF0b3IgPiAwKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAppbmRleCAwNTI3M2Y2Li42YWFiNDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmNwcApAQCAtNDAsMTYgKzQwLDE1IEBACiBzc2l6ZV90IEF1ZGlvU3RyZWFtSW5Tb3VyY2U6Om5lZ290aWF0ZShjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzW10sIHNpemVfdCBudW1PZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBjb3VudGVyT2ZmZXJzW10sIHNpemVfdCYgbnVtQ291bnRlck9mZmVycykKIHsKLSAgICBpZiAobUZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmICghRm9ybWF0X2lzVmFsaWQobUZvcm1hdCkpIHsKICAgICAgICAgbVN0cmVhbUJ1ZmZlclNpemVCeXRlcyA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1TdHJlYW0tPmNvbW1vbik7CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHN0cmVhbUZvcm1hdCA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICBpZiAoc3RyZWFtRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbVN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KSBtU3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgcG9wY291bnQoY2hhbm5lbE1hc2spKTsKLSAgICAgICAgICAgIG1CaXRTaGlmdCA9IEZvcm1hdF9mcmFtZUJpdFNoaWZ0KG1Gb3JtYXQpOwotICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KSBtU3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtU3RyZWFtLT5jb21tb24pOworICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19Tb3VyY2U6Om5lZ290aWF0ZShvZmZlcnMsIG51bU9mZmVycywgY291bnRlck9mZmVycywgbnVtQ291bnRlck9mZmVycyk7CiB9CkBAIC02NSwxNCArNjQsMTQgQEAKICAgICByZXR1cm4gbUZyYW1lc092ZXJydW47CiB9CiAKLXNzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3NzaXplX3QgQXVkaW9TdHJlYW1JblNvdXJjZTo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTIF9fdW51c2VkKQogewotICAgIGlmIChDQ19VTkxJS0VMWShtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSkgeworICAgIGlmIChDQ19VTkxJS0VMWSghRm9ybWF0X2lzVmFsaWQobUZvcm1hdCkpKSB7CiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQotICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICBpZiAoYnl0ZXNSZWFkID4gMCkgewotICAgICAgICBzaXplX3QgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZCA+PiBtQml0U2hpZnQ7CisgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkID0gYnl0ZXNSZWFkIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgbUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKICAgICAgICAgcmV0dXJuIGZyYW1lc1JlYWQ7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCmluZGV4IGU0MzQxZDcuLjBkNWY5MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcApAQCAtMzcsMTYgKzM3LDE1IEBACiBzc2l6ZV90IEF1ZGlvU3RyZWFtT3V0U2luazo6bmVnb3RpYXRlKGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbXSwgc2l6ZV90IG51bU9mZmVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIGlmIChtRm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzID0gbVN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbVN0cmVhbS0+Y29tbW9uKTsKICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0ID0gbVN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIGlmIChzdHJlYW1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtU3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBwb3Bjb3VudChjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUJpdFNoaWZ0ID0gRm9ybWF0X2ZyYW1lQml0U2hpZnQobUZvcm1hdCk7Ci0gICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIG1TdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1TdHJlYW0tPmNvbW1vbik7CisgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CiAgICAgfQogICAgIHJldHVybiBOQkFJT19TaW5rOjpuZWdvdGlhdGUob2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwogfQpAQCAtNTYsMTAgKzU1LDEwIEBACiAgICAgaWYgKCFtTmVnb3RpYXRlZCkgewogICAgICAgICByZXR1cm4gTkVHT1RJQVRFOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChtRm9ybWF0ICE9IEZvcm1hdF9JbnZhbGlkKTsKLSAgICBzc2l6ZV90IHJldCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgY291bnQgPDwgbUJpdFNoaWZ0KTsKKyAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSk7CisgICAgc3NpemVfdCByZXQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgaWYgKHJldCA+IDApIHsKLSAgICAgICAgcmV0ID4+PSBtQml0U2hpZnQ7CisgICAgICAgIHJldCAvPSBtRnJhbWVTaXplOwogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgdmVyaWZ5IEhBTCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJldHVybmluZyB0aGUgY29ycmVjdCBlcnJvciBjb2RlcyBlLmcuIFdPVUxEX0JMT0NLCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKaW5kZXggM2M2MWI2MC4uMGI2NTg2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNkZWZpbmUgTE9HX1RBRyAiTW9ub1BpcGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKQEAgLTMwLDcgKzMyLDI0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotTW9ub1BpcGU6Ok1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIE5CQUlPX0Zvcm1hdCBmb3JtYXQsIGJvb2wgd3JpdGVDYW5CbG9jaykgOgorc3RhdGljIHVpbnQ2NF90IGNhY2hlTjsgLy8gb3V0cHV0IG9mIENDSGVscGVyOjpnZXRMb2NhbEZyZXEoKQorc3RhdGljIGJvb2wgY2FjaGVWYWxpZDsgLy8gd2hldGhlciBjYWNoZU4gaXMgdmFsaWQKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBjYWNoZU9uY2VDb250cm9sID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKK3N0YXRpYyB2b2lkIGNhY2hlT25jZUluaXQoKQoreworICAgIENDSGVscGVyIHRtcEhlbHBlcjsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKE9LICE9IChyZXMgPSB0bXBIZWxwZXIuZ2V0TG9jYWxGcmVxKCZjYWNoZU4pKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZldGNoIGxvY2FsIHRpbWUgZnJlcXVlbmN5IHdoZW4gY29uc3RydWN0aW5nIGEiCisgICAgICAgICAgICAgICIgTW9ub1BpcGUgKHJlcyA9ICVkKS4gIGdldE5leHRXcml0ZVRpbWVzdGFtcCBjYWxscyB3aWxsIGJlIgorICAgICAgICAgICAgICAiIG5vbi1mdW5jdGlvbmFsIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYWNoZVZhbGlkID0gdHJ1ZTsKK30KKworTW9ub1BpcGU6Ok1vbm9QaXBlKHNpemVfdCByZXFGcmFtZXMsIGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0LCBib29sIHdyaXRlQ2FuQmxvY2spIDoKICAgICAgICAgTkJBSU9fU2luayhmb3JtYXQpLAogICAgICAgICBtVXBkYXRlU2VxKDApLAogICAgICAgICBtUmVxRnJhbWVzKHJlcUZyYW1lcyksCkBAIC00Nyw4ICs2Niw2IEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yKCZtVGltZXN0YW1wU2hhcmVkKSwKICAgICAgICAgbVRpbWVzdGFtcE9ic2VydmVyKCZtVGltZXN0YW1wU2hhcmVkKQogewotICAgIENDSGVscGVyIHRtcEhlbHBlcjsKLSAgICBzdGF0dXNfdCByZXM7CiAgICAgdWludDY0X3QgTiwgRDsKIAogICAgIG1OZXh0UmRQVFMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKQEAgLTU5LDE5ICs3NiwyMCBAQAogICAgIG1TYW1wbGVzVG9Mb2NhbFRpbWUuYV90b19iX2Rlbm9tID0gMDsKIAogICAgIEQgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgIGlmIChPSyAhPSAocmVzID0gdG1wSGVscGVyLmdldExvY2FsRnJlcSgmTikpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmV0Y2ggbG9jYWwgdGltZSBmcmVxdWVuY3kgd2hlbiBjb25zdHJ1Y3RpbmcgYSIKLSAgICAgICAgICAgICAgIiBNb25vUGlwZSAocmVzID0gJWQpLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIGNhbGxzIHdpbGwgYmUiCi0gICAgICAgICAgICAgICIgbm9uLWZ1bmN0aW9uYWwiLCByZXMpOworCisgICAgKHZvaWQpIHB0aHJlYWRfb25jZSgmY2FjaGVPbmNlQ29udHJvbCwgY2FjaGVPbmNlSW5pdCk7CisgICAgaWYgKCFjYWNoZVZhbGlkKSB7CisgICAgICAgIC8vIGxvZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBOID0gY2FjaGVOOwogCiAgICAgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2UoJk4sICZEKTsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NpZ25lZEhpQml0c01hc2sgICA9IH4oMHg3RkZGRkZGRnVsbCk7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtVbnNpZ25lZEhpQml0c01hc2sgPSB+KDB4RkZGRkZGRkZ1bGwpOwogICAgIGlmICgoTiAmIGtTaWduZWRIaUJpdHNNYXNrKSB8fCAoRCAmIGtVbnNpZ25lZEhpQml0c01hc2spKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVkdWNlIHNhbXBsZSByYXRlIHRvIGxvY2FsIGNsb2NrIGZyZXF1ZW5jeSByYXRpbyB0byBmaXQiCi0gICAgICAgICAgICAgICIgaW4gYSAzMi8zMiBiaXQgcmF0aW9uYWwuICAobWF4IHJlZHVjdGlvbiBpcyAweCUwMTZsbHgvMHglMDE2bGx4IgorICAgICAgICAgICAgICAiIGluIGEgMzIvMzIgYml0IHJhdGlvbmFsLiAgKG1heCByZWR1Y3Rpb24gaXMgMHglMDE2IiBQUkl4NjQgIi8weCUwMTYiIFBSSXg2NAogICAgICAgICAgICAgICAiKS4gIGdldE5leHRXcml0ZVRpbWVzdGFtcCBjYWxscyB3aWxsIGJlIG5vbi1mdW5jdGlvbmFsIiwgTiwgRCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTUsMTEgKzEzMywxMSBAQAogICAgICAgICAgICAgcGFydDEgPSB3cml0dGVuOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkocGFydDEgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIG1CdWZmZXIgKyAocmVhciA8PCBtQml0U2hpZnQpLCBidWZmZXIsIHBhcnQxIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyICogbUZyYW1lU2l6ZSksIGJ1ZmZlciwgcGFydDEgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShyZWFyICsgcGFydDEgPT0gbU1heEZyYW1lcykpIHsKICAgICAgICAgICAgICAgICBzaXplX3QgcGFydDIgPSB3cml0dGVuIC0gcGFydDE7CiAgICAgICAgICAgICAgICAgaWYgKENDX0xJS0VMWShwYXJ0MiA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShtQnVmZmVyLCAoY2hhciAqKSBidWZmZXIgKyAocGFydDEgPDwgbUJpdFNoaWZ0KSwgcGFydDIgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSAqIG1GcmFtZVNpemUpLCBwYXJ0MiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUod3JpdHRlbiArIG1SZWFyLCAmbVJlYXIpOwpAQCAtMTI5LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjb3VudCAtPSB3cml0dGVuOwotICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiA8PCBtQml0U2hpZnQpOworICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyAod3JpdHRlbiAqIG1GcmFtZVNpemUpOwogICAgICAgICAvLyBTaW11bGF0ZSBibG9ja2luZyBJL08gYnkgc2xlZXBpbmcgYXQgZGlmZmVyZW50IHJhdGVzLCBkZXBlbmRpbmcgb24gYSB0aHJvdHRsZS4KICAgICAgICAgLy8gVGhlIHRocm90dGxlIHRyaWVzIHRvIGtlZXAgdGhlIG1lYW4gcGlwZSBkZXB0aCBuZWFyIHRoZSBzZXRwb2ludCwgd2l0aCBhIHNsaWdodCBqaXR0ZXIuCiAgICAgICAgIHVpbnQzMl90IG5zOwpAQCAtMjkyLDcgKzMxMCw3IEBACiAgICAgICAgIC8vIGVycm9yLCBidXQgdGhlbiB6ZXJvIG91dCB0aGUgcmF0aW8gaW4gdGhlIGxpbmVhciB0cmFuc2Zvcm0gc28KICAgICAgICAgLy8gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZG8gYW55IGNvbnZlcnNpb25zIGZyb20gbm93IG9uLiAgVGhpcwogICAgICAgICAvLyBNb25vUGlwZSdzIGdldE5leHRXcml0ZVRpbWVzdGFtcCBpcyBub3cgYnJva2VuIGZvciBnb29kLgotICAgICAgICBBTE9HRSgiT3ZlcmZsb3cgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgJWQgYXVkaW8gZnJhbWVzIHRvIgorICAgICAgICBBTE9HRSgiT3ZlcmZsb3cgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgJXp1IGF1ZGlvIGZyYW1lcyB0byIKICAgICAgICAgICAgICAgIiBkdXJhdGlvbiBpbiBsb2NhbCB0aW1lLiAgZ2V0TmV4dFdyaXRlVGltZXN0YW1wIHdpbGwgZmFpbCBmcm9tIgogICAgICAgICAgICAgICAiIG5vdyBvbi4iLCBhdWRGcmFtZXMpOwogICAgICAgICBtU2FtcGxlc1RvTG9jYWxUaW1lLmFfdG9fYl9udW1lciA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAgYi9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKaW5kZXggODUxMzQxYS4uZGU4MjIyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcApAQCAtNzMsMTEgKzczLDExIEBACiAgICAgICAgIHBhcnQxID0gcmVkOwogICAgIH0KICAgICBpZiAoQ0NfTElLRUxZKHBhcnQxID4gMCkpIHsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUtPm1CdWZmZXIgKyAoZnJvbnQgPDwgbUJpdFNoaWZ0KSwgcGFydDEgPDwgbUJpdFNoaWZ0KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUtPm1CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKSwgcGFydDEgKiBtRnJhbWVTaXplKTsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKGZyb250ICsgcGFydDEgPT0gbVBpcGUtPm1NYXhGcmFtZXMpKSB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDIgPSByZWQgLSBwYXJ0MTsKICAgICAgICAgICAgIGlmIChDQ19MSUtFTFkocGFydDIgPiAwKSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBidWZmZXIgKyAocGFydDEgPDwgbUJpdFNoaWZ0KSwgbVBpcGUtPm1CdWZmZXIsIHBhcnQyIDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChwYXJ0MSAqIG1GcmFtZVNpemUpLCBtUGlwZS0+bUJ1ZmZlciwgcGFydDIgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtUGlwZS0+dXBkYXRlRnJvbnRBbmROUlBUUyhyZWQgKyBtUGlwZS0+bUZyb250LCBuZXh0UmVhZFBUUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkFJTy5jcHAKaW5kZXggZTBkMmMyMS4uZDY0MWU3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJBSU8uY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL05CQUlPLmNwcApAQCAtMjIsMTE5ICsyMiw0MiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXNpemVfdCBGb3JtYXRfZnJhbWVTaXplKE5CQUlPX0Zvcm1hdCBmb3JtYXQpCitzaXplX3QgRm9ybWF0X2ZyYW1lU2l6ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICByZXR1cm4gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpICogc2l6ZW9mKHNob3J0KTsKKyAgICByZXR1cm4gZm9ybWF0Lm1GcmFtZVNpemU7CiB9CiAKLXNpemVfdCBGb3JtYXRfZnJhbWVCaXRTaGlmdChOQkFJT19Gb3JtYXQgZm9ybWF0KQorY29uc3QgTkJBSU9fRm9ybWF0IEZvcm1hdF9JbnZhbGlkID0geyAwLCAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCwgMCB9OworCit1bnNpZ25lZCBGb3JtYXRfc2FtcGxlUmF0ZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCkKIHsKLSAgICAvLyBzaXplb2Yoc2hvcnQpID09IDIsIHNvIGZyYW1lIHNpemUgPT0gMSA8PCBjaGFubmVscwotICAgIHJldHVybiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZm9ybWF0Lm1TYW1wbGVSYXRlOwogfQogCi1lbnVtIHsKLSAgICBGb3JtYXRfU1JfODAwMCwKLSAgICBGb3JtYXRfU1JfMTEwMjUsCi0gICAgRm9ybWF0X1NSXzE2MDAwLAotICAgIEZvcm1hdF9TUl8yMjA1MCwKLSAgICBGb3JtYXRfU1JfMjQwMDAsCi0gICAgRm9ybWF0X1NSXzMyMDAwLAotICAgIEZvcm1hdF9TUl80NDEwMCwKLSAgICBGb3JtYXRfU1JfNDgwMDAsCi0gICAgRm9ybWF0X1NSX01hc2sgPSA3Ci19OwotCi1lbnVtIHsKLSAgICBGb3JtYXRfQ18xID0gMHgwOCwKLSAgICBGb3JtYXRfQ18yID0gMHgxMCwKLSAgICBGb3JtYXRfQ19NYXNrID0gMHgxOAotfTsKLQotdW5zaWduZWQgRm9ybWF0X3NhbXBsZVJhdGUoTkJBSU9fRm9ybWF0IGZvcm1hdCkKK3Vuc2lnbmVkIEZvcm1hdF9jaGFubmVsQ291bnQoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQpCiB7Ci0gICAgaWYgKGZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgc3dpdGNoIChmb3JtYXQgJiBGb3JtYXRfU1JfTWFzaykgewotICAgIGNhc2UgRm9ybWF0X1NSXzgwMDA6Ci0gICAgICAgIHJldHVybiA4MDAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzExMDI1OgotICAgICAgICByZXR1cm4gMTEwMjU7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMTYwMDA6Ci0gICAgICAgIHJldHVybiAxNjAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl8yMjA1MDoKLSAgICAgICAgcmV0dXJuIDIyMDUwOwotICAgIGNhc2UgRm9ybWF0X1NSXzI0MDAwOgotICAgICAgICByZXR1cm4gMjQwMDA7Ci0gICAgY2FzZSBGb3JtYXRfU1JfMzIwMDA6Ci0gICAgICAgIHJldHVybiAzMjAwMDsKLSAgICBjYXNlIEZvcm1hdF9TUl80NDEwMDoKLSAgICAgICAgcmV0dXJuIDQ0MTAwOwotICAgIGNhc2UgRm9ybWF0X1NSXzQ4MDAwOgotICAgICAgICByZXR1cm4gNDgwMDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBmb3JtYXQubUNoYW5uZWxDb3VudDsKIH0KIAotdW5zaWduZWQgRm9ybWF0X2NoYW5uZWxDb3VudChOQkFJT19Gb3JtYXQgZm9ybWF0KQorTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7Ci0gICAgaWYgKGZvcm1hdCA9PSBGb3JtYXRfSW52YWxpZCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3dpdGNoIChmb3JtYXQgJiBGb3JtYXRfQ19NYXNrKSB7Ci0gICAgY2FzZSBGb3JtYXRfQ18xOgotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEZvcm1hdF9DXzI6Ci0gICAgICAgIHJldHVybiAyOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotTkJBSU9fRm9ybWF0IEZvcm1hdF9mcm9tX1NSX0ModW5zaWduZWQgc2FtcGxlUmF0ZSwgdW5zaWduZWQgY2hhbm5lbENvdW50KQotewotICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7Ci0gICAgc3dpdGNoIChzYW1wbGVSYXRlKSB7Ci0gICAgY2FzZSA4MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzExMDI1OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMTYwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl8yMjA1MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDAwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzI0MDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICBmb3JtYXQgPSBGb3JtYXRfU1JfMzIwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIGZvcm1hdCA9IEZvcm1hdF9TUl80NDEwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgZm9ybWF0ID0gRm9ybWF0X1NSXzQ4MDAwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgorICAgIGlmIChzYW1wbGVSYXRlID09IDAgfHwgY2hhbm5lbENvdW50ID09IDAgfHwgIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIHJldHVybiBGb3JtYXRfSW52YWxpZDsKICAgICB9Ci0gICAgc3dpdGNoIChjaGFubmVsQ291bnQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGZvcm1hdCB8PSBGb3JtYXRfQ18xOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGZvcm1hdCB8PSBGb3JtYXRfQ18yOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRm9ybWF0X0ludmFsaWQ7Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXQ7CisgICAgTkJBSU9fRm9ybWF0IHJldDsKKyAgICByZXQubVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHJldC5tQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgIHJldC5tRm9ybWF0ID0gZm9ybWF0OworICAgIHJldC5tRnJhbWVTaXplID0gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpID8KKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSA6IHNpemVvZih1aW50OF90KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvLyBUaGlzIGlzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgaXQgaXMgZXhwZWN0ZWQgdGhhdCBzdWJjbGFzc2VzIHdpbGwgb3B0aW1pemUgdGhpcy4KQEAgLTIxNCwxMSArMTM3LDExIEBACiBzc2l6ZV90IE5CQUlPX1BvcnQ6Om5lZ290aWF0ZShjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzW10sIHNpemVfdCBudW1PZmZlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGNvdW50ZXJPZmZlcnNbXSwgc2l6ZV90JiBudW1Db3VudGVyT2ZmZXJzKQogewotICAgIEFMT0dWKCJuZWdvdGlhdGUgb2ZmZXJzPSVwIG51bU9mZmVycz0ldSBjb3VudGVyc09mZmVycz0lcCBudW1Db3VudGVyT2ZmZXJzPSV1IiwKKyAgICBBTE9HVigibmVnb3RpYXRlIG9mZmVycz0lcCBudW1PZmZlcnM9JXp1IGNvdW50ZXJzT2ZmZXJzPSVwIG51bUNvdW50ZXJPZmZlcnM9JXp1IiwKICAgICAgICAgICAgIG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICBpZiAobUZvcm1hdCAhPSBGb3JtYXRfSW52YWxpZCkgeworICAgIGlmIChGb3JtYXRfaXNWYWxpZChtRm9ybWF0KSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bU9mZmVyczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAob2ZmZXJzW2ldID09IG1Gb3JtYXQpIHsKKyAgICAgICAgICAgIGlmIChGb3JtYXRfaXNFcXVhbChvZmZlcnNbaV0sIG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgbU5lZ290aWF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgfQpAQCAtMjMzLDQgKzE1NiwxNyBAQAogICAgIHJldHVybiAoc3NpemVfdCkgTkVHT1RJQVRFOwogfQogCitib29sIEZvcm1hdF9pc1ZhbGlkKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0KQoreworICAgIHJldHVybiBmb3JtYXQubVNhbXBsZVJhdGUgIT0gMCAmJiBmb3JtYXQubUNoYW5uZWxDb3VudCAhPSAwICYmCisgICAgICAgICAgICBmb3JtYXQubUZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCAmJiBmb3JtYXQubUZyYW1lU2l6ZSAhPSAwOworfQorCitib29sIEZvcm1hdF9pc0VxdWFsKGNvbnN0IE5CQUlPX0Zvcm1hdCYgZm9ybWF0MSwgY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQyKQoreworICAgIHJldHVybiBmb3JtYXQxLm1TYW1wbGVSYXRlID09IGZvcm1hdDIubVNhbXBsZVJhdGUgJiYKKyAgICAgICAgICAgIGZvcm1hdDEubUNoYW5uZWxDb3VudCA9PSBmb3JtYXQyLm1DaGFubmVsQ291bnQgJiYgZm9ybWF0MS5tRm9ybWF0ID09IGZvcm1hdDIubUZvcm1hdCAmJgorICAgICAgICAgICAgZm9ybWF0MS5tRnJhbWVTaXplID09IGZvcm1hdDIubUZyYW1lU2l6ZTsKK30KKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKaW5kZXggMDQ1YmY2NC4uNGQxNDkwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL05CTG9nLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMzcsMjUgKzMzOCwyNSBAQAogICAgICAgICB9CiAgICAgICAgIGkgLT0gbGVuZ3RoICsgMzsKICAgICB9Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIGxvc3QgKz0gaTsKLSAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzd2FybmluZzogbG9zdCAldSBieXRlcyB3b3J0aCBvZiBldmVudHNcbiIsIGluZGVudCwgIiIsIGxvc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0koIiUqc3dhcm5pbmc6IGxvc3QgJXUgYnl0ZXMgd29ydGggb2YgZXZlbnRzXG4iLCBpbmRlbnQsICIiLCBsb3N0KTsKLSAgICAgICAgfQorICAgIG1GZCA9IGZkOworICAgIG1JbmRlbnQgPSBpbmRlbnQ7CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisgICAgbG9zdCArPSBpOworICAgIGlmIChsb3N0ID4gMCkgeworICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7CisgICAgICAgIC8vIFRPRE8gdGltZXN0YW1wIGVtcHR5IGhlcmUsIG9ubHkgb3RoZXIgY2hvaWNlIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCB0aW1lc3RhbXAgZXZlbnQgaW4gdGhlCisgICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byByZWFkQXQoKS4KKyAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKICAgICB9CiAgICAgc2l6ZV90IHdpZHRoID0gMTsKICAgICB3aGlsZSAobWF4U2VjID49IDEwKSB7CiAgICAgICAgICsrd2lkdGg7CiAgICAgICAgIG1heFNlYyAvPSAxMDsKICAgICB9Ci0gICAgY2hhciBwcmVmaXhbMzJdOwogICAgIGlmIChtYXhTZWMgPj0gMCkgewotICAgICAgICBzbnByaW50ZihwcmVmaXgsIHNpemVvZihwcmVmaXgpLCAiWyUqc10gIiwgd2lkdGggKyA0LCAiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJlZml4WzBdID0gJ1wwJzsKKyAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyUqc10iLCAoaW50KSB3aWR0aCArIDQsICIiKTsKICAgICB9CisgICAgYm9vbCBkZWZlcnJlZFRpbWVzdGFtcCA9IGZhbHNlOwogICAgIHdoaWxlIChpIDwgYXZhaWwpIHsKICAgICAgICAgZXZlbnQgPSAoRXZlbnQpIGNvcHlbaV07CiAgICAgICAgIGxlbmd0aCA9IGNvcHlbaSArIDFdOwpAQCAtMzYzLDExICszNjQsOCBAQAogICAgICAgICBzaXplX3QgYWR2YW5jZSA9IGxlbmd0aCArIDM7CiAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBFVkVOVF9TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzJXMlLipzXG4iLCBpbmRlbnQsICIiLCBwcmVmaXgsIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dJKCIlKnMlcyUuKnMiLCBpbmRlbnQsICIiLCBwcmVmaXgsIGxlbmd0aCwgKGNvbnN0IGNoYXIgKikgZGF0YSk7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIiUuKnMiLCAoaW50KSBsZW5ndGgsIChjb25zdCBjaGFyICopIGRhdGEpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRVZFTlRfVElNRVNUQU1QOiB7CiAgICAgICAgICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBsZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYyk7CiAgICAgICAgICAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2Yoc3RydWN0IHRpbWVzcGVjKSk7CkBAIC00MDAsNDggKzM5OCw1NiBAQAogICAgICAgICAgICAgICAgIHByZXZOc2VjID0gdHNOZXh0LnR2X25zZWM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaXplX3QgbiA9IChqIC0gaSkgLyAoc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykgKyAzKTsKKyAgICAgICAgICAgIGlmIChkZWZlcnJlZFRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CisgICAgICAgICAgICAgICAgZGVmZXJyZWRUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOwogICAgICAgICAgICAgaWYgKG4gPj0ga1NxdWFzaFRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzWyVkLiUwM2QgdG8gLiUuMDNkIGJ5IC4lLjAzZCB0byAuJS4wM2RdXG4iLCBpbmRlbnQsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHRzLnR2X3NlYywgKGludCkgKHRzLnR2X25zZWMgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzLnR2X25zZWMgKyBkZWx0YVRvdGFsKSAvIDEwMDAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiUqc1slZC4lMDNkIHRvIC4lLjAzZCBieSAuJS4wM2QgdG8gLiUuMDNkXVxuIiwgaW5kZW50LCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB0cy50dl9zZWMsIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cy50dl9uc2VjICsgZGVsdGFUb3RhbCkgLyAxMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoZGVsdGFNaW4gLyAxMDAwMDAwKSwgKGludCkgKGRlbHRhTWF4IC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAuYXBwZW5kRm9ybWF0KCJbJWQuJTAzZCB0byAuJS4wM2QgYnkgLiUuMDNkIHRvIC4lLjAzZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdHMudHZfc2VjLCAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cy50dl9uc2VjICsgZGVsdGFUb3RhbCkgLyAxMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChkZWx0YU1pbiAvIDEwMDAwMDApLCAoaW50KSAoZGVsdGFNYXggLyAxMDAwMDAwKSk7CiAgICAgICAgICAgICAgICAgaSA9IGo7CiAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IDA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzWyVkLiUwM2RdXG4iLCBpbmRlbnQsICIiLCAoaW50KSB0cy50dl9zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqc1slZC4lMDNkXSIsIGluZGVudCwgIiIsIChpbnQpIHRzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh0cy50dl9uc2VjIC8gMTAwMDAwMCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgdHMudHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAodHMudHZfbnNlYyAvIDEwMDAwMDApKTsKKyAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gdHJ1ZTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiJSpzJXN3YXJuaW5nOiB1bmtub3duIGV2ZW50ICVkXG4iLCBpbmRlbnQsICIiLCBwcmVmaXgsIGV2ZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiUqcyVzd2FybmluZzogdW5rbm93biBldmVudCAlZCIsIGluZGVudCwgIiIsIHByZWZpeCwgZXZlbnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpICs9IGFkdmFuY2U7CisKKyAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKKyAgICAgICAgICAgIGRlZmVycmVkVGltZXN0YW1wID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlZmVycmVkVGltZXN0YW1wKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CiAgICAgfQogICAgIC8vIEZJWE1FIGl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIHB1dCBhIGNoYXIgbUNvcHlbMjU2XSBhcyBhIG1lbWJlciB2YXJpYWJsZSBvZiB0aGUgZHVtcGVyCiAgICAgZGVsZXRlW10gY29weTsKIH0KIAordm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpCit7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIGRwcmludGYobUZkLCAiJS4qcyVzICVzXG4iLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HSSgiJS4qcyVzICVzIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgfQorICAgIGJvZHkuY2xlYXIoKTsKK30KKwogYm9vbCBOQkxvZzo6UmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGlNZW1vcnkuZ2V0KCkgPT0gbUlNZW1vcnkuZ2V0KCk7CisgICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOwogfQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKaW5kZXggMWMyMWY5Yy4uNmUwZWM4YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKQEAgLTI1LDE5ICsyNSwyMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVBpcGU6OlBpcGUoc2l6ZV90IG1heEZyYW1lcywgTkJBSU9fRm9ybWF0IGZvcm1hdCkgOgorUGlwZTo6UGlwZShzaXplX3QgbWF4RnJhbWVzLCBjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCwgdm9pZCAqYnVmZmVyKSA6CiAgICAgICAgIE5CQUlPX1NpbmsoZm9ybWF0KSwKICAgICAgICAgbU1heEZyYW1lcyhyb3VuZHVwKG1heEZyYW1lcykpLAotICAgICAgICBtQnVmZmVyKG1hbGxvYyhtTWF4RnJhbWVzICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpKSksCisgICAgICAgIG1CdWZmZXIoYnVmZmVyID09IE5VTEwgPyBtYWxsb2MobU1heEZyYW1lcyAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KSkgOiBidWZmZXIpLAogICAgICAgICBtUmVhcigwKSwKLSAgICAgICAgbVJlYWRlcnMoMCkKKyAgICAgICAgbVJlYWRlcnMoMCksCisgICAgICAgIG1GcmVlQnVmZmVySW5EZXN0cnVjdG9yKGJ1ZmZlciA9PSBOVUxMKQogewogfQogCiBQaXBlOjp+UGlwZSgpCiB7CiAgICAgQUxPR19BU1NFUlQoYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtUmVhZGVycykgPT0gMCk7Ci0gICAgZnJlZShtQnVmZmVyKTsKKyAgICBpZiAobUZyZWVCdWZmZXJJbkRlc3RydWN0b3IpIHsKKyAgICAgICAgZnJlZShtQnVmZmVyKTsKKyAgICB9CiB9CiAKIHNzaXplX3QgUGlwZTo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQpCkBAIC01MiwxMyArNTUsMTMgQEAKICAgICBpZiAoQ0NfTElLRUxZKHdyaXR0ZW4gPiBjb3VudCkpIHsKICAgICAgICAgd3JpdHRlbiA9IGNvdW50OwogICAgIH0KLSAgICBtZW1jcHkoKGNoYXIgKikgbUJ1ZmZlciArIChyZWFyIDw8IG1CaXRTaGlmdCksIGJ1ZmZlciwgd3JpdHRlbiA8PCBtQml0U2hpZnQpOworICAgIG1lbWNweSgoY2hhciAqKSBtQnVmZmVyICsgKHJlYXIgKiBtRnJhbWVTaXplKSwgYnVmZmVyLCB3cml0dGVuICogbUZyYW1lU2l6ZSk7CiAgICAgaWYgKENDX1VOTElLRUxZKHJlYXIgKyB3cml0dGVuID09IG1NYXhGcmFtZXMpKSB7CiAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoY291bnQgLT0gd3JpdHRlbikgPiByZWFyKSkgewogICAgICAgICAgICAgY291bnQgPSByZWFyOwogICAgICAgICB9CiAgICAgICAgIGlmIChDQ19MSUtFTFkoY291bnQgPiAwKSkgewotICAgICAgICAgICAgbWVtY3B5KG1CdWZmZXIsIChjaGFyICopIGJ1ZmZlciArICh3cml0dGVuIDw8IG1CaXRTaGlmdCksIGNvdW50IDw8IG1CaXRTaGlmdCk7CisgICAgICAgICAgICBtZW1jcHkobUJ1ZmZlciwgKGNoYXIgKikgYnVmZmVyICsgKHdyaXR0ZW4gKiBtRnJhbWVTaXplKSwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIHdyaXR0ZW4gKz0gY291bnQ7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCmluZGV4IGQ3ODZiODQuLmM4ZTQ5NTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCisrKyBiL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwCkBAIC01OSw3ICs1OSw3IEBACiAgICAgcmV0dXJuIGF2YWlsOwogfQogCi1zc2l6ZV90IFBpcGVSZWFkZXI6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgY291bnQsIGludDY0X3QgcmVhZFBUUykKK3NzaXplX3QgUGlwZVJlYWRlcjo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBjb3VudCwgaW50NjRfdCByZWFkUFRTIF9fdW51c2VkKQogewogICAgIHNzaXplX3QgYXZhaWwgPSBhdmFpbGFibGVUb1JlYWQoKTsKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXZhaWwgPD0gMCkpIHsKQEAgLTc2LDE0ICs3NiwxNCBAQAogICAgICAgICByZWQgPSBjb3VudDsKICAgICB9CiAgICAgLy8gSW4gcGFydGljdWxhciwgYW4gb3ZlcnJ1biBkdXJpbmcgdGhlIG1lbWNweSB3aWxsIHJlc3VsdCBpbiByZWFkaW5nIGNvcnJ1cHQgZGF0YQotICAgIG1lbWNweShidWZmZXIsIChjaGFyICopIG1QaXBlLm1CdWZmZXIgKyAoZnJvbnQgPDwgbUJpdFNoaWZ0KSwgcmVkIDw8IG1CaXRTaGlmdCk7CisgICAgbWVtY3B5KGJ1ZmZlciwgKGNoYXIgKikgbVBpcGUubUJ1ZmZlciArIChmcm9udCAqIG1GcmFtZVNpemUpLCByZWQgKiBtRnJhbWVTaXplKTsKICAgICAvLyBXZSBjb3VsZCByZS1yZWFkIHRoZSByZWFyIHBvaW50ZXIgaGVyZSB0byBkZXRlY3QgdGhlIGNvcnJ1cHRpb24sIGJ1dCB3aHkgYm90aGVyPwogICAgIGlmIChDQ19VTkxJS0VMWShmcm9udCArIHJlZCA9PSBtUGlwZS5tTWF4RnJhbWVzKSkgewogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKGNvdW50IC09IHJlZCkgPiBmcm9udCkpIHsKICAgICAgICAgICAgIGNvdW50ID0gZnJvbnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKENDX0xJS0VMWShjb3VudCA+IDApKSB7Ci0gICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYnVmZmVyICsgKHJlZCA8PCBtQml0U2hpZnQpLCBtUGlwZS5tQnVmZmVyLCBjb3VudCA8PCBtQml0U2hpZnQpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGJ1ZmZlciArIChyZWQgKiBtRnJhbWVTaXplKSwgbVBpcGUubUJ1ZmZlciwgY291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIHJlZCArPSBjb3VudDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwIGIvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAKaW5kZXggMDYyZmEwZi4uZTIxZWY0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIAogU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcjo6U291cmNlQXVkaW9CdWZmZXJQcm92aWRlcihjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UpIDoKICAgICBtU291cmNlKHNvdXJjZSksCi0gICAgLy8gbUZyYW1lQml0U2hpZnRGb3JtYXQgYmVsb3cKKyAgICAvLyBtRnJhbWVTaXplIGJlbG93CiAgICAgbUFsbG9jYXRlZChOVUxMKSwgbVNpemUoMCksIG1PZmZzZXQoMCksIG1SZW1haW5pbmcoMCksIG1HZXRDb3VudCgwKSwgbUZyYW1lc1JlbGVhc2VkKDApCiB7CiAgICAgQUxPR19BU1NFUlQoc291cmNlICE9IDApOwpAQCAtMzcsNyArMzcsNyBAQAogICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwogICAgIGluZGV4ID0gc291cmNlLT5uZWdvdGlhdGUoY291bnRlck9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgbUZyYW1lQml0U2hpZnQgPSBGb3JtYXRfZnJhbWVCaXRTaGlmdChzb3VyY2UtPmZvcm1hdCgpKTsKKyAgICBtRnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShzb3VyY2UtPmZvcm1hdCgpKTsKIH0KIAogU291cmNlQXVkaW9CdWZmZXJQcm92aWRlcjo6flNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIoKQpAQCAtNTQsMTQgKzU0LDE0IEBACiAgICAgICAgIGlmIChtUmVtYWluaW5nIDwgYnVmZmVyLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtUmVtYWluaW5nOwogICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKikgbUFsbG9jYXRlZCArIChtT2Zmc2V0IDw8IG1GcmFtZUJpdFNoaWZ0KTsKKyAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgbUdldENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogICAgIC8vIGRvIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZT8KICAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVNpemUpIHsKICAgICAgICAgZnJlZShtQWxsb2NhdGVkKTsKLSAgICAgICAgbUFsbG9jYXRlZCA9IG1hbGxvYyhidWZmZXItPmZyYW1lQ291bnQgPDwgbUZyYW1lQml0U2hpZnQpOworICAgICAgICBtQWxsb2NhdGVkID0gbWFsbG9jKGJ1ZmZlci0+ZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBtU2l6ZSA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICB9CiAgICAgLy8gcmVhZCBmcm9tIHNvdXJjZQpAQCAtODQsNyArODQsNyBAQAogdm9pZCBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEJ1ZmZlciAqYnVmZmVyKQogewogICAgIEFMT0dfQVNTRVJUKChidWZmZXIgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgIChidWZmZXItPnJhdyA9PSAoY2hhciAqKSBtQWxsb2NhdGVkICsgKG1PZmZzZXQgPDwgbUZyYW1lQml0U2hpZnQpKSAmJgorICAgICAgICAgICAgKGJ1ZmZlci0+cmF3ID09IChjaGFyICopIG1BbGxvY2F0ZWQgKyAobU9mZnNldCAqIG1GcmFtZVNpemUpKSAmJgogICAgICAgICAgICAgKGJ1ZmZlci0+ZnJhbWVDb3VudCA8PSBtR2V0Q291bnQpICYmCiAgICAgICAgICAgICAobUdldENvdW50IDw9IG1SZW1haW5pbmcpICYmCiAgICAgICAgICAgICAobU9mZnNldCArIG1SZW1haW5pbmcgPD0gbVNpemUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCmluZGV4IDRkMTA3MmYuLjE5NmY2ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcApAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgcmV0dXJuIG5ldyBBQUNTb3VyY2UobURhdGFTb3VyY2UsIG1NZXRhLCBtT2Zmc2V0VmVjdG9yLCBtRnJhbWVEdXJhdGlvblVzKTsKIH0KIAotc3A8TWV0YURhdGE+IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CitzcDxNZXRhRGF0YT4gQUFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCmluZGV4IGE2ZjdjZmIuLjM1MzkyMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApAQCAtMTQsNiArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBQUNXcml0ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yNywxMCArMzMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTExMSw3ICsxMTMsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQUFDV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBQUNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtMTcxLDcgKzE3Myw3IEBACiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKICAgICB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSyAmJgpAQCAtMjAwLDcgKzIwMiw3IEBACiAKIC8vIHN0YXRpYwogdm9pZCAqQUFDV3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgcmV0dXJuICh2b2lkICopIHN0YXRpY19jYXN0PEFBQ1dyaXRlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKKyAgICByZXR1cm4gKHZvaWQgKikodWludHB0cl90KXN0YXRpY19jYXN0PEFBQ1dyaXRlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKIH0KIAogLyoKQEAgLTM0OCw3ICszNTAsNyBAQAogICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlbGxkLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICVsbGQiLAorICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJSIgUFJJZDY0ICIsIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbjogJSIgUFJJZDY0LAogICAgICAgICAgICAgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CiAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1heFRpbWVzdGFtcFVzKSB7CiAgICAgICAgICAgICBtYXhUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggYWRjZGEwMy4uZjVhM2E3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC0xNyw2ICsxNywxMyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBQ29kZWMiCiAKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KQEAgLTI1LDYgKzMyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KQEAgLTM2LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCkBAIC00Myw2ICs1Miw0OCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE9NWCBlcnJvcnMgYXJlIGRpcmVjdGx5IG1hcHBlZCBpbnRvIHN0YXR1c190IHJhbmdlIGlmCisvLyB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIE1lZGlhRXJyb3Igc3RhdHVzIGNvZGUuCisvLyBVc2UgdGhlIHN0YXR1c0Zyb21PTVhFcnJvcihpbnQzMl90IG9teEVycm9yKSBmdW5jdGlvbi4KKy8vCisvLyBDdXJyZW50bHkgdGhpcyBpcyBhIGRpcmVjdCBtYXAuCisvLyBTZWUgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db3JlLmgKKy8vCisvLyBWZW5kb3IgT01YIGVycm9ycyAgICAgZnJvbSAweDkwMDAwMDAwIC0gMHg5MDAwRkZGRgorLy8gRXh0ZW5zaW9uIE9NWCBlcnJvcnMgIGZyb20gMHg4RjAwMDAwMCAtIDB4OTAwMDAwMDAKKy8vIFN0YW5kYXJkIE9NWCBlcnJvcnMgICBmcm9tIDB4ODAwMDEwMDAgLSAweDgwMDAxMDI0ICgweDgwMDAxMDI0IGN1cnJlbnQpCisvLworCisvLyByZXR1cm5zIHRydWUgaWYgZXJyIGlzIGEgcmVjb2duaXplZCBPTVggZXJyb3IgY29kZS4KKy8vIGFzIE9NWCBlcnJvciBpcyBPTVhfUzMyLCB0aGlzIGlzIGFuIGludDMyX3QgdHlwZQorc3RhdGljIGlubGluZSBib29sIGlzT01YRXJyb3IoaW50MzJfdCBlcnIpIHsKKyAgICByZXR1cm4gKEVSUk9SX0NPREVDX01JTiA8PSBlcnIgJiYgZXJyIDw9IEVSUk9SX0NPREVDX01BWCk7Cit9CisKKy8vIGNvbnZlcnRzIGFuIE9NWCBlcnJvciB0byBhIHN0YXR1c190CitzdGF0aWMgaW5saW5lIHN0YXR1c190IHN0YXR1c0Zyb21PTVhFcnJvcihpbnQzMl90IG9teEVycm9yKSB7CisgICAgc3dpdGNoIChvbXhFcnJvcikgeworICAgIGNhc2UgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU6CisgICAgY2FzZSBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZDoKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOyAvLyBjYW4gdHJpZ2dlciBpbGxlZ2FsIGFyZ3VtZW50IGVycm9yIGZvciBwcm92aWRlZCBuYW1lcy4KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gaXNPTVhFcnJvcihvbXhFcnJvcikgPyBvbXhFcnJvciA6IDA7IC8vIG5vIHRyYW5zbGF0aW9uIHJlcXVpcmVkCisgICAgfQorfQorCisvLyBjaGVja3MgYW5kIGNvbnZlcnRzIHN0YXR1c190IHRvIGEgbm9uLXNpZGUtZWZmZWN0IHN0YXR1c190CitzdGF0aWMgaW5saW5lIHN0YXR1c190IG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoc3RhdHVzX3QgZXJyKSB7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAvLyB0aGUgZm9sbG93aW5nIGVycm9ycyBoYXZlIHNpZGUgZWZmZWN0cyBhbmQgbWF5IGNvbWUKKyAgICAvLyBmcm9tIG90aGVyIGNvZGUgbW9kdWxlcy4gUmVtYXAgZm9yIHNhZmV0eSByZWFzb25zLgorICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9Cit9CisKIHRlbXBsYXRlPGNsYXNzIFQ+CiBzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgewogICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CkBAIC02NCw3ICsxMTUsNyBAQAogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CiAKICAgICAgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIG9teF9tc2cudHlwZSk7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcigibm9kZSIsIG9teF9tc2cubm9kZSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIm5vZGUiLCBvbXhfbXNnLm5vZGUpOwogCiAgICAgICAgIHN3aXRjaCAob214X21zZy50eXBlKSB7CiAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpFVkVOVDoKQEAgLTc3LDEzICsxMjgsMTMgQEAKIAogICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKCJidWZmZXIiLCBvbXhfbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJidWZmZXIiLCBvbXhfbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORToKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoCisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIiLCBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyKTsKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlX29mZnNldCIsCkBAIC05NywxMiArMTQ4LDYgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1fcHJpdmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucGxhdGZvcm1fcHJpdmF0ZSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFfcHRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5kYXRhX3B0cik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTE1Nyw5ICsyMDIsNyBAQAogICAgICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAogICAgICAgICAgICAgc2l6ZV90IHJhbmdlT2Zmc2V0LCBzaXplX3QgcmFuZ2VMZW5ndGgsCiAgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCi0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgICAgICB2b2lkICpkYXRhUHRyKTsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzKTsKIAogICAgIHZvaWQgZ2V0TW9yZUlucHV0RGF0YUlmUG9zc2libGUoKTsKIApAQCAtMzYwLDIyICs0MDMsMjcgQEAKIAogQUNvZGVjOjpBQ29kZWMoKQogICAgIDogbVF1aXJrcygwKSwKLSAgICAgIG1Ob2RlKE5VTEwpLAorICAgICAgbU5vZGUoMCksCiAgICAgICBtU2VudEZvcm1hdChmYWxzZSksCiAgICAgICBtSXNFbmNvZGVyKGZhbHNlKSwKICAgICAgIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dChmYWxzZSksCiAgICAgICBtRmF0YWxFcnJvcihmYWxzZSksCiAgICAgICBtU2h1dGRvd25JblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1Jc0NvbmZpZ3VyZWRGb3JBZGFwdGl2ZVBsYXliYWNrKGZhbHNlKSwKKyAgICAgIG1FeHBsaWNpdFNodXRkb3duKGZhbHNlKSwKICAgICAgIG1FbmNvZGVyRGVsYXkoMCksCiAgICAgICBtRW5jb2RlclBhZGRpbmcoMCksCisgICAgICBtUm90YXRpb25EZWdyZWVzKDApLAogICAgICAgbUNoYW5uZWxNYXNrUHJlc2VudChmYWxzZSksCiAgICAgICBtQ2hhbm5lbE1hc2soMCksCiAgICAgICBtRGVxdWV1ZUNvdW50ZXIoMCksCiAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyhmYWxzZSksCiAgICAgICBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQoMCksCiAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzKC0xbGwpLAotICAgICAgbU1heFB0c0dhcFVzKC0xbCkgeworICAgICAgbU1heFB0c0dhcFVzKC0xbGwpLAorICAgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAorICAgICAgbVRpbWVQZXJDYXB0dXJlVXMoLTFsbCksCisgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKGZhbHNlKSwKKyAgICAgIG1UdW5uZWxlZChmYWxzZSkgewogICAgIG1VbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgVW5pbml0aWFsaXplZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRTdGF0ZSA9IG5ldyBMb2FkZWRTdGF0ZSh0aGlzKTsKICAgICBtTG9hZGVkVG9JZGxlU3RhdGUgPSBuZXcgTG9hZGVkVG9JZGxlU3RhdGUodGhpcyk7CkBAIC00NTEsNiArNDk5LDEwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCBpZCgpKTsKICAgICBtc2ctPnNldEludDMyKCJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwga2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAgICAgbXNnLT5wb3N0KCk7CisgICAgaWYgKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgICAgIC8vIGVuc3VyZSBzaHV0ZG93biBjb21wbGV0ZXMgaW4gMyBzZWNvbmRzCisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSwgaWQoKSkpLT5wb3N0KDMwMDAwMDApOworICAgIH0KIH0KIAogdm9pZCBBQ29kZWM6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKQEAgLTQ5MSw3ICs1NDMsNyBAQAogICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAlbHUgYnVmZmVycyBvZiBzaXplICVsdSBvbiAlcyBwb3J0IiwKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBvZiBzaXplICV1IG9uICVzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBkZWYubkJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOwpAQCAtNTQ3LDcgKzU5OSw3IEBACiAgICAgfQogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRCdWZmZXJzQWxsb2NhdGVkKTsKIAogICAgIG5vdGlmeS0+c2V0SW50MzIoInBvcnRJbmRleCIsIHBvcnRJbmRleCk7CiAKQEAgLTU5MSw2ICs2NDMsMjcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAobVJvdGF0aW9uRGVncmVlcyAhPSAwKSB7CisgICAgICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IDA7CisgICAgICAgIHN3aXRjaCAobVJvdGF0aW9uRGVncmVlcykgeworICAgICAgICAgICAgY2FzZSAwOiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTgwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8xODA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNzA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzI3MDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFuc2Zvcm0gPiAwKSB7CisgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybSBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBTZXQgdXAgdGhlIG5hdGl2ZSB3aW5kb3cuCiAgICAgT01YX1UzMiB1c2FnZSA9IDA7CiAgICAgZXJyID0gbU9NWC0+Z2V0R3JhcGhpY0J1ZmZlclVzYWdlKG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCAmdXNhZ2UpOwpAQCAtNjMyLDYgKzcwNSwyMSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIC8vIEV4aXRzIGhlcmUgZm9yIHR1bm5lbGVkIHZpZGVvIHBsYXliYWNrIGNvZGVjcyAtLSBpLmUuIHNraXBzIG5hdGl2ZSB3aW5kb3cKKyAgICAvLyBidWZmZXIgYWxsb2NhdGlvbiBzdGVwIGFzIHRoaXMgaXMgbWFuYWdlZCBieSB0aGUgdHVubmVsZWQgT01YIG9tcG9uZW50CisgICAgLy8gaXRzZWxmIGFuZCBleHBsaWNpdGx5IHNldHMgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCB0byAwLgorICAgIGlmIChtVHVubmVsZWQpIHsKKyAgICAgICAgQUxPR1YoIlR1bm5lbGVkIFBsYXliYWNrOiBza2lwcGluZyBuYXRpdmUgd2luZG93IGJ1ZmZlciBhbGxvY2F0aW9uLiIpOworICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gMDsKKyAgICAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICAgICAgKm1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgKmJ1ZmZlckNvdW50ID0gMDsKKyAgICAgICAgKmJ1ZmZlclNpemUgPSAwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgICptaW5VbmRlcXVldWVkQnVmZmVycyA9IDA7CiAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCkBAIC02NDMsMTggKzczMSwzNCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIC8vIFhYWDogSXMgdGhpcyB0aGUgcmlnaHQgbG9naWMgdG8gdXNlPyAgSXQncyBub3QgY2xlYXIgdG8gbWUgd2hhdCB0aGUgT01YCi0gICAgLy8gYnVmZmVyIGNvdW50cyByZWZlciB0byAtIGhvdyBkbyB0aGV5IGFjY291bnQgZm9yIHRoZSByZW5kZXJlciBob2xkaW5nIG9uCi0gICAgLy8gdG8gYnVmZmVycz8KLSAgICBpZiAoZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA8IGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpIHsKLSAgICAgICAgT01YX1UzMiBuZXdCdWZmZXJDb3VudCA9IGRlZi5uQnVmZmVyQ291bnRNaW4gKyAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CisgICAgLy8gRklYTUU6IGFzc3VtZSB0aGF0IHN1cmZhY2UgaXMgY29udHJvbGxlZCBieSBhcHAgKG5hdGl2ZSB3aW5kb3cKKyAgICAvLyByZXR1cm5zIHRoZSBudW1iZXIgZm9yIHRoZSBjYXNlIHdoZW4gc3VyZmFjZSBpcyBub3QgY29udHJvbGxlZCBieSBhcHApCisgICAgLy8gRklYTUUyOiBUaGlzIG1lYW5zIHRoYXQgbWluVW5kZXFldWV1ZEJ1ZnMgY2FuIGJlIDEgbGFyZ2VyIHRoYW4gcmVwb3J0ZWQKKyAgICAvLyBGb3Igbm93LCB0cnkgdG8gYWxsb2NhdGUgMSBtb3JlIGJ1ZmZlciwgYnV0IGRvbid0IGZhaWwgaWYgdW5zdWNjZXNzZnVsCisKKyAgICAvLyBVc2UgY29uc2VydmF0aXZlIGFsbG9jYXRpb24gd2hpbGUgYWxzbyB0cnlpbmcgdG8gcmVkdWNlIHN0YXJ2YXRpb24KKyAgICAvLworICAgIC8vIDEuIGFsbG9jYXRlIGF0IGxlYXN0IG5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZmZXJzIC0gdGhhdCBpcyB0aGUKKyAgICAvLyAgICBtaW5pbXVtIG5lZWRlZCBmb3IgdGhlIGNvbnN1bWVyIHRvIGJlIGFibGUgdG8gd29yaworICAgIC8vIDIuIHRyeSB0byBhbGxvY2F0ZSB0d28gKDIpIGFkZGl0aW9uYWwgYnVmZmVycyB0byByZWR1Y2Ugc3RhcnZhdGlvbiBmcm9tCisgICAgLy8gICAgdGhlIGNvbnN1bWVyCisgICAgLy8gICAgcGx1cyBhbiBleHRyYSBidWZmZXIgdG8gYWNjb3VudCBmb3IgaW5jb3JyZWN0IG1pblVuZGVxdWV1ZWRCdWZzCisgICAgZm9yIChPTVhfVTMyIGV4dHJhQnVmZmVycyA9IDIgKyAxOyAvKiBjb25kaXRpb24gaW5zaWRlIGxvb3AgKi87IGV4dHJhQnVmZmVycy0tKSB7CisgICAgICAgIE9NWF9VMzIgbmV3QnVmZmVyQ291bnQgPQorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiArICptaW5VbmRlcXVldWVkQnVmZmVycyArIGV4dHJhQnVmZmVyczsKICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IG5ld0J1ZmZlckNvdW50OwogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKIAotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWyVzXSBzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAlbHUgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAqbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgKz0gZXh0cmFCdWZmZXJzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVygiWyVzXSBzZXR0aW5nIG5CdWZmZXJDb3VudEFjdHVhbCB0byAldSBmYWlsZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgLyogZXhpdCBjb25kaXRpb24gKi8KKyAgICAgICAgaWYgKGV4dHJhQnVmZmVycyA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpAQCAtNjc5LDggKzc4Myw5IEBACiAgICAgICAgICAgICAmYnVmZmVyQ291bnQsICZidWZmZXJTaXplLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwogICAgIGlmIChlcnIgIT0gMCkKICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMgPSBtaW5VbmRlcXVldWVkQnVmZmVyczsKIAotICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJWx1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAlbHUgb24gIgorICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICV1IG9uICIKICAgICAgICAgICJvdXRwdXQgcG9ydCIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJDb3VudCwgYnVmZmVyU2l6ZSk7CiAKQEAgLTcwNCwxNCArODA5LDE0IEBACiAgICAgICAgIGVyciA9IG1PTVgtPnVzZUdyYXBoaWNCdWZmZXIobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIGdyYXBoaWNCdWZmZXIsCiAgICAgICAgICAgICAgICAgJmJ1ZmZlcklkKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVnaXN0ZXJpbmcgR3JhcGhpY0J1ZmZlciAlbHUgd2l0aCBPTVggSUwgY29tcG9uZW50IGZhaWxlZDogIgorICAgICAgICAgICAgQUxPR0UoInJlZ2lzdGVyaW5nIEdyYXBoaWNCdWZmZXIgJXUgd2l0aCBPTVggSUwgY29tcG9uZW50IGZhaWxlZDogIgogICAgICAgICAgICAgICAgICAiJWQiLCBpLCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpLm1CdWZmZXJJRCA9IGJ1ZmZlcklkOwogCi0gICAgICAgIEFMT0dWKCJbJXNdIFJlZ2lzdGVyZWQgZ3JhcGhpYyBidWZmZXIgd2l0aCBJRCAlcCAocG9pbnRlciA9ICVwKSIsCisgICAgICAgIEFMT0dWKCJbJXNdIFJlZ2lzdGVyZWQgZ3JhcGhpYyBidWZmZXIgd2l0aCBJRCAldSAocG9pbnRlciA9ICVwKSIsCiAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICBidWZmZXJJZCwgZ3JhcGhpY0J1ZmZlci5nZXQoKSk7CiAgICAgfQpAQCAtNzMyLDcgKzgzNywxMCBAQAogCiAgICAgZm9yIChPTVhfVTMyIGkgPSBjYW5jZWxTdGFydDsgaSA8IGNhbmNlbEVuZDsgaSsrKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgICAgIHN0YXR1c190IGVycm9yID0gY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgZXJyID0gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gZXJyOwpAQCAtNzQ0LDggKzg1Miw5IEBACiAgICAgICAgICAgICAmYnVmZmVyQ291bnQsICZidWZmZXJTaXplLCAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwogICAgIGlmIChlcnIgIT0gMCkKICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMgPSBtaW5VbmRlcXVldWVkQnVmZmVyczsKIAotICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJWx1IG1ldGEgYnVmZmVycyBvbiBvdXRwdXQgcG9ydCIsCisgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBtZXRhIGJ1ZmZlcnMgb24gb3V0cHV0IHBvcnQiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQpOwogCiAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGJ1ZmZlckNvdW50ICogODsKQEAgLTc3MSw3ICs4ODAsNyBAQAogCiAgICAgICAgIG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnB1c2goaW5mbyk7CiAKLSAgICAgICAgQUxPR1YoIlslc10gYWxsb2NhdGVkIG1ldGEgYnVmZmVyIHdpdGggSUQgJXAgKHBvaW50ZXIgPSAlcCkiLAorICAgICAgICBBTE9HVigiWyVzXSBhbGxvY2F0ZWQgbWV0YSBidWZmZXIgd2l0aCBJRCAldSAocG9pbnRlciA9ICVwKSIsCiAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby5tQnVmZmVySUQsIG1lbS0+cG9pbnRlcigpKTsKICAgICB9CiAKQEAgLTc4OCw3ICs4OTcsNyBAQAogICAgIGlmIChpbmZvID09IE5VTEwpCiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKIAotICAgIEFMT0dWKCJbJXNdIHN1Ym1pdHRpbmcgb3V0cHV0IG1ldGEgYnVmZmVyIElEICVwIGZvciBncmFwaGljIGJ1ZmZlciAlcCIsCisgICAgQUxPR1YoIlslc10gc3VibWl0dGluZyBvdXRwdXQgbWV0YSBidWZmZXIgSUQgJXUgZm9yIGdyYXBoaWMgYnVmZmVyICVwIiwKICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQsIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpKTsKIAogICAgIC0tbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0OwpAQCAtODAyLDE3ICs5MTEsMTggQEAKIHN0YXR1c190IEFDb2RlYzo6Y2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coQnVmZmVySW5mbyAqaW5mbykgewogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CiAKLSAgICBBTE9HVigiWyVzXSBDYWxsaW5nIGNhbmNlbEJ1ZmZlciBvbiBidWZmZXIgJXAiLAorICAgIEFMT0dWKCJbJXNdIENhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAldSIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgaW50IGVyciA9IG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIC0xKTsKIAotICAgIENIRUNLX0VRKGVyciwgMCk7CisgICAgQUxPR1dfSUYoZXJyICE9IDAsICJbJXNdIGNhbiBub3QgcmV0dXJuIGJ1ZmZlciAldSB0byBuYXRpdmUgd2luZG93IiwKKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVzsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gZXJyOwogfQogCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CkBAIC04MjAsNiArOTMwLDEyIEBACiAgICAgaW50IGZlbmNlRmQgPSAtMTsKICAgICBDSEVDSyhtTmF0aXZlV2luZG93LmdldCgpICE9IE5VTEwpOwogCisgICAgaWYgKG1UdW5uZWxlZCkgeworICAgICAgICBBTE9HVygiZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB0dW5uZWwiCisgICAgICAgICAgICAgICIgdmlkZW8gcGxheWJhY2sgbW9kZSBtb2RlISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBpZiAobUZhdGFsRXJyb3IpIHsKICAgICAgICAgQUxPR1coIm5vdCBkZXF1ZXVpbmcgZnJvbSBuYXRpdmUgd2luZG93IGR1ZSB0byBmYXRhbCBlcnJvciIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTkxOSw3ICsxMDM1LDcgQEAKIAogICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwKICAgICAgICAgICAgICYmIGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKSk7CisgICAgICAgIGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pOwogICAgIH0KIAogICAgIENIRUNLX0VRKG1PTVgtPmZyZWVCdWZmZXIoCkBAIC05NzMsMTIgKzEwODksMTYgQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpb19lbmNvZGVyLmFhYyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCAiYXVkaW9fZW5jb2Rlci52b3JiaXMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLm9wdXMiLCAiYXVkaW9fZW5jb2Rlci5vcHVzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMW1sYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciLCAiYXVkaW9fZW5jb2Rlci5nNzExYWxhdyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsCiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdmMiLCAidmlkZW9fZW5jb2Rlci5hdmMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmhldmMiLCAidmlkZW9fZW5jb2Rlci5oZXZjIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIubXBlZzQiLCAidmlkZW9fZW5jb2Rlci5tcGVnNCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLApAQCAtMTA0OCw2ICsxMTY4LDkgQEAKICAgICAgICAgZW5jb2RlciA9IGZhbHNlOwogICAgIH0KIAorICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKwogICAgIG1Jc0VuY29kZXIgPSBlbmNvZGVyOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc2V0Q29tcG9uZW50Um9sZShlbmNvZGVyIC8qIGlzRW5jb2RlciAqLywgbWltZSk7CkBAIC0xMTMwLDc0ICsxMjUzLDEyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsICZtTWF4UHRzR2FwVXMpKSB7Ci0gICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWw7CisgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAtMWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZS1sYXBzZSIsICZtVGltZVBlckNhcHR1cmVVcykpIHsKKyAgICAgICAgICAgIG1UaW1lUGVyQ2FwdHVyZVVzID0gLTFsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpKSB7CisgICAgICAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBBbHdheXMgdHJ5IHRvIGVuYWJsZSBkeW5hbWljIG91dHB1dCBidWZmZXJzIG9uIG5hdGl2ZSBzdXJmYWNlCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIGludDMyX3QgaGF2ZU5hdGl2ZVdpbmRvdyA9IG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopICYmCi0gICAgICAgICAgICBvYmogIT0gTlVMTDsKKyAgICAgICAgb2JqICE9IE5VTEw7CiAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSBmYWxzZTsKLSAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgIGlmICh2aWRlbyAmJiAhZW5jb2RlcikgeworICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgZmFsc2UpOworICAgIH0KICAgICBpZiAoIWVuY29kZXIgJiYgdmlkZW8gJiYgaGF2ZU5hdGl2ZVdpbmRvdykgewotICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgZmFpbGVkIHcvIGVyciAlZCIsCi0gICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiB3aW5kb3dXcmFwcGVyKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKSk7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHdpbmRvd1dyYXBwZXItPmdldE5hdGl2ZVdpbmRvdygpOwogCi0gICAgICAgICAgICAvLyBpZiBhZGFwdGl2ZSBwbGF5YmFjayBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRyeSBKQiBmYWxsYmFjawotICAgICAgICAgICAgLy8gTk9URTogVEhJUyBGQUxMQkFDSyBNRUNIQU5JU00gV0lMTCBCRSBSRU1PVkVEIERVRSBUTyBJVFMKLSAgICAgICAgICAgIC8vIExBUkdFIE1FTU9SWSBSRVFVSVJFTUVOVAorICAgICAgICBpbnQzMl90IHR1bm5lbGVkOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siLCAmdHVubmVsZWQpICYmCisgICAgICAgICAgICB0dW5uZWxlZCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgVFVOTkVMRUQgdmlkZW8gcGxheWJhY2suIik7CisgICAgICAgICAgICBtVHVubmVsZWQgPSB0cnVlOwogCi0gICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCBkbyBhZGFwdGl2ZSBwbGF5YmFjayBvbiBzb2Z0d2FyZSBhY2Nlc3NlZAotICAgICAgICAgICAgLy8gc3VyZmFjZXMgYXMgdGhleSBuZXZlciBoYWQgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIGluIHRoZQotICAgICAgICAgICAgLy8gY3JvcCB3aW5kb3csIGFuZCB3ZSBkb24ndCB0cnVzdCB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvLgotICAgICAgICAgICAgaW50IHVzYWdlQml0cyA9IDA7Ci0gICAgICAgICAgICBib29sIGNhbkRvQWRhcHRpdmVQbGF5YmFjazsKLQotICAgICAgICAgICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gd2luZG93V3JhcHBlcigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHdpbmRvd1dyYXBwZXItPmdldE5hdGl2ZVdpbmRvdygpOwotCi0gICAgICAgICAgICBpZiAobmF0aXZlV2luZG93LT5xdWVyeSgKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsCi0gICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgY2FuRG9BZGFwdGl2ZVBsYXliYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNhbkRvQWRhcHRpdmVQbGF5YmFjayA9Ci0gICAgICAgICAgICAgICAgICAgICh1c2FnZUJpdHMgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykpID09IDA7CisgICAgICAgICAgICBpbnQzMl90IGF1ZGlvSHdTeW5jID0gMDsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImF1ZGlvLWh3LXN5bmMiLCAmYXVkaW9Id1N5bmMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk5vIEF1ZGlvIEhXIFN5bmMgcHJvdmlkZWQgZm9yIHZpZGVvIHR1bm5lbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKGF1ZGlvSHdTeW5jLCBuYXRpdmVXaW5kb3cpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soJWQsJXApIGZhaWxlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Id1N5bmMsIG5hdGl2ZVdpbmRvdy5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7Ci0gICAgICAgICAgICBpZiAoY2FuRG9BZGFwdGl2ZVBsYXliYWNrICYmCi0gICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC13aWR0aCIsICZtYXhXaWR0aCkgJiYKLSAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigibWF4LWhlaWdodCIsICZtYXhIZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soJWxkeCVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1heFdpZHRoLCBtYXhIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIG1heFdpZHRoLCBtYXhIZWlnaHQpOwotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywKLSAgICAgICAgICAgICAgICAgICAgICAgICJbJXNdIHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIGZhaWxlZCB3LyBlcnIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKLSAgICAgICAgICAgICAgICBtSXNDb25maWd1cmVkRm9yQWRhcHRpdmVQbGF5YmFjayA9IChlcnIgPT0gT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gYWxsb3cgZmFpbHVyZQotICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgdHJ1ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIHN1Y2NlZWRlZCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgPSB0cnVlOwotICAgICAgICAgICAgbUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoIkNvbmZpZ3VyaW5nIENQVSBjb250cm9sbGVkIHZpZGVvIHBsYXliYWNrLiIpOworICAgICAgICAgICAgbVR1bm5lbGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIEFsd2F5cyB0cnkgdG8gZW5hYmxlIGR5bmFtaWMgb3V0cHV0IGJ1ZmZlcnMgb24gbmF0aXZlIHN1cmZhY2UKKyAgICAgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlslc10gc3RvcmVNZXRhRGF0YUluQnVmZmVycyBmYWlsZWQgdy8gZXJyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisKKyAgICAgICAgICAgICAgICAvLyBpZiBhZGFwdGl2ZSBwbGF5YmFjayBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRyeSBKQiBmYWxsYmFjaworICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRISVMgRkFMTEJBQ0sgTUVDSEFOSVNNIFdJTEwgQkUgUkVNT1ZFRCBEVUUgVE8gSVRTCisgICAgICAgICAgICAgICAgLy8gTEFSR0UgTUVNT1JZIFJFUVVJUkVNRU5UCisKKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG5vdCBkbyBhZGFwdGl2ZSBwbGF5YmFjayBvbiBzb2Z0d2FyZSBhY2Nlc3NlZAorICAgICAgICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIHRoZXkgbmV2ZXIgaGFkIHRvIHJlc3BvbmQgdG8gY2hhbmdlcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBjcm9wIHdpbmRvdywgYW5kIHdlIGRvbid0IHRydXN0IHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8uCisgICAgICAgICAgICAgICAgaW50IHVzYWdlQml0cyA9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBjYW5Eb0FkYXB0aXZlUGxheWJhY2s7CisKKyAgICAgICAgICAgICAgICBpZiAobmF0aXZlV2luZG93LT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbkRvQWRhcHRpdmVQbGF5YmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbkRvQWRhcHRpdmVQbGF5YmFjayA9CisgICAgICAgICAgICAgICAgICAgICAgICAodXNhZ2VCaXRzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSykpID09IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGNhbkRvQWRhcHRpdmVQbGF5YmFjayAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoIm1heC13aWR0aCIsICZtYXhXaWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soJWR4JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsIG1heFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWyVzXSBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayBmYWlsZWQgdy8gZXJyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigibWF4LXdpZHRoIiwgbWF4V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJtYXgtaGVpZ2h0IiwgbWF4SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbGxvdyBmYWlsdXJlCisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgc3VjY2VlZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgcHVzaDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIiwgJnB1c2gpCisgICAgICAgICAgICAgICAgICAgICYmIHB1c2ggIT0gMCkgeworICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd247CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IHB1c2g7Ci0gICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIiwgJnB1c2gpCi0gICAgICAgICAgICAgICAgJiYgcHVzaCAhPSAwKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdQdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3dPblNodXRkb3duOworICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIwNSwxMyArMTM3OCw3IEBACiAgICAgICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRW5jb2RlcihtaW1lLCBtc2cpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gc2V0dXBWaWRlb0RlY29kZXIobWltZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBzZXR1cFZpZGVvRGVjb2RlcihtaW1lLCBtc2cpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtMTIzMywxNiArMTQwMCw1MiBAQAogICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQzMl90IGlzQURUUywgYWFjUHJvZmlsZTsKKyAgICAgICAgICAgIGludDMyX3Qgc2JyTW9kZTsKKyAgICAgICAgICAgIGludDMyX3QgbWF4T3V0cHV0Q2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBwY21MaW1pdGVyRW5hYmxlOworICAgICAgICAgICAgZHJjUGFyYW1zX3QgZHJjOwogICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaXMtYWR0cyIsICZpc0FEVFMpKSB7CiAgICAgICAgICAgICAgICAgaXNBRFRTID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1wcm9maWxlIiwgJmFhY1Byb2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgYWFjUHJvZmlsZSA9IE9NWF9BVURJT19BQUNPYmplY3ROdWxsOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLXNici1tb2RlIiwgJnNick1vZGUpKSB7CisgICAgICAgICAgICAgICAgc2JyTW9kZSA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtbWF4LW91dHB1dC1jaGFubmVsX2NvdW50IiwgJm1heE91dHB1dENoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgICAgICBtYXhPdXRwdXRDaGFubmVsQ291bnQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1wY20tbGltaXRlci1lbmFibGUiLCAmcGNtTGltaXRlckVuYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgcGNtTGltaXRlckVuYWJsZSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIiwgJmRyYy5lbmNvZGVkVGFyZ2V0TGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5lbmNvZGVkVGFyZ2V0TGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1kcmMtY3V0LWxldmVsIiwgJmRyYy5kcmNDdXQpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5kcmNDdXQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1kcmMtYm9vc3QtbGV2ZWwiLCAmZHJjLmRyY0Jvb3N0KSkgeworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHVua25vd24KKyAgICAgICAgICAgICAgICBkcmMuZHJjQm9vc3QgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFhYy1kcmMtaGVhdnktY29tcHJlc3Npb24iLCAmZHJjLmhlYXZ5Q29tcHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy5oZWF2eUNvbXByZXNzaW9uID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhYWMtdGFyZ2V0LXJlZi1sZXZlbCIsICZkcmMudGFyZ2V0UmVmTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgIGRyYy50YXJnZXRSZWZMZXZlbCA9IC0xOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBlcnIgPSBzZXR1cEFBQ0NvZGVjKAogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgYml0UmF0ZSwgYWFjUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgaXNBRFRTICE9IDApOworICAgICAgICAgICAgICAgICAgICBpc0FEVFMgIT0gMCwgc2JyTW9kZSwgbWF4T3V0cHV0Q2hhbm5lbENvdW50LCBkcmMsCisgICAgICAgICAgICAgICAgICAgIHBjbUxpbWl0ZXJFbmFibGUpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7CiAgICAgICAgIGVyciA9IHNldHVwQU1SQ29kZWMoZW5jb2RlciwgZmFsc2UgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKQEAgLTEyNjksOCArMTQ3MiwxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4aXR5IiwgJmNvbXByZXNzaW9uTGV2ZWwpICYmCisgICAgICAgICAgICAgICAgICAgICFtc2ctPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCIsICZjb21wcmVzc2lvbkxldmVsKSkgewotICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbkxldmVsID0gNTsvLyBkZWZhdWx0IEZMQUMgY29tcHJlc3Npb24gbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25MZXZlbCA9IDU7IC8vIGRlZmF1bHQgRkxBQyBjb21wcmVzc2lvbiBsZXZlbAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcHJlc3Npb25MZXZlbCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbXByZXNzaW9uIGxldmVsICVkIG91dHNpZGUgWzAuLjhdIHJhbmdlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAwIiwKQEAgLTEzMzEsNiArMTUzNiwxMSBAQAogICAgICAgICBlcnIgPSBzZXRNaW5CdWZmZXJTaXplKGtQb3J0SW5kZXhJbnB1dCwgODE5Mik7ICAvLyBYWFgKICAgICB9CiAKKyAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhJbnB1dCwgaW5wdXRGb3JtYXQpLCAoc3RhdHVzX3QpT0spOworICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgb3V0cHV0Rm9ybWF0KSwgKHN0YXR1c190KU9LKTsKKyAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBtT3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OworCiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTM5OSw3ICsxNjA5LDkgQEAKIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFBQ0NvZGVjKAogICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50MzJfdCBiaXRSYXRlLCBpbnQzMl90IGFhY1Byb2ZpbGUsIGJvb2wgaXNBRFRTKSB7CisgICAgICAgIGludDMyX3QgYml0UmF0ZSwgaW50MzJfdCBhYWNQcm9maWxlLCBib29sIGlzQURUUywgaW50MzJfdCBzYnJNb2RlLAorICAgICAgICBpbnQzMl90IG1heE91dHB1dENoYW5uZWxDb3VudCwgY29uc3QgZHJjUGFyYW1zX3QmIGRyYywKKyAgICAgICAgaW50MzJfdCBwY21MaW1pdGVyRW5hYmxlKSB7CiAgICAgaWYgKGVuY29kZXIgJiYgaXNBRFRTKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTE0NjYsNiArMTY3OCwzMiBAQAogICAgICAgICBwcm9maWxlLm5BQUNFUnRvb2xzID0gT01YX0FVRElPX0FBQ0VSTm9uZTsKICAgICAgICAgcHJvZmlsZS5lQUFDUHJvZmlsZSA9IChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY1Byb2ZpbGU7CiAgICAgICAgIHByb2ZpbGUuZUFBQ1N0cmVhbUZvcm1hdCA9IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKKyAgICAgICAgc3dpdGNoIChzYnJNb2RlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8vIGRpc2FibGUgc2JyCisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8vIGVuYWJsZSBzaW5nbGUtcmF0ZSBzYnIKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvLyBlbmFibGUgZHVhbC1yYXRlIHNicgorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICBwcm9maWxlLm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICAvLyBlbmFibGUgYm90aCBtb2RlcyAtPiB0aGUgY29kZWMgd2lsbCBkZWNpZGUgd2hpY2ggbW9kZSBzaG91bGQgYmUgdXNlZAorICAgICAgICAgICAgcHJvZmlsZS5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHNiciBtb2RlCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKIAogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOwpAQCAtMTQ5Niw4ICsxNzM0LDI1IEBACiAgICAgICAgICAgICA/IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRBRFRTCiAgICAgICAgICAgICA6IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKIAotICAgIHJldHVybiBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb247CisgICAgSW5pdE9NWFBhcmFtcygmcHJlc2VudGF0aW9uKTsKKyAgICBwcmVzZW50YXRpb24ubk1heE91dHB1dENoYW5uZWxzID0gbWF4T3V0cHV0Q2hhbm5lbENvdW50OworICAgIHByZXNlbnRhdGlvbi5uRHJjQ3V0ID0gZHJjLmRyY0N1dDsKKyAgICBwcmVzZW50YXRpb24ubkRyY0Jvb3N0ID0gZHJjLmRyY0Jvb3N0OworICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbiA9IGRyYy5oZWF2eUNvbXByZXNzaW9uOworICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSBkcmMudGFyZ2V0UmVmTGV2ZWw7CisgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBkcmMuZW5jb2RlZFRhcmdldExldmVsOworICAgIHByZXNlbnRhdGlvbi5uUENNTGltaXRlckVuYWJsZSA9IHBjbUxpbWl0ZXJFbmFibGU7CisKKyAgICBzdGF0dXNfdCByZXMgPSBtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwcm9maWxlLCBzaXplb2YocHJvZmlsZSkpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycywgd2lsbCBub3QgY2F1c2UgY29uZmlndXJhdGlvbiBmYWlsdXJlCisgICAgICAgIG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJkaWQgbm90IHNldCBBdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24gZHVlIHRvIGVycm9yICVkIHdoZW4gc2V0dGluZyBBdWRpb0FhYyIsIHJlcyk7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBBQzNDb2RlYygKQEAgLTE2OTQsNiArMTk0OSwyNyBAQAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwY21QYXJhbXMsIHNpemVvZihwY21QYXJhbXMpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soCisgICAgICAgIGludDMyX3QgYXVkaW9Id1N5bmMsIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3cpIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIHNpZGViYW5kSGFuZGxlOworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCBhdWRpb0h3U3luYywgJnNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUgZmFpbGVkISAoZXJyICVkKS4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NpZGViYW5kX3N0cmVhbShuYXRpdmVXaW5kb3cuZ2V0KCksIHNpZGViYW5kSGFuZGxlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oJXApIGZhaWxlZCEgKGVyciAlZCkuIiwKKyAgICAgICAgICAgICAgICBzaWRlYmFuZEhhbmRsZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCiAgICAgICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0LApAQCAtMTcxNSw2ICsxOTkxLDE3IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gc3Vic3RpdHV0ZSBiYWNrIGZsZXhpYmxlIGNvbG9yIGZvcm1hdCB0byBjb2RlYyBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgIE9NWF9VMzIgZmxleGlibGVFcXVpdmFsZW50OworICAgICAgICBpZiAoY29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ1VudXNlZCAmJgorICAgICAgICAgICAgICAgIGlzRmxleGlibGVDb2xvckZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PTVgsIG1Ob2RlLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCAmZmxleGlibGVFcXVpdmFsZW50KSAmJgorICAgICAgICAgICAgICAgIGNvbG9yRm9ybWF0ID09IGZsZXhpYmxlRXF1aXZhbGVudCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gdXNpbmcgY29sb3IgZm9ybWF0ICUjeCBpbiBwbGFjZSBvZiAlI3giLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBmb3JtYXQuZUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGZvcm1hdC5lQ29sb3JGb3JtYXQ7CisgICAgICAgIH0KKwogICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiBpcyB2aW9sYXRlZCBieSBUSSdzIHZpZGVvIGRlY29kZXIuCiAgICAgICAgIC8vIENIRUNLX0VRKGZvcm1hdC5uSW5kZXgsIGluZGV4KTsKIApAQCAtMTc3NSw2ICsyMDYyLDcgQEAKICAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBtVmlkZW9Db2RpbmdUeXBlOwogfSBrVmlkZW9Db2RpbmdNYXBFbnRyeVtdID0gewogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBPTVhfVklERU9fQ29kaW5nQVZDIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCBPTVhfVklERU9fQ29kaW5nSEVWQyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIE9NWF9WSURFT19Db2RpbmdNUEVHNCB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgT01YX1ZJREVPX0NvZGluZ0gyNjMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCBPTVhfVklERU9fQ29kaW5nTVBFRzIgfSwKQEAgLTE4MTUsNyArMjEwMywxMyBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwVmlkZW9EZWNvZGVyKAotICAgICAgICBjb25zdCBjaGFyICptaW1lLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0OwogICAgIHN0YXR1c190IGVyciA9IEdldFZpZGVvQ29kaW5nVHlwZUZyb21NaW1lKG1pbWUsICZjb21wcmVzc2lvbkZvcm1hdCk7CiAKQEAgLTE4MzAsNyArMjEyNCwyMCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIGludDMyX3QgdG1wOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnRtcCkpIHsKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8T01YX0NPTE9SX0ZPUk1BVFRZUEU+KHRtcCk7CisgICAgICAgIGVyciA9IHNldFZpZGVvUG9ydEZvcm1hdFR5cGUoCisgICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgT01YX1ZJREVPX0NvZGluZ1VudXNlZCwgY29sb3JGb3JtYXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiWyVzXSBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBlcnIgPSBzZXRTdXBwb3J0ZWRPdXRwdXRGb3JtYXQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IHNldFN1cHBvcnRlZE91dHB1dEZvcm1hdCgpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE5MjEsNiArMjIyOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICAgICAgbVRpbWVQZXJGcmFtZVVzID0gKGludDY0X3QpICgxMDAwMDAwLjBmIC8gZnJhbWVSYXRlKTsKICAgICB9CiAKICAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAoT01YX1UzMikoZnJhbWVSYXRlICogNjU1MzYuMGYpOwpAQCAtMTk5NSw2ICsyMzAzLDEwIEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdIRVZDOgorICAgICAgICAgICAgZXJyID0gc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA5OgogICAgICAgICAgICAgZXJyID0gc2V0dXBWUFhFbmNvZGVyUGFyYW1ldGVycyhtc2cpOwpAQCAtMjA1Myw3ICsyMzY1LDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIE9NWF9VMzIgcmV0ID0gZnJhbWVSYXRlICogaUZyYW1lc0ludGVydmFsOwotICAgIENIRUNLKHJldCA+IDEpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTIyMjMsNiArMjUzNCw1OCBAQAogICAgIHJldHVybiBzZXR1cEVycm9yQ29ycmVjdGlvblBhcmFtZXRlcnMoKTsKIH0KIAorLy8gc3RhdGljCitpbnQgLyogT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSAqLyBBQ29kZWM6OmdldEFWQ0xldmVsRm9yKAorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByYXRlLCBpbnQgYml0cmF0ZSwKKyAgICAgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHByb2ZpbGUpIHsKKyAgICAvLyBjb252ZXJ0IGJpdHJhdGUgdG8gbWFpbi9iYXNlbGluZSBwcm9maWxlIGticHMgZXF1aXZhbGVudAorICAgIHN3aXRjaCAocHJvZmlsZSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDMwMDApOyBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6CisgICAgICAgICAgICBiaXRyYXRlID0gZGl2VXAoYml0cmF0ZSwgMTI1MCk7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYml0cmF0ZSA9IGRpdlVwKGJpdHJhdGUsIDEwMDApOyBicmVhazsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHNpemUgYW5kIHJhdGUgdG8gTUJzCisgICAgd2lkdGggPSBkaXZVcCh3aWR0aCwgMTYpOworICAgIGhlaWdodCA9IGRpdlVwKGhlaWdodCwgMTYpOworICAgIGludCBtYnMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICByYXRlICo9IG1iczsKKyAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKKyAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KKyAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAorICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKKyAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAorICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKKyAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAorICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKKyAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAorICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKKyAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCisgICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAorICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKKyAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCisgICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUobGltaXRzKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCAoJmxpbWl0KVs1XSA9IGxpbWl0c1tpXTsKKyAgICAgICAgaWYgKHJhdGUgPD0gbGltaXRbMF0gJiYgbWJzIDw9IGxpbWl0WzFdICYmIG1heERpbWVuc2lvbiA8PSBsaW1pdFsyXQorICAgICAgICAgICAgICAgICYmIGJpdHJhdGUgPD0gbGltaXRbM10pIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdFs0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBiaXRyYXRlLCBpRnJhbWVJbnRlcnZhbDsKICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpCkBAIC0yMzMxLDE0ICsyNjk0LDEzOSBAQAogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIAotc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBiaXRyYXRlOwotICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IGJpdHJhdGUsIGlGcmFtZUludGVydmFsOworICAgIGlmICghbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkKKyAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsICZpRnJhbWVJbnRlcnZhbCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOwogCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fSEVWQ1RZUEUgaGV2Y1R5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmaGV2Y1R5cGUpOworICAgIGhldmNUeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9IZXZjLCAmaGV2Y1R5cGUsIHNpemVvZihoZXZjVHlwZSkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgIGludDMyX3QgbGV2ZWw7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChwcm9maWxlLCBsZXZlbCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBoZXZjVHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDUFJPRklMRVRZUEU+KHByb2ZpbGUpOworICAgICAgICBoZXZjVHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSEVWQ0xFVkVMVFlQRT4obGV2ZWwpOworICAgIH0KKworICAgIC8vIFRPRE86IE5lZWQgT01YIHN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciBzZXR0aW5nIGlGcmFtZUludGVydmFsCisKKyAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKK30KKworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBiaXRyYXRlOworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAwOworICAgIHNpemVfdCB0c0xheWVycyA9IDA7CisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIHBhdHRlcm4gPQorICAgICAgICBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uCisgICAgICAgIFtPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU10KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXSA9IHsKKyAgICAgICAgezEwMCwgMTAwLCAxMDB9LCAgLy8gMSBsYXllcgorICAgICAgICB7IDYwLCAxMDAsIDEwMH0sICAvLyAyIGxheWVycyB7NjAlLCA0MCV9CisgICAgICAgIHsgNDAsICA2MCwgMTAwfSwgIC8vIDMgbGF5ZXJzIHs0MCUsIDIwJSwgNDAlfQorICAgIH07CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1zZy0+ZmluZEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKTsKKworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOworCisgICAgZmxvYXQgZnJhbWVSYXRlOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgeworICAgICAgICBpbnQzMl90IHRtcDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICB9CisKKyAgICBBU3RyaW5nIHRzU2NoZW1hOworICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoInRzLXNjaGVtYSIsICZ0c1NjaGVtYSkpIHsKKyAgICAgICAgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjEtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjItbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAyOworICAgICAgICB9IGVsc2UgaWYgKHRzU2NoZW1hID09ICJ3ZWJydGMudnA4LjMtbGF5ZXIiKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOworICAgICAgICAgICAgdHNMYXllcnMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHRzLXNjaGVtYSBbJXNdIiwgdHNTY2hlbWEuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSB2cDh0eXBlOworICAgIEluaXRPTVhQYXJhbXMoJnZwOHR5cGUpOworICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpZiAoaUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICB2cDh0eXBlLm5LZXlGcmFtZUludGVydmFsID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgdnA4dHlwZS5lVGVtcG9yYWxQYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckNvdW50ID0gdHNMYXllcnM7CisgICAgICAgIGlmICh0c0xheWVycyA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIHZwOHR5cGUublRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0gPQorICAgICAgICAgICAgICAgICAgICBrVnA4TGF5ZXJSYXRlQWxsb2N0aW9uW3RzTGF5ZXJzIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpdHJhdGVNb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50KSB7CisgICAgICAgICAgICB2cDh0eXBlLm5NaW5RdWFudGl6ZXIgPSAyOworICAgICAgICAgICAgdnA4dHlwZS5uTWF4UXVhbnRpemVyID0gNjM7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlciwKKyAgICAgICAgICAgICAgICAmdnA4dHlwZSwgc2l6ZW9mKHZwOHR5cGUpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIkV4dGVuZGVkIFZQOCBwYXJhbWV0ZXJzIHNldCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKIH0KIApAQCAtMjQ5NCwxOSArMjk4Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAotICAgICAgICAgICAgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlslc10gTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotCi0gICAgICAgIG1pblVuZGVxdWV1ZWRCdWZzID0gMDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoY291bnRCdWZmZXJzT3duZWRCeU5hdGl2ZVdpbmRvdygpID4gKHNpemVfdCltaW5VbmRlcXVldWVkQnVmcworICAgIHdoaWxlIChjb3VudEJ1ZmZlcnNPd25lZEJ5TmF0aXZlV2luZG93KCkgPiBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMKICAgICAgICAgICAgICYmIGRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGVzZSBidWZmZXJzIHdpbGwgYmUgc3VibWl0dGVkIGFzIHJlZ3VsYXIgYnVmZmVyczsgYWNjb3VudCBmb3IgdGhpcwogICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMgJiYgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgewpAQCAtMjUyMiw3ICsyOTk4LDcgQEAKIAogICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUwogICAgICAgICAgICAgICAgICYmIGluZm8tPm1TdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVykgewotICAgICAgICAgICAgQUxPR1YoIlslc10gQnVmZmVyICVwIG9uIHBvcnQgJWxkIHN0aWxsIGhhcyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgQUxPR1YoIlslc10gQnVmZmVyICV1IG9uIHBvcnQgJXUgc3RpbGwgaGFzIHN0YXR1cyAlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXJJRCwgcG9ydEluZGV4LCBpbmZvLT5tU3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI1NTIsNzkgKzMwMjgsMjkxIEBACiAgICAgfQogfQogCi12b2lkIEFDb2RlYzo6c2VuZEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE91dHB1dEZvcm1hdENoYW5nZWQpOworLy8gc3RhdGljCitib29sIEFDb2RlYzo6ZGVzY3JpYmVEZWZhdWx0Q29sb3JGb3JtYXQoRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmcGFyYW1zKSB7CisgICAgTWVkaWFJbWFnZSAmaW1hZ2UgPSBwYXJhbXMuc01lZGlhSW1hZ2U7CisgICAgbWVtc2V0KCZpbWFnZSwgMCwgc2l6ZW9mKGltYWdlKSk7CiAKKyAgICBpbWFnZS5tVHlwZSA9IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTjsKKyAgICBpbWFnZS5tTnVtUGxhbmVzID0gMDsKKworICAgIGNvbnN0IE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZtdCA9IHBhcmFtcy5lQ29sb3JGb3JtYXQ7CisgICAgaW1hZ2UubVdpZHRoID0gcGFyYW1zLm5GcmFtZVdpZHRoOworICAgIGltYWdlLm1IZWlnaHQgPSBwYXJhbXMubkZyYW1lSGVpZ2h0OworCisgICAgLy8gb25seSBzdXBwb3J0aW5nIFlVVjQyMAorICAgIGlmIChmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciAmJgorICAgICAgICBmbXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgJiYKKyAgICAgICAgZm10ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyKSB7CisgICAgICAgIEFMT0dXKCJkbyBub3Qga25vdyBjb2xvciBmb3JtYXQgMHgleCA9ICVkIiwgZm10LCBmbXQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVEVNUE9SQVJZIEZJWCBmb3Igc29tZSB2ZW5kb3JzIHRoYXQgYWR2ZXJ0aXNlIHNsaWNlSGVpZ2h0IGFzIDAKKyAgICBpZiAocGFyYW1zLm5TdHJpZGUgIT0gMCAmJiBwYXJhbXMublNsaWNlSGVpZ2h0ID09IDApIHsKKyAgICAgICAgQUxPR1coInVzaW5nIHNsaWNlSGVpZ2h0PSV1IGluc3RlYWQgb2Ygd2hhdCBjb2RlYyBhZHZlcnRpc2VkICg9MCkiLAorICAgICAgICAgICAgICAgIHBhcmFtcy5uRnJhbWVIZWlnaHQpOworICAgICAgICBwYXJhbXMublNsaWNlSGVpZ2h0ID0gcGFyYW1zLm5GcmFtZUhlaWdodDsKKyAgICB9CisKKyAgICAvLyB3ZSBuZWVkIHN0cmlkZSBhbmQgc2xpY2UtaGVpZ2h0IHRvIGJlIG5vbi16ZXJvCisgICAgaWYgKHBhcmFtcy5uU3RyaWRlID09IDAgfHwgcGFyYW1zLm5TbGljZUhlaWdodCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJjYW5ub3QgZGVzY3JpYmUgY29sb3IgZm9ybWF0IDB4JXggPSAlZCB3aXRoIHN0cmlkZT0ldSBhbmQgc2xpY2VIZWlnaHQ9JXUiLAorICAgICAgICAgICAgICAgIGZtdCwgZm10LCBwYXJhbXMublN0cmlkZSwgcGFyYW1zLm5TbGljZUhlaWdodCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXQtdXAgWVVWIGZvcm1hdAorICAgIGltYWdlLm1UeXBlID0gTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9ZVVY7CisgICAgaW1hZ2UubU51bVBsYW5lcyA9IDM7CisgICAgaW1hZ2UubUJpdERlcHRoID0gODsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubU9mZnNldCA9IDA7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Db2xJbmMgPSAxOworICAgIGltYWdlLm1QbGFuZVtpbWFnZS5ZXS5tUm93SW5jID0gcGFyYW1zLm5TdHJpZGU7CisgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlldLm1Ib3JpelN1YnNhbXBsaW5nID0gMTsKKyAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuWV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6IC8vIHVzZWQgZm9yIFlWMTIKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgPSBwYXJhbXMublN0cmlkZSAqIHBhcmFtcy5uU2xpY2VIZWlnaHQ7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tT2Zmc2V0ID0gaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKyAocGFyYW1zLm5TdHJpZGUgKiBwYXJhbXMublNsaWNlSGVpZ2h0IC8gNCk7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVJvd0luYyA9IHBhcmFtcy5uU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgLy8gRklYTUU6IE5WMjEgZm9yIHN3LWVuY29kZXIsIE5WMTIgZm9yIGRlY29kZXIgYW5kIGh3LWVuY29kZXIKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIC8vIE5WMTIKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tT2Zmc2V0ID0gcGFyYW1zLm5TdHJpZGUgKiBwYXJhbXMublNsaWNlSGVpZ2h0OworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tT2Zmc2V0ID0gaW1hZ2UubVBsYW5lW2ltYWdlLlVdLm1PZmZzZXQgKyAxOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgaW1hZ2UubVBsYW5lW2ltYWdlLlZdLm1Sb3dJbmMgPSBwYXJhbXMublN0cmlkZTsKKyAgICAgICAgICAgIGltYWdlLm1QbGFuZVtpbWFnZS5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBpbWFnZS5tUGxhbmVbaW1hZ2UuVl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBBQ29kZWM6OmRlc2NyaWJlQ29sb3JGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPElPTVg+ICZvbXgsIElPTVg6Om5vZGVfaWQgbm9kZSwKKyAgICAgICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyAmZGVzY3JpYmVQYXJhbXMpCit7CisgICAgT01YX0lOREVYVFlQRSBkZXNjcmliZUNvbG9yRm9ybWF0SW5kZXg7CisgICAgaWYgKG9teC0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBub2RlLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlQ29sb3JGb3JtYXQiLAorICAgICAgICAgICAgJmRlc2NyaWJlQ29sb3JGb3JtYXRJbmRleCkgIT0gT0sgfHwKKyAgICAgICAgb214LT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBub2RlLCBkZXNjcmliZUNvbG9yRm9ybWF0SW5kZXgsCisgICAgICAgICAgICAmZGVzY3JpYmVQYXJhbXMsIHNpemVvZihkZXNjcmliZVBhcmFtcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBkZXNjcmliZURlZmF1bHRDb2xvckZvcm1hdChkZXNjcmliZVBhcmFtcyk7CisgICAgfQorICAgIHJldHVybiBkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZS5tVHlwZSAhPQorICAgICAgICAgICAgTWVkaWFJbWFnZTo6TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQUNvZGVjOjppc0ZsZXhpYmxlQ29sb3JGb3JtYXQoCisgICAgICAgICBjb25zdCBzcDxJT01YPiAmb214LCBJT01YOjpub2RlX2lkIG5vZGUsCisgICAgICAgICB1aW50MzJfdCBjb2xvckZvcm1hdCwgT01YX1UzMiAqZmxleGlibGVFcXVpdmFsZW50KSB7CisgICAgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyBkZXNjcmliZVBhcmFtczsKKyAgICBJbml0T01YUGFyYW1zKCZkZXNjcmliZVBhcmFtcyk7CisgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OworICAgIC8vIHJlYXNvbmFibGUgZHVtbXkgdmFsdWVzCisgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lV2lkdGggPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMubkZyYW1lSGVpZ2h0ID0gMTI4OworICAgIGRlc2NyaWJlUGFyYW1zLm5TdHJpZGUgPSAxMjg7CisgICAgZGVzY3JpYmVQYXJhbXMublNsaWNlSGVpZ2h0ID0gMTI4OworCisgICAgQ0hFQ0soZmxleGlibGVFcXVpdmFsZW50ICE9IE5VTEwpOworCisgICAgaWYgKCFkZXNjcmliZUNvbG9yRm9ybWF0KG9teCwgbm9kZSwgZGVzY3JpYmVQYXJhbXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBNZWRpYUltYWdlICZpbWcgPSBkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZTsKKyAgICBpZiAoaW1nLm1UeXBlID09IE1lZGlhSW1hZ2U6Ok1FRElBX0lNQUdFX1RZUEVfWVVWKSB7CisgICAgICAgIGlmIChpbWcubU51bVBsYW5lcyAhPSAzIHx8CisgICAgICAgICAgICBpbWcubVBsYW5lW2ltZy5ZXS5tSG9yaXpTdWJzYW1wbGluZyAhPSAxIHx8CisgICAgICAgICAgICBpbWcubVBsYW5lW2ltZy5ZXS5tVmVydFN1YnNhbXBsaW5nICE9IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFlVViA0MjAKKyAgICAgICAgaWYgKGltZy5tUGxhbmVbaW1nLlVdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5VXS5tVmVydFN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAmJiBpbWcubVBsYW5lW2ltZy5WXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAgICAgJiYgaW1nLm1QbGFuZVtpbWcuVl0ubVZlcnRTdWJzYW1wbGluZyA9PSAyKSB7CisgICAgICAgICAgICAvLyBwb3NzaWJsZSBmbGV4aWJsZSBZVVY0MjAgZm9ybWF0CisgICAgICAgICAgICBpZiAoaW1nLm1CaXREZXB0aCA8PSA4KSB7CisgICAgICAgICAgICAgICAqZmxleGlibGVFcXVpdmFsZW50ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBBQ29kZWM6OmdldFBvcnRGb3JtYXQoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmbm90aWZ5KSB7CisgICAgLy8gVE9ETzogY2F0Y2ggZXJyb3JzIGFuIHJldHVybiB0aGVtIGluc3RlYWQgb2YgdXNpbmcgQ0hFQ0sKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwotICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAogICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpLAogICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CiAKLSAgICBDSEVDS19FUSgoaW50KWRlZi5lRGlyLCAoaW50KU9NWF9EaXJPdXRwdXQpOworICAgIENIRUNLX0VRKChpbnQpZGVmLmVEaXIsCisgICAgICAgICAgICAoaW50KShwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCA/IE9NWF9EaXJPdXRwdXQgOiBPTVhfRGlySW5wdXQpKTsKIAogICAgIHN3aXRjaCAoZGVmLmVEb21haW4pIHsKICAgICAgICAgY2FzZSBPTVhfUG9ydERvbWFpblZpZGVvOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb0RlZiA9ICZkZWYuZm9ybWF0LnZpZGVvOworICAgICAgICAgICAgc3dpdGNoICgoaW50KXZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdVbnVzZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSXNFbmNvZGVyIF4gKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKIAotICAgICAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICAgICAgaWYgKCFtSXNFbmNvZGVyKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChHZXRNaW1lVHlwZUZvclZpZGVvQ29kaW5nKAorICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzdHJpZGUiLCB2aWRlb0RlZi0+blN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIHZpZGVvRGVmLT5uU2xpY2VIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCB2aWRlb0RlZi0+ZUNvbG9yRm9ybWF0KTsKKworICAgICAgICAgICAgICAgICAgICBEZXNjcmliZUNvbG9yRm9ybWF0UGFyYW1zIGRlc2NyaWJlUGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZkZXNjcmliZVBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLmVDb2xvckZvcm1hdCA9IHZpZGVvRGVmLT5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZVdpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBkZXNjcmliZVBhcmFtcy5uU3RyaWRlID0gdmlkZW9EZWYtPm5TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlUGFyYW1zLm5TbGljZUhlaWdodCA9IHZpZGVvRGVmLT5uU2xpY2VIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaWJlQ29sb3JGb3JtYXQobU9NWCwgbU5vZGUsIGRlc2NyaWJlUGFyYW1zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZS1kYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGVzY3JpYmVQYXJhbXMuc01lZGlhSW1hZ2UpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydEluZGV4ICE9IGtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFsc28gZ2V0IGlucHV0IGNyb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0OworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZyZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVjdC5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChtT01YLT5nZXRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBzaXplb2YocmVjdCkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCA9IHZpZGVvRGVmLT5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5MZWZ0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uVG9wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uV2lkdGgsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uSGVpZ2h0LCAwdSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCArIHJlY3QubldpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDg6CisgICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgdnA4dHlwZTsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmdnA4dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHZwOHR5cGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZFZwOEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZwOHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZwOHR5cGUpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHRzU2NoZW1hID0gIm5vbmUiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZwOHR5cGUuZVRlbXBvcmFsUGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHZwOHR5cGUublRlbXBvcmFsTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMS1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMi1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzU2NoZW1hID0gIndlYnJ0Yy52cDguMy1sYXllciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJ0cy1zY2hlbWEiLCB0c1NjaGVtYSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHNldCB1cCBtaW1lLgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSXNFbmNvZGVyIF4gKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoR2V0TWltZVR5cGVGb3JWaWRlb0NvZGluZygKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQsICZtaW1lKSAhPSBPSykgewotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndpZHRoIiwgdmlkZW9EZWYtPm5GcmFtZVdpZHRoKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImhlaWdodCIsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwotCi0gICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIpIHsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzdHJpZGUiLCB2aWRlb0RlZi0+blN0cmlkZSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgdmlkZW9EZWYtPm5TbGljZUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgdmlkZW9EZWYtPmVDb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFIHJlY3Q7Ci0gICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcmVjdCk7Ci0gICAgICAgICAgICAgICAgcmVjdC5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgICAgICAgICAgICAgIGlmIChtT01YLT5nZXRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QubldpZHRoID0gdmlkZW9EZWYtPm5GcmFtZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICByZWN0Lm5IZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkxlZnQsIDApOwotICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QublRvcCwgMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uV2lkdGgsIDB1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShyZWN0Lm5IZWlnaHQsIDB1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19MRShyZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgICAgIENIRUNLX0xFKHJlY3QublRvcCArIHJlY3QubkhlaWdodCAtIDEsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRSZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxKTsKLQotICAgICAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldFJlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI2MzcsNyArMzMyNSw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sCkBAIC0yNjU3LDIwICszMzQ1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJEZWxheSArIG1FbmNvZGVyUGFkZGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IHBhcmFtcy5uQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcmV2YnVmc2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJEZWxheSAqIGZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJQYWRkaW5nICogZnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tQcmVzZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBtQ2hhbm5lbE1hc2spOwpAQCAtMjY4Miw3ICszMzU2LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywKQEAgLTI2OTksNyArMzM3Myw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSBwYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwKQEAgLTI3MjUsNyArMzM5OSw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9GbGFjLApAQCAtMjczOCwxMSArMzQxMiw0NSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdNUDM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9NcDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nVk9SQklTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDMzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDM1RZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLApAQCAtMjc1Niw3ICszNDY0LDUyIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdHNzExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb1BjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVNVUxhdykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVBTGF3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBwYXJhbXMuZVBDTU1vZGUgPT0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVOS05PV04gQVVESU8gQ09ESU5HOiAlZFxuIiwgYXVkaW9EZWYtPmVFbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI3NjYsNiArMzUxOSw0MyBAQAogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUNvZGVjOjpzZW5kRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisKKyAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG5vdGlmeSksIChzdGF0dXNfdClPSyk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobm90aWZ5LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyAmJgorICAgICAgICBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKKyAgICAgICAgbm90aWZ5LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgIC8vIG5vdGlmeSByZW5kZXJlciBvZiB0aGUgY3JvcCBjaGFuZ2UKKyAgICAgICAgLy8gTk9URTogbmF0aXZlIHdpbmRvdyB1c2VzIGV4dGVuZGVkIHJpZ2h0LWJvdHRvbSBjb29yZGluYXRlCisgICAgICAgIHJlcGx5LT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCByaWdodCArIDEsIGJvdHRvbSArIDEpOworICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgJiYKKyAgICAgICAgICAgICAgIChtRW5jb2RlckRlbGF5IHx8IG1FbmNvZGVyUGFkZGluZykpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIENIRUNLKG5vdGlmeS0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJmNoYW5uZWxDb3VudCkpOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZV90IHByZXZidWZzaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChwcmV2YnVmc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICJieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJldmJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUVuY29kZXJEZWxheSAqIGZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICBtRW5jb2RlclBhZGRpbmcgKiBmcmFtZVNpemUpOworICAgIH0KKwogICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgbVNlbnRGb3JtYXQgPSB0cnVlOwpAQCAtMjc3MywxMiArMzU2MywyMiBAQAogCiB2b2lkIEFDb2RlYzo6c2lnbmFsRXJyb3IoT01YX0VSUk9SVFlQRSBlcnJvciwgc3RhdHVzX3QgaW50ZXJuYWxFcnJvcikgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEVycm9yKTsKLSAgICBub3RpZnktPnNldEludDMyKCJvbXgtZXJyb3IiLCBlcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFcnJvcik7CisgICAgQUxPR0UoInNpZ25hbEVycm9yKG9teEVycm9yICUjeCwgaW50ZXJuYWxFcnJvciAlZCkiLCBlcnJvciwgaW50ZXJuYWxFcnJvcik7CisKKyAgICBpZiAoaW50ZXJuYWxFcnJvciA9PSBVTktOT1dOX0VSUk9SKSB7IC8vIGZpbmQgYmV0dGVyIGVycm9yIGNvZGUKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgb214U3RhdHVzID0gc3RhdHVzRnJvbU9NWEVycm9yKGVycm9yKTsKKyAgICAgICAgaWYgKG9teFN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBpbnRlcm5hbEVycm9yID0gb214U3RhdHVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIkludmFsaWQgT01YIGVycm9yICUjeCIsIGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1GYXRhbEVycm9yID0gdHJ1ZTsKIAogICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGludGVybmFsRXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCBBQ1RJT05fQ09ERV9GQVRBTCk7IC8vIGNvdWxkIHRyYW5zbGF0ZSBmcm9tIE9NWCBlcnJvci4KICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMjk3NSw3ICszNzc1LDggQEAKICAgICAgIG1Db2RlYyhjb2RlYykgewogfQogCi1BQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4KSB7CitBQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKAorICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIHJldHVybiBLRUVQX0JVRkZFUlM7CiB9CiAKQEAgLTMwMDEsNiArMzgwMiw3IEBACiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdENyZWF0ZUlucHV0U3VyZmFjZToKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbToKICAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBtYXkgcmVzdWx0IGluIGFuIGFwcCBpbGxlZ2FsIHN0YXRlIGV4Y2VwdGlvbi4KICAgICAgICAgICAgIEFMT0dFKCJNZXNzYWdlIDB4JXggd2FzIG5vdCBoYW5kbGVkIiwgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzAwOCwxMSArMzgxMCwyNSBAQAogCiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWERpZWQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCByZXN1bHQgaW4ga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSBoYW5kbGluZyBpbiBNZWRpYUNvZGVjLgogICAgICAgICAgICAgQUxPR0UoIk9NWC9tZWRpYXNlcnZlciBkaWVkLCBzaWduYWxsaW5nIGVycm9yISIpOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JSZXNvdXJjZXNMb3N0LCBERUFEX09CSkVDVCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBmb3JjaW5nIHRoZSByZWxlYXNlIG9mIGNvZGVjIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+ZnJlZU5vZGUobUNvZGVjLT5tTm9kZSk7CisgICAgICAgICAgICBBTE9HRV9JRigiWyVzXSBmYWlsZWQgdG8gcmVsZWFzZSBjb2RlYyBpbnN0YW5jZTogZXJyPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTMwMjQsOCArMzg0MCwxNiBAQAogICAgIGludDMyX3QgdHlwZTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7CiAKKyAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBpcyBhbiBvdXRzdGFuZGluZyBtZXNzYWdlIGZvciBhCisgICAgLy8gY29kZWMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgZGVzdHJveWVkCisgICAgaWYgKG1Db2RlYy0+bU5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HSSgiaWdub3JpbmcgbWVzc2FnZSBhcyBhbHJlYWR5IGZyZWVkIGNvbXBvbmVudDogJXMiLAorICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgSU9NWDo6bm9kZV9pZCBub2RlSUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigibm9kZSIsICZub2RlSUQpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibm9kZSIsIChpbnQzMl90Kikmbm9kZUlEKSk7CiAgICAgQ0hFQ0tfRVEobm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKIAogICAgIHN3aXRjaCAodHlwZSkgewpAQCAtMzA1Niw3ICszODgwLDcgQEAKICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6CiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlciIsICZidWZmZXJJRCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlciIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG9uT01YRW1wdHlCdWZmZXJEb25lKGJ1ZmZlcklEKTsKICAgICAgICAgfQpAQCAtMzA2NCwyNyArMzg4OCwyMSBAQAogICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgogICAgICAgICB7CiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXIiLCAmYnVmZmVySUQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXIiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAKICAgICAgICAgICAgIGludDMyX3QgcmFuZ2VPZmZzZXQsIHJhbmdlTGVuZ3RoLCBmbGFnczsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlOwotICAgICAgICAgICAgdm9pZCAqZGF0YVB0cjsKIAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX29mZnNldCIsICZyYW5nZU9mZnNldCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX2xlbmd0aCIsICZyYW5nZUxlbmd0aCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicGxhdGZvcm1fcHJpdmF0ZSIsICZwbGF0Zm9ybVByaXZhdGUpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRhdGFfcHRyIiwgJmRhdGFQdHIpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG9uT01YRmlsbEJ1ZmZlckRvbmUoCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KXJhbmdlT2Zmc2V0LCAoc2l6ZV90KXJhbmdlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilmbGFncywKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzLAotICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybVByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgIGRhdGFQdHIpOworICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTMxMDQsNyArMzkyMiwxMyBAQAogCiAgICAgQUxPR0UoIlslc10gRVJST1IoMHglMDhseCkiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGRhdGExKTsKIAotICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoKE9NWF9FUlJPUlRZUEUpZGF0YTEpOworICAgIC8vIHZlcmlmeSBPTVggY29tcG9uZW50IHNlbmRzIGJhY2sgYW4gZXJyb3Igd2UgZXhwZWN0LgorICAgIE9NWF9FUlJPUlRZUEUgb214RXJyb3IgPSAoT01YX0VSUk9SVFlQRSlkYXRhMTsKKyAgICBpZiAoIWlzT01YRXJyb3Iob214RXJyb3IpKSB7CisgICAgICAgIEFMT0dXKCJJbnZhbGlkIE9NWCBlcnJvciAlI3giLCBvbXhFcnJvcik7CisgICAgICAgIG9teEVycm9yID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgICBtQ29kZWMtPnNpZ25hbEVycm9yKG9teEVycm9yKTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtMzExOSwyMyArMzk0MywxMiBAQAogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpOwogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKIAotICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmYnVmZmVyTWV0YSA9IGluZm8tPm1EYXRhLT5tZXRhKCk7Ci0gICAgdm9pZCAqbWVkaWFCdWZmZXI7Ci0gICAgaWYgKGJ1ZmZlck1ldGEtPmZpbmRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsICZtZWRpYUJ1ZmZlcikKLSAgICAgICAgICAgICYmIG1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gV2UncmUgaW4gInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiIG1vZGUsIHRoZSB1bmRlcmx5aW5nCi0gICAgICAgIC8vIE9NWCBjb21wb25lbnQgaGFkIGFjY2VzcyB0byBkYXRhIHRoYXQncyBpbXBsaWNpdGx5IHJlZmNvdW50ZWQKLSAgICAgICAgLy8gYnkgdGhpcyAibWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCi0gICAgICAgIC8vIHRvbGQgdXMgdGhhdCBpdCdzIGRvbmUgd2l0aCB0aGUgaW5wdXQgYnVmZmVyLCB3ZSBjYW4gZGVjcmVtZW50Ci0gICAgICAgIC8vIHRoZSBtZWRpYUJ1ZmZlcidzIHJlZmVyZW5jZSBjb3VudC4KLQotICAgICAgICBBTE9HVigicmVsZWFzaW5nIG1idWYgJXAiLCBtZWRpYUJ1ZmZlcik7Ci0KLSAgICAgICAgKChNZWRpYUJ1ZmZlciAqKW1lZGlhQnVmZmVyKS0+cmVsZWFzZSgpOwotICAgICAgICBtZWRpYUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgYnVmZmVyTWV0YS0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBOVUxMKTsKLSAgICB9CisgICAgLy8gV2UncmUgaW4gInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiIG1vZGUsIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAorICAgIC8vIGJ5IHRoaXMgIk1lZGlhQnVmZmVyIiBvYmplY3QuIE5vdyB0aGF0IHRoZSBPTVggY29tcG9uZW50IGhhcworICAgIC8vIHRvbGQgdXMgdGhhdCBpdCdzIGRvbmUgd2l0aCB0aGUgaW5wdXQgYnVmZmVyLCB3ZSBjYW4gZGVjcmVtZW50CisgICAgLy8gdGhlIG1lZGlhQnVmZmVyJ3MgcmVmZXJlbmNlIGNvdW50LgorICAgIGluZm8tPm1EYXRhLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAKICAgICBQb3J0TW9kZSBtb2RlID0gZ2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0KTsKIApAQCAtMzE2NiwxNCArMzk3OSwxNCBAQAogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyKTsKLSAgICBub3RpZnktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBtQ29kZWMtPmlkKCkpOwotICAgIHJlcGx5LT5zZXRQb2ludGVyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAKQEAgLTMxODQsOCArMzk5Nyw3IEBACiAKIHZvaWQgQUNvZGVjOjpCYXNlU3RhdGU6Om9uSW5wdXRCdWZmZXJGaWxsZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiYnVmZmVyLWlkIiwgJmJ1ZmZlcklEKSk7Ci0KKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyLWlkIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBpbnQzMl90IGVyciA9IE9LOwogICAgIGJvb2wgZW9zID0gZmFsc2U7CkBAIC0zMjg5LDggKzQxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTMzODMsMTAgKzQxOTQsOCBAQAogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgIHNpemVfdCByYW5nZU9mZnNldCwgc2l6ZV90IHJhbmdlTGVuZ3RoLAogICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgdm9pZCAqcGxhdGZvcm1Qcml2YXRlLAotICAgICAgICB2b2lkICpkYXRhUHRyKSB7Ci0gICAgQUxPR1YoIlslc10gb25PTVhGaWxsQnVmZmVyRG9uZSAlcCB0aW1lICVsbGQgdXMsIGZsYWdzID0gMHglMDhseCIsCisgICAgICAgIGludDY0X3QgdGltZVVzKSB7CisgICAgQUxPR1YoIlslc10gb25PTVhGaWxsQnVmZmVyRG9uZSAldSB0aW1lICUiIFBSSWQ2NCAiIHVzLCBmbGFncyA9IDB4JTA4eCIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklELCB0aW1lVXMsIGZsYWdzKTsKIAogICAgIHNzaXplX3QgaW5kZXg7CkBAIC0zNDIzLDcgKzQyMzIsNyBAQAogICAgICAgICBjYXNlIFJFU1VCTUlUX0JVRkZFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChyYW5nZUxlbmd0aCA9PSAwICYmICEoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKApAQCAtMzQzNyw3ICs0MjQ2LDcgQEAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9CiAgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjLT5pZCgpKTsKIAotICAgICAgICAgICAgaWYgKCFtQ29kZWMtPm1TZW50Rm9ybWF0KSB7CisgICAgICAgICAgICBpZiAoIW1Db2RlYy0+bVNlbnRGb3JtYXQgJiYgcmFuZ2VMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5zZW5kRm9ybWF0Q2hhbmdlKHJlcGx5KTsKICAgICAgICAgICAgIH0KIApAQCAtMzQ2NCwxMiArNDI3MywxMiBAQAogICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXREcmFpblRoaXNCdWZmZXIpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJidWZmZXItaWQiLCBpbmZvLT5tQnVmZmVySUQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXIpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBpbmZvLT5tRGF0YSk7CiAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKIAotICAgICAgICAgICAgcmVwbHktPnNldFBvaW50ZXIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAKQEAgLTM0ODEsNyArNDI5MCw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gc2F3IG91dHB1dCBFT1MiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRFT1MpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0RU9TKTsKICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBtQ29kZWMtPm1JbnB1dEVPU1Jlc3VsdCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKQEAgLTM1MDUsOCArNDMxNCw3IEBACiAKIHZvaWQgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT3V0cHV0QnVmZmVyRHJhaW5lZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJidWZmZXItaWQiLCAmYnVmZmVySUQpKTsKLQorICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAgICAgc3NpemVfdCBpbmRleDsKICAgICBCdWZmZXJJbmZvICppbmZvID0KICAgICAgICAgbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4T3V0cHV0LCBidWZmZXJJRCwgJmluZGV4KTsKQEAgLTM1MjIsMTkgKzQzMzAsNDMgQEAKICAgICBpbnQzMl90IHJlbmRlcjsKICAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ICE9IE5VTEwKICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIgIT0gMAotICAgICAgICAgICAgJiYgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgJiYgaW5mby0+bURhdGEgIT0gTlVMTCAmJiBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApIHsKKyAgICAgICAgQVRSQUNFX05BTUUoInJlbmRlciIpOwogICAgICAgICAvLyBUaGUgY2xpZW50IHdhbnRzIHRoaXMgYnVmZmVyIHRvIGJlIHJlbmRlcmVkLgogCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMgPSAwOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lc3RhbXBOcyIsICZ0aW1lc3RhbXBOcykpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGl0IHNlZW1zIGxpa2Ugd2Ugc2hvdWxkIHVzZSB0aGUgdGltZXN0YW1wCisgICAgICAgICAgICAvLyBpbiB0aGUgKG1lZGlhKWJ1ZmZlciBhcyBpdCBwb3RlbnRpYWxseSBjYW1lIGZyb20KKyAgICAgICAgICAgIC8vIGFuIGlucHV0IHN1cmZhY2UsIGJ1dCB3ZSBkaWQgbm90IHByb3BhZ2F0ZSBpdCBwcmlvciB0bworICAgICAgICAgICAgLy8gQVBJIDIwLiAgUGVyaGFwcyBjaGVjayBmb3IgdGFyZ2V0IFNESyB2ZXJzaW9uLgorI2lmIDAKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lc3RhbXBOcykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidXNpbmcgYnVmZmVyIFBUUyBvZiAlIiBQUklkNjQsIHRpbWVzdGFtcE5zKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyAqPSAxMDAwOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgdGltZXN0YW1wTnMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNldCBidWZmZXIgdGltZXN0YW1wOiAlZCIsIGVycik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoKGVyciA9IG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIC0xKSkgPT0gT0spIHsKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIGVycik7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJgorICAgICAgICAgICAgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoImZyYW1lLWRyb3AiKTsKKyAgICAgICAgfQogICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAgICAgfQogCkBAIC0zNTY1LDcgKzQzOTcsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CiAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCkBAIC0zNjM1LDEwICs0NDY3LDExIEBACiAgICAgICAgICAgICBpbnQzMl90IGtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwgJmtlZXBDb21wb25lbnRBbGxvY2F0ZWQpKTsKLSAgICAgICAgICAgIENIRUNLKCFrZWVwQ29tcG9uZW50QWxsb2NhdGVkKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGtlZXAgY29tcG9uZW50IGFsbG9jYXRlZCBvbiBzaHV0ZG93biBpbiBVbmluaXRpYWxpemVkIHN0YXRlIik7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKQEAgLTM2NDgsMTMgKzQ0ODEsMjAgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2g6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8sIGFzIHdlIGhhdmUgYWxyZWFkeSBzaWduYWxlZCBzaHV0ZG93bgorICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgIH0KQEAgLTM2OTUsNiArNDUzNSw3IEBACiAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7CiAgICAgdWludDMyX3QgcXVpcmtzID0gMDsKKyAgICBpbnQzMl90IGVuY29kZXIgPSBmYWxzZTsKICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtYXRjaGluZ0NvZGVjcy5hZGQoKTsKICAgICAgICAgT01YQ29kZWM6OkNvZGVjTmFtZUFuZFF1aXJrcyAqZW50cnkgPSAmbWF0Y2hpbmdDb2RlY3MuZWRpdEl0ZW1BdChpbmRleCk7CkBAIC0zNzA3LDcgKzQ1NDgsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgaW50MzJfdCBlbmNvZGVyOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CiAgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTM3MzYsNiArNDU3Niw4IEBACiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbm9kZSA9IE5VTEw7CkBAIC0zNzQzLDEwICs0NTg1LDEwIEBACiAKICAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgIGlmICghbWltZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgZGVjb2RlciBmb3IgdHlwZSAnJXMnLiIsCi0gICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgJXNjb2RlciBmb3IgdHlwZSAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPyAiZW4iIDogImRlIiwgbWltZS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgZGVjb2RlciAnJXMnLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGNvZGVjICclcycuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgfQogCiAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQpOwpAQCAtMzc3MCw3ICs0NjEyLDcgQEAKIAogICAgIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgICAgICBub3RpZnktPnNldFN0cmluZygiY29tcG9uZW50TmFtZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgIH0KQEAgLTM3OTcsNyArNDYzOSw4IEBACiAgICAgbUNvZGVjLT5tRGVxdWV1ZUNvdW50ZXIgPSAwOwogICAgIG1Db2RlYy0+bU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKICAgICBtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPSAtMWxsOwotICAgIG1Db2RlYy0+bUlzQ29uZmlndXJlZEZvckFkYXB0aXZlUGxheWJhY2sgPSBmYWxzZTsKKyAgICBtQ29kZWMtPm1JbnB1dEZvcm1hdC5jbGVhcigpOworICAgIG1Db2RlYy0+bU91dHB1dEZvcm1hdC5jbGVhcigpOwogCiAgICAgaWYgKG1Db2RlYy0+bVNodXRkb3duSW5Qcm9ncmVzcykgewogICAgICAgICBib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBtQ29kZWMtPm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkOwpAQCAtMzgwNyw2ICs0NjUwLDkgQEAKIAogICAgICAgICBvblNodXRkb3duKGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgIH0KKyAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gZmFsc2U7CisKKyAgICBtQ29kZWMtPnByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25TaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKQEAgLTM4MTYsOSArNDY2MiwxMiBAQAogICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bVVuaW5pdGlhbGl6ZWRTdGF0ZSk7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7CisgICAgaWYgKG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgbUNvZGVjLT5tRXhwbGljaXRTaHV0ZG93biA9IGZhbHNlOworICAgIH0KIH0KIAogYm9vbCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtMzg1Miw2ICs0NzAxLDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAgImtlZXBDb21wb25lbnRBbGxvY2F0ZWQiLCAma2VlcENvbXBvbmVudEFsbG9jYXRlZCkpOwogCisgICAgICAgICAgICBtQ29kZWMtPm1FeHBsaWNpdFNodXRkb3duID0gdHJ1ZTsKICAgICAgICAgICAgIG9uU2h1dGRvd24oa2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwpAQCAtMzg2MSw3ICs0NzExLDcgQEAKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Rmx1c2g6CiAgICAgICAgIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKQEAgLTM4OTAsNyArNDc0MCw3IEBACiAgICAgICAgIEFMT0dFKCJbJXNdIGNvbmZpZ3VyZUNvZGVjIHJldHVybmluZyBlcnJvciAlZCIsCiAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKIAotICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTM5MTAsNyArNDc2MCw5IEBACiAKICAgICB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQUNvZGVjOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudENvbmZpZ3VyZWQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsIG1Db2RlYy0+bUlucHV0Rm9ybWF0KTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgbUNvZGVjLT5tT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgfQogCkBAIC0zOTE4LDExICs0NzcwLDExIEBACiB9CiAKIHZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25DcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgewogICAgIEFMT0dWKCJvbkNyZWF0ZUlucHV0U3VyZmFjZSIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOwogCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtMzk0Niw3ICs0Nzk4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbCkgeworICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tTWF4UHRzR2FwVXMgPiAwbGwpIHsKICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKQEAgLTM5NTYsNiArNDgwOCw0MSBAQAogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgbWF4IHRpbWVzdGFtcCBnYXAgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bVRpbWVQZXJDYXB0dXJlVXMgPiAwbGwKKyAgICAgICAgICAgICYmIG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzID4gMGxsKSB7CisgICAgICAgIGludDY0X3QgdGltZUxhcHNlWzJdOworICAgICAgICB0aW1lTGFwc2VbMF0gPSBtQ29kZWMtPm1UaW1lUGVyRnJhbWVVczsKKyAgICAgICAgdGltZUxhcHNlWzFdID0gbUNvZGVjLT5tVGltZVBlckNhcHR1cmVVczsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZXRJbnRlcm5hbE9wdGlvbigKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAorICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKKyAgICAgICAgICAgICAgICBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRSwKKyAgICAgICAgICAgICAgICAmdGltZUxhcHNlWzBdLAorICAgICAgICAgICAgICAgIHNpemVvZih0aW1lTGFwc2UpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiWyVzXSBVbmFibGUgdG8gY29uZmlndXJlIHRpbWUgbGFwc2UgKGVyciAlZCkiLAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkgeworICAgICAgICBib29sIHN1c3BlbmQgPSB0cnVlOworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5ELAorICAgICAgICAgICAgICAgICZzdXNwZW5kLAorICAgICAgICAgICAgICAgIHNpemVvZihzdXNwZW5kKSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBvcHRpb24gdG8gc3VzcGVuZCAoZXJyICVkKSIsCiAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBlcnIpOwogICAgICAgICB9CkBAIC00MDAwLDcgKzQ4ODcsNyBAQAogICAgICAgICAgICAgICIoZXJyb3IgMHglMDh4KSIsCiAgICAgICAgICAgICAgZXJyKTsKIAotICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAKICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1Mb2FkZWRTdGF0ZSk7CiAgICAgfQpAQCAtNDAxOCw2ICs0OTA1LDcgQEAKIAogYm9vbCBBQ29kZWM6OkxvYWRlZFRvSWRsZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CiAgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKICAgICAgICAgewogICAgICAgICAgICAgbUNvZGVjLT5kZWZlck1lc3NhZ2UobXNnKTsKQEAgLTQwNDAsNyArNDkyOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgZXZlbiBzdGFydGVkIHlldCwgc28gd2UncmUgZmx1c2hlZCBhbHJpZ2h0Li4uCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC00MDg0LDYgKzQ5NzIsNyBAQAogCiBib29sIEFDb2RlYzo6SWRsZVRvRXhlY3V0aW5nU3RhdGU6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgogICAgICAgICB7CiAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOwpAQCAtNDEwMCw3ICs0OTg5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBldmVuIHN0YXJ0ZWQgeWV0LCBzbyB3ZSdyZSBmbHVzaGVkIGFscmlnaHQuLi4KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkKTsKICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQxNDQsNyArNTAzMyw3IEBACiB9CiAKIEFDb2RlYzo6QmFzZVN0YXRlOjpQb3J0TW9kZSBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpnZXRQb3J0TW9kZSgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICByZXR1cm4gUkVTVUJNSVRfQlVGRkVSUzsKIH0KIApAQCAtNDIwNiwxMSArNTA5NSwxNCBAQAogCiAgICAgc3VibWl0T3V0cHV0QnVmZmVycygpOwogCi0gICAgLy8gUG9zdCB0aGUgZmlyc3QgaW5wdXQgYnVmZmVyLgorICAgIC8vIFBvc3QgYWxsIGF2YWlsYWJsZSBpbnB1dCBidWZmZXJzCiAgICAgQ0hFQ0tfR1QobUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSwgMHUpOwotICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoMCk7Ci0KLSAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1BY3RpdmUgPSB0cnVlOwogfQpAQCAtNDIzMiw2ICs1MTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwgJmtlZXBDb21wb25lbnRBbGxvY2F0ZWQpKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5tU2h1dGRvd25JblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db2RlYy0+bUV4cGxpY2l0U2h1dGRvd24gPSB0cnVlOwogICAgICAgICAgICAgbUNvZGVjLT5tS2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGtlZXBDb21wb25lbnRBbGxvY2F0ZWQ7CiAKICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKQEAgLTQzNTMsNiArNTI0NiwyMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXM7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCAmc2tpcEZyYW1lc0JlZm9yZVVzKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgbU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCisgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgJnNraXBGcmFtZXNCZWZvcmVVcywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihza2lwRnJhbWVzQmVmb3JlVXMpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgJ3NraXAtZnJhbWVzLWJlZm9yZScgKGVyciAlZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDMyX3QgZHJvcElucHV0RnJhbWVzOwogICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmZHJvcElucHV0RnJhbWVzKSkgewogICAgICAgICBib29sIHN1c3BlbmQgPSBkcm9wSW5wdXRGcmFtZXMgIT0gMDsKQEAgLTQzODYsNyArNTI5NSw3IEBACiAKIHZvaWQgQUNvZGVjOjpvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBBQ29kZWM6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaWduYWxlZElucHV0RU9TKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0obU5vZGUpOwogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTQ1MDYsNyArNTQxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgcmVjb25maWd1cmF0aW9uIChlcnJvciAweCUwOHgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwogCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IG5vdCBjb3JyZWN0LCBidXQgYXBwZWFycyB0byBiZQogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25seSB3YXkgdG8gZnJlZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtNDc3NSw3ICs1Njg0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2UsIG1Db2RlYy0+aWQoKSk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgb214X21lc3NhZ2U6OkVWRU5UKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigibm9kZSIsIG1Db2RlYy0+bU5vZGUpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG1Db2RlYy0+bU5vZGUpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZXZlbnQiLCBldmVudCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJkYXRhMSIsIGRhdGExKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGEyIiwgZGF0YTIpOwpAQCAtNDgxNiw3ICs1NzI1LDcgQEAKICAgICAgICAgbUNvZGVjLT53YWl0VW50aWxBbGxQb3NzaWJsZU5hdGl2ZVdpbmRvd0J1ZmZlcnNBcmVSZXR1cm5lZFRvVXMoKTsKIAogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIEFDb2RlYzo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpOwogICAgICAgICBub3RpZnktPnBvc3QoKTsKIAogICAgICAgICBtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggMDNkY2JmOS4uYTZmYjNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3A8TWV0YURhdGE+IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CitzcDxNZXRhRGF0YT4gQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIyMSw3ICsyMjEsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CkBAIC0yNTgsMTQgKzI1OCwxNCBAQAogICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyAyMDAwMGxsOyAgLy8gMjBtcyBwZXIgZnJhbWUuCiAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogMjAwMDBsbDsKIAotICAgICAgICBpbnQgaW5kZXggPSBzZWVrRnJhbWUgLyA1MDsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKICAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgewogICAgICAgICAgICAgaW5kZXggPSBtT2Zmc2V0VGFibGVMZW5ndGggLSAxOwogICAgICAgICB9CiAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBzZWVrRnJhbWUgLSBpbmRleCAqIDUwOyBpKyspIHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQobURhdGFTb3VyY2UsIG1PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSwgJnNpemUpKSAhPSBPSykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKaW5kZXggOGQ1ZWVjOC4uOWFhN2Q5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMjIsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDUsNyArMTA3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFNUldyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQU1SV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgIHZvaWQgKmR1bW15OwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CiAgICAgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYKQEAgLTE5MSw3ICsxOTMsNyBAQAogCiAvLyBzdGF0aWMKIHZvaWQgKkFNUldyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkICptZSkgewotICAgIHJldHVybiAodm9pZCAqKSBzdGF0aWNfY2FzdDxBTVJXcml0ZXIgKj4obWUpLT50aHJlYWRGdW5jKCk7CisgICAgcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdCkgc3RhdGljX2Nhc3Q8QU1SV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwogfQogCiBzdGF0dXNfdCBBTVJXcml0ZXI6OnRocmVhZEZ1bmMoKSB7CkBAIC0yMzUsNyArMjM3LDcgQEAKICAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBBTE9HVigidGltZSBzdGFtcDogJWxsZCwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlbGxkIiwKKyAgICAgICAgQUxPR1YoInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiLCBwcmV2aW91cyBwYXVzZWQgZHVyYXRpb246ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKICAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA2YTJhNjk2Li4xOTNmOGE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTE0LDcgKzE0LDEwIEBACiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCisgICAgICAgIENsb2NrRXN0aW1hdG9yLmNwcCAgICAgICAgICAgICAgICBcCisgICAgICAgIENvZGVjQmFzZS5jcHAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERhdGFVUklTb3VyY2UuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERSTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMCw4ICszMywxMCBAQAogICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUNvZGVjTGlzdC5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUNvZGVjU291cmNlLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBodHRwL01lZGlhSFRUUC5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTUsMjIgKzYwLDIzIEBACiAgICAgICAgIFdWTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIFhJTkdTZWVrZXIuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGF2Y191dGlscy5jcHAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIG1wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcCAgICAgICBcCi0gICAgICAgIG1wNC9UcmFja0ZyYWdtZW50LmNwcCAgICAgICAgICAgICBcCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvIFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQgXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvc2VydmljZXMvY29ubmVjdGl2aXR5bWFuYWdlciBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9mbGFjL2luY2x1ZGUgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0gXAorICAgICAgICAkKFRPUCkvc3lzdGVtL25ldGQvaW5jbHVkZSBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiBcCisgICAgICAgICQoVE9QKS9leHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2kxOG4gXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyIFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgICAgIGxpYmNvbm5lY3Rpdml0eW1hbmFnZXIgXAogICAgICAgICBsaWJjdXRpbHMgXAogICAgICAgICBsaWJkbCBcCiAgICAgICAgIGxpYmRybWZyYW1ld29yayBcCkBAIC04MCw2ICs4Niw4IEBACiAgICAgICAgIGxpYmljdXVjIFwKICAgICAgICAgbGlibG9nIFwKICAgICAgICAgbGlibWVkaWEgXAorICAgICAgICBsaWJuZXRkX2NsaWVudCBcCisgICAgICAgIGxpYm9wdXMgXAogICAgICAgICBsaWJzb25pdm94IFwKICAgICAgICAgbGlic3NsIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfb214IFwKQEAgLTk1LDYgKzEwMyw3IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3dlYm0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQgXAogICAgICAgICBsaWJ2cHggXAogICAgICAgICBsaWJ3ZWJtIFwKQEAgLTEwMywxMyArMTEyLDYgQEAKICAgICAgICAgbGliRkxBQyBcCiAgICAgICAgIGxpYm1lZGlhX2hlbHBlcgogCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgICAgICBjaHJvbWl1bV9odHRwX3N0dWIuY3BwCi1MT0NBTF9DUFBGTEFHUyArPSAtRENIUk9NSVVNX0FWQUlMQUJMRT0xCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlic3RscG9ydAotaW5jbHVkZSBleHRlcm5hbC9zdGxwb3J0L2xpYnN0bHBvcnQubWsKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hdmNfY29tbW9uIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCAwNWVlMzRlLi5lMjQ4MjRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BsYXllciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTIxLDYgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KQEAgLTEzOSw2ICsxNDIsMTIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgMHgleCIsIG1pbWUsIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgYWFjYW90ID0gLTE7CisgICAgICAgIGlmICgoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQykgJiYgZm9ybWF0LT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKKyAgICAgICAgICAgIC8vIFJlZGVmaW5lIEFBQyBmb3JtYXQgY29ycm9zcG9uZGluZyB0byBhYWMgcHJvZmlsZQorICAgICAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludCBhdmdCaXRSYXRlID0gLTE7CkBAIC0yMjEsNyArMjMwLDggQEAKIAogICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsIDApOworICAgICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZBdWRpb0NhbGxiYWNrLCB0aGlzLAorICAgICAgICAgICAgICAgIDAgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAKICAgICAgICAgaWYgKChlcnIgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCkpICE9IE9LKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwpAQCAtNDEwLDcgKzQyMCw3IEBACiAKIC8vIHN0YXRpYwogc2l6ZV90IEF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKmF1ZGlvU2luaywKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCiAgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKICAgICBBdWRpb1BsYXllciAqbWUgPSAoQXVkaW9QbGF5ZXIgKiljb29raWU7CkBAIC01NjUsMTIgKzU3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVRvQ29tcGxldGlvblVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMDAwMDBsbCAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0KSAvIG1TYW1wbGVSYXRlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkOiAlbGxkICglbGxkIHVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkOiAlIiBQUklkNjQgIiAoJWxsZCB1cykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1GcmFtZXNQbGF5ZWQgKyBudW1BZGRpdGlvbmFsRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAqIChtTnVtRnJhbWVzUGxheWVkICsgbnVtQWRkaXRpb25hbEZyYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBmcmFtZXMgbGVmdCB0byBwbGF5LCAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgZnJhbWVzIGxlZnQgdG8gcGxheSwgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVG9Db21wbGV0aW9uVXMsIHRpbWVUb0NvbXBsZXRpb25VcyAvIDFFNik7CiAKQEAgLTYyNyw3ICs2MzcsNyBAQAogICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQogICAgICAgICAgICAgICAgICAgICAoKG1OdW1GcmFtZXNQbGF5ZWQgKyBzaXplX2RvbmUgLyBtRnJhbWVTaXplKSAqIDEwMDAwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXItPnNpemUoKSA9ICVkLCAiCisgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJXp1LCAiCiAgICAgICAgICAgICAgICAgICAgICAibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAogICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKICAgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKQEAgLTc0NSw3ICs3NTUsNyBAQAogCiAgICAgLy8gSEFMIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBidWZmZXIgd2Ugc2VudCBhdCBtU3RhcnRQb3NVcwogICAgIGNvbnN0IGludDY0X3QgcmVuZGVyZWREdXJhdGlvbiA9IG1TdGFydFBvc1VzICsgcGxheWVkVXM7Ci0gICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJWxsZCIsIHJlbmRlcmVkRHVyYXRpb24pOworICAgIEFMT0dWKCJnZXRPdXRwdXRQbGF5UG9zaXRpb25Vc19sICUiIFBSSWQ2NCwgcmVuZGVyZWREdXJhdGlvbik7CiAgICAgcmV0dXJuIHJlbmRlcmVkRHVyYXRpb247CiB9CiAKQEAgLTc1Niw4ICs3NjYsMTMgQEAKICAgICAgICAgaWYgKG1TZWVraW5nKSB7CiAgICAgICAgICAgICByZXR1cm4gbVNlZWtUaW1lVXM7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpOworICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uVXM7CisgICAgICAgIH0KICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IGdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKTsKLSAgICAgICAgQUxPR1YoImdldE1lZGlhVGltZVVzIGdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKSBtUG9zaXRpb25UaW1lUmVhbFVzICVsbGQiLAorICAgICAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMgZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpIG1Qb3NpdGlvblRpbWVSZWFsVXMgJSIgUFJJZDY0LAogICAgICAgICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzKTsKICAgICAgICAgcmV0dXJuIG1Qb3NpdGlvblRpbWVSZWFsVXM7CiAgICAgfQpAQCAtNzk1LDcgKzgxMCw3IEBACiBzdGF0dXNfdCBBdWRpb1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZV91cykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBBTE9HVigic2Vla1RvKCAlbGxkICkiLCB0aW1lX3VzKTsKKyAgICBBTE9HVigic2Vla1RvKCAlIiBQUklkNjQgIiApIiwgdGltZV91cyk7CiAKICAgICBtU2Vla2luZyA9IHRydWU7CiAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggMTcyOTNjOC4uODA1ZjEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtMTQsNiArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Tb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yNiw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY5LDEwICs3MSwxMCBAQAogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIEF1ZGlvUmVjb3JkIGNhbGxiYWNrIG5ldmVyIHJldHVybnMgbW9yZSB0aGFuIHRoZSBtYXhpbXVtCiAgICAgICAgIC8vIGJ1ZmZlciBzaXplCi0gICAgICAgIGludCBmcmFtZUNvdW50ID0ga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCkgLyBjaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90IGZyYW1lQ291bnQgPSBrTWF4QnVmZmVyU2l6ZSAvIHNpemVvZihpbnQxNl90KSAvIGNoYW5uZWxDb3VudDsKIAogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgdG90YWwgYnVmZmVyIHNpemUgaXMgbGFyZ2UgZW5vdWdoCi0gICAgICAgIGludCBidWZDb3VudCA9IDI7CisgICAgICAgIHNpemVfdCBidWZDb3VudCA9IDI7CiAgICAgICAgIHdoaWxlICgoYnVmQ291bnQgKiBmcmFtZUNvdW50KSA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGJ1ZkNvdW50Kys7CiAgICAgICAgIH0KQEAgLTgwLDEwICs4MiwxMCBAQAogICAgICAgICBtUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAogICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCksCi0gICAgICAgICAgICAgICAgICAgIGJ1ZkNvdW50ICogZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgLypub3RpZmljYXRpb25GcmFtZXMqLyk7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICB9IGVsc2UgewogICAgICAgICBtSW5pdENoZWNrID0gc3RhdHVzOwpAQCAtMTQwLDcgKzE0Miw3IEBACiB9CiAKIHZvaWQgQXVkaW9Tb3VyY2U6OndhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2woKSB7Ci0gICAgQUxPR1YoIndhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2w6ICVsbGQiLCBtTnVtQ2xpZW50T3duZWRCdWZmZXJzKTsKKyAgICBBTE9HVigid2FpdE91dHN0YW5kaW5nRW5jb2RpbmdGcmFtZXNfbDogJSIgUFJJZDY0LCBtTnVtQ2xpZW50T3duZWRCdWZmZXJzKTsKICAgICB3aGlsZSAobU51bUNsaWVudE93bmVkQnVmZmVycyA+IDApIHsKICAgICAgICAgbUZyYW1lRW5jb2RpbmdDb21wbGV0aW9uQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KQEAgLTE1Nyw2ICsxNTksOCBAQAogICAgIH0KIAogICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworCiAgICAgbVJlY29yZC0+c3RvcCgpOwogICAgIHdhaXRPdXRzdGFuZGluZ0VuY29kaW5nRnJhbWVzX2woKTsKICAgICByZWxlYXNlUXVldWVkRnJhbWVzX2woKTsKQEAgLTIxMiw3ICsyMTYsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICpvdXQgPSBOVUxMOwogCkBAIC0yNzMsNyArMjc3LDcgQEAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpkYXRhQ2FsbGJhY2soY29uc3QgQXVkaW9SZWNvcmQ6OkJ1ZmZlciYgYXVkaW9CdWZmZXIpIHsKICAgICBpbnQ2NF90IHRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDBsbDsKIAotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICVsbGQgdXMiLCB0aW1lVXMpOworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR1coIlNwdXJpb3VzIGNhbGxiYWNrIGZyb20gQXVkaW9SZWNvcmQuIERyb3AgdGhlIGF1ZGlvIGRhdGEuIik7CkBAIC0yODIsOCArMjg2LDggQEAKIAogICAgIC8vIERyb3AgcmV0cmlldmVkIGFuZCBwcmV2aW91c2x5IGxvc3QgYXVkaW8gZGF0YS4KICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgdGltZVVzIDwgbVN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOwotICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICVsbGQvJWxsZCB1cyIsIHRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgKHZvaWQpIG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpOworICAgICAgICBBTE9HVigiRHJvcCBhdWRpbyBkYXRhIGF0ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0zMTIsNyArMzE2LDcgQEAKICAgICBpZiAobnVtTG9zdEJ5dGVzID4gMCkgewogICAgICAgICAvLyBMb3NzIG9mIGF1ZGlvIGZyYW1lcyBzaG91bGQgaGFwcGVuIHJhcmVseTsgdGh1cyB0aGUgTE9HVyBzaG91bGQKICAgICAgICAgLy8gbm90IGNhdXNlIGEgbG9nZ2luZyBzcGFtCi0gICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlZCBieXRlcyIsIG51bUxvc3RCeXRlcyk7CisgICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlenUgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOwogICAgIH0KIAogICAgIHdoaWxlIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDEzM2NhZTMuLjQ5M2U1OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0xOSw2ICsxOSw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkF3ZXNvbWVQbGF5ZXIiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTM0LDE2ICszNywyMCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgpAQCAtODIsNyArODksNyBAQAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF3ZXNvbWVFdmVudCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IC8qIG5vd191cyAqLykgeworICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqIC8qIHF1ZXVlICovLCBpbnQ2NF90IC8qIG5vd191cyAqLykgewogICAgICAgICAobVBsYXllci0+Km1NZXRob2QpKCk7CiAgICAgfQogCkBAIC05NiwxNyArMTAzLDIxIEBACiAKIHN0cnVjdCBBd2Vzb21lTG9jYWxSZW5kZXJlciA6IHB1YmxpYyBBd2Vzb21lUmVuZGVyZXIgewogICAgIEF3ZXNvbWVMb2NhbFJlbmRlcmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQotICAgICAgICA6IG1UYXJnZXQobmV3IFNvZnR3YXJlUmVuZGVyZXIobmF0aXZlV2luZG93LCBtZXRhKSkgeworICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpCisgICAgICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgICAgICAgIG1UYXJnZXQobmV3IFNvZnR3YXJlUmVuZGVyZXIobmF0aXZlV2luZG93KSkgewogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKICAgICAgICAgcmVuZGVyKChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMgKiAxMDAwKTsKICAgICB9CiAKLSAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBtVGFyZ2V0LT5yZW5kZXIoZGF0YSwgc2l6ZSwgTlVMTCk7CisgICAgdm9pZCByZW5kZXIoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICAgICAgbVRhcmdldC0+cmVuZGVyKGRhdGEsIHNpemUsIHRpbWVzdGFtcE5zLCBOVUxMLCBtRm9ybWF0KTsKICAgICB9CiAKIHByb3RlY3RlZDoKQEAgLTExNiw2ICsxMjcsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptVGFyZ2V0OwogCiAgICAgQXdlc29tZUxvY2FsUmVuZGVyZXIoY29uc3QgQXdlc29tZUxvY2FsUmVuZGVyZXIgJik7CkBAIC0yMjcsNiArMjM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBd2Vzb21lUGxheWVyOjpvbkF1ZGlvVGVhckRvd25FdmVudCk7CiAgICAgbUF1ZGlvVGVhckRvd25FdmVudFBlbmRpbmcgPSBmYWxzZTsKIAorICAgIG1DbG9ja0VzdGltYXRvciA9IG5ldyBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcigpOworCiAgICAgcmVzZXQoKTsKIH0KIApAQCAtMjc2LDE1ICsyOTAsMjAgQEAKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKHVyaSwgaGVhZGVycyk7CisgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZV9sKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICByZXNldF9sKCk7CiAKKyAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKICAgICBtVXJpID0gdXJpOwogCiAgICAgaWYgKGhlYWRlcnMpIHsKQEAgLTMwMSw3ICszMjAsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0koInNldERhdGFTb3VyY2VfbChVUkwgc3VwcHJlc3NlZCkiKTsKKyAgICBBTE9HSSgic2V0RGF0YVNvdXJjZV9sKCVzKSIsIHVyaURlYnVnU3RyaW5nKG1VcmksIG1GbGFncyAmIElOQ09HTklUTykuY19zdHIoKSk7CiAKICAgICAvLyBUaGUgYWN0dWFsIHdvcmsgd2lsbCBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbiBpbiB0aGUgY2FsbCB0bwogICAgIC8vIDo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBjYWxsaW5nIHRocmVhZCBpbgpAQCAtMzkzLDYgKzQxMiwxMyBAQAogCiAgICAgICAgIHRvdGFsQml0UmF0ZSArPSBiaXRyYXRlOwogICAgIH0KKyAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1CaXRyYXRlID0gdG90YWxCaXRSYXRlOwogCkBAIC01ODEsNiArNjA3LDcgQEAKICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgIG1TZWVrVGltZVVzID0gMDsKIAorICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwogICAgIG1Vcmkuc2V0VG8oIiIpOwogICAgIG1VcmlIZWFkZXJzLmNsZWFyKCk7CiAKQEAgLTcwOCwxMSArNzM1LDkgQEAKICAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgICAgICAgICAgaWYgKGdldEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNhY2hlZFNpemUgPSBtQ2FjaGVkU291cmNlLT5jYWNoZWRTaXplKCk7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkU2l6ZSAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7Ci0KKyAgICAgICAgICAgIGJvb2wgZW9zMjsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWREdXJhdGlvbl9sKCZjYWNoZWREdXJhdGlvblVzLCAmZW9zMikgJiYgbUR1cmF0aW9uVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIChkb3VibGUpY2FjaGVkRHVyYXRpb25VcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CkBAIC03MjAsMTIgKzc0NSwxMiBAQAogCiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYml0cmF0ZSBvZiB0aGUgc3RyZWFtLCB1c2UgYWJzb2x1dGUgc2l6ZQorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUvZHVyYXRpb24gb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKICAgICAgICAgICAgICAgICAvLyBsaW1pdHMgdG8gbWFpbnRhaW4gdGhlIGNhY2hlLgogCiAgICAgICAgICAgICAgICAgaWYgKChtRmxhZ3MgJiBQTEFZSU5HKSAmJiAhZW9zCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICVkKSAsIHBhdXNpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICV6dSkgLCBwYXVzaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga0xvd1dhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIFNFVCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdXNlX2woKTsKQEAgLTczNCwxMiArNzU5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJWQpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKD4gJXp1KSwgcmVzdW1pbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0hpZ2hXYXRlck1hcmtCeXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGxheV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlenUpLCBwcmVwYXJlIGlzIGRvbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSGlnaFdhdGVyTWFya0J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEyMTMsNyArMTIzOCw5IEBACiAgICAgICAgIC8vIGFsbG9jYXRlIHRoZWlyIGJ1ZmZlcnMgaW4gbG9jYWwgYWRkcmVzcyBzcGFjZS4gIFRoaXMgcmVuZGVyZXIKICAgICAgICAgLy8gdGhlbiBwZXJmb3JtcyBhIGNvbG9yIGNvbnZlcnNpb24gYW5kIGNvcHkgdG8gZ2V0IHRoZSBkYXRhCiAgICAgICAgIC8vIGludG8gdGhlIEFOYXRpdmVCdWZmZXIuCi0gICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKG1OYXRpdmVXaW5kb3csIG1ldGEpOworICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCk7CisgICAgICAgIG1WaWRlb1JlbmRlcmVyID0gbmV3IEF3ZXNvbWVMb2NhbFJlbmRlcmVyKG1OYXRpdmVXaW5kb3csIGZvcm1hdCk7CiAgICAgfQogfQogCkBAIC0xNDgyLDcgKzE1MDksNyBAQAogICAgIENIRUNLKHNvdXJjZSAhPSBOVUxMKTsKIAogICAgIGlmIChtVGV4dERyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyLCBtSFRUUFNlcnZpY2UpOwogICAgIH0KIAogICAgIG1UZXh0RHJpdmVyLT5hZGRJbkJhbmRUZXh0U291cmNlKHRyYWNrSW5kZXgsIHNvdXJjZSk7CkBAIC0xNjk0LDcgKzE3MjEsNyBAQAogICAgIH0KIAogICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic2Vla2luZyBhdWRpbyB0byAlbGxkIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7CisgICAgICAgIEFMT0dWKCJzZWVraW5nIGF1ZGlvIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpLiIsIHZpZGVvVGltZVVzLCB2aWRlb1RpbWVVcyAvIDFFNik7CiAKICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHZpZGVvIHRpbWUsIHNlZWsgYXVkaW8gdG8gdGhlIG9yaWdpbmFsbHkKICAgICAgICAgLy8gcmVxdWVzdGVkIHNlZWsgdGltZSBpbnN0ZWFkLgpAQCAtMTc1OCw3ICsxNzg1LDcgQEAKICAgICBpZiAoIW1WaWRlb0J1ZmZlcikgewogICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywgbVNlZWtUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLCBtU2Vla1RpbWVVcywgbVNlZWtUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKICAgICAgICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMsCkBAIC0xODI4LDcgKzE4NTUsNyBAQAogCiAgICAgaWYgKG1TZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewogICAgICAgICBpZiAobVNlZWtUaW1lVXMgPiB0aW1lVXMpIHsKLSAgICAgICAgICAgIEFMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlbGxkIHVzLCB0aW1lVXMgPSAlbGxkIHVzIiwKKyAgICAgICAgICAgIEFMT0dJKCJYWFggbVNlZWtUaW1lVXMgPSAlIiBQUklkNjQgIiB1cywgdGltZVVzID0gJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgdGltZVVzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE4NTgsMjEgKzE4ODUsMjggQEAKICAgICBUaW1lU291cmNlICp0cyA9CiAgICAgICAgICgobUZsYWdzICYgQVVESU9fQVRfRU9TKSB8fCAhKG1GbGFncyAmIEFVRElPUExBWUVSX1NUQVJURUQpKQogICAgICAgICAgICAgPyAmbVN5c3RlbVRpbWVTb3VyY2UgOiBtVGltZVNvdXJjZTsKKyAgICBpbnQ2NF90IHN5c3RlbVRpbWVVcyA9IG1TeXN0ZW1UaW1lU291cmNlLmdldFJlYWxUaW1lVXMoKTsKKyAgICBpbnQ2NF90IGxvb3BlclRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKICAgICAgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIENMRUFSKTsKICAgICAgICAgbVNpbmNlTGFzdERyb3BwZWQgPSAwOwotICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOworICAgICAgICBtQ2xvY2tFc3RpbWF0b3ItPnJlc2V0KCk7CisgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIHRpbWVVczsKICAgICB9CiAKICAgICBpbnQ2NF90IHJlYWxUaW1lVXMsIG1lZGlhVGltZVVzOwogICAgIGlmICghKG1GbGFncyAmIEFVRElPX0FUX0VPUykgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwKICAgICAgICAgJiYgbUF1ZGlvUGxheWVyLT5nZXRNZWRpYVRpbWVNYXBwaW5nKCZyZWFsVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CisgICAgICAgIEFMT0dWKCJ1cGRhdGluZyBUU2RlbHRhICglIiBQUklkNjQgIiA9PiAlIiBQUklkNjQgIiBjaGFuZ2UgJSIgUFJJZDY0ICIpIiwKKyAgICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzLCByZWFsVGltZVVzIC0gbWVkaWFUaW1lVXMsCisgICAgICAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyAtIChyZWFsVGltZVVzIC0gbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgQVRSQUNFX0lOVCgiVFMgZGVsdGEgY2hhbmdlIChtcykiLCAobVRpbWVTb3VyY2VEZWx0YVVzIC0gKHJlYWxUaW1lVXMgLSBtZWRpYVRpbWVVcykpIC8gMUUzKTsKICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gcmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzOwogICAgIH0KIAogICAgIGlmICh3YXNTZWVraW5nID09IFNFRUtfVklERU9fT05MWSkgewotICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIG1UaW1lU291cmNlRGVsdGFVczsKIAogICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKIApAQCAtMTg4MywxMiArMTkxNywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gMDsKICAgICBpZiAod2FzU2Vla2luZyA9PSBOT19TRUVLKSB7CiAgICAgICAgIC8vIExldCdzIGRpc3BsYXkgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIHNlZWtpbmcgcmlnaHQgYXdheS4KIAotICAgICAgICBpbnQ2NF90IG5vd1VzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIG1UaW1lU291cmNlRGVsdGFVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IGVzdGltYXRlUmVhbFRpbWVVcyh0cywgc3lzdGVtVGltZVVzKSAtIG1UaW1lU291cmNlRGVsdGFVczsKIAotICAgICAgICBpbnQ2NF90IGxhdGVuZXNzVXMgPSBub3dVcyAtIHRpbWVVczsKKyAgICAgICAgbGF0ZW5lc3NVcyA9IG5vd1VzIC0gdGltZVVzOwogCiAgICAgICAgIEFUUkFDRV9JTlQoIlZpZGVvIExhdGVuZXNzIChtcykiLCBsYXRlbmVzc1VzIC8gMUUzKTsKIApAQCAtMTkxOCwxMyArMTk1MywxMyBAQAogCiAgICAgICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKICAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiA0MG1zIGxhdGUuCi0gICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgIEFMT0dWKCJ3ZSdyZSBsYXRlIGJ5ICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CiAKICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIFNMT1dfREVDT0RFUl9IQUNLKQogICAgICAgICAgICAgICAgICAgICB8fCBtU2luY2VMYXN0RHJvcHBlZCA+IEZSQU1FX0RST1BfRlJFUSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIGRyb3BwaW5nICIKKyAgICAgICAgICAgICAgICBBTE9HVigid2UncmUgbGF0ZSBieSAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSBkcm9wcGluZyAiCiAgICAgICAgICAgICAgICAgICAgICAib25lIGFmdGVyICVkIGZyYW1lcyIsCiAgICAgICAgICAgICAgICAgICAgICBsYXRlbmVzc1VzLCBsYXRlbmVzc1VzIC8gMUU2LCBtU2luY2VMYXN0RHJvcHBlZCk7CiAKQEAgLTE5NDIsOSArMTk3Nyw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobGF0ZW5lc3NVcyA8IC0xMDAwMCkgewotICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDEwbXMgZWFybHkuCi0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDEwMDAwKTsKKyAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMzAwMDApIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAzMG1zIGVhcmx5LCBzY2hlZHVsZSBhdCBtb3N0IDIwIG1zIGJlZm9yZSB0aW1lIGR1ZQorICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChsYXRlbmVzc1VzIDwgLTYwMDAwID8gMzAwMDAgOiAtbGF0ZW5lc3NVcyAtIDIwMDAwKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NTgsNiArMTk5Myw4IEBACiAKICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICBtU2luY2VMYXN0RHJvcHBlZCsrOworICAgICAgICBtVmlkZW9CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbG9vcGVyVGltZVVzIC0gbGF0ZW5lc3NVcyk7CisKICAgICAgICAgbVZpZGVvUmVuZGVyZXItPnJlbmRlcihtVmlkZW9CdWZmZXIpOwogICAgICAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOwpAQCAtMjAwNywxNCArMjA0NCwyNiBAQAogCiAgICAgICAgIGludDY0X3QgbmV4dFRpbWVVczsKICAgICAgICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbmV4dFRpbWVVcykpOwotICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBuZXh0VGltZVVzIC0gdHMtPmdldFJlYWxUaW1lVXMoKSArIG1UaW1lU291cmNlRGVsdGFVczsKLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChkZWxheVVzID4gMTAwMDAgPyAxMDAwMCA6IGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworICAgICAgICBzeXN0ZW1UaW1lVXMgPSBtU3lzdGVtVGltZVNvdXJjZS5nZXRSZWFsVGltZVVzKCk7CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IG5leHRUaW1lVXMgLSBlc3RpbWF0ZVJlYWxUaW1lVXModHMsIHN5c3RlbVRpbWVVcykgKyBtVGltZVNvdXJjZURlbHRhVXM7CisgICAgICAgIEFUUkFDRV9JTlQoIkZyYW1lIGRlbHRhIChtcykiLCAobmV4dFRpbWVVcyAtIHRpbWVVcykgLyAxRTMpOworICAgICAgICBBTE9HVigibmV4dCBmcmFtZSBpbiAlIiBQUklkNjQsIGRlbGF5VXMpOworICAgICAgICAvLyB0cnkgdG8gc2NoZWR1bGUgMzBtcyBiZWZvcmUgdGltZSBkdWUKKyAgICAgICAgcG9zdFZpZGVvRXZlbnRfbChkZWxheVVzID4gNjAwMDAgPyAzMDAwMCA6IChkZWxheVVzIDwgMzAwMDAgPyAwIDogZGVsYXlVcyAtIDMwMDAwKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CiB9CiAKK2ludDY0X3QgQXdlc29tZVBsYXllcjo6ZXN0aW1hdGVSZWFsVGltZVVzKFRpbWVTb3VyY2UgKnRzLCBpbnQ2NF90IHN5c3RlbVRpbWVVcykgeworICAgIGlmICh0cyA9PSAmbVN5c3RlbVRpbWVTb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIHN5c3RlbVRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGludDY0X3QpbUNsb2NrRXN0aW1hdG9yLT5lc3RpbWF0ZShzeXN0ZW1UaW1lVXMsIHRzLT5nZXRSZWFsVGltZVVzKCkpOworICAgIH0KK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpwb3N0VmlkZW9FdmVudF9sKGludDY0X3QgZGVsYXlVcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTIxOTIsMTUgKzIyNDEsMTQgQEAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCBtVXJpLnN0cmluZygpLCA4KQogICAgICAgICAgICAgfHwgaXNXaWRldmluZVN0cmVhbWluZykgewotICAgICAgICBtQ29ubmVjdGluZ0RhdGFTb3VyY2UgPSBIVFRQQmFzZTo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBJTkNPR05JVE8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCk7Ci0KLSAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLT5zZXRVSUQobVVJRCk7CisgICAgICAgIGlmIChtSFRUUFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gcGxheSBtZWRpYSBmcm9tIGh0dHAgVVJJIHdpdGhvdXQgSFRUUCBzZXJ2aWNlLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisKICAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrOwogICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKApAQCAtMjIwOCw2ICsyMjU2LDEwIEBACiAKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+Y29ubmVjdChtVXJpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICAvLyBmb3JjZSBjb25uZWN0aW9uIGF0IHRoaXMgcG9pbnQsIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBnZXRNSU1FVHlwZSBhbmQgdGhlCisgICAgICAgIC8vIGNhY2hpbmcgZGF0YXNvdXJjZSBjb25zdHJ1Y3RlZCBiZWxvdywgd2hpY2ggY291bGQgcmVzdWx0IGluIG11bHRpcGxlIHJlcXVlc3RzIHRvIHRoZQorICAgICAgICAvLyBzZXJ2ZXIsIGFuZC9vciBmYWlsZWQgY29ubmVjdGlvbnMuCisgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmdldE1JTUVUeXBlKCk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMjM4LDggKzIyOTAsNiBAQAogCiAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBkYXRhU291cmNlLT5nZXRNSU1FVHlwZSgpOwotCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChjb250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7CiAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZG9pbmcgdGhpcyBmb3Igc3RyZWFtcyB0aGF0IGFwcGVhciB0byBiZSBhdWRpby1vbmx5CiAgICAgICAgICAgICAvLyBzdHJlYW1zIHRvIGVuc3VyZSB0aGF0IGV2ZW4gbG93IGJhbmR3aWR0aCBzdHJlYW1zIHN0YXJ0CkBAIC0yMjcxLDEyICsyMzIxLDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsU3RhdHVzICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1ldGFEYXRhU2l6ZSA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0gbWV0YURhdGFTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1ldGFEYXRhU2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3cgY2FjaGVkICVkIGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBjYWNoZWQgJXp1IGJ5dGVzIG9mIGRhdGEiLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobWV0YURhdGFTaXplIDwgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKQEAgLTIyOTUsOCArMjM0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzbmlmZmVkTUlNRSA9IHRtcC5zdHJpbmcoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGEtZGF0YS1zaXplIiwgJm1ldGFEYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1ldGEtPmZpbmRJbnQ2NCgibWV0YS1kYXRhLXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZtZXRhRGF0YVNpemUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhU2l6ZSA9IGtIaWdoV2F0ZXJNYXJrQnl0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTIzMTYsNyArMjM2Niw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShtVXJpLnN0cmluZygpLCAmbVVyaUhlYWRlcnMpOworICAgICAgICBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CiAgICAgfQogCiAgICAgaWYgKGRhdGFTb3VyY2UgPT0gTlVMTCkgewpAQCAtMjU4MywxMiArMjYzNCwxMiBAQAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2VsZWN0QXVkaW9UcmFja19sKAogICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwgc2l6ZV90IHRyYWNrSW5kZXgpIHsKIAotICAgIEFMT0dJKCJzZWxlY3RBdWRpb1RyYWNrX2w6IHRyYWNrSW5kZXg9JWQsIG1GbGFncz0weCV4IiwgdHJhY2tJbmRleCwgbUZsYWdzKTsKKyAgICBBTE9HSSgic2VsZWN0QXVkaW9UcmFja19sOiB0cmFja0luZGV4PSV6dSwgbUZsYWdzPTB4JXgiLCB0cmFja0luZGV4LCBtRmxhZ3MpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CiAgICAgICAgIGlmICgoc3NpemVfdCl0cmFja0luZGV4ID09IG1BY3RpdmVBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlZCBpcyBhY3RpdmUuIERvZXMgbm90aGluZy4iLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgaXMgYWN0aXZlLiBEb2VzIG5vdGhpbmcuIiwgdHJhY2tJbmRleCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICAgICAgLy9tU3RhdHMubUZsYWdzID0gbUZsYWdzOwpAQCAtMjY1NCwxNCArMjcwNSwxNCBAQAogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJzZWxlY3RUcmFjazogdHJhY2tJbmRleCA9ICVkIGFuZCBzZWxlY3Q9JWQiLCB0cmFja0luZGV4LCBzZWxlY3QpOworICAgIEFMT0dWKCJzZWxlY3RUcmFjazogdHJhY2tJbmRleCA9ICV6dSBhbmQgc2VsZWN0PSVkIiwgdHJhY2tJbmRleCwgc2VsZWN0KTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBpZiAobVRleHREcml2ZXIgIT0gTlVMTCkgewogICAgICAgICB0cmFja0NvdW50ICs9IG1UZXh0RHJpdmVyLT5jb3VudEV4dGVybmFsVHJhY2tzKCk7CiAgICAgfQogICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGluZGV4ICglZCkgaXMgb3V0IG9mIHJhbmdlIFswLCAlZCkiLCB0cmFja0luZGV4LCB0cmFja0NvdW50KTsKKyAgICAgICAgQUxPR0UoIlRyYWNrIGluZGV4ICglenUpIGlzIG91dCBvZiByYW5nZSBbMCwgJXp1KSIsIHRyYWNrSW5kZXgsIHRyYWNrQ291bnQpOwogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KIApAQCAtMjY3MywxNCArMjcyNCwxNCBAQAogICAgICAgICBpc0F1ZGlvVHJhY2sgPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwogCiAgICAgICAgIGlmICghaXNBdWRpb1RyYWNrICYmIHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhY2sgJWQgaXMgbm90IGVpdGhlciBhdWRpbyBvciB0aW1lZCB0ZXh0IiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICBBTE9HRSgiVHJhY2sgJXp1IGlzIG5vdCBlaXRoZXIgYXVkaW8gb3IgdGltZWQgdGV4dCIsIHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGlzQXVkaW9UcmFjaykgewogICAgICAgICBpZiAoIXNlbGVjdCkgewotICAgICAgICAgICAgQUxPR0UoIkRlc2VsZWN0IGFuIGF1ZGlvIHRyYWNrICglZCkgaXMgbm90IHN1cHBvcnRlZCIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQUxPR0UoIkRlc2VsZWN0IGFuIGF1ZGlvIHRyYWNrICglenUpIGlzIG5vdCBzdXBwb3J0ZWQiLCB0cmFja0luZGV4KTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2VsZWN0QXVkaW9UcmFja19sKG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpLCB0cmFja0luZGV4KTsKQEAgLTI3NTgsNyArMjgwOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBpZiAobVRleHREcml2ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIG1UZXh0RHJpdmVyID0gbmV3IFRpbWVkVGV4dERyaXZlcihtTGlzdGVuZXIsIG1IVFRQU2VydmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdHJpbmcgdmFsdWVzIHdyaXR0ZW4gaW4gUGFyY2VsIGFyZSBVVEYtMTYgdmFsdWVzLgogICAgICAgICAgICAgU3RyaW5nOCB1cmkocmVxdWVzdC5yZWFkU3RyaW5nMTYoKSk7CkBAIC0yNzcwLDcgKzI4MjEsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICAgICAgaWYgKG1UZXh0RHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICBtVGV4dERyaXZlciA9IG5ldyBUaW1lZFRleHREcml2ZXIobUxpc3RlbmVyLCBtSFRUUFNlcnZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IGZkICAgICAgICAgPSByZXF1ZXN0LnJlYWRGaWxlRGVzY3JpcHRvcigpOwogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSByZXF1ZXN0LnJlYWRJbnQ2NCgpOwpAQCAtMjgwMywxNCArMjg1NCwxNSBAQAogICAgIHJldHVybiBtQ2FjaGVkU291cmNlICE9IE5VTEwgfHwgbVdWTUV4dHJhY3RvciAhPSBOVUxMOwogfQogCi1zdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Qgeworc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKIAogICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOwogCiAgICAgZnByaW50ZihvdXQsICIgQXdlc29tZVBsYXllclxuIik7CiAgICAgaWYgKG1TdGF0cy5tRmQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoc3VwcHJlc3NlZCkiKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFVSSSglcykiLCB1cmlEZWJ1Z1N0cmluZyhtVXJpLCBtRmxhZ3MgJiBJTkNPR05JVE8pLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZwcmludGYob3V0LCAiICBmZCglZCkiLCBtU3RhdHMubUZkKTsKICAgICB9CkBAIC0yODE4LDcgKzI4NzAsNyBAQAogICAgIGZwcmludGYob3V0LCAiLCBmbGFncygweCUwOHgpIiwgbVN0YXRzLm1GbGFncyk7CiAKICAgICBpZiAobVN0YXRzLm1CaXRyYXRlID49IDApIHsKLSAgICAgICAgZnByaW50ZihvdXQsICIsIGJpdHJhdGUoJWxsZCBicHMpIiwgbVN0YXRzLm1CaXRyYXRlKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIsIGJpdHJhdGUoJSIgUFJJZDY0ICIgYnBzKSIsIG1TdGF0cy5tQml0cmF0ZSk7CiAgICAgfQogCiAgICAgZnByaW50ZihvdXQsICJcbiIpOwpAQCAtMjgyNiw3ICsyODc4LDcgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdGF0cy5tVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IFRyYWNrU3RhdCAmc3RhdCA9IG1TdGF0cy5tVHJhY2tzLml0ZW1BdChpKTsKIAotICAgICAgICBmcHJpbnRmKG91dCwgIiAgVHJhY2sgJWRcbiIsIGkgKyAxKTsKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFRyYWNrICV6dVxuIiwgaSArIDEpOwogICAgICAgICBmcHJpbnRmKG91dCwgIiAgIE1JTUUoJXMpIiwgc3RhdC5tTUlNRS5zdHJpbmcoKSk7CiAKICAgICAgICAgaWYgKCFzdGF0Lm1EZWNvZGVyTmFtZS5pc0VtcHR5KCkpIHsKQEAgLTI4MzgsOCArMjg5MCw4IEBACiAgICAgICAgIGlmICgoc3NpemVfdClpID09IG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KSB7CiAgICAgICAgICAgICBmcHJpbnRmKG91dCwKICAgICAgICAgICAgICAgICAgICAgIiAgIHZpZGVvRGltZW5zaW9ucyglZCB4ICVkKSwgIgotICAgICAgICAgICAgICAgICAgICAibnVtVmlkZW9GcmFtZXNEZWNvZGVkKCVsbGQpLCAiCi0gICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0RlY29kZWQoJSIgUFJJZDY0ICIpLCAiCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJSIgUFJJZDY0ICIpXG4iLAogICAgICAgICAgICAgICAgICAgICBtU3RhdHMubVZpZGVvV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEZWNvZGVkLApAQCAtMjg5OSw2ICsyOTUxLDkgQEAKICAgICAvLyBnZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gc3RhcnQgcmVjcmVhdGVkIHN0cmVhbSBmcm9tIGhlcmUKICAgICBnZXRQb3NpdGlvbigmbUF1ZGlvVGVhckRvd25Qb3NpdGlvbik7CiAKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gc2F2ZWRIVFRQU2VydmljZSA9IG1IVFRQU2VydmljZTsKKworICAgIGJvb2wgd2FzTG9vcGluZyA9IG1GbGFncyAmIExPT1BJTkc7CiAgICAgLy8gUmVzZXQgYW5kIHJlY3JlYXRlCiAgICAgcmVzZXRfbCgpOwogCkBAIC0yOTA4LDcgKzI5NjMsNyBAQAogICAgICAgICBtRmlsZVNvdXJjZSA9IGZpbGVTb3VyY2U7CiAgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChmaWxlU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBzZXREYXRhU291cmNlX2wodXJpLCAmdXJpSGVhZGVycyk7CisgICAgICAgIGVyciA9IHNldERhdGFTb3VyY2VfbChzYXZlZEhUVFBTZXJ2aWNlLCB1cmksICZ1cmlIZWFkZXJzKTsKICAgICB9CiAKICAgICBtRmxhZ3MgfD0gUFJFUEFSSU5HOwpAQCAtMjkxNyw2ICsyOTcyLDkgQEAKICAgICAgICAgLy8gYSBNRURJQV9FUlJPUiB0byB0aGUgY2xpZW50IGFuZCBhYm9ydCB0aGUgcHJlcGFyZQogICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7CiAgICAgfQorICAgIGlmICh3YXNMb29waW5nKSB7CisgICAgICAgIG1GbGFncyB8PSBMT09QSU5HOworICAgIH0KIAogICAgIG1BdWRpb1RlYXJEb3duID0gdHJ1ZTsKICAgICBtSXNBc3luY1ByZXBhcmUgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggZmUyMmYxZi4uN2QyZTBhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0xNCw2ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMyw2ICszNSwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IENBTUVSQV9TT1VSQ0VfVElNRU9VVF9OUyA9IDMwMDAwMDAwMDBMTDsKQEAgLTY1LDEyICs3MywxNSBAQAogfQogCiB2b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgeworICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShtc2dUeXBlKTsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0MSk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGV4dDIpOwogICAgIEFMT0dWKCJub3RpZnkoJWQsICVkLCAlZCkiLCBtc2dUeXBlLCBleHQxLCBleHQyKTsKIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSkgewotICAgIEFMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqIC8qIG1ldGFkYXRhICovKSB7CisgICAgQUxPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JXp1KSIsCiAgICAgICAgICBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CiAKICAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwpAQCAtNTc5LDE0ICs1OTAsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpzdGFydENhbWVyYVJlY29yZGluZygpIHsKK3N0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnRDYW1lcmFSZWNvcmRpbmcoKSB7CiAgICAgQUxPR1YoInN0YXJ0Q2FtZXJhUmVjb3JkaW5nIik7CiAgICAgLy8gUmVzZXQgdGhlIGlkZW50aXR5IHRvIHRoZSBjdXJyZW50IHRocmVhZCBiZWNhdXNlIG1lZGlhIHNlcnZlciBvd25zIHRoZQogICAgIC8vIGNhbWVyYSBhbmQgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQgYnkgdGhlIGFwcGxpY2F0aW9ucy4gVGhlIGFwcGxpY2F0aW9ucwogICAgIC8vIHdpbGwgY29ubmVjdCB0byB0aGUgY2FtZXJhIGluIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcuCiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmIChtTnVtSW5wdXRCdWZmZXJzID4gMCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgZXJyID0gbUNhbWVyYS0+c2VuZENvbW1hbmQoCiAgICAgICAgICAgICBDQU1FUkFfQ01EX1NFVF9WSURFT19CVUZGRVJfQ09VTlQsIG1OdW1JbnB1dEJ1ZmZlcnMsIDApOwogCiAgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGZvciBDYW1lcmFIQUwxIGNsaWVudHM7IHRodXMgdGhlIGZhaWx1cmUgaXMKQEAgLTU5NywxNyArNjA5LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBlcnIgPSBPSzsKICAgICBpZiAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgewogICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCi0gICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnN0YXJ0UmVjb3JkaW5nKG5ldyBQcm94eUxpc3RlbmVyKHRoaXMpKSk7CisgICAgICAgIGlmICgoZXJyID0gbUNhbWVyYVJlY29yZGluZ1Byb3h5LT5zdGFydFJlY29yZGluZygKKyAgICAgICAgICAgICAgICBuZXcgUHJveHlMaXN0ZW5lcih0aGlzKSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHJlY29yZGluZywgcmVjZWl2ZWQgZXJyb3I6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKG5ldyBDYW1lcmFTb3VyY2VMaXN0ZW5lcih0aGlzKSk7CiAgICAgICAgIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCk7Ci0gICAgICAgIENIRUNLKG1DYW1lcmEtPnJlY29yZGluZ0VuYWJsZWQoKSk7CisgICAgICAgIGlmICghbUNhbWVyYS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmciKTsKKyAgICAgICAgfQogICAgIH0KICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7CkBAIC02MzksMTAgKzY1OSwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhcnRDYW1lcmFSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBzdGFydENhbWVyYVJlY29yZGluZygpKSA9PSBPSykgeworICAgICAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgfQogCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIENhbWVyYVNvdXJjZTo6c3RvcENhbWVyYVJlY29yZGluZygpIHsKQEAgLTY1Nyw2MyArNjc5LDgwIEBACiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlQ2FtZXJhKCkgewogICAgIEFMT0dWKCJyZWxlYXNlQ2FtZXJhIik7Ci0gICAgaWYgKG1DYW1lcmEgIT0gMCkgewotICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgaWYgKChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOwotICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKLSAgICAgICAgICAgIG1DYW1lcmEtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKKyAgICBzcDxDYW1lcmE+IGNhbWVyYTsKKyAgICBib29sIGNvbGRDYW1lcmEgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIC8vIGdldCBhIGxvY2FsIHJlZiBhbmQgY2xlYXIgcmVmIHRvIG1DYW1lcmEgbm93CisgICAgICAgIGNhbWVyYSA9IG1DYW1lcmE7CiAgICAgICAgIG1DYW1lcmEuY2xlYXIoKTsKLSAgICAgICAgbUNhbWVyYSA9IDA7CisgICAgICAgIGNvbGRDYW1lcmEgPSAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMDsKKyAgICB9CisKKyAgICBpZiAoY2FtZXJhICE9IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIGlmIChjb2xkQ2FtZXJhKSB7CisgICAgICAgICAgICBBTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOworICAgICAgICAgICAgY2FtZXJhLT5zdG9wUHJldmlldygpOworICAgICAgICAgICAgY2FtZXJhLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQotICAgIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gMCkgewotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOwotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHkuY2xlYXIoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSAwKSB7CisgICAgICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgbUNhbWVyYVJlY29yZGluZ1Byb3h5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYUZsYWdzID0gMDsKICAgICB9Ci0gICAgbUNhbWVyYUZsYWdzID0gMDsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpyZXNldCgpIHsKICAgICBBTE9HRCgicmVzZXQ6IEUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgaW50NjRfdCB0b2tlbjsKLSAgICBib29sIGlzVG9rZW5WYWxpZCA9IGZhbHNlOwotICAgIGlmIChtQ2FtZXJhICE9IDApIHsKLSAgICAgICAgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBpc1Rva2VuVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgICByZWxlYXNlUXVldWVkRnJhbWVzKCk7Ci0gICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKE5PX0VSUk9SICE9Ci0gICAgICAgICAgICBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssCi0gICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzICogMTAwMExMICsgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TKSkgewotICAgICAgICAgICAgQUxPR1coIlRpbWVkIG91dCB3YWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJWQiLAotICAgICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuc2l6ZSgpKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKKworICAgICAgICBpbnQ2NF90IHRva2VuOworICAgICAgICBib29sIGlzVG9rZW5WYWxpZCA9IGZhbHNlOworICAgICAgICBpZiAobUNhbWVyYSAhPSAwKSB7CisgICAgICAgICAgICB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBpc1Rva2VuVmFsaWQgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKCFtRnJhbWVzQmVpbmdFbmNvZGVkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPQorICAgICAgICAgICAgICAgIG1GcmFtZUNvbXBsZXRlQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzICogMTAwMExMICsgQ0FNRVJBX1NPVVJDRV9USU1FT1VUX05TKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igb3V0c3RhbmRpbmcgZnJhbWVzIGJlaW5nIGVuY29kZWQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdG9wQ2FtZXJhUmVjb3JkaW5nKCk7CisgICAgICAgIGlmIChpc1Rva2VuVmFsaWQpIHsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJGcmFtZXMgcmVjZWl2ZWQvZW5jb2RlZC9kcm9wcGVkOiAlZC8lZC8lZCBpbiAlIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQsIG1OdW1GcmFtZXNEcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU51bUdsaXRjaGVzID4gMCkgeworICAgICAgICAgICAgQUxPR1coIiVkIGxvbmcgZGVsYXlzIGJldHdlZW4gbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzIiwgbU51bUdsaXRjaGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQgKyBtTnVtRnJhbWVzRHJvcHBlZCk7CiAgICAgfQotICAgIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKKwogICAgIHJlbGVhc2VDYW1lcmEoKTsKLSAgICBpZiAoaXNUb2tlblZhbGlkKSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgIH0KIAotICAgIGlmIChtQ29sbGVjdFN0YXRzKSB7Ci0gICAgICAgIEFMT0dJKCJGcmFtZXMgcmVjZWl2ZWQvZW5jb2RlZC9kcm9wcGVkOiAlZC8lZC8lZCBpbiAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkLCBtTnVtRnJhbWVzRHJvcHBlZCwKLSAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1HbGl0Y2hlcyA+IDApIHsKLSAgICAgICAgQUxPR1coIiVkIGxvbmcgZGVsYXlzIGJldHdlZW4gbmVpZ2hib3JpbmcgdmlkZW8gZnJhbWVzIiwgbU51bUdsaXRjaGVzKTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtTnVtRnJhbWVzUmVjZWl2ZWQsIG1OdW1GcmFtZXNFbmNvZGVkICsgbU51bUZyYW1lc0Ryb3BwZWQpOwogICAgIEFMT0dEKCJyZXNldDogWCIpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTc5Niw3ICs4MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2FtZXJhIHJlY29yZGluZyBwcm94eSBpcyBnb25lIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVygiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGluY29taW5nIGNhbWVyYSB2aWRlbyBmcmFtZXM6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5jb21pbmcgY2FtZXJhIHZpZGVvIGZyYW1lczogJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC04MTksMTAgKzg1OCwxMCBAQAogCiB2b2lkIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCiAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpIHsKLSAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiB0aW1lc3RhbXAgJWxsZCB1cyIsIHRpbWVzdGFtcFVzKTsKKyAgICBBTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgdXMiLCB0aW1lc3RhbXBVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1TdGFydGVkIHx8IChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiB0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykpIHsKLSAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJWxsZC8lbGxkIHVzIiwgdGltZXN0YW1wVXMsIG1TdGFydFRpbWVVcyk7CisgICAgICAgIEFMT0dWKCJEcm9wIGZyYW1lIGF0ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIHVzIiwgdGltZXN0YW1wVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg2NSw3ICs5MDQsNyBAQAogICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CiAgICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICVsbGQsIGN1cnJlbnQgdGltZSBzdGFtcDogJWxsZCIsCisgICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwKICAgICAgICAgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwogICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IDU3NzIzMTYuLjBhY2Q5ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU291cmNlVGltZUxhcHNlIgogCkBAIC03OSwxMyArODEsMTQgQEAKICAgICAgIG1Ta2lwQ3VycmVudEZyYW1lKGZhbHNlKSB7CiAKICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyA9IHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXM7Ci0gICAgQUxPR0QoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZTogJWxsZCB1cyIsCisgICAgQUxPR0QoInN0YXJ0aW5nIHRpbWUgbGFwc2UgbW9kZTogJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICBtVGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyk7CiAKICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvU2l6ZS53aWR0aDsKICAgICBtVmlkZW9IZWlnaHQgPSB2aWRlb1NpemUuaGVpZ2h0OwogCi0gICAgaWYgKCF0cnlTZXR0aW5nVmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCkpIHsKKyAgICBpZiAoT0sgPT0gbUluaXRDaGVjayAmJiAhdHJ5U2V0dGluZ1ZpZGVvU2l6ZSh2aWRlb1NpemUud2lkdGgsIHZpZGVvU2l6ZS5oZWlnaHQpKSB7CisgICAgICAgIHJlbGVhc2VDYW1lcmEoKTsKICAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgfQogCkBAIC0xMzQsNyArMTM3LDcgQEAKICAgICB9CiAKICAgICBib29sIHZpZGVvU2l6ZVN1cHBvcnRlZCA9IGZhbHNlOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBwb3J0ZWRTaXplcy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VwcG9ydGVkU2l6ZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaW50MzJfdCBwaWN0dXJlV2lkdGggPSBzdXBwb3J0ZWRTaXplc1tpXS53aWR0aDsKICAgICAgICAgaW50MzJfdCBwaWN0dXJlSGVpZ2h0ID0gc3VwcG9ydGVkU2l6ZXNbaV0uaGVpZ2h0OwogCkBAIC0yMzEsNyArMjM0LDcgQEAKICAgICByZXR1cm4gbmV3TWVtb3J5OwogfQogCi1ib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKSB7Citib29sIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IC8qIHRpbWVzdGFtcFVzICovKSB7CiAgICAgQUxPR1YoInNraXBDdXJyZW50RnJhbWUiKTsKICAgICBpZiAobVNraXBDdXJyZW50RnJhbWUpIHsKICAgICAgICAgbVNraXBDdXJyZW50RnJhbWUgPSBmYWxzZTsKQEAgLTI2NSw3ICsyNjgsNyBAQAogCiAgICAgICAgICAgICAvLyBSZWFsbHkgbWFrZSBzdXJlIHRoYXQgdGhpcyB2aWRlbyByZWNvcmRpbmcgZnJhbWUgd2lsbCBub3QgYmUgZHJvcHBlZC4KICAgICAgICAgICAgIGlmICgqdGltZXN0YW1wVXMgPCBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgic2V0IHRpbWVzdGFtcFVzIHRvIHN0YXJ0IHRpbWUgc3RhbXAgJWxsZCB1cyIsIG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICAgICAgQUxPR0koInNldCB0aW1lc3RhbXBVcyB0byBzdGFydCB0aW1lIHN0YW1wICUiIFBSSWQ2NCAiIHVzIiwgbVN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgICAgICAqdGltZXN0YW1wVXMgPSBtU3RhcnRUaW1lVXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMWU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0Nsb2NrRXN0aW1hdG9yLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbG9ja0VzdGltYXRvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbG9ja0VzdGltYXRvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6V2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IoCisgICAgICAgIHNpemVfdCBoZWFkTGVuZ3RoLCBkb3VibGUgaGVhZEZhY3Rvciwgc2l6ZV90IG1haW5MZW5ndGgsIGRvdWJsZSB0YWlsRmFjdG9yKQorICAgIDogbUhlYWRGYWN0b3JJbnYoMS4gLyBoZWFkRmFjdG9yKSwKKyAgICAgIG1UYWlsRmFjdG9yKHRhaWxGYWN0b3IpLAorICAgICAgbUhpc3RvcnlMZW5ndGgobWFpbkxlbmd0aCArIGhlYWRMZW5ndGgpLAorICAgICAgbUhlYWRMZW5ndGgoaGVhZExlbmd0aCkgeworICAgIHJlc2V0KCk7CisgICAgbVhIaXN0b3J5LnJlc2l6ZShtSGlzdG9yeUxlbmd0aCk7CisgICAgbVlIaXN0b3J5LnJlc2l6ZShtSGlzdG9yeUxlbmd0aCk7CisgICAgbUZpcnN0V2VpZ2h0ID0gcG93KGhlYWRGYWN0b3IsIG1IZWFkTGVuZ3RoKTsKK30KKworV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6TGluZWFyRml0KCkgeworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6cmVzZXQoKSB7CisgICAgbVggPSBtWFggPSBtWSA9IG1ZWSA9IG1YWSA9IG1XID0gMC47Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjpzaXplKCkgY29uc3QgeworICAgIGRvdWJsZSBzID0gbVcgKiBtVyArIG1YICogbVggKyBtWSAqIG1ZICsgbVhYICogbVhYICsgbVhZICogbVhZICsgbVlZICogbVlZOworICAgIGlmIChzID4gMWU3MikgeworICAgICAgICAvLyAxZTcyIGNvcnJlc3BvbmRzIHRvIGNsb2NrIG1vbm90b25pYyB0aW1lIG9mIGFib3V0IDggeWVhcnMKKyAgICAgICAgQUxPR1coImVzdGltYXRvciBpcyBvdmVyZmxvd2luZzogdz0lZyB4PSVnIHk9JWcgeHg9JWcgeHk9JWcgeXk9JWciLAorICAgICAgICAgICAgICBtVywgbVgsIG1ZLCBtWFgsIG1YWSwgbVlZKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OkxpbmVhckZpdDo6YWRkKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHcpIHsKKyAgICBtVyArPSB3OworICAgIG1YICs9IHcgKiB4OworICAgIG1ZICs9IHcgKiB5OworICAgIG1YWCArPSB3ICogeCAqIHg7CisgICAgbVhZICs9IHcgKiB4ICogeTsKKyAgICBtWVkgKz0gdyAqIHkgKiB5OworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OmNvbWJpbmUoY29uc3QgTGluZWFyRml0ICZsZikgeworICAgIG1XICs9IGxmLm1XOworICAgIG1YICs9IGxmLm1YOworICAgIG1ZICs9IGxmLm1ZOworICAgIG1YWCArPSBsZi5tWFg7CisgICAgbVhZICs9IGxmLm1YWTsKKyAgICBtWVkgKz0gbGYubVlZOworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpMaW5lYXJGaXQ6OnNjYWxlKGRvdWJsZSB3KSB7CisgICAgbVcgKj0gdzsKKyAgICBtWCAqPSB3OworICAgIG1ZICo9IHc7CisgICAgbVhYICo9IHc7CisgICAgbVhZICo9IHc7CisgICAgbVlZICo9IHc7Cit9CisKK2RvdWJsZSBXaW5kb3dlZExpbmVhckZpdEVzdGltYXRvcjo6TGluZWFyRml0OjppbnRlcnBvbGF0ZShkb3VibGUgeCkgeworICAgIGRvdWJsZSBkaXYgPSBtVyAqIG1YWCAtIG1YICogbVg7CisgICAgaWYgKGZhYnMoZGl2KSA8IDFlLTUgKiBtVyAqIG1XKSB7CisgICAgICAgIC8vIHRoaXMgb25seSBzaG91bGQgaGFwcGVuIG9uIHRoZSBmaXJzdCB2YWx1ZQorICAgICAgICByZXR1cm4geDsKKyAgICAgICAgLy8gYXNzdW1pbmcgYSA9IDEsIHdlIGNvdWxkIGFsc28gcmV0dXJuIHggKyAobVkgLSBtWCkgLyBtVzsKKyAgICB9CisgICAgZG91YmxlIGFfZGl2ID0gKG1XICogbVhZIC0gbVggKiBtWSk7CisgICAgZG91YmxlIGJfZGl2ID0gKG1YWCAqIG1ZIC0gbVggKiBtWFkpOworICAgIEFMT0dWKCJhPSUuNGcgYj0lLjRnIGluPSVnIG91dD0lZyIsCisgICAgICAgICAgICBhX2RpdiAvIGRpdiwgYl9kaXYgLyBkaXYsIHgsIChhX2RpdiAqIHggKyBiX2RpdikgLyBkaXYpOworICAgIHJldHVybiAoYV9kaXYgKiB4ICsgYl9kaXYpIC8gZGl2OworfQorCitkb3VibGUgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3I6OmVzdGltYXRlKGRvdWJsZSB4LCBkb3VibGUgeSkgeworICAgIC8qCisgICAgICogVE9ETzogV2UgY291bGQgdXBkYXRlIHRoZSBoZWFkIGJ5IGFkZGluZyB0aGUgbmV3IHNhbXBsZSB0byBpdAorICAgICAqIGFuZCBhbXBsaWZ5aW5nIGl0LCBidXQgdGhpcyBhcHByb2FjaCBjYW4gbGVhZCB0byB1bmJvdW5kZWQKKyAgICAgKiBlcnJvci4gSW5zdGVhZCwgd2UgcmVjYWxjdWxhdGUgdGhlIGhlYWQgYXQgZWFjaCBzdGVwLCB3aGljaAorICAgICAqIGlzIGNvbXB1dGF0aW9uYWxseSBtb3JlIGV4cGVuc2l2ZS4gV2UgY291bGQgYmFsYW5jZSB0aGUgdHdvCisgICAgICogbWV0aG9kcyBieSByZWNhbGN1bGF0aW5nIGp1c3QgYmVmb3JlIHRoZSBlcnJvciBiZWNvbWVzCisgICAgICogc2lnbmlmaWNhbnQuCisgICAgICovCisgICAgY29uc3QgYm9vbCB1cGRhdGVfaGVhZCA9IGZhbHNlOworICAgIGlmICh1cGRhdGVfaGVhZCkgeworICAgICAgICAvLyBhZGQgbmV3IHNhbXBsZSB0byB0aGUgaGVhZAorICAgICAgICBtSGVhZC5zY2FsZShtSGVhZEZhY3Rvckludik7IC8vIGFtcGxpZnkgaGVhZAorICAgICAgICBtSGVhZC5hZGQoeCwgeSwgbUZpcnN0V2VpZ2h0KTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRSSUNLWTogcGxhY2UgZWxlbWVudHMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyIGF0IGRlY3JlYXNpbmcKKyAgICAgKiBpbmRpY2VzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgcGFzdCBlbGVtZW50cyBieSBhZGRpdGlvbgorICAgICAqICh0aGVyZWJ5IGF2b2lkaW5nIHBvdGVudGlhbGx5IG5lZ2F0aXZlIGluZGljZXMuKQorICAgICAqLworICAgIGlmIChtTnVtU2FtcGxlcyA+PSBtSGVhZExlbmd0aCkgeworICAgICAgICAvLyBtb3ZlIGxhc3QgaGVhZCBzYW1wbGUgZnJvbSBoZWFkIHRvIHRoZSBtYWluIHdpbmRvdworICAgICAgICBzaXplX3QgbGFzdEhlYWRJeCA9IChtU2FtcGxlSXggKyBtSGVhZExlbmd0aCkgJSBtSGlzdG9yeUxlbmd0aDsKKyAgICAgICAgaWYgKHVwZGF0ZV9oZWFkKSB7CisgICAgICAgICAgICBtSGVhZC5hZGQobVhIaXN0b3J5W2xhc3RIZWFkSXhdLCBtWUhpc3RvcnlbbGFzdEhlYWRJeF0sIC0xLik7IC8vIHJlbW92ZQorICAgICAgICB9CisgICAgICAgIG1NYWluLmFkZChtWEhpc3RvcnlbbGFzdEhlYWRJeF0sIG1ZSGlzdG9yeVtsYXN0SGVhZEl4XSwgMS4pOworICAgICAgICBpZiAobU51bVNhbXBsZXMgPj0gbUhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIG1vdmUgbGFzdCBtYWluIHNhbXBsZSBmcm9tIG1haW4gd2luZG93IHRvIHRhaWwKKyAgICAgICAgICAgIG1NYWluLmFkZChtWEhpc3RvcnlbbVNhbXBsZUl4XSwgbVlIaXN0b3J5W21TYW1wbGVJeF0sIC0xLik7IC8vIHJlbW92ZQorICAgICAgICAgICAgbVRhaWwuYWRkKG1YSGlzdG9yeVttU2FtcGxlSXhdLCBtWUhpc3RvcnlbbVNhbXBsZUl4XSwgMS4pOworICAgICAgICAgICAgbVRhaWwuc2NhbGUobVRhaWxGYWN0b3IpOyAvLyBhdHRlbnVhdGUgdGFpbAorICAgICAgICB9CisgICAgfQorCisgICAgbVhIaXN0b3J5LmVkaXRJdGVtQXQobVNhbXBsZUl4KSA9IHg7CisgICAgbVlIaXN0b3J5LmVkaXRJdGVtQXQobVNhbXBsZUl4KSA9IHk7CisgICAgaWYgKG1OdW1TYW1wbGVzIDwgbUhpc3RvcnlMZW5ndGgpIHsKKyAgICAgICAgKyttTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICAvLyByZWNhbGN1bGF0ZSBoZWFkIHVubGVzcyB3ZSB3ZXJlIHVzaW5nIHRoZSB1cGRhdGUgbWV0aG9kCisgICAgaWYgKCF1cGRhdGVfaGVhZCkgeworICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICBkb3VibGUgdyA9IG1GaXJzdFdlaWdodDsKKyAgICAgICAgZm9yIChzaXplX3QgaGVhZEl4ID0gMDsgaGVhZEl4IDwgbUhlYWRMZW5ndGggJiYgaGVhZEl4IDwgbU51bVNhbXBsZXM7ICsraGVhZEl4KSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSAobVNhbXBsZUl4ICsgaGVhZEl4KSAlIG1IaXN0b3J5TGVuZ3RoOworICAgICAgICAgICAgbUhlYWQuYWRkKG1YSGlzdG9yeVtpeF0sIG1ZSGlzdG9yeVtpeF0sIHcpOworICAgICAgICAgICAgdyAqPSBtSGVhZEZhY3RvckludjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2FtcGxlSXggPiAwKSB7CisgICAgICAgIC0tbVNhbXBsZUl4OworICAgIH0gZWxzZSB7CisgICAgICAgIG1TYW1wbGVJeCA9IG1IaXN0b3J5TGVuZ3RoIC0gMTsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gZXN0aW1hdGlvbiByZXN1bHQKKyAgICBMaW5lYXJGaXQgdG90YWw7CisgICAgdG90YWwuY29tYmluZShtSGVhZCk7CisgICAgdG90YWwuY29tYmluZShtTWFpbik7CisgICAgdG90YWwuY29tYmluZShtVGFpbCk7CisgICAgcmV0dXJuIHRvdGFsLmludGVycG9sYXRlKHgpOworfQorCit2b2lkIFdpbmRvd2VkTGluZWFyRml0RXN0aW1hdG9yOjpyZXNldCgpIHsKKyAgICBtSGVhZC5yZXNldCgpOworICAgIG1NYWluLnJlc2V0KCk7CisgICAgbVRhaWwucmVzZXQoKTsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVNhbXBsZUl4ID0gbUhpc3RvcnlMZW5ndGggLSAxOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjlkNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDb2RlY0Jhc2U6OkNvZGVjQmFzZSgpIHsKK30KKworQ29kZWNCYXNlOjp+Q29kZWNCYXNlKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgeworfQorCitDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbjo6flBvcnREZXNjcmlwdGlvbigpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggNTUzMWVhNzQuLjY1YWQwZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCkBAIC0xMywxMyArMTMsMTEgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRhdGFTb3VyY2UiCiAKICNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgogCi0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSAiaW5jbHVkZS9BQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0RSTUV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvRkxBQ0V4dHJhY3Rvci5oIgpAQCAtMzUsMTAgKzMzLDE1IEBACiAKICNpbmNsdWRlICJtYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTE4MCw3ICsxODMsMTUgQEAKIAogLy8gc3RhdGljCiBzcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlLAorICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSkgeworICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICpjb250ZW50VHlwZSA9ICIiOworICAgIH0KKwogICAgIGJvb2wgaXNXaWRldmluZSA9ICFzdHJuY2FzZWNtcCgid2lkZXZpbmU6Ly8iLCB1cmksIDExKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZTsKQEAgLTE4OSw3ICsyMDAsMTkgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykKICAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpCiAgICAgICAgICAgICB8fCBpc1dpZGV2aW5lKSB7Ci0gICAgICAgIHNwPEhUVFBCYXNlPiBodHRwU291cmNlID0gSFRUUEJhc2U6OkNyZWF0ZSgpOworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgaHR0cCBjb25uZWN0aW9uIGZyb20gaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHR0cFNvdXJjZSA9IG5ldyBNZWRpYUhUVFAoY29ubik7CisgICAgICAgIH0KIAogICAgICAgICBTdHJpbmc4IHRtcDsKICAgICAgICAgaWYgKGlzV2lkZXZpbmUpIHsKQEAgLTE5OSwzMiArMjIyLDM4IEBACiAgICAgICAgICAgICB1cmkgPSB0bXAuc3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksIGhlYWRlcnMpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7CisgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnM7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICZjYWNoZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBTb3VyY2UtPmNvbm5lY3QodXJpLCAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgaHR0cCBzb3VyY2UhIik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghaXNXaWRldmluZSkgewotICAgICAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKLSAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBjb3B5ID0gKmhlYWRlcnM7Ci0gICAgICAgICAgICAgICAgTnVDYWNoZWRTb3VyY2UyOjpSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb3B5LCAmY2FjaGVDb25maWcsICZkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmNvbnRlbnRUeXBlID0gaHR0cFNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc291cmNlID0gTnVDYWNoZWRTb3VyY2UyOjpDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgIGh0dHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0aGF0IHByZWZldGNoaW5nLCBjYWNoaW5nLCBkYXRhc291cmNlIHdyYXBwZXIKICAgICAgICAgICAgIC8vIGluIHRoZSB3aWRldmluZTovLyBjYXNlLgogICAgICAgICAgICAgc291cmNlID0gaHR0cFNvdXJjZTsKICAgICAgICAgfQotCi0jIGlmIENIUk9NSVVNX0FWQUlMQUJMRQogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJkYXRhOiIsIHVyaSwgNSkpIHsKLSAgICAgICAgc291cmNlID0gY3JlYXRlRGF0YVVyaVNvdXJjZSh1cmkpOwotI2VuZGlmCisgICAgICAgIHNvdXJjZSA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZSh1cmkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCiAgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7CkBAIC0yMzcsNiArMjY2LDE5IEBACiAgICAgcmV0dXJuIHNvdXJjZTsKIH0KIAorc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpIHsKKyAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFIVFRQKGNvbm4pOworICAgIH0KK30KKwogU3RyaW5nOCBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzkzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8RGF0YVVSSVNvdXJjZT4gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKGNvbnN0IGNoYXIgKnVyaSkgeworICAgIGlmIChzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNoYXIgKmNvbW1hUG9zID0gc3RycmNocih1cmksICcsJyk7CisKKyAgICBpZiAoY29tbWFQb3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisKKyAgICBBU3RyaW5nIHRtcCgmdXJpWzVdLCBjb21tYVBvcyAtICZ1cmlbNV0pOworCisgICAgaWYgKHRtcC5lbmRzV2l0aCgiO2Jhc2U2NCIpKSB7CisgICAgICAgIEFTdHJpbmcgZW5jb2RlZChjb21tYVBvcyArIDEpOworCisgICAgICAgIC8vIFN0cmlwIENSIGFuZCBMRi4uLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gZW5jb2RlZC5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZC5jX3N0cigpW2ldID09ICdccicgfHwgZW5jb2RlZC5jX3N0cigpW2ldID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVkLmVyYXNlKGksIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gZGVjb2RlQmFzZTY0KGVuY29kZWQpOworCisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBjb250ZW50IGZvdW5kLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2lmIDAKKyAgICAgICAgc2l6ZV90IGRhdGFMZW4gPSBzdHJsZW4odXJpKSAtIHRtcC5zaXplKCkgLSA2OworICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihkYXRhTGVuKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBjb21tYVBvcyArIDEsIGRhdGFMZW4pOworCisgICAgICAgIC8vIHVuZXNjYXBlCisjZWxzZQorICAgICAgICAvLyBNZWRpYVBsYXllciBkb2Vzbid0IGNhcmUgZm9yIHRoaXMgcmlnaHQgbm93IGFzIHdlIGRvbid0CisgICAgICAgIC8vIHBsYXkgYW55IHRleHQtYmFzZWQgbWVkaWEuCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgY2hhcnNldCBvciBtaW1lIHR5cGUuCisKKyAgICByZXR1cm4gbmV3IERhdGFVUklTb3VyY2UoYnVmZmVyKTsKK30KKworRGF0YVVSSVNvdXJjZTo6RGF0YVVSSVNvdXJjZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQorICAgIDogbUJ1ZmZlcihidWZmZXIpIHsKK30KKworRGF0YVVSSVNvdXJjZTo6fkRhdGFVUklTb3VyY2UoKSB7Cit9CisKK3N0YXR1c190IERhdGFVUklTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NzaXplX3QgRGF0YVVSSVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+PSAob2ZmNjRfdCltQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNpemVfdCBjb3B5ID0gbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0OworICAgIGlmIChjb3B5ID4gc2l6ZSkgeworICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGF0YSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBjb3B5KTsKKworICAgIHJldHVybiBjb3B5OworfQorCitzdGF0dXNfdCBEYXRhVVJJU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRVNEUy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAppbmRleCBjNzZiYzRhLi44ZmJiNTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcApAQCAtOTEsNyArOTEsNyBAQAogICAgIH0KICAgICB3aGlsZSAobW9yZSk7CiAKLSAgICBBTE9HVigidGFnPTB4JTAyeCBkYXRhX3NpemU9JWQiLCAqdGFnLCAqZGF0YV9zaXplKTsKKyAgICBBTE9HVigidGFnPTB4JTAyeCBkYXRhX3NpemU9JXp1IiwgKnRhZywgKmRhdGFfc2l6ZSk7CiAKICAgICBpZiAoKmRhdGFfc2l6ZSA+IHNpemUpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggMDk4ZmNmOS4uZmE3MjUxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTIwOCw1NSArMjA4LDU1IEBACiAvLyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlciBsaXN0LCBidXQgZGlzY2FyZCByZWR1bmRhbnQgaW5mb3JtYXRpb24uCiAKIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIEZMQUNQYXJzZXI6OnJlYWRfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsIEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBGTEFDX19ieXRlIGJ1ZmZlcltdLAogICAgICAgICBzaXplX3QgKmJ5dGVzLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+cmVhZENhbGxiYWNrKGJ1ZmZlciwgYnl0ZXMpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBGTEFDUGFyc2VyOjpzZWVrX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+c2Vla0NhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKIH0KIAogRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgRkxBQ1BhcnNlcjo6dGVsbF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT50ZWxsQ2FsbGJhY2soYWJzb2x1dGVfYnl0ZV9vZmZzZXQpOwogfQogCiBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCwgdm9pZCAqY2xpZW50X2RhdGEpCiB7CiAgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmxlbmd0aENhbGxiYWNrKHN0cmVhbV9sZW5ndGgpOwogfQogCiBGTEFDX19ib29sIEZMQUNQYXJzZXI6OmVvZl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2Rlciwgdm9pZCAqY2xpZW50X2RhdGEpCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZW9mQ2FsbGJhY2soKTsKIH0KIAogRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIEZMQUNQYXJzZXI6OndyaXRlX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLCBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsCiAgICAgICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10sIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT53cml0ZUNhbGxiYWNrKGZyYW1lLCBidWZmZXIpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhLCB2b2lkICpjbGllbnRfZGF0YSkKIHsKICAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5tZXRhZGF0YUNhbGxiYWNrKG1ldGFkYXRhKTsKIH0KIAogdm9pZCBGTEFDUGFyc2VyOjplcnJvcl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCiAgICAgICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMsIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmVycm9yQ2FsbGJhY2soc3RhdHVzKTsKQEAgLTM4MCwxNSArMzgwLDIxIEBACiAvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzgoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weU1vbm84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KHNob3J0ICpkc3QsIGNvbnN0IGludCAqY29uc3QgKnNyYywgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7CkBAIC00MDQsMTUgKzQxMCwyMSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU1vbm8xNihzaG9ydCAqZHN0LCBjb25zdCBpbnQgKmNvbnN0ICpzcmMsIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CitzdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CiAgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKQEAgLTQzMCwxNSArNDQyLDIxIEBACiAKIC8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weU1vbm8yNCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVN0ZXJlbzI0KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKICAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7CkBAIC00NTQsOCArNDcyLDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3Moc2hvcnQgKmRzdCwgY29uc3QgaW50ICpjb25zdCAqc3JjLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworc3RhdGljIHZvaWQgY29weVRyZXNwYXNzKAorICAgICAgICBzaG9ydCAqIC8qIGRzdCAqLywKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqIC8qIHNyYyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewogICAgIFRSRVNQQVNTKCk7CiB9CiAKQEAgLTcwMCw3ICs3MjEsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykKK3N0YXR1c190IEZMQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdGFydCIpOwogCkBAIC03OTIsOCArODEzLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpCi17CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDVmYTRiNmYuLjMyMjkxYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTIwLDE3ICsyMCwxMyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogCi0jaWYgQ0hST01JVU1fQVZBSUxBQkxFCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNlbmRpZgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KIAotI2luY2x1ZGUgPENvbm5lY3Rpdml0eU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDAsMzQgKzM2LDcgQEAKICAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCiAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCiAgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCi0gICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSwKLSAgICAgIG1VSURWYWxpZChmYWxzZSksCi0gICAgICBtVUlEKDApIHsKLX0KLQotLy8gc3RhdGljCi1zcDxIVFRQQmFzZT4gSFRUUEJhc2U6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgICAgICBIVFRQQmFzZSAqZGF0YVNvdXJjZSA9IGNyZWF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2UoZmxhZ3MpOwotICAgICAgICBpZiAoZGF0YVNvdXJjZSkgewotICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgewotICAgICAgICBUUkVTUEFTUygpOwotCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBIVFRQQmFzZTo6VXBkYXRlUHJveHlDb25maWcoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCkgewotI2lmIENIUk9NSVVNX0FWQUlMQUJMRQotICAgIHJldHVybiBVcGRhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci0jZWxzZQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSNlbmRpZgorICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgewogfQogCiB2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKQEAgLTEzNSwyMSArMTA0LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgSFRUUEJhc2U6OnNldFVJRCh1aWRfdCB1aWQpIHsKLSAgICBtVUlEVmFsaWQgPSB0cnVlOwotICAgIG1VSUQgPSB1aWQ7Ci19Ci0KLWJvb2wgSFRUUEJhc2U6OmdldFVJRCh1aWRfdCAqdWlkKSBjb25zdCB7Ci0gICAgaWYgKCFtVUlEVmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp1aWQgPSBtVUlEOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vIHN0YXRpYwogdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgewogICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7CkBAIC0xNjgsNyArMTIyLDcgQEAKIAogLy8gc3RhdGljCiB2b2lkIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgewotICAgIENvbm5lY3Rpdml0eU1hbmFnZXI6Om1hcmtTb2NrZXRBc1VzZXIoc29ja2ZkLCB1aWQpOworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKIH0KIAogLy8gc3RhdGljCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAppbmRleCAzODBkYWI0Li40YTYzMTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgICAgICAgICAgbVNlZWtlcik7CiB9CiAKLXNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworc3A8TWV0YURhdGE+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCBjOWVkNWJiLi45ODU2ZjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtNTU1LDcgKzU1NSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW0pIHsKK3N0YXR1c190IE1QRUcyVFNXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW0gKi8pIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwpAQCAtNTk2LDcgKzU5Niw4IEBACiAgICAgcmV0dXJuICFtU3RhcnRlZCB8fCAobU51bVNvdXJjZXNEb25lID09IG1Tb3VyY2VzLnNpemUoKSA/IHRydWUgOiBmYWxzZSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNXcml0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSB7CitzdGF0dXNfdCBNUEVHMlRTV3JpdGVyOjpkdW1wKAorICAgICAgICBpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSB7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC02ODEsNyArNjgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICVkKSIsCisgICAgICAgICAgICAgICAgQUxPR1YoIndyaXRpbmcgYWNjZXNzIHVuaXQgYXQgdGltZSAlLjJmIHNlY3MgKGluZGV4ICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgbWluVGltZVVzIC8gMUU2LCBtaW5JbmRleCk7CiAKICAgICAgICAgICAgICAgICBzb3VyY2UgPSBtU291cmNlcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAwZTk4MTFkLi4zODc1NGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0xNiwxNyArMTYsMTkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNUEVHNEV4dHJhY3RvciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtNTEsMTEgKzUzLDEzIEBACiBjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAorICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwpAQCAtNzIsNiArNzYsOCBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAorICAgIC8vIGtlZXAgdGhlIE1QRUc0RXh0cmFjdG9yIGFyb3VuZCwgc2luY2Ugd2UncmUgcmVmZXJlbmNpbmcgaXRzIGRhdGEKKyAgICBzcDxNUEVHNEV4dHJhY3Rvcj4gbU93bmVyOwogICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKQEAgLTc5LDYgKzg1LDcgQEAKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1DdXJyZW50RnJhZ21lbnRJbmRleDsKICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmbVNlZ21lbnRzOworICAgIGNvbnN0IFRyZXggKm1UcmV4OwogICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKQEAgLTEwMCw2ICsxMDcsNyBAQAogICAgIHVpbnQ2NF90KiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzOwogCiAgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtSXNIRVZDOwogICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKIAogICAgIGJvb2wgbVN0YXJ0ZWQ7CkBAIC0xNDUsNiArMTUzLDcgQEAKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgICAgIHNpemVfdCBzaXplOwogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgdWludDhfdCBpdlsxNl07CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7CiAgICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOwpAQCAtMjY0LDcgKzI3Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisgICAgICAgIHByaW50ZigiMHglMDR6eCAgIiwgb2Zmc2V0KTsKIAogICAgICAgICBzaXplX3QgbiA9IHNpemUgLSBvZmZzZXQ7CiAgICAgICAgIGlmIChuID4gMTYpIHsKQEAgLTMyMSw2ICszMzAsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQzLDggKzM1NSw3IEBACiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbVNpZHhEdXJhdGlvbigwKSwKLSAgICAgIG1Nb29mT2Zmc2V0KDApLAorICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCkBAIC00MDksNyArNDIwLDcgQEAKICAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKICAgICB9CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlZCB0cmFja3MiLCBuKTsKKyAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlenUgdHJhY2tzIiwgbik7CiAgICAgcmV0dXJuIG47CiB9CiAKQEAgLTQ4Miw4ICs0OTMsMTggQEAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIG9mZjY0X3Qgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKKworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogMHglbGxkLT4weCVsbGQiLCBvcmlnX29mZnNldCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtNDkyLDEyICs1MTMsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3MnLCAnaScsICdkJywgJ3gnKSkgewotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNpZHggYm94IHRvbwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewogICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgbU1vb2ZPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSkgeworICAgICAgICAgICAgLy8ga2VlcCBwYXJzaW5nIHVudGlsIHdlIGdldCB0byB0aGUgZGF0YQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNTA5LDggKzUzMCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOwogICAgICAgICB9Ci0KLSAgICAgICAgbUluaXRDaGVjayA9IE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7CiAgICAgfQpAQCAtNTc5LDcgKzU5OCw4IEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYob2ZmNjRfdCAqb2Zmc2V0LCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VEcm1TSU5GKAorICAgICAgICBvZmY2NF90ICogLyogb2Zmc2V0ICovLCBvZmY2NF90IGRhdGFfb2Zmc2V0KSB7CiAgICAgdWludDhfdCB1cGRhdGVJZFRhZzsKICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnVwZGF0ZUlkVGFnLCAxKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtNzY4LDggKzc4OCwyNSBAQAogICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdG9tIGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc291cmNlU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjaHVua19zaXplID0gKHNvdXJjZVNpemUgLSAqb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gWFhYIGNvdWxkIHdlIGp1c3QgcGljayBhICJzdWZmaWNpZW50bHkgbGFyZ2UiIHZhbHVlIGhlcmU/CisgICAgICAgICAgICAgICAgQUxPR0UoImF0b20gc2l6ZSBpcyAwLCBhbmQgZGF0YSBzb3VyY2UgaGFzIG5vIHNpemUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm90IGFsbG93ZWQgZm9yIG5vbi10b3BsZXZlbCBhdG9tcywgc2tpcCBpdAorICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewogICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlIiBQUkl1NjQsIGNodW5rX3NpemUpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIApAQCAtNzgwLDcgKzgxNyw3IEBACiAjaWYgMAogICAgIHN0YXRpYyBjb25zdCBjaGFyIGtXaGl0ZXNwYWNlW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CiAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gJmtXaGl0ZXNwYWNlW3NpemVvZihrV2hpdGVzcGFjZSkgLSAxIC0gMiAqIGRlcHRoXTsKLSAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICVsbGRcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOworICAgIHByaW50ZigiJXNmb3VuZCBjaHVuayAnJXMnIG9mIHNpemUgJSIgUFJJdTY0ICJcbiIsIGluZGVudCwgY2h1bmssIGNodW5rX3NpemUpOwogCiAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBzaXplX3QgbiA9IGNodW5rX3NpemU7CkBAIC04MzYsNyArODczLDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJWQgYnl0ZXMgbG9uZy4iLCAoc2l6ZV90KWNodW5rX3NpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVUYWJsZSBjaHVuayBpcyAlIiBQUkl1NjQgIiBieXRlcyBsb25nLiIsIGNodW5rX3NpemUpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpCiAgICAgICAgICAgICAgICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZwpAQCAtOTI4LDYgKzk2NSw4IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKICAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7CkBAIC05OTAsMTIgKzEwMjksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnZicsICdyJywgJ20nLCAnYScpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHVpbnQzMl90IG9yaWdpbmFsX2ZvdXJjYzsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmb3JpZ2luYWxfZm91cmNjLCA0KSA8IDQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CkBAIC0xMDA5LDEyICsxMDQ5LDEzIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdlJywgJ24nLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMzIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQpAQCAtMTA1OSwyMyArMTEwMCwyNSBAQAogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2snLCAnaCcsICdkJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrSGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAncycsICdzJywgJ2gnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBQc3NoSW5mbyBwc3NoOwogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQsICZwc3NoLnV1aWQsIDE2KSA8IDE2KSB7CkBAIC0xMTA0LDEyICsxMTQ3LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMTQwLDYgKzExODQsOCBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgPSBudG9obCh0aW1lc2NhbGUpOwogCisgICAgICAgICAgICAvLyAxNDQ5Ni0xMiBzYXlzIGFsbCBvbmVzIG1lYW5zIGluZGV0ZXJtaW5hdGUsIGJ1dCBzb21lIGZpbGVzIHNlZW0gdG8gdXNlCisgICAgICAgICAgICAvLyAwIGluc3RlYWQuIFdlIHRyZWF0IGJvdGggdGhlIHNhbWUuCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKQEAgLTExNDcsNyArMTE5Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2g2NChkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gbnRvaDY0KGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uMzI7CiAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0xMTU1LDEzICsxMjAzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbjMyKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGZmbXBlZyBzZXRzIGR1cmF0aW9uIHRvIC0xLCB3aGljaCBpcyBpbmNvcnJlY3QuCiAgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwogICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKQEAgLTExOTAsNyArMTIzOSw2IEBACiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTMwMCw2ICsxMzQ4LDggQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKICAgICAgICAgewogICAgICAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKIApAQCAtMTM1NywxMSArMTQwNywxMiBAQAogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRDaHVua09mZnNldFBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMzcxLDExICsxNDIyLDEyIEBACiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTM4Niw2ICsxNDM4LDggQEAKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQpAQCAtMTQzOCw3ICsxNDkyLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCkBAIC0xNDYyLDYgKzE1MTUsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDcwLDEyICsxNTI1LDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDg0LDEyICsxNTQwLDEzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFN5bmNTYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0OTgsMTMgKzE1NTUsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEB4eXoKICAgICAgICAgY2FzZSBGT1VSQ0MoJ1x4QTknLCAneCcsICd5JywgJ3onKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiQHh5eiIgYm94CiAgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIkB4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LApAQCAtMTUzMywxMiArMTU5MSwxMyBAQAogCiAgICAgICAgICAgICBidWZmZXJbbG9jYXRpb25fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgYnVmZmVyKTsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xNTc2LDEyICsxNjM1LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IE5VTEwpIHsKQEAgLTE1OTcsMTIgKzE2NTcsMzIgQEAKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOwogCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLT5kYXRhKCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgogICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCkBAIC0xNjI4LDcgKzE3MDgsNiBAQAogCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTYzNiwxMSArMTcxNSwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTE2NzQsNiArMTc1NSw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA9PSA2ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlSVR1bmVzTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAKQEAgLTE2ODIsMTcgKzE3NjUsMTggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAzMikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzI0XTsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzMyXTsKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCiAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE3MDAsMTQgKzE3ODQsMjcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDY0X3QgY3JlYXRpb25UaW1lOworICAgICAgICAgICAgdWludDY0X3QgZHVyYXRpb24gPSAwOwogICAgICAgICAgICAgaWYgKGhlYWRlclswXSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTY0X0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsyMF0pOworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZoZWFkZXJbMjRdKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY3JlYXRpb25UaW1lID0gVTMyX0FUKCZoZWFkZXJbNF0pOwogICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUgPSBVMzJfQVQoJmhlYWRlclsxMl0pOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGQzMiA9IFUzMl9BVCgmaGVhZGVyWzE2XSk7CisgICAgICAgICAgICAgICAgaWYgKGQzMiA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGQzMiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZDMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CkBAIC0xNzE1LDcgKzE4MTIsNTAgQEAKIAogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5RGF0ZSwgcy5zdHJpbmcoKSk7CiAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKKyAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIDY0IGJpdAorICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAzMiBiaXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNzM2LDYgKzE4NzYsOCBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKwogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOwogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgewpAQCAtMTc1Miw3ICsxODk0LDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnZScsICd4Jyk6CisgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDI0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb247CisgICAgICAgICAgICBUcmV4IHRyZXg7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmdHJleC50cmFja19JRCkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDgsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTIsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTYsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX3NpemUpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAyMCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyZXguYWRkKHRyZXgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTc2OSw2ICsxOTMwLDcgQEAKICAgICAgICAgICAgIGlmICgoY2h1bmtfc2l6ZSA+IFNJWkVfTUFYKSB8fCAoU0laRV9NQVggLSBjaHVua19zaXplIDw9IHNpemUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIGNodW5rX3NpemVdOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTE3ODMsNiArMTk0NSw4IEBACiAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHJlYWQgcG9pbnRlciBzbyB3ZSBkb24ndCBlbmQgdXAgcmVhZGluZyB0aGlzIGFnYWluCisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtMTc5Nyw2ICsxOTYxLDggQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIGlmIChtRmlsZU1ldGFEYXRhICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJWxsZCBhbmQgZGF0YV9vZmZzZXQgPSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwpAQCAtMTgyMyw3ICsxOTg5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTgzNCwyNSArMTk5OSwyNyBAQAogICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgogICAgICAgICBjYXNlIEZPVVJDQygneScsICdyJywgJ3InLCAnYycpOgogICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlM0dQUE1ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUsIGRlcHRoKTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ0knLCAnRCcsICczJywgJzInKToKICAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNikgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlSUQzdjJNZXRhRGF0YShkYXRhX29mZnNldCArIDYpOwogCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xOTQ0LDcgKzIxMTEsNyBAQAogICAgICAgICBvZmZzZXQgKz0gMTY7CiAgICAgICAgIHNpemUgLT0gMTY7CiAgICAgfQotICAgIEFMT0dWKCJzaWR4IHByZXMvb2ZmOiAlTGQvJUxkIiwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7CisgICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICUiIFBSSXU2NCAiLyUiIFBSSXU2NCwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7CiAKICAgICBpZiAoc2l6ZSA8IDQpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTc2LDkgKzIxNDMsMTAgQEAKICAgICAgICAgICAgIEFMT0dXKCJzdWItc2lkeCBib3hlcyBub3Qgc3VwcG9ydGVkIHlldCIpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgc2FwID0gZDMgJiAweDgwMDAwMDAwOwotICAgICAgICBib29sIHNhcHR5cGUgPSBkMyA+PiAyODsKLSAgICAgICAgaWYgKCFzYXAgfHwgc2FwdHlwZSA+IDIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlIik7CisgICAgICAgIHVpbnQzMl90IHNhcHR5cGUgPSAoZDMgPj4gMjgpICYgNzsKKyAgICAgICAgaWYgKCFzYXAgfHwgKHNhcHR5cGUgIT0gMSAmJiBzYXB0eXBlICE9IDIpKSB7CisgICAgICAgICAgICAvLyB0eXBlIDEgYW5kIDIgYXJlIHN5bmMgc2FtcGxlcworICAgICAgICAgICAgQUxPR1coIm5vdCBhIHN0cmVhbSBhY2Nlc3MgcG9pbnQsIG9yIHVuc3VwcG9ydGVkIHR5cGU6ICUwOHgiLCBkMyk7CiAgICAgICAgIH0KICAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7CiAgICAgICAgIG9mZnNldCArPSAxMjsKQEAgLTE5ODksMTIgKzIxNTcsMTEgQEAKICAgICAgICAgbVNpZHhFbnRyaWVzLmFkZChzZSk7CiAgICAgfQogCi0gICAgbVNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKLSAgICBBTE9HVigiZHVyYXRpb246ICVsbGQiLCBtU2lkeER1cmF0aW9uKTsKKyAgICB1aW50NjRfdCBzaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbVNpZHhEdXJhdGlvbik7CisgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjI4NywxMSArMjQ1NCwxNCBAQAogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpIHsKLSAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICBpZiAoc2l6ZSA8IDQgfHwgc2l6ZSA9PSBTSVpFX01BWCkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCiAgICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwpAQCAtMjM1Nyw2ICsyNTI3LDEwIEBACiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwogCiAgICAgICAgIC8vIHNtYWxsZXN0IHBvc3NpYmxlIHZhbGlkIFVURi0xNiBzdHJpbmcgdyBCT006IDB4ZmUgMHhmZiAweDAwIDB4MDAKKyAgICAgICAgaWYgKHNpemUgPCA2KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKICAgICAgICAgaWYgKHNpemUgLSA2ID49IDQpIHsKICAgICAgICAgICAgIGxlbjE2ID0gKChzaXplIC0gNikgLyAyKSAtIDE7IC8vIGRvbid0IGluY2x1ZGUgMHgwMDAwIHRlcm1pbmF0b3IKICAgICAgICAgICAgIGZyYW1lZGF0YSA9IChjaGFyMTZfdCAqKShidWZmZXIgKyA2KTsKQEAgLTIzODAsNiArMjU1NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNVVEY4KSB7CisgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAwOwogICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBVVEYtMTYgc3RyaW5nIHRvIFVURi04IHN0cmluZy4KQEAgLTI0NzAsMTEgKzI2NDUsMjcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJWQiLCBtUHNzaC5zaXplKCkpOwogCi0gICAgcmV0dXJuIG5ldyBNUEVHNFNvdXJjZSgKKyAgICBUcmV4ICp0cmV4ID0gTlVMTDsKKyAgICBpbnQzMl90IHRyYWNrSWQ7CisgICAgaWYgKHRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgeworICAgICAgICAgICAgICAgIHRyZXggPSB0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImIvMjE2NTc5NTciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQUxPR1YoImdldFRyYWNrIGNhbGxlZCwgcHNzaDogJXp1IiwgbVBzc2guc2l6ZSgpKTsKKworICAgIHJldHVybiBuZXcgTVBFRzRTb3VyY2UodGhpcywKICAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCBtTW9vZk9mZnNldCk7CisgICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0KTsKIH0KIAogLy8gc3RhdGljCkBAIC0yNDkwLDYgKzI2ODEsMTEgQEAKICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlQVZDQykgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVIVkNDKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCkBAIC0yNDk4LDE0ICsyNjk0LDY3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7CisgICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMIHx8ICF0cmFjay0+c2FtcGxlVGFibGUtPmlzVmFsaWQoKSkgewogICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIG1ldGFkYXRhIHdlIG5lZWQuCisgICAgICAgIEFMT0dFKCJzdGJsIGF0b20gbWlzc2luZy9pbnZhbGlkLiIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAordHlwZWRlZiBlbnVtIHsKKyAgICAvL0FPVF9OT05FICAgICAgICAgICAgID0gLTEsCisgICAgLy9BT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCisgICAgLy9BT1RfQUFDX01BSU4gICAgICAgICA9IDEsIC8qKjwgTWFpbiBwcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfQUFDX0xDICAgICAgICAgICA9IDIsICAgLyoqPCBMb3cgQ29tcGxleGl0eSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAorICAgIC8vQU9UX0FBQ19MVFAgICAgICAgICAgPSA0LAorICAgIEFPVF9TQlIgICAgICAgICAgICAgID0gNSwKKyAgICAvL0FPVF9BQUNfU0NBTCAgICAgICAgID0gNiwKKyAgICAvL0FPVF9UV0lOX1ZRICAgICAgICAgID0gNywKKyAgICAvL0FPVF9DRUxQICAgICAgICAgICAgID0gOCwKKyAgICAvL0FPVF9IVlhDICAgICAgICAgICAgID0gOSwKKyAgICAvL0FPVF9SU1ZEXzEwICAgICAgICAgID0gMTAsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzExICAgICAgICAgID0gMTEsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9UVFNJICAgICAgICAgICAgID0gMTIsIC8qKjwgVFRTSSBPYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9NQUlOX1NZTlRIICAgICAgID0gMTMsIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9XQVZfVEFCX1NZTlRIICAgID0gMTQsIC8qKjwgV2F2ZXRhYmxlIFN5bnRoZXNpcyBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9HRU5fTUlESSAgICAgICAgID0gMTUsIC8qKjwgR2VuZXJhbCBNSURJIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KKyAgICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93IENvbXBsZXhpdHkgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzE4ICAgICAgICAgID0gMTgsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgU2NhbGFibGUgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9UV0lOX1ZRICAgICAgID0gMjEsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBUd2luVlEgb2JqZWN0ICAgICAgICAgKi8KKyAgICBBT1RfRVJfQlNBQyAgICAgICAgICA9IDIyLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAgIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTG93RGVsYXkgb2JqZWN0ICAgKi8KKyAgICAvL0FPVF9FUl9DRUxQICAgICAgICAgID0gMjQsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBDRUxQIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9ISUxOICAgICAgICAgID0gMjYsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBISUxOIG9iamVjdCAgICAgICAgICAgKi8KKyAgICAvL0FPVF9FUl9QQVJBICAgICAgICAgID0gMjcsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBQYXJhbWV0cmljIG9iamVjdCAgICAgKi8KKyAgICAvL0FPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUFMsIFBhcmFtZXRyaWMgU3RlcmVvIChpbmNsdWRlcyBTQlIpICAgICAgKi8KKyAgICAvL0FPVF9NUEVHUyAgICAgICAgICAgID0gMzAsIC8qKjwgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEFPVF9FU0NBUEUgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgQU9UIHVzZXMgbW9yZSB0aGFuIDUgYml0cyAgICAgICAgICAqLworCisgICAgLy9BT1RfTVAzT05NUDRfTDEgICAgICA9IDMyLCAvKio8IE1QRUctTGF5ZXIxIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTVAzT05NUDRfTDMgICAgICA9IDM0LCAvKio8IE1QRUctTGF5ZXIzIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNSAgICAgICAgICA9IDM1LCAvKio8IG1pZ2h0IGJlY29tZSBEU1QgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUFDX1NMUyAgICAgICAgICA9IDM3LCAvKio8IEFBQyArIFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfU0xTICAgICAgICAgICAgICA9IDM4LCAvKio8IFNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvL0FPVF9VU0FDICAgICAgICAgICAgID0gNDIsIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9TQU9DICAgICAgICAgICAgID0gNDMsIC8qKjwgU0FPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9MRF9NUEVHUyAgICAgICAgID0gNDQsIC8qKjwgTG93IERlbGF5IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8vQU9UX1JTVkQ1MCAgICAgICAgICAgPSA1MCwgIC8qKjwgSW50ZXJpbSBBT1QgZm9yIFJzdmQ1MCAgICAgICAgICAgICAgICAgICAqLworfSBBVURJT19PQkpFQ1RfVFlQRTsKKwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKICAgICAgICAgY29uc3Qgdm9pZCAqZXNkc19kYXRhLCBzaXplX3QgZXNkc19zaXplKSB7CiAgICAgRVNEUyBlc2RzKGVzZHNfZGF0YSwgZXNkc19zaXplKTsKQEAgLTI1ODgsNyArMjgzNyw3IEBACiAgICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07CiAgICAgfQogCi0gICAgaWYgKG9iamVjdFR5cGUgPT0gNSB8fCBvYmplY3RUeXBlID09IDI5KSB7IC8vIFNCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGU7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKQEAgLTI2MDYsNiArMjg1NSwxMzEgQEAKICAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCisgICAgc3dpdGNoIChudW1DaGFubmVscykgeworICAgICAgICAvLyB2YWx1ZXMgZGVmaW5lZCBpbiAxNDQ5Ni0zXzIwMDkgYW1lbmRtZW50LTQgVGFibGUgMS4xOSAtIENoYW5uZWwgQ29uZmlndXJhdGlvbgorICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMTovLyBGQworICAgICAgICBjYXNlIDI6Ly8gRkwgRlIKKyAgICAgICAgY2FzZSAzOi8vIEZDLCBGTCBGUgorICAgICAgICBjYXNlIDQ6Ly8gRkMsIEZMIEZSLCBSQworICAgICAgICBjYXNlIDU6Ly8gRkMsIEZMIEZSLCBTTCBTUgorICAgICAgICBjYXNlIDY6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgTEZFCisgICAgICAgICAgICAvL251bUNoYW5uZWxzIGFscmVhZHkgY29udGFpbnMgdGhlIHJpZ2h0IHZhbHVlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMTovLyBGQywgRkwgRlIsIFNMIFNSLCBSQywgTEZFCisgICAgICAgICAgICBudW1DaGFubmVscyA9IDc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvLyBGQywgRkNMIEZDUiwgRkwgRlIsIFNMIFNSLCBMRkUKKyAgICAgICAgY2FzZSAxMjovLyBGQywgRkwgIEZSLCAgU0wgU1IsIFJMIFJSLCBMRkUKKyAgICAgICAgY2FzZSAxNDovLyBGQywgRkwgIEZSLCAgU0wgU1IsIExGRSwgRkhMIEZIUgorICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgeworICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7CisgICAgICAgICAgICBvYmplY3RUeXBlID0gYnIuZ2V0Qml0cyg1KTsKKworICAgICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0VTQ0FQRSkgeworICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKKyAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvcmVDb2RlckRlbGF5ID0gYnIuZ2V0Qml0cygxNCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAob2JqZWN0VHlwZSkgeworICAgICAgICAgICAgICAgIC8vIDE0NDk2LTMgNC41LjEuMSBleHRlbnNpb25GbGFnCisgICAgICAgICAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0JTQUM6CisgICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0xEOgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dXKCJjc2QgbWlzc2luZyBleHRlbnNpb24gZmxhZzsgYXNzdW1pbmcgJWQgZm9yIG9iamVjdCB0eXBlICV1LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnLCBvYmplY3RUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxzTnVtID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUxmZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1vbm9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTWF0cml4TWl4ZG93bkluZGV4ID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQc2V1ZG9TdXJyb3VuZEVuYWJsZSA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1Gcm9udENoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEJhY2tFbGVtZW50VGFnU2VsZWN0ID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gQmFja0VsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IGNoYW5uZWxzTnVtOworCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IExmZUVsZW1lbnRUYWdTZWxlY3QgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNOdW0gPSAlZCIsIGNoYW5uZWxzTnVtKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAlZCIsIGNoYW5uZWxzRWZmZWN0aXZlTnVtKTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IGNoYW5uZWxzTnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTI2MzYsMTkgKzMwMTAsMjMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0U291cmNlOjpNUEVHNFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8TVBFRzRFeHRyYWN0b3I+ICZvd25lciwKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCisgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0KQotICAgIDogbUZvcm1hdChmb3JtYXQpLAorICAgIDogbU93bmVyKG93bmVyKSwKKyAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLAogICAgICAgbVNhbXBsZVRhYmxlKHNhbXBsZVRhYmxlKSwKICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgoMCksCiAgICAgICBtQ3VycmVudEZyYWdtZW50SW5kZXgoMCksCiAgICAgICBtU2VnbWVudHMoc2lkeCksCisgICAgICBtVHJleCh0cmV4KSwKICAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKICAgICAgIG1DdXJyZW50TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAogICAgICAgbUN1cnJlbnRUaW1lKDApLApAQCAtMjY1Nyw2ICszMDM1LDcgQEAKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUoMCksCiAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKE5VTEwpLAogICAgICAgbUlzQVZDKGZhbHNlKSwKKyAgICAgIG1Jc0hFVkMoZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtR3JvdXAoTlVMTCksCkBAIC0yNjY0LDYgKzMwNDMsOCBAQAogICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCkgewogCisgICAgbWVtc2V0KCZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8sIDAsIHNpemVvZihtVHJhY2tGcmFnbWVudEhlYWRlckluZm8pKTsKKwogICAgIG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKICAgICBtRGVmYXVsdElWU2l6ZSA9IDA7CiAgICAgbUZvcm1hdC0+ZmluZEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCAmbURlZmF1bHRJVlNpemUpOwpAQCAtMjY4MSw2ICszMDYyLDcgQEAKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwogCiAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICB1aW50MzJfdCB0eXBlOwpAQCAtMjY5NSw2ICszMDc3LDE4IEBACiAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCiAgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKKyAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKXB0clswXSwgMXUpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorCisgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbMTQgKyA3XSAmIDMpOwogICAgIH0KIAogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKQEAgLTI4MTgsOSArMzIxMiwyMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICAgICAgLy8gKm9mZnNldCBwb2ludHMgdG8gdGhlIG1kYXQgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YKLSAgICAgICAgICAgICAgICBwYXJzZUNodW5rKG9mZnNldCk7IC8vIGRvZXNuJ3QgYWN0dWFsbHkgcGFyc2UgaXQsIGp1c3QgdXBkYXRlcyBvZmZzZXQKLSAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgIC8vICpvZmZzZXQgcG9pbnRzIHRvIHRoZSBib3ggZm9sbG93aW5nIHRoaXMgbW9vZi4gRmluZCB0aGUgbmV4dCBtb29mIGZyb20gdGhlcmUuCisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg3OSw3ICszMjg0LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgeworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewogICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMiKTsKICAgICAvLyAxNDQ5Ni0xMiA4LjcuMTIKICAgICB1aW50OF90IHZlcnNpb247CkBAIC0yOTQxLDcgKzMzNDcsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpIHsKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewogICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyIpOwogICAgIC8vIDE0NDk2LTEyIDguNy4xMwogICAgIHVpbnQ4X3QgdmVyc2lvbjsKQEAgLTMyNDAsOCArMzY0Nyw4IEBACiAgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCiAgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewogICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb247CisgICAgfSBlbHNlIGlmIChtVHJleCkgeworICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmV4LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlU2l6ZVByZXNlbnQpIHsKQEAgLTMyNjgsNyArMzY3NSw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCBzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CisgICAgaWYgKHNpemUgPCAob2ZmNjRfdClzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMzMwMiw3ICszNzA5LDcgQEAKICAgICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4bGx4LCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgorICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgogICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCkBAIC0zMzEwLDYgKzM3MTcsNyBAQAogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKKyAgICAgICAgdG1wLmNvbXBvc2l0aW9uT2Zmc2V0ID0gc2FtcGxlQ3RzT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFNhbXBsZXMuYWRkKHRtcCk7CiAKICAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwpAQCAtMzM4MSw3ICszNzg5LDcgQEAKIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKiBtVGltZXNjYWxlIC8gMTAwMDAwMCwKKyAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAogICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKIAogICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CkBAIC0zNDQzLDcgKzM4NTEsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQ7CiAgICAgc2l6ZV90IHNpemU7Ci0gICAgdWludDMyX3QgY3RzOworICAgIHVpbnQzMl90IGN0cywgc3R0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTM0NTEsNyArMzg1OSw3IEBACiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzQ2OSw3ICszODc3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghbUlzQVZDIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQogICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CkBAIC0zNDg2LDYgKzM4OTQsOCBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM0OTksNyArMzkwOSw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzU3NCwxMiArMzk4NCwxMiBAQAogICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKICAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwogICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwogICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwogICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewpAQCAtMzYxOSw2ICs0MDI5LDggQEAKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM2NjEsNyArNDA3Myw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQykgfHwKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgpAQCAtMzY3NCwxMSArNDA4NiwxOSBAQAogICAgICAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwogICAgICAgICAgICAgfQotICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVzLmNsZWFyKCk7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CisgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSB0b3RhbE9mZnNldDsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0b3RhbE9mZnNldCk7CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBwYXJzZUNodW5rKCZ0bXApOworICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKQEAgLTM2OTAsNyArNDExMCw3IEBACiAgICAgfQogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwotICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBzaXplID0gMDsKICAgICB1aW50MzJfdCBjdHMgPSAwOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlID0gZmFsc2U7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKQEAgLTM2OTgsMjIgKzQxMTgsMjQgQEAKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgZnJhZ21lbnQKLSAgICAgICAgICAgIFNhbXBsZSBsYXN0U2FtcGxlID0gbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlcy5zaXplKCkgLSAxXTsKLSAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7IC8vIGxhc3RTYW1wbGUub2Zmc2V0ICsgbGFzdFNhbXBsZS5zaXplOworICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQorICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3QgbmV4dE1vb2YgPSBtTmV4dE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBtQ3VycmVudE1vb2ZPZmZzZXQgPSBuZXh0TW9vZjsKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOwogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBwYXJzZUNodW5rKCZuZXh0TW9vZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwotICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWU7CisgICAgICAgIGN0cyA9IG1DdXJyZW50VGltZSArIHNtcGwtPmNvbXBvc2l0aW9uT2Zmc2V0OwogICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CiAgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOyAvLyBYWFgKIApAQCAtMzc0NSw3ICs0MTY3LDcgQEAKICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBtQ3J5cHRvS2V5LCAxNik7CiAgICAgfQogCi0gICAgaWYgKCFtSXNBVkMgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMzc3MCw2ICs0MTkyLDggQEAKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKQEAgLTM3ODMsNyArNDIwNyw3IEBACiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQykgeworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIApAQCAtMzkyOSw2ICs0MzUzLDggQEAKIAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KApAQCAtMzk5MSw2ICs0NDE3LDggQEAKICAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICdtJyksCiAgICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnMicpLAogICAgICAgICBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyksCisgICAgICAgIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpLAogICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICdwJywgJzQnKSwKICAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcxJyksCiAgICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMicpLApAQCAtNDA2Miw3ICs0NDkwLDcgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJWxsZCBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCBvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNDI4ODVkZC4uNGI4NDQwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMTYsMTIgKzE2LDE3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzRXcml0ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgpAQCAtMzMsMTMgKzM4LDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIAorI2RlZmluZSBXQVJOX1VOTEVTUyhjb25kaXRpb24sIG1lc3NhZ2UsIC4uLikgXAorKCAoQ09ORElUSU9OKGNvbmRpdGlvbikpID8gZmFsc2UgOiAoeyBcCisgICAgQUxPR1coIkNvbmRpdGlvbiAlcyBmYWlsZWQgIiAgbWVzc2FnZSwgI2NvbmRpdGlvbiwgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB0cnVlOyBcCit9KSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluU3RyZWFtYWJsZUZpbGVTaXplSW5CeXRlcyA9IDUgKiAxMDI0ICogMTAyNDsKQEAgLTQwOCw3ICs0MTUsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmR1bXAoCi0gICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgeworICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKQEAgLTQxOSw3ICs0MjYsNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgZnJhbWVzIGVuY29kZWQgOiAlZFxuIiwgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgZHVyYXRpb24gZW5jb2RlZCA6ICVsbGQgdXNcbiIsIG1UcmFja0R1cmF0aW9uVXMpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICBkdXJhdGlvbiBlbmNvZGVkIDogJSIgUFJJZDY0ICIgdXNcbiIsIG1UcmFja0R1cmF0aW9uVXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBPSzsKQEAgLTQzNCw3ICs0NDEsNyBAQAogCiAgICAgLy8gQXQgbW9zdCAyIHRyYWNrcyBjYW4gYmUgc3VwcG9ydGVkLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgIEFMT0dFKCJUb28gbWFueSB0cmFja3MgKCVkKSB0byBhZGQiLCBtVHJhY2tzLnNpemUoKSk7CisgICAgICAgIEFMT0dFKCJUb28gbWFueSB0cmFja3MgKCV6dSkgdG8gYWRkIiwgbVRyYWNrcy5zaXplKCkpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCkBAIC01NDgsOCArNTU1LDggQEAKICAgICAgICAgc2l6ZSA9IE1BWF9NT09WX0JPWF9TSVpFOwogICAgIH0KIAotICAgIEFMT0dJKCJsaW1pdHM6ICVsbGQvJWxsZCBieXRlcy91cywgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCIKLSAgICAgICAgICIgbW9vdiBzaXplICVsbGQgYnl0ZXMiLAorICAgIEFMT0dJKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCBiaXQgcmF0ZTogJWQgYnBzIGFuZCB0aGUiCisgICAgICAgICAiIGVzdGltYXRlZCBtb292IHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAogICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOwogICAgIHJldHVybiBmYWN0b3IgKiBzaXplOwogfQpAQCAtNTg1LDggKzU5Miw4IEBACiAgICAgICAgIC8vIElmIGZpbGUgc2l6ZSBpcyBzZXQgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIDMyIGJpdCBmaWxlCiAgICAgICAgIC8vIHNpemUgbGltaXQsIHRyZWF0IGl0IGFzIGFuIGVycm9yLgogICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA+IGtNYXgzMkJpdEZpbGVTaXplKSB7Ci0gICAgICAgICAgICBBTE9HVygiMzItYml0IGZpbGUgc2l6ZSBsaW1pdCAoJWxsZCBieXRlcykgdG9vIGJpZy4gIgotICAgICAgICAgICAgICAgICAiSXQgaXMgY2hhbmdlZCB0byAlbGxkIGJ5dGVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIzMi1iaXQgZmlsZSBzaXplIGxpbWl0ICglIiBQUklkNjQgIiBieXRlcykgdG9vIGJpZy4gIgorICAgICAgICAgICAgICAgICAiSXQgaXMgY2hhbmdlZCB0byAlIiBQUklkNjQgIiBieXRlcyIsCiAgICAgICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywga01heDMyQml0RmlsZVNpemUpOwogICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcyA9IGtNYXgzMkJpdEZpbGVTaXplOwogICAgICAgICB9CkBAIC04NDcsNyArODU0LDcgQEAKICAgICB9CiAKICAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJWxsZCwgJWxsZF0gdXMiLAorICAgICAgICBBTE9HRCgiRHVyYXRpb24gZnJvbSB0cmFja3MgcmFuZ2UgaXMgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0gdXMiLAogICAgICAgICAgICAgbWluRHVyYXRpb25VcywgbWF4RHVyYXRpb25Vcyk7CiAgICAgfQogCkBAIC05NzQsMTMgKzk4MSwxNiBAQAogICAgIGlmIChwYXJhbSAmJiBwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSAmJgogICAgICAgICBmaWxlVHlwZSAhPSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICB3cml0ZUZvdXJjYygiM2dwNCIpOwotICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlSW50MzIoMCk7CiAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgd3JpdGVJbnQzMigwKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKICAgICB9CiAKLSAgICB3cml0ZUludDMyKDApOwotICAgIHdyaXRlRm91cmNjKCJpc29tIik7Ci0gICAgd3JpdGVGb3VyY2MoIjNncDQiKTsKICAgICBlbmRCb3goKTsKIH0KIApAQCAtMTMxMSwxMiArMTMyMSwxMiBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKSB7Ci0gICAgQUxPR0koInNldFN0YXJ0VGltZXN0YW1wVXM6ICVsbGQiLCB0aW1lVXMpOworICAgIEFMT0dJKCJzZXRTdGFydFRpbWVzdGFtcFVzOiAlIiBQUklkNjQsIHRpbWVVcyk7CiAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKG1TdGFydFRpbWVzdGFtcFVzIDwgMCB8fCBtU3RhcnRUaW1lc3RhbXBVcyA+IHRpbWVVcykgewogICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVVczsKLSAgICAgICAgQUxPR0koIkVhcmxpZXN0IHRyYWNrIHN0YXJ0aW5nIHRpbWU6ICVsbGQiLCBtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgICAgIEFMT0dJKCJFYXJsaWVzdCB0cmFjayBzdGFydGluZyB0aW1lOiAlIiBQUklkNjQsIG1TdGFydFRpbWVzdGFtcFVzKTsKICAgICB9CiB9CiAKQEAgLTE0MDYsNyArMTQxNiw3IEBACiAgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCBkdXJhdGlvbikgewogCiAgICAgaWYgKGR1cmF0aW9uID09IDApIHsKLSAgICAgICAgQUxPR1coIjAtZHVyYXRpb24gc2FtcGxlcyBmb3VuZDogJWQiLCBzYW1wbGVDb3VudCk7CisgICAgICAgIEFMT0dXKCIwLWR1cmF0aW9uIHNhbXBsZXMgZm91bmQ6ICV6dSIsIHNhbXBsZUNvdW50KTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVDb3VudCkpOwogICAgIG1TdHRzVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoZHVyYXRpb24pKTsKQEAgLTE1MTcsNyArMTUyNyw3IEBACiAgICAgewogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCAmdGltZVVzKSkgewotICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmUgcmVxdWVzdCB0byB0cmFjayBwcm9ncmVzcyBzdGF0dXMgZm9yIGV2ZXJ5ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICAgICAgQUxPR1YoIlJlY2VpdmUgcmVxdWVzdCB0byB0cmFjayBwcm9ncmVzcyBzdGF0dXMgZm9yIGV2ZXJ5ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKICAgICAgICAgICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICBtVHJhY2tpbmdQcm9ncmVzc1N0YXR1cyA9IHRydWU7CiAgICAgICAgIH0KQEAgLTE1NTEsNyArMTU2MSw3IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ2h1bmtUb0ZpbGUoQ2h1bmsqIGNodW5rKSB7Ci0gICAgQUxPR1YoIndyaXRlQ2h1bmtUb0ZpbGU6ICVsbGQgZnJvbSAlcyB0cmFjayIsCisgICAgQUxPR1YoIndyaXRlQ2h1bmtUb0ZpbGU6ICUiIFBSSWQ2NCAiIGZyb20gJXMgdHJhY2siLAogICAgICAgICBjaHVuay0+bVRpbWVTdGFtcFVzLCBjaHVuay0+bVRyYWNrLT5pc0F1ZGlvKCk/ICJhdWRpbyI6ICJ2aWRlbyIpOwogCiAgICAgaW50MzJfdCBpc0ZpcnN0U2FtcGxlID0gdHJ1ZTsKQEAgLTE1ODYsNyArMTU5Niw3IEBACiAgICAgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAKICAgICBtQ2h1bmtJbmZvcy5jbGVhcigpOwotICAgIEFMT0dEKCIlZCBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7CisgICAgQUxPR0QoIiV6dSBjaHVua3MgYXJlIHdyaXR0ZW4gaW4gdGhlIGxhc3QgYmF0Y2giLCBvdXRzdGFuZGluZ0NodW5rcyk7CiB9CiAKIGJvb2wgTVBFRzRXcml0ZXI6OmZpbmRDaHVua1RvV3JpdGUoQ2h1bmsgKmNodW5rKSB7CkBAIC0xNzI3LDcgKzE3MzcsNyBAQAogICAgICAgICAgICAgc3RhcnRUaW1lT2Zmc2V0VXMgPSBrSW5pdGlhbERlbGF5VGltZVVzOwogICAgICAgICB9CiAgICAgICAgIHN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOwotICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICVsbGQgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CisgICAgICAgIEFMT0dJKCJTdGFydCB0aW1lIG9mZnNldDogJSIgUFJJZDY0ICIgdXMiLCBzdGFydFRpbWVPZmZzZXRVcyk7CiAgICAgfQogCiAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIHN0YXJ0VGltZVVzKTsKQEAgLTE3NjIsNyArMTc3Miw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RvcCgpIHsKLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2siLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgQUxPR0QoIiVzIHRyYWNrIHN0b3BwaW5nIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwogICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR0UoIlN0b3AoKSBjYWxsZWQgYnV0IHRyYWNrIGlzIG5vdCBzdGFydGVkIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwpAQCAtMTc3MywxOCArMTc4MywxMyBAQAogICAgIH0KICAgICBtRG9uZSA9IHRydWU7CiAKKyAgICBBTE9HRCgiJXMgdHJhY2sgc291cmNlIHN0b3BwaW5nIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBBTE9HRCgiJXMgdHJhY2sgc291cmNlIHN0b3BwZWQiLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKLQotICAgIHN0YXR1c190IGVyciA9IChzdGF0dXNfdCkgZHVtbXk7Ci0KLSAgICBBTE9HRCgiU3RvcHBpbmcgJXMgdHJhY2sgc291cmNlIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwotICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgZXJyID0gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQorICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKIAogICAgIEFMT0dEKCIlcyB0cmFjayBzdG9wcGVkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIpOwogICAgIHJldHVybiBlcnI7CkBAIC0xNzk5LDcgKzE4MDQsNyBAQAogICAgIFRyYWNrICp0cmFjayA9IHN0YXRpY19jYXN0PFRyYWNrICo+KG1lKTsKIAogICAgIHN0YXR1c190IGVyciA9IHRyYWNrLT50aHJlYWRFbnRyeSgpOwotICAgIHJldHVybiAodm9pZCAqKSBlcnI7CisgICAgcmV0dXJuICh2b2lkICopKHVpbnRwdHJfdCllcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGdldE5hbFVuaXRUeXBlKHVpbnQ4X3QgYnl0ZSwgdWludDhfdCogdHlwZSkgewpAQCAtMTgxMiw3ICsxODE3LDcgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTmV4dFN0YXJ0Q29kZSgKICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkgewogCi0gICAgQUxPR1YoImZpbmROZXh0U3RhcnRDb2RlOiAlcCAlZCIsIGRhdGEsIGxlbmd0aCk7CisgICAgQUxPR1YoImZpbmROZXh0U3RhcnRDb2RlOiAlcCAlenUiLCBkYXRhLCBsZW5ndGgpOwogCiAgICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKICAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKQEAgLTE4NzEsNyArMTg3Niw3IEBACiAgICAgLy8gMiBieXRlcyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVyIHNldCBsZW5ndGggZmllbGQKICAgICAvLyBwbHVzIHRoZSA3IGJ5dGVzIGZvciB0aGUgaGVhZGVyCiAgICAgaWYgKHNpemUgPCA0ICsgNykgewotICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlZCIsIHNpemUpOworICAgICAgICBBTE9HRSgiQ29kZWMgc3BlY2lmaWMgZGF0YSBsZW5ndGggdG9vIHNob3J0OiAlenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKQEAgLTE5NDAsNyArMTk0NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA+IDB4MUYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOworICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJXp1KSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NTMsNyArMTk1OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmIChuUGljUGFyYW1TZXRzID4gMHhGRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHBpYyBwYXJhbWV0ZXIgc2V0cyAoJWQpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7CisgICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglemQpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMTk4Myw3ICsxOTg4LDcgQEAKICAgICB9CiAKICAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKKyAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJXp1Iiwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCkBAIC0yMDk5LDYgKzIxMDQsNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBjb25zdCBjaGFyICp0cmFja05hbWUgPSBtSXNBdWRpbyA/ICJBdWRpbyIgOiAiVmlkZW8iOwogICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcikpID09IE9LKSB7CiAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjE5NCwxNSArMjIwMCwyNyBAQAogCiAgICAgICAgIGlmIChtUmVzdW1lZCkgewogICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOwotICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHBhdXNlZER1cmF0aW9uVXMgPj0gbGFzdER1cmF0aW9uVXMsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSBwYXVzZWREdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXM7CiAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZTogdGltZXN0YW1wVXMKQEAgLTIyMTQsMTUgKzIyMzIsMjMgQEAKICAgICAgICAgICAgIGRlY29kaW5nVGltZVVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKICAgICAgICAgICAgIGN0dHNPZmZzZXRUaW1lVXMgPQogICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDS19HRShjdHRzT2Zmc2V0VGltZVVzLCAwbGwpOworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN0dHNPZmZzZXRUaW1lVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICVsbGQgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICVsbGQiLAorICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICUiIFBSSWQ2NCAiIGFuZCBjdHRzIG9mZnNldCB0aW1lOiAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNPZmZzZXRUaW1lVXMpOwogCiAgICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyBib3ggdGFibGUgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICBjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9CiAgICAgICAgICAgICAgICAgICAgIChjdHRzT2Zmc2V0VGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKLSAgICAgICAgICAgIENIRUNLX0xFKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzLCAweDBGRkZGRkZGRkxMKTsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA8PSAweDBGRkZGRkZGRkxMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBmaXJzdCBjdHRzIHRhYmxlIGVudHJ5IHRvIGhhdmUgb25lIHNpbmdsZSBlbnRyeQogICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIGRvIGFkanVzdG1lbnQgZm9yIHRoZSBpbml0aWFsIHRyYWNrIHN0YXJ0CkBAIC0yMjYwLDkgKzIyODYsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOwotICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJWxsZCBhbmQgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uICVsbGQiLAotICAgICAgICAgICAgICAgIG1Jc0F1ZGlvPyAiQXVkaW8iOiAiVmlkZW8iLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgewogICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0yMjc2LDExICsyMzA2LDI4IEBACiAgICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCiAgICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwogICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0aW1lc3RhbXBVcyAlbGxkIDwgbGFzdFRpbWVzdGFtcFVzICVsbGQgZm9yICVzIHRyYWNrIiwKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgICAgICAgICBBTE9HRSgidGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgPCBsYXN0VGltZXN0YW1wVXMgJSIgUFJJZDY0ICIgZm9yICVzIHRyYWNrIiwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzLCB0cmFja05hbWUpOworICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBpZiB0aGUgZHVyYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGlzIHNhbXBsZSwgc2VlIGlmIGl0IGlzIGNsb3NlIGVub3VnaCB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgLy8gZHVyYXRpb24gdGhhdCB3ZSBjYW4gZnVkZ2UgaXQgYW5kIHVzZSB0aGUgc2FtZSB2YWx1ZSwgdG8gYXZvaWQgZmlsbGluZyB0aGUgc3R0cyB0YWJsZQorICAgICAgICAvLyB3aXRoIGxvdHMgb2YgbmVhci1pZGVudGljYWwgZW50cmllcy4KKyAgICAgICAgLy8gImNsb3NlIGVub3VnaCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGR1cmF0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IGxlc3MKKyAgICAgICAgLy8gdGhhbiAwLjEgbWlsbGlzZWNvbmRzCisgICAgICAgIGlmIChsYXN0RHVyYXRpb25UaWNrcyAmJiAoY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpKSB7CisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhVXMgPSAoKGxhc3REdXJhdGlvblRpY2tzIC0gY3VyckR1cmF0aW9uVGlja3MpICogMTAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICsgKG1UaW1lU2NhbGUgLyAyKSkgLyBtVGltZVNjYWxlOworICAgICAgICAgICAgaWYgKGRlbHRhVXMgPiAtMTAwICYmIGRlbHRhVXMgPCAxMDApIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgcHJldmlvdXMgdGlja3MsIGFuZCBhZGp1c3QgdGltZXN0YW1wIGFzIGlmIGl0IHdhcyBhY3R1YWxseSB0aGF0IG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIHRpY2tzCisgICAgICAgICAgICAgICAgY3VyckR1cmF0aW9uVGlja3MgPSBsYXN0RHVyYXRpb25UaWNrczsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSBkZWx0YVVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVTaXplKSk7CiAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA+IDIpIHsKIApAQCAtMjMwMCw4ICsyMzQ3LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByZXZpb3VzU2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7CisgICAgICAgIEFMT0dWKCIlcyB0aW1lc3RhbXBVcy9sYXN0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICB0cmFja05hbWUsIHRpbWVzdGFtcFVzLCBsYXN0VGltZXN0YW1wVXMpOwogICAgICAgICBsYXN0RHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzIC0gbGFzdFRpbWVzdGFtcFVzOwogICAgICAgICBsYXN0RHVyYXRpb25UaWNrcyA9IGN1cnJEdXJhdGlvblRpY2tzOwogICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKQEAgLTI0MDYsOSArMjQ1Myw5IEBACiAgICAgc2VuZFRyYWNrU3VtbWFyeShoYXNNdWx0aXBsZVRyYWNrcyk7CiAKICAgICBBTE9HSSgiUmVjZWl2ZWQgdG90YWwvMC1sZW5ndGggKCVkLyVkKSBidWZmZXJzIGFuZCBlbmNvZGVkICVkIGZyYW1lcy4gLSAlcyIsCi0gICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCBtSXNBdWRpbz8gImF1ZGlvIjogInZpZGVvIik7CisgICAgICAgICAgICBjb3VudCwgblplcm9MZW5ndGhGcmFtZXMsIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpLCB0cmFja05hbWUpOwogICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICBBTE9HSSgiQXVkaW8gdHJhY2sgZHJpZnQgdGltZTogJWxsZCB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CisgICAgICAgIEFMT0dJKCJBdWRpbyB0cmFjayBkcmlmdCB0aW1lOiAlIiBQUklkNjQgIiB1cyIsIG1Pd25lci0+Z2V0RHJpZnRUaW1lVXMoKSk7CiAgICAgfQogCiAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CkBAIC0yNDkxLDExICsyNTM4LDExIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKLSAgICBBTE9HVigidHJhY2tQcm9ncmVzc1N0YXR1czogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgQUxPR1YoInRyYWNrUHJvZ3Jlc3NTdGF0dXM6ICUiIFBSSWQ2NCAiIHVzIiwgdGltZVVzKTsKIAogICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCAmJgogICAgICAgICB0aW1lVXMgLSBtUHJldmlvdXNUcmFja1RpbWVVcyA+PSBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKSB7Ci0gICAgICAgIEFMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICBBTE9HVigiRmlyZSB0aW1lIHRyYWNraW5nIHByb2dyZXNzIHN0YXR1cyBhdCAlIiBQUklkNjQgIiB1cyIsIHRpbWVVcyk7CiAgICAgICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyhtVHJhY2tJZCwgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CiAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOwogICAgIH0KQEAgLTI1MjksMTMgKzI1NzYsMTMgQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6c2V0RHJpZnRUaW1lVXMoaW50NjRfdCBkcmlmdFRpbWVVcykgewotICAgIEFMT0dWKCJzZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIGRyaWZ0VGltZVVzKTsKKyAgICBBTE9HVigic2V0RHJpZnRUaW1lVXM6ICUiIFBSSWQ2NCAiIHVzIiwgZHJpZnRUaW1lVXMpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgbURyaWZ0VGltZVVzID0gZHJpZnRUaW1lVXM7CiB9CiAKIGludDY0X3QgTVBFRzRXcml0ZXI6OmdldERyaWZ0VGltZVVzKCkgewotICAgIEFMT0dWKCJnZXREcmlmdFRpbWVVczogJWxsZCB1cyIsIG1EcmlmdFRpbWVVcyk7CisgICAgQUxPR1YoImdldERyaWZ0VGltZVVzOiAlIiBQUklkNjQgIiB1cyIsIG1EcmlmdFRpbWVVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbURyaWZ0VGltZVVzOwogfQpAQCAtMjk5MSw3ICszMDM4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFMT0dWKCJjdHRzIGJveCBoYXMgJWQgZW50cmllcyB3aXRoIHJhbmdlIFslbGxkLCAlbGxkXSIsCisgICAgQUxPR1YoImN0dHMgYm94IGhhcyAlZCBlbnRyaWVzIHdpdGggcmFuZ2UgWyUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIl0iLAogICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCksIG1NaW5DdHRzT2Zmc2V0VGltZVVzLCBtTWF4Q3R0c09mZnNldFRpbWVVcyk7CiAKICAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcAppbmRleCAyNDg0MjEyLi5kNjgwZTBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICAgICBDSEVDSyhtQ3VycmVudE1lZGlhQnVmZmVyID09IE5VTEwpOwogfQogCi1zdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IE1lZGlhQWRhcHRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKQEAgLTc1LDcgKzc1LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpyZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7CiAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICBBTE9HVigiUmVhZCBiZWZvcmUgZXZlbiBzdGFydGVkISIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuY3BwCmluZGV4IDExYjgwYmYuLjFmODBhNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHN5cy9hdG9taWNzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTIsNyArOTEsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50IHByZXZDb3VudCA9IF9fYXRvbWljX2RlYygmbVJlZkNvdW50KTsKKyAgICBpbnQgcHJldkNvdW50ID0gX19zeW5jX2ZldGNoX2FuZF9zdWIoJm1SZWZDb3VudCwgMSk7CiAgICAgaWYgKHByZXZDb3VudCA9PSAxKSB7CiAgICAgICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgZGVsZXRlIHRoaXM7CkBAIC0xMTIsNyArMTExLDcgQEAKIH0KIAogdm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKLSAgICAodm9pZCkgX19hdG9taWNfaW5jKCZtUmVmQ291bnQpOworICAgICh2b2lkKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbVJlZkNvdW50LCAxKTsKIH0KIAogdm9pZCAqTWVkaWFCdWZmZXI6OmRhdGEoKSBjb25zdCB7CkBAIC0xMzUsNyArMTM0LDcgQEAKIAogdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKICAgICBpZiAoKG1HcmFwaGljQnVmZmVyID09IE5VTEwpICYmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkpIHsKLSAgICAgICAgQUxPR0UoIm9mZnNldCA9ICVkLCBsZW5ndGggPSAlZCwgbVNpemUgPSAlZCIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOwogICAgIH0KICAgICBDSEVDSygobUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgfHwgKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCmluZGV4IDgwYWFlNTEuLjZhYzZkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC01NSw3ICs1NSw4IEBACiAgICAgbUxhc3RCdWZmZXIgPSBidWZmZXI7CiB9CiAKLXN0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKE1lZGlhQnVmZmVyICoqb3V0KSB7CitzdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgZm9yICg7OykgewpAQCAtNzAsNiArNzEsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChub25CbG9ja2luZykgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIH0KKwogICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLiBCbG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZCB0byB1cy4KICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IDhhZjFhYWYuLmRmNDdiZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0KKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgogCisjaW5jbHVkZSA8YmluZGVyL0lCYXR0ZXJ5U3RhdHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0zMSw0NSArMzIsMTE5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05hdGl2ZVdpbmRvd1dyYXBwZXIuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gc3RhdGljCi1zcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2RlcikgewotICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKLSAgICBpZiAoY29kZWMtPmluaXQobWltZSwgdHJ1ZSAvKiBuYW1lSXNUeXBlICovLCBlbmNvZGVyKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKK3N0cnVjdCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXIgOiBwdWJsaWMgU2luZ2xldG9uPEJhdHRlcnlOb3RpZmllcj4geworICAgIEJhdHRlcnlOb3RpZmllcigpOworCisgICAgdm9pZCBub3RlU3RhcnRWaWRlbygpOworICAgIHZvaWQgbm90ZVN0b3BWaWRlbygpOworICAgIHZvaWQgbm90ZVN0YXJ0QXVkaW8oKTsKKyAgICB2b2lkIG5vdGVTdG9wQXVkaW8oKTsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1WaWRlb1JlZkNvdW50OworICAgIGludDMyX3QgbUF1ZGlvUmVmQ291bnQ7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gbUJhdHRlcnlTdGF0U2VydmljZTsKK307CisKK0FORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXIpCisKK01lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6QmF0dGVyeU5vdGlmaWVyKCkgOgorICAgIG1WaWRlb1JlZkNvdW50KDApLAorICAgIG1BdWRpb1JlZkNvdW50KDApIHsKKyAgICAvLyBnZXQgYmF0dGVyeSBzZXJ2aWNlCisgICAgY29uc3Qgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7CisgICAgaWYgKHNtICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nMTYgbmFtZSgiYmF0dGVyeXN0YXRzIik7CisgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Z2V0U2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChtQmF0dGVyeVN0YXRTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiYXR0ZXJ5c3RhdHMgc2VydmljZSB1bmF2YWlsYWJsZSEiKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydFZpZGVvKCkgeworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRWaWRlbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtVmlkZW9SZWZDb3VudCsrOworfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BWaWRlbygpIHsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcCgpOiB2aWRlbyByZWZjb3VudCBpcyBicm9rZW4hIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXR1cm4gY29kZWM7CisgICAgbVZpZGVvUmVmQ291bnQtLTsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBtQmF0dGVyeVN0YXRTZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0b3BWaWRlbyhBSURfTUVESUEpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydEF1ZGlvKCkgeworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RhcnRBdWRpbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtQXVkaW9SZWZDb3VudCsrOworfQorCit2b2lkIE1lZGlhQ29kZWM6OkJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BBdWRpbygpIHsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcCgpOiBhdWRpbyByZWZjb3VudCBpcyBicm9rZW4hIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQXVkaW9SZWZDb3VudC0tOworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gTlVMTCkgeworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLT5ub3RlU3RvcEF1ZGlvKEFJRF9NRURJQSk7CisgICAgfQorfQorLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVycikgeworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMobG9vcGVyKTsKKworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2Rlcik7CisgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICAgICplcnIgPSByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCiB9CiAKIC8vIHN0YXRpYwogc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190ICplcnIpIHsKICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3Blcik7Ci0gICAgaWYgKGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJldHVybiBjb2RlYzsKKyAgICBjb25zdCBzdGF0dXNfdCByZXQgPSBjb2RlYy0+aW5pdChuYW1lLCBmYWxzZSAvKiBuYW1lSXNUeXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKKyAgICBpZiAoZXJyICE9IE5VTEwpIHsKKyAgICAgICAgKmVyciA9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldCA9PSBPSyA/IGNvZGVjIDogTlVMTDsgLy8gTlVMTCBkZWFsbG9jYXRlcyBjb2RlYy4KIH0KIAogTWVkaWFDb2RlYzo6TWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKQogICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpLAogICAgICAgbUxvb3Blcihsb29wZXIpLAotICAgICAgbUNvZGVjKG5ldyBBQ29kZWMpLAorICAgICAgbUNvZGVjKE5VTEwpLAogICAgICAgbVJlcGx5SUQoMCksCiAgICAgICBtRmxhZ3MoMCksCisgICAgICBtU3RpY2t5RXJyb3IoT0spLAogICAgICAgbVNvZnRSZW5kZXJlcihOVUxMKSwKKyAgICAgIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkKGZhbHNlKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKICAgICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEKDApLAogICAgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbigwKSwKQEAgLTk3LDI5ICsxNzIsNDIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjppbml0KGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgbmFtZUlzVHlwZSwgYm9vbCBlbmNvZGVyKSB7CisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFDb2RlYzo6UG9zdFJlcGx5V2l0aEVycm9yKGludDMyX3QgcmVwbHlJRCwgaW50MzJfdCBlcnIpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKKyAgICAvLyBzYXZlIGluaXQgcGFyYW1ldGVycyBmb3IgcmVzZXQKKyAgICBtSW5pdE5hbWUgPSBuYW1lOworICAgIG1Jbml0TmFtZUlzVHlwZSA9IG5hbWVJc1R5cGU7CisgICAgbUluaXRJc0VuY29kZXIgPSBlbmNvZGVyOworCiAgICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCiAgICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCiAgICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKICAgICAvLyBxdWV1ZS4KKyAgICBtQ29kZWMgPSBuZXcgQUNvZGVjOwogICAgIGJvb2wgbmVlZERlZGljYXRlZExvb3BlciA9IGZhbHNlOwotICAgIGlmIChuYW1lSXNUeXBlICYmICFzdHJuY2FzZWNtcChuYW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICBpZiAobmFtZUlzVHlwZSAmJiAhc3RybmNhc2VjbXAobmFtZS5jX3N0cigpLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVN0cmluZyB0bXAgPSBuYW1lOwogICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKICAgICAgICAgICAgIHRtcC5lcmFzZSh0bXAuc2l6ZSgpIC0gNywgNyk7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKm1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IG1jbCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOwogICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUodG1wLmNfc3RyKCkpOwogICAgICAgICBpZiAoY29kZWNJZHggPj0gMCkgewotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IHR5cGVzOwotICAgICAgICAgICAgaWYgKG1jbC0+Z2V0U3VwcG9ydGVkVHlwZXMoY29kZWNJZHgsICZ0eXBlcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmVlZERlZGljYXRlZExvb3BlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7CisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7CisgICAgICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNaW1lcygmbWltZXMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBuZWVkRGVkaWNhdGVkTG9vcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTMsNiArMjQxLDE0IEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjaykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRDYWxsYmFjaywgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJjYWxsYmFjayIsIGNhbGxiYWNrKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmbmF0aXZlV2luZG93LApAQCAtMTc0LDcgKzI3MCwyMCBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgIHN0YXR1c190IGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIC8vIE1lZGlhQ29kZWMgbm93IHNldCBzdGF0ZSB0byBVTklOSVRJQUxJWkVEIHVwb24gYW55IGZhdGFsIGVycm9yLgorICAgICAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LCBkbyBhIHJlc2V0KCkgdG8gcHV0IGNvZGVjCisgICAgICAgIC8vIGJhY2sgaW50byBJTklUSUFMSVpFRCBzdGF0ZS4KKyAgICAgICAgLy8gQnV0IGRvbid0IHJlc2V0IGlmIHRoZSBlcnIgaXMgSU5WQUxJRF9PUEVSQVRJT04sIHdoaWNoIG1lYW5zCisgICAgICAgIC8vIHRoZSBjb25maWd1cmUgZmFpbHVyZSBpcyBkdWUgdG8gd3Jvbmcgc3RhdGUuCisKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSBmYWlsZWQgd2l0aCBlcnIgMHglMDh4LCByZXNldHRpbmcuLi4iLCBlcnIpOworICAgICAgICByZXNldCgpOworICAgIH0KKworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgKQEAgLTIxOCw2ICszMjcsNDEgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZXNldCgpIHsKKyAgICAvKiBXaGVuIGV4dGVybmFsLWZhY2luZyBNZWRpYUNvZGVjIG9iamVjdCBpcyBjcmVhdGVkLAorICAgICAgIGl0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQuICBUaHVzLCByZXNldCBpcyBlc3NlbnRpYWxseQorICAgICAgIHJlbGVhc2UoKSBmb2xsb3dlZCBieSBpbml0KCksIHBsdXMgY2xlYXJpbmcgdGhlIHN0YXRlICovCisKKyAgICBzdGF0dXNfdCBlcnIgPSByZWxlYXNlKCk7CisKKyAgICAvLyB1bnJlZ2lzdGVyIGhhbmRsZXJzCisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtQ29kZWNMb29wZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUNvZGVjTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtQ29kZWMtPmlkKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUNvZGVjLT5pZCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgIH0KKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKworICAgIG1GbGFncyA9IDA7ICAgIC8vIGNsZWFyIGFsbCBmbGFncworICAgIG1TdGlja3lFcnJvciA9IE9LOworCisgICAgLy8gcmVzZXQgc3RhdGUgbm90IHJlc2V0IGJ5IHNldFN0YXRlKFVOSU5JVElBTElaRUQpCisgICAgbVJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKKyAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOworICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CisgICAgbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CisgICAgbUhhdmVJbnB1dFN1cmZhY2UgPSBmYWxzZTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gaW5pdChtSW5pdE5hbWUsIG1Jbml0TmFtZUlzVHlwZSwgbUluaXRJc0VuY29kZXIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpxdWV1ZUlucHV0QnVmZmVyKAogICAgICAgICBzaXplX3QgaW5kZXgsCiAgICAgICAgIHNpemVfdCBvZmZzZXQsCkBAIC0zMjMsNiArNDY3LDE2IEBACiAgICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShzaXplX3QgaW5kZXgsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZU91dHB1dEJ1ZmZlciwgaWQoKSk7CisgICAgbXNnLT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJyZW5kZXIiLCB0cnVlKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHRpbWVzdGFtcE5zKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpyZWxlYXNlT3V0cHV0QnVmZmVyKHNpemVfdCBpbmRleCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLCBpZCgpKTsKICAgICBtc2ctPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwpAQCAtMzUyLDYgKzUwNiwyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0SW5wdXRGb3JtYXQoc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0SW5wdXRGb3JtYXQsIGlkKCkpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXROYW1lKEFTdHJpbmcgKm5hbWUpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0TmFtZSwgaWQoKSk7CiAKQEAgLTM4NCw2ICs1NTIsNTUgQEAKICAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRPdXRwdXRCdWZmZXIoc2l6ZV90IGluZGV4LCBzcDxBQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICByZXR1cm4gZ2V0QnVmZmVyQW5kRm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4LCBidWZmZXIsICZmb3JtYXQpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRPdXRwdXRGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICByZXR1cm4gZ2V0QnVmZmVyQW5kRm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIGluZGV4LCAmYnVmZmVyLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRJbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgsIHNwPEFCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIHJldHVybiBnZXRCdWZmZXJBbmRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbmRleCwgYnVmZmVyLCAmZm9ybWF0KTsKK30KKworYm9vbCBNZWRpYUNvZGVjOjppc0V4ZWN1dGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVJURUQgfHwgbVN0YXRlID09IEZMVVNIRUQ7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OmdldEJ1ZmZlckFuZEZvcm1hdCgKKyAgICAgICAgc2l6ZV90IHBvcnRJbmRleCwgc2l6ZV90IGluZGV4LAorICAgICAgICBzcDxBQnVmZmVyPiAqYnVmZmVyLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIC8vIHVzZSBtdXRleCBpbnN0ZWFkIG9mIGEgY29udGV4dCBzd2l0Y2gKKworICAgIGJ1ZmZlci0+Y2xlYXIoKTsKKyAgICBmb3JtYXQtPmNsZWFyKCk7CisgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyB3ZSBkbyBub3Qgd2FudCBtUG9ydEJ1ZmZlcnMgdG8gY2hhbmdlIGR1cmluZyB0aGlzIHNlY3Rpb24KKyAgICAvLyB3ZSBhbHNvIGRvbid0IHdhbnQgbU93bmVkQnlDbGllbnQgdG8gY2hhbmdlIGR1cmluZyB0aGlzCisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CisgICAgaWYgKGluZGV4IDwgYnVmZmVycy0+c2l6ZSgpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBidWZmZXJzLT5pdGVtQXQoaW5kZXgpOworICAgICAgICBpZiAoaW5mby5tT3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgLy8gYnkgdGhlIHRpbWUgYnVmZmVycyBhcnJheSBpcyBpbml0aWFsaXplZCwgY3J5cHRvIGlzIHNldAorICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgbUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGluZm8ubUVuY3J5cHRlZERhdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBpbmZvLm1EYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmZvcm1hdCA9IGluZm8ubUZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmZsdXNoKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSk7CiAKQEAgLTQwNyw5ICs2MjQsNyBAQAogCiB2b2lkIE1lZGlhQ29kZWM6OmNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpIHsKICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVJbnB1dFJlcGx5SUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVJbnB1dFJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKIAogICAgICAgICArK21EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbjsKICAgICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOwpAQCAtNDE3LDkgKzYzMiw3IEBACiAgICAgfQogCiAgICAgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtRGVxdWV1ZU91dHB1dFJlcGx5SUQpOworICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobURlcXVldWVPdXRwdXRSZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAKICAgICAgICAgKyttRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uOwogICAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwpAQCAtNDI4LDE0ICs2NDEsMTIgQEAKIH0KIAogYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIodWludDMyX3QgcmVwbHlJRCwgYm9vbCBuZXdSZXF1ZXN0KSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVECi0gICAgICAgICAgICB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkgfHwgKG1GbGFncyAmIGtGbGFnSXNBc3luYykKICAgICAgICAgICAgIHx8IChuZXdSZXF1ZXN0ICYmIChtRmxhZ3MgJiBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmcpKSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0KKyAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC00NTYsMTAgKzY2NywxMSBAQAogYm9vbCBNZWRpYUNvZGVjOjpoYW5kbGVEZXF1ZXVlT3V0cHV0QnVmZmVyKHVpbnQzMl90IHJlcGx5SUQsIGJvb2wgbmV3UmVxdWVzdCkgewogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKIAotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRAotICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCisgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8IChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpCiAgICAgICAgICAgICB8fCAobmV3UmVxdWVzdCAmJiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykpKSB7CiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGdldFN0aWNreUVycm9yKCkpOwogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZCkgewogICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZDsKQEAgLTUxNiwyMiArNzI4LDIwIEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CiAKICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEVycm9yOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEVycm9yOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvbXhFcnJvciwgaW50ZXJuYWxFcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm9teC1lcnJvciIsICZvbXhFcnJvcikpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmludGVybmFsRXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnIsIGFjdGlvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhY3Rpb25Db2RlIiwgJmFjdGlvbkNvZGUpKTsKIAotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgYW4gZXJyb3IuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIihvbXggZXJyb3IgMHglMDh4LCBpbnRlcm5hbEVycm9yICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9teEVycm9yLCBpbnRlcm5hbEVycm9yKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob214RXJyb3IgPT0gT01YX0Vycm9yUmVzb3VyY2VzTG9zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGludGVybmFsRXJyb3IgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVyciAlI3gsIGFjdGlvbkNvZGUgJWQsIHdoaWxlIGluIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1Nhd01lZGlhU2VydmVyRGllOworICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kRXJyb3JSZXBvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzZW5kRXJyb3JSZXNwb25zZSA9IHRydWU7CiAKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOgpAQCAtNTQyLDEzICs3NTIsMTUgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05GSUdVUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklOSVRJQUxJWkVEIDogSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IENPTkZJR1VSRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NTgsNyArNzcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGVycm9yLCBhc3N1bWluZyB3ZSdsbCBzdGlsbCBnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWRpYVNlcnZlciBkaWVkLCB0aGVyZSBkZWZpbml0ZWx5IHdvbid0CkBAIC01NjksNyArNzgxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RPUFBJTkctPlVOSU5JVElBTElaRUQsIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzdWFsIFNUT1BQSU5HLT5JTklUSUFMSVpFRCBzdGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTc3LDQ0ICs3OTEsODAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSA/IEZMVVNIRUQgOiBTVEFSVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXBvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aW9uQ29kZSBpbiBhbiB1bmluaXRpYWxpemVkIHN0YXRlIGlzIGFsd2F5cyBmYXRhbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ29kZSA9IEFDVElPTl9DT0RFX0ZBVEFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25Db2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRXJyb3JSZXBvbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIFVOS05PV05fRVJST1IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRFcnJvclJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobVJlcGx5SUQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50QWxsb2NhdGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdENvbXBvbmVudEFsbG9jYXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaSU5HKTsKICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmbUNvbXBvbmVudE5hbWUpKTsKIApAQCAtNjM0LDIxICs4ODQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRDb21wb25lbnRDb25maWd1cmVkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGlucHV0IHN1cmZhY2UgZmxhZwogICAgICAgICAgICAgICAgICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOwogCisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsICZtSW5wdXRGb3JtYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgib3V0cHV0LWZvcm1hdCIsICZtT3V0cHV0Rm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQ09ORklHVVJFRCk7CiAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewpAQCAtNjY0LDkgKzkxNyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNpZ25hbGVkSW5wdXRFT1M6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUzoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIEFDb2RlYzo6a1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CkBAIC02NzcsOCArOTMwLDkgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0QnVmZmVyc0FsbG9jYXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtQnVmZmVyTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9ydEluZGV4OwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicG9ydEluZGV4IiwgJnBvcnRJbmRleCkpOwogCkBAIC02OTUsOCArOTQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInBvcnREZXNjIiwgJm9iaikpOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEFDb2RlYzo6UG9ydERlc2NyaXB0aW9uPiBwb3J0RGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ29kZWM6OlBvcnREZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBzcDxDb2RlY0Jhc2U6OlBvcnREZXNjcmlwdGlvbj4gcG9ydERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q29kZWNCYXNlOjpQb3J0RGVzY3JpcHRpb24gKj4ob2JqLmdldCgpKTsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycyA9IHBvcnREZXNjLT5jb3VudEJ1ZmZlcnMoKTsKIApAQCAtNzI5LDQwICs5ODMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIG91dHB1dCBmb3JtYXQgY2hhbmdlZCIpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICgobUZsYWdzICYga0ZsYWdJc1NvZnR3YXJlQ29kZWMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc1NvZnR3YXJlQ29kZWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLmNfc3RyKCksIDYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1Tb2Z0UmVuZGVyZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRSZWN0KCJjcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sb3JGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdywgbWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobU5hdGl2ZVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNzczLDYgKzEwMDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBjb2RlYyBzcGVjaWZpYyBkYXRhIGFuZCBhbWVuZCB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnR2F0aGVyQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CkBAIC03ODAsNyArMTAxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEZpbGxUaGlzQnVmZmVyOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEZpbGxUaGlzQnVmZmVyOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZV90IGluZGV4ID0gKi91cGRhdGVCdWZmZXJzKGtQb3J0SW5kZXhJbnB1dCwgbXNnKTsKIApAQCAtODA3LDcgKzEwNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJxdWV1ZUNTRElucHV0QnVmZmVyIGZhaWxlZCB3LyBlcnJvciAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1N0aWNreUVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCk7CkBAIC04MTUsNyArMTA0OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUhhdmVJbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0QnVmZmVyQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhoYW5kbGVEZXF1ZXVlSW5wdXRCdWZmZXIobURlcXVldWVJbnB1dFJlcGx5SUQpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgKyttRGVxdWV1ZUlucHV0VGltZW91dEdlbmVyYXRpb247CkBAIC04MjcsNyArMTA2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdERyYWluVGhpc0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXREcmFpblRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleE91dHB1dCwgbXNnKTsKIApAQCAtODYyLDEwICsxMTAwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIobURlcXVldWVPdXRwdXRSZXBseUlEKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICsrbURlcXVldWVPdXRwdXRUaW1lb3V0R2VuZXJhdGlvbjsKQEAgLTg3OCwzMiArMTEyMiw0MiBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRFT1M6CisgICAgICAgICAgICAgICAgY2FzZSBDb2RlY0Jhc2U6OmtXaGF0RU9TOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBub3RpZnkgdGhlIGNsaWVudCBvZiB0aGlzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGZsYWcgaW4gIm9uT3V0cHV0QnVmZmVyUmVhZHkiLgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgUkVMRUFTSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNDb21wb25lbnRBbGxvY2F0ZWQ7CiAKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdEZsdXNoQ29tcGxldGVkOgorICAgICAgICAgICAgICAgIGNhc2UgQ29kZWNCYXNlOjprV2hhdEZsdXNoQ29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBGTFVTSElORyk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IEZMVVNISU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVjZWl2ZWQgRmx1c2hDb21wbGV0ZWQgbWVzc2FnZSBpbiBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNIRUQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTIxLDEwICsxMTc1LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC05NTQsMTYgKzEyMDUsNDUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldENhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IElOSVRJQUxJWklORworICAgICAgICAgICAgICAgICAgICB8fCBpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgY2FuJ3QgYmUgc2V0IGFmdGVyIGNvZGVjIGlzIGV4ZWN1dGluZywKKyAgICAgICAgICAgICAgICAvLyBvciBiZWZvcmUgaXQncyBpbml0aWFsaXplZCAoYXMgdGhlIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBjbGVhcmVkIHdoZW4gaXQgZ29lcyB0byBJTklUSUFMSVpFRCkKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gY2FsbGJhY2s7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJjYWxsYmFjayIsICZjYWxsYmFjaykpOworCisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIk1lZGlhQ29kZWMgd2lsbCBvcGVyYXRlIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc0FzeW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnSXNBc3luYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKICAgICAgICAgewogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtOTgzLDEwICsxMjYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0U3VyZmFjZVRleHR1cmVDbGllbnQoKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTAyNCwxMCArMTMwMSw3IEBACiAKICAgICAgICAgICAgIC8vIE11c3QgYmUgY29uZmlndXJlZCwgYnV0IGNhbid0IGhhdmUgYmVlbiBzdGFydGVkIHlldC4KICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTA0MSwxMSArMTMxNSwxMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIE9LKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMDY1LDIwICsxMzM5LDIxIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVECi0gICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmIG1TdGF0ZSAhPSBTVEFSVEVEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGJlIGluICJVTklOSVRJQUxJWkVEIiBzdGF0ZSBhbHJlYWR5IHdpdGhvdXQgdGhlCisgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkKSAmJiBtU3RhdGUgIT0gSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgJiYgbVN0YXRlICE9IENPTkZJR1VSRUQgJiYgIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBtYXkgYmUgaW4gIlVOSU5JVElBTElaRUQiIHN0YXRlIGFscmVhZHkgYW5kCisgICAgICAgICAgICAgICAgLy8gYWxzbyBzaHV0ZG93biB0aGUgZW5jb2Rlci9kZWNvZGVyIHdpdGhvdXQgdGhlCiAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGJlaW5nIGF3YXJlIG9mIHRoaXMgaWYgbWVkaWEgc2VydmVyIGRpZWQgd2hpbGUKICAgICAgICAgICAgICAgICAvLyB3ZSB3ZXJlIGJlaW5nIHN0b3BwZWQuIFRoZSBjbGllbnQgd291bGQgYXNzdW1lIHRoYXQKICAgICAgICAgICAgICAgICAvLyBhZnRlciBzdG9wKCkgcmV0dXJuZWQsIGl0IHdvdWxkIGJlIHNhZmUgdG8gY2FsbCByZWxlYXNlKCkKICAgICAgICAgICAgICAgICAvLyBhbmQgaXQgc2hvdWxkIGJlIGluIHRoaXMgY2FzZSwgbm8gaGFybSB0byBhbGxvdyBhIHJlbGVhc2UoKQogICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGFscmVhZHkgdW5pbml0aWFsaXplZC4KLSAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHkgc3RvcHBpbmcgYSBzdG9wcGVkIE1lZGlhQ29kZWMgc2hvdWxkIGJlIGJlbmlnbi4KICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgImVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPT0gdGFyZ2V0U3RhdGUgPyBPSyA6IElOVkFMSURfT1BFUkFUSU9OKTsKLQorICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TdGF0ZSA9PSB0YXJnZXRTdGF0ZSA/IE9LIDogSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTA4Nyw2ICsxMzYyLDkgQEAKICAgICAgICAgICAgICAgICAvLyBJdCdzIGRlYWQsIEppbS4gRG9uJ3QgZXhwZWN0IGluaXRpYXRlU2h1dGRvd24gdG8geWllbGQKICAgICAgICAgICAgICAgICAvLyBhbnkgdXNlZnVsIHJlc3VsdHMgbm93Li4uCiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExMDYsMTEgKzEzODQsMTUgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAobUhhdmVJbnB1dFN1cmZhY2UpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUlucHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgd2l0aCBpbnB1dCBzdXJmYWNlIik7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTEyMiw5ICsxNDA0LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKICAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgLUVBR0FJTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTExNTMsOSArMTQzMyw3IEBACiAKICAgICAgICAgICAgIENIRUNLKG1GbGFncyAmIGtGbGFnRGVxdWV1ZUlucHV0UGVuZGluZyk7CiAKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgLUVBR0FJTik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1EZXF1ZXVlSW5wdXRSZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZUlucHV0UmVwbHlJRCwgLUVBR0FJTik7CiAKICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdEZXF1ZXVlSW5wdXRQZW5kaW5nOwogICAgICAgICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOwpAQCAtMTE2NywxOSArMTQ0NSwxNyBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblF1ZXVlSW5wdXRCdWZmZXIobXNnKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTE4OCw2ICsxNDY0LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIocmVwbHlJRCwgdHJ1ZSAvKiBuZXcgcmVxdWVzdCAqLykpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExOTYsOSArMTQ3OCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZW91dFVzIiwgJnRpbWVvdXRVcykpOwogCiAgICAgICAgICAgICBpZiAodGltZW91dFVzID09IDBsbCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIC1FQUdBSU4pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIC1FQUdBSU4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMjI3LDkgKzE1MDcsNyBAQAogCiAgICAgICAgICAgICBDSEVDSyhtRmxhZ3MgJiBrRmxhZ0RlcXVldWVPdXRwdXRQZW5kaW5nKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCAtRUFHQUlOKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURlcXVldWVPdXRwdXRSZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtRGVxdWV1ZU91dHB1dFJlcGx5SUQsIC1FQUdBSU4pOwogCiAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwpAQCAtMTI0MSwxOSArMTUxOSwxNyBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblJlbGVhc2VPdXRwdXRCdWZmZXIobXNnKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTI2MiwxMSArMTUzOCwxMSBAQAogICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEIHx8IChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMjgwLDExICsxNTU2LDExIEBACiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVJURUQgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgSU5WQUxJRF9PUEVSQVRJT04pOwotCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSkgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZ2V0U3RpY2t5RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTEzMTQsMTUgKzE1OTAsMTYgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCB8fCAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOworICAgICAgICAgICAgLy8gVE9ETzogc2tpcCBmbHVzaGluZyBpZiBhbHJlYWR5IEZMVVNIRUQKICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNISU5HKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwpAQCAtMTMzMCwyMyArMTYwNywyOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0R2V0SW5wdXRGb3JtYXQ6CiAgICAgICAgIGNhc2Uga1doYXRHZXRPdXRwdXRGb3JtYXQ6CiAgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPQorICAgICAgICAgICAgICAgIChtc2ctPndoYXQoKSA9PSBrV2hhdEdldE91dHB1dEZvcm1hdCA/IG1PdXRwdXRGb3JtYXQgOiBtSW5wdXRGb3JtYXQpOworCiAgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBTVEFSVEVEICYmIG1TdGF0ZSAhPSBGTFVTSElORykKLSAgICAgICAgICAgICAgICAgICAgfHwgKG1GbGFncyAmIGtGbGFnU3RpY2t5RXJyb3IpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBpZiAoKG1TdGF0ZSAhPSBDT05GSUdVUkVEICYmIG1TdGF0ZSAhPSBTVEFSVElORyAmJgorICAgICAgICAgICAgICAgICBtU3RhdGUgIT0gU1RBUlRFRCAmJiBtU3RhdGUgIT0gRkxVU0hJTkcgJiYKKyAgICAgICAgICAgICAgICAgbVN0YXRlICE9IEZMVVNIRUQpCisgICAgICAgICAgICAgICAgICAgIHx8IGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgeworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIG1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzNzIsMTAgKzE2NTQsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUNvbXBvbmVudE5hbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKLQotICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTM5NSwxMCArMTY3NCw3IEBACiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0MjEsMTQgKzE2OTcsMTQgQEAKICAgICAgICAgKytpOwogICAgIH0KIAotICAgIEFMT0dWKCJGb3VuZCAldSBwaWVjZXMgb2YgY29kZWMgc3BlY2lmaWMgZGF0YS4iLCBtQ1NELnNpemUoKSk7CisgICAgQUxPR1YoIkZvdW5kICV6dSBwaWVjZXMgb2YgY29kZWMgc3BlY2lmaWMgZGF0YS4iLCBtQ1NELnNpemUoKSk7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXVlQ1NESW5wdXRCdWZmZXIoc2l6ZV90IGJ1ZmZlckluZGV4KSB7CiAgICAgQ0hFQ0soIW1DU0QuZW1wdHkoKSk7CiAKLSAgICBCdWZmZXJJbmZvICppbmZvID0KLSAgICAgICAgJm1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoYnVmZmVySW5kZXgpOworICAgIGNvbnN0IEJ1ZmZlckluZm8gKmluZm8gPQorICAgICAgICAmbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uaXRlbUF0KGJ1ZmZlckluZGV4KTsKIAogICAgIHNwPEFCdWZmZXI+IGNzZCA9ICptQ1NELmJlZ2luKCk7CiAgICAgbUNTRC5lcmFzZShtQ1NELmJlZ2luKCkpOwpAQCAtMTQ2MywxOCArMTczOSwyMyBAQAogICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CiAgICAgICAgIHNldE5hdGl2ZVdpbmRvdyhOVUxMKTsKIAorICAgICAgICBtSW5wdXRGb3JtYXQuY2xlYXIoKTsKICAgICAgICAgbU91dHB1dEZvcm1hdC5jbGVhcigpOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZDsKICAgICAgICAgbUZsYWdzICY9IH5rRmxhZ091dHB1dEJ1ZmZlcnNDaGFuZ2VkOwogICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnU3RpY2t5RXJyb3I7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0VuY29kZXI7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdHYXRoZXJDb2RlY1NwZWNpZmljRGF0YTsKKyAgICAgICAgbUZsYWdzICY9IH5rRmxhZ0lzQXN5bmM7CisgICAgICAgIG1TdGlja3lFcnJvciA9IE9LOwogCiAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS5jbGVhcigpOworICAgICAgICBtQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAobmV3U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOworICAgICAgICAvLyByZXR1cm4gYW55IHN0cmFnZ2xpbmcgYnVmZmVycywgZS5nLiBpZiB3ZSBnb3QgaGVyZSBvbiBhbiBlcnJvcgorICAgICAgICByZXR1cm5CdWZmZXJzVG9Db2RlYygpOwogCiAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgZ29uZSwgbWVkaWFzZXJ2ZXIncyBwcm9iYWJseSBiYWNrIHVwIGFscmVhZHkKICAgICAgICAgLy8gYnV0IHNob3VsZCBkZWZpbml0ZWx5IGJlIGJhY2sgdXAgc2hvdWxkIHdlIHRyeSB0byBpbnN0YW50aWF0ZQpAQCAtMTQ4NSw2ICsxNzY2LDggQEAKICAgICBtU3RhdGUgPSBuZXdTdGF0ZTsKIAogICAgIGNhbmNlbFBlbmRpbmdEZXF1ZXVlT3BlcmF0aW9ucygpOworCisgICAgdXBkYXRlQmF0dGVyeVN0YXQoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpyZXR1cm5CdWZmZXJzVG9Db2RlYygpIHsKQEAgLTE0OTQsNiArMTc3Nyw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6cmV0dXJuQnVmZmVyc1RvQ29kZWNPblBvcnQoaW50MzJfdCBwb3J0SW5kZXgpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICpidWZmZXJzID0gJm1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdOwogCkBAIC0xNTIwLDggKzE4MDQsOCBAQAogICAgICAgICBpbnQzMl90IHBvcnRJbmRleCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKIAotICAgIHZvaWQgKmJ1ZmZlcklEOwotICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImJ1ZmZlci1pZCIsICZidWZmZXJJRCkpOworICAgIHVpbnQzMl90IGJ1ZmZlcklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAKICAgICBWZWN0b3I8QnVmZmVySW5mbz4gKmJ1ZmZlcnMgPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKQEAgLTE1MzIsNiArMTgxNiw4IEBACiAgICAgICAgICAgICBDSEVDSyhpbmZvLT5tTm90aWZ5ID09IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmaW5mby0+bU5vdGlmeSkpOwogCisgICAgICAgICAgICBpbmZvLT5tRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgPyBtSW5wdXRGb3JtYXQgOiBtT3V0cHV0Rm9ybWF0OwogICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5wdXNoX2JhY2soaSk7CiAKICAgICAgICAgICAgIHJldHVybiBpOwpAQCAtMTY0OCwxMSArMTkzNCwxNSBAQAogICAgICAgICBpbmZvLT5tRGF0YS0+c2V0UmFuZ2UoMCwgcmVzdWx0KTsKICAgICB9CiAKKyAgICAvLyBzeW5jaHJvbml6YXRpb24gYm91bmRhcnkgZm9yIGdldEJ1ZmZlckFuZEZvcm1hdAorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICB9CiAgICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgaW5mby0+bURhdGEpOwogICAgIHJlcGx5LT5wb3N0KCk7CiAKICAgICBpbmZvLT5tTm90aWZ5ID0gTlVMTDsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTY2Niw3ICsxOTU2LDcgQEAKICAgICAgICAgcmVuZGVyID0gMDsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IFNUQVJURUQpIHsKKyAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0xNjgwLDE4ICsxOTcwLDQwIEBACiAgICAgICAgIHJldHVybiAtRUFDQ0VTOwogICAgIH0KIAotICAgIGlmIChyZW5kZXIgJiYgKGluZm8tPm1EYXRhID09IE5VTEwgfHwgaW5mby0+bURhdGEtPnNpemUoKSAhPSAwKSkgeworICAgIC8vIHN5bmNocm9uaXphdGlvbiBib3VuZGFyeSBmb3IgZ2V0QnVmZmVyQW5kRm9ybWF0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOworICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChyZW5kZXIgJiYgaW5mby0+bURhdGEgIT0gTlVMTCAmJiBpbmZvLT5tRGF0YS0+c2l6ZSgpICE9IDApIHsKICAgICAgICAgaW5mby0+bU5vdGlmeS0+c2V0SW50MzIoInJlbmRlciIsIHRydWUpOwogCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMgPSAwOworICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgaW5mby0+bU5vdGlmeS0+c2V0SW50NjQoInRpbWVzdGFtcE5zIiwgdGltZXN0YW1wTnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQorICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCisgICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCisjaWYgMAorICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zICo9IDEwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5kYXRhKCksIGluZm8tPm1EYXRhLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcE5zLCBOVUxMLCBpbmZvLT5tRm9ybWF0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGluZm8tPm1Ob3RpZnktPnBvc3QoKTsKICAgICBpbmZvLT5tTm90aWZ5ID0gTlVMTDsKLSAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTcxMCw3ICsyMDIyLDIyIEBACiAKICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLmVkaXRJdGVtQXQoaW5kZXgpOwogICAgIENIRUNLKCFpbmZvLT5tT3duZWRCeUNsaWVudCk7Ci0gICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSB0cnVlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1CdWZmZXJMb2NrKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlDbGllbnQgPSB0cnVlOworCisgICAgICAgIC8vIHNldCBpbWFnZS1kYXRhCisgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICAgICAgICAgIGlmIChpbmZvLT5tRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICBpZiAoaW5mby0+bUZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldFJlY3QoImNyb3AtcmVjdCIsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0xNzQ4LDE2ICsyMDc1LDEwMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpvbklucHV0QnVmZmVyQXZhaWxhYmxlKCkgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgd2hpbGUgKChpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhJbnB1dCkpID49IDApIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1DYWxsYmFjay0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9JTlBVVF9BVkFJTEFCTEUpOworICAgICAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6Om9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKCkgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgd2hpbGUgKChpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQpKSA+PSAwKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPQorICAgICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLml0ZW1BdChpbmRleCkubURhdGE7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0FWQUlMQUJMRSk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgICAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIGJ1ZmZlci0+b2Zmc2V0KCkpOworICAgICAgICBtc2ctPnNldFNpemUoInNpemUiLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgICAgIGludDMyX3Qgb214RmxhZ3M7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoIm9teEZsYWdzIiwgJm9teEZsYWdzKSk7CisKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEJVRkZFUl9GTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgfQorICAgICAgICBpZiAob214RmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgZmxhZ3MgfD0gQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9teEZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBmbGFncyB8PSBCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6b25FcnJvcihzdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwgY29uc3QgY2hhciAqZGV0YWlsKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfRVJST1IpOworICAgICAgICBtc2ctPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICBtc2ctPnNldEludDMyKCJhY3Rpb25Db2RlIiwgYWN0aW9uQ29kZSk7CisKKyAgICAgICAgaWYgKGRldGFpbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjpvbk91dHB1dEZvcm1hdENoYW5nZWQoKSB7CisgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtQ2FsbGJhY2stPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKTsKKyAgICAgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCisKIHZvaWQgTWVkaWFDb2RlYzo6cG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpIHsKICAgICBpZiAobUFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICgobUZsYWdzICYgKGtGbGFnU3RpY2t5RXJyb3IKKyAgICBib29sIGlzRXJyb3JPck91dHB1dENoYW5nZWQgPQorICAgICAgICAgICAgKG1GbGFncyAmIChrRmxhZ1N0aWNreUVycm9yCiAgICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZAotICAgICAgICAgICAgICAgICAgICB8IGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZCkpCisgICAgICAgICAgICAgICAgICAgIHwga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkKSk7CisKKyAgICBpZiAoaXNFcnJvck9yT3V0cHV0Q2hhbmdlZAogICAgICAgICAgICAgfHwgIW1BdmFpbFBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uZW1wdHkoKQogICAgICAgICAgICAgfHwgIW1BdmFpbFBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVtcHR5KCkpIHsKKyAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LT5zZXRJbnQzMigiaW5wdXQtYnVmZmVycyIsCisgICAgICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkpOworCisgICAgICAgIGlmIChpc0Vycm9yT3JPdXRwdXRDaGFuZ2VkKSB7CisgICAgICAgICAgICAvLyB3ZSB3YW50IGNvbnN1bWVyIHRvIGRlcXVldWUgYXMgbWFueSB0aW1lcyBhcyBpdCBjYW4KKyAgICAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+c2V0SW50MzIoIm91dHB1dC1idWZmZXJzIiwgSU5UMzJfTUFYKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eU5vdGlmeS0+c2V0SW50MzIoIm91dHB1dC1idWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKTsKKyAgICAgICAgfQogICAgICAgICBtQWN0aXZpdHlOb3RpZnktPnBvc3QoKTsKICAgICAgICAgbUFjdGl2aXR5Tm90aWZ5LmNsZWFyKCk7CiAgICAgfQpAQCAtMTgxOCw0ICsyMjI5LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUJhdHRlcnlTdGF0KCkgeworICAgIGlmIChtU3RhdGUgPT0gQ09ORklHVVJFRCAmJiAhbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICBtSXNWaWRlbyA9IG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpOworCisgICAgICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKworICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVTdGFydFZpZGVvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZmllci5ub3RlU3RhcnRBdWRpbygpOworICAgICAgICB9CisKKyAgICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQgJiYgbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworCisgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0b3BWaWRlbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm90aWZpZXIubm90ZVN0b3BBdWRpbygpOworICAgICAgICB9CisKKyAgICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKaW5kZXggYjc0YjJlMi4uNWI4YmU0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcApAQCAtMTgsMTIgKzE4LDE5IEBACiAjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNMaXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSA8bGliZXhwYXQvZXhwYXQuaD4KQEAgLTMyLDMwICszOSwxMjkgQEAKIAogc3RhdGljIE11dGV4IHNJbml0TXV0ZXg7CiAKLS8vIHN0YXRpYwotTWVkaWFDb2RlY0xpc3QgKk1lZGlhQ29kZWNMaXN0OjpzQ29kZWNMaXN0Oworc3RhdGljIE1lZGlhQ29kZWNMaXN0ICpnQ29kZWNMaXN0ID0gTlVMTDsKIAogLy8gc3RhdGljCi1jb25zdCBNZWRpYUNvZGVjTGlzdCAqTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgeworc3A8SU1lZGlhQ29kZWNMaXN0PiBNZWRpYUNvZGVjTGlzdDo6c0NvZGVjTGlzdDsKKworLy8gc3RhdGljCitzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhzSW5pdE11dGV4KTsKIAotICAgIGlmIChzQ29kZWNMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgc0NvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdDsKKyAgICBpZiAoZ0NvZGVjTGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGdDb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3Q7CisgICAgICAgIGlmIChnQ29kZWNMaXN0LT5pbml0Q2hlY2soKSA9PSBPSykgeworICAgICAgICAgICAgc0NvZGVjTGlzdCA9IGdDb2RlY0xpc3Q7CisgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gc0NvZGVjTGlzdC0+aW5pdENoZWNrKCkgPT0gT0sgPyBzQ29kZWNMaXN0IDogTlVMTDsKKyAgICByZXR1cm4gc0NvZGVjTGlzdDsKK30KKworc3RhdGljIE11dGV4IHNSZW1vdGVJbml0TXV0ZXg7CisKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OnNSZW1vdGVMaXN0OworCisvLyBzdGF0aWMKK3NwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzUmVtb3RlSW5pdE11dGV4KTsKKyAgICBpZiAoc1JlbW90ZUxpc3QgPT0gTlVMTCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKyAgICAgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICBpZiAoc2VydmljZS5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzUmVtb3RlTGlzdCA9IHNlcnZpY2UtPmdldENvZGVjTGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNSZW1vdGVMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGlmIGZhaWxlZCB0byBnZXQgcmVtb3RlIGxpc3QsIGNyZWF0ZSBsb2NhbCBsaXN0CisgICAgICAgICAgICBzUmVtb3RlTGlzdCA9IGdldExvY2FsSW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc1JlbW90ZUxpc3Q7CiB9CiAKIE1lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdCgpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpIHsKLSAgICBGSUxFICpmaWxlID0gZm9wZW4oIi9ldGMvbWVkaWFfY29kZWNzLnhtbCIsICJyIik7CisgICAgcGFyc2VUb3BMZXZlbFhNTEZpbGUoIi9ldGMvbWVkaWFfY29kZWNzLnhtbCIpOworfQogCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGUuIik7Cit2b2lkIE1lZGlhQ29kZWNMaXN0OjpwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpjb2RlY3NfeG1sKSB7CisgICAgLy8gZ2V0IGhyZWZfYmFzZQorICAgIGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7CisgICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gTlVMTCkgeworICAgICAgICBtSHJlZkJhc2UgPSBBU3RyaW5nKGNvZGVjc194bWwsIGhyZWZfYmFzZV9lbmQgLSBjb2RlY3NfeG1sICsgMSk7CisgICAgfQorCisgICAgbUluaXRDaGVjayA9IE9LOyAvLyBrZWVwaW5nIHRoaXMgaGVyZSBmb3Igc2FmZXR5CisgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKKyAgICBtRGVwdGggPSAwOworCisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBtSW5pdENoZWNrID0gY2xpZW50LmNvbm5lY3QoKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1PTVggPSBjbGllbnQuaW50ZXJmYWNlKCk7CisgICAgcGFyc2VYTUxGaWxlKGNvZGVjc194bWwpOworICAgIG1PTVguY2xlYXIoKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIG1Db2RlY0luZm9zLmNsZWFyKCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBwYXJzZVhNTEZpbGUoZmlsZSk7CisgICAgZm9yIChzaXplX3QgaSA9IG1Db2RlY0luZm9zLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY0luZm8gJmluZm8gPSAqbUNvZGVjSW5mb3MuaXRlbUF0KGkpLmdldCgpOworCisgICAgICAgIGlmIChpbmZvLm1DYXBzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBObyB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQ/Pz8KKyAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJXMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgdHlwZSBvZiBtZWRpYT8iLAorICAgICAgICAgICAgICAgICAgaW5mby5tTmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgbUNvZGVjSW5mb3MucmVtb3ZlQXQoaSk7CisjaWYgTE9HX05ERUJVRyA9PSAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB0eXBlX2l4ID0gMDsgdHlwZV9peCA8IGluZm8ubUNhcHMuc2l6ZSgpOyArK3R5cGVfaXgpIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWUgPSBpbmZvLm1DYXBzLmtleUF0KHR5cGVfaXgpOworICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICZjYXBzID0gaW5mby5tQ2Fwcy52YWx1ZUF0KHR5cGVfaXgpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIGNvZGVjIGluZm8gZm9yICVzOiAlcyIsIGluZm8ubU5hbWUuY19zdHIoKSwgbWltZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0RGV0YWlscygpLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIgICAgZmxhZ3M9JWQiLCBjYXBzLT5nZXRGbGFncygpKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gY29sb3JGb3JtYXRzOworICAgICAgICAgICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoJmNvbG9yRm9ybWF0cyk7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmljZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvbG9yRm9ybWF0cy5zaXplKCk7IGl4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKGNvbG9yRm9ybWF0cy5pdGVtQXQoaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAgIGNvbG9ycz1bJXNdIiwgbmljZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8TWVkaWFDb2RlY0luZm86OlByb2ZpbGVMZXZlbD4gcHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbmljZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHByb2ZpbGVMZXZlbHMuc2l6ZSgpOyBpeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVscy5pdGVtQXQoaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQocGwubVByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmljZS5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pY2UuYXBwZW5kKHBsLm1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgICBsZXZlbHM9WyVzXSIsIG5pY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CiAKICNpZiAwCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29kZWNJbmZvcy5zaXplKCk7ICsraSkgewpAQCAtNzUsOSArMTgxLDYgQEAKICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKICAgICB9CiAjZW5kaWYKLQotICAgIGZjbG9zZShmaWxlKTsKLSAgICBmaWxlID0gTlVMTDsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTg3LDEwICsxOTAsMTQgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKEZJTEUgKmZpbGUpIHsKLSAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKLSAgICBtRGVwdGggPSAwOwordm9pZCBNZWRpYUNvZGVjTGlzdDo6cGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpIHsKKyAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKKworICAgIGlmIChmaWxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOworICAgICAgICBtSW5pdENoZWNrID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBYTUxfUGFyc2VyIHBhcnNlciA9IDo6WE1MX1BhcnNlckNyZWF0ZShOVUxMKTsKICAgICBDSEVDSyhwYXJzZXIgIT0gTlVMTCk7CkBAIC0xMDMsNyArMjEwLDcgQEAKICAgICB3aGlsZSAobUluaXRDaGVjayA9PSBPSykgewogICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwogICAgICAgICAgICAgbUluaXRDaGVjayA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTE1LDggKzIyMiw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICg6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCkKLSAgICAgICAgICAgICAgICAhPSBYTUxfU1RBVFVTX09LKSB7CisgICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOworICAgICAgICBpZiAoc3RhdHVzICE9IFhNTF9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgKCVzKSIsIDo6WE1MX0Vycm9yU3RyaW5nKDo6WE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEyOCwyNSArMjM2LDggQEAKIAogICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKIAotICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtQ29kZWNJbmZvcy5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgICAgICBDb2RlY0luZm8gKmluZm8gPSAmbUNvZGVjSW5mb3MuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICAgICAgaWYgKGluZm8tPm1UeXBlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50Pz8/Ci0KLSAgICAgICAgICAgICAgICBBTE9HVygiQ29tcG9uZW50ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUgb2YgbWVkaWE/IiwKLSAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tTmFtZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgIG1Db2RlY0luZm9zLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgbUNvZGVjSW5mb3MuY2xlYXIoKTsKLSAgICAgICAgbUNvZGVjUXVpcmtzLmNsZWFyKCk7Ci0gICAgfQorICAgIGZjbG9zZShmaWxlKTsKKyAgICBmaWxlID0gTlVMTDsKIH0KIAogLy8gc3RhdGljCkBAIC0xNjAsMTIgKzI1MSw2NSBAQAogICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNMaXN0ICo+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyICpocmVmID0gTlVMTDsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJocmVmIikpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHJlZiA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgorICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAorICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7CisgICAgICAgIGlmIChocmVmW2ldID09ICcuJyB8fCBocmVmW2ldID09ICdfJyB8fAorICAgICAgICAgICAgICAgIChocmVmW2ldID49ICcwJyAmJiBocmVmW2ldIDw9ICc5JykgfHwKKyAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnQScgJiYgaHJlZltpXSA8PSAnWicpIHx8CisgICAgICAgICAgICAgICAgKGhyZWZbaV0gPj0gJ2EnICYmIGhyZWZbaV0gPD0gJ3onKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIEFTdHJpbmcgZmlsZW5hbWUgPSBocmVmOworICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aCgibWVkaWFfY29kZWNzXyIpIHx8CisgICAgICAgICFmaWxlbmFtZS5lbmRzV2l0aCgiLnhtbCIpKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgZmlsZW5hbWUuaW5zZXJ0KG1IcmVmQmFzZSwgMCk7CisKKyAgICBwYXJzZVhNTEZpbGUoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0xpc3Q6OnN0YXJ0RWxlbWVudEhhbmRsZXIoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBib29sIGluVHlwZSA9IHRydWU7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBpbmNsdWRlWE1MRmlsZShhdHRycyk7CisgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBtUGFzdFNlY3Rpb25zLnB1c2gobUN1cnJlbnRTZWN0aW9uKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fSU5DTFVERTsKKyAgICAgICAgfQorICAgICAgICArK21EZXB0aDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHN3aXRjaCAobUN1cnJlbnRTZWN0aW9uKSB7CiAgICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKICAgICAgICAgewpAQCAtMjA2LDYgKzM1MCwyNSBAQAogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRRdWlyayhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlR5cGUiKSkgewogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVJfVFlQRSA6IFNFQ1RJT05fRU5DT0RFUl9UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpblR5cGUgPSBmYWxzZTsKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisKKyAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWdub3JlIGxpbWl0cyBhbmQgZmVhdHVyZXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgdHlwZQorICAgICAgICAgICAgYm9vbCBvdXRzaWRlID0gIWluVHlwZSAmJiAhbUN1cnJlbnRJbmZvLT5tSGFzU29sZU1pbWU7CisgICAgICAgICAgICBpZiAob3V0c2lkZSAmJiAoIXN0cmNtcChuYW1lLCAiTGltaXQiKSB8fCAhc3RyY21wKG5hbWUsICJGZWF0dXJlIikpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJMaW1pdCIpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZExpbWl0KGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiRmVhdHVyZSIpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IGFkZEZlYXR1cmUoYXR0cnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIzOSwxMCArNDAyLDI1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CisgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG5hbWUsICJUeXBlIikpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUl9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk1lZGlhQ29kZWMiKSkgewogICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjUxLDYgKzQyOSwxNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiTWVkaWFDb2RlYyIpKSB7CiAgICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEluZm8tPmNvbXBsZXRlKCk7OworICAgICAgICAgICAgICAgIG1DdXJyZW50SW5mbyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiSW5jbHVkZSIpICYmIG1QYXN0U2VjdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1QYXN0U2VjdGlvbnMudG9wKCk7CisgICAgICAgICAgICAgICAgbVBhc3RTZWN0aW9ucy5wb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yOTIsMjMgKzQ4MSwzNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBhZGRNZWRpYUNvZGVjKGVuY29kZXIsIG5hbWUsIHR5cGUpOwotCisgICAgbUN1cnJlbnRJbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvKG5hbWUsIGVuY29kZXIsIHR5cGUpOworICAgIC8vIFRoZSBuZXh0IHN0ZXAgaW52b2x2ZXMgdHJ5aW5nIHRvIGxvYWQgdGhlIGNvZGVjLCB3aGljaCBtYXkKKyAgICAvLyBmYWlsLiAgT25seSBsaXN0IHRoZSBjb2RlYyBpZiB0aGlzIHN1Y2NlZWRzLgorICAgIC8vIEhvd2V2ZXIsIGtlZXAgbUN1cnJlbnRJbmZvIG9iamVjdCBhcm91bmQgdW50aWwgcGFyc2luZworICAgIC8vIG9mIGZ1bGwgY29kZWMgaW5mbyBpcyBjb21wbGV0ZWQuCisgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXModHlwZSkgPT0gT0spIHsKKyAgICAgICAgbUNvZGVjSW5mb3MucHVzaF9iYWNrKG1DdXJyZW50SW5mbyk7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNZWRpYUNvZGVjTGlzdDo6YWRkTWVkaWFDb2RlYygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKSB7Ci0gICAgbUNvZGVjSW5mb3MucHVzaCgpOwotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KG1Db2RlY0luZm9zLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1OYW1lID0gbmFtZTsKLSAgICBpbmZvLT5tSXNFbmNvZGVyID0gZW5jb2RlcjsKLSAgICBpbmZvLT5tVHlwZXMgPSAwOwotICAgIGluZm8tPm1RdWlya3MgPSAwOwotCi0gICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgICBhZGRUeXBlKHR5cGUpOworc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmluaXRpYWxpemVDYXBhYmlsaXRpZXMoY29uc3QgY2hhciAqdHlwZSkgeworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KKworICAgIEFMT0dWKCJpbml0aWFsaXplQ2FwYWJpbGl0aWVzICVzOiVzIiwKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bU5hbWUuY19zdHIoKSwgdHlwZSk7CisKKyAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzOworICAgIHN0YXR1c190IGVyciA9IFF1ZXJ5Q29kZWMoCisgICAgICAgICAgICBtT01YLAorICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5tTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+bUlzRW5jb2RlciwKKyAgICAgICAgICAgICZjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIG1DdXJyZW50SW5mby0+aW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjYXBzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycykgewpAQCAtMzMzLDI0ICs1MzYsNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICB1aW50MzJfdCBiaXQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Db2RlY1F1aXJrcy5pbmRleE9mS2V5KG5hbWUpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgYml0ID0gbUNvZGVjUXVpcmtzLnNpemUoKTsKLQotICAgICAgICBpZiAoYml0ID09IDMyKSB7Ci0gICAgICAgICAgICBBTE9HVygiVG9vIG1hbnkgZGlzdGluY3QgcXVpcmsgbmFtZXMgaW4gY29uZmlndXJhdGlvbi4iKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db2RlY1F1aXJrcy5hZGQobmFtZSwgYml0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBiaXQgPSBtQ29kZWNRdWlya3MudmFsdWVBdChpbmRleCk7Ci0gICAgfQotCi0gICAgQ29kZWNJbmZvICppbmZvID0gJm1Db2RlY0luZm9zLmVkaXRJdGVtQXQobUNvZGVjSW5mb3Muc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bVF1aXJrcyB8PSAxdWwgPDwgYml0OwotCisgICAgbUN1cnJlbnRJbmZvLT5hZGRRdWlyayhuYW1lKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTM3Niw1NyArNTYyLDI4MCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBhZGRUeXBlKG5hbWUpOworICAgIHN0YXR1c190IHJldCA9IG1DdXJyZW50SW5mby0+YWRkTWltZShuYW1lKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCisgICAgLy8gVGhlIG5leHQgc3RlcCBpbnZvbHZlcyB0cnlpbmcgdG8gbG9hZCB0aGUgY29kZWMsIHdoaWNoIG1heQorICAgIC8vIGZhaWwuICBIYW5kbGUgdGhpcyBncmFjZWZ1bGx5IChieSBub3QgcmVwb3J0aW5nIHN1Y2ggbWltZSkuCisgICAgaWYgKGluaXRpYWxpemVDYXBhYmlsaXRpZXMobmFtZSkgIT0gT0spIHsKKyAgICAgICAgbUN1cnJlbnRJbmZvLT5yZW1vdmVNaW1lKG5hbWUpOworICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0xpc3Q6OmFkZFR5cGUoY29uc3QgY2hhciAqbmFtZSkgewotICAgIHVpbnQzMl90IGJpdDsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVR5cGVzLmluZGV4T2ZLZXkobmFtZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBiaXQgPSBtVHlwZXMuc2l6ZSgpOwotCi0gICAgICAgIGlmIChiaXQgPT0gMzIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJUb28gbWFueSBkaXN0aW5jdCB0eXBlIG5hbWVzIGluIGNvbmZpZ3VyYXRpb24uIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtVHlwZXMuYWRkKG5hbWUsIGJpdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYml0ID0gbVR5cGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIH0KLQotICAgIENvZGVjSW5mbyAqaW5mbyA9ICZtQ29kZWNJbmZvcy5lZGl0SXRlbUF0KG1Db2RlY0luZm9zLnNpemUoKSAtIDEpOwotICAgIGluZm8tPm1UeXBlcyB8PSAxdWwgPDwgYml0OwotfQotCisvLyBsZWdhY3kgbWV0aG9kIGZvciBub24tYWR2YW5jZWQgY29kZWNzCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXgpIGNvbnN0IHsKLSAgICBzc2l6ZV90IHR5cGVJbmRleCA9IG1UeXBlcy5pbmRleE9mS2V5KHR5cGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZHZhbmNlZEZlYXR1cmVzW10gPSB7CisgICAgICAgICJmZWF0dXJlLXNlY3VyZS1wbGF5YmFjayIsCisgICAgICAgICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIiwKKyAgICB9OwogCi0gICAgaWYgKHR5cGVJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQorICAgIHNpemVfdCBudW1Db2RlY3MgPSBtQ29kZWNJbmZvcy5zaXplKCk7CisgICAgZm9yICg7IHN0YXJ0SW5kZXggPCBudW1Db2RlY3M7ICsrc3RhcnRJbmRleCkgeworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoc3RhcnRJbmRleCkuZ2V0KCk7CiAKLSAgICB1aW50MzJfdCB0eXBlTWFzayA9IDF1bCA8PCBtVHlwZXMudmFsdWVBdCh0eXBlSW5kZXgpOworICAgICAgICBpZiAoaW5mby5pc0VuY29kZXIoKSAhPSBlbmNvZGVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBhYmlsaXRpZXMgPSBpbmZvLmdldENhcGFiaWxpdGllc0Zvcih0eXBlKTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmRldGFpbHMgPSBjYXBhYmlsaXRpZXMtPmdldERldGFpbHMoKTsKIAotICAgIHdoaWxlIChzdGFydEluZGV4IDwgbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChzdGFydEluZGV4KTsKLQotICAgICAgICBpZiAoaW5mby5tSXNFbmNvZGVyID09IGVuY29kZXIgJiYgKGluZm8ubVR5cGVzICYgdHlwZU1hc2spKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgaW50MzJfdCByZXF1aXJlZDsKKyAgICAgICAgYm9vbCBpc0FkdmFuY2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBBUlJBWV9TSVpFKGFkdmFuY2VkRmVhdHVyZXMpOyBpeCsrKSB7CisgICAgICAgICAgICBpZiAoZGV0YWlscy0+ZmluZEludDMyKGFkdmFuY2VkRmVhdHVyZXNbaXhdLCAmcmVxdWlyZWQpICYmCisgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBpc0FkdmFuY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgICsrc3RhcnRJbmRleDsKKyAgICAgICAgaWYgKCFpc0FkdmFuY2VkKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAtRU5PRU5UOwogfQogCitzdGF0aWMgc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgYm9vbCBmb3VuZCA9IHRydWUpIHsKKyAgICBBTE9HRSgibGltaXQgJyVzJyB3aXRoICVzJyVzJyBhdHRyaWJ1dGUiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAoZm91bmQgPyAiIiA6ICJubyAiKSwgYXR0cik7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEVycm9yKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7CisgICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLmNfc3RyKCksIG1zZyk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKEFTdHJpbmcgbmFtZSwgY29uc3QgY2hhciAqYXR0ciwgQVN0cmluZyB2YWx1ZSkgeworICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggaW52YWxpZCAnJXMnIGF0dHJpYnV0ZSAoJXMpIiwgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgYXR0ciwgdmFsdWUuY19zdHIoKSk7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNMaXN0OjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGF0dHJzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0dHJpYnV0ZXMgd2l0aCB2YWx1ZXMKKyAgICAgICAgaWYgKCFzdHJjbXAoYXR0cnNbaV0sICJuYW1lIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAiZGVmYXVsdCIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgImluIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWF4IikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAibWluIikKKyAgICAgICAgICAgICAgICB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmFuZ2UiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJyYW5nZXMiKQorICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAoYXR0cnNbaV0sICJzY2FsZSIpCisgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGF0dHJzW2ldLCBhdHRyc1tpICsgMV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIEFTdHJpbmcgbmFtZTsKKyAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygibmFtZSIsICZuYW1lKSkgeworICAgICAgICBBTE9HRSgibGltaXQgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIHNpemUsIGJsb2NrcywgYml0cmF0ZSwgZnJhbWUtcmF0ZSwgYmxvY2tzLXBlci1zZWNvbmQsIGFzcGVjdC1yYXRpbzogcmFuZ2UKKyAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCisgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0CisgICAgYm9vbCBmb3VuZDsKKworICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iIHx8IG5hbWUgPT0gImJpdHJhdGUiIHx8IG5hbWUgPT0gImJsb2NrLWNvdW50IgorICAgICAgICAgICAgfHwgbmFtZSA9PSAiYmxvY2tzLXBlci1zZWNvbmQiIHx8IG5hbWUgPT0gImNvbXBsZXhpdHkiCisgICAgICAgICAgICB8fCBuYW1lID09ICJmcmFtZS1yYXRlIiB8fCBuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJzaXplIikgeworICAgICAgICBBU3RyaW5nIG1pbiwgbWF4OworICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW4iLCAmbWluKSAmJiBtc2ctPmZpbmRTdHJpbmcoIm1heCIsICZtYXgpKSB7CisgICAgICAgICAgICBtaW4uYXBwZW5kKCItIik7CisgICAgICAgICAgICBtaW4uYXBwZW5kKG1heCk7CisgICAgICAgICAgICBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSB8fCBtc2ctPmNvbnRhaW5zKCJ2YWx1ZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyAnbWluJyBhbmQgJ21heCcgYXMgd2VsbCBhcyAncmFuZ2UnIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIndmFsdWUnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJyYW5nZSIsIG1pbik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygibWluIikgfHwgbXNnLT5jb250YWlucygibWF4IikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKG5hbWUsICJoYXMgb25seSAnbWluJyBvciAnbWF4JyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRTdHJpbmcoInZhbHVlIiwgJm1heCkpIHsKKyAgICAgICAgICAgIG1pbiA9IG1heDsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgIG1pbi5hcHBlbmQobWF4KTsKKyAgICAgICAgICAgIGlmIChtc2ctPmNvbnRhaW5zKCJyYW5nZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IobmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoInJhbmdlIiwgbWluKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgcmFuZ2UsIHNjYWxlID0gImxpbmVhciIsIGRlZiwgaW5fOworICAgICAgICBpZiAoIW1zZy0+ZmluZFN0cmluZygicmFuZ2UiLCAmcmFuZ2UpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRFcnJvcihuYW1lLCAid2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobmFtZSA9PSAicXVhbGl0eSIgfHwgbmFtZSA9PSAiY29tcGxleGl0eSIpIF4KKyAgICAgICAgICAgICAgICAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImRlZmF1bHQiLCAmZGVmKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImRlZmF1bHQiLCBmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gInF1YWxpdHkiICYmIG1zZy0+ZmluZFN0cmluZygic2NhbGUiLCAmc2NhbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOworICAgICAgICB9CisgICAgICAgIGlmICgobmFtZSA9PSAiYXNwZWN0LXJhdGlvIikgXiAoZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoImluIiwgJmluXykpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJpbiIsIGZvdW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09ICJhc3BlY3QtcmF0aW8iKSB7CisgICAgICAgICAgICBpZiAoIShpbl8gPT0gInBpeGVscyIpICYmICEoaW5fID09ICJibG9ja3MiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKG5hbWUsICJpbiIsIGluXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbl8uZXJhc2UoNSwgMSk7IC8vIChwaXhlbHxibG9jayktYXNwZWN0LXJhdGlvCisgICAgICAgICAgICBpbl8uYXBwZW5kKCItIik7CisgICAgICAgICAgICBpbl8uYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgbmFtZSA9IGluXzsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSA9PSAicXVhbGl0eSIpIHsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKCJxdWFsaXR5LXNjYWxlIiwgc2NhbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09ICJxdWFsaXR5IiB8fCBuYW1lID09ICJjb21wbGV4aXR5IikgeworICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOworICAgICAgICAgICAgdGFnLmFwcGVuZCgiLWRlZmF1bHQiKTsKKyAgICAgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRGV0YWlsKHRhZywgZGVmKTsKKyAgICAgICAgfQorICAgICAgICBBU3RyaW5nIHRhZyA9IG5hbWU7CisgICAgICAgIHRhZy5hcHBlbmQoIi1yYW5nZSIpOworICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIHJhbmdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU3RyaW5nIG1heCwgdmFsdWUsIHJhbmdlczsKKyAgICAgICAgaWYgKG1zZy0+Y29udGFpbnMoImRlZmF1bHQiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAiZGVmYXVsdCIpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+Y29udGFpbnMoImluIikpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgImluIik7CisgICAgICAgIH0gZWxzZSBpZiAoKG5hbWUgPT0gImNoYW5uZWwtY291bnQiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJtYXgiLCAmbWF4KSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgIm1heCIsIGZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJtaW4iKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAibWluIik7CisgICAgICAgIH0gZWxzZSBpZiAobXNnLT5jb250YWlucygicmFuZ2UiKSkgeworICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihuYW1lLCAicmFuZ2UiKTsKKyAgICAgICAgfSBlbHNlIGlmICgobmFtZSA9PSAic2FtcGxlLXJhdGUiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJyYW5nZXMiLCAmcmFuZ2VzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIobmFtZSwgInJhbmdlcyIsIGZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmNvbnRhaW5zKCJzY2FsZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJzY2FsZSIpOworICAgICAgICB9IGVsc2UgaWYgKChuYW1lID09ICJhbGlnbm1lbnQiIHx8IG5hbWUgPT0gImJsb2NrLXNpemUiKSBeCisgICAgICAgICAgICAgICAgKGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKCJ2YWx1ZSIsICZ2YWx1ZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKG5hbWUsICJ2YWx1ZSIsIGZvdW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXguc2l6ZSgpKSB7CisgICAgICAgICAgICBBU3RyaW5nIHRhZyA9ICJtYXgtIjsKKyAgICAgICAgICAgIHRhZy5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbCh0YWcsIG1heCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBtQ3VycmVudEluZm8tPmFkZERldGFpbChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmFuZ2VzLnNpemUoKSkgeworICAgICAgICAgICAgQVN0cmluZyB0YWcgPSBuYW1lOworICAgICAgICAgICAgdGFnLmFwcGVuZCgiLXJhbmdlcyIpOworICAgICAgICAgICAgbUN1cnJlbnRJbmZvLT5hZGREZXRhaWwodGFnLCByYW5nZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIHVucmVjb2duaXplZCBsaW1pdCAnJXMnIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyICpzKSB7CisgICAgaWYgKCFzdHJjYXNlY21wKHMsICJ0cnVlIikgfHwgIXN0cmNhc2VjbXAocywgInllcyIpIHx8ICFzdHJjYXNlY21wKHMsICJ5IikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNoYXIgKmVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHJlcyA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgIHJldHVybiAqcyAhPSAnXDAnICYmICplbmQgPT0gJ1wwJyAmJiByZXMgPiAwOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjTGlzdDo6YWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOworICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXR0cmlidXRlcyB3aXRoIHZhbHVlcworICAgICAgICBpZiAoIXN0cmNtcChhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2kgKyAxXTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHJzW2ldLCAib3B0aW9uYWwiKSB8fCAhc3RyY21wKGF0dHJzW2ldLCAicmVxdWlyZWQiKSkgeworICAgICAgICAgICAgaW50IHZhbHVlID0gKGludClwYXJzZUJvb2xlYW4oYXR0cnNbaSArIDFdKTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGF0dHJzW2ldLCAib3B0aW9uYWwiKSkgeworICAgICAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaSArIDFdOworICAgICAgICAgICAgKytpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmZWF0dXJlIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uYWwgPT0gcmVxdWlyZWQgJiYgb3B0aW9uYWwgIT0gLTEpIHsKKyAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgbmFtZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICgob3B0aW9uYWwgIT0gLTEgfHwgcmVxdWlyZWQgIT0gLTEpICYmICh2YWx1ZSAhPSBOVUxMKSkgeworICAgICAgICBBTE9HRSgiZmVhdHVyZSAnJXMnIGhhcyBib3RoIGEgdmFsdWUgYW5kIG9wdGlvbmFsL3JlcXVpcmVkIGF0dHJpYnV0ZSIsIG5hbWUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudEluZm8tPmFkZEZlYXR1cmUobmFtZSwgdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DdXJyZW50SW5mby0+YWRkRmVhdHVyZShuYW1lLCAocmVxdWlyZWQgPT0gMSkgfHwgKG9wdGlvbmFsID09IDApKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQ29kZWNJbmZvICZpbmZvID0gbUNvZGVjSW5mb3MuaXRlbUF0KGkpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjSW5mbyAmaW5mbyA9ICptQ29kZWNJbmZvcy5pdGVtQXQoaSkuZ2V0KCk7CiAKICAgICAgICAgaWYgKGluZm8ubU5hbWUgPT0gbmFtZSkgewogICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC00NDAsMTA4ICs4NDksNCBAQAogICAgIHJldHVybiBtQ29kZWNJbmZvcy5zaXplKCk7CiB9CiAKLWNvbnN0IGNoYXIgKk1lZGlhQ29kZWNMaXN0OjpnZXRDb2RlY05hbWUoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IG1Db2RlY0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOwotICAgIHJldHVybiBpbmZvLm1OYW1lLmNfc3RyKCk7Ci19Ci0KLWJvb2wgTWVkaWFDb2RlY0xpc3Q6OmlzRW5jb2RlcihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0gICAgcmV0dXJuIGluZm8ubUlzRW5jb2RlcjsKLX0KLQotYm9vbCBNZWRpYUNvZGVjTGlzdDo6Y29kZWNIYXNRdWlyaygKLSAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpxdWlya05hbWUpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBpZiAoaW5mby5tUXVpcmtzICE9IDApIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Db2RlY1F1aXJrcy5pbmRleE9mS2V5KHF1aXJrTmFtZSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZm8ubVF1aXJrcyAmICgxdWwgPDwgbUNvZGVjUXVpcmtzLnZhbHVlQXQoaW5kZXgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhQ29kZWNMaXN0OjpnZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgc2l6ZV90IGluZGV4LCBWZWN0b3I8QVN0cmluZz4gKnR5cGVzKSBjb25zdCB7Ci0gICAgdHlwZXMtPmNsZWFyKCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gbUNvZGVjSW5mb3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IENvZGVjSW5mbyAmaW5mbyA9IG1Db2RlY0luZm9zLml0ZW1BdChpbmRleCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UeXBlcy5zaXplKCk7ICsraSkgewotICAgICAgICB1aW50MzJfdCB0eXBlTWFzayA9IDF1bCA8PCBtVHlwZXMudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoaW5mby5tVHlwZXMgJiB0eXBlTWFzaykgewotICAgICAgICAgICAgdHlwZXMtPnB1c2gobVR5cGVzLmtleUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY0xpc3Q6OmdldENvZGVjQ2FwYWJpbGl0aWVzKAotICAgICAgICBzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKnR5cGUsCi0gICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzLAotICAgICAgICBWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMsCi0gICAgICAgIHVpbnQzMl90ICpmbGFncykgY29uc3QgewotICAgIHByb2ZpbGVMZXZlbHMtPmNsZWFyKCk7Ci0gICAgY29sb3JGb3JtYXRzLT5jbGVhcigpOwotCi0gICAgaWYgKGluZGV4ID49IG1Db2RlY0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBjb25zdCBDb2RlY0luZm8gJmluZm8gPSBtQ29kZWNJbmZvcy5pdGVtQXQoaW5kZXgpOwotCi0gICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBzdGF0dXNfdCBlcnIgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzOwotICAgIGVyciA9IFF1ZXJ5Q29kZWMoCi0gICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgICAgICBpbmZvLm1OYW1lLmNfc3RyKCksIHR5cGUsIGluZm8ubUlzRW5jb2RlciwgJmNhcHMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmc3JjID0gY2Fwcy5tUHJvZmlsZUxldmVscy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgUHJvZmlsZUxldmVsIHByb2ZpbGVMZXZlbDsKLSAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlID0gc3JjLm1Qcm9maWxlOwotICAgICAgICBwcm9maWxlTGV2ZWwubUxldmVsID0gc3JjLm1MZXZlbDsKLSAgICAgICAgcHJvZmlsZUxldmVscy0+cHVzaChwcm9maWxlTGV2ZWwpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy5tQ29sb3JGb3JtYXRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbG9yRm9ybWF0cy0+cHVzaChjYXBzLm1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKLSAgICB9Ci0KLSAgICAqZmxhZ3MgPSBjYXBzLm1GbGFnczsKLQotICAgIHJldHVybiBPSzsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlY2RhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNTb3VyY2UiCisjZGVmaW5lIERFQlVHX0RSSUZUX1RJTUUgMAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworICAgIHZvaWQgc3RvcCgpOworCisgICAgdm9pZCBwYXVzZSgpOworICAgIHZvaWQgcmVzdW1lKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgflB1bGxlcigpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFN0YXJ0ID0gJ21zdGEnLAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UHVsbCwKKyAgICAgICAga1doYXRQYXVzZSwKKyAgICAgICAga1doYXRSZXN1bWUsCisgICAgfTsKKworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgaW50MzJfdCBtUHVsbEdlbmVyYXRpb247CisgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtUmVhY2hlZEVPUzsKKworICAgIHN0YXR1c190IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgc2NoZWR1bGVQdWxsKCk7CisgICAgdm9pZCBoYW5kbGVFT1MoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFB1bGxlcik7Cit9OworCitNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OlB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIoKSksCisgICAgICBtUHVsbEdlbmVyYXRpb24oMCksCisgICAgICBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOworCisgICAgbUxvb3Blci0+c2V0TmFtZSgicHVsbF9sb29wZXIiKTsKK30KKworTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjp+UHVsbGVyKCkgeworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgIG1Mb29wZXItPnN0b3AoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnN0YXJ0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKKyAgICBBTE9HVigicHVsbGVyICglcykgc3RhcnQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICBtTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKKyAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICBtTm90aWZ5ID0gbm90aWZ5OworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKKyAgICBtc2ctPnNldE9iamVjdCgibWV0YSIsIG1ldGEpOworICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzdG9wKCkgeworICAgIC8vIFN0b3Agc291cmNlIGZyb20gY2FsbGVyJ3MgdGhyZWFkIGluc3RlYWQgb2YgcHVsbGVyJ3MgbG9vcGVyLgorICAgIC8vIG1Tb3VyY2UtPnN0b3AoKSBpcyB0aHJlYWQtc2FmZSwgZG9pbmcgaXQgb3V0c2lkZSB0aGUgcHVsbGVyJ3MKKyAgICAvLyBsb29wZXIgYWxsb3dzIHVzIHRvIGF0IGxlYXN0IHN0b3AgaWYgc291cmNlIGdldHMgc3R1Y2suCisgICAgLy8gSWYgc291cmNlIGdldHMgc3R1Y2sgaW4gcmVhZCgpLCB0aGUgbG9vcGVyIHdvdWxkIG5ldmVyCisgICAgLy8gYmUgYWJsZSB0byBwcm9jZXNzIHRoZSBzdG9wKCksIHdoaWNoIGNvdWxkIGxlYWQgdG8gQU5SLgorCisgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwaW5nIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIEFMT0dWKCJzb3VyY2UgKCVzKSBzdG9wcGVkIiwgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgaWQoKSkpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cmVzdW1lKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6c2NoZWR1bGVQdWxsKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQdWxsLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVB1bGxHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OmhhbmRsZUVPUygpIHsKKyAgICBpZiAoIW1SZWFjaGVkRU9TKSB7CisgICAgICAgIEFMT0dWKCJwdWxsZXIgKCVzKSBwb3N0aW5nIEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRQb2ludGVyKCJhY2Nlc3NVbml0IiwgTlVMTCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgibWV0YSIsICZvYmopKTsKKworICAgICAgICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoc3RhdGljX2Nhc3Q8TWV0YURhdGEgKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVB1bGwoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgICAgIHsKKyAgICAgICAgICAgICsrbVB1bGxHZW5lcmF0aW9uOworCisgICAgICAgICAgICBoYW5kbGVFT1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFB1bGw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVB1bGxHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWJ1Zik7CisKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1idWYgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdHJlYW0gZW5kZWQsIG1idWYgJXAiLCBtYnVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgcmVhZGluZyBzdHJlYW0uIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlRU9TKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UG9pbnRlcigiYWNjZXNzVW5pdCIsIG1idWYpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3NwPE1lZGlhQ29kZWNTb3VyY2U+IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IG1lZGlhU291cmNlID0KKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjU291cmNlKGxvb3BlciwgZm9ybWF0LCBzb3VyY2UsIGZsYWdzKTsKKworICAgIGlmIChtZWRpYVNvdXJjZS0+aW5pdCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtZWRpYVNvdXJjZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhKiBwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1zZy0+c2V0T2JqZWN0KCJtZXRhIiwgcGFyYW1zKTsKKyAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzdG9wKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CisKKyAgICAvLyBtUHVsbGVyLT5zdG9wKCkgbmVlZHMgdG8gYmUgZG9uZSBvdXRzaWRlIE1lZGlhQ29kZWNTb3VyY2UncyBsb29wZXIsCisgICAgLy8gYXMgaXQgY29udGFpbnMgYSBzeW5jaHJvbm91cyBjYWxsIHRvIHN0b3AgdGhlIHVuZGVybHlpbmcgTWVkaWFTb3VyY2UsCisgICAgLy8gd2hpY2ggb2Z0ZW4gd2FpdHMgZm9yIGFsbCBvdXRzdGFuZGluZyBNZWRpYUJ1ZmZlcnMgdG8gcmV0dXJuLCBidXQKKyAgICAvLyBNZWRpYUJ1ZmZlcnMgYXJlIG9ubHkgcmV0dXJuZWQgd2hlbiBNZWRpYUNvZGVjU291cmNlIGxvb3BlciBnZXRzCisgICAgLy8gdG8gcHJvY2VzcyB0aGVtLgorCisgICAgaWYgKG1QdWxsZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HSSgicHVsbGVyICglcykgc3RvcHBpbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgbVB1bGxlci0+c3RvcCgpOworICAgICAgICBBTE9HSSgicHVsbGVyICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnBhdXNlKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBNZWRpYUNvZGVjU291cmNlOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSB7CisgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CisgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyKiogYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyogLyogb3B0aW9ucyAqLykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisKKyAgICAqYnVmZmVyID0gTlVMTDsKKyAgICB3aGlsZSAobU91dHB1dEJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwICYmICFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgbU91dHB1dEJ1ZmZlckNvbmQud2FpdChtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgfQorICAgIGlmICghbUVuY29kZXJSZWFjaGVkRU9TKSB7CisgICAgICAgICpidWZmZXIgPSAqbU91dHB1dEJ1ZmZlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5lcmFzZShtT3V0cHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIG1FcnJvckNvZGU7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoMCk7CisgICAgYnVmZmVyLT5yZWxlYXNlKCk7Cit9CisKK01lZGlhQ29kZWNTb3VyY2U6Ok1lZGlhQ29kZWNTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCksCisgICAgICBtTWV0YShuZXcgTWV0YURhdGEpLAorICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1Jc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TdG9wcGluZyhmYWxzZSksCisgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcoZmFsc2UpLAorICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xbGwpLAorICAgICAgbUVuY29kZXJSZWFjaGVkRU9TKGZhbHNlKSwKKyAgICAgIG1FcnJvckNvZGUoT0spIHsKKyAgICBDSEVDSyhtTG9vcGVyICE9IE5VTEwpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KSkgeworICAgICAgICBtSXNWaWRlbyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgbVB1bGxlciA9IG5ldyBQdWxsZXIoc291cmNlKTsKKyAgICB9Cit9CisKK01lZGlhQ29kZWNTb3VyY2U6On5NZWRpYUNvZGVjU291cmNlKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBtQ29kZWNMb29wZXItPnN0b3AoKTsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZWxlYXNlRW5jb2RlcigpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmluaXRFbmNvZGVyKCkgeworICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8TWVkaWFDb2RlY1NvdXJjZT4odGhpcyk7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworCisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJjb2RlY19sb29wZXIiKTsKKyAgICBtQ29kZWNMb29wZXItPnN0YXJ0KCk7CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfTUVUQURBVEFfSU5QVVQpIHsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiLCAxKTsKKyAgICB9CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgMSk7CisgICAgfQorCisgICAgQVN0cmluZyBvdXRwdXRNSU1FOworICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb3V0cHV0TUlNRSkpOworCisgICAgbUVuY29kZXIgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovKTsKKworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIEFMT0dWKCJvdXRwdXQgZm9ybWF0IGlzICclcyciLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKworICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywKKyAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjOjpDT05GSUdVUkVfRkxBR19FTkNPREUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1FbmNvZGVyLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtT3V0cHV0Rm9ybWF0LCBtTWV0YSk7CisKKyAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgeworICAgICAgICBDSEVDSyhtSXNWaWRlbyk7CisKKyAgICAgICAgZXJyID0gbUVuY29kZXItPmNyZWF0ZUlucHV0U3VyZmFjZSgmbUdyYXBoaWNCdWZmZXJQcm9kdWNlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IG1FbmNvZGVyLT5nZXRJbnB1dEJ1ZmZlcnMoJm1FbmNvZGVySW5wdXRCdWZmZXJzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRW5jb2RlclJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRXJyb3JDb2RlID0gT0s7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1FbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgbUVuY29kZXIuY2xlYXIoKTsKKworICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5jb2RlcklucHV0QnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGkpOworICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CisgICAgfQorCisgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxFT1Moc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKCFtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR1YoImVuY29kZXIgKCVzKSByZWFjaGVkIEVPUyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU91dHB1dEJ1ZmZlckxvY2spOworICAgICAgICAgICAgLy8gcmVsZWFzZSBhbGwgdW5yZWFkIG1lZGlhIGJ1ZmZlcnMKKyAgICAgICAgICAgIGZvciAoTGlzdDxNZWRpYUJ1ZmZlcio+OjppdGVyYXRvciBpdCA9IG1PdXRwdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBtT3V0cHV0QnVmZmVyUXVldWUuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICBtRW5jb2RlclJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgbUVycm9yQ29kZSA9IGVycjsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb25kLnNpZ25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgcmVsZWFzZUVuY29kZXIoKTsKKyAgICB9CisgICAgaWYgKG1TdG9wcGluZyAmJiBtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR0koImVuY29kZXIgKCVzKSBzdG9wcGVkIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgIC8vIHBvc3RpbmcgcmVwbHkgdG8gZXZlcnlvbmUgdGhhdCdzIHdhaXRpbmcKKyAgICAgICAgTGlzdDx1aW50MzJfdD46Oml0ZXJhdG9yIGl0OworICAgICAgICBmb3IgKGl0ID0gbVN0b3BSZXBseUlEUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtU3RvcFJlcGx5SURRdWV1ZS5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseSgqaXQpOworICAgICAgICB9CisgICAgICAgIG1TdG9wUmVwbHlJRFF1ZXVlLmNsZWFyKCk7CisgICAgICAgIG1TdG9wcGluZyA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzdXNwZW5kKCkgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgdHJ1ZSk7CisgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OnJlc3VtZShpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOworICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICBpZiAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgc2tpcEZyYW1lc0JlZm9yZVVzKTsKKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzY2hlZHVsZURvTW9yZVdvcmsoKSB7CisgICAgaWYgKG1Eb01vcmVXb3JrUGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbURvTW9yZVdvcmtQZW5kaW5nID0gdHJ1ZTsKKworICAgIGlmIChtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKKyAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgfQorICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCkgeworICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKQorICAgICAgICAgICAgJiYgIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlciogbWJ1ZiA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKKworICAgICAgICBzaXplX3QgYnVmZmVySW5kZXggPSAqbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpOworICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVyYXNlKG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAwbGw7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworCisgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLKG1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgLy8gcHVzaCBkZWNvZGluZyB0aW1lIGZvciB2aWRlbywgb3IgZHJpZnQgdGltZSBmb3IgYXVkaW8KKyAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIG1EZWNvZGluZ1RpbWVRdWV1ZS5wdXNoX2JhY2sodGltZVVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVUaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZkcmlmdFRpbWVVcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRyaWZ0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gdGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzIC0gZHJpZnRUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5wdXNoX2JhY2soZHJpZnRUaW1lVXMpOworI2VuZGlmIC8vIERFQlVHX0RSSUZUX1RJTUUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZSA9IG1idWYtPnNpemUoKTsKKworICAgICAgICAgICAgbWVtY3B5KG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCktPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBtYnVmLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICBtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5zZXRNZWRpYUJ1ZmZlckJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgPSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRW5jb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleCwgMCwgc2l6ZSwgdGltZVVzLCBmbGFncyk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZG9Nb3JlV29yayhpbnQzMl90IG51bUlucHV0LCBpbnQzMl90IG51bU91dHB1dCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKKyAgICAgICAgd2hpbGUgKG51bUlucHV0LS0gPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5kZXg7CisgICAgICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5wdXNoX2JhY2soYnVmZmVySW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICB3aGlsZSAobnVtT3V0cHV0LS0gPiAwKSB7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBOVUxMOworICAgICAgICBlcnIgPSBtRW5jb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmYnVmZmVySW5kZXgsICZvZmZzZXQsICZzaXplLCAmdGltZVVzLCAmZmxhZ3MpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBvdXRidWYgPSBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KTsKKworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOworICAgICAgICAgICAgbWVtY3B5KG1idWYtPmRhdGEoKSwgb3V0YnVmLT5kYXRhKCksIG91dGJ1Zi0+c2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyYXBoaWNCdWZmZXJTb3VyY2UgaXMgc3VwcG9zZWQgdG8gZGlzY2FyZCBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVmb3JlIHN0YXJ0LCBhbmQgb2Zmc2V0IHRpbWVVcyBieSBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjb2RpbmcgdGltZSBmb3Igc3VyZmFjZSBzb3VyY2UgaXMgdW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcHJlc2VudGF0aW9uIHRpbWUgZm9yIG5vdy4gTWF5IG5lZWQgdG8gbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsb2dpYyBpbnRvIE1lZGlhQ29kZWMuCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRGVjb2RpbmdUaW1lUXVldWUuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9ICoobURlY29kaW5nVGltZVF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kaW5nVGltZVF1ZXVlLmVyYXNlKG1EZWNvZGluZ1RpbWVRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgZGVjb2RpbmdUaW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbdmlkZW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGR0cy9wdHMgZGlmZiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRlY29kaW5nVGltZVVzIC0gdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRyaWZ0VGltZVVzID0gMDsKKyNpZiBERUJVR19EUklGVF9USU1FCisgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRHJpZnRUaW1lUXVldWUuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gKihtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5lcmFzZShtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCBkcmlmdFRpbWVVcyk7CisjZW5kaWYgLy8gREVCVUdfRFJJRlRfVElNRQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiW2F1ZGlvXSB0aW1lICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpLCBkcmlmdCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRyaWZ0VGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYnVmLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgICAgIG1idWYtPmFkZF9yZWYoKTsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtT3V0cHV0QnVmZmVyTG9jayk7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLnB1c2hfYmFjayhtYnVmKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1FbmNvZGVyLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4KTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6Om9uU3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtU3RvcHBpbmcpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCB3aGlsZSB3ZSdyZSBzdG9wcGluZyIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIEFMT0dJKCJNZWRpYUNvZGVjU291cmNlICglcykgcmVzdW1pbmciLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIHJlc3VtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1QdWxsZXItPnJlc3VtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HSSgiTWVkaWFDb2RlY1NvdXJjZSAoJXMpIHN0YXJ0aW5nIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSAtMWxsOworICAgICAgICB9CisgICAgICAgIHJlc3VtZShzdGFydFRpbWVVcyk7CisgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAga1doYXRQdWxsZXJOb3RpZnksIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICBlcnIgPSBtUHVsbGVyLT5zdGFydChwYXJhbXMsIG5vdGlmeSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HSSgiTWVkaWFDb2RlY1NvdXJjZSAoJXMpIHN0YXJ0ZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgY2FzZSBrV2hhdFB1bGxlck5vdGlmeToKKyAgICB7CisgICAgICAgIE1lZGlhQnVmZmVyICptYnVmOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJhY2Nlc3NVbml0IiwgKHZvaWQqKikmbWJ1ZikpOworCisgICAgICAgIGlmIChtYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJwdWxsZXIgKCVzKSByZWFjaGVkIEVPUyIsCisgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgc2lnbmFsRU9TKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoImdvdCBtc2cgJyVzJyBhZnRlciBlbmNvZGVyIHNodXRkb3duLiIsCisgICAgICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbUlucHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKG1idWYpOworCisgICAgICAgIGZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCk7CisgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0RW5jb2RlckFjdGl2aXR5OgorICAgIHsKKyAgICAgICAgbURvTW9yZVdvcmtQZW5kaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBudW1JbnB1dCwgbnVtT3V0cHV0OworCisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlucHV0LWJ1ZmZlcnMiLCAmbnVtSW5wdXQpKSB7CisgICAgICAgICAgICBudW1JbnB1dCA9IElOVDMyX01BWDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJvdXRwdXQtYnVmZmVycyIsICZudW1PdXRwdXQpKSB7CisgICAgICAgICAgICBudW1PdXRwdXQgPSBJTlQzMl9NQVg7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBkb01vcmVXb3JrKG51bUlucHV0LCBudW1PdXRwdXQpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmVhY2hlZCBFT1MsIG9yIGVycm9yCisgICAgICAgICAgICBzaWduYWxFT1MoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtXaGF0U3RhcnQ6CisgICAgeworICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoIm1ldGEiLCAmb2JqKSk7CisgICAgICAgIE1ldGFEYXRhICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSAqPihvYmouZ2V0KCkpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBvblN0YXJ0KHBhcmFtcykpOworICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgeworICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwaW5nIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisKKyAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgIGlmIChtRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFscmVhZHkgcmVhY2hlZCBFT1MsIHJlcGx5IGFuZCByZXR1cm4gbm93CisgICAgICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIGFscmVhZHkgc3RvcHBlZCIsCisgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbVN0b3BSZXBseUlEUXVldWUucHVzaF9iYWNrKHJlcGx5SUQpOworICAgICAgICBpZiAobVN0b3BwaW5nKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGlmIHdlJ3JlIGFscmVhZHkgc3RvcHBpbmcsIHJlcGx5IHdpbGwgYmUgcG9zdGVkCisgICAgICAgICAgICAvLyB0byBhbGwgd2hlbiB3ZSdyZSBzdG9wcGVkLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtU3RvcHBpbmcgPSB0cnVlOworCisgICAgICAgIC8vIGlmIHVzaW5nIHN1cmZhY2UsIHNpZ25hbCBzb3VyY2UgRU9TIGFuZCB3YWl0IGZvciBFT1MgdG8gY29tZSBiYWNrLgorICAgICAgICAvLyBvdGhlcndpc2UsIHJlbGVhc2UgZW5jb2RlciBhbmQgcG9zdCBFT1MgaWYgaGF2ZW4ndCBkb25lIGFscmVhZHkKKyAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKKyAgICAgICAgICAgIG1FbmNvZGVyLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaWduYWxFT1MoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgIHsKKyAgICAgICAgaWYgKG1GbGFncyAmJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CisgICAgICAgICAgICBzdXNwZW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOworICAgICAgICAgICAgbVB1bGxlci0+cGF1c2UoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCmluZGV4IDM0MGNiYTcuLmQ0OGRkODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgPSAidmlkZW8vbXA0di1lcyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzID0gInZpZGVvLzNncHAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIgPSAidmlkZW8vbXBlZzIiOwpAQCAtMzYsNiArMzcsNyBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDID0gImF1ZGlvL21wNGEtbGF0bSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCA9ICJhdWRpby9xY2VscCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMgPSAiYXVkaW8vdm9yYmlzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVMgPSAiYXVkaW8vb3B1cyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgPSAiYXVkaW8vZzcxMS1hbGF3IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyA9ICJhdWRpby9nNzExLW1sYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXID0gImF1ZGlvL3JhdyI7CkBAIC01Niw1ICs1OCw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCA9ICJ0ZXh0LzNncHAtdHQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAgPSAiYXBwbGljYXRpb24veC1zdWJyaXAiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQgPSAidGV4dC92dHQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4ID0gInRleHQvY2VhLTYwOCI7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IGQ4N2U5MTAuLmM3YzZmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0xNiw2ICsxNiw5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNdXhlciIKKworI2luY2x1ZGUgIndlYm0vV2VibVdyaXRlci5oIgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CkBAIC0zNiwxOSArMzksMzAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFNdXhlcjo6TWVkaWFNdXhlcihjb25zdCBjaGFyICpwYXRoLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CiAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX01QRUdfNCkgewogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKHBhdGgpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgeworICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIocGF0aCk7CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KLQogfQogCiBNZWRpYU11eGVyOjpNZWRpYU11eGVyKGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCkKLSAgICA6IG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CisgICAgOiBtRm9ybWF0KGZvcm1hdCksCisgICAgICBtU3RhdGUoVU5JTklUSUFMSVpFRCkgewogICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgfQorCisgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewogICAgICAgICBtRmlsZU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KQEAgLTEwOSw4ICsxMjMsMTMgQEAKICAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0KCkuIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgaWYgKG1Gb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgaXMgb25seSBzdXBwb3J0ZWQgZm9yIC5tcDQgb3V0cHV0LiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgQUxPR1YoIlNldHRpbmcgbG9jYXRpb246IGxhdGl0dWRlID0gJWQsIGxvbmdpdHVkZSA9ICVkIiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSk7Ci0gICAgcmV0dXJuIG1Xcml0ZXItPnNldEdlb0RhdGEobGF0aXR1ZGUsIGxvbmdpdHVkZSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1QRUc0V3JpdGVyKj4obVdyaXRlci5nZXQoKSktPnNldEdlb0RhdGEobGF0aXR1ZGUsIGxvbmdpdHVkZSk7CiB9CiAKIHN0YXR1c190IE1lZGlhTXV4ZXI6OnN0YXJ0KCkgewpAQCAtMTU3LDcgKzE3Niw3IEBACiAgICAgfQogCiAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrTGlzdC5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGdldCBhbiBpbnZhbGlkIGluZGV4ICVkIiwgdHJhY2tJbmRleCk7CisgICAgICAgIEFMT0dFKCJXcml0ZVNhbXBsZURhdGEoKSBnZXQgYW4gaW52YWxpZCBpbmRleCAlenUiLCB0cmFja0luZGV4KTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKaW5kZXggZmQwZTc5Yy4uNTc2NDcxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApAQCAtMzIsNiArMzIsMTkgQEAKICAgICBtT3B0aW9ucyA9IDA7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwogICAgIG1MYXRlbmVzc1VzID0gMDsKKyAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCitib29sIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKIH0KIAogdm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhLmNwcAppbmRleCA3MjVmOTdlLi4xYTExYzFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGEuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGEiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIwLDcgKzMyMSw3IEBACiAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IHN0b3JhZ2UoKTsKICAgICBzd2l0Y2gobVR5cGUpIHsKICAgICAgICAgY2FzZSBUWVBFX05PTkU6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJWQpIiwgbVNpemUpOworICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCJubyB0eXBlLCBzaXplICV6dSkiLCBtU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX0NfU1RSSU5HOgogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoY2hhciopICVzIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKQEAgLTMyOSw3ICszMzAsNyBAQAogICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoaW50MzJfdCkgJWQiLCAqKGludDMyX3QgKilkYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQ2NF90KSAlbGxkIiwgKihpbnQ2NF90ICopZGF0YSk7CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQ2NF90KSAlIiBQUklkNjQsICooaW50NjRfdCAqKWRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVFlQRV9GTE9BVDoKICAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGZsb2F0KSAlZiIsICooZmxvYXQgKilkYXRhKTsKQEAgLTM0Niw3ICszNDcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKHVua25vd24gdHlwZSAlZCwgc2l6ZSAlZCkiLCBtVHlwZSwgbVNpemUpOworICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodW5rbm93biB0eXBlICVkLCBzaXplICV6dSkiLCBtVHlwZSwgbVNpemUpOwogICAgICAgICAgICAgaWYgKG1TaXplIDw9IDQ4KSB7IC8vIGlmIGl0J3MgbGVzcyB0aGFuIHRocmVlIGxpbmVzIG9mIGhleCBkYXRhLCBkdW1wIGl0CiAgICAgICAgICAgICAgICAgQVN0cmluZyBmb287CiAgICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBtU2l6ZSwgMCwgJmZvbyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCAyNzBkNjRhLi5jYmMxZmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51Q2FjaGVkU291cmNlMiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTEzNSw3ICsxMzcsNyBAQAogfQogCiB2b2lkIFBhZ2VDYWNoZTo6Y29weShzaXplX3QgZnJvbSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiY29weSBmcm9tICVkIHNpemUgJWQiLCBmcm9tLCBzaXplKTsKKyAgICBBTE9HVigiY29weSBmcm9tICV6dSBzaXplICV6dSIsIGZyb20sIHNpemUpOwogCiAgICAgaWYgKHNpemUgPT0gMCkgewogICAgICAgICByZXR1cm47CkBAIC0xODksNiArMTkxLDcgQEAKICAgICAgIG1GaW5hbFN0YXR1cyhPSyksCiAgICAgICBtTGFzdEFjY2Vzc1BvcygwKSwKICAgICAgIG1GZXRjaGluZyh0cnVlKSwKKyAgICAgIG1EaXNjb25uZWN0aW5nKGZhbHNlKSwKICAgICAgIG1MYXN0RmV0Y2hUaW1lVXMoLTEpLAogICAgICAgbU51bVJldHJpZXNMZWZ0KGtNYXhOdW1SZXRyaWVzKSwKICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyhrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZCksCkBAIC0yMTMsNyArMjE2LDE0IEBACiAKICAgICBtTG9vcGVyLT5zZXROYW1lKCJOdUNhY2hlZFNvdXJjZTIiKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7Ci0gICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgIC8vIFNpbmNlIGl0IG1heSBub3QgYmUgb2J2aW91cyB3aHkgb3VyIGxvb3BlciB0aHJlYWQgbmVlZHMgdG8gYmUKKyAgICAvLyBhYmxlIHRvIGNhbGwgaW50byBqYXZhIHNpbmNlIGl0IGRvZXNuJ3QgYXBwZWFyIHRvIGRvIHNvIGF0IGFsbC4uLgorICAgIC8vIElNZWRpYUhUVFBDb25uZWN0aW9uIG1heSBiZSAoYW5kIG1vc3QgbGlrZWx5IGlzKSBpbXBsZW1lbnRlZCBpbiBKQVZBCisgICAgLy8gYW5kIGEgbG9jYWwgSkFWQSBJQmluZGVyIHdpbGwgY2FsbCBkaXJlY3RseSBpbnRvIEpOSSBtZXRob2RzLgorICAgIC8vIFNvIHdoZW5ldmVyIHdlIGNhbGwgRGF0YVNvdXJjZTo6cmVhZEF0IGl0IG1heSBlbmQgdXAgaW4gYSBjYWxsIHRvCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb246OnJlYWRBdCBhbmQgdGhlcmVmb3JlIGNhbGwgYmFjayBpbnRvIEpBVkEuCisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLCB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKIH0KIAogTnVDYWNoZWRTb3VyY2UyOjp+TnVDYWNoZWRTb3VyY2UyKCkgewpAQCAtMjQ0LDYgKzI1NCwyNyBAQAogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKIH0KIAordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3RpbmcgSFRUUEJhc2VkU291cmNlIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIC8vIHNldCBtRGlzY29ubmVjdGluZyB0byB0cnVlLCBpZiBhIGZldGNoIHJldHVybnMgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHRoaXMsIHRoZSBzb3VyY2Ugd2lsbCBiZSBtYXJrZWQgYXMgRU9TLgorICAgICAgICAgICAgbURpc2Nvbm5lY3RpbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNpZ25hbCBtQ29uZGl0aW9uIHNvIHRoYXQgdGhlIHBlbmRpbmcgcmVhZEF0KCkKKyAgICAgICAgICAgIC8vIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuCisgICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhwbGljaXRseSBkaXNjb25uZWN0IGZyb20gdGhlIHNvdXJjZSwgdG8gYWxsb3cgYW55CisgICAgICAgIC8vIHBlbmRpbmcgcmVhZHMgdG8gcmV0dXJuIG1vcmUgcHJvbXB0bHkKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKICAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewogICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CkBAIC0zMDcsNyArMzM4LDExIEBACiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgICAgICBpZiAoZXJyID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IGVyciA9PSAtRVBJUEUpIHsKKyAgICAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOworICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgewogICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgbGlrZWx5IHRvIGdvIGF3YXkgZXZlbiBpZiB3ZQogICAgICAgICAgICAgLy8gcmV0cnksIGkuZS4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgb3Igc2ltaWxhci4KICAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CkBAIC0zMjcsNyArMzYyLDE0IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgaWYgKG4gPCAwKSB7CisgICAgaWYgKG4gPT0gMCB8fCBtRGlzY29ubmVjdGluZykgeworICAgICAgICBBTE9HSSgiRVJST1JfRU5EX09GX1NUUkVBTSIpOworCisgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKKyAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CiAgICAgICAgIG1GaW5hbFN0YXR1cyA9IG47CiAgICAgICAgIGlmIChuID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IG4gPT0gLUVQSVBFKSB7CiAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCkBAIC0zMzUsMTQgKzM3Nyw3IEBACiAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0UoInNvdXJjZSByZXR1cm5lZCBlcnJvciAlbGQsICVkIHJldHJpZXMgbGVmdCIsIG4sIG1OdW1SZXRyaWVzTGVmdCk7Ci0gICAgICAgIG1DYWNoZS0+cmVsZWFzZVBhZ2UocGFnZSk7Ci0gICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgQUxPR0koIkVSUk9SX0VORF9PRl9TVFJFQU0iKTsKLQotICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwotICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotCisgICAgICAgIEFMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJXpkLCAlZCByZXRyaWVzIGxlZnQiLCBuLCBtTnVtUmV0cmllc0xlZnQpOwogICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKQEAgLTQzMCw2ICs0NjUsMTAgQEAKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgQ0hFQ0sobUFzeW5jUmVzdWx0ID09IE5VTEwpOwogCkBAIC00NjYsMTYgKzUwNSwxOSBAQAogICAgIHNpemVfdCBhY3R1YWxCeXRlcyA9IG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydChtYXhCeXRlcyk7CiAgICAgbUNhY2hlT2Zmc2V0ICs9IGFjdHVhbEJ5dGVzOwogCi0gICAgQUxPR0koInJlc3RhcnRpbmcgcHJlZmV0Y2hlciwgdG90YWxTaXplID0gJWQiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKKyAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlenUiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKICAgICBtRmV0Y2hpbmcgPSB0cnVlOwogfQogCiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvU2VyaWFsaXplcihtU2VyaWFsaXplcik7CiAKLSAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKKyAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CiAKICAgICAvLyBJZiB0aGUgcmVxdWVzdCBjYW4gYmUgY29tcGxldGVseSBzYXRpc2ZpZWQgZnJvbSB0aGUgY2FjaGUsIGRvIHNvLgogCkBAIC00OTcsMTAgKzUzOSwxNSBAQAogICAgIENIRUNLKG1Bc3luY1Jlc3VsdCA9PSBOVUxMKTsKICAgICBtc2ctPnBvc3QoKTsKIAotICAgIHdoaWxlIChtQXN5bmNSZXN1bHQgPT0gTlVMTCkgeworICAgIHdoaWxlIChtQXN5bmNSZXN1bHQgPT0gTlVMTCAmJiAhbURpc2Nvbm5lY3RpbmcpIHsKICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKICAgICB9CiAKKyAgICBpZiAobURpc2Nvbm5lY3RpbmcpIHsKKyAgICAgICAgbUFzeW5jUmVzdWx0LmNsZWFyKCk7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKwogICAgIGludDMyX3QgcmVzdWx0OwogICAgIENIRUNLKG1Bc3luY1Jlc3VsdC0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CiAKQEAgLTU0MSw3ICs1ODgsNyBAQAogc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBDSEVDS19MRShzaXplLCAoc2l6ZV90KW1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyk7CiAKLSAgICBBTE9HVigicmVhZEludGVybmFsIG9mZnNldCAlbGxkIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlenUiLCBvZmZzZXQsIHNpemUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtNjUwLDcgKzY5Nyw3IEBACiAgICAgc3NpemVfdCBsb3d3YXRlck1hcmtLYiwgaGlnaHdhdGVyTWFya0tiOwogICAgIGludCBrZWVwQWxpdmVTZWNzOwogCi0gICAgaWYgKHNzY2FuZihzLCAiJWxkLyVsZC8lZCIsCisgICAgaWYgKHNzY2FuZihzLCAiJXpkLyV6ZC8lZCIsCiAgICAgICAgICAgICAgICAmbG93d2F0ZXJNYXJrS2IsICZoaWdod2F0ZXJNYXJrS2IsICZrZWVwQWxpdmVTZWNzKSAhPSAzKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgY2FjaGUgcGFyYW1ldGVycyBmcm9tICclcycuIiwgcyk7CiAgICAgICAgIHJldHVybjsKQEAgLTY4MSw3ICs3MjgsNyBAQAogICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtEZWZhdWx0S2VlcEFsaXZlSW50ZXJ2YWxVczsKICAgICB9CiAKLSAgICBBTE9HVigibG93d2F0ZXIgPSAlZCBieXRlcywgaGlnaHdhdGVyID0gJWQgYnl0ZXMsIGtlZXBhbGl2ZSA9ICVsbGQgdXMiLAorICAgIEFMT0dWKCJsb3d3YXRlciA9ICV6dSBieXRlcywgaGlnaHdhdGVyID0gJXp1IGJ5dGVzLCBrZWVwYWxpdmUgPSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcywKICAgICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcywKICAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggN2JjN2RhMi4uZjI0Y2YzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTU4LDcgKzU4LDkgQEAKIH0KIAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKQEAgLTY2LDcgKzY4LDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShwYXRoLCBoZWFkZXJzKTsKKyAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgcGF0aCwgaGVhZGVycyk7CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwpAQCAtMzg3LDcgKzM4OSw3IEBACiAgICAgICAgICAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gZXJyOwogCiAgICAgICAgICAgICAgICAgaWYgKGluZm8tPm1GaW5hbFJlc3VsdCAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWFkIG9uIHRyYWNrICVkIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJXp1IGZhaWxlZCB3aXRoIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bVRyYWNrSW5kZXgsIGVycik7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAppbmRleCA0ZWI4NjU0Li4wMzQxZDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKQEAgLTE2LDYgKzE2LDExIEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YQ2xpZW50IgorCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC03Myw2ICs3OCwxMCBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpOwogCkBAIC0xNDEsNyArMTUwLDcgQEAKICAgICBjb25zdCBzcDxJT01YPiAmZ2V0T01YKG5vZGVfaWQgbm9kZSkgY29uc3Q7CiAgICAgY29uc3Qgc3A8SU9NWD4gJmdldE9NWF9sKG5vZGVfaWQgbm9kZSkgY29uc3Q7CiAKLSAgICBzdGF0aWMgYm9vbCBJc1NvZnR3YXJlQ29tcG9uZW50KGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHN0YXRpYyBib29sIENhbkxpdmVMb2NhbGx5KGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV4T01YKTsKIH07CkBAIC0xNjQsOCArMTczLDE1IEBACiB9CiAKIC8vIHN0YXRpYwotYm9vbCBNdXhPTVg6OklzU29mdHdhcmVDb21wb25lbnQoY29uc3QgY2hhciAqbmFtZSkgeworYm9vbCBNdXhPTVg6OkNhbkxpdmVMb2NhbGx5KGNvbnN0IGNoYXIgKm5hbWUpIHsKKyNpZmRlZiBfX0xQNjRfXworICAgICh2b2lkKW5hbWU7IC8vIGRpc2FibGUgdW51c2VkIHBhcmFtZXRlciB3YXJuaW5nCisgICAgLy8gNjQgYml0IHByb2Nlc3NlcyBhbHdheXMgcnVuIE9NWCByZW1vdGUgb24gTWVkaWFTZXJ2ZXIKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIC8vIDMyIGJpdCBwcm9jZXNzZXMgcnVuIG9ubHkgT01YLmdvb2dsZS4qIGNvbXBvbmVudHMgbG9jYWxseQogICAgIHJldHVybiAhc3RybmNhc2VjbXAobmFtZSwgIk9NWC5nb29nbGUuIiwgMTEpOworI2VuZGlmCiB9CiAKIGNvbnN0IHNwPElPTVg+ICZNdXhPTVg6OmdldE9NWChub2RlX2lkIG5vZGUpIGNvbnN0IHsKQEAgLTE5Nyw3ICsyMTMsNyBAQAogCiAgICAgc3A8SU9NWD4gb214OwogCi0gICAgaWYgKElzU29mdHdhcmVDb21wb25lbnQobmFtZSkpIHsKKyAgICBpZiAoQ2FuTGl2ZUxvY2FsbHkobmFtZSkpIHsKICAgICAgICAgaWYgKG1Mb2NhbE9NWCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtTG9jYWxPTVggPSBuZXcgT01YOwogICAgICAgICB9CkBAIC0yNzksNiArMjk1LDEzIEBACiAgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBlbmFibGUsIG1heEZyYW1lV2lkdGgsIG1heEZyYW1lSGVpZ2h0KTsKIH0KIAorc3RhdHVzX3QgTXV4T01YOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX1UzMiBhdWRpb0h3U3luYywgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlLCBwb3J0SW5kZXgsIGVuYWJsZSwgYXVkaW9Id1N5bmMsIHNpZGViYW5kSGFuZGxlKTsKK30KKwogc3RhdHVzX3QgTXV4T01YOjplbmFibGVHcmFwaGljQnVmZmVycygKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmVuYWJsZUdyYXBoaWNCdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSk7CkBAIC0zODMsNyArNDA2LDcgQEAKICAgICBtT01YID0gc2VydmljZS0+Z2V0T01YKCk7CiAgICAgQ0hFQ0sobU9NWC5nZXQoKSAhPSBOVUxMKTsKIAotICAgIGlmICghbU9NWC0+bGl2ZXNMb2NhbGx5KE5VTEwgLyogbm9kZSAqLywgZ2V0cGlkKCkpKSB7CisgICAgaWYgKCFtT01YLT5saXZlc0xvY2FsbHkoMCAvKiBub2RlICovLCBnZXRwaWQoKSkpIHsKICAgICAgICAgQUxPR0koIlVzaW5nIGNsaWVudC1zaWRlIE9NWCBtdXguIik7CiAgICAgICAgIG1PTVggPSBuZXcgTXV4T01YKG1PTVgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCBlYzUzYWZmLi45N2Y0OWJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC0xNCw4ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YQ29kZWMiCisKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvQUFDRW5jb2Rlci5oIgpAQCAtMjgsNiArMzUsNyBAQAogI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC05NCw2ICsxMDIsNyBAQAogCiAjZGVmaW5lIENPREVDX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIENPREVDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENPREVDX0xPR1coeCwgLi4uKSBBTE9HVygiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIENPREVDX0xPR0UoeCwgLi4uKSBBTE9HRSgiWyVzXSAieCwgbUNvbXBvbmVudE5hbWUsICMjX19WQV9BUkdTX18pCiAKIHN0cnVjdCBPTVhDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewpAQCAtMTI3LDYgKzEzNiw3IEBACiAKIHRlbXBsYXRlPGNsYXNzIFQ+CiBzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKE9NWF9QVFIpID09IDQpOyAvLyBjaGVjayBPTVhfUFRSIGlzIDQgYnl0ZXMuCiAgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CiAgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOwpAQCAtMTg4LDcgKzE5OCw3IEBACiAgICAgICAgIFZlY3RvcjxDb2RlY05hbWVBbmRRdWlya3M+ICptYXRjaGluZ0NvZGVjcykgewogICAgIG1hdGNoaW5nQ29kZWNzLT5jbGVhcigpOwogCi0gICAgY29uc3QgTWVkaWFDb2RlY0xpc3QgKmxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMDQsNyArMjE0LDkgQEAKIAogICAgICAgICBpbmRleCA9IG1hdGNoSW5kZXggKyAxOwogCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUgPSBsaXN0LT5nZXRDb2RlY05hbWUobWF0Y2hJbmRleCk7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKG1hdGNoSW5kZXgpOworICAgICAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAKICAgICAgICAgLy8gSWYgYSBzcGVjaWZpYyBjb2RlYyBpcyByZXF1ZXN0ZWQsIHNraXAgdGhlIG5vbi1tYXRjaGluZyBvbmVzLgogICAgICAgICBpZiAobWF0Y2hDb21wb25lbnROYW1lICYmIHN0cmNtcChjb21wb25lbnROYW1lLCBtYXRjaENvbXBvbmVudE5hbWUpKSB7CkBAIC0yMjIsNyArMjM0LDcgQEAKICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtYXRjaGluZ0NvZGVjcy0+YWRkKCk7CiAgICAgICAgICAgICBDb2RlY05hbWVBbmRRdWlya3MgKmVudHJ5ID0gJm1hdGNoaW5nQ29kZWNzLT5lZGl0SXRlbUF0KGluZGV4KTsKICAgICAgICAgICAgIGVudHJ5LT5tTmFtZSA9IFN0cmluZzgoY29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICBlbnRyeS0+bVF1aXJrcyA9IGdldENvbXBvbmVudFF1aXJrcyhsaXN0LCBtYXRjaEluZGV4KTsKKyAgICAgICAgICAgIGVudHJ5LT5tUXVpcmtzID0gZ2V0Q29tcG9uZW50UXVpcmtzKGluZm8pOwogCiAgICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyBxdWlya3MgMHglMDh4IiwKICAgICAgICAgICAgICAgICAgIGVudHJ5LT5tTmFtZS5zdHJpbmcoKSwgZW50cnktPm1RdWlya3MpOwpAQCAtMjM2LDE4ICsyNDgsMTUgQEAKIAogLy8gc3RhdGljCiB1aW50MzJfdCBPTVhDb2RlYzo6Z2V0Q29tcG9uZW50UXVpcmtzKAotICAgICAgICBjb25zdCBNZWRpYUNvZGVjTGlzdCAqbGlzdCwgc2l6ZV90IGluZGV4KSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbykgewogICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1pbnB1dC1wb3J0cyIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICB9Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSkgeworICAgIGlmIChpbmZvLT5oYXNRdWlyaygicmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICB9Ci0gICAgaWYgKGxpc3QtPmNvZGVjSGFzUXVpcmsoCi0gICAgICAgICAgICAgICAgaW5kZXgsICJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIpKSB7CisgICAgaWYgKGluZm8tPmhhc1F1aXJrKCJvdXRwdXQtYnVmZmVycy1hcmUtdW5yZWFkYWJsZSIpKSB7CiAgICAgICAgIHF1aXJrcyB8PSBrT3V0cHV0QnVmZmVyc0FyZVVucmVhZGFibGU7CiAgICAgfQogCkBAIC0yNTYsOCArMjY1LDcgQEAKIAogLy8gc3RhdGljCiBib29sIE9NWENvZGVjOjpmaW5kQ29kZWNRdWlya3MoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgdWludDMyX3QgKnF1aXJrcykgewotICAgIGNvbnN0IE1lZGlhQ29kZWNMaXN0ICpsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0KKyAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBpZiAobGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yNjgsNyArMjc2LDkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgICpxdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MobGlzdCwgaW5kZXgpOworICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbGlzdC0+Z2V0Q29kZWNJbmZvKGluZGV4KTsKKyAgICBDSEVDSyhpbmZvICE9IE5VTEwpOworICAgICpxdWlya3MgPSBnZXRDb21wb25lbnRRdWlya3MoaW5mbyk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTM3Miw2ICszODIsNTcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdHVzX3QgT01YQ29kZWM6OnBhcnNlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIC8vIHZlcmlmeSBtaW5pbXVtIHNpemUgYW5kIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEuCisgICAgaWYgKHNpemUgPCA3IHx8IHB0clswXSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnByb2ZpbGUgPSAocHRyWzFdICYgMzEpOworICAgICpsZXZlbCA9IHB0clsxMl07CisKKyAgICBwdHIgKz0gMjI7CisgICAgc2l6ZSAtPSAyMjsKKworICAgIHNpemVfdCBudW1vZkFycmF5cyA9IChjaGFyKXB0clswXTsKKyAgICBwdHIgKz0gMTsKKyAgICBzaXplIC09IDE7CisgICAgc2l6ZV90IGogPSAwLCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtb2ZBcnJheXM7IGkrKykgeworICAgICAgICBwdHIgKz0gMTsKKyAgICAgICAgc2l6ZSAtPSAxOworCisgICAgICAgIC8vIE51bSBvZiBuYWxzCisgICAgICAgIHNpemVfdCBudW1vZk5hbHMgPSBVMTZfQVQocHRyKTsKKyAgICAgICAgcHRyICs9IDI7CisgICAgICAgIHNpemUgLT0gMjsKKworICAgICAgICBmb3IgKGogPSAwO2ogPCBudW1vZk5hbHM7aisrKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgICBpZiAoc2l6ZSA8IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShwdHIsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIHB0ciArPSBsZW5ndGg7CisgICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE9NWENvZGVjOjpwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGUsIHVuc2lnbmVkICpsZXZlbCkgewpAQCAtNDg0LDExICs1NDUsMzIgQEAKICAgICAgICAgICAgIENPREVDX0xPR0koCiAgICAgICAgICAgICAgICAgICAgICJBVkMgcHJvZmlsZSA9ICV1ICglcyksIGxldmVsID0gJXUiLAogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksIGxldmVsKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQKKworICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgbGV2ZWw7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsICZwcm9maWxlLCAmbGV2ZWwpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNYWxmb3JtZWQgSEVWQyBjb2RlYyBzcGVjaWZpYyBkYXRhLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENPREVDX0xPR0koCisgICAgICAgICAgICAgICAgICAgICJIRVZDIHByb2ZpbGUgPSAldSAsIGxldmVsID0gJXUiLAorICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBsZXZlbCk7CiAgICAgICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKIAogICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CiAgICAgICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShkYXRhLCBzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5T3B1c0hlYWRlciwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworCisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kRGF0YShrS2V5T3B1c0NvZGVjRGVsYXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgICAgIGFkZENvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoZGF0YSwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY2NywxMSArNzQ5LDkgQEAKICAgICBPTVhfVTMyIGluZGV4ID0gMDsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGZvcm1hdC5uSW5kZXggPSBpbmRleDsKLSAgICAgICAgQUxPR0koImNhbGxpbmcgZ2V0cGFyYW0gJWQgc2l6ZSAlZCIsIGluZGV4LCBmb3JtYXQublNpemUpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LAogICAgICAgICAgICAgICAgICZmb3JtYXQsIHNpemVvZihmb3JtYXQpKTsKLSAgICAgICAgQUxPR0koImNhbGxlZCBnZXRwYXJhbSAlZCBzaXplICVkOiAlZCIsIGluZGV4LCBmb3JtYXQublNpemUsIGVycik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTY4MSw3ICs3NjEsNyBAQAogICAgICAgICAvLyBDSEVDS19FUShmb3JtYXQubkluZGV4LCBpbmRleCk7CiAKICNpZiAxCi0gICAgICAgIENPREVDX0xPR1YoInBvcnRJbmRleDogJWxkLCBpbmRleDogJWxkLCBlQ29tcHJlc3Npb25Gb3JtYXQ9JWQgZUNvbG9yRm9ybWF0PSVkIiwKKyAgICAgICAgQ09ERUNfTE9HVigicG9ydEluZGV4OiAldSwgaW5kZXg6ICV1LCBlQ29tcHJlc3Npb25Gb3JtYXQ9JWQgZUNvbG9yRm9ybWF0PSVkIiwKICAgICAgICAgICAgICBwb3J0SW5kZXgsCiAgICAgICAgICAgICAgaW5kZXgsIGZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQsIGZvcm1hdC5lQ29sb3JGb3JtYXQpOwogI2VuZGlmCkBAIC03MDUsMTEgKzc4NSw5IEBACiAgICAgfQogCiAgICAgQ09ERUNfTE9HVigiZm91bmQgYSBtYXRjaC4iKTsKLSAgICBBTE9HSSgiY2FsbGluZyBzZXRwYXJhbSBzaXplICVkIiwgZm9ybWF0Lm5TaXplKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsCiAgICAgICAgICAgICAmZm9ybWF0LCBzaXplb2YoZm9ybWF0KSk7Ci0gICAgQUxPR0koImNhbGxlZCBzZXRwYXJhbTogJWQiLCBlcnIpOwogCiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTc4NSw3ICs4NjMsNyBAQAogICAgICAgICBwb3J0Rm9ybWF0Lm5JbmRleCA9IGluZGV4OwogCiAgICAgICAgIGlmIChpbmRleCA+PSBrTWF4Q29sb3JGb3JtYXRTdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIENPREVDX0xPR0UoIk1vcmUgdGhhbiAlbGQgY29sb3IgZm9ybWF0cyBhcmUgc3VwcG9ydGVkPz8/IiwgaW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HRSgiTW9yZSB0aGFuICV1IGNvbG9yIGZvcm1hdHMgYXJlIHN1cHBvcnRlZD8/PyIsIGluZGV4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtODEwLDYgKzg4OCw4IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CisgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0hFVkM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nTVBFRzQ7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCBtaW1lKSkgewpAQCAtOTE0LDcgKzk5NCw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBPTVhfVTMyIHJldCA9IGZyYW1lUmF0ZSAqIGlGcmFtZXNJbnRlcnZhbCAtIDE7Ci0gICAgQ0hFQ0socmV0ID4gMSk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTIwNSw2ICsxMjg0LDggQEAKICAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgbWltZSkpIHsKKyAgICAgICAgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nSEVWQzsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIG1pbWUpKSB7CiAgICAgICAgIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsIG1pbWUpKSB7CkBAIC0xMzkxLDEyICsxNDcyLDE2IEBACiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5hYWMiLCAiYXVkaW9fZW5jb2Rlci5hYWMiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvX2VuY29kZXIudm9yYmlzIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvX2VuY29kZXIub3B1cyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsICJhdWRpb19lbmNvZGVyLmc3MTFtbGF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVywKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiwgImF1ZGlvX2VuY29kZXIuZzcxMWFsYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuYXZjIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5oZXZjIiwgInZpZGVvX2VuY29kZXIuaGV2YyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLm1wZWc0IiwgInZpZGVvX2VuY29kZXIubXBlZzQiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywKQEAgLTE0NjYsNyArMTU1MSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+ZnJlZU5vZGUobU5vZGUpOwogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgIG1Ob2RlID0gTlVMTDsKKyAgICBtTm9kZSA9IDA7CiAgICAgc2V0U3RhdGUoREVBRCk7CiAKICAgICBjbGVhckNvZGVjU3BlY2lmaWNEYXRhKCk7CkBAIC0xNjI0LDE1ICsxNzA5LDE1IEBACiAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKLSAgICAgICAgICAgIGlmICghKG1PTVhMaXZlc0xvY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUXVpcmtzICYga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgZG9lcyBub3QgZmlsbCBpbiB0aGUgYnVmZmVyIHB0ciBhdCB0aGlzIHRpbWUsCi0gICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBkZWZlciBjcmVhdGluZyB0aGUgTWVkaWFCdWZmZXIgdW50aWwgcmVjZWl2aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IEZJTExfQlVGRkVSX0RPTkUgbm90aWZpY2F0aW9uIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoaW5mby5tRGF0YSwgaW5mby5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW5mby5tTWVkaWFCdWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFpbCBkZWZlcnJlZCBNZWRpYUJ1ZmZlciBjcmVhdGlvbiB1bnRpbCBGSUxMX0JVRkZFUl9ET05FOworICAgICAgICAgICAgLy8gdGhpcyBsZWdhY3kgbW9kZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobU9NWExpdmVzTG9jYWxseQorICAgICAgICAgICAgICAgICAgICAmJiAobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cykKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGVCdWZmZXJzT25Qb3J0IGNhbm5vdCBkZWZlciBidWZmZXIgYWxsb2NhdGlvbiIpOworCisgICAgICAgICAgICBpbmZvLm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihpbmZvLm1EYXRhLCBpbmZvLm1TaXplKTsKKyAgICAgICAgICAgIGluZm8ubU1lZGlhQnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICAgICAgfQogCiAgICAgICAgIG1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLnB1c2goaW5mbyk7CkBAIC0xODAzLDIxICsxODg4LDQyIEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KKyAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgc3VyZmFjZSBpcyBjb250cm9sbGVkIGJ5IGFwcCAobmF0aXZlIHdpbmRvdworICAgIC8vIHJldHVybnMgdGhlIG51bWJlciBmb3IgdGhlIGNhc2Ugd2hlbiBzdXJmYWNlIGlzIG5vdCBjb250cm9sbGVkIGJ5IGFwcCkKKyAgICAvLyBGSVhNRTI6IFRoaXMgbWVhbnMgdGhhdCBtaW5VbmRlcWV1ZXVkQnVmcyBjYW4gYmUgMSBsYXJnZXIgdGhhbiByZXBvcnRlZAorICAgIC8vIEZvciBub3csIHRyeSB0byBhbGxvY2F0ZSAxIG1vcmUgYnVmZmVyLCBidXQgZG9uJ3QgZmFpbCBpZiB1bnN1Y2Nlc3NmdWwKIAotICAgIC8vIFhYWDogSXMgdGhpcyB0aGUgcmlnaHQgbG9naWMgdG8gdXNlPyAgSXQncyBub3QgY2xlYXIgdG8gbWUgd2hhdCB0aGUgT01YCi0gICAgLy8gYnVmZmVyIGNvdW50cyByZWZlciB0byAtIGhvdyBkbyB0aGV5IGFjY291bnQgZm9yIHRoZSByZW5kZXJlciBob2xkaW5nIG9uCi0gICAgLy8gdG8gYnVmZmVycz8KLSAgICBpZiAoZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA8IGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcykgewotICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0gZGVmLm5CdWZmZXJDb3VudE1pbiArIG1pblVuZGVxdWV1ZWRCdWZzOworICAgIC8vIFVzZSBjb25zZXJ2YXRpdmUgYWxsb2NhdGlvbiB3aGlsZSBhbHNvIHRyeWluZyB0byByZWR1Y2Ugc3RhcnZhdGlvbgorICAgIC8vCisgICAgLy8gMS4gYWxsb2NhdGUgYXQgbGVhc3QgbkJ1ZmZlckNvdW50TWluICsgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgLSB0aGF0IGlzIHRoZQorICAgIC8vICAgIG1pbmltdW0gbmVlZGVkIGZvciB0aGUgY29uc3VtZXIgdG8gYmUgYWJsZSB0byB3b3JrCisgICAgLy8gMi4gdHJ5IHRvIGFsbG9jYXRlIHR3byAoMikgYWRkaXRpb25hbCBidWZmZXJzIHRvIHJlZHVjZSBzdGFydmF0aW9uIGZyb20KKyAgICAvLyAgICB0aGUgY29uc3VtZXIKKyAgICAvLyAgICBwbHVzIGFuIGV4dHJhIGJ1ZmZlciB0byBhY2NvdW50IGZvciBpbmNvcnJlY3QgbWluVW5kZXF1ZXVlZEJ1ZnMKKyAgICBDT0RFQ19MT0dJKCJPTVgtYnVmZmVyczogbWluPSV1IGFjdHVhbD0ldSB1bmRlcT0lZCsxIiwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4sIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIG1pblVuZGVxdWV1ZWRCdWZzKTsKKworICAgIGZvciAoT01YX1UzMiBleHRyYUJ1ZmZlcnMgPSAyICsgMTsgLyogY29uZGl0aW9uIGluc2lkZSBsb29wICovOyBleHRyYUJ1ZmZlcnMtLSkgeworICAgICAgICBPTVhfVTMyIG5ld0J1ZmZlckNvdW50ID0KKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gKyBtaW5VbmRlcXVldWVkQnVmcyArIGV4dHJhQnVmZmVyczsKICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IG5ld0J1ZmZlckNvdW50OwogICAgICAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQ09ERUNfTE9HRSgic2V0dGluZyBuQnVmZmVyQ291bnRBY3R1YWwgdG8gJWx1IGZhaWxlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICBuZXdCdWZmZXJDb3VudCwgZXJyKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBtaW5VbmRlcXVldWVkQnVmcyArPSBleHRyYUJ1ZmZlcnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIENPREVDX0xPR1coInNldHRpbmcgbkJ1ZmZlckNvdW50QWN0dWFsIHRvICV1IGZhaWxlZDogJWQiLAorICAgICAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50LCBlcnIpOworICAgICAgICAvKiBleGl0IGNvbmRpdGlvbiAqLworICAgICAgICBpZiAoZXh0cmFCdWZmZXJzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CisgICAgQ09ERUNfTE9HSSgiT01YLWJ1ZmZlcnM6IG1pbj0ldSBhY3R1YWw9JXUgdW5kZXE9JWQrMSIsCisgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50TWluLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBtaW5VbmRlcXVldWVkQnVmcyk7CiAKICAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKQEAgLTE4MjcsNyArMTkzMyw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgQ09ERUNfTE9HVigiYWxsb2NhdGluZyAlbHUgYnVmZmVycyBmcm9tIGEgbmF0aXZlIHdpbmRvdyBvZiBzaXplICVsdSBvbiAiCisgICAgQ09ERUNfTE9HVigiYWxsb2NhdGluZyAldSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJXUgb24gIgogICAgICAgICAgICAgIm91dHB1dCBwb3J0IiwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplKTsKIAogICAgIC8vIERlcXVldWUgYnVmZmVycyBhbmQgc2VuZCB0aGVtIHRvIE9NWApAQCAtMTg2MCw3ICsxOTY2LDcgQEAKIAogICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKS5tQnVmZmVyID0gYnVmZmVySWQ7CiAKLSAgICAgICAgQ09ERUNfTE9HVigicmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICVwIChwb2ludGVyID0gJXApIiwKKyAgICAgICAgQ09ERUNfTE9HVigicmVnaXN0ZXJlZCBncmFwaGljIGJ1ZmZlciB3aXRoIElEICV1IChwb2ludGVyID0gJXApIiwKICAgICAgICAgICAgICAgICBidWZmZXJJZCwgZ3JhcGhpY0J1ZmZlci5nZXQoKSk7CiAgICAgfQogCkBAIC0xODg3LDcgKzE5OTMsNyBAQAogCiBzdGF0dXNfdCBPTVhDb2RlYzo6Y2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coQnVmZmVySW5mbyAqaW5mbykgewogICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClPV05FRF9CWV9VUyk7Ci0gICAgQ09ERUNfTE9HVigiQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICVwIiwgaW5mby0+bUJ1ZmZlcik7CisgICAgQ09ERUNfTE9HVigiQ2FsbGluZyBjYW5jZWxCdWZmZXIgb24gYnVmZmVyICV1IiwgaW5mby0+bUJ1ZmZlcik7CiAgICAgaW50IGVyciA9IG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bU1lZGlhQnVmZmVyLT5ncmFwaGljQnVmZmVyKCkuZ2V0KCksIC0xKTsKICAgICBpZiAoZXJyICE9IDApIHsKQEAgLTIxMjUsNyArMjIzMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXIgPSBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXI7CiAKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkVNUFRZX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXApIiwgYnVmZmVyKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkVNUFRZX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXUpIiwgYnVmZmVyKTsKIAogICAgICAgICAgICAgVmVjdG9yPEJ1ZmZlckluZm8+ICpidWZmZXJzID0gJm1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdOwogICAgICAgICAgICAgc2l6ZV90IGkgPSAwOwpAQCAtMjEzNSw3ICsyMjQxLDcgQEAKIAogICAgICAgICAgICAgQ0hFQ0soaSA8IGJ1ZmZlcnMtPnNpemUoKSk7CiAgICAgICAgICAgICBpZiAoKCpidWZmZXJzKVtpXS5tU3RhdHVzICE9IE9XTkVEX0JZX0NPTVBPTkVOVCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBhbHJlYWR5IG93biBpbnB1dCBidWZmZXIgJXAsIHlldCByZWNlaXZlZCAiCisgICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIGlucHV0IGJ1ZmZlciAldSwgeWV0IHJlY2VpdmVkICIKICAgICAgICAgICAgICAgICAgICAgICJhbiBFTVBUWV9CVUZGRVJfRE9ORS4iLCBidWZmZXIpOwogICAgICAgICAgICAgfQogCkBAIC0yMTQ5LDcgKzIyNTUsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSA9PSBESVNBQkxJTkcpIHsKLSAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAlcCIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiUG9ydCBpcyBkaXNhYmxlZCwgZnJlZWluZyBidWZmZXIgJXUiLCBidWZmZXIpOwogCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZnJlZUJ1ZmZlcihrUG9ydEluZGV4SW5wdXQsIGkpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTIxNzEsNyArMjI3Nyw3IEBACiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVyID0gbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyOwogICAgICAgICAgICAgT01YX1UzMiBmbGFncyA9IG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzOwogCi0gICAgICAgICAgICBDT0RFQ19MT0dWKCJGSUxMX0JVRkZFUl9ET05FKGJ1ZmZlcjogJXAsIHNpemU6ICVsZCwgZmxhZ3M6IDB4JTA4bHgsIHRpbWVzdGFtcDogJWxsZCB1cyAoJS4yZiBzZWNzKSkiLAorICAgICAgICAgICAgQ09ERUNfTE9HVigiRklMTF9CVUZGRVJfRE9ORShidWZmZXI6ICV1LCBzaXplOiAldSwgZmxhZ3M6IDB4JTA4eCwgdGltZXN0YW1wOiAlbGxkIHVzICglLjJmIHNlY3MpKSIsCiAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoLAogICAgICAgICAgICAgICAgICBmbGFncywKQEAgLTIxODgsMTQgKzIyOTQsMTQgQEAKICAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmYnVmZmVycy0+ZWRpdEl0ZW1BdChpKTsKIAogICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgIT0gT1dORURfQllfQ09NUE9ORU5UKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIG91dHB1dCBidWZmZXIgJXAsIHlldCByZWNlaXZlZCAiCisgICAgICAgICAgICAgICAgQUxPR1coIldlIGFscmVhZHkgb3duIG91dHB1dCBidWZmZXIgJXUsIHlldCByZWNlaXZlZCAiCiAgICAgICAgICAgICAgICAgICAgICAiYSBGSUxMX0JVRkZFUl9ET05FLiIsIGJ1ZmZlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBPV05FRF9CWV9VUzsKIAogICAgICAgICAgICAgaWYgKG1Qb3J0U3RhdHVzW2tQb3J0SW5kZXhPdXRwdXRdID09IERJU0FCTElORykgewotICAgICAgICAgICAgICAgIENPREVDX0xPR1YoIlBvcnQgaXMgZGlzYWJsZWQsIGZyZWVpbmcgYnVmZmVyICVwIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJQb3J0IGlzIGRpc2FibGVkLCBmcmVlaW5nIGJ1ZmZlciAldSIsIGJ1ZmZlcik7CiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGkpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKQEAgLTIyMTAsMjIgKzIzMTYsNiBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSAhPSBTSFVUVElOR19ET1dOKSB7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSwgKGludClFTkFCTEVEKTsKIAotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tTWVkaWFCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtT01YTGl2ZXNMb2NhbGx5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVF1aXJrcyAmIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0cyk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1RdWlya3MgJiBrRGVmZXJzT3V0cHV0QnVmZmVyQWxsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHFjb20gdmlkZW8gZGVjb2RlcnMgb24gTmV4dXMgZG9uJ3QgYWN0dWFsbHkgYWxsb2NhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBtZW1vcnkgb24gYSBjYWxsIHRvIE9NWF9BbGxvY2F0ZUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgInBCdWZmZXIiIG1lbWJlciBvZiB0aGUgT01YX0JVRkZFUkhFQURFUlRZUEUKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIGlzIG9ubHkgZmlsbGVkIGluIGxhdGVyLgotCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5kYXRhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1NZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IGluZm8tPm1NZWRpYUJ1ZmZlcjsKICAgICAgICAgICAgICAgICBib29sIGlzR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlci0+Z3JhcGhpY0J1ZmZlcigpICE9IE5VTEw7CiAKQEAgLTIyNjAsMTEgKzIzNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVBsYXRmb3JtUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0UG9pbnRlcigKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlCdWZmZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CiAKQEAgLTI0MDYsNyArMjQ5Miw3IEBACiAKICAgICAgICAgY2FzZSBPTVhfRXZlbnRFcnJvcjoKICAgICAgICAgewotICAgICAgICAgICAgQ09ERUNfTE9HRSgiRVJST1IoMHglMDhseCwgJWxkKSIsIGRhdGExLCBkYXRhMik7CisgICAgICAgICAgICBDT0RFQ19MT0dFKCJPTVhfRXZlbnRFcnJvcigweCUwOHgsICV1KSIsIGRhdGExLCBkYXRhMik7CiAKICAgICAgICAgICAgIHNldFN0YXRlKEVSUk9SKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjQxNCwxNiArMjUwMCwxMCBAQAogCiAgICAgICAgIGNhc2UgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZDoKICAgICAgICAgewotICAgICAgICAgICAgQ09ERUNfTE9HVigiT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZChwb3J0PSVsZCwgZGF0YTI9MHglMDhseCkiLAorICAgICAgICAgICAgQ09ERUNfTE9HVigiT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZChwb3J0PSV1LCBkYXRhMj0weCUwOHgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTEsIGRhdGEyKTsKIAogICAgICAgICAgICAgaWYgKGRhdGEyID09IDAgfHwgZGF0YTIgPT0gT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciBtRmlsbGVkQnVmZmVycyBpcyBlbXB0eSBvciBub3QKLSAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkIGlzIG5vdCBtZWFudCBmb3IgcmVhbGxvY2F0aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIG91dHB1dCBidWZmZXJzLgotICAgICAgICAgICAgICAgIGlmIChkYXRhMSA9PSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1GaWxsZWRCdWZmZXJzLmVtcHR5KCkpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvblBvcnRTZXR0aW5nc0NoYW5nZWQoZGF0YTEpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhMSA9PSBrUG9ydEluZGV4T3V0cHV0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YTIgPT0gT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCB8fApAQCAtMjQ1NCw3ICsyNTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzY2FsZSBpcyBpbiAxNi4xNiBmb3JtYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSAxLjAgPSAweDAxMDAwMC4gV2hlbiB0aGVyZSBpcyBubwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjaGFuZ2UgdGhlIGRpc3BsYXksIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiR2V0IE9NWF9JbmRleENvbmZpZ1NjYWxlOiAweCVseC8weCVseCIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiR2V0IE9NWF9JbmRleENvbmZpZ1NjYWxlOiAweCV4LzB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS54V2lkdGgsIHNjYWxlLnhIZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGUueFdpZHRoICE9IDB4MDEwMDAwKSB7CkBAIC0yNDg4LDcgKzI1NjgsNyBAQAogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkVWRU5UKCVkLCAlbGQsICVsZCkiLCBldmVudCwgZGF0YTEsIGRhdGEyKTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkVWRU5UKCVkLCAldSwgJXUpIiwgZXZlbnQsIGRhdGExLCBkYXRhMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTI1MDUsNyArMjU4NSw3IEBACiAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZToKICAgICAgICAgewogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBkYXRhOwotICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9ESVNBQkxFRCglbGQpIiwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIlBPUlRfRElTQUJMRUQoJXUpIiwgcG9ydEluZGV4KTsKIAogICAgICAgICAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gUkVDT05GSUdVUklORyk7CiAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIChpbnQpRElTQUJMSU5HKTsKQEAgLTI1MjksNyArMjYwOSw3IEBACiAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBlbmFibGVQb3J0QXN5bmMocG9ydEluZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIENPREVDX0xPR0UoImVuYWJsZVBvcnRBc3luYyglbGQpIGZhaWxlZCAoZXJyID0gJWQpIiwgcG9ydEluZGV4LCBlcnIpOworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dFKCJlbmFibGVQb3J0QXN5bmMoJXUpIGZhaWxlZCAoZXJyID0gJWQpIiwgcG9ydEluZGV4LCBlcnIpOwogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShFUlJPUik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWxsb2NhdGVCdWZmZXJzT25Qb3J0KHBvcnRJbmRleCk7CkBAIC0yNTUwLDcgKzI2MzAsNyBAQAogICAgICAgICBjYXNlIE9NWF9Db21tYW5kUG9ydEVuYWJsZToKICAgICAgICAgewogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBkYXRhOwotICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9FTkFCTEVEKCVsZCkiLCBwb3J0SW5kZXgpOworICAgICAgICAgICAgQ09ERUNfTE9HVigiUE9SVF9FTkFCTEVEKCV1KSIsIHBvcnRJbmRleCk7CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBFWEVDVVRJTkcgfHwgbVN0YXRlID09IFJFQ09ORklHVVJJTkcpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KUVOQUJMSU5HKTsKQEAgLTI1NzEsNyArMjY1MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4ID0gZGF0YTsKIAotICAgICAgICAgICAgQ09ERUNfTE9HVigiRkxVU0hfRE9ORSglbGQpIiwgcG9ydEluZGV4KTsKKyAgICAgICAgICAgIENPREVDX0xPR1YoIkZMVVNIX0RPTkUoJXUpIiwgcG9ydEluZGV4KTsKIAogICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KVNIVVRUSU5HX0RPV04pOwogICAgICAgICAgICAgbVBvcnRTdGF0dXNbcG9ydEluZGV4XSA9IEVOQUJMRUQ7CkBAIC0yODE3LDcgKzI4OTcsNyBAQAogdm9pZCBPTVhDb2RlYzo6b25Qb3J0U2V0dGluZ3NDaGFuZ2VkKE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgQ09ERUNfTE9HVigiUE9SVF9TRVRUSU5HU19DSEFOR0VEKCVsZCkiLCBwb3J0SW5kZXgpOwogCi0gICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRVhFQ1VUSU5HKTsKKyAgICBDSEVDSyhtU3RhdGUgPT0gRVhFQ1VUSU5HIHx8IG1TdGF0ZSA9PSBFWEVDVVRJTkdfVE9fSURMRSk7CiAgICAgQ0hFQ0tfRVEocG9ydEluZGV4LCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKICAgICBDSEVDSyghbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRQZW5kaW5nKTsKIApAQCAtMjk5OSw3ICszMDc5LDggQEAKIAogICAgICAgICBzaXplX3Qgc2l6ZSA9IHNwZWNpZmljLT5tU2l6ZTsKIAotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtTUlNRSkKKyAgICAgICAgaWYgKCghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1NSU1FKSB8fAorICAgICAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1NSU1FKSkKICAgICAgICAgICAgICAgICAmJiAhKG1RdWlya3MgJiBrV2FudHNOQUxGcmFnbWVudHMpKSB7CiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrTkFMU3RhcnRDb2RlWzRdID0KICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAxIH07CkBAIC0zODg5LDcgKzM5NzAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBDT0RFQ19MT0dWKCJzZWVraW5nIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2KTsKKyAgICAgICAgQ09ERUNfTE9HVigic2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsIHNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgIG1TaWduYWxsZWRFT1MgPSBmYWxzZTsKIApAQCAtNDEzNCw2ICs0MjE1LDcgQEAKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdNUDMiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1NCQyIsCiAgICAgICAgICJPTVhfQVVESU9fQ29kaW5nVk9SQklTIiwKKyAgICAgICAgIk9NWF9BVURJT19Db2RpbmdPUFVTIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdXTUEiLAogICAgICAgICAiT01YX0FVRElPX0NvZGluZ1JBIiwKICAgICAgICAgIk9NWF9BVURJT19Db2RpbmdNSURJIiwKQEAgLTQyMjgsOSArNDMxMCw5IEBACiAgICAgQ0hFQ0soKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgJiYgZGVmLmVEaXIgPT0gT01YX0RpcklucHV0KQogICAgICAgICAgIHx8IChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBkZWYuZURpciA9PSBPTVhfRGlyT3V0cHV0KSk7CiAKLSAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50QWN0dWFsID0gJWxkXG4iLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKLSAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50TWluID0gJWxkXG4iLCBkZWYubkJ1ZmZlckNvdW50TWluKTsKLSAgICBwcmludGYoIiAgbkJ1ZmZlclNpemUgPSAlbGRcbiIsIGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgcHJpbnRmKCIgIG5CdWZmZXJDb3VudEFjdHVhbCA9ICUiIFBSSXUzMiAiXG4iLCBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKyAgICBwcmludGYoIiAgbkJ1ZmZlckNvdW50TWluID0gJSIgUFJJdTMyICJcbiIsIGRlZi5uQnVmZmVyQ291bnRNaW4pOworICAgIHByaW50ZigiICBuQnVmZmVyU2l6ZSA9ICUiIFBSSXUzMiAiXG4iLCBkZWYubkJ1ZmZlclNpemUpOwogCiAgICAgc3dpdGNoIChkZWYuZURvbWFpbikgewogICAgICAgICBjYXNlIE9NWF9Qb3J0RG9tYWluSW1hZ2U6CkBAIC00MjM5LDkgKzQzMjEsOSBAQAogCiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBwcmludGYoIiAgLy8gSW1hZ2VcbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJWxkXG4iLCBpbWFnZURlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICVsZFxuIiwgaW1hZ2VEZWYtPm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICVsZFxuIiwgaW1hZ2VEZWYtPm5TdHJpZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJSIgUFJJdTMyICJcbiIsIGltYWdlRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJSIgUFJJdTMyICJcbiIsIGltYWdlRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlIiBQUkl1MzIgIlxuIiwgaW1hZ2VEZWYtPm5TdHJpZGUpOwogCiAgICAgICAgICAgICBwcmludGYoIiAgZUNvbXByZXNzaW9uRm9ybWF0ID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb21wcmVzc2lvbkZvcm1hdFN0cmluZyhpbWFnZURlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KSk7CkBAIC00MjU4LDkgKzQzNDAsOSBAQAogCiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICBwcmludGYoIiAgLy8gVmlkZW9cbiIpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJWxkXG4iLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZUhlaWdodCA9ICVsZFxuIiwgdmlkZW9EZWYtPm5GcmFtZUhlaWdodCk7Ci0gICAgICAgICAgICBwcmludGYoIiAgblN0cmlkZSA9ICVsZFxuIiwgdmlkZW9EZWYtPm5TdHJpZGUpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5GcmFtZVdpZHRoID0gJSIgUFJJdTMyICJcbiIsIHZpZGVvRGVmLT5uRnJhbWVXaWR0aCk7CisgICAgICAgICAgICBwcmludGYoIiAgbkZyYW1lSGVpZ2h0ID0gJSIgUFJJdTMyICJcbiIsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgcHJpbnRmKCIgIG5TdHJpZGUgPSAlIiBQUkl1MzIgIlxuIiwgdmlkZW9EZWYtPm5TdHJpZGUpOwogCiAgICAgICAgICAgICBwcmludGYoIiAgZUNvbXByZXNzaW9uRm9ybWF0ID0gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlkZW9Db21wcmVzc2lvbkZvcm1hdFN0cmluZyh2aWRlb0RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KSk7CkBAIC00Mjg5LDEwICs0MzcxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiICBuU2FtcGxpbmdSYXRlID0gJWxkXG4iLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5DaGFubmVscyA9ICVsZFxuIiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgIG5TYW1wbGluZ1JhdGUgPSAlIiBQUkl1MzIgIlxuIiwgcGFyYW1zLm5TYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlIiBQUkl1MzIgIlxuIiwgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGJJbnRlcmxlYXZlZCA9ICVkXG4iLCBwYXJhbXMuYkludGVybGVhdmVkKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgbkJpdFBlclNhbXBsZSA9ICVsZFxuIiwgcGFyYW1zLm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQml0UGVyU2FtcGxlID0gJSIgUFJJdTMyICJcbiIsIHBhcmFtcy5uQml0UGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgIHByaW50ZigiICBlTnVtRGF0YSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKQEAgLTQzMDgsNyArNDM5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwgJmFtciwgc2l6ZW9mKGFtcikpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlbGRcbiIsIGFtci5uQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHByaW50ZigiICBuQ2hhbm5lbHMgPSAlIiBQUkl1MzIgIlxuIiwgYW1yLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIGVBTVJCYW5kTW9kZSA9ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgYW1yQmFuZE1vZGVTdHJpbmcoYW1yLmVBTVJCYW5kTW9kZSkpOwogICAgICAgICAgICAgICAgIHByaW50ZigiICBlQU1SRnJhbWVGb3JtYXQgPSAlc1xuIiwKQEAgLTQ2NjMsNiArNDc0NSw4IEBACiAgICAgfQogCiAgICAgLy8gQ29sb3IgZm9ybWF0IHF1ZXJ5CisgICAgLy8gcmV0dXJuIGNvbG9ycyBpbiB0aGUgb3JkZXIgcmVwb3J0ZWQgYnkgdGhlIE9NWCBjb21wb25lbnQKKyAgICAvLyBwcmVmaXggImZsZXhpYmxlIiBzdGFuZGFyZCBvbmVzIHdpdGggdGhlIGZsZXhpYmxlIGVxdWl2YWxlbnQKICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgcG9ydEZvcm1hdDsKICAgICBJbml0T01YUGFyYW1zKCZwb3J0Rm9ybWF0KTsKICAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSAhaXNFbmNvZGVyID8gMSA6IDA7CkBAIC00NjczLDYgKzQ3NTcsMjEgQEAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBPTVhfVTMyIGZsZXhpYmxlRXF1aXZhbGVudDsKKyAgICAgICAgaWYgKEFDb2RlYzo6aXNGbGV4aWJsZUNvbG9yRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBvbXgsIG5vZGUsIHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0LCAmZmxleGlibGVFcXVpdmFsZW50KSkgeworICAgICAgICAgICAgYm9vbCBtYXJrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2Fwcy0+bUNvbG9yRm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjYXBzLT5tQ29sb3JGb3JtYXRzLml0ZW1BdChpKSA9PSBmbGV4aWJsZUVxdWl2YWxlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFya2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtYXJrZWQpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2goZmxleGlibGVFcXVpdmFsZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2gocG9ydEZvcm1hdC5lQ29sb3JGb3JtYXQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggZGE5NDU4Ny4uOTAwZTJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdCgpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTMyMiwyNSArMzIyLDI5IEBACiAgICAgfQogCiAgICAgc2l6ZV90IGxlZnQgPSAwOwotICAgIHNpemVfdCByaWdodCA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgLyAyICsgcmlnaHQgLyAyICsgKGxlZnQgJiByaWdodCAmIDEpOworICAgIHNpemVfdCByaWdodF9wbHVzX29uZSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CiAKICAgICAgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQoY2VudGVyKTsKIAogICAgICAgICBpZiAodGltZVVzIDwgZW50cnkubVRpbWVVcykgewotICAgICAgICAgICAgcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKICAgICAgICAgfSBlbHNlIGlmICh0aW1lVXMgPiBlbnRyeS5tVGltZVVzKSB7CiAgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlZnQgPSByaWdodCA9IGNlbnRlcjsKKyAgICAgICAgICAgIGxlZnQgPSBjZW50ZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChsZWZ0ID09IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpKSB7CisgICAgICAgIC0tbGVmdDsKKyAgICB9CisKICAgICBjb25zdCBUT0NFbnRyeSAmZW50cnkgPSBtVGFibGVPZkNvbnRlbnRzLml0ZW1BdChsZWZ0KTsKIAotICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICVkIC8gJWQgYXQgb2Zmc2V0ICVsbGQiLAorICAgIEFMT0dWKCJzZWVraW5nIHRvIGVudHJ5ICV6dSAvICV6dSBhdCBvZmZzZXQgJWxsZCIsCiAgICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgZW50cnkubVBhZ2VPZmZzZXQpOwogCiAgICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7CkBAIC0zODMsNyArMzg3LDcgQEAKICAgICBzc2l6ZV90IG47CiAgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCiAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJWxkIGJ5dGVzIiwKKyAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgMHglMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgb2Zmc2V0LCBuKTsKIAogICAgICAgICBpZiAobiA8IDApIHsKQEAgLTUwNyw3ICs1MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IDB4JTAxNmxseCwgZ290ICVsZCBieXRlcyIsCisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgZGF0YU9mZnNldCwgbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQpAQCAtNTQ4LDcgKzU1Miw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICVsZCIsIG4pOworICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCiAgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KQEAgLTU5Miw3ICs1OTYsNyBAQAogICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDEpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CkBAIC02MDMsNyArNjA3LDcgQEAKICAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAzKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOwpAQCAtNjE0LDcgKzYxOCw3IEBACiAgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgNSk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKQEAgLTg5NSw3ICs4OTksNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlZCB0cmFpbGluZyBieXRlcyIsCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAogICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CiAKICAgICBmaWxlTWV0YS0+c2V0RGF0YSgKQEAgLTkzNiw3ICs5NDAsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gMSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggZTg1Mjg5ZS4uYzVmMzU5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTM4LDcgKzEzOCw4IEBACiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWUoc2FtcGxlSW5kZXgsICZtQ3VycmVudFNhbXBsZVRpbWUpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVUaW1lLCAmbUN1cnJlbnRTYW1wbGVEdXJhdGlvbikpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJmaW5kU2FtcGxlVGltZSByZXR1cm4gZXJyb3IiKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0yOTAsOCArMjkxLDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZSgKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lKSB7CitzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKICAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zMTQsNiArMzE1LDggQEAKIAogICAgICp0aW1lICs9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKIAorICAgICpkdXJhdGlvbiA9IG1UVFNEdXJhdGlvbjsKKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDJkZTA3NzMuLjM0NzFkZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKQEAgLTE0LDkgKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERJTlRfTUFDUk9TCi0jZGVmaW5lIF9fU1RESU5UX0xJTUlUUwotCiAjZGVmaW5lIExPR19UQUcgIlNhbXBsZVRhYmxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNjcwLDcgKzY2Nyw4IEBACiB9CiAKIHN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU2FtcGxlQXRUaW1lKAotICAgICAgICB1aW50MzJfdCByZXFfdGltZSwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7CiAKICAgICBpZiAobVNhbXBsZVRpbWVFbnRyaWVzID09IE5VTEwpIHsKQEAgLTY3OCw3OSArNjc2LDY3IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgbGVmdCA9IDA7Ci0gICAgdWludDMyX3QgcmlnaHQgPSBtTnVtU2FtcGxlU2l6ZXM7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSAobGVmdCArIHJpZ2h0KSAvIDI7Ci0gICAgICAgIHVpbnQzMl90IGNlbnRlclRpbWUgPSBtU2FtcGxlVGltZUVudHJpZXNbY2VudGVyXS5tQ29tcG9zaXRpb25UaW1lOworICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVNhbXBsZVNpemVzOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKKyAgICAgICAgdWludDY0X3QgY2VudGVyVGltZSA9CisgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGNlbnRlciwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pOwogCiAgICAgICAgIGlmIChyZXFfdGltZSA8IGNlbnRlclRpbWUpIHsKLSAgICAgICAgICAgIHJpZ2h0ID0gY2VudGVyOworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CiAgICAgICAgIH0gZWxzZSBpZiAocmVxX3RpbWUgPiBjZW50ZXJUaW1lKSB7CiAgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlZnQgPSBjZW50ZXI7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2VudGVyXS5tU2FtcGxlSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobGVmdCA9PSBtTnVtU2FtcGxlU2l6ZXMpIHsKLSAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICAtLWxlZnQ7Ci0gICAgfQotCiAgICAgdWludDMyX3QgY2xvc2VzdEluZGV4ID0gbGVmdDsKIAorICAgIGlmIChjbG9zZXN0SW5kZXggPT0gbU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdCZWZvcmU7CisgICAgfSBlbHNlIGlmIChjbG9zZXN0SW5kZXggPT0gMCkgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdCZWZvcmUpIHsKKyAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcworICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCByZXR1cm4gZmlyc3Qgc2FtcGxlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQWZ0ZXI7CisgICAgfQorCiAgICAgc3dpdGNoIChmbGFncykgewogICAgICAgICBjYXNlIGtGbGFnQmVmb3JlOgogICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoY2xvc2VzdEluZGV4ID4gMAotICAgICAgICAgICAgICAgICAgICAmJiBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tQ29tcG9zaXRpb25UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiByZXFfdGltZSkgewotICAgICAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKICAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKGNsb3Nlc3RJbmRleCArIDEgPCBtTnVtU2FtcGxlU2l6ZXMKLSAgICAgICAgICAgICAgICAgICAgJiYgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgcmVxX3RpbWUpIHsKLSAgICAgICAgICAgICAgICArK2Nsb3Nlc3RJbmRleDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKLQotICAgICAgICAgICAgaWYgKGNsb3Nlc3RJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBsZWZ0IG5laWdoYm91ciBhbmQgcGljayBjbG9zZXN0LgotICAgICAgICAgICAgICAgIHVpbnQzMl90IGFic2RpZmYxID0KLSAgICAgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzW2Nsb3Nlc3RJbmRleF0ubUNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdGltZSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNkaWZmMiA9Ci0gICAgICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXggLSAxXS5tQ29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChhYnNkaWZmMSA+IGFic2RpZmYyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RJbmRleCA9IGNsb3Nlc3RJbmRleCAtIDE7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcGljayBjbG9zZXN0IGJhc2VkIG9uIHRpbWVzdGFtcC4gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKKyAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXgsIHNjYWxlX251bSwgc2NhbGVfZGVuKSwgcmVxX3RpbWUpID4KKyAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgICAgICAgICAgcmVxX3RpbWUsIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4IC0gMSwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pKSkgeworICAgICAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tU2FtcGxlSW5kZXg7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc3MiwxMDkgKzc1OCw4NSBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0ID0gbU51bVN5bmNTYW1wbGVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHsKLSAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodCAtIGxlZnQpIC8gMjsKKyAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TeW5jU2FtcGxlczsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CiAgICAgICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbY2VudGVyXTsKIAogICAgICAgICBpZiAoc3RhcnRfc2FtcGxlX2luZGV4IDwgeCkgewotICAgICAgICAgICAgcmlnaHQgPSBjZW50ZXI7CisgICAgICAgICAgICByaWdodF9wbHVzX29uZSA9IGNlbnRlcjsKICAgICAgICAgfSBlbHNlIGlmIChzdGFydF9zYW1wbGVfaW5kZXggPiB4KSB7CiAgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlZnQgPSBjZW50ZXI7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSB4OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKGxlZnQgPT0gbU51bVN5bmNTYW1wbGVzKSB7CiAgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7CiAgICAgICAgICAgICBBTE9HRSgidHJpZWQgdG8gZmluZCBhIHN5bmMgZnJhbWUgYWZ0ZXIgdGhlIGxhc3Qgb25lOiAlZCIsIGxlZnQpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfQotICAgICAgICBsZWZ0ID0gbGVmdCAtIDE7CisgICAgICAgIGZsYWdzID0ga0ZsYWdCZWZvcmU7CisgICAgfQorICAgIGVsc2UgaWYgKGxlZnQgPT0gMCkgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdCZWZvcmUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmllZCB0byBmaW5kIGEgc3luYyBmcmFtZSBiZWZvcmUgdGhlIGZpcnN0IG9uZTogJWQiLCBsZWZ0KTsKKworICAgICAgICAgICAgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIHJldHVybiBvdXQgb2YgcmFuZ2UsIGJ1dCB0aGF0IGlzCisgICAgICAgICAgICAvLyB0cmVhdGVkIGFzIGVuZC1vZi1zdHJlYW0uICBpbnN0ZWFkIHNlZWsgdG8gZmlyc3Qgc3luYworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOwogICAgIH0KIAotICAgIC8vIE5vdyBzc2lbbGVmdF0gaXMgdGhlIHN5bmMgc2FtcGxlIGluZGV4IGp1c3QgYmVmb3JlIChvciBhdCkKLSAgICAvLyBzdGFydF9zYW1wbGVfaW5kZXguCi0gICAgLy8gQWxzbyBzdGFydF9zYW1wbGVfaW5kZXggPCBzc2lbbGVmdCArIDFdLCBpZiBsZWZ0ICsgMSA8IG1OdW1TeW5jU2FtcGxlcy4KLQotICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbbGVmdF07Ci0KLSAgICBpZiAobGVmdCArIDEgPCBtTnVtU3luY1NhbXBsZXMpIHsKLSAgICAgICAgdWludDMyX3QgeSA9IG1TeW5jU2FtcGxlc1tsZWZ0ICsgMV07Ci0KLSAgICAgICAgLy8gb3VyIHNhbXBsZSBsaWVzIGJldHdlZW4gc3luYyBzYW1wbGVzIHggYW5kIHkuCi0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oeCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgeF90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oeSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCB5X3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLQotICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UoeF90aW1lLCBzYW1wbGVfdGltZSkKLSAgICAgICAgICAgICAgICA+IGFic19kaWZmZXJlbmNlKHlfdGltZSwgc2FtcGxlX3RpbWUpKSB7Ci0gICAgICAgICAgICAvLyBQaWNrIHRoZSBzeW5jIHNhbXBsZSBjbG9zZXN0ICh0aW1ld2lzZSkgdG8gdGhlIHN0YXJ0LXNhbXBsZS4KLSAgICAgICAgICAgIHggPSB5OwotICAgICAgICAgICAgKytsZWZ0OwotICAgICAgICB9Ci0gICAgfQotCisgICAgLy8gTm93IHNzaVtsZWZ0IC0gMV0gPCg9KSBzdGFydF9zYW1wbGVfaW5kZXggPD0gc3NpW2xlZnRdCiAgICAgc3dpdGNoIChmbGFncykgewogICAgICAgICBjYXNlIGtGbGFnQmVmb3JlOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeCA+IHN0YXJ0X3NhbXBsZV9pbmRleCkgewotICAgICAgICAgICAgICAgIENIRUNLKGxlZnQgPiAwKTsKLQotICAgICAgICAgICAgICAgIHggPSBtU3luY1NhbXBsZXNbbGVmdCAtIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHggPiBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhYmxlIG9mIHN5bmMgc2FtcGxlIGluZGljZXMgd2FzIG5vdCBzb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVybHkuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1sZWZ0OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQogICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4IDwgc3RhcnRfc2FtcGxlX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxlZnQgKyAxID49IG1OdW1TeW5jU2FtcGxlcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHggPSBtU3luY1NhbXBsZXNbbGVmdCArIDFdOwotCi0gICAgICAgICAgICAgICAgaWYgKHggPCBzdGFydF9zYW1wbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhYmxlIG9mIHN5bmMgc2FtcGxlIGluZGljZXMgd2FzIG5vdCBzb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVybHkuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgcm91dGUgaXMgbm90IHVzZWQsIGJ1dCBpbXBsZW1lbnQgaXQgbm9uZXRoZWxlc3MKKyAgICAgICAgICAgIENIRUNLKGZsYWdzID09IGtGbGFnQ2xvc2VzdCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHN0YXJ0X3NhbXBsZV9pbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0XSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHVwcGVyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnQgLSAxXSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IGxvd2VyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgLy8gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKKyAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSh1cHBlcl90aW1lLCBzYW1wbGVfdGltZSkgPgorICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKHNhbXBsZV90aW1lLCBsb3dlcl90aW1lKSkgeworICAgICAgICAgICAgICAgIC0tbGVmdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCi0gICAgKnNhbXBsZV9pbmRleCA9IHg7Ci0KKyAgICAqc2FtcGxlX2luZGV4ID0gbVN5bmNTYW1wbGVzW2xlZnRdOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtOTMyLDcgKzg5NCw4IEBACiAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgc2l6ZV90ICpzaXplLAogICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAotICAgICAgICBib29sICppc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlLAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtOTc0LDYgKzkzNywxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgICpzYW1wbGVEdXJhdGlvbiA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlRHVyYXRpb24oKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKaW5kZXggNGQxNWQ3ZS4uMWRhMWU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgY3V0ID0gMDsKICAgICB9CiAKLSAgICBtRnJvbnRQYWRkaW5nID0gc2tpcDsKKyAgICBtRnJvbnRQYWRkaW5nID0gbVNraXAgPSBza2lwOwogICAgIG1CYWNrUGFkZGluZyA9IGN1dDsKICAgICBtV3JpdGVIZWFkID0gMDsKICAgICBtUmVhZEhlYWQgPSAwOwpAQCAtMTAxLDYgKzEwMSw3IEBACiAKIHZvaWQgU2tpcEN1dEJ1ZmZlcjo6Y2xlYXIoKSB7CiAgICAgbVdyaXRlSGVhZCA9IG1SZWFkSGVhZCA9IDA7CisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwOwogfQogCiB2b2lkIFNraXBDdXRCdWZmZXI6OndyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IGFmODE4NmMuLjQ0NDlkNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KIApAQCAtMTE3LDcgKzExOCw3IEBACiB9CiAKIE1lZGlhU2NhblJlc3VsdCBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6cHJvY2Vzc0ZpbGVJbnRlcm5hbCgKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbWltZVR5cGUsCisgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKiAvKiBtaW1lVHlwZSAqLywKICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKICAgICBjb25zdCBjaGFyICpleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7CiAKQEAgLTE0Nyw3ICsxNDgsNyBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIC8vIGNvdWxkbid0IG9wZW4gaXQgbG9jYWxseSwgbWF5YmUgdGhlIG1lZGlhIHNlcnZlciBjYW4/Ci0gICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UocGF0aCk7CisgICAgICAgIHN0YXR1cyA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UoTlVMTCAvKiBodHRwU2VydmljZSAqLywgcGF0aCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShmZCwgMCwgMHg3ZmZmZmZmZmZmZmZmZmZMKTsKICAgICAgICAgY2xvc2UoZmQpOwpAQCAtMjAyLDcgKzIwMyw3IEBACiAgICAgcmV0dXJuIE1FRElBX1NDQU5fUkVTVUxUX09LOwogfQogCi1jaGFyICpTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcjo6ZXh0cmFjdEFsYnVtQXJ0KGludCBmZCkgeworTWVkaWFBbGJ1bUFydCAqU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OmV4dHJhY3RBbGJ1bUFydChpbnQgZmQpIHsKICAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0ICVkIiwgZmQpOwogCiAgICAgb2ZmNjRfdCBzaXplID0gbHNlZWs2NChmZCwgMCwgU0VFS19FTkQpOwpAQCAtMjE0LDE1ICsyMTUsOSBAQAogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IG1SZXRyaWV2ZXIobmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIpOwogICAgIGlmIChtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKGZkLCAwLCBzaXplKSA9PSBPSykgewogICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtUmV0cmlldmVyLT5leHRyYWN0QWxidW1BcnQoKTsKLQogICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKICAgICAgICAgICAgIE1lZGlhQWxidW1BcnQgKmFydCA9IHN0YXRpY19jYXN0PE1lZGlhQWxidW1BcnQgKj4obWVtLT5wb2ludGVyKCkpOwotCi0gICAgICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2MoYXJ0LT5tU2l6ZSArIDQpOwotICAgICAgICAgICAgKihpbnQzMl90ICopZGF0YSA9IGFydC0+bVNpemU7Ci0gICAgICAgICAgICBtZW1jcHkoJmRhdGFbNF0sICZhcnRbMV0sIGFydC0+bVNpemUpOwotCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgICAgIHJldHVybiBhcnQtPmNsb25lKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggMTlhZjRmYi4uMTAxZmM4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTE2LDEwICsxNiwxNCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KQEAgLTI4LDYgKzMyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8Q2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUwLDcgKzU1LDkgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKIAogICAgIG1QYXJzZWRNZXRhRGF0YSA9IGZhbHNlOwpAQCAtNTgsNyArNjUsNyBAQAogICAgIGRlbGV0ZSBtQWxidW1BcnQ7CiAgICAgbUFsYnVtQXJ0ID0gTlVMTDsKIAotICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSwgaGVhZGVycyk7CisgICAgbVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVyaSwgaGVhZGVycyk7CiAKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciAnJXMnLiIsIHVyaSk7CkBAIC04Myw3ICs5MCw3IEBACiAgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CiAgICAgZmQgPSBkdXAoZmQpOwogCi0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglZCwgJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKICAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKICAgICBtTWV0YURhdGEuY2xlYXIoKTsKQEAgLTIzOCw3ICsyNDUsNyBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgICAgICAgICBBTE9HVigidGh1bWJOYWlsVGltZSA9ICVsbGQgdXMsIHRpbWVVcyA9ICVsbGQgdXMsIG1pbWUgPSAlcyIsCisgICAgICAgICAgICBBTE9HVigidGh1bWJOYWlsVGltZSA9ICUiIFBSSWQ2NCAiIHVzLCB0aW1lVXMgPSAlIiBQUklkNjQgIiB1cywgbWltZSA9ICVzIiwKICAgICAgICAgICAgICAgICAgdGh1bWJOYWlsVGltZSwgdGltZVVzLCBtaW1lKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMyMSw3ICszMjgsNyBAQAogVmlkZW9GcmFtZSAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCiAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKSB7CiAKLSAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICVsbGQgdXMgb3B0aW9uOiAlZCIsIHRpbWVVcywgb3B0aW9uKTsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQiLCB0aW1lVXMsIG9wdGlvbik7CiAKICAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJubyBleHRyYWN0b3IuIik7CkBAIC0zNzQsMTAgKzM4MSw3IEBACiAgICAgc2l6ZV90IGRhdGFTaXplOwogICAgIGlmIChmaWxlTWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZkYXRhU2l6ZSkKICAgICAgICAgICAgICYmIG1BbGJ1bUFydCA9PSBOVUxMKSB7Ci0gICAgICAgIG1BbGJ1bUFydCA9IG5ldyBNZWRpYUFsYnVtQXJ0OwotICAgICAgICBtQWxidW1BcnQtPm1TaXplID0gZGF0YVNpemU7Ci0gICAgICAgIG1BbGJ1bUFydC0+bURhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07Ci0gICAgICAgIG1lbWNweShtQWxidW1BcnQtPm1EYXRhLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIG1BbGJ1bUFydCA9IE1lZGlhQWxidW1BcnQ6OmZyb21EYXRhKGRhdGFTaXplLCBkYXRhKTsKICAgICB9CiAKICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9CkBAIC00MTAsNyArNDE0LDcgQEAKICAgICB9CiAKICAgICBpZiAobUFsYnVtQXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFBbGJ1bUFydCgqbUFsYnVtQXJ0KTsKKyAgICAgICAgcmV0dXJuIG1BbGJ1bUFydC0+Y2xvbmUoKTsKICAgICB9CiAKICAgICByZXR1cm4gTlVMTDsKQEAgLTQ0Nyw0OCArNDUxLDcxIEBACiAgICAgc3RydWN0IE1hcCB7CiAgICAgICAgIGludCBmcm9tOwogICAgICAgICBpbnQgdG87CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgeyBrS2V5TUlNRVR5cGUsIE1FVEFEQVRBX0tFWV9NSU1FVFlQRSB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCBNRVRBREFUQV9LRVlfQ0RfVFJBQ0tfTlVNQkVSIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsIE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiB9LAotICAgICAgICB7IGtLZXlBbGJ1bSwgTUVUQURBVEFfS0VZX0FMQlVNIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgTUVUQURBVEFfS0VZX0FSVElTVCB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgTUVUQURBVEFfS0VZX0FMQlVNQVJUSVNUIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgTUVUQURBVEFfS0VZX0FVVEhPUiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgTUVUQURBVEFfS0VZX0NPTVBPU0VSIH0sCi0gICAgICAgIHsga0tleURhdGUsIE1FVEFEQVRBX0tFWV9EQVRFIH0sCi0gICAgICAgIHsga0tleUdlbnJlLCBNRVRBREFUQV9LRVlfR0VOUkUgfSwKLSAgICAgICAgeyBrS2V5VGl0bGUsIE1FVEFEQVRBX0tFWV9USVRMRSB9LAotICAgICAgICB7IGtLZXlZZWFyLCBNRVRBREFUQV9LRVlfWUVBUiB9LAotICAgICAgICB7IGtLZXlXcml0ZXIsIE1FVEFEQVRBX0tFWV9XUklURVIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sIE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiB9LAotICAgICAgICB7IGtLZXlMb2NhdGlvbiwgTUVUQURBVEFfS0VZX0xPQ0FUSU9OIH0sCisgICAgICAgIHsga0tleU1JTUVUeXBlLCBNRVRBREFUQV9LRVlfTUlNRVRZUEUsIE5VTEwgfSwKKyAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgTUVUQURBVEFfS0VZX0NEX1RSQUNLX05VTUJFUiwgInRyYWNrbnVtYmVyIiB9LAorICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCBNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsICJkaXNjbnVtYmVyIiB9LAorICAgICAgICB7IGtLZXlBbGJ1bSwgTUVUQURBVEFfS0VZX0FMQlVNLCAiYWxidW0iIH0sCisgICAgICAgIHsga0tleUFydGlzdCwgTUVUQURBVEFfS0VZX0FSVElTVCwgImFydGlzdCIgfSwKKyAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsIE1FVEFEQVRBX0tFWV9BTEJVTUFSVElTVCwgImFsYnVtYXJ0aXN0IiB9LAorICAgICAgICB7IGtLZXlBdXRob3IsIE1FVEFEQVRBX0tFWV9BVVRIT1IsIE5VTEwgfSwKKyAgICAgICAgeyBrS2V5Q29tcG9zZXIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgImNvbXBvc2VyIiB9LAorICAgICAgICB7IGtLZXlEYXRlLCBNRVRBREFUQV9LRVlfREFURSwgTlVMTCB9LAorICAgICAgICB7IGtLZXlHZW5yZSwgTUVUQURBVEFfS0VZX0dFTlJFLCAiZ2VucmUiIH0sCisgICAgICAgIHsga0tleVRpdGxlLCBNRVRBREFUQV9LRVlfVElUTEUsICJ0aXRsZSIgfSwKKyAgICAgICAgeyBrS2V5WWVhciwgTUVUQURBVEFfS0VZX1lFQVIsICJ5ZWFyIiB9LAorICAgICAgICB7IGtLZXlXcml0ZXIsIE1FVEFEQVRBX0tFWV9XUklURVIsICJ3cml0ZXIiIH0sCisgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sICJjb21waWxhdGlvbiIgfSwKKyAgICAgICAgeyBrS2V5TG9jYXRpb24sIE1FVEFEQVRBX0tFWV9MT0NBVElPTiwgTlVMTCB9LAogICAgIH07CisKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCisgICAgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvciAqZGV0ZWN0b3IgPSBuZXcgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa01hcFtpXS5mcm9tLCAmdmFsdWUpKSB7Ci0gICAgICAgICAgICBtTWV0YURhdGEuYWRkKGtNYXBbaV0udG8sIFN0cmluZzgodmFsdWUpKTsKKyAgICAgICAgICAgIGlmIChrTWFwW2ldLm5hbWUpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgdG8gY2hhcnNldCBkZXRlY3RvcgorICAgICAgICAgICAgICAgIGRldGVjdG9yLT5hZGRUYWcoa01hcFtpXS5uYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5IGFkZCB0byBvdXRwdXQgbGlzdAorICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtpXS50bywgU3RyaW5nOCh2YWx1ZSkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgZGV0ZWN0b3ItPmRldGVjdEFuZENvbnZlcnQoKTsKKyAgICBpbnQgc2l6ZSA9IGRldGVjdG9yLT5zaXplKCk7CisgICAgaWYgKHNpemUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgIGRldGVjdG9yLT5nZXRUYWcoaSwgJm5hbWUsICZ2YWx1ZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtOdW1NYXBFbnRyaWVzOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5uYW1lICYmICFzdHJjbXAoa01hcFtqXS5uYW1lLCBuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKGtNYXBbal0udG8sIFN0cmluZzgodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIGRldGVjdG9yOworCiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICB1aW50MzJfdCB0eXBlOwogICAgIHNpemVfdCBkYXRhU2l6ZTsKICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFsYnVtQXJ0LCAmdHlwZSwgJmRhdGEsICZkYXRhU2l6ZSkKICAgICAgICAgICAgICYmIG1BbGJ1bUFydCA9PSBOVUxMKSB7Ci0gICAgICAgIG1BbGJ1bUFydCA9IG5ldyBNZWRpYUFsYnVtQXJ0OwotICAgICAgICBtQWxidW1BcnQtPm1TaXplID0gZGF0YVNpemU7Ci0gICAgICAgIG1BbGJ1bUFydC0+bURhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07Ci0gICAgICAgIG1lbWNweShtQWxidW1BcnQtPm1EYXRhLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIG1BbGJ1bUFydCA9IE1lZGlhQWxidW1BcnQ6OmZyb21EYXRhKGRhdGFTaXplLCBkYXRhKTsKICAgICB9CiAKICAgICBzaXplX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKIAogICAgIGNoYXIgdG1wWzMyXTsKLSAgICBzcHJpbnRmKHRtcCwgIiVkIiwgbnVtVHJhY2tzKTsKKyAgICBzcHJpbnRmKHRtcCwgIiV6dSIsIG51bVRyYWNrcyk7CiAKICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLCBTdHJpbmc4KHRtcCkpOwogCkBAIC01NDUsNyArNTcyLDcgQEAKICAgICB9CiAKICAgICAvLyBUaGUgZHVyYXRpb24gdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkdXJhdGlvbiBpbiBtcy4KLSAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCAobWF4RHVyYXRpb25VcyArIDUwMCkgLyAxMDAwKTsKKyAgICBzcHJpbnRmKHRtcCwgIiUiIFBSSWQ2NCwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRFVSQVRJT04sIFN0cmluZzgodG1wKSk7CiAKICAgICBpZiAoaGFzQXVkaW8pIHsKQEAgLTU3Myw3ICs2MDAsNyBAQAogICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc291cmNlU2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgIGludDY0X3QgYXZnQml0UmF0ZSA9IChpbnQ2NF90KShzb3VyY2VTaXplICogOEU2IC8gbWF4RHVyYXRpb25Vcyk7CiAKLSAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWxsZCIsIGF2Z0JpdFJhdGUpOworICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlIiBQUklkNjQsIGF2Z0JpdFJhdGUpOwogICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQklUUkFURSwgU3RyaW5nOCh0bXApKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuY3BwCmluZGV4IDZiOTM0ZDQuLjRlMWM2NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcApAQCAtMTYsNiArMTYsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlTWVkaWFTb3VyY2UiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTU0LDkgKzU2LDkgQEAKICAgICAgICAgQUxPR0UoIkludmFsaWQgZGltZW5zaW9ucyAlZHglZCIsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwogICAgIH0KIAotICAgIG1CdWZmZXJRdWV1ZSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgIG1CdWZmZXJRdWV1ZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIgfAorICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKyAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7CiAKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKQEAgLTY4LDcgKzcwLDcgQEAKICAgICB3cDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PENvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKICAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9IG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKIAotICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJTdXJmYWNlTWVkaWFTb3VyY2U6IGVycm9yIGNvbm5lY3RpbmcgdG8gQnVmZmVyUXVldWU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwpAQCAtOTksMTMgKzEwMSwxNiBAQAogICAgIGR1bXAocmVzdWx0LCAiIiwgYnVmZmVyLCAxMDI0KTsKIH0KIAotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Cit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6ZHVtcCgKKyAgICAgICAgU3RyaW5nOCYgcmVzdWx0LAorICAgICAgICBjb25zdCBjaGFyKiAvKiBwcmVmaXggKi8sCisgICAgICAgIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IC8qIFNJWkUgKi8pIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBtQnVmZmVyUXVldWUtPmR1bXAocmVzdWx0LCAiIik7CisgICAgbUNvbnN1bWVyLT5kdW1wKHJlc3VsdCwgIiIpOwogfQogCiBzdGF0dXNfdCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lUmF0ZShpbnQzMl90IGZwcykKQEAgLTE2Myw3ICsxNjgsNyBAQAogICAgIENIRUNLX0dUKG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50LCAxKTsKIAogICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1CdWZmZXJRdWV1ZS0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCk7CisgICAgICAgIG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CkBAIC0xNzYsNyArMTgxLDcgQEAKIH0KIAogc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KHNpemVfdCBjb3VudCkgewotICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCVkKSIsIGNvdW50KTsKKyAgICBBTE9HVigic2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCglenUpIiwgY291bnQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKICAgICBDSEVDS19HVChjb3VudCwgMSk7CkBAIC0yMDIsOCArMjA3LDExIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKKwogICAgIHdoaWxlIChtTnVtUGVuZGluZ0J1ZmZlcnMgPiAwKSB7Ci0gICAgICAgIEFMT0dJKCJTdGlsbCB3YWl0aW5nIGZvciAlZCBidWZmZXJzIHRvIGJlIHJldHVybmVkLiIsCisgICAgICAgIEFMT0dJKCJTdGlsbCB3YWl0aW5nIGZvciAlenUgYnVmZmVycyB0byBiZSByZXR1cm5lZC4iLAogICAgICAgICAgICAgICAgIG1OdW1QZW5kaW5nQnVmZmVycyk7CiAKICNpZiBERUJVR19QRU5ESU5HX0JVRkZFUlMKQEAgLTIxNSwxMSArMjIzLDkgQEAKICAgICAgICAgbU1lZGlhQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CiAgICAgfQogCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiAgICAgbU1lZGlhQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKIAotICAgIHJldHVybiBtQnVmZmVyUXVldWUtPmNvbnN1bWVyRGlzY29ubmVjdCgpOworICAgIHJldHVybiBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwogfQogCiBzcDxNZXRhRGF0YT4gU3VyZmFjZU1lZGlhU291cmNlOjpnZXRGb3JtYXQoKQpAQCAtMjY1LDEzICsyNzEsMTIgQEAKICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwogICAgIG1lbWNweShkYXRhICsgNCwgJmJ1ZmZlckhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOwogCi0gICAgQUxPR1YoImhhbmRsZSA9ICVwLCAsIG9mZnNldCA9ICVkLCBsZW5ndGggPSAlZCIsCisgICAgQUxPR1YoImhhbmRsZSA9ICVwLCAsIG9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1IiwKICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgKCpidWZmZXIpLT5yYW5nZV9sZW5ndGgoKSwgKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSk7CiB9CiAKLXN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVhZCggTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKLXsKK3N0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgIEFMT0dWKCJyZWFkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIApAQCAtMjkwLDcgKzI5NSw3IEBACiAgICAgLy8gd2FpdCBoZXJlIHRpbGwgdGhlIGZyYW1lcyBjb21lIGluIGZyb20gdGhlIGNsaWVudCBzaWRlCiAgICAgd2hpbGUgKG1TdGFydGVkKSB7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewogICAgICAgICAgICAgLy8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmUgcXVldWVkCiAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTXV0ZXgpOwpAQCAtMzEzLDcgKzMxOCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVOcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubVRpbWVzdGFtcCA8IG1TdGFydFRpbWVOcykgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBwcmVkYXRlcyBzdGFydCBvZiByZWNvcmQsIGRpc2NhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwgRUdMX05PX0RJU1BMQVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzYwLDcgKzM2NSw3IEBACiAgICAgKCpidWZmZXIpLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICAoKmJ1ZmZlciktPmFkZF9yZWYoKTsKICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lc3RhbXAgLyAxMDAwKTsKLSAgICBBTE9HVigiRnJhbWVzIGVuY29kZWQgPSAlZCwgdGltZXN0YW1wID0gJWxsZCwgdGltZSBkaWZmID0gJWxsZCIsCisgICAgQUxPR1YoIkZyYW1lcyBlbmNvZGVkID0gJWQsIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCAiLCB0aW1lIGRpZmYgPSAlIiBQUklkNjQsCiAgICAgICAgICAgICBtTnVtRnJhbWVzRW5jb2RlZCwgbUN1cnJlbnRUaW1lc3RhbXAgLyAxMDAwLAogICAgICAgICAgICAgbUN1cnJlbnRUaW1lc3RhbXAgLyAxMDAwIC0gcHJldlRpbWVTdGFtcCAvIDEwMDApOwogCkBAIC00MTMsNyArNDE4LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJTbG90ICVkIHJldHVybmVkLCBtYXRjaGVzIGhhbmRsZSA9ICVwIiwgaWQsCiAgICAgICAgICAgICAgICAgICAgIG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CiAKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS0+cmVsZWFzZUJ1ZmZlcihpZCwgbVNsb3RzW2lkXS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaWQsIG1TbG90c1tpZF0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsCiAgICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSk7CiAKQEAgLTQ3NCw0ICs0NzksOCBAQAogICAgIH0KIH0KIAordm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiU3VyZmFjZU1lZGlhU291cmNlIGNhbid0IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcyIpOworfQorCiB9IC8vIGVuZCBvZiBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggMGFmYWM2OS4uMWZkYjI0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC0xNyw3ICsxNywxMSBAQAogI3VuZGVmIF9fU1RSSUNUX0FOU0lfXwogI2RlZmluZSBfX1NURElOVF9MSU1JVFMKICNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlRpbWVkRXZlbnRRdWV1ZSIKQEAgLTI2LDkgKzMwLDYgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgiCiAKLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0yNTgsNyArMjU5LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0aWMgaW50NjRfdCBrTWF4VGltZW91dFVzID0gMTAwMDAwMDBsbDsgIC8vIDEwIHNlY3MKICAgICAgICAgICAgICAgICBib29sIHRpbWVvdXRDYXBwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoZGVsYXlfdXMgPiBrTWF4VGltZW91dFVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJkZWxheV91cyBleGNlZWRzIG1heCB0aW1lb3V0OiAlbGxkIHVzIiwgZGVsYXlfdXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZGVsYXlfdXMgZXhjZWVkcyBtYXggdGltZW91dDogJSIgUFJJZDY0ICIgdXMiLCBkZWxheV91cyk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgbmV2ZXIgYmxvY2sgZm9yIG1vcmUgdGhhbiAxMCBzZWNzLCBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgc3BsaXQgdXAgdGhlIGZ1bGwgdGltZW91dCBpbnRvIGNodW5rcyBvZgpAQCAtMzM3LDcgKzMzOCw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiVGltZWRFdmVudFF1ZXVlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpKTsgICAgLy8gbm90IG9uZXdheQogICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CkBAIC0zNjIsNyArMzYzLDcgQEAKICAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gMCk7CiAgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKICAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCk7ICAvLyBub3Qgb25ld2F5CiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICAgICAgfQogICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwpAQCAtMzc2LDggKzM3Nyw4IEBACiAgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwogfQogCi12b2lkIFRpbWVkRXZlbnRRdWV1ZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKQotewordm9pZCBUaW1lZEV2ZW50UXVldWU6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoCisgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiAvKiB3aG8gKi8pIHsKICAgICBtUXVldWUtPmNsZWFyUG93ZXJNYW5hZ2VyKCk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAppbmRleCAyNTViOTQyLi4xZTNiZmRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCkBAIC0xNywxMSArMTcsMTMgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMTAwLDYgKzEwMiwxMSBAQAogICAgICAgICBtc2ctPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7CiAgICAgfQogCisgICAgaW50IGF2Z0JpdFJhdGU7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmF2Z0JpdFJhdGUpKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImJpdC1yYXRlIiwgYXZnQml0UmF0ZSk7CisgICAgfQorCiAgICAgaW50MzJfdCBpc1N5bmM7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpICYmIGlzU3luYyAhPSAwKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImlzLXN5bmMtZnJhbWUiLCAxKTsKQEAgLTExOSw2ICsxMjYsMjUgQEAKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNhci13aWR0aCIsIHNhcldpZHRoKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInNhci1oZWlnaHQiLCBzYXJIZWlnaHQpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wQm90dG9tKSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CkBAIC0xNDUsNiArMTcxLDExIEBACiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzQURUUywgJmlzQURUUykpIHsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImlzLWFkdHMiLCB0cnVlKTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSA9IC0xOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNQcm9maWxlKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBhYWNQcm9maWxlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwpAQCAtMTUyLDYgKzE4MywxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIG1heElucHV0U2l6ZSk7CiAgICAgfQogCisgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCByb3RhdGlvbkRlZ3JlZXMpOworICAgIH0KKwogICAgIHVpbnQzMl90IHR5cGU7CiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKQEAgLTI1NCw2ICsyOTAsNzAgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0xIiwgYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCAyMyB8fCBwdHJbMF0gIT0gMSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBwcm9maWxlID0gcHRyWzFdICYgMzE7CisgICAgICAgIHVpbnQ4X3QgbGV2ZWwgPSBwdHJbMTJdOworICAgICAgICBwdHIgKz0gMjI7CisgICAgICAgIHNpemUgLT0gMjI7CisKKworICAgICAgICBzaXplX3QgbnVtb2ZBcnJheXMgPSAoY2hhcilwdHJbMF07CisgICAgICAgIHB0ciArPSAxOworICAgICAgICBzaXplIC09IDE7CisgICAgICAgIHNpemVfdCBqID0gMCwgaSA9IDA7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoMTAyNCk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bW9mQXJyYXlzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0ciArPSAxOworICAgICAgICAgICAgc2l6ZSAtPSAxOworCisgICAgICAgICAgICAvL051bSBvZiBuYWxzCisgICAgICAgICAgICBzaXplX3QgbnVtb2ZOYWxzID0gVTE2X0FUKHB0cik7CisKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtb2ZOYWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOworCisgICAgICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSAyOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29weU5BTFVUb0FCdWZmZXIoJmJ1ZmZlciwgcHRyLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGVuZ3RoOworICAgICAgICAgICAgICAgIHNpemUgLT0gbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CisKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgQ0hFQ0tfRVEoZXNkcy5Jbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKQEAgLTI5OCw2ICszOTgsMTYgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0xIiwgYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAogICAgICpmb3JtYXQgPSBtc2c7CkBAIC0zMjQsNyArNDM0LDcgQEAKICAgICAgICAgICAgICAgICAvLyB0aGVyZSBjYW4ndCBiZSBhbm90aGVyIHBhcmFtIGhlcmUsIHNvIHVzZSBhbGwgdGhlIHJlc3QKICAgICAgICAgICAgICAgICBpID0gY3NkMC0+c2l6ZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImJsb2NrIGF0ICVkLCBsYXN0IHdhcyAlZCIsIGksIGxhc3RwYXJhbW9mZnNldCk7CisgICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJXp1LCBsYXN0IHdhcyAlZCIsIGksIGxhc3RwYXJhbW9mZnNldCk7CiAgICAgICAgICAgICBpZiAobGFzdHBhcmFtb2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludCBzaXplID0gaSAtIGxhc3RwYXJhbW9mZnNldDsKICAgICAgICAgICAgICAgICBhdmNjW2F2Y2NpZHgrK10gPSBzaXplID4+IDg7CkBAIC0zNTUsNyArNDY1LDcgQEAKICAgICAgICAgICAgICAgICAvLyB0aGVyZSBjYW4ndCBiZSBhbm90aGVyIHBhcmFtIGhlcmUsIHNvIHVzZSBhbGwgdGhlIHJlc3QKICAgICAgICAgICAgICAgICBpID0gY3NkMS0+c2l6ZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImJsb2NrIGF0ICVkLCBsYXN0IHdhcyAlZCIsIGksIGxhc3RwYXJhbW9mZnNldCk7CisgICAgICAgICAgICBBTE9HVigiYmxvY2sgYXQgJXp1LCBsYXN0IHdhcyAlZCIsIGksIGxhc3RwYXJhbW9mZnNldCk7CiAgICAgICAgICAgICBpZiAobGFzdHBhcmFtb2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludCBzaXplID0gaSAtIGxhc3RwYXJhbW9mZnNldDsKICAgICAgICAgICAgICAgICBhdmNjW2F2Y2NpZHgrK10gPSBzaXplID4+IDg7CkBAIC00NDgsNiArNTU4LDI1IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U0FSV2lkdGgsIHNhcldpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIHNhckhlaWdodCk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOworICAgICAgICBpZiAobXNnLT5maW5kUmVjdCgiY3JvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyb3BUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcm9wQm90dG9tKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b20pOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSkgewpAQCAtNTA5LDYgKzYzOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9CisKICAgICAvLyBYWFggVE9ETyBhZGQgd2hhdGV2ZXIgb3RoZXIga2V5cyB0aGVyZSBhcmUKIAogI2lmIDAKQEAgLTU4MCw2ICs3MTQsNyBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAgICAgIEFVRElPX0ZPUk1BVF9BTVJfV0IgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgICAgICAgICBBVURJT19GT1JNQVRfQUFDIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICAgICAgQVVESU9fRk9STUFUX1ZPUkJJUyB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KIH07CiAKQEAgLTU5NywxMCArNzMyLDQ2IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAorc3RydWN0IGFhY19mb3JtYXRfY29udl90IHsKKyAgICBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUgZUFhY1Byb2ZpbGVUeXBlOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QgcHJvZmlsZUxvb2t1cFtdID0geworICAgIHsgT01YX0FVRElPX0FBQ09iamVjdE1haW4sICAgICAgICBBVURJT19GT1JNQVRfQUFDX01BSU59LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExDLCAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xDfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RTU1IsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19TU1J9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdExUUCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0xUUH0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjF9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFNjYWxhYmxlLCAgICBBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RFUkxDLCAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FUkxDfSwKKyAgICB7IE9NWF9BVURJT19BQUNPYmplY3RMRCwgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19MRH0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMsICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjJ9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEVMRCwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0VMRH0sCisgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUN9LAorfTsKKwordm9pZCBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCggYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwgdWludDY0X3QgZUFhY1Byb2ZpbGUpCit7Citjb25zdCBzdHJ1Y3QgYWFjX2Zvcm1hdF9jb252X3QqIHAgPSAmcHJvZmlsZUxvb2t1cFswXTsKKyAgICB3aGlsZSAocC0+ZUFhY1Byb2ZpbGVUeXBlICE9IE9NWF9BVURJT19BQUNPYmplY3ROdWxsKSB7CisgICAgICAgIGlmIChlQWFjUHJvZmlsZSA9PSBwLT5lQWFjUHJvZmlsZVR5cGUpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IHAtPmZvcm1hdDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICArK3A7CisgICAgfQorICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUM7CisgICAgcmV0dXJuOworfQorCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKIHsKICAgICBjb25zdCBjaGFyICptaW1lOworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKQEAgLTYxOSwxNSArNzkwLDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICAvLyBjaGVjayB3aGV0aGVyIGl0IGlzIEVMRC9MRCBjb250ZW50IC0+IG5vIG9mZmxvYWRpbmcKLSAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgZGVwZW5kIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuIG1hcE1pbWVUb0F1ZGlvRm9ybWF0KCkgc2hvdWxkIHVzZSB0aGUKLSAgICAvLyBtZXRhZGF0YSB0byByZWZpbmUgdGhlIEFBQyBmb3JtYXQgYW5kIHRoZSBhdWRpbyBIQUwgc2hvdWxkIG9ubHkgbGlzdCBzdXBwb3J0ZWQgcHJvZmlsZXMuCisgICAgLy8gUmVkZWZpbmUgYWFjIGZvcm1hdCBhY2NvcmRpbmcgdG8gaXRzIHByb2ZpbGUKKyAgICAvLyBPZmZsb2FkaW5nIGRlcGVuZHMgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4KICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgaWYgKGFhY2FvdCA9PSAyMyB8fCBhYWNhb3QgPT0gMzkgKSB7Ci0gICAgICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGlzIEVMRC9MRCBjb250ZW50IiwgbWltZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKICAgICB9CiAKICAgICBpbnQzMl90IHNyYXRlID0gLTE7CkBAIC02NzIsNSArODM5LDQwIEBACiAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjppc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK0FTdHJpbmcgdXJpRGVidWdTdHJpbmcoY29uc3QgQVN0cmluZyAmdXJpLCBib29sIGluY29nbml0bykgeworICAgIGlmIChpbmNvZ25pdG8pIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmcoIjxVUkkgc3VwcHJlc3NlZD4iKTsKKyAgICB9CisKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5sb2ctdXJpIiwgcHJvcCwgImZhbHNlIikgJiYKKyAgICAgICAgKCFzdHJjbXAocHJvcCwgIjEiKSB8fCAhc3RyY21wKHByb3AsICJ0cnVlIikpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorCisgICAgLy8gZmluZCBzY2hlbWUKKyAgICBBU3RyaW5nIHNjaGVtZTsKKyAgICBjb25zdCBjaGFyICpjaGFycyA9IHVyaS5jX3N0cigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXJpLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgYyA9IGNoYXJzW2ldOworICAgICAgICBpZiAoIWlzYXNjaWkoYykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGlzYWxwaGEoYykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgLy8gZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBsZXR0ZXIKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnKycgfHwgYyA9PSAnLicgfHwgYyA9PSctJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnOicpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNjaGVtZSA9IEFTdHJpbmcodXJpLCAwLCBpKTsKKyAgICAgICAgc2NoZW1lLmFwcGVuZCgiOi8vPHN1cHByZXNzZWQ+Iik7CisgICAgICAgIHJldHVybiBzY2hlbWU7CisgICAgfQorICAgIHJldHVybiBBU3RyaW5nKCI8bm8tc2NoZW1lIFVSSSBzdXBwcmVzc2VkPiIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCmluZGV4IGEyNDVmMmMuLmU5ODhmNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCkBAIC0xNiw2ICsxNiw5IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVkJSSVNlZWtlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvVkJSSVNlZWtlci5oIgpAQCAtNzUsNyArNzgsNyBAQAogICAgIHNpemVfdCBlbnRyeVNpemUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjJdKTsKICAgICBzaXplX3Qgc2NhbGUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjBdKTsKIAotICAgIEFMT0dWKCIlZCBlbnRyaWVzLCBzY2FsZT0lZCwgc2l6ZV9wZXJfZW50cnk9JWQiLAorICAgIEFMT0dWKCIlenUgZW50cmllcywgc2NhbGU9JXp1LCBzaXplX3Blcl9lbnRyeT0lenUiLAogICAgICAgICAgbnVtRW50cmllcywKICAgICAgICAgIHNjYWxlLAogICAgICAgICAgZW50cnlTaXplKTsKQEAgLTExOSw3ICsxMjIsNyBAQAogCiAgICAgICAgIHNlZWtlci0+bVNlZ21lbnRzLnB1c2gobnVtQnl0ZXMpOwogCi0gICAgICAgIEFMT0dWKCJlbnRyeSAjJWQ6ICVkIG9mZnNldCAweCUwOGx4IiwgaSwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCJlbnRyeSAjJXp1OiAldSBvZmZzZXQgMHglMDE2bGx4IiwgaSwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKICAgICB9CiAKQEAgLTE2MCw3ICsxNjMsNyBAQAogICAgICAgICAqcG9zICs9IG1TZWdtZW50cy5pdGVtQXQoc2VnbWVudEluZGV4KyspOwogICAgIH0KIAotICAgIEFMT0dWKCJnZXRPZmZzZXRGb3JUaW1lICVsbGQgdXMgPT4gMHglMDhseCIsICp0aW1lVXMsICpwb3MpOworICAgIEFMT0dWKCJnZXRPZmZzZXRGb3JUaW1lICUiIFBSSWQ2NCAiIHVzID0+IDB4JTAxNmxseCIsICp0aW1lVXMsICpwb3MpOwogCiAgICAgKnRpbWVVcyA9IG5vd1VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAppbmRleCAyMmFmNmZiLi5hNGE2NTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTEyNyw3ICsxMjcsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzU4LDcgKzM1OCw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKK3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKQEAgLTQxNCw3ICs0MTQsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogKG1CaXRzUGVyU2FtcGxlID4+IDMpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPiBtU2l6ZSkgeworICAgICAgICBpZiAocG9zID4gKG9mZjY0X3QpbVNpemUpIHsKICAgICAgICAgICAgIHBvcyA9IG1TaXplOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zICsgbU9mZnNldDsKQEAgLTQzOSw2ICs0MzksMTAgQEAKICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtYXhCeXRlc0F2YWlsYWJsZTsKICAgICB9CiAKKyAgICAvLyByZWFkIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBhdWRpbyB1bml0IGZyYW1lcy4KKyAgICBjb25zdCBzaXplX3QgaW5wdXRVbml0RnJhbWVTaXplID0gbU51bUNoYW5uZWxzICogbUJpdHNQZXJTYW1wbGUgLyA4OworICAgIG1heEJ5dGVzVG9SZWFkIC09IG1heEJ5dGVzVG9SZWFkICUgaW5wdXRVbml0RnJhbWVTaXplOworCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CiAgICAgICAgIC8vIE1pY3Jvc29mdCBwYWNrcyAyIGZyYW1lcyBpbnRvIDY1IGJ5dGVzLCByYXRoZXIgdGhhbiB1c2luZyBzZXBhcmF0ZSAzMy1ieXRlIGZyYW1lcywKICAgICAgICAgLy8gc28gcmVhZCBtdWx0aXBsZXMgb2YgNjUsIGFuZCB1c2Ugc21hbGxlciBidWZmZXJzIHRvIGFjY291bnQgZm9yIH4xMDoxIGV4cGFuc2lvbiByYXRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKaW5kZXggYjgyMjg2OC4uMzhhMWY2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCkBAIC00MCw2ICs0MCwyNSBAQAogICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOwogfQogCitzaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFKGJyKTsKKworICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtKGNvZGVOdW0gLyAyKTsKK30KKworc3RhdGljIHZvaWQgc2tpcFNjYWxpbmdMaXN0KEFCaXRSZWFkZXIgKmJyLCBzaXplX3Qgc2l6ZU9mU2NhbGluZ0xpc3QpIHsKKyAgICBzaXplX3QgbGFzdFNjYWxlID0gODsKKyAgICBzaXplX3QgbmV4dFNjYWxlID0gODsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVPZlNjYWxpbmdMaXN0OyArK2opIHsKKyAgICAgICAgaWYgKG5leHRTY2FsZSAhPSAwKSB7CisgICAgICAgICAgICBzaWduZWQgZGVsdGFfc2NhbGUgPSBwYXJzZVNFKGJyKTsKKyAgICAgICAgICAgIG5leHRTY2FsZSA9IChsYXN0U2NhbGUgKyBkZWx0YV9zY2FsZSArIDI1NikgJSAyNTY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0U2NhbGUgPSAobmV4dFNjYWxlID09IDApID8gbGFzdFNjYWxlIDogbmV4dFNjYWxlOworICAgIH0KK30KKwogLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgogdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LApAQCAtNjMsNyArODIsMjQgQEAKICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2x1bWFfbWludXM4CiAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4CiAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gcXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnCi0gICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDB1KTsgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKKworICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0KKworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiB0aGUgY29kZSBiZWxvdyBoYXMgbm90IGV2ZXIgYmVlbiBleGVyY2lzZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIHJlYWwtd29ybGQgZXhhbXBsZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0NHg0W2ldLDE2LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgMTYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q4eDhbaS02XSw2NCwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDY0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKQEAgLTI1MSw5ICsyODcsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlLAotICAgICAgICBzaXplX3QgKnN0b3BPZmZzZXQpIHsKK3N0YXRpYyBzcDxBQnVmZmVyPiBGaW5kTkFMKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlKSB7CiAgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CiAgICAgc2l6ZV90IG5hbFNpemU7CiAgICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKQEAgLTI5Myw3ICszMjcsNyBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBhY2Nlc3NVbml0LT5kYXRhKCk7CiAgICAgc2l6ZV90IHNpemUgPSBhY2Nlc3NVbml0LT5zaXplKCk7CiAKLSAgICBzcDxBQnVmZmVyPiBzZXFQYXJhbVNldCA9IEZpbmROQUwoZGF0YSwgc2l6ZSwgNywgTlVMTCk7CisgICAgc3A8QUJ1ZmZlcj4gc2VxUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDcpOwogICAgIGlmIChzZXFQYXJhbVNldCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMwMyw4ICszMzcsNyBAQAogICAgIEZpbmRBVkNEaW1lbnNpb25zKAogICAgICAgICAgICAgc2VxUGFyYW1TZXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKIAotICAgIHNpemVfdCBzdG9wT2Zmc2V0OwotICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4LCAmc3RvcE9mZnNldCk7CisgICAgc3A8QUJ1ZmZlcj4gcGljUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDgpOwogICAgIENIRUNLKHBpY1BhcmFtU2V0ICE9IE5VTEwpOwogCiAgICAgc2l6ZV90IGNzZFNpemUgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDllM2ZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSwgdHJ1ZSkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICBcCi0gICAgICAgIERhdGFVcmlTb3VyY2UuY3BwIFwKLSAgICAgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAgXAotICAgICAgICBzdXBwb3J0LmNwcCBcCi0gICAgICAgIGNocm9taXVtX2h0dHBfc3R1Yi5jcHAKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAotICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAgICAgZXh0ZXJuYWwvY2hyb21pdW0gXAotICAgICAgICBleHRlcm5hbC9jaHJvbWl1bS9hbmRyb2lkCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICAgICAgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RscG9ydCBcCi0gICAgICAgIGxpYmNocm9taXVtX25ldCBcCi0gICAgICAgIGxpYnV0aWxzIFwKLSAgICAgICAgbGliYmluZGVyIFwKLSAgICAgICAgbGliY3V0aWxzIFwKLSAgICAgICAgbGlibG9nIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IFwKLSAgICAgICAgbGliZHJtZnJhbWV3b3JrCi0KLWluY2x1ZGUgZXh0ZXJuYWwvc3RscG9ydC9saWJzdGxwb3J0Lm1rCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTVjMjgwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi0jaW5jbHVkZSAic3VwcG9ydC5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUNocm9taXVtSFRUUERhdGFTb3VyY2U6OkNocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MpCi0gICAgOiBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCi0gICAgICBtRGVsZWdhdGUobmV3IFNmRGVsZWdhdGUpLAotICAgICAgbUN1cnJlbnRPZmZzZXQoMCksCi0gICAgICBtSU9SZXN1bHQoT0spLAotICAgICAgbUNvbnRlbnRTaXplKC0xKSwKLSAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAotICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewotICAgIG1EZWxlZ2F0ZS0+c2V0T3duZXIodGhpcyk7Ci19Ci0KLUNocm9taXVtSFRUUERhdGFTb3VyY2U6On5DaHJvbWl1bUhUVFBEYXRhU291cmNlKCkgewotICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgIGRlbGV0ZSBtRGVsZWdhdGU7Ci0gICAgbURlbGVnYXRlID0gTlVMTDsKLQotICAgIGNsZWFyRFJNU3RhdGVfbCgpOwotCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB1aWRfdCB1aWQ7Ci0gICAgaWYgKGdldFVJRCgmdWlkKSkgewotICAgICAgICBtRGVsZWdhdGUtPnNldFVJRCh1aWQpOwotICAgIH0KLQotI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsICJjb25uZWN0IG9uIGJlaGFsZiBvZiB1aWQgJWQiLCB1aWQpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gY29ubmVjdF9sKHVyaSwgaGVhZGVycywgb2Zmc2V0KTsKLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6Y29ubmVjdF9sKAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RfbCgpOwotICAgIH0KLQotI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsCi0gICAgICAgICAgICAgICAgImNvbm5lY3QgdG8gPFVSTCBzdXBwcmVzc2VkPiBAJWxsZCIsIG9mZnNldCk7Ci0jZW5kaWYKLQotICAgIG1VUkkgPSB1cmk7Ci0gICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0KLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIG1IZWFkZXJzID0gKmhlYWRlcnM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhlYWRlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwotICAgIG1Db250ZW50U2l6ZSA9IC0xOwotICAgIG1DdXJyZW50T2Zmc2V0ID0gb2Zmc2V0OwotCi0gICAgbURlbGVnYXRlLT5pbml0aWF0ZUNvbm5lY3Rpb24obVVSSS5jX3N0cigpLCAmbUhlYWRlcnMsIG9mZnNldCk7Ci0KLSAgICB3aGlsZSAobVN0YXRlID09IENPTk5FQ1RJTkcgfHwgbVN0YXRlID09IERJU0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVN0YXRlID09IENPTk5FQ1RFRCA/IE9LIDogbUlPUmVzdWx0OwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uUmVkaXJlY3QoY29uc3QgY2hhciAqdXJsKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtVVJJID0gdXJsOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6Om9uQ29ubmVjdGlvbkVzdGFibGlzaGVkKAotICAgICAgICBpbnQ2NF90IGNvbnRlbnRTaXplLCBjb25zdCBjaGFyICpjb250ZW50VHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgLy8gV2UgbWF5IGhhdmUgaW5pdGlhdGVkIGRpc2Nvbm5lY3Rpb24uCi0gICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgRElTQ09OTkVDVElORyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgbUNvbnRlbnRTaXplID0gKGNvbnRlbnRTaXplIDwgMCkgPyAtMSA6IGNvbnRlbnRTaXplICsgbUN1cnJlbnRPZmZzZXQ7Ci0gICAgbUNvbnRlbnRUeXBlID0gU3RyaW5nOChjb250ZW50VHlwZSk7Ci0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvbkNvbm5lY3Rpb25GYWlsZWQoc3RhdHVzX3QgZXJyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7Ci0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLQotICAgIC8vIG1VUkkuY2xlYXIoKTsKLQotICAgIG1JT1Jlc3VsdCA9IGVycjsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgZGlzY29ubmVjdF9sKCk7Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdF9sKCkgewotICAgIGlmIChtU3RhdGUgPT0gRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBESVNDT05ORUNUSU5HOwotICAgIG1JT1Jlc3VsdCA9IC1FSU5UUjsKLQotICAgIG1EZWxlZ2F0ZS0+aW5pdGlhdGVEaXNjb25uZWN0KCk7Ci0KLSAgICB3aGlsZSAobVN0YXRlID09IERJU0NPTk5FQ1RJTkcpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUSgoaW50KW1TdGF0ZSwgKGludClESVNDT05ORUNURUQpOwotfQotCi1zdGF0dXNfdCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBOT19JTklUOwotfQotCi1zc2l6ZV90IENocm9taXVtSFRUUERhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotI2lmIDAKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQuZGlzYWJsZS1uZXQiLCB2YWx1ZSwgMCkKLSAgICAgICAgICAgICYmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY21wKHZhbHVlLCAiMSIpKSkgewotICAgICAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICJTaW11bGF0aW5nIHRoYXQgdGhlIG5ldHdvcmsgaXMgZG93bi4iKTsKLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChvZmZzZXQgIT0gbUN1cnJlbnRPZmZzZXQpIHsKLSAgICAgICAgQVN0cmluZyB0bXAgPSBtVVJJOwotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiB0bXBIZWFkZXJzID0gbUhlYWRlcnM7Ci0KLSAgICAgICAgZGlzY29ubmVjdF9sKCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdF9sKHRtcC5jX3N0cigpLCAmdG1wSGVhZGVycywgb2Zmc2V0KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVN0YXRlID0gUkVBRElORzsKLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgbURlbGVnYXRlLT5pbml0aWF0ZVJlYWQoZGF0YSwgc2l6ZSk7Ci0KLSAgICB3aGlsZSAobVN0YXRlID09IFJFQURJTkcpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBpZiAobUlPUmVzdWx0IDwgT0spIHsKLSAgICAgICAgcmV0dXJuIG1JT1Jlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCkgewotICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7Ci0KLSAgICAgICAgLy8gVGhlIHJlYWQgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBtSU9SZXN1bHQgY29udGFpbnMKLSAgICAgICAgLy8gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAgICAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChtSU9SZXN1bHQsIGRlbGF5VXMpOwotCi0gICAgICAgIG1DdXJyZW50T2Zmc2V0ICs9IG1JT1Jlc3VsdDsKLSAgICAgICAgcmV0dXJuIG1JT1Jlc3VsdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRVJST1JfSU87Ci19Ci0KLXZvaWQgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6b25SZWFkQ29tcGxldGVkKHNzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtSU9SZXN1bHQgPSBzaXplOwotCi0gICAgaWYgKG1TdGF0ZSA9PSBSRUFESU5HKSB7Ci0gICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKLSAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUNvbnRlbnRTaXplIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ29udGVudFNpemU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXVpbnQzMl90IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OkluaXRpYXRlUmVhZCgKLSAgICAgICAgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgbWUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjppbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBtRGVsZWdhdGUtPmluaXRpYXRlUmVhZChkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpvbkRpc2Nvbm5lY3RDb21wbGV0ZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KURJU0NPTk5FQ1RJTkcpOwotCi0gICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIC8vIG1VUkkuY2xlYXIoKTsKLSAgICBtSU9SZXN1bHQgPSAtRU5PVENPTk47Ci0KLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi1zcDxEZWNyeXB0SGFuZGxlPiBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKLSAgICB9Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAvKiBOb3RlIGlmIHJlZGlyZWN0IG9jY3VycywgbVVyaSBpcyB0aGUgcmVkaXJlY3QgdXJpIGluc3RlYWQgb2YgdGhlCi0gICAgICAgICAqIG9yaWdpbmFsIG9uZQotICAgICAgICAgKi8KLSAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBtRHJtTWFuYWdlckNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgICAgIFN0cmluZzgobVVSSS5jX3N0cigpKSwgbWltZSk7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwotfQotCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldERybUluZm8oCi0gICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaGFuZGxlID0gbURlY3J5cHRIYW5kbGU7Ci0gICAgKmNsaWVudCA9IG1Ecm1NYW5hZ2VyQ2xpZW50OwotfQotCi1TdHJpbmc4IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmdldFVyaSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIFN0cmluZzgobVVSSS5jX3N0cigpKTsKLX0KLQotU3RyaW5nOCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgcmV0dXJuIG1Db250ZW50VHlwZTsKLX0KLQotdm9pZCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjpjbGVhckRSTVN0YXRlX2woKSB7Ci0gICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQotICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKG1EZWNyeXB0SGFuZGxlKTsKLSAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6cmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1VUkkuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiUmVjb25uZWN0aW5nLi4uIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdF9sKG1VUkkuY19zdHIoKSwgJm1IZWFkZXJzLCBvZmZzZXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCBMT0dfVEFHLCAiUmVjb25uZWN0IGZhaWxlZCB3LyBlcnIgMHglMDh4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENocm9taXVtSFRUUERhdGFTb3VyY2U6OlVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICByZXR1cm4gU2ZEZWxlZ2F0ZTo6VXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvRGF0YVVyaVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0RhdGFVcmlTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2YzZmExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvRGF0YVVyaVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGluY2x1ZGUvRGF0YVVyaVNvdXJjZS5oPgotCi0jaW5jbHVkZSA8bmV0L2Jhc2UvZGF0YV91cmwuaD4KLSNpbmNsdWRlIDxnb29nbGV1cmwvc3JjL2d1cmwuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURhdGFVcmlTb3VyY2U6OkRhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKSA6Ci0gICAgbURhdGFVcmkodXJpKSwKLSAgICBtSW5pdGVkKE5PX0lOSVQpIHsKLQotICAgIC8vIENvcHkxOiBjb25zdCBjaGFyICp1cmkgLT4gU3RyaW5nOCBtRGF0YVVyaS4KLSAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZVN0ciwgdW51c2VkQ2hhcnNldFN0ciwgZGF0YVN0cjsKLSAgICAvLyBDb3B5MjogU3RyaW5nOCBtRGF0YVVyaSAtPiBzdGQ6OnN0cmluZwotICAgIGNvbnN0IGJvb2wgcmV0ID0gbmV0OjpEYXRhVVJMOjpQYXJzZSgKLSAgICAgICAgICAgIEdVUkwoc3RkOjpzdHJpbmcobURhdGFVcmkuc3RyaW5nKCkpKSwKLSAgICAgICAgICAgICZtaW1lVHlwZVN0ciwgJnVudXNlZENoYXJzZXRTdHIsICZkYXRhU3RyKTsKLSAgICAvLyBDb3B5Mzogc3RkOjpzdHJpbmcgZGF0YVN0ciAtPiBBU3RyaW5nIG1EYXRhCi0gICAgbURhdGEuc2V0VG8oZGF0YVN0ci5kYXRhKCksIGRhdGFTdHIubGVuZ3RoKCkpOwotICAgIG1Jbml0ZWQgPSByZXQgPyBPSyA6IFVOS05PV05fRVJST1I7Ci0KLSAgICAvLyBUaGUgY2hyb21pdW0gZGF0YSB1cmwgaW1wbGVtZW50YXRpb24gZGVmYXVsdHMgdG8gdXNpbmcgInRleHQvcGxhaW4iCi0gICAgLy8gaWYgbm8gbWltZSB0eXBlIGlzIHNwZWNpZmllZC4gV2UgcHJlZmVyIHRvIGxlYXZlIHRoaXMgdW5zcGVjaWZpZWQKLSAgICAvLyBpbnN0ZWFkLCBzaW5jZSB0aGUgbWltZSB0eXBlIGlzIHNuaWZmZWQgaW4gbW9zdCBjYXNlcy4KLSAgICBpZiAobWltZVR5cGVTdHIgIT0gInRleHQvcGxhaW4iKSB7Ci0gICAgICAgIG1NaW1lVHlwZSA9IG1pbWVUeXBlU3RyLmNfc3RyKCk7Ci0gICAgfQotfQotCi1zc2l6ZV90IERhdGFVcmlTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqb3V0LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtSW5pdGVkICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdGVkOwotICAgIH0KLQotICAgIGNvbnN0IG9mZjY0X3QgbGVuZ3RoID0gbURhdGEuc2l6ZSgpOwotICAgIGlmIChvZmZzZXQgPj0gbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIgKmRhdGFCdWYgPSBtRGF0YS5jX3N0cigpOwotICAgIGNvbnN0IHNpemVfdCBieXRlc1RvQ29weSA9Ci0gICAgICAgICAgICBvZmZzZXQgKyBzaXplID49IGxlbmd0aCA/IChsZW5ndGggLSBvZmZzZXQpIDogc2l6ZTsKLQotICAgIGlmIChieXRlc1RvQ29weSA+IDApIHsKLSAgICAgICAgbWVtY3B5KG91dCwgZGF0YUJ1ZiArIG9mZnNldCwgYnl0ZXNUb0NvcHkpOwotICAgIH0KLQotICAgIHJldHVybiBieXRlc1RvQ29weTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvY2hyb21pdW1faHR0cF9zdHViLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvY2hyb21pdW1faHR0cF9zdHViLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZjZkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLSNpbmNsdWRlIDxpbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oPgotI2luY2x1ZGUgPGluY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPGluY2x1ZGUvRGF0YVVyaVNvdXJjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUhUVFBCYXNlICpjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIG5ldyBDaHJvbWl1bUhUVFBEYXRhU291cmNlKGZsYWdzKTsKLX0KLQotc3RhdHVzX3QgVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICByZXR1cm4gQ2hyb21pdW1IVFRQRGF0YVNvdXJjZTo6VXBkYXRlUHJveHlDb25maWcoaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLURhdGFTb3VyY2UgKmNyZWF0ZURhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKSB7Ci0gICAgcmV0dXJuIG5ldyBEYXRhVXJpU291cmNlKHVyaSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGU0ODc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVN1cHBvcnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotI2luY2x1ZGUgInN1cHBvcnQuaCIKLQotI2luY2x1ZGUgImFuZHJvaWQvbmV0L2FuZHJvaWRfbmV0d29ya19saWJyYXJ5X2ltcGwuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9jZXJ0X3ZlcmlmaWVyLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvY29va2llX21vbnN0ZXIuaCIKLSNpbmNsdWRlICJuZXQvYmFzZS9ob3N0X3Jlc29sdmVyLmgiCi0jaW5jbHVkZSAibmV0L2Jhc2Uvc3NsX2NvbmZpZ19zZXJ2aWNlLmgiCi0jaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9hdXRoX2hhbmRsZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfY2FjaGUuaCIKLSNpbmNsdWRlICJuZXQvcHJveHkvcHJveHlfY29uZmlnX3NlcnZpY2VfYW5kcm9pZC5oIgotCi0jaW5jbHVkZSAiaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgiCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBpbnRlcmZhY2UgZGVmaW5lZCBpbiBJQXVkaW9TZXJ2aWNlLmFpZGwKLWNsYXNzIElBdWRpb1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9TZXJ2aWNlKTsKLQotICAgIHZpcnR1YWwgaW50IHZlcmlmeVg1MDlDZXJ0Q2hhaW4oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXV0aF90eXBlKSA9IDA7Ci19OwotCi1jbGFzcyBCcEF1ZGlvU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9TZXJ2aWNlPgotewotcHVibGljOgotICAgIEJwQXVkaW9TZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb1NlcnZpY2U+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IHZlcmlmeVg1MDlDZXJ0Q2hhaW4oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNlcnRfY2hhaW4sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaG9zdG5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXV0aF90eXBlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICAvLyBUaGUgdmVjdG9yIG9mIHN0ZDo6c3RyaW5nIHdlIGdldCBpc24ndCByZWFsbHkgYSB2ZWN0b3Igb2Ygc3RyaW5ncywKLSAgICAgICAgLy8gYnV0IHJhdGhlciBhIHZlY3RvciBvZiBiaW5hcnkgY2VydGlmaWNhdGUgZGF0YS4gSWYgd2UgdHJ5IHRvIHBhc3MKLSAgICAgICAgLy8gaXQgdG8gSmF2YSBsYW5ndWFnZSBjb2RlIGFzIGEgc3RyaW5nLCBpdCBlbmRzIHVwIG1hbmdsZWQgb24gdGhlIG90aGVyCi0gICAgICAgIC8vIHNpZGUsIHNvIHNlbmQgdGhlbSBhcyBieXRlcyBpbnN0ZWFkLgotICAgICAgICAvLyBTaW5jZSB3ZSBjYW4ndCBzZW5kIGFuIGFycmF5IG9mIGJ5dGUgYXJyYXlzLCBzZW5kIGEgc2luZ2xlIGFycmF5LAotICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHNwbGl0IG91dCBieSB0aGUgcmVjaXBpZW50LgotCi0gICAgICAgIGludCBudW1jZXJ0cyA9IGNlcnRfY2hhaW4uc2l6ZSgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtY2VydHMpOwotICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWNlcnRzOyBpKyspIHsKLSAgICAgICAgICAgIHRvdGFsICs9IGNlcnRfY2hhaW5baV0uc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBieXRlc2l6ZSA9IHRvdGFsICsgbnVtY2VydHMgKiA0OwotICAgICAgICB1aW50OF90ICpieXRlcyA9ICh1aW50OF90KikgbWFsbG9jKGJ5dGVzaXplKTsKLSAgICAgICAgaWYgKCFieXRlcykgewotICAgICAgICAgICAgcmV0dXJuIDU7IC8vIFNTTF9JTlZBTElECi0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVkIGNlcnRzOiAlZCAtPiAlZCIsIG51bWNlcnRzLCB0b3RhbCwgYnl0ZXNpemUpOwotCi0gICAgICAgIGludCBvZmZzZXQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWNlcnRzOyBpKyspIHsKLSAgICAgICAgICAgIGludDMyX3QgY2VydHNpemUgPSBjZXJ0X2NoYWluW2ldLnNpemUoKTsKLSAgICAgICAgICAgIC8vIHN0b3JlIHRoaXMgaW4gYSBrbm93biBvcmRlciwgd2hpY2gganVzdCBoYXBwZW5zIHRvIG1hdGNoIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAvLyBieXRlIG9yZGVyIG9mIGEgamF2YSBCeXRlQnVmZmVyCi0gICAgICAgICAgICBpbnQzMl90IGJpZ3NpemUgPSBodG9ubChjZXJ0c2l6ZSk7Ci0gICAgICAgICAgICBBTE9HVigiY2VydCAlZCwgc2l6ZSAlZCIsIGksIGNlcnRzaXplKTsKLSAgICAgICAgICAgIG1lbWNweShieXRlcyArIG9mZnNldCwgJmJpZ3NpemUsIHNpemVvZihiaWdzaXplKSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKGJpZ3NpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ5dGVzICsgb2Zmc2V0LCBjZXJ0X2NoYWluW2ldLmRhdGEoKSwgY2VydHNpemUpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IGNlcnRzaXplOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVCeXRlQXJyYXkoYnl0ZXNpemUsIGJ5dGVzKTsKLSAgICAgICAgZnJlZShieXRlcyk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihTdHJpbmcxNihob3N0bmFtZS5jX3N0cigpKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihTdHJpbmcxNihhdXRoX3R5cGUuY19zdHIoKSkpOwotCi0gICAgICAgIGludDMyX3QgcmVzdWx0OwotICAgICAgICBpZiAocmVtb3RlKCktPnRyYW5zYWN0KElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSkgIT0gTk9fRVJST1IKLSAgICAgICAgICAgICAgICB8fCByZXBseS5yZWFkRXhjZXB0aW9uQ29kZSgpIDwgMCB8fCByZXBseS5yZWFkSW50MzIoJnJlc3VsdCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiA1OyAvLyBTU0xfSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvU2VydmljZSwgImFuZHJvaWQubWVkaWEuSUF1ZGlvU2VydmljZSIpOwotCi0KLXN0YXRpYyBNdXRleCBnTmV0d29ya1RocmVhZExvY2s7Ci1zdGF0aWMgYmFzZTo6VGhyZWFkICpnTmV0d29ya1RocmVhZCA9IE5VTEw7Ci1zdGF0aWMgc2NvcGVkX3JlZnB0cjxTZlJlcXVlc3RDb250ZXh0PiBnUmVxQ29udGV4dDsKLXN0YXRpYyBzY29wZWRfcHRyPG5ldDo6TmV0d29ya0NoYW5nZU5vdGlmaWVyPiBnTmV0d29ya0NoYW5nZU5vdGlmaWVyOwotCi1ib29sIGxvZ01lc3NhZ2VIYW5kbGVyKAotICAgICAgICBpbnQgc2V2ZXJpdHksCi0gICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCi0gICAgICAgIGludCBsaW5lLAotICAgICAgICBzaXplX3QgbWVzc2FnZV9zdGFydCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICAgIGludCBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19WRVJCT1NFOwotICAgIHN3aXRjaChzZXZlcml0eSkgewotICAgIGNhc2UgbG9nZ2luZzo6TE9HX0ZBVEFMOgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19GQVRBTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfRVJST1JfUkVQT1JUOgotICAgIGNhc2UgbG9nZ2luZzo6TE9HX0VSUk9SOgotICAgICAgICBhbmRyb2lkU2V2ZXJpdHkgPSBBTkRST0lEX0xPR19FUlJPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsb2dnaW5nOjpMT0dfV0FSTklORzoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfV0FSTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYW5kcm9pZFNldmVyaXR5ID0gQU5EUk9JRF9MT0dfVkVSQk9TRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGFuZHJvaWRfcHJpbnRMb2coYW5kcm9pZFNldmVyaXR5LCAiY2hyb21pdW0tbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAgICAgICAgICAgICAiJXM6JWQ6ICVzIiwgZmlsZSwgbGluZSwgc3RyLmNfc3RyKCkpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RydWN0IEF1dG9Qcmlvcml0eVNhdmVyIHsKLSAgICBBdXRvUHJpb3JpdHlTYXZlcigpCi0gICAgICAgIDogbVRJRChhbmRyb2lkR2V0VGlkKCkpLAotICAgICAgICAgIG1QcmV2UHJpb3JpdHkoYW5kcm9pZEdldFRocmVhZFByaW9yaXR5KG1USUQpKSB7Ci0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShtVElELCBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCk7Ci0gICAgfQotCi0gICAgfkF1dG9Qcmlvcml0eVNhdmVyKCkgewotICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkobVRJRCwgbVByZXZQcmlvcml0eSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHBpZF90IG1USUQ7Ci0gICAgaW50IG1QcmV2UHJpb3JpdHk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBdXRvUHJpb3JpdHlTYXZlcik7Ci19OwotCi1zdGF0aWMgdm9pZCBJbml0aWFsaXplTmV0d29ya1RocmVhZElmTmVjZXNzYXJ5KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnTmV0d29ya1RocmVhZExvY2spOwotCi0gICAgaWYgKGdOZXR3b3JrVGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIGFueSB0aHJlYWRzIHNwYXduZWQgYnkgdGhlIGNocm9taXVtIGZyYW1ld29yayBhcmUKLSAgICAgICAgLy8gcnVubmluZyBhdCBub3JtYWwgcHJpb3JpdHkgaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoaXMgdGhyZWFkJ3MuCi0gICAgICAgIEF1dG9Qcmlvcml0eVNhdmVyIHNhdmVyOwotCi0gICAgICAgIGdOZXR3b3JrVGhyZWFkID0gbmV3IGJhc2U6OlRocmVhZCgibmV0d29yayIpOwotICAgICAgICBiYXNlOjpUaHJlYWQ6Ok9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgb3B0aW9ucy5tZXNzYWdlX2xvb3BfdHlwZSA9IE1lc3NhZ2VMb29wOjpUWVBFX0lPOwotICAgICAgICBDSEVDSyhnTmV0d29ya1RocmVhZC0+U3RhcnRXaXRoT3B0aW9ucyhvcHRpb25zKSk7Ci0KLSAgICAgICAgZ1JlcUNvbnRleHQgPSBuZXcgU2ZSZXF1ZXN0Q29udGV4dDsKLQotICAgICAgICBnTmV0d29ya0NoYW5nZU5vdGlmaWVyLnJlc2V0KG5ldDo6TmV0d29ya0NoYW5nZU5vdGlmaWVyOjpDcmVhdGUoKSk7Ci0KLSAgICAgICAgbmV0OjpBbmRyb2lkTmV0d29ya0xpYnJhcnk6OlJlZ2lzdGVyU2hhcmVkSW5zdGFuY2UoCi0gICAgICAgICAgICAgICAgbmV3IFNmTmV0d29ya0xpYnJhcnkpOwotICAgICAgICBsb2dnaW5nOjpTZXRMb2dNZXNzYWdlSGFuZGxlcihsb2dNZXNzYWdlSGFuZGxlcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBNWV9MT0dJKGNvbnN0IGNoYXIgKnMpIHsKLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsICIlcyIsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBNWV9MT0dWKGNvbnN0IGNoYXIgKnMpIHsKLSNpZiAhZGVmaW5lZChMT0dfTkRFQlVHKSB8fCBMT0dfTkRFQlVHID09IDAKLSAgICBMT0dfUFJJKEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsICIlcyIsIHMpOwotI2VuZGlmCi19Ci0KLVNmTmV0TG9nOjpTZk5ldExvZygpCi0gICAgOiBtTmV4dElEKDEpIHsKLX0KLQotdm9pZCBTZk5ldExvZzo6QWRkRW50cnkoCi0gICAgICAgIEV2ZW50VHlwZSB0eXBlLAotICAgICAgICBjb25zdCBiYXNlOjpUaW1lVGlja3MgJnRpbWUsCi0gICAgICAgIGNvbnN0IFNvdXJjZSAmc291cmNlLAotICAgICAgICBFdmVudFBoYXNlIHBoYXNlLAotICAgICAgICBFdmVudFBhcmFtZXRlcnMgKnBhcmFtcykgewotI2lmIDAKLSAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiQWRkRW50cnkgdGltZT0lcyB0eXBlPSVzIHNvdXJjZT0lcyBwaGFzZT0lc1xuIiwKLSAgICAgICAgICAgICAgICBUaWNrQ291bnRUb1N0cmluZyh0aW1lKS5jX3N0cigpLAotICAgICAgICAgICAgICAgIEV2ZW50VHlwZVRvU3RyaW5nKHR5cGUpLAotICAgICAgICAgICAgICAgIFNvdXJjZVR5cGVUb1N0cmluZyhzb3VyY2UudHlwZSksCi0gICAgICAgICAgICAgICAgRXZlbnRQaGFzZVRvU3RyaW5nKHBoYXNlKSkuY19zdHIoKSk7Ci0jZW5kaWYKLX0KLQotdWludDMyIFNmTmV0TG9nOjpOZXh0SUQoKSB7Ci0gICAgcmV0dXJuIG1OZXh0SUQrKzsKLX0KLQotbmV0OjpOZXRMb2c6OkxvZ0xldmVsIFNmTmV0TG9nOjpHZXRMb2dMZXZlbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gTE9HX0JBU0lDOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1TZlJlcXVlc3RDb250ZXh0OjpTZlJlcXVlc3RDb250ZXh0KCkgewotICAgIG1Vc2VyQWdlbnQgPSBNYWtlVXNlckFnZW50KCkuY19zdHIoKTsKLQotICAgIHNldF9uZXRfbG9nKG5ldyBTZk5ldExvZygpKTsKLQotICAgIHNldF9ob3N0X3Jlc29sdmVyKAotICAgICAgICBuZXQ6OkNyZWF0ZVN5c3RlbUhvc3RSZXNvbHZlcigKLSAgICAgICAgICAgICAgICBuZXQ6Okhvc3RSZXNvbHZlcjo6a0RlZmF1bHRQYXJhbGxlbGlzbSwKLSAgICAgICAgICAgICAgICBOVUxMIC8qIHJlc29sdmVyX3Byb2MgKi8sCi0gICAgICAgICAgICAgICAgbmV0X2xvZygpKSk7Ci0KLSAgICBzZXRfc3NsX2NvbmZpZ19zZXJ2aWNlKAotICAgICAgICBuZXQ6OlNTTENvbmZpZ1NlcnZpY2U6OkNyZWF0ZVN5c3RlbVNTTENvbmZpZ1NlcnZpY2UoKSk7Ci0KLSAgICBtUHJveHlDb25maWdTZXJ2aWNlID0gbmV3IG5ldDo6UHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZDsKLQotICAgIHNldF9wcm94eV9zZXJ2aWNlKG5ldDo6UHJveHlTZXJ2aWNlOjpDcmVhdGVXaXRob3V0UHJveHlSZXNvbHZlcigKLSAgICAgICAgbVByb3h5Q29uZmlnU2VydmljZSwgbmV0X2xvZygpKSk7Ci0KLSAgICBzZXRfaHR0cF90cmFuc2FjdGlvbl9mYWN0b3J5KG5ldyBuZXQ6Okh0dHBDYWNoZSgKLSAgICAgICAgICAgIGhvc3RfcmVzb2x2ZXIoKSwKLSAgICAgICAgICAgIG5ldyBuZXQ6OkNlcnRWZXJpZmllcigpLAotICAgICAgICAgICAgZG5zcnJfcmVzb2x2ZXIoKSwKLSAgICAgICAgICAgIGRuc19jZXJ0X2NoZWNrZXIoKSwKLSAgICAgICAgICAgIHByb3h5X3NlcnZpY2UoKSwKLSAgICAgICAgICAgIHNzbF9jb25maWdfc2VydmljZSgpLAotICAgICAgICAgICAgbmV0OjpIdHRwQXV0aEhhbmRsZXJGYWN0b3J5OjpDcmVhdGVEZWZhdWx0KGhvc3RfcmVzb2x2ZXIoKSksCi0gICAgICAgICAgICBuZXR3b3JrX2RlbGVnYXRlKCksCi0gICAgICAgICAgICBuZXRfbG9nKCksCi0gICAgICAgICAgICBOVUxMKSk7ICAvLyBiYWNrZW5kX2ZhY3RvcnkKLQotICAgIHNldF9jb29raWVfc3RvcmUobmV3IG5ldDo6Q29va2llTW9uc3RlcihOVUxMLCBOVUxMKSk7Ci19Ci0KLWNvbnN0IHN0ZDo6c3RyaW5nICZTZlJlcXVlc3RDb250ZXh0OjpHZXRVc2VyQWdlbnQoY29uc3QgR1VSTCAmdXJsKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Vc2VyQWdlbnQ7Ci19Ci0KLXN0YXR1c190IFNmUmVxdWVzdENvbnRleHQ6OnVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQzMl90IHBvcnQsIGNvbnN0IGNoYXIgKmV4Y2x1c2lvbkxpc3QpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVByb3h5Q29uZmlnTG9jayk7Ci0KLSAgICBpZiAoaG9zdCA9PSBOVUxMIHx8ICpob3N0ID09ICdcMCcpIHsKLSAgICAgICAgTVlfTE9HVigidXBkYXRlUHJveHlDb25maWcgTlVMTCIpOwotCi0gICAgICAgIHN0ZDo6c3RyaW5nIHByb3h5OwotICAgICAgICBzdGQ6OnN0cmluZyBleExpc3Q7Ci0gICAgICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UtPlVwZGF0ZVByb3h5U2V0dGluZ3MocHJveHksIGV4TGlzdCk7Ci0gICAgfSBlbHNlIHsKLSNpZiAhZGVmaW5lZChMT0dfTkRFQlVHKSB8fCBMT0dfTkRFQlVHID09IDAKLSAgICAgICAgTE9HX1BSSShBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLAotICAgICAgICAgICAgICAgICJ1cGRhdGVQcm94eUNvbmZpZyAlczolZCwgZXhjbHVkZSAnJXMnIiwKLSAgICAgICAgICAgICAgICBob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLSNlbmRpZgotCi0gICAgICAgIHN0ZDo6c3RyaW5nIHByb3h5ID0gU3RyaW5nUHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpLmNfc3RyKCk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGV4TGlzdCA9IGV4Y2x1c2lvbkxpc3Q7Ci0gICAgICAgIG1Qcm94eUNvbmZpZ1NlcnZpY2UtPlVwZGF0ZVByb3h5U2V0dGluZ3MocHJveHksIGV4TGlzdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1TZk5ldHdvcmtMaWJyYXJ5OjpTZk5ldHdvcmtMaWJyYXJ5KCkge30KLQotU2ZOZXR3b3JrTGlicmFyeTo6VmVyaWZ5UmVzdWx0IFNmTmV0d29ya0xpYnJhcnk6OlZlcmlmeVg1MDlDZXJ0Q2hhaW4oCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3RuYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXV0aF90eXBlKSB7Ci0KLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJhdWRpbyIpKTsKLSAgICBpZiAoYmluZGVyID09IDApIHsKLSAgICAgICAgQUxPR1coIlRocmVhZCBjYW5ub3QgY29ubmVjdCB0byB0aGUgYXVkaW8gc2VydmljZSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPElBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9TZXJ2aWNlPihiaW5kZXIpOwotICAgICAgICBpbnQgY29kZSA9IHNlcnZpY2UtPnZlcmlmeVg1MDlDZXJ0Q2hhaW4oY2VydF9jaGFpbiwgaG9zdG5hbWUsIGF1dGhfdHlwZSk7Ci0gICAgICAgIEFMT0dWKCJ2ZXJpZmllZDogJWQiLCBjb2RlKTsKLSAgICAgICAgaWYgKGNvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBWRVJJRllfT0s7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAyKSB7IC8vIFNTTF9JRE1JU01BVENICi0gICAgICAgICAgICByZXR1cm4gVkVSSUZZX0JBRF9IT1NUTkFNRTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDMpIHsgLy8gU1NMX1VOVFJVU1RFRAotICAgICAgICAgICAgcmV0dXJuIFZFUklGWV9OT19UUlVTVEVEX1JPT1Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZFUklGWV9JTlZPQ0FUSU9OX0VSUk9SOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1TZkRlbGVnYXRlOjpTZkRlbGVnYXRlKCkKLSAgICA6IG1Pd25lcihOVUxMKSwKLSAgICAgIG1VUkxSZXF1ZXN0KE5VTEwpLAotICAgICAgbVJlYWRCdWZmZXIobmV3IG5ldDo6SU9CdWZmZXJXaXRoU2l6ZSg4MTkyKSksCi0gICAgICBtTnVtQnl0ZXNSZWFkKDApLAotICAgICAgbU51bUJ5dGVzVG90YWwoMCksCi0gICAgICBtRGF0YURlc3RpbmF0aW9uKE5VTEwpLAotICAgICAgbUF0RU9TKGZhbHNlKSB7Ci0gICAgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpOwotfQotCi1TZkRlbGVnYXRlOjp+U2ZEZWxlZ2F0ZSgpIHsKLSAgICBDSEVDSyhtVVJMUmVxdWVzdCA9PSBOVUxMKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBTZkRlbGVnYXRlOjpVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgSW5pdGlhbGl6ZU5ldHdvcmtUaHJlYWRJZk5lY2Vzc2FyeSgpOwotCi0gICAgcmV0dXJuIGdSZXFDb250ZXh0LT51cGRhdGVQcm94eUNvbmZpZyhob3N0LCBwb3J0LCBleGNsdXNpb25MaXN0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpzZXRPd25lcihDaHJvbWl1bUhUVFBEYXRhU291cmNlICpvd25lcikgewotICAgIG1Pd25lciA9IG93bmVyOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OnNldFVJRCh1aWRfdCB1aWQpIHsKLSAgICBnUmVxQ29udGV4dC0+c2V0VUlEKHVpZCk7Ci19Ci0KLWJvb2wgU2ZEZWxlZ2F0ZTo6Z2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0IHsKLSAgICByZXR1cm4gZ1JlcUNvbnRleHQtPmdldFVJRCh1aWQpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uUmVjZWl2ZWRSZWRpcmVjdCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgY29uc3QgR1VSTCAmbmV3X3VybCwgYm9vbCAqZGVmZXJfcmVkaXJlY3QpIHsKLSAgICBNWV9MT0dWKCJPblJlY2VpdmVkUmVkaXJlY3QiKTsKLSAgICBtT3duZXItPm9uUmVkaXJlY3QobmV3X3VybC5zcGVjKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25BdXRoUmVxdWlyZWQoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIG5ldDo6QXV0aENoYWxsZW5nZUluZm8gKmF1dGhfaW5mbykgewotICAgIE1ZX0xPR1YoIk9uQXV0aFJlcXVpcmVkIik7Ci0KLSAgICBpbmhlcml0ZWQ6Ok9uQXV0aFJlcXVpcmVkKHJlcXVlc3QsIGF1dGhfaW5mbyk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpTU0xDZXJ0UmVxdWVzdEluZm8gKmNlcnRfcmVxdWVzdF9pbmZvKSB7Ci0gICAgTVlfTE9HVigiT25DZXJ0aWZpY2F0ZVJlcXVlc3RlZCIpOwotCi0gICAgaW5oZXJpdGVkOjpPbkNlcnRpZmljYXRlUmVxdWVzdGVkKHJlcXVlc3QsIGNlcnRfcmVxdWVzdF9pbmZvKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblNTTENlcnRpZmljYXRlRXJyb3IoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBjZXJ0X2Vycm9yLCBuZXQ6Olg1MDlDZXJ0aWZpY2F0ZSAqY2VydCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT25TU0xDZXJ0aWZpY2F0ZUVycm9yIGNlcnRfZXJyb3I9JWRcbiIsIGNlcnRfZXJyb3IpOwotCi0gICAgaW5oZXJpdGVkOjpPblNTTENlcnRpZmljYXRlRXJyb3IocmVxdWVzdCwgY2VydF9lcnJvciwgY2VydCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6T25HZXRDb29raWVzKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgYm9vbCBibG9ja2VkX2J5X3BvbGljeSkgewotICAgIE1ZX0xPR1YoIk9uR2V0Q29va2llcyIpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uU2V0Q29va2llKAotICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb29raWVfbGluZSwKLSAgICAgICAgY29uc3QgbmV0OjpDb29raWVPcHRpb25zICZvcHRpb25zLAotICAgICAgICBib29sIGJsb2NrZWRfYnlfcG9saWN5KSB7Ci0gICAgTVlfTE9HVigiT25TZXRDb29raWUiKTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKLSAgICBpZiAocmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkgIT0gbmV0OjpVUkxSZXF1ZXN0U3RhdHVzOjpTVUNDRVNTKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgYW5kIG9zX2Vycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCksCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnN0YXR1cygpLm9zX2Vycm9yKCkpLmNfc3RyKCkpOwotCi0gICAgICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICAgICAgbVVSTFJlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIG1Pd25lci0+b25Db25uZWN0aW9uRmFpbGVkKEVSUk9SX0lPKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobVJhbmdlUmVxdWVzdGVkICYmIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpICE9IDIwNikgewotICAgICAgICBNWV9MT0dJKFN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIldlIHJlcXVlc3RlZCBhIGNvbnRlbnQgcmFuZ2UsIGJ1dCBzZXJ2ZXIgZGlkbid0ICIKLSAgICAgICAgICAgICAgICAgICAgInN1cHBvcnQgdGhhdC4gKHJlc3BvbmRlZCB3aXRoICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPkdldFJlc3BvbnNlQ29kZSgpKS5jX3N0cigpKTsKLQotICAgICAgICBkZWxldGUgbVVSTFJlcXVlc3Q7Ci0gICAgICAgIG1VUkxSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBtT3duZXItPm9uQ29ubmVjdGlvbkZhaWxlZCgtRVBJUEUpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICgocmVxdWVzdC0+R2V0UmVzcG9uc2VDb2RlKCkgLyAxMDApICE9IDIpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggaHR0cCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUNvZGUoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgZGVsZXRlIG1VUkxSZXF1ZXN0OwotICAgICAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICAgICAgbU93bmVyLT5vbkNvbm5lY3Rpb25GYWlsZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTVlfTE9HVigiT25SZXNwb25zZVN0YXJ0ZWQiKTsKLQotICAgIHN0ZDo6c3RyaW5nIGhlYWRlcnM7Ci0gICAgcmVxdWVzdC0+R2V0QWxsUmVzcG9uc2VIZWFkZXJzKCZoZWFkZXJzKTsKLQotICAgIE1ZX0xPR1YoU3RyaW5nUHJpbnRmKCJyZXNwb25zZSBoZWFkZXJzOiAlcyIsIGhlYWRlcnMuY19zdHIoKSkuY19zdHIoKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZTsKLSAgICByZXF1ZXN0LT5HZXRSZXNwb25zZUhlYWRlckJ5TmFtZSgiQ29udGVudC1UeXBlIiwgJmNvbnRlbnRUeXBlKTsKLQotICAgIG1Pd25lci0+b25Db25uZWN0aW9uRXN0YWJsaXNoZWQoCi0gICAgICAgICAgICByZXF1ZXN0LT5HZXRFeHBlY3RlZENvbnRlbnRTaXplKCksIGNvbnRlbnRUeXBlLmNfc3RyKCkpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Ok9uUmVhZENvbXBsZXRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGludCBieXRlc19yZWFkKSB7Ci0gICAgaWYgKGJ5dGVzX3JlYWQgPT0gLTEpIHsKLSAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICJPblJlYWRDb21wbGV0ZWQsIHJlYWQgZmFpbGVkLCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTVlfTE9HVihTdHJpbmdQcmludGYoIk9uUmVhZENvbXBsZXRlZCwgcmVhZCAlZCBieXRlcyIsIGJ5dGVzX3JlYWQpLmNfc3RyKCkpOwotCi0gICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgICAgIE1ZX0xPR0koU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiUmVhZCBmYWlsZWQgdy8gc3RhdHVzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSkuY19zdHIoKSk7Ci0KLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoRVJST1JfSU8pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChieXRlc19yZWFkID09IDApIHsKLSAgICAgICAgbUF0RU9TID0gdHJ1ZTsKLSAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQobU51bUJ5dGVzUmVhZCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDSEVDS19HVChieXRlc19yZWFkLCAwKTsKLSAgICBDSEVDS19MRShtTnVtQnl0ZXNSZWFkICsgYnl0ZXNfcmVhZCwgbU51bUJ5dGVzVG90YWwpOwotCi0gICAgbWVtY3B5KCh1aW50OF90ICopbURhdGFEZXN0aW5hdGlvbiArIG1OdW1CeXRlc1JlYWQsCi0gICAgICAgICAgIG1SZWFkQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgIGJ5dGVzX3JlYWQpOwotCi0gICAgbU51bUJ5dGVzUmVhZCArPSBieXRlc19yZWFkOwotCi0gICAgcmVhZE1vcmUocmVxdWVzdCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6cmVhZE1vcmUobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KSB7Ci0gICAgd2hpbGUgKG1OdW1CeXRlc1JlYWQgPCBtTnVtQnl0ZXNUb3RhbCkgewotICAgICAgICBzaXplX3QgY29weSA9IG1OdW1CeXRlc1RvdGFsIC0gbU51bUJ5dGVzUmVhZDsKLSAgICAgICAgaWYgKGNvcHkgPiBtUmVhZEJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBjb3B5ID0gbVJlYWRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBuOwotICAgICAgICBpZiAocmVxdWVzdC0+UmVhZChtUmVhZEJ1ZmZlciwgY29weSwgJm4pKSB7Ci0gICAgICAgICAgICBNWV9MT0dWKFN0cmluZ1ByaW50ZigiUmVhZCAlZCBieXRlcyBkaXJlY3RseS4iLCBuKS5jX3N0cigpKTsKLQotICAgICAgICAgICAgQ0hFQ0tfTEUoKHNpemVfdCluLCBjb3B5KTsKLQotICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopbURhdGFEZXN0aW5hdGlvbiArIG1OdW1CeXRlc1JlYWQsCi0gICAgICAgICAgICAgICAgICAgbVJlYWRCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICBuKTsKLQotICAgICAgICAgICAgbU51bUJ5dGVzUmVhZCArPSBuOwotCi0gICAgICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF0RU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1ZX0xPR1YoInJlYWRNb3JlIHBlbmRpbmcgcmVhZCIpOwotCi0gICAgICAgICAgICBpZiAocmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkgIT0gbmV0OjpVUkxSZXF1ZXN0U3RhdHVzOjpJT19QRU5ESU5HKSB7Ci0gICAgICAgICAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdCByZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQoRVJST1JfSU8pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbU93bmVyLT5vblJlYWRDb21wbGV0ZWQobU51bUJ5dGVzUmVhZCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVDb25uZWN0aW9uKAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IG9mZnNldCkgewotICAgIEdVUkwgdXJsKHVyaSk7Ci0KLSAgICBNZXNzYWdlTG9vcCAqbG9vcCA9IGdOZXR3b3JrVGhyZWFkLT5tZXNzYWdlX2xvb3AoKTsKLSAgICBsb29wLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIE5ld1J1bm5hYmxlRnVuY3Rpb24oCi0gICAgICAgICAgICAgICAgJlNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlciwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIHVybCwKLSAgICAgICAgICAgICAgICBoZWFkZXJzLAotICAgICAgICAgICAgICAgIG9mZnNldCkpOwotCi19Ci0KLS8vIHN0YXRpYwotdm9pZCBTZkRlbGVnYXRlOjpPbkluaXRpYXRlQ29ubmVjdGlvbldyYXBwZXIoCi0gICAgICAgIFNmRGVsZWdhdGUgKm1lLCBHVVJMIHVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgbWUtPm9uSW5pdGlhdGVDb25uZWN0aW9uKHVybCwgaGVhZGVycywgb2Zmc2V0KTsKLX0KLQotdm9pZCBTZkRlbGVnYXRlOjpvbkluaXRpYXRlQ29ubmVjdGlvbigKLSAgICAgICAgY29uc3QgR1VSTCAmdXJsLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqZXh0cmEsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgQ0hFQ0sobVVSTFJlcXVlc3QgPT0gTlVMTCk7Ci0KLSAgICBtVVJMUmVxdWVzdCA9IG5ldyBuZXQ6OlVSTFJlcXVlc3QodXJsLCB0aGlzKTsKLSAgICBtQXRFT1MgPSBmYWxzZTsKLQotICAgIG1SYW5nZVJlcXVlc3RlZCA9IGZhbHNlOwotCi0gICAgaWYgKG9mZnNldCAhPSAwIHx8IGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnMgaGVhZGVycyA9Ci0gICAgICAgICAgICBtVVJMUmVxdWVzdC0+ZXh0cmFfcmVxdWVzdF9oZWFkZXJzKCk7Ci0KLSAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7Ci0gICAgICAgICAgICBoZWFkZXJzLkFkZEhlYWRlckZyb21TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUmFuZ2U6IGJ5dGVzPSVsbGQtIiwgb2Zmc2V0KS5jX3N0cigpKTsKLQotICAgICAgICAgICAgbVJhbmdlUmVxdWVzdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHRyYSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV4dHJhLT5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIEFTdHJpbmcgczsKLSAgICAgICAgICAgICAgICBzLmFwcGVuZChleHRyYS0+a2V5QXQoaSkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKCI6ICIpOwotICAgICAgICAgICAgICAgIHMuYXBwZW5kKGV4dHJhLT52YWx1ZUF0KGkpLnN0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGhlYWRlcnMuQWRkSGVhZGVyRnJvbVN0cmluZyhzLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbVVSTFJlcXVlc3QtPlNldEV4dHJhUmVxdWVzdEhlYWRlcnMoaGVhZGVycyk7Ci0gICAgfQotCi0gICAgbVVSTFJlcXVlc3QtPnNldF9jb250ZXh0KGdSZXFDb250ZXh0KTsKLQotICAgIG1VUkxSZXF1ZXN0LT5TdGFydCgpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6OmluaXRpYXRlRGlzY29ubmVjdCgpIHsKLSAgICBNZXNzYWdlTG9vcCAqbG9vcCA9IGdOZXR3b3JrVGhyZWFkLT5tZXNzYWdlX2xvb3AoKTsKLSAgICBsb29wLT5Qb3N0VGFzaygKLSAgICAgICAgICAgIEZST01fSEVSRSwKLSAgICAgICAgICAgIE5ld1J1bm5hYmxlRnVuY3Rpb24oCi0gICAgICAgICAgICAgICAgJlNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlciwgdGhpcykpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgU2ZEZWxlZ2F0ZTo6T25Jbml0aWF0ZURpc2Nvbm5lY3RXcmFwcGVyKFNmRGVsZWdhdGUgKm1lKSB7Ci0gICAgbWUtPm9uSW5pdGlhdGVEaXNjb25uZWN0KCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6b25Jbml0aWF0ZURpc2Nvbm5lY3QoKSB7Ci0gICAgaWYgKG1VUkxSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1VUkxSZXF1ZXN0LT5DYW5jZWwoKTsKLQotICAgIGRlbGV0ZSBtVVJMUmVxdWVzdDsKLSAgICBtVVJMUmVxdWVzdCA9IE5VTEw7Ci0KLSAgICBtT3duZXItPm9uRGlzY29ubmVjdENvbXBsZXRlKCk7Ci19Ci0KLXZvaWQgU2ZEZWxlZ2F0ZTo6aW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgTWVzc2FnZUxvb3AgKmxvb3AgPSBnTmV0d29ya1RocmVhZC0+bWVzc2FnZV9sb29wKCk7Ci0gICAgbG9vcC0+UG9zdFRhc2soCi0gICAgICAgICAgICBGUk9NX0hFUkUsCi0gICAgICAgICAgICBOZXdSdW5uYWJsZUZ1bmN0aW9uKAotICAgICAgICAgICAgICAgICZTZkRlbGVnYXRlOjpPbkluaXRpYXRlUmVhZFdyYXBwZXIsIHRoaXMsIGRhdGEsIHNpemUpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIFNmRGVsZWdhdGU6Ok9uSW5pdGlhdGVSZWFkV3JhcHBlcigKLSAgICAgICAgU2ZEZWxlZ2F0ZSAqbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgbWUtPm9uSW5pdGlhdGVSZWFkKGRhdGEsIHNpemUpOwotfQotCi12b2lkIFNmRGVsZWdhdGU6Om9uSW5pdGlhdGVSZWFkKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0sobVVSTFJlcXVlc3QgIT0gTlVMTCk7Ci0KLSAgICBtTnVtQnl0ZXNSZWFkID0gMDsKLSAgICBtTnVtQnl0ZXNUb3RhbCA9IHNpemU7Ci0gICAgbURhdGFEZXN0aW5hdGlvbiA9IGRhdGE7Ci0KLSAgICBpZiAobUF0RU9TKSB7Ci0gICAgICAgIG1Pd25lci0+b25SZWFkQ29tcGxldGVkKDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVhZE1vcmUobVVSTFJlcXVlc3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzVhMWQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNVUFBPUlRfSF8KLQotI2RlZmluZSBTVVBQT1JUX0hfCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgIm5ldC9iYXNlL25ldF9sb2cuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfY29udGV4dC5oIgotI2luY2x1ZGUgIm5ldC9iYXNlL2FuZHJvaWRfbmV0d29ya19saWJyYXJ5LmgiCi0jaW5jbHVkZSAibmV0L2Jhc2UvaW9fYnVmZmVyLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgbmV0IHsKLSAgICBzdHJ1Y3QgUHJveHlDb25maWdTZXJ2aWNlQW5kcm9pZDsKLX07Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFNmTmV0TG9nIDogcHVibGljIG5ldDo6TmV0TG9nIHsKLSAgICBTZk5ldExvZygpOwotCi0gICAgdmlydHVhbCB2b2lkIEFkZEVudHJ5KAotICAgICAgICAgICAgRXZlbnRUeXBlIHR5cGUsCi0gICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lVGlja3MgJnRpbWUsCi0gICAgICAgICAgICBjb25zdCBTb3VyY2UgJnNvdXJjZSwKLSAgICAgICAgICAgIEV2ZW50UGhhc2UgcGhhc2UsCi0gICAgICAgICAgICBFdmVudFBhcmFtZXRlcnMgKnBhcmFtcyk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMiBOZXh0SUQoKTsKLSAgICB2aXJ0dWFsIExvZ0xldmVsIEdldExvZ0xldmVsKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyIG1OZXh0SUQ7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZk5ldExvZyk7Ci19OwotCi1zdHJ1Y3QgU2ZSZXF1ZXN0Q29udGV4dCA6IHB1YmxpYyBuZXQ6OlVSTFJlcXVlc3RDb250ZXh0IHsKLSAgICBTZlJlcXVlc3RDb250ZXh0KCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nICZHZXRVc2VyQWdlbnQoY29uc3QgR1VSTCAmdXJsKSBjb25zdDsKLQotICAgIHN0YXR1c190IHVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtUHJveHlDb25maWdMb2NrOwotCi0gICAgc3RkOjpzdHJpbmcgbVVzZXJBZ2VudDsKLSAgICBuZXQ6OlByb3h5Q29uZmlnU2VydmljZUFuZHJvaWQgKm1Qcm94eUNvbmZpZ1NlcnZpY2U7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZlJlcXVlc3RDb250ZXh0KTsKLX07Ci0KLS8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGh0dHBzIHN1cHBvcnQsIHdlIGRvbid0IHJlYWxseSB2ZXJpZnkgY2VydGlmaWNhdGVzLAotLy8gd2UgYWNjZXB0IGFueXRoaW5nLi4uCi1zdHJ1Y3QgU2ZOZXR3b3JrTGlicmFyeSA6IHB1YmxpYyBuZXQ6OkFuZHJvaWROZXR3b3JrTGlicmFyeSB7Ci0gICAgU2ZOZXR3b3JrTGlicmFyeSgpOwotCi0gICAgdmlydHVhbCBWZXJpZnlSZXN1bHQgVmVyaWZ5WDUwOUNlcnRDaGFpbigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY2VydF9jaGFpbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0bmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdXRoX3R5cGUpOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0d29ya0xpYnJhcnkpOwotfTsKLQotc3RydWN0IENocm9taXVtSFRUUERhdGFTb3VyY2U7Ci0KLXN0cnVjdCBTZkRlbGVnYXRlIDogcHVibGljIG5ldDo6VVJMUmVxdWVzdDo6RGVsZWdhdGUgewotICAgIFNmRGVsZWdhdGUoKTsKLSAgICB2aXJ0dWFsIH5TZkRlbGVnYXRlKCk7Ci0KLSAgICB2b2lkIGluaXRpYXRlQ29ubmVjdGlvbigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgdm9pZCBpbml0aWF0ZURpc2Nvbm5lY3QoKTsKLSAgICB2b2lkIGluaXRpYXRlUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2b2lkIHNldE93bmVyKENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcik7Ci0KLSAgICAvLyBHZXRzIHRoZSBVSUQgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcwotICAgIGJvb2wgZ2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblJlY2VpdmVkUmVkaXJlY3QoCi0gICAgICAgICAgICBuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QsIGNvbnN0IEdVUkwgJm5ld191cmwsIGJvb2wgKmRlZmVyX3JlZGlyZWN0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPbkF1dGhSZXF1aXJlZCgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgbmV0OjpBdXRoQ2hhbGxlbmdlSW5mbyAqYXV0aF9pbmZvKTsKLQotICAgIHZpcnR1YWwgdm9pZCBPbkNlcnRpZmljYXRlUmVxdWVzdGVkKAotICAgICAgICAgICAgbmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBuZXQ6OlNTTENlcnRSZXF1ZXN0SW5mbyAqY2VydF9yZXF1ZXN0X2luZm8pOwotCi0gICAgdmlydHVhbCB2b2lkIE9uU1NMQ2VydGlmaWNhdGVFcnJvcigKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGNlcnRfZXJyb3IsIG5ldDo6WDUwOUNlcnRpZmljYXRlICpjZXJ0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPbkdldENvb2tpZXMobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0LCBib29sIGJsb2NrZWRfYnlfcG9saWN5KTsKLQotICAgIHZpcnR1YWwgdm9pZCBPblNldENvb2tpZSgKLSAgICAgICAgICAgIG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb29raWVfbGluZSwKLSAgICAgICAgICAgIGNvbnN0IG5ldDo6Q29va2llT3B0aW9ucyAmb3B0aW9ucywKLSAgICAgICAgICAgIGJvb2wgYmxvY2tlZF9ieV9wb2xpY3kpOwotCi0gICAgdmlydHVhbCB2b2lkIE9uUmVzcG9uc2VTdGFydGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgT25SZWFkQ29tcGxldGVkKG5ldDo6VVJMUmVxdWVzdCAqcmVxdWVzdCwgaW50IGJ5dGVzX3JlYWQpOwotCi0gICAgc3RhdGljIHN0YXR1c190IFVwZGF0ZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotcHJpdmF0ZToKLSAgICB0eXBlZGVmIERlbGVnYXRlIGluaGVyaXRlZDsKLQotICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UgKm1Pd25lcjsKLQotICAgIG5ldDo6VVJMUmVxdWVzdCAqbVVSTFJlcXVlc3Q7Ci0gICAgc2NvcGVkX3JlZnB0cjxuZXQ6OklPQnVmZmVyV2l0aFNpemU+IG1SZWFkQnVmZmVyOwotCi0gICAgc2l6ZV90IG1OdW1CeXRlc1JlYWQ7Ci0gICAgc2l6ZV90IG1OdW1CeXRlc1RvdGFsOwotICAgIHZvaWQgKm1EYXRhRGVzdGluYXRpb247Ci0KLSAgICBib29sIG1SYW5nZVJlcXVlc3RlZDsKLSAgICBib29sIG1BdEVPUzsKLQotICAgIHZvaWQgcmVhZE1vcmUobmV0OjpVUkxSZXF1ZXN0ICpyZXF1ZXN0KTsKLQotICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVDb25uZWN0aW9uV3JhcHBlcigKLSAgICAgICAgICAgIFNmRGVsZWdhdGUgKm1lLAotICAgICAgICAgICAgR1VSTCB1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyB2b2lkIE9uSW5pdGlhdGVEaXNjb25uZWN0V3JhcHBlcihTZkRlbGVnYXRlICptZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBPbkluaXRpYXRlUmVhZFdyYXBwZXIoCi0gICAgICAgICAgICBTZkRlbGVnYXRlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBvbkluaXRpYXRlQ29ubmVjdGlvbigKLSAgICAgICAgICAgIGNvbnN0IEdVUkwgJnVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgdm9pZCBvbkluaXRpYXRlRGlzY29ubmVjdCgpOwotICAgIHZvaWQgb25Jbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ZEZWxlZ2F0ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNVUFBPUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwX3N0dWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDhhODc4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHBfc3R1Yi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGJvb2wgZ0ZpcnN0ID0gdHJ1ZTsKLXN0YXRpYyB2b2lkICpnSGFuZGxlOwotc3RhdGljIE11dGV4IGdMaWJNdXRleDsKLQotSFRUUEJhc2UgKigqZ0xpYl9jcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlKSh1aW50MzJfdCBmbGFncyk7Ci1EYXRhU291cmNlICooKmdMaWJfY3JlYXRlRGF0YVVyaVNvdXJjZSkoY29uc3QgY2hhciAqdXJpKTsKLQotc3RhdHVzX3QgKCpnTGliX1VwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZykoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXN0YXRpYyBib29sIGxvYWRfbGlic3RhZ2VmcmlnaHRfY2hyb21pdW1faHR0cCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ0xpYk11dGV4KTsKLSAgICB2b2lkICpzeW07Ci0KLSAgICBpZiAoIWdGaXJzdCkgewotICAgICAgICByZXR1cm4gKGdIYW5kbGUgIT0gTlVMTCk7Ci0gICAgfQotCi0gICAgZ0ZpcnN0ID0gZmFsc2U7Ci0KLSAgICBnSGFuZGxlID0gZGxvcGVuKCJsaWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwLnNvIiwgUlRMRF9OT1cpOwotICAgIGlmIChnSGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN5bSA9IGRsc3ltKGdIYW5kbGUsICJjcmVhdGVDaHJvbWl1bUhUVFBEYXRhU291cmNlIik7Ci0gICAgaWYgKHN5bSA9PSBOVUxMKSB7Ci0gICAgICAgIGdIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGdMaWJfY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSA9IChIVFRQQmFzZSAqKCopKHVpbnQzMl90KSlzeW07Ci0KLSAgICBzeW0gPSBkbHN5bShnSGFuZGxlLCAiY3JlYXRlRGF0YVVyaVNvdXJjZSIpOwotICAgIGlmIChzeW0gPT0gTlVMTCkgewotICAgICAgICBnSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBnTGliX2NyZWF0ZURhdGFVcmlTb3VyY2UgPSAoRGF0YVNvdXJjZSAqKCopKGNvbnN0IGNoYXIgKikpc3ltOwotCi0gICAgc3ltID0gZGxzeW0oZ0hhbmRsZSwgIlVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZyIpOwotICAgIGlmIChzeW0gPT0gTlVMTCkgewotICAgICAgICBnSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBnTGliX1VwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZyA9Ci0gICAgICAgIChzdGF0dXNfdCAoKikoY29uc3QgY2hhciAqLCBpbnQzMl90LCBjb25zdCBjaGFyICopKXN5bTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1IVFRQQmFzZSAqY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncykgewotICAgIGlmICghbG9hZF9saWJzdGFnZWZyaWdodF9jaHJvbWl1bV9odHRwKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdMaWJfY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZShmbGFncyk7Ci19Ci0KLXN0YXR1c190IFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KSB7Ci0gICAgaWYgKCFsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIGdMaWJfVXBkYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZVByb3h5Q29uZmlnKAotICAgICAgICAgICAgaG9zdCwgcG9ydCwgZXhjbHVzaW9uTGlzdCk7Ci19Ci0KLURhdGFTb3VyY2UgKmNyZWF0ZURhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKSB7Ci0gICAgaWYgKCFsb2FkX2xpYnN0YWdlZnJpZ2h0X2Nocm9taXVtX2h0dHAoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ0xpYl9jcmVhdGVEYXRhVXJpU291cmNlKHVyaSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5tawppbmRleCBmZmE2NGY5Li5hZmIwMGFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLm1rCkBAIC0zLDcgKzMsOCBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgICBTb2Z0QUFDMi5jcHAKKyAgICAgIFNvZnRBQUMyLmNwcCBcCisgICAgICBEcmNQcmVzTW9kZVdyYXAuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKQEAgLTE3LDYgKzE4LDggQEAKIAogTE9DQUxfQ0ZMQUdTIDo9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliRnJhdW5ob2ZlckFBQwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlhZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExPR19UQUcgIlNvZnRBQUMyX0RyY1dyYXBwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vI2RlZmluZSBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKworI2RlZmluZSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA2NAorCitDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisKKyAgICAvKiBEYXRhIGZyb20gc3RyZWFtSW5mby4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbVN0cmVhbVBSTCA9IC0xOworICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IC0xOworICAgIG1TdHJlYW1OckFBQ0NoYW4gPSAwOworICAgIG1TdHJlYW1Ock91dENoYW4gPSAwOworCisgICAgLyogRGVzaXJlZCB2YWx1ZXMgKHNldCBieSB1c2VyKS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbURlc1RhcmdldCA9IC0xOworICAgIG1EZXNBdHRGYWN0b3IgPSAwOworICAgIG1EZXNCb29zdEZhY3RvciA9IDA7CisgICAgbURlc0hlYXZ5ID0gMDsKKworICAgIG1FbmNvZGVyVGFyZ2V0ID0gLTE7CisKKyAgICAvKiBWYWx1ZXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBkZXNpcmVkIHZhbHVlcyAqLworICAgIG1MYXN0VGFyZ2V0ID0gLTE7CisgICAgbUxhc3RBdHRGYWN0b3IgPSAwOworICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSAwOworICAgIG1MYXN0SGVhdnkgPSAwOworfQorCitDRHJjUHJlc01vZGVXcmFwcGVyOjp+Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKQoreworICAgIG1IYW5kbGVEZWNvZGVyID0gaGFuZGxlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKiBwU3RyZWFtSW5mbykKK3sKKyAgICBhc3NlcnQocFN0cmVhbUluZm8pOworCisgICAgaWYgKG1TdHJlYW1QUkwgIT0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYpIHsKKyAgICAgICAgbVN0cmVhbVBSTCA9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2OworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJvZ1JlZkxldiBpcyAlZFxuIiwgbVN0cmVhbVBSTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbURSQ1ByZXNNb2RlICE9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSkgeworICAgICAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGU7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcmVzTW9kZSBpcyAlZFxuIiwgbVN0cmVhbURSQ1ByZXNNb2RlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuICE9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJBQUNDaGFuID0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogYWFjTnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1OckFBQ0NoYW4pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW4gIT0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1Ock91dENoYW4gPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBudW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yT3V0Q2hhbik7CisjZW5kaWYKKyAgICB9CisKKworCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW48bVN0cmVhbU5yQUFDQ2hhbikgeworICAgICAgICBtSXNEb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNEb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgKG1TdHJlYW1Ock91dENoYW4gPT0gMSkpIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgbVN0cmVhbU5yT3V0Q2hhbiA9PSAyKXsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IGZhbHNlOworICAgIH0KKworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQ6CisgICAgICAgIG1EZXNUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SOgorICAgICAgICBtRGVzQXR0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SOgorICAgICAgICBtRGVzQm9vc3RGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWToKKyAgICAgICAgbURlc0hlYXZ5ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUOgorICAgICAgICBtRW5jb2RlclRhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjp1cGRhdGUoKQoreworICAgIC8vIEdldCBEYXRhIGZyb20gRGVjb2RlcgorICAgIGludCBwcm9nUmVmTGV2ZWwgPSBtU3RyZWFtUFJMOworICAgIGludCBkcmNQcmVzTW9kZSA9IG1TdHJlYW1EUkNQcmVzTW9kZTsKKworICAgIC8vIGJ5IGRlZmF1bHQsIGRvIGFzIGRlc2lyZWQKKyAgICBpbnQgbmV3VGFyZ2V0ICAgICAgICAgPSBtRGVzVGFyZ2V0OworICAgIGludCBuZXdBdHRGYWN0b3IgICAgICA9IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG5ld0Jvb3N0RmFjdG9yICAgID0gbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKKworICAgIGlmIChtRGF0YVVwZGF0ZSkgeworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xNiBkQiBvciBiZWxvdworICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nLCBjYWxjdWxhdGVkIHNjYWxpbmcgb2YgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBhcyBsaXR0bGUgY29tcHJlc3Npb24gYXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgPCBtRGVzVGFyZ2V0KSB7IC8vIGlmIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsY0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYWxjRmFjdG9yX25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMC4wZiA8IGNhbGNGYWN0b3Jfbm9ybSA8IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoZmxvYXQpKG1EZXNUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobUVuY29kZXJUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3IgPSAoaW50KShjYWxjRmFjdG9yX25vcm0qMTI3LjBmKTsgLy8gMCA8PSBjYWxjRmFjdG9yIDwgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY0ZhY3RvciBpcyB0aGUgbG93ZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAoY2FsY0ZhY3Rvcj5uZXdBdHRGYWN0b3IpID8gY2FsY0ZhY3RvciA6IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgQXR0RmFjdG9yIHdpbGwgYmUgYWx3YXlzID0gY2FsY0ZhY3RvciwgYXMgaXQgaXMgc2V0IHRvIDAgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgbGV2ZWwgPiBtRW5jb2RlclRhcmdldCA+IFBSTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQ8OTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCOiBsaWdodCBEUkMgb25seSBuZWVkZWQgaWYgd2UgcGVyZm9ybSBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscworCisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgeworICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChkcmNQcmVzTW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDogLy8gcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsgLy8gYXQgbGVhc3QsIHVzZSBsaWdodCBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0IDwgOTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcmVzZW50YXRpb24gbW9kZSAxIGFuZCAyIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQ6CisgICAgICAgICAgICAvLyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyAoRFZCKTsgU3BlY2lmaWNhdGlvbiBmb3IgdGhlIHVzZSBvZiBWaWRlbyBhbmQgQXVkaW8gQ29kaW5nCisgICAgICAgICAgICAvLyBpbiBCcm9hZGNhc3RpbmcgQXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSwKKyAgICAgICAgICAgIC8vIHNlY3Rpb24gQy41LjQuLCAiRGVjb2RpbmciLCBhbmQgVGFibGUgQy4zMworICAgICAgICAgICAgLy8gSVNPIERSQyAgICAgICAgICAgIC0+IG5ld0hlYXZ5ID0gMCAgKFVzZSBsaWdodCBjb21wcmVzc2lvbiwgTVBFRy1zdHlsZSkKKyAgICAgICAgICAgIC8vIENvbXByZXNzaW9uX3ZhbHVlICAtPiBuZXdIZWF2eSA9IDEgIChVc2UgaGVhdnkgY29tcHJlc3Npb24sIERWQi1zdHlsZSkKKyAgICAgICAgICAgIC8vIHNjYWxpbmcgcmVzdHJpY3RlZCAtPiBuZXdBdHRGYWN0b3IgPSAxMjcKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjogLy8gcHJlc2VudGF0aW9uIG1vZGUgMiwgTGlnaHQ6LTIzL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc01vbm9Eb3dubWl4KSB7IC8vIGlmIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQorICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQorCisgICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgeworICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQorICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWNvZGVyCisgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbUxhc3RUYXJnZXQpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgbUxhc3RUYXJnZXQgPSBuZXdUYXJnZXQ7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1EZXNUYXJnZXQpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgdGFyZ2V0IGxldmVsIHRvICVkIChmcm9tICVkKVxuIiwgbmV3VGFyZ2V0LCBtRGVzVGFyZ2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCB0YXJnZXQgbGV2ZWwgdG8gJWRcbiIsIG5ld1RhcmdldCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbUxhc3RBdHRGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBuZXdBdHRGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1EZXNBdHRGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwgbmV3QXR0RmFjdG9yLCBtRGVzQXR0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWRcbiIsIG5ld0F0dEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtTGFzdEJvb3N0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgbmV3Qm9vc3RGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RCb29zdEZhY3RvciA9IG5ld0Jvb3N0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1EZXNCb29zdEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBib29zdCBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IsIG1EZXNCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYm9vc3QgZmFjdG9yIHRvICVkXG4iLCBuZXdCb29zdEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtTGFzdEhlYXZ5KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBuZXdIZWF2eSk7CisgICAgICAgICAgICBtTGFzdEhlYXZ5ID0gbmV3SGVhdnk7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3SGVhdnkgIT0gbURlc0hlYXZ5KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5LCBtRGVzSGVhdnkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkXG4iLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgY29uZmlnOiB0Z3RfbGV2OiAlM2QsIGN1dDogJTNkLCBib29zdDogJTNkLCBoZWF2eTogJWRcbiIsIG5ld1RhcmdldCwKKyAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IsIG5ld0Jvb3N0RmFjdG9yLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgbURhdGFVcGRhdGUgPSBmYWxzZTsKKworICAgIH0gLy8gaWYgKG1EYXRhVXBkYXRlKQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNmNmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQgICAgICAgICA9IDB4MDAwMCwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SICAgICA9IDB4MDAwMSwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IgICA9IDB4MDAwMiwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSAgICAgICAgICA9IDB4MDAwMywKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQgICAgICAgICA9IDB4MDAwNAorfSBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU07CisKKworY2xhc3MgQ0RyY1ByZXNNb2RlV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIH5DRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgdm9pZCBzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSk7CisgICAgdm9pZCBzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSk7CisgICAgdm9pZCBzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKik7CisgICAgdm9pZCB1cGRhdGUoKTsKKworcHJvdGVjdGVkOgorICAgIEhBTkRMRV9BQUNERUNPREVSIG1IYW5kbGVEZWNvZGVyOworICAgIGludCBtRGVzVGFyZ2V0OworICAgIGludCBtRGVzQXR0RmFjdG9yOworICAgIGludCBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG1EZXNIZWF2eTsKKworICAgIGludCBtRW5jb2RlclRhcmdldDsKKworICAgIGludCBtTGFzdFRhcmdldDsKKyAgICBpbnQgbUxhc3RBdHRGYWN0b3I7CisgICAgaW50IG1MYXN0Qm9vc3RGYWN0b3I7CisgICAgaW50IG1MYXN0SGVhdnk7CisKKyAgICBTQ0hBUiBtU3RyZWFtUFJMOworICAgIFNDSEFSIG1TdHJlYW1EUkNQcmVzTW9kZTsKKyAgICBJTlQgbVN0cmVhbU5yQUFDQ2hhbjsKKyAgICBJTlQgbVN0cmVhbU5yT3V0Q2hhbjsKKworICAgIGJvb2wgbUlzRG93bm1peDsKKyAgICBib29sIG1Jc01vbm9Eb3dubWl4OworICAgIGJvb2wgbUlzU3RlcmVvRG93bm1peDsKKworICAgIGJvb2wgbURhdGFVcGRhdGU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCBhOWRhMWNjLi43MTIxY2QyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMTQsMjcgKzE0LDM1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIlNvZnRBQUMyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QUFDMiIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIlNvZnRBQUMyLmgiCisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAorI2luY2x1ZGUgPG1hdGguaD4KKwogI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTIDIKIAogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIDY0ICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLwotI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDYgIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSAxICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAtMSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLwogLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncwogI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKICNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU3LDkgKzY1LDkgQEAKICAgICAgIG1TdHJlYW1JbmZvKE5VTEwpLAogICAgICAgbUlzQURUUyhmYWxzZSksCiAgICAgICBtSW5wdXRCdWZmZXJDb3VudCgwKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCgwKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCi0gICAgICBtQW5jaG9yVGltZVVzKDApLAotICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCisgICAgICBtTGFzdEluSGVhZGVyKE5VTEwpLAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CiAgICAgaW5pdFBvcnRzKCk7CiAgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKQEAgLTY3LDYgKzc1LDcgQEAKIAogU29mdEFBQzI6On5Tb2Z0QUFDMigpIHsKICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICBkZWxldGUgbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKIH0KIAogdm9pZCBTb2Z0QUFDMjo6aW5pdFBvcnRzKCkgewpAQCAtMTExLDYgKzEyMCw3IEBACiB9CiAKIHN0YXR1c190IFNvZnRBQUMyOjppbml0RGVjb2RlcigpIHsKKyAgICBBTE9HVigiaW5pdERlY29kZXIoKSIpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgbUFBQ0RlY29kZXIgPSBhYWNEZWNvZGVyX09wZW4oVFRfTVA0X0FESUYsIC8qIG51bSBsYXllcnMgKi8gMSk7CiAgICAgaWYgKG1BQUNEZWNvZGVyICE9IE5VTEwpIHsKQEAgLTExOSwzNiArMTI5LDczIEBACiAgICAgICAgICAgICBzdGF0dXMgPSBPSzsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjb2Rlckhhc0RhdGEgPSBmYWxzZTsKIAotICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4KLSAgICAvLyBieSBwbGF0Zm9ybSBwcm9wZXJ0aWVzOgorICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CisgICAgbUVuZE9mT3V0cHV0ID0gZmFsc2U7CisgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQgPSAwOworCisgICAgaWYgKG1BQUNEZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGlzIG51bGwuIFRPRE86IENhbiBub3QgY2FsbCBhYWNEZWNvZGVyX1NldFBhcmFtIGluIHRoZSBmb2xsb3dpbmcgY29kZSIpOworICAgIH0KKworICAgIC8vYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwgMCk7CisKKyAgICAvL2luaXQgRFJDIHdyYXBwZXIKKyAgICBtRHJjV3JhcC5zZXREZWNvZGVySGFuZGxlKG1BQUNEZWNvZGVyKTsKKyAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKworICAgIC8vIGZvciBzdHJlYW1zIHRoYXQgY29udGFpbiBtZXRhZGF0YSwgdXNlIHRoZSBtb2JpbGUgcHJvZmlsZSBEUkMgc2V0dGluZ3MgdW5sZXNzIG92ZXJyaWRkZW4gYnkgcGxhdGZvcm0gcHJvcGVydGllcworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgRFJDIHNldHRpbmdzIGRlcGVuZGluZyBvbiBhdWRpbyBvdXRwdXQgZGV2aWNlIHR5cGUgKEhETUksIGxvYWRzcGVha2VyLCBoZWFkcGhvbmUpCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIC8vICAqIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAogICAgIGlmIChwcm9wZXJ0eV9nZXQoUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMLCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgdW5zaWduZWQgcmVmTGV2ZWwgPSBhdG9pKHZhbHVlKTsKLSAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMIG9mICVkIGluc3RlYWQgb2YgJWQiLAotICAgICAgICAgICAgICAgIHJlZkxldmVsLCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKTsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19SRUZFUkVOQ0VfTEVWRUwsIHJlZkxldmVsKTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgb2YgJWQgaW5zdGVhZCBvZiAlZCIsIHJlZkxldmVsLAorICAgICAgICAgICAgICAgIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQsIHJlZkxldmVsKTsKICAgICB9IGVsc2UgewotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVCwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CiAgICAgfQotICAgIC8vICAqIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IKICAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0NVVCwgdmFsdWUsIE5VTEwpKSB7CiAgICAgICAgIHVuc2lnbmVkIGN1dCA9IGF0b2kodmFsdWUpOwotICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXQsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIGN1dCk7CisgICAgICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQgaW5zdGVhZCBvZiAlZCIsIGN1dCwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0FUVF9GQUNUT1IsIGN1dCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOwogICAgIH0KLSAgICAvLyAgKiBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiAobm90ZTogbm8gZGVmYXVsdCwgdXNpbmcgY3V0KQorICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IKICAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0JPT1NULCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgdW5zaWduZWQgYm9vc3QgPSBhdG9pKHZhbHVlKTsKLSAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIEFBQ19EUkNfQk9PU1RfRkFDVE9SIG9mICVkIiwgYm9vc3QpOwotICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgYm9vc3QpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgYm9vc3QgZmFjdG9yIG9mICVkIGluc3RlYWQgb2YgJWQiLCBib29zdCwKKyAgICAgICAgICAgICAgICBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SLCBib29zdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgIH0KKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0hFQVZZLCB2YWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgdW5zaWduZWQgaGVhdnkgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc3JpZWQgRFJDIGhlYXZ5IGNvbXByZXNzaW9uIHN3aXRjaCBvZiAlZCBpbnN0ZWFkIG9mICVkIiwgaGVhdnksCisgICAgICAgICAgICAgICAgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLCBoZWF2eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgIH0KKyAgICAvLyBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQKKyAgICBpZiAocHJvcGVydHlfZ2V0KFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIHVuc2lnbmVkIGVuY29kZXJSZWZMZXZlbCA9IGF0b2kodmFsdWUpOworICAgICAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZW5jb2Rlci1zaWRlIERSQyByZWZlcmVuY2UgbGV2ZWwgb2YgJWQgaW5zdGVhZCBvZiAlZCIsCisgICAgICAgICAgICAgICAgZW5jb2RlclJlZkxldmVsLCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKKyAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULCBlbmNvZGVyUmVmTGV2ZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIzOSw3ICsyODYsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRBQUMyOjppbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKLSAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CkBAIC0yODMsNiArMzMwLDc2IEBACiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ1BSRVNFTlRBVElPTlRZUEUgKmFhY1ByZXNQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWFjUHJlc1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmb3IgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG9mIHRoZSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgc3RydWN0dXJlLAorICAgICAgICAgICAgLy8gYSB2YWx1ZSBvZiAtMSBpbXBsaWVzIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb246CisgICAgICAgICAgICAvLyAgIG5NYXhPdXRwdXRDaGFubmVscyAgICAgdXNlcyBkZWZhdWx0IHBsYXRmb3JtIHByb3BlcnRpZXMsIHNlZSBjb25maWd1cmVEb3dubWl4KCkKKyAgICAgICAgICAgIC8vICAgbkRyY0N1dCAgICAgICAgICAgICAgICB1c2VzIGRlZmF1bHQgcGxhdGZvcm0gcHJvcGVydGllcywgc2VlIGluaXREZWNvZGVyKCkKKyAgICAgICAgICAgIC8vICAgbkRyY0Jvb3N0ICAgICAgICAgICAgICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgbkhlYXZ5Q29tcHJlc3Npb24gICAgICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgblRhcmdldFJlZmVyZW5jZUxldmVsICAgIGlkZW0KKyAgICAgICAgICAgIC8vICAgbkVuY29kZWRUYXJnZXRMZXZlbCAgICAgIGlkZW0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gMCkgeworICAgICAgICAgICAgICAgIGludCBtYXg7CisgICAgICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVscyA+PSA4KSB7IG1heCA9IDg7IH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhYWNQcmVzUGFyYW1zLT5uTWF4T3V0cHV0Q2hhbm5lbHMgPj0gNikgeyBtYXggPSA2OyB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWFjUHJlc1BhcmFtcy0+bk1heE91dHB1dENoYW5uZWxzID49IDIpIHsgbWF4ID0gMjsgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyAtMSBvciAwOiBkaXNhYmxlIGRvd25taXgsICAxOiBtb25vCisgICAgICAgICAgICAgICAgICAgIG1heCA9IGFhY1ByZXNQYXJhbXMtPm5NYXhPdXRwdXRDaGFubmVsczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuTWF4T3V0cHV0Q2hhbm5lbHM9JWQiLCBtYXgpOworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgbWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdXBkYXRlRHJjV3JhcHBlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQm9vc3Q9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQ3V0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgYWFjUHJlc1BhcmFtcy0+bkRyY0N1dCk7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24gPj0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkhlYXZ5Q29tcHJlc3Npb249JWQiLCBhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlksCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5UYXJnZXRSZWZlcmVuY2VMZXZlbD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5FbmNvZGVkVGFyZ2V0TGV2ZWw9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRW5jb2RlZFRhcmdldExldmVsKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSAhPSAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXBkYXRlRHJjV3JhcHBlcikgeworICAgICAgICAgICAgICAgIG1EcmNXcmFwLnVwZGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BjbToKICAgICAgICAgewogICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICpwY21QYXJhbXMgPQpAQCAtMzA4LDE5ICs0MjUsMTAwIEBACiAgICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID4gMDsKIH0KIAotdm9pZCBTb2Z0QUFDMjo6bWF5YmVDb25maWd1cmVEb3dubWl4KCkgY29uc3QgewotICAgIGlmIChtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgPiAyKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgaWYgKCEocHJvcGVydHlfZ2V0KCJtZWRpYS5hYWNfNTFfb3V0cHV0X2VuYWJsZWQiLCB2YWx1ZSwgTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiRG93bm1peGluZyBtdWx0aWNoYW5uZWwgQUFDIHRvIHN0ZXJlbyIpOwotICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9PVVRQVVRfQ0hBTk5FTFMsIDIpOwotICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzID0gMjsKLSAgICAgICAgfQordm9pZCBTb2Z0QUFDMjo6Y29uZmlndXJlRG93bm1peCgpIGNvbnN0IHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKCEocHJvcGVydHlfZ2V0KCJtZWRpYS5hYWNfNTFfb3V0cHV0X2VuYWJsZWQiLCB2YWx1ZSwgTlVMTCkKKyAgICAgICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkpIHsKKyAgICAgICAgQUxPR0koImxpbWl0aW5nIHRvIHN0ZXJlbyBvdXRwdXQiKTsKKyAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9NQVhfT1VUUFVUX0NIQU5ORUxTLCAyKTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGRlY29kZXIgY3JlYXRlcyBhIDUuMSBjaGFubmVsIGRvd25taXggc2lnbmFsCisgICAgICAgIC8vIGZvciBzZXZlbiBhbmQgZWlnaHQgY2hhbm5lbCBpbnB1dCBzdHJlYW1zLiBUbyBlbmFibGUgNi4xIGFuZCA3LjEgY2hhbm5lbCBvdXRwdXQKKyAgICAgICAgLy8gdXNlIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpCiAgICAgfQogfQogCi12b2lkIFNvZnRBQUMyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Citib29sIFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIE9WRVJGTE9XIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrK10gPSBzYW1wbGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoKSIpOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3NdID0gc2FtcGxlc1tpXTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkICs9IG51bVNhbXBsZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgU29mdEFBQzI6Om91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50MzJfdCBudW1TYW1wbGVzKSB7CisKKyAgICBpZiAobnVtU2FtcGxlcyA+IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIFVOREVSUlVOIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzIDw9IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplCisgICAgICAgICAgICAmJiAobU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIDwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICsgbnVtU2FtcGxlcykpIHsKKyAgICAgICAgLy8gZmFzdGVyIG1lbWNvcHkgbG9vcCB3aXRob3V0IGNoZWNrcywgaWYgdGhlIHByZWNvbmRpdGlvbnMgYWxsb3cgdGhpcworICAgICAgICBpZiAoc2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zICs9IG51bVNhbXBsZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyAtPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJzbG93IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvc107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCAtPSBudW1TYW1wbGVzOworICAgIHJldHVybiBudW1TYW1wbGVzOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgeworICAgIHJldHVybiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkOworfQorCitpbnQzMl90IFNvZnRBQUMyOjpvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSB7CisgICAgcmV0dXJuIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplIC0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworfQorCisKK3ZvaWQgU29mdEFBQzI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMzMyLDI3MCArNTMwLDQ3NiBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCi0gICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKLSAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwogCi0gICAgICAgIGluQnVmZmVyWzBdID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IGhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIG1FbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CiAKLSAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9Ci0gICAgICAgICAgICBhYWNEZWNvZGVyX0NvbmZpZ1JhdyhtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgIShpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBzZXQiKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShoZWFkZXIpOwotCi0gICAgICAgIC8vIE9ubHkgc2VuZCBvdXQgcG9ydCBzZXR0aW5ncyBjaGFuZ2VkIGV2ZW50IGlmIGJvdGggc2FtcGxlIHJhdGUKLSAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KLSAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICYmIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgbWF5YmVDb25maWd1cmVEb3dubWl4KCk7Ci0gICAgICAgICAgICBBTE9HSSgiSW5pdGlhbGx5IGNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKLQotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmIChtRGVjb2Rlckhhc0RhdGEpIHsKLSAgICAgICAgICAgICAgICAvLyBmbHVzaCBvdXQgdGhlIGRlY29kZXIncyBkZWxheWVkIGRhdGEgYnkgY2FsbGluZyBEZWNvZGVGcmFtZQotICAgICAgICAgICAgICAgIC8vIG9uZSBtb3JlIHRpbWUsIHdpdGggdGhlIEFBQ0RFQ19GTFVTSCBmbGFnIHNldAotICAgICAgICAgICAgICAgIElOVF9QQ00gKm91dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoWzBdID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKICAgICAgICAgICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KLSAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uQWxsb2NMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKLSAgICAgICAgICAgICAgICBtRGVjb2Rlckhhc0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9Db25maWdSYXcobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0NvbmZpZ1JhdyBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihpbnQxNl90KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZXZlciBzdWJtaXR0ZWQgYW55IGRhdGEgdG8gdGhlIGRlY29kZXIsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBmbHVzaCBvdXQKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7IC8vIGZha2UgaW5jcmVhc2Ugb2Ygb3V0cHV0QnVmZmVyQ291bnQgdG8ga2VlcCB0aGUgY291bnRlcnMgYWxpZ25lZAorCisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBjb25maWd1cmVEb3dubWl4KCk7CisgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIG91dCBwb3J0IHNldHRpbmdzIGNoYW5nZWQgZXZlbnQgaWYgYm90aCBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgIC8vIGFuZCBudW1DaGFubmVscyBhcmUgdmFsaWQuCisgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlICYmIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiSW5pdGlhbGx5IGNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNBRFRTKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICAvLyBza2lwIDMwIGJpdHMsIGFhY19mcmFtZV9sZW5ndGggZm9sbG93cy4KKyAgICAgICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PwogCi0gICAgICAgIGlmIChpbkhlYWRlci0+bk9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKIAotICAgICAgICBzaXplX3QgYWR0c0hlYWRlclNpemUgPSAwOwotICAgICAgICBpZiAobUlzQURUUykgewotICAgICAgICAgICAgLy8gc2tpcCAzMCBiaXRzLCBhYWNfZnJhbWVfbGVuZ3RoIGZvbGxvd3MuCi0gICAgICAgICAgICAvLyBzc3Nzc3NzcyBzc3NzaWlpcCBwcGZmZmZQYyBjY29oQ0NsbCBsbGxsbGxsbCBsbGw/Pz8/PwotCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgNykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBkYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGV2ZW4gdGhlIEFEVFMgaGVhZGVyLiAiCi0gICAgICAgICAgICAgICAgICAgICAgIkdvdCAlbGQgYnl0ZXMuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgIGhleGR1bXAoYWR0c0hlYWRlciwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwotICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFhY19mcmFtZV9sZW5ndGggPQotICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls0XSA8PCAzKQotICAgICAgICAgICAgICAgICAgICB8IChhZHRzSGVhZGVyWzVdID4+IDUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgYWFjX2ZyYW1lX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlbGQgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICVkIGJ5dGVzLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICBib29sIHByb3RlY3Rpb25BYnNlbnQgPSAoYWR0c0hlYWRlclsxXSAmIDEpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWFjX2ZyYW1lX2xlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKGFkdHNIZWFkZXJbM10gJiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNF0gPDwgMykKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNV0gPj4gNSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYXVkaW8gZGF0YSBmb3IgdGhlIGNvbXBsZXRlIGZyYW1lLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWQgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgYWFjX2ZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKFVDSEFSICopYWR0c0hlYWRlciArIGFkdHNIZWFkZXJTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBhZHRzSGVhZGVyU2l6ZSA9IChwcm90ZWN0aW9uQWJzZW50ID8gNyA6IDkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFhY19mcmFtZV9sZW5ndGggPCBhZHRzSGVhZGVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSAoVUNIQVIgKilhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGFkdHNIZWFkZXJTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCBFUlJPUl9NQUxGT1JNRUQsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGJ1ZmZlciBzaXplIGFuZCB0aW1lIHN0YW1wCisgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmFkZChpbkJ1ZmZlckxlbmd0aFswXSk7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0SW5IZWFkZXIgIT0gaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGluSGVhZGVyLT5uVGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IGluSGVhZGVyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSBtQnVmZmVyVGltZXN0YW1wcy50b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUgKz0gbVN0cmVhbUluZm8tPmFhY1NhbXBsZXNQZXJGcmFtZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLmFkZChjdXJyZW50VGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuYWRkKGluSGVhZGVyLT5uVGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMuYWRkKGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpZ25hbEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQorICAgICAgICAgICAgYnl0ZXNWYWxpZFswXSA9IGluQnVmZmVyTGVuZ3RoWzBdOwogCi0gICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUl9NQUxGT1JNRUQsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgSU5UIHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICBJTlQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5CdWZmZXJbMF0gPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwotICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbGwgYW5kIGRlY29kZQotICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4oCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKLQotICAgICAgICBieXRlc1ZhbGlkWzBdID0gaW5CdWZmZXJMZW5ndGhbMF07Ci0KLSAgICAgICAgaW50IHByZXZTYW1wbGVSYXRlID0gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7Ci0gICAgICAgIGludCBwcmV2TnVtQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7Ci0KLSAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOwotICAgICAgICB3aGlsZSAoYnl0ZXNWYWxpZFswXSA+IDAgJiYgZGVjb2RlckVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewogICAgICAgICAgICAgYWFjRGVjb2Rlcl9GaWxsKG1BQUNEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVmFsaWQpOwotICAgICAgICAgICAgbURlY29kZXJIYXNEYXRhID0gdHJ1ZTsKIAotICAgICAgICAgICAgZGVjb2RlckVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5BbGxvY0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworICAgICAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICAgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKIAotICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiTm90IGVub3VnaCBiaXRzLCBieXRlc1ZhbGlkICVkIiwgYnl0ZXNWYWxpZFswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQotICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKLQotICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKSB7CiAgICAgICAgICAgICBVSU5UIGluQnVmZmVyVXNlZExlbmd0aCA9IGluQnVmZmVyTGVuZ3RoWzBdIC0gYnl0ZXNWYWxpZFswXTsKICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuIC09IGluQnVmZmVyVXNlZExlbmd0aDsKICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGluQnVmZmVyVXNlZExlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCwgc3Vic3RpdHV0aW5nIHNpbGVuY2UiLAotICAgICAgICAgICAgICAgICAgZGVjb2RlckVycik7CiAKLSAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQsIDAsIG51bU91dEJ5dGVzKTsKKyAgICAgICAgICAgIEFBQ19ERUNPREVSX0VSUk9SIGRlY29kZXJFcnI7CisgICAgICAgICAgICBpbnQgbnVtTG9vcHMgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHJpbmdidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KLSAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlczsKKyAgICAgICAgICAgICAgICBkZWNvZGVyRXJyID0gYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOwogCi0gICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKKyAgICAgICAgICAgICAgICBudW1Db25zdW1lZCA9IG1TdHJlYW1JbmZvLT5udW1Ub3RhbEJ5dGVzIC0gbnVtQ29uc3VtZWQ7CisgICAgICAgICAgICAgICAgbnVtTG9vcHMrKzsKIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMuYWRkKG51bUNvbnN1bWVkKTsKKworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNWYWxpZFswXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJieXRlc1ZhbGlkWzBdICE9IDAgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yIDB4JTQuNHgsIHN1YnN0aXR1dGluZyBzaWxlbmNlIiwgZGVjb2RlckVycik7CisKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRtcE91dEJ1ZmZlciwgMCwgbnVtT3V0Qnl0ZXMpOyAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3cKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGRlY29kZXJFcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1RQREVDX0NMRUFSX0JVRkZFUiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYW4gZXJyb3IsIHJlcGxhY2UgdGhlIGxhc3QgZW50cnkgaW4gbUJ1ZmZlclNpemVzIHdpdGggdGhlIHN1bSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCA8bnVtTG9vcHM+IGVudHJpZXMgZnJvbSBtRGVjb2RlZFNpemVzIHRvIHJlc3luY2hyb25pemUgdGhlIGluL291dCBsaXN0cy4KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLnBvcCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTG9vcHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbiArPSBtRGVjb2RlZFNpemVzLml0ZW1BdChtRGVjb2RlZFNpemVzLnNpemUoKSAtIG51bUxvb3BzICsgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmFkZChuKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQorICAgICAgICAgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAgICAgICAgICAgICAqIHJhdGUgc3lzdGVtIGFuZCB0aGUgc2FtcGxpbmcgcmF0ZSBpbiB0aGUgZmluYWwgb3V0cHV0IGlzIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICogZG91YmxlZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JlIEFBQyBkZWNvZGVyIHNhbXBsaW5nIHJhdGUuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBFeHBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZXhwbGljaXRseSBkZWZpbmluZyBTQlIgYXVkaW8gb2JqZWN0CisgICAgICAgICAgICAgICAgICogdHlwZSBpbiB0aGUgYml0c3RyZWFtLiBJbXBsaWNpdCBzaWduYWxsaW5nIGlzIGRvbmUgYnkgZW1iZWRkaW5nCisgICAgICAgICAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICAgICAgICAgICAgICogcmVxdWlyZXMgYW4gQUFDIGRlY29kZXIgdG8gcGVyZm9ybSBwcmUtY2hlY2tzIG9uIGFjdHVhbCBhdWRpbyBmcmFtZXMuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHVudGlsIHRoZSBmaXJzdCBkYXRhIGZyYW1lIGlzIGRlY29kZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDw9IDIgfHwgbU91dHB1dEJ1ZmZlckNvdW50ID4gMSkgeyAvLyBUT0RPOiA8PSAxCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICE9IHByZXZOdW1DaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlciAmJiBpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlIHx8ICFtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyICYmIGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiaW5IZWFkZXItPm5GaWxsZWRMZW4gPSAlZCIsIGluSGVhZGVyID8gaW5IZWFkZXItPm5GaWxsZWRMZW4gOiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0spOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKLSAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGludDMyX3Qgb3V0cHV0RGVsYXkgPSBtU3RyZWFtSW5mby0+b3V0cHV0RGVsYXkgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisKKyAgICAgICAgaWYgKCFtRW5kT2ZJbnB1dCAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CisgICAgICAgICAgICAvLyBkaXNjYXJkIG91dHB1dERlbGF5IGF0IHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIGludDMyX3QgdG9Db21wZW5zYXRlID0gb3V0cHV0RGVsYXkgLSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIGlmIChkaXNjYXJkID4gdG9Db21wZW5zYXRlKSB7CisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IHRvQ29tcGVuc2F0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZGlzY2FyZGVkID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygwLCBkaXNjYXJkKTsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkICs9IGRpc2NhcmRlZDsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQUFDKy9lQUFDKyBzdHJlYW1zIGNhbiBiZSBzaWduYWxsZWQgaW4gdHdvIHdheXM6IGVpdGhlciBleHBsaWNpdGx5Ci0gICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAotICAgICAgICAgKiByYXRlIHN5c3RlbSBhbmQgdGhlIHNhbXBsaW5nIHJhdGUgaW4gdGhlIGZpbmFsIG91dHB1dCBpcyBhY3R1YWxseQotICAgICAgICAgKiBkb3VibGVkIGNvbXBhcmVkIHdpdGggdGhlIGNvcmUgQUFDIGRlY29kZXIgc2FtcGxpbmcgcmF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogRXhwbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGV4cGxpY2l0bHkgZGVmaW5pbmcgU0JSIGF1ZGlvIG9iamVjdAotICAgICAgICAgKiB0eXBlIGluIHRoZSBiaXRzdHJlYW0uIEltcGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBlbWJlZGRpbmcKLSAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCi0gICAgICAgICAqIHJlcXVpcmVzIGFuIEFBQyBkZWNvZGVyIHRvIHBlcmZvcm0gcHJlLWNoZWNrcyBvbiBhY3R1YWwgYXVkaW8gZnJhbWVzLgotICAgICAgICAgKgotICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKLSAgICAgICAgICogQUFDKy9lQUFDKyB1bnRpbCB0aGUgZmlyc3QgZGF0YSBmcmFtZSBpcyBkZWNvZGVkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDw9IDIpIHsKLSAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSAhPSBwcmV2U2FtcGxlUmF0ZSB8fAotICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyAhPSBwcmV2TnVtQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBtYXliZUNvbmZpZ3VyZURvd25taXgoKTsKLSAgICAgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJldlNhbXBsZVJhdGUsIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIHByZXZOdW1DaGFubmVscywgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgICAgICAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworIAorICAgICAgICAgICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgICAgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICAgICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKIAotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKQorICAgICAgICAgICAgICAgICYmIG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPj0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCBpcyBub3QgaGFuZGxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgfHwgIW1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgewotICAgICAgICAgICAgQUxPR1coIkludmFsaWQgQUFDIHN0cmVhbSIpOwotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBkZWNvZGVyRXJyLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChkZWNvZGVyRXJyID09IEFBQ19ERUNfT0sgfHwgbU51bVNhbXBsZXNPdXRwdXQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdsbCBvbmx5IG91dHB1dCBkYXRhIGlmIHdlIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGl0IG9yCi0gICAgICAgICAgICAvLyB3ZSd2ZSBwcmV2aW91c2x5IGRlY29kZWQgdmFsaWQgZGF0YSwgaW4gdGhlIGxhdHRlciBjYXNlCi0gICAgICAgICAgICAvLyAoZGVjb2RlIGZhaWxlZCkgd2UnbGwgb3V0cHV0IGEgc2lsZW50IGZyYW1lLgotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gbnVtT3V0Qnl0ZXM7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgICAgICBJTlRfUENNICpvdXRCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PElOVF9QQ00gKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBzYW1wbGVzaXplID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgaWYgKG91dEhlYWRlci0+bk9mZnNldAorICAgICAgICAgICAgICAgICAgICArIG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBzYW1wbGVzaXplCisgICAgICAgICAgICAgICAgICAgID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKLSAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVN0cmVhbUluZm8tPnNhbXBsZVJhdGU7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0ICs9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemU7CisgICAgICAgICAgICBpbnQgYXZhaWxhYmxlID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgaW50IG51bVNhbXBsZXMgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzID4gYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudFRpbWUgPSAwOworICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSkgewogCisgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcyA9IG51bVNhbXBsZXMgLyAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIChtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKworICAgICAgICAgICAgICAgIEFMT0dWKCIlZCBzYW1wbGVzIGF2YWlsYWJsZSAoJWQpLCBvciAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywgYXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIGludDY0X3QgKm5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGltZSA9ICpuZXh0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGludDMyX3QgKmN1cnJlbnRCdWZMZWZ0ID0gJm1CdWZmZXJTaXplcy5lZGl0SXRlbUF0KDApOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWNvZGVkU2l6ZSA9IG1EZWNvZGVkU2l6ZXMuaXRlbUF0KDApOworICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZFNpemVzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlZCAlZCBvZiAlZCIsIGRlY29kZWRTaXplLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmN1cnJlbnRCdWZMZWZ0ID4gZGVjb2RlZFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdC9pbnRlcnBvbGF0ZSBuZXh0IHRpbWUgc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXJyZW50QnVmTGVmdCAtPSBkZWNvZGVkU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhZGp1c3RlZCBuZXh0VGltZVN0YW1wL3NpemUgdG8gJWxsZC8lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IHRpbWVzdGFtcCBpbiBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclRpbWVzdGFtcHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJUaW1lc3RhbXBzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lU3RhbXAgPSAmbUJ1ZmZlclRpbWVzdGFtcHMuZWRpdEl0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZXMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZkxlZnQgPSAmbUJ1ZmZlclNpemVzLmVkaXRJdGVtQXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1vdmVkIHRvIG5leHQgdGltZS9zaXplOiAlbGxkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wLCAqY3VycmVudEJ1ZkxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGxpbWl0IG91dHB1dCBidWZmZXIgc2l6ZSB0byBtYXRjaCBpbnB1dCBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZS5nIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGNvbnRhaW5lZCA0ICJzdWIiIGZyYW1lcywgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBtb3N0IDQgZGVjb2RlZCB1bml0cyBpbiB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvcHRpb25hbC4gUmVtb3ZlIHRoZSBuZXh0IHRocmVlIGxpbmVzIHRvIGZpbGwgdGhlIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHdpdGggYXMgbWFueSB1bml0cyBhcyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgPSBpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HVigiZ2V0dGluZyAlZCBmcm9tIHJpbmdidWZmZXIiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhvdXRCdWZmZXIsIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChucyAhPSBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgYSBjb21wbGV0ZSBmcmFtZSBvZiBzYW1wbGVzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIG1FbmRPZk91dHB1dCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gY3VycmVudFRpbWU7CisKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICVsbGQgLyAlZCIsIG91dEhlYWRlci0+blRpbWVTdGFtcCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CiAgICAgICAgICAgICBvdXRIZWFkZXIgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgewotICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgaWYgKG1FbmRPZklucHV0KSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRW5kT2ZJbnB1dCAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICghbUVuZE9mT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZW1wdHkgYmxvY2sgc2lnbmFsaW5nIEVPUworICAgICAgICAgICAgICAgICAgICBtRW5kT2ZPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5PZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm91dEhlYWRlci0+bk9mZnNldCAhPSAwIGlzIG5vdCBoYW5kbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KG91dEhlYWRlci0+cEJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBucyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworCisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1CdWZmZXJUaW1lc3RhbXBzLml0ZW1BdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBpZiBvdXRRdWV1ZSBub3QgZW1wdHkgYnV0IG5vIG1vcmUgb3V0cHV0CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02MDYsMjggKzEwMTAsNzcgQEAKICAgICAgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgogICAgICAgICAvLyBkcmFpbiBhbGwgZXhpc3RpbmcgZGF0YQogICAgICAgICBkcmFpbkRlY29kZXIoKTsKKyAgICAgICAgbUJ1ZmZlclRpbWVzdGFtcHMuY2xlYXIoKTsKKyAgICAgICAgbUJ1ZmZlclNpemVzLmNsZWFyKCk7CisgICAgICAgIG1EZWNvZGVkU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgbUxhc3RJbkhlYWRlciA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGF2YWlsOworICAgICAgICB3aGlsZSAoKGF2YWlsID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChhdmFpbCA+IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBhdmFpbCA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IG5zID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcygwLCBhdmFpbCk7CisgICAgICAgICAgICBpZiAobnMgIT0gYXZhaWwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudCsrOworICAgICAgICB9CisgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOwogICAgIH0KIH0KIAogdm9pZCBTb2Z0QUFDMjo6ZHJhaW5EZWNvZGVyKCkgewotICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIDYgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKLSAgICBzaG9ydCBidWYgWzIwNDgqNl07Ci0gICAgYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZShtQUFDRGVjb2RlciwKLSAgICAgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksIEFBQ0RFQ19GTFVTSCB8IEFBQ0RFQ19DTFJISVNUIHwgQUFDREVDX0lOVFIpOwotICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCi0gICAgICAgICAgICBidWYsIHNpemVvZihidWYpLCBBQUNERUNfRkxVU0ggfCBBQUNERUNfQ0xSSElTVCB8IEFBQ0RFQ19JTlRSKTsKLSAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVFBERUNfQ0xFQVJfQlVGRkVSLCAxKTsKLSAgICBtRGVjb2Rlckhhc0RhdGEgPSBmYWxzZTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5ID0gbVN0cmVhbUluZm8tPm91dHB1dERlbGF5ICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgLy8gZmx1c2ggZGVjb2RlciB1bnRpbCBvdXRwdXREZWxheSBpcyBjb21wZW5zYXRlZAorICAgIHdoaWxlIChtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA+IDApIHsKKyAgICAgICAgLy8gYSBidWZmZXIgYmlnIGVub3VnaCBmb3IgTUFYX0NIQU5ORUxfQ09VTlQgY2hhbm5lbHMgb2YgZGVjb2RlZCBIRS1BQUMKKyAgICAgICAgSU5UX1BDTSB0bXBPdXRCdWZmZXJbMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UXTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBBQUNfREVDT0RFUl9FUlJPUiBkZWNvZGVyRXJyID0KKyAgICAgICAgICAgIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUobUFBQ0RlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcE91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNERUNfRkxVU0gpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBBQUNfREVDX09LKSB7CisgICAgICAgICAgICBBTE9HVygiYWFjRGVjb2Rlcl9EZWNvZGVGcmFtZSBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bXBPdXRCdWZmZXJTYW1wbGVzID0gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKyAgICAgICAgaWYgKHRtcE91dEJ1ZmZlclNhbXBsZXMgPiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCkgeworICAgICAgICAgICAgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgICAgICB9CisgICAgICAgIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXModG1wT3V0QnVmZmVyLCB0bXBPdXRCdWZmZXJTYW1wbGVzKTsKKworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCAtPSB0bXBPdXRCdWZmZXJTYW1wbGVzOworICAgIH0KIH0KIAogdm9pZCBTb2Z0QUFDMjo6b25SZXNldCgpIHsKICAgICBkcmFpbkRlY29kZXIoKTsKICAgICAvLyByZXNldCB0aGUgImNvbmZpZ3VyZWQiIHN0YXRlCiAgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOwotICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtT3V0cHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKyAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOworICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOworICAgIG1CdWZmZXJUaW1lc3RhbXBzLmNsZWFyKCk7CisgICAgbUJ1ZmZlclNpemVzLmNsZWFyKCk7CisgICAgbURlY29kZWRTaXplcy5jbGVhcigpOworICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworCiAgICAgLy8gVG8gbWFrZSB0aGUgY29kZWMgYmVoYXZlIHRoZSBzYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgYSByZXNldCwgd2UgbmVlZCB0byBpbnZhbGlkYXRlIHRoZQogICAgIC8vIHN0cmVhbWluZm8gc3RydWN0LiBUaGlzIGRvZXMgdGhhdDoKLSAgICBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSA9IDA7CisgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOyAvLyBUT0RPOiBtU3RyZWFtSW5mbyBpcyByZWFkIG9ubHkKIAogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCmluZGV4IDJkOTYwYWIuLmMzZTQ0NTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKICNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ3LDE2ICs0OCwyMiBAQAogICAgIGVudW0gewogICAgICAgICBrTnVtSW5wdXRCdWZmZXJzICAgICAgICA9IDQsCiAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzICAgICAgID0gNCwKKyAgICAgICAga051bURlbGF5QmxvY2tzTWF4ICAgICAgPSA4LAogICAgIH07CiAKICAgICBIQU5ETEVfQUFDREVDT0RFUiBtQUFDRGVjb2RlcjsKICAgICBDU3RyZWFtSW5mbyAqbVN0cmVhbUluZm87CiAgICAgYm9vbCBtSXNBRFRTOwotICAgIGJvb2wgbURlY29kZXJIYXNEYXRhOworICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQ7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7Ci0gICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOwotICAgIGludDY0X3QgbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm1MYXN0SW5IZWFkZXI7CisgICAgVmVjdG9yPGludDMyX3Q+IG1CdWZmZXJTaXplczsKKyAgICBWZWN0b3I8aW50MzJfdD4gbURlY29kZWRTaXplczsKKyAgICBWZWN0b3I8aW50NjRfdD4gbUJ1ZmZlclRpbWVzdGFtcHM7CisKKyAgICBDRHJjUHJlc01vZGVXcmFwcGVyIG1EcmNXcmFwOwogCiAgICAgZW51bSB7CiAgICAgICAgIE5PTkUsCkBAIC02Nyw5ICs3NCwyMyBAQAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OwotICAgIHZvaWQgbWF5YmVDb25maWd1cmVEb3dubWl4KCkgY29uc3Q7CisgICAgdm9pZCBjb25maWd1cmVEb3dubWl4KCkgY29uc3Q7CiAgICAgdm9pZCBkcmFpbkRlY29kZXIoKTsKIAorLy8gICAgICBkZWxheSBjb21wZW5zYXRpb24KKyAgICBib29sIG1FbmRPZklucHV0OworICAgIGJvb2wgbUVuZE9mT3V0cHV0OworICAgIGludDMyX3QgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICBzaG9ydCAqbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKKyAgICBib29sIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBQUMyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5tawppbmRleCAwNTdjNjliLi41OGVjM2JhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCkBAIC04Miw2ICs4Miw4IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNwogZW5kaWYKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTA2LDYgKzEwOCw4IEBACiAKICAgTE9DQUxfQ0ZMQUdTIDo9CiAKKyAgTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYkZyYXVuaG9mZXJBQUMKIAogICBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTEyOCw2ICsxMzIsOCBAQAogCiAgIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorICBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FhY2VuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKaW5kZXggZjVjODU4YS4uZThkYWJlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEFBQ0VuY29kZXIyLmgiCisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgpAQCAtNDQsNiArNDUsOCBAQAogICAgICAgbU51bUNoYW5uZWxzKDEpLAogICAgICAgbVNhbXBsZVJhdGUoNDQxMDApLAogICAgICAgbUJpdFJhdGUoMCksCisgICAgICBtU0JSTW9kZSgtMSksCisgICAgICBtU0JSUmF0aW8oMCksCiAgICAgICBtQUFDUHJvZmlsZShPTVhfQVVESU9fQUFDT2JqZWN0TEMpLAogICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCiAgICAgICBtSW5wdXRTaXplKDApLApAQCAtMTY0LDYgKzE2Nyw0MSBAQAogICAgICAgICAgICAgYWFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgYWFjUGFyYW1zLT5uRnJhbWVMZW5ndGggPSAwOwogCisgICAgICAgICAgICBzd2l0Y2ggKG1TQlJNb2RlKSB7CisgICAgICAgICAgICBjYXNlIDE6IC8vIHNiciBvbgorICAgICAgICAgICAgICAgIHN3aXRjaCAobVNCUlJhdGlvKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYm90aCBPTVggQUFDIHRvb2wgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUjsKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgfD0gT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2luZ2xlLXJhdGUgU0JSIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyB8PSBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyAmPSB+T01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZHVhbC1yYXRlIFNCUiBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgYWFjUGFyYW1zLT5uQUFDdG9vbHMgJj0gfk9NWF9BVURJT19BQUNUb29sQW5kcm9pZFNTQlI7CisgICAgICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzIHw9IE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIFNCUiByYXRpbyAlZCIsIG1TQlJSYXRpbyk7CisgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOiAgLy8gc2JyIG9mZgorICAgICAgICAgICAgY2FzZSAtMTogLy8gc2JyIHVuZGVmaW5lZAorICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSOworICAgICAgICAgICAgICAgIGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICY9IH5PTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBTQlIgbW9kZSAlZCIsIG1TQlJNb2RlKTsKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgfQorCisKKwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMjY3LDYgKzMwNSwyMyBAQAogICAgICAgICAgICAgICAgIG1BQUNQcm9maWxlID0gYWFjUGFyYW1zLT5lQUFDUHJvZmlsZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKCEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSKQorICAgICAgICAgICAgICAgICAgICAmJiAhKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkRFNCUikpIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IDA7CisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGFhY1BhcmFtcy0+bkFBQ3Rvb2xzICYgT01YX0FVRElPX0FBQ1Rvb2xBbmRyb2lkU1NCUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIShhYWNQYXJhbXMtPm5BQUN0b29scyAmIE9NWF9BVURJT19BQUNUb29sQW5kcm9pZERTQlIpKSB7CisgICAgICAgICAgICAgICAgbVNCUk1vZGUgPSAxOworICAgICAgICAgICAgICAgIG1TQlJSYXRpbyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWRTU0JSKQorICAgICAgICAgICAgICAgICAgICAmJiAoYWFjUGFyYW1zLT5uQUFDdG9vbHMgJiBPTVhfQVVESU9fQUFDVG9vbEFuZHJvaWREU0JSKSkgeworICAgICAgICAgICAgICAgIG1TQlJNb2RlID0gMTsKKyAgICAgICAgICAgICAgICBtU0JSUmF0aW8gPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU0JSTW9kZSA9IC0xOyAvLyBjb2RlYyBkZWZhdWx0IHNiciBtb2RlCisgICAgICAgICAgICAgICAgbVNCUlJhdGlvID0gMDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNldEF1ZGlvUGFyYW1zKCkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtMzMzLDExICszODgsMTEgQEAKIH0KIAogc3RhdHVzX3QgU29mdEFBQ0VuY29kZXIyOjpzZXRBdWRpb1BhcmFtcygpIHsKLSAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscyBvciBiaXRyYXRlIGNoYW5nZQorICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRyYXRlIG9yIFNCUiBtb2RlIGNoYW5nZQogICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgogCi0gICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAlbHUgSHosICVsdSBjaGFubmVscywgJWx1IGJwcyIsCi0gICAgICAgICBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWxzLCBtQml0UmF0ZSk7CisgICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcywgJWkgc2JyIG1vZGUsICVpIHNiciByYXRpbyIsCisgICAgICAgICBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWxzLCBtQml0UmF0ZSwgbVNCUk1vZGUsIG1TQlJSYXRpbyk7CiAKICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19BT1QsCiAgICAgICAgICAgICBnZXRBT1RGcm9tUHJvZmlsZShtQUFDUHJvZmlsZSkpKSB7CkBAIC0zNjMsMTAgKzQxOCwyOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAobVNCUk1vZGUgIT0gLTEgJiYgbUFBQ1Byb2ZpbGUgPT0gT01YX0FVRElPX0FBQ09iamVjdEVMRCkgeworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgbVNCUk1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNCUiByYXRpbyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnM6CisgICAgICAgMDogRGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZXJlaW4gU0JSIHJhdGlvIGlzIGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIGF1ZGlvIG9iamVjdCB0eXBlIGJ5CisgICAgICAgICAgdGhlIEZESy4KKyAgICAgICAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkKKyAgICAgICAyOiBEdWFscmF0ZSBTQlIgKGRlZmF1bHQgZm9yIEhFLUFBQykKKyAgICAgKi8KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfUkFUSU8sIG1TQlJSYXRpbykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgU29mdEFBQ0VuY29kZXIyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBQUNFbmNvZGVyMjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM5Miw3ICs0NjUsNyBAQAogCiAgICAgICAgIE9NWF9VMzIgYWN0dWFsQml0UmF0ZSAgPSBhYWNFbmNvZGVyX0dldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSk7CiAgICAgICAgIGlmIChtQml0UmF0ZSAhPSBhY3R1YWxCaXRSYXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGJpdHJhdGUgJWx1IHVuc3VwcG9ydGVkLCB1c2luZyAlbHUiLCBtQml0UmF0ZSwgYWN0dWFsQml0UmF0ZSk7CisgICAgICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGJpdHJhdGUgJXUgdW5zdXBwb3J0ZWQsIHVzaW5nICV1IiwgbUJpdFJhdGUsIGFjdHVhbEJpdFJhdGUpOwogICAgICAgICB9CiAKICAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgZW5jSW5mbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5oCmluZGV4IDI2MDNmNGYuLmJjZTljMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuaApAQCAtNTMsNiArNTMsOCBAQAogICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOwogICAgIE9NWF9VMzIgbVNhbXBsZVJhdGU7CiAgICAgT01YX1UzMiBtQml0UmF0ZTsKKyAgICBPTVhfUzMyIG1TQlJNb2RlOworICAgIE9NWF9TMzIgbVNCUlJhdGlvOwogICAgIE9NWF9VMzIgbUFBQ1Byb2ZpbGU7CiAKICAgICBib29sIG1TZW50Q29kZWNTcGVjaWZpY0RhdGE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmMKaW5kZXggY2MwMTkyNy4uMWQwMjlmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgImJhc2ljX29wLmgiCiAjaW5jbHVkZSAib3Blcl8zMmIuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiAgRnVuY3Rpb24gTF9FeHRyYWN0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTI0Myw2ICsyNDUsOCBAQAogV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgICAgIC8qITwgT3BlcmFuZCB0byBzcXVhcmUgcm9vdCAoMC4wIC4uLiAxKSAqLwogICAgICAgICAgICAgIFdvcmQzMiBhY2N1cmFjeSkgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHMgdGhhdCB3aWxsIGJlIGNhbGN1bGF0ZWQgKi8KIHsKKyAgICBVTlVTRUQoYWNjdXJhY3kpOworCiAgICAgV29yZDMyIHJvb3QgPSAwOwogCVdvcmQzMiBzY2FsZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwppbmRleCBkMWM4NjIxLi40MGRiOTJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgImNtbk1lbW9yeS5oIgogI2luY2x1ZGUgIm1lbWFsaWduLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiAvKioKICogSW5pdCB0aGUgYXVkaW8gY29kZWMgbW9kdWxlIGFuZCByZXR1cm4gY29kZWMgaGFuZGxlCiAqIFxwYXJhbSBwaENvZGVjIFtPVVRdIFJldHVybiB0aGUgdmlkZW8gY29kZWMgaGFuZGxlCkBAIC00Niw2ICs0OCw4IEBACiAJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7CiAJaW50IGludGVyTWVtOwogCisgICAgICAgIFVOVVNFRCh2VHlwZSk7CisKIAlpbnRlck1lbSA9IDA7CiAJZXJyb3IgPSAwOwogCkBAIC00NzEsNiArNDc1LDEwIEBACiAqLwogVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0dldFBhcmFtKFZPX0hBTkRMRSBoQ29kZWMsIFZPX1MzMiB1UGFyYW1JRCwgVk9fUFRSIHBEYXRhKQogeworICAgICAgICBVTlVTRUQoaENvZGVjKTsKKyAgICAgICAgVU5VU0VEKHVQYXJhbUlEKTsKKyAgICAgICAgVU5VU0VEKHBEYXRhKTsKKwogCXJldHVybiBWT19FUlJfTk9ORTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCmluZGV4IGNjZmU4ODMuLjQ3MTYzMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKIHsKICAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsKLSAgV29yZDMyICpwdGhyRXhwLCAqcHNmYlRocmU7CisgIFdvcmQzMiAqcHRockV4cCA9IE5VTEwsICpwc2ZiVGhyZTsKICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CiAJIGZvcihzZmJHcnAgPSAwOyBzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwppbmRleCBmY2MxMmRkLi5kMWZkNjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgInFjX2RhdGEuaCIKICNpbmNsdWRlICJpbnRlcmZhY2UuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCiAKIHN0YXRpYyBjb25zdCAgV29yZDE2IGdsb2JhbEdhaW5PZmZzZXQgPSAxMDA7CiBzdGF0aWMgY29uc3QgIFdvcmQxNiBpY3NSZXNlcnZlZEJpdCAgID0gMDsKQEAgLTU4NSw2ICs1ODYsOCBAQAogICBXb3JkMTYgZWxlbWVudFVzZWRCaXRzOwogICBXb3JkMTYgZnJhbWVCaXRzPTA7CiAKKyAgVU5VU0VEKGFuY0J5dGVzKTsKKwogICAvKiAgIHN0cnVjdCBiaXRidWZmZXIgYnNXcml0ZUNvcHk7ICovCiAgIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKICAgaWYocWNPdXQtPnFjRWxlbWVudC5hZHRzVXNlZCkgIC8qICB3cml0ZSBhZHRzIGhlYWRlciovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwppbmRleCA3NzY5MTg4Li40ZDc2M2QwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlICJiaXRfY250LmgiCiAjaW5jbHVkZSAicHN5X2NvbnN0LmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIGZ1bmN0aW9uIG5hbWU6IGJ1aWxkQml0TG9va1VwCkBAIC0yMjYsNyArMjI1LDcgQEAKICAgfQogCiAgIHdoaWxlIChUUlVFKSB7Ci0gICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4LCBtYXhOZHhOZXh0LCBtYXhOZHhMYXN0OworICAgIFdvcmQxNiBtYXhNZXJnZUdhaW4sIG1heE5keCA9IDAsIG1heE5keE5leHQsIG1heE5keExhc3Q7CiAKICAgICBtYXhNZXJnZUdhaW4gPSBmaW5kTWF4TWVyZ2UobWVyZ2VHYWluTG9va1VwLCBzZWN0aW9uSW5mbywgbWF4U2ZiLCAmbWF4TmR4KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMKaW5kZXggNGU5MjE4Yy4uNmYwNjc5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCkBAIC0zOCw2ICszOCw4IEBACiAjaW5jbHVkZSAidG5zX2Z1bmMuaCIKICNpbmNsdWRlICJtZW1hbGlnbi5oIgogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHN0YXJ0ICAgICAgIHNob3J0ICAgICAgIHN0b3AgKi8KIHN0YXRpYyBXb3JkMTYgYmxvY2tUeXBlMndpbmRvd1NoYXBlW10gPSB7S0JEX1dJTkRPVyxTSU5FX1dJTkRPVyxTSU5FX1dJTkRPVyxLQkRfV0lORE9XfTsKIApAQCAtMTcwLDcgKzE3Miw5IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIFdvcmQxNiBQc3lPdXREZWxldGUoUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCiB7Ci0gIGhQc3lPdXQ9TlVMTDsKKyAgVU5VU0VEKGhQc3lPdXQpOworICBVTlVTRUQocE1lbU9QKTsKKwogICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCmluZGV4IDQ4ZmYzMDAuLmU1ZDc4YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xY19tYWluLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJjaGFubmVsX21hcC5oIgogI2luY2x1ZGUgIm1lbWFsaWduLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQogCiB0eXBlZGVmIGVudW17CiAgIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKQEAgLTIwNCwxMSArMjA1LDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIFFDRGVsZXRlKFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQogewotCi0gIC8qCi0gICAgIG5vdGhpbmcgdG8gZG8KLSAgKi8KLSAgaFFDPU5VTEw7CisgIFVOVVNFRChoUUMpOworICBVTlVTRUQocE1lbU9QKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwppbmRleCA0NTVhODY0Li41MTcyNjEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAidG5zX2Z1bmMuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKICNkZWZpbmUgVE5TX01PRElGWV9CRUdJTiAgICAgICAgIDI2MDAgIC8qIEh6ICovCiAjZGVmaW5lIFJBVElPX1BBVENIX0xPV0VSX0JPUkRFUiAzODAgICAvKiBIeiAqLwogI2RlZmluZSBUTlNfR0FJTl9USFJFU0gJCQkgMTQxICAgLyogMS40MSoxMDAgKi8KQEAgLTY0Myw2ICs2NDUsOCBAQAogICBXb3JkMzIgaTsKICAgV29yZDMyIHRuc09yZGVyUGx1czEgPSB0bnNPcmRlciArIDE7CiAKKyAgVU5VU0VEKHdpbmRvdyk7CisKICAgYXNzZXJ0KHRuc09yZGVyIDw9IFROU19NQVhfT1JERVIpOyAgICAgIC8qIHJlbW92ZSBhc3NlcnRzIGxhdGVyPyAoYnRnKSAqLwogCiAgIGZvcihpPTA7aTx0bnNPcmRlcjtpKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5tawppbmRleCAzMGNlMjljLi5hMmIzYzhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC02OSw2ICs2OSw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9FWFBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5tawppbmRleCA4ZDZjNmY4Li5iMDY3NDU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLm1rCkBAIC00Nyw2ICs0Nyw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCkBAIC02OCw2ICs3MCw4IEBACiAKIExPQ0FMX0NGTEFHUyA6PSAtRE9TQ0xfSU1QT1JUX1JFRj0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IDZmYjU5ZGQuLjBiYWY1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtMjk0LDcgKzI5NCw3IEBACiAgICAgcmV0dXJuIGZyYW1lU2l6ZTsKIH0KIAotdm9pZCBTb2Z0QU1SOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBTVI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIApAQCAtNDg5LDcgKzQ4OSw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBTVI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBTVI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiB9CiAKIHZvaWQgU29mdEFNUjo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5tawppbmRleCBmNGU0NjdhLi5hZmMwYjg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLm1rCkBAIC02OSw2ICs2OSw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0KIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTg4LDYgKzkwLDggQEAKICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24vaW5jbHVkZSBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmVuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAppbmRleCA1NDQ5NThhLi5hYWE2NzMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKQEAgLTI5OCw3ICsyOTgsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0QU1STkJFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBTVJOQkVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCmluZGV4IDY3NzEwN2YuLmVmZGY5ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLm1rCkBAIC01MCw2ICs1MCw4IEBACiBMT0NBTF9DRkxBR1MgOj0gXAogICAgICAgICAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0lNUE9SVF9SRUY9CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYwogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCmluZGV4IGM1YjhlMGMuLjY0ZmU4ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLm1rCkBAIC0xMTIsNiArMTEyLDggQEAKIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CiBlbmRpZgogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xMjYsNiArMTI4LDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZSBcCiAJZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKaW5kZXggNzQ2NTJmMC4uOWQ1MGM0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcApAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBTVJXQkVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFNUldCRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKaW5kZXggODQ1MTE5NS4uZjIzYjVhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAuZ2xvYmFsICBGaWx0XzZrXzdrX2FzbQogICAgICAgICAgIC5leHRlcm4gIHZvQVdCX0NvcHkKICAgICAgICAgICAuZXh0ZXJuICBmaXJfNmtfN2sKKyAgICAgICAgICAuaGlkZGVuICBmaXJfNmtfN2sKIAogRmlsdF82a183a19hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKaW5kZXggYWMyZGQxMy4uZGViN2VmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgIC5zZWN0aW9uICAudGV4dAogCSAuZ2xvYmFsICAgcHJlZF9sdDRfYXNtCiAJIC5leHRlcm4gICBpbnRlcjRfMgorCSAuaGlkZGVuICAgaW50ZXI0XzIKIAogcHJlZF9sdDRfYXNtOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCmluZGV4IGZjNDJhMDMuLjhkZjBjYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0CiAgICAgICAgICAgLmdsb2JhbCAgIEZpbHRfNmtfN2tfYXNtCiAgICAgICAgICAgLmV4dGVybiAgIGZpcl82a183aworICAgICAgICAgIC5oaWRkZW4gICBmaXJfNmtfN2sKIAogRmlsdF82a183a19hc206CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKaW5kZXggOGQyYWFmMi4uNjdiZTFlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKQEAgLTI5LDYgKzI5LDcgQEAKICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQKICAgICAgICAgICAuZ2xvYmFsICAgcHJlZF9sdDRfYXNtCiAgICAgICAgICAgLmV4dGVybiAgIGludGVyNF8yCisgICAgICAgICAgLmhpZGRlbiAgIGludGVyNF8yCiAKIHByZWRfbHQ0X2FzbToKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCmluZGV4IDhjNDc3Y2EuLjBiMmVhODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F1dG9jb3JyLmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlICJhY2VscC5oIgogI2luY2x1ZGUgImhhbV93aW5kLnRhYiIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgQXV0b2NvcnIoCiAJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogSW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICovCiAJCVdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MCw2ICs0Miw4IEBACiAJV29yZDMyIExfc3VtLCBMX3N1bTEsIExfdG1wLCBGX0xFTjsKIAlXb3JkMTYgKnAxLCpwMiwqcDM7CiAJY29uc3QgV29yZDE2ICpwNDsKKyAgICAgICAgVU5VU0VEKG0pOworCiAJLyogV2luZG93aW5nIG9mIHNpZ25hbCAqLwogCXAxID0geDsKIAlwNCA9IHZvX3dpbmRvdzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwppbmRleCBhY2JhNTMyLi40YzFmN2Q0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSAidHlwZWRlZi5oIgogI2luY2x1ZGUgImJhc2ljX29wLmgiCiAKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCiB2b2lkIENvbnZvbHZlICgKIAkJV29yZDE2IHhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCQlXb3JkMTYgaFtdLCAgICAgICAgLyogKGkpICAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNSw2ICszNyw4IEBACiAJV29yZDMyICBpLCBuOwogCVdvcmQxNiAqdG1wSCwqdG1wWDsKIAlXb3JkMzIgczsKKyAgICAgICAgVU5VU0VEKEwpOworCiAJZm9yIChuID0gMDsgbiA8IDY0OykKIAl7CiAJCXRtcEggPSBoK247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKaW5kZXggMGQ2NmMzMS4uYjY2YjU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0Y2hfZjQuYwpAQCAtMzEsNiArMzEsOCBAQAogI2RlZmluZSBVUF9TQU1QICAgICAgNAogI2RlZmluZSBMX0lOVEVSUE9MMSAgNAogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyogTG9jYWwgZnVuY3Rpb25zICovCiAKICNpZmRlZiBBU01fT1BUCkBAIC0xNzEsNiArMTczLDcgQEAKIAlXb3JkMzIgY29yciwgZXhwX2NvcnIsIG5vcm0sIGV4cCwgc2NhbGU7CiAJV29yZDE2IGV4cF9ub3JtLCBleGNmW0xfU1VCRlJdLCB0bXA7CiAJV29yZDMyIExfdG1wLCBMX3RtcDEsIExfdG1wMjsKKyAgICAgICAgVU5VU0VEKExfc3ViZnIpOwogCiAJLyogY29tcHV0ZSB0aGUgZmlsdGVyZWQgZXhjaXRhdGlvbiBmb3IgdGhlIGZpcnN0IGRlbGF5IHRfbWluICovCiAJayA9IC10X21pbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwppbmRleCAxYmRhMDVhLi45NjFhYWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSAibWF0aF9vcC5oIgogI2luY2x1ZGUgImNuc3QuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIHZvaWQgU3luX2ZpbHQoCiAJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8KIAkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTUsNiArOTcsOCBAQAogCVdvcmQzMiBpLGEwOwogCVdvcmQzMiBMX3RtcCwgTF90bXAxOwogCVdvcmQxNiAqcDEsICpwMiwgKnAzOworICAgICAgICBVTlVTRUQobSk7CisKIAlhMCA9IGFbMF0gPj4gKDQgKyBRbmV3KTsgICAgICAgICAgLyogaW5wdXQgLyAxNiBhbmQgPj5RbmV3ICovCiAJLyogRG8gdGhlIGZpbHRlcmluZy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKaW5kZXggZWE5ZGE1Mi4uZGY3YjliMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlICJtZW1fYWxpZ24uaCIKICNpbmNsdWRlICJjbW5NZW1vcnkuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTE2MDIsNiArMTYwNCw4IEBACiAJVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsKICNlbmRpZgogCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QOworICAgICAgICBVTlVTRUQodlR5cGUpOworCiAJaW50IGludGVyTWVtID0gMDsKIAogCWlmKHBVc2VyRGF0YSA9PSBOVUxMIHx8IHBVc2VyRGF0YS0+bWVtZmxhZyAhPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SIHx8IHBVc2VyRGF0YS0+bWVtRGF0YSA9PSBOVUxMICkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2NvbW1vbi9BbmRyb2lkLm1rCmluZGV4IDIyZGVlMTUuLjg0NGVmMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9jb21tb24vQW5kcm9pZC5tawpAQCAtMTYsNCArMTYsNiBAQAogCSQoTE9DQUxfUEFUSCkvc3JjIFwKICAJJChMT0NBTF9QQVRIKS9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCmluZGV4IDdkMTdjMmEuLjUzN2JhNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMzAsNiArMzAsOCBAQAogTE9DQUxfQ0ZMQUdTIDo9IFwKICAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC02OSw0ICs3MSw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9oMjY0ZW5jCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5jcHAKaW5kZXggNGE2NjFmMC4uODBiYzM5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmNwcApAQCAtMzQsOCArMzQsMTAgQEAKIAogI2luY2x1ZGUgIlNvZnRBVkNFbmNvZGVyLmgiCiAKLSNpZm5kZWYgSU5UMzJfTUFYCi0jZGVmaW5lIElOVDMyX01BWCAgIDIxNDc0ODM2NDcKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KSAodm9pZCkoeCkKKyNlbHNlCisjZGVmaW5lIFVOVVNFRF9VTkxFU1NfVkVSQk9TRSh4KQogI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEwOSw0NSArMTExLDE1IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotaW5saW5lIHN0YXRpYyB2b2lkIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgIHVpbnQ4X3QgKmlueXV2LCB1aW50OF90KiBvdXR5dXYsCi0gICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0KLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweShvdXR5LCBpbnl1diwgb3V0WXNpemUpOwotCi0gICAgLyogVSAmIFYgY29weWluZyAqLwotICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgewotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOwotICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOwotCi0gICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKLSAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7Ci0gICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0aWMgdm9pZCogTWFsbG9jV3JhcHBlcigKLSAgICAgICAgdm9pZCAqdXNlckRhdGEsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCBhdHRycykgeworICAgICAgICB2b2lkICogLyogdXNlckRhdGEgKi8sIGludDMyX3Qgc2l6ZSwgaW50MzJfdCAvKiBhdHRycyAqLykgewogICAgIHZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKICAgICBpZiAocHRyKQogICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKICAgICByZXR1cm4gcHRyOwogfQogCi1zdGF0aWMgdm9pZCBGcmVlV3JhcHBlcih2b2lkICp1c2VyRGF0YSwgdm9pZCogcHRyKSB7CitzdGF0aWMgdm9pZCBGcmVlV3JhcHBlcih2b2lkICogLyogdXNlckRhdGEgKi8sIHZvaWQqIHB0cikgewogICAgIGZyZWUocHRyKTsKIH0KIApAQCAtMTc2LDcgKzE0OCw3IEBACiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgIDogU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudChuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtVmlkZW9XaWR0aCgxNzYpLAogICAgICAgbVZpZGVvSGVpZ2h0KDE0NCksCiAgICAgICBtVmlkZW9GcmFtZVJhdGUoMzApLApAQCAtMjIxLDcgKzE5Myw3IEBACiAgICAgbUhhbmRsZS0+Q0JBVkNfRnJlZSA9IEZyZWVXcmFwcGVyOwogCiAgICAgQ0hFQ0sobUVuY1BhcmFtcyAhPSBOVUxMKTsKLSAgICBtZW1zZXQobUVuY1BhcmFtcywgMCwgc2l6ZW9mKG1FbmNQYXJhbXMpKTsKKyAgICBtZW1zZXQobUVuY1BhcmFtcywgMCwgc2l6ZW9mKCptRW5jUGFyYW1zKSk7CiAgICAgbUVuY1BhcmFtcy0+cmF0ZV9jb250cm9sID0gQVZDX09OOwogICAgIG1FbmNQYXJhbXMtPmluaXRRUCA9IDA7CiAgICAgbUVuY1BhcmFtcy0+aW5pdF9DQlBfcmVtb3ZhbF9kZWxheSA9IDE2MDA7CkBAIC0yNTgsOSArMjMwLDEwIEBACiAKICAgICBtRW5jUGFyYW1zLT51c2Vfb3ZlcnJ1bl9idWZmZXIgPSBBVkNfT0ZGOwogCi0gICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKKyAgICAgICAgICAgIHx8IG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gaXMgbmVlZGVkLgotICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEgPT0gTlVMTCk7CisgICAgICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICAgICAgaWYgKCgodWludDY0X3QpbVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQpID4gKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgewogICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwpAQCAtMzU0LDEwICszMjcsMTAgQEAKICAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKG1IYW5kbGUpOwogICAgIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CiAKLSAgICBkZWxldGUgbUlucHV0RnJhbWVEYXRhOworICAgIGZyZWUobUlucHV0RnJhbWVEYXRhKTsKICAgICBtSW5wdXRGcmFtZURhdGEgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1TbGljZUdyb3VwOworICAgIGZyZWUobVNsaWNlR3JvdXApOwogICAgIG1TbGljZUdyb3VwID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtRW5jUGFyYW1zOwpAQCAtNjMwLDYgKzYwMywxNyBAQAogICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKICAgICAgICAgICAgICAgICBtVmlkZW9GcmFtZVJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwogICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcG9ydERlZiA9CisgICAgICAgICAgICAgICAgICAgICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICAgICAgICAgICAgICBwb3J0RGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIChPTVhfQ09MT1JfRk9STUFUVFlQRSkgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgcG9ydERlZiA9ICZlZGl0UG9ydEluZm8oMSktPm1EZWY7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1WaWRlb0hlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVZpZGVvQml0UmF0ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlOwogICAgICAgICAgICAgfQpAQCAtNzUwLDE1ICs3MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluQnVmZmVycyA/ICIgdHJ1ZSIgOiAiZmFsc2UiKTsKIAogICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0KSA+ICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopIG1hbGxvYygobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzICkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtNzY5LDcgKzc0NSw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBVkNFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRBVkNFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2F3SW5wdXRFT1MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTg0Miw4ICs4MTgsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90IHNyY0J1ZmZlcjsgLy8gZm9yIE1ldGFEYXRhTW9kZSBvbmx5Ci0KICAgICAgICAgLy8gR2V0IG5leHQgaW5wdXQgdmlkZW8gZnJhbWUKICAgICAgICAgaWYgKG1SZWFkeUZvck5leHRGcmFtZSkgewogICAgICAgICAgICAgLy8gU2F2ZSB0aGUgaW5wdXQgYnVmZmVyIGluZm8gc28gdGhhdCBpdCBjYW4gYmUKQEAgLTg2NCwxOCArODM4LDIwIEBACiAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCAgKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgICAgICB2aWRlb0lucHV0LnBpdGNoID0gKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0OwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuY29kaW5nX3RpbWVzdGFtcCA9IChpbkhlYWRlci0+blRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKLSAgICAgICAgICAgICAgICB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0RGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTWV0YURhdGEgYnVmZmVyIGlzIHdyb25nIHNpemUhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJWx1IGJ5dGVzLCBleHBlY3RlZCA4KSIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJXUgYnl0ZXMsIGV4cGVjdGVkIDgpIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFsbG9jRGF0YShpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhLCAobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LCBpbkhlYWRlci0+bkZpbGxlZExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dERhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBleHRyYWN0IGdyYWxsb2MgYnVmZmVyIGluIG1ldGFkYXRhIG1vZGUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC04ODQsMTYgKzg2MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeS9jb252ZXJ0IHBpeGVsIGZvcm1hdCBlbnVtCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gKHVpbnQ4X3QgKilpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSAoY29uc3QgdWludDhfdCAqKWluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9IG1JbnB1dEZyYW1lRGF0YTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQ0hFQ0soaW5wdXREYXRhICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMF0gPSBpbnB1dERhdGE7CisgICAgICAgICAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclswXSA9ICh1aW50OF90ICopaW5wdXREYXRhOwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMV0gPSB2aWRlb0lucHV0LllDYkNyWzBdICsgdmlkZW9JbnB1dC5oZWlnaHQgKiB2aWRlb0lucHV0LnBpdGNoOwogICAgICAgICAgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMl0gPSB2aWRlb0lucHV0LllDYkNyWzFdICsKICAgICAgICAgICAgICAgICAgICAgKCh2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2gpID4+IDIpOwpAQCAtOTEwLDE0ICs4ODYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImVuY29kZXJTdGF0dXMgPSAlZCBhdCBsaW5lICVkIiwgZW5jb2RlclN0YXR1cywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTk1Nyw3ICs5MzEsNiBAQAogICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVyU3RhdHVzID0gJWQgYXQgbGluZSAlZCIsIGVuY29kZXJTdGF0dXMsIF9fTElORV9fKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC05NjcsNyArOTQwLDYgQEAKIAogICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICByZWxlYXNlR3JhbGxvY0RhdGEoc3JjQnVmZmVyKTsKICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKIAogICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKQEAgLTEwMTEsNTAgKzk4MywxMCBAQAogfQogCiB2b2lkIFNvZnRBVkNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKGJ1ZmZlcik7CiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkOiAlcCIsIGJ1ZmZlcik7CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdEFWQ0VuY29kZXI6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewotICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpKSB7Ci0gICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwotICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLX0KLQotdWludDhfdCAqU29mdEFWQ0VuY29kZXI6OmV4dHJhY3RHcmFsbG9jRGF0YSh2b2lkICpkYXRhLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcikgewotICAgIE9NWF9VMzIgdHlwZSA9ICooT01YX1UzMiopZGF0YTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKHR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgQUxPR0UoIkRhdGEgcGFzc2VkIGluIHdpdGggbWV0YWRhdGEgbW9kZSBkb2VzIG5vdCBoYXZlIHR5cGUgIgotICAgICAgICAgICAgICAgICJrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSAoJWQpLCBoYXMgdHlwZSAlbGQgaW5zdGVhZCIsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UsIHR5cGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnVmZmVyX2hhbmRsZV90IGltZ0J1ZmZlciA9ICooYnVmZmVyX2hhbmRsZV90KikoKHVpbnQ4X3QqKWRhdGEgKyA0KTsKLQotICAgIGNvbnN0IFJlY3QgcmVjdChtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICB1aW50OF90ICppbWc7Ci0gICAgcmVzID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jayhpbWdCdWZmZXIsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICByZWN0LCAodm9pZCoqKSZpbWcpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqYnVmZmVyID0gaW1nQnVmZmVyOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLXZvaWQgU29mdEFWQ0VuY29kZXI6OnJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKSB7Ci0gICAgaWYgKG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7Ci0gICAgICAgIEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLnVubG9jayhidWZmZXIpOwotICAgIH0KLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9Tb2Z0QVZDRW5jb2Rlci5oCmluZGV4IDIzZDVmZjEuLjEzMDU5M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL1NvZnRBVkNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvU29mdEFWQ0VuY29kZXIuaApAQCAtMjIsMTQgKzIyLDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCi0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKIHN0cnVjdCBTb2Z0QVZDRW5jb2RlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRBVkNFbmNvZGVyKAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKQEAgLTQ1LDExICs0NSw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAKLSAgICAvLyBPdmVycmlkZSBTb2Z0T01YQ29tcG9uZW50IG1ldGhvZHMKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogICAgIC8vIEltcGxlbWVudCBNZWRpYUJ1ZmZlck9ic2VydmVyCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOwogCkBAIC02NywxMCArNjIsNiBAQAogICAgICAgICBrTnVtQnVmZmVycyA9IDIsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4ID0gT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgKyAxCi0gICAgfTsKLQogICAgIC8vIE9NWCBpbnB1dCBidWZmZXIncyB0aW1lc3RhbXAgYW5kIGZsYWdzCiAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CkBAIC0xMDksOSArMTAwLDYgQEAKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAgICAgdm9pZCByZWxlYXNlT3V0cHV0QnVmZmVycygpOwogCi0gICAgdWludDhfdCogZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKLSAgICB2b2lkIHJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKTsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkNFbmNvZGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKaW5kZXggMGUzMDM3Zi4uZDcxYzMyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKQEAgLTEwMyw2ICsxMDMsMTUgQEAKICAgICB7CiAgICAgICAgIG51bV9iaXRzIC09IDg7CiAgICAgICAgIGJ5dGUgPSAoY3VycmVudF93b3JkID4+IG51bV9iaXRzKSAmIDB4RkY7CisgICAgICAgIGlmIChzdHJlYW0tPmNvdW50X3plcm9zID09IDIpCisgICAgICAgIHsgICAvKiBmb3IgbnVtX2JpdHMgPSAzMiwgdGhpcyBjYW4gYWRkIDIgbW9yZSBieXRlcyBleHRyYSBmb3IgRVBCUyAqLworICAgICAgICAgICAgaWYgKGJ5dGUgPD0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSAweDM7CisgICAgICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZSAhPSAwKQogICAgICAgICB7CiAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOwpAQCAtMTE0LDEyICsxMjMsNiBAQAogICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcysrOwogICAgICAgICAgICAgKndyaXRlX3BudCsrID0gYnl0ZTsKICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtLT5jb3VudF96ZXJvcyA9PSAyKQotICAgICAgICAgICAgeyAgIC8qIGZvciBudW1fYml0cyA9IDMyLCB0aGlzIGNhbiBhZGQgMiBtb3JlIGJ5dGVzIGV4dHJhIGZvciBFUEJTICovCi0gICAgICAgICAgICAgICAgKndyaXRlX3BudCsrID0gMHgzOwotICAgICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawppbmRleCBhMzNjYjkyLi5iMDAxMGZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0xNCw2ICsxNCw4IEBACiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAkkKExPQ0FMX1BBVEgpL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQ29uZmlnLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKaW5kZXggYTZkNDI4Ni4uYTg0M2NlZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKQEAgLTE0LDggKzE0LDEwIEBACiBlbmRpZgogCiAjIERvIHdlIGFsc28gbmVlZCB0byBjaGVjayBvbiBBUkNIX0FSTV9IQVZFX0FSTVY3QT8gLSBwcm9iYWJseSBub3QKLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQotVk9UVCA6PSB2NworaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorICBpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgICBWT1RUIDo9IHY3CisgIGVuZGlmCiBlbmRpZgogCiBWT1RFU1QgOj0gMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMKaW5kZXggYWE1MmJkOS4uNWJiNmNjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9jbW5NZW1vcnkuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCkBAIC0yNiw4ICsyNiwxMiBAQAogCiAvL1ZPX01FTV9PUEVSQVRPUgkJZ19tZW1PUDsKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIFZPX1UzMiBjbW5NZW1BbGxvYyAoVk9fUzMyIHVJRCwgIFZPX01FTV9JTkZPICogcE1lbUluZm8pCiB7CisgICAgICAgIFVOVVNFRCh1SUQpOworCiAJaWYgKCFwTWVtSW5mbykKIAkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKIApAQCAtMzcsMzQgKzQxLDQ4IEBACiAKIFZPX1UzMiBjbW5NZW1GcmVlIChWT19TMzIgdUlELCBWT19QVFIgcE1lbSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAlmcmVlIChwTWVtKTsKIAlyZXR1cm4gMDsKIH0KIAogVk9fVTMyCWNtbk1lbVNldCAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmLCBWT19VOCB1VmFsdWUsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAltZW1zZXQgKHBCdWZmLCB1VmFsdWUsIHVTaXplKTsKIAlyZXR1cm4gMDsKIH0KIAogVk9fVTMyCWNtbk1lbUNvcHkgKFZPX1MzMiB1SUQsIFZPX1BUUiBwRGVzdCwgVk9fUFRSIHBTb3VyY2UsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAltZW1jcHkgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKIFZPX1UzMgljbW5NZW1DaGVjayAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisgICAgICAgIFVOVVNFRChwQnVmZmVyKTsKKyAgICAgICAgVU5VU0VEKHVTaXplKTsKKwogCXJldHVybiAwOwogfQogCiBWT19TMzIgY21uTWVtQ29tcGFyZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIxLCBWT19QVFIgcEJ1ZmZlcjIsIFZPX1UzMiB1U2l6ZSkKIHsKKyAgICAgICAgVU5VU0VEKHVJRCk7CisKIAlyZXR1cm4gbWVtY21wKHBCdWZmZXIxLCBwQnVmZmVyMiwgdVNpemUpOwogfQogCiBWT19VMzIJY21uTWVtTW92ZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQogeworICAgICAgICBVTlVTRUQodUlEKTsKKwogCW1lbW1vdmUgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCmluZGV4IGYwMWQ2MDUuLjU5YTExZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLm1rCkBAIC05LDYgKzksOCBAQAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBleHRlcm5hbC9mbGFjL2luY2x1ZGUKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IGZjYzE5OWUuLmUxZWUzYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0yNyw2ICsyNywxMiBAQAogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQogI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAogCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkgKHZvaWQpKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoeCkKKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0yMTcsNyArMjIzLDcgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7CiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIEFMT0dWKCJ3aWxsIGVuY29kZSAlbGQgY2hhbm5lbHMgYXQgJWxkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIEFMT0dWKCJ3aWxsIGVuY29kZSAlZCBjaGFubmVscyBhdCAlZEh6IiwgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVFbmNvZGVyKCk7CiAgICAgICAgIH0KQEAgLTI2Nyw3ICsyNzMsNyBAQAogCiAgICAgICAgICAgICBpZiAoZGVmUGFyYW1zLT5uUG9ydEluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICBpZiAoZGVmUGFyYW1zLT5uQnVmZmVyU2l6ZSA+IGtNYXhJbnB1dEJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBzaXplIG11c3QgYmUgYXQgbW9zdCAlenUgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIHNpemUgbXVzdCBiZSBhdCBtb3N0ICVkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhJbnB1dEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4Myw4ICsyODksOCBAQAogfQogCiB2b2lkIFNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewotCi0gICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChwb3J0SW5kZXg9JWxkKSIsIHBvcnRJbmRleCk7CisgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHBvcnRJbmRleCk7CisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChwb3J0SW5kZXg9JWQpIiwgcG9ydEluZGV4KTsKIAogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMzE2LDcgKzMyMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiBrTWF4SW5wdXRCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWxkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBBTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNjksMTYgKzM3NSwxNyBAQAogICAgIH0KIH0KIAotCiBGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgU29mdEZsYWNFbmNvZGVyOjpvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAogICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgewotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoYnl0ZXM9JWQsIHNhbXBsZXM9JWQsIGN1cnJfZnJhbWU9JWQpIiwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUpIHsKKyAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoY3VycmVudF9mcmFtZSk7CisgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwKICAgICAgICAgICAgIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIAogI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgogICAgIGlmIChzYW1wbGVzID09IDApIHsKLSAgICAgICAgQUxPR0koIiBzYXZpbmcgJWQgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOworICAgICAgICBBTE9HSSgiIHNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOwogICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOwogICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKQEAgLTM4OSw3ICszOTYsNyBAQAogICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKICAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKICAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKLSAgICAgICAgQUxPR1YoImlnbm9yaW5nICVkIGJ5dGVzIG9mIGhlYWRlciBkYXRhIChzYW1wbGVzPSVkKSIsIGJ5dGVzLCBzYW1wbGVzKTsKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CiAgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CiAgICAgfQogCkBAIC00MTAsOSArNDE3LDkgQEAKICNlbmRpZgogCiAgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCi0gICAgQUxPR1YoIiB3cml0aW5nICVkIGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQgcG9ydCIsIGJ5dGVzKTsKKyAgICBBTE9HVigiIHdyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQgcG9ydCIsIGJ5dGVzKTsKICAgICBpZiAoYnl0ZXMgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldCAtIG91dEhlYWRlci0+bkZpbGxlZExlbikgewotICAgICAgICBBTE9HRSgiIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV1IGJ5dGVzIiwgYnl0ZXMpOworICAgICAgICBBTE9HRSgiIG5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICV6dSBieXRlcyIsIGJ5dGVzKTsKICAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZwogICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOwogICAgIH0KQEAgLTQzMSw3ICs0MzgsNyBAQAogCiAKIE9NWF9FUlJPUlRZUEUgU29mdEZsYWNFbmNvZGVyOjpjb25maWd1cmVFbmNvZGVyKCkgewotICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmNvbmZpZ3VyZUVuY29kZXIoKSBudW1DaGFubmVsPSVsZCwgc2FtcGxlUmF0ZT0lbGQiLAorICAgIEFMT0dWKCJTb2Z0RmxhY0VuY29kZXI6OmNvbmZpZ3VyZUVuY29kZXIoKSBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwKICAgICAgICAgICAgIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCAobUZsYWNTdHJlYW1FbmNvZGVyID09IE5VTEwpKSB7CkBAIC00NzAsOCArNDc3LDEyIEBACiAKIC8vIHN0YXRpYwogRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIFNvZnRGbGFjRW5jb2Rlcjo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqZW5jb2RlciwgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKLSAgICAgICAgICAgIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywgdW5zaWduZWQgY3VycmVudF9mcmFtZSwgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKiAvKiBlbmNvZGVyICovLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKICAgICByZXR1cm4gKChTb2Z0RmxhY0VuY29kZXIqKSBjbGllbnRfZGF0YSktPm9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCiAgICAgICAgICAgICBidWZmZXIsIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKaW5kZXggNGM4MGRhNi4uYTAxMTJlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKQEAgLTE0LDQgKzE0LDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2c3MTFkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCmluZGV4IGVhN2RhY2YuLjJhYzNlNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcApAQCAtMTIxLDcgKzEyMSwxNCBAQAogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlucHV0IHBvcnQKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gbUlzTUxhdyA/IE9NWF9BVURJT19QQ01Nb2RlTVVMYXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9NWF9BVURJT19QQ01Nb2RlQUxhdzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb3V0cHV0IHBvcnQKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CiAKQEAgLTE5NCw3ICsyMDEsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0RzcxMTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIyNCw3ICsyMzEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heE51bVNhbXBsZXNQZXJGcmFtZSkgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVsZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CiAKICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5tawppbmRleCA3MTYxM2QyLi4zMDg2OGQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQubWsKQEAgLTksNiArOSw4IEBACiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgIGV4dGVybmFsL2xpYmdzbS9pbmMKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIGxpYmxvZwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IDUxMzJiNjMuLmJiYjQ1ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0xODQsNyArMTg0LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdEdTTTo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0R1NNOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjE0LDEzICsyMTQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCgoaW5IZWFkZXItPm5GaWxsZWRMZW4gLyA2NSkgKiA2NSkgIT0gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mIDY1ICglbGQpLiIsIGluSGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgbm90IG11bHRpcGxlIG9mIDY1ICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAoraWZlcSAoJChpZiAkKHdpbGRjYXJkIGV4dGVybmFsL2xpYmhldmMpLDEsMCksMSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICAgICAgICAgIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYworTE9DQUxfTU9EVUxFX1RBR1MgICAgICAgOj0gb3B0aW9uYWwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyAgOj0gbGliaGV2Y2RlYworTE9DQUxfU1JDX0ZJTEVTICAgICAgICAgOj0gU29mdEhFVkMuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChUT1ApL2V4dGVybmFsL2xpYmhldmMvZGVjb2RlcgorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZXh0ZXJuYWwvbGliaGV2Yy9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUyArPSAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnN0YWdlZnJpZ2h0CitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgICs9IGxpYnV0aWxzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICArPSBsaWJsb2cKKworIyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY3VycmVudCBhc20gZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgbGluayBlcnJvcjoKKyMgcmVxdWlyZXMgdW5zdXBwb3J0ZWQgZHluYW1pYyByZWxvYyBSX0FSTV9SRUwzMjsgcmVjb21waWxlIHdpdGggLWZQSUMKKyMgQnVnOiAxNjg1MzI5MQorTE9DQUxfTERGTEFHUyA6PSAtV2wsLUJzeW1ib2xpYworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2M2QwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApAQCAtMCwwICsxLDc3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdEhFVkMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisjaW5jbHVkZSAiaXRocmVhZC5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKKyNpbmNsdWRlICJTb2Z0SEVWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGNvbXBvbmVudE5hbWUgICAgICAgICAgICAgICAgICAgInZpZGVvX2RlY29kZXIuaGV2YyIKKyNkZWZpbmUgY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fQ29kaW5nSEVWQworI2RlZmluZSBDT0RFQ19NSU1FX1RZUEUgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKKworLyoqIEZ1bmN0aW9uIGFuZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8ga2VlcCBjb2RlIHNpbWlsYXIgZm9yIGVhY2ggY29kZWMgKi8KKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGloZXZjZF9jeGFfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaWhldmNkX2N4YV9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpaGV2Y2RfY3hhX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaWhldmNkX2N4YV9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorCisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisKK3N0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0geworICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMSAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMyAgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0ICB9LAorICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNDEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUgIH0sCisgICAgeyBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorfTsKKworU29mdEhFVkM6OlNvZnRIRVZDKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KG5hbWUsIGNvbXBvbmVudE5hbWUsIGNvZGluZ1R5cGUsCisgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCisgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywKKyAgICAgICAgICAgIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtTWVtUmVjb3JkcyhOVUxMKSwKKyAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1PbXhDb2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1OZXdXaWR0aChtV2lkdGgpLAorICAgICAgbU5ld0hlaWdodChtSGVpZ2h0KSwKKyAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpIHsKKyAgICBpbml0UG9ydHMoa051bUJ1ZmZlcnMsIElOUFVUX0JVRl9TSVpFLCBrTnVtQnVmZmVycywKKyAgICAgICAgICAgIENPREVDX01JTUVfVFlQRSk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdEhFVkM6On5Tb2Z0SEVWQygpIHsKKyAgICBBTE9HRCgiSW4gU29mdEhFVkM6On5Tb2Z0SEVWQyIpOworICAgIENIRUNLX0VRKGRlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dEKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKwordm9pZCBTb2Z0SEVWQzo6bG9nVmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfY3RsX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfY3RsX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgc19jdGxfaXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfY3RsX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uIG51bWJlcjogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkl0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzX2N0bF9pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19jdGxfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfY3RsX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMilzdHJpZGU7CisgICAgc19jdGxfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKworICAgIHNfY3RsX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfY3RsX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKworICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwKKyAgICAgICAgICAgICh2b2lkICopJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyB0aGUgcnVuLXRpbWUgcGFyYW1ldGVyczogMHgleCIsCisgICAgICAgICAgICAgICAgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1Jc0luRmx1c2ggPSBmYWxzZTsKKyAgICBtUmVjZWl2ZWRFT1MgPSBmYWxzZTsKKyAgICBtZW1zZXQobVRpbWVTdGFtcHMsIDAsIHNpemVvZihtVGltZVN0YW1wcykpOworICAgIG1lbXNldChtVGltZVN0YW1wc1ZhbGlkLCAwLCBzaXplb2YobVRpbWVTdGFtcHNWYWxpZCkpOworCisgICAgLyogSW5pdGlhbGl6ZSBib3RoIHN0YXJ0IGFuZCBlbmQgdGltZXMgKi8KKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIE5VTEwpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX2N0bF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19jdGxfb3A7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19jdGxfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworCisgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19jdGxfaXAsCisgICAgICAgICAgICAodm9pZCAqKSZzX2N0bF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiByZXNldDogMHgleCIsIHNfY3RsX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzICovCisgICAgc2V0UGFyYW1zKG91dHB1dEJ1ZmZlcldpZHRoKCkpOworCisgICAgLyogU2V0IG51bWJlciBvZiBjb3Jlcy90aHJlYWRzIHRvIGJlIHVzZWQgYnkgdGhlIGNvZGVjICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X2NvcmVzX29wOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBzX3NldF9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfY29yZXNfaXAudTRfbnVtX2NvcmVzID0gTUlOKG1OdW1Db3JlcywgQ09ERUNfTUFYX05VTV9DT1JFUyk7CisgICAgc19zZXRfY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgQUxPR0QoIlNldCBudW1iZXIgb2YgY29yZXMgdG8gJXUiLCBzX3NldF9jb3Jlc19pcC51NF9udW1fY29yZXMpOworICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfc2V0X2NvcmVzX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc19zZXRfY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gc2V0dGluZyBudW1iZXIgb2YgY29yZXM6IDB4JXgiLAorICAgICAgICAgICAgICAgIHNfc2V0X2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTb2Z0SEVWQzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc192aWRlb19mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc192aWRlb19mbHVzaF9vcDsKKworICAgIHNfdmlkZW9fZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3ZpZGVvX2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfdmlkZW9fZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIEFMT0dEKCJTZXQgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZSAiKTsKKworICAgIC8qIFNldCB0aGUgZGVjb2RlciBpbiBGbHVzaCBtb2RlLCBzdWJzZXF1ZW50IGRlY29kZSgpIGNhbGxzIHdpbGwgZmx1c2ggKi8KKyAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX3ZpZGVvX2ZsdXNoX2lwLAorICAgICAgICAgICAgKHZvaWQgKikmc192aWRlb19mbHVzaF9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHNldHRpbmcgdGhlIGRlY29kZXIgaW4gZmx1c2ggbW9kZTogKCVkKSAweCV4Iiwgc3RhdHVzLAorICAgICAgICAgICAgICAgIHNfdmlkZW9fZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Jc0luRmx1c2ggPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmluaXREZWNvZGVyKCkgeworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKKworICAgIFVXT1JEMzIgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgIFVXT1JEMzIgdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgVVdPUkQzMiB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICBXT1JEMzIgaTRfbGV2ZWw7CisKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICAgIC8qIEluaXRpYWxpemUgbnVtYmVyIG9mIHJlZiBhbmQgcmVvcmRlciBtb2RlcyAoZm9yIEhFVkMpICovCisgICAgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CisgICAgdTRfbnVtX3JlZl9mcmFtZXMgPSAxNjsKKyAgICB1NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CisgICAgdWludDMyX3QgZGlzcGxheVNpemVZID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisKKyAgICBpZiAoZGlzcGxheVNpemVZID4gKDE5MjAgKiAxMDg4KSkgeworICAgICAgICBpNF9sZXZlbCA9IDUwOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDEyODAgKiA3MjApKSB7CisgICAgICAgIGk0X2xldmVsID0gNDA7CisgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoOTYwICogNTQwKSkgeworICAgICAgICBpNF9sZXZlbCA9IDMxOworICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDY0MCAqIDM2MCkpIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAzMDsKKyAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgzNTIgKiAyODgpKSB7CisgICAgICAgIGk0X2xldmVsID0gMjE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaTRfbGV2ZWwgPSAyMDsKKyAgICB9CisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKyAgICAgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisKKyAgICAgICAgQUxPR1YoIkdldCBudW1iZXIgb2YgbWVtIHJlY29yZHMiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQqKSZzX251bV9tZW1fcmVjX2lwLAorICAgICAgICAgICAgICAgICh2b2lkKikmc19udW1fbWVtX3JlY19vcCk7CisgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisgICAgfQorCisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190KilpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChtTWVtUmVjb3JkcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1zZXQobU1lbVJlY29yZHMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0KKyAgICAgICAgICAgIHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmk0X2xldmVsID0gaTRfbGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfbnVtX3Jlb3JkZXJfZnJhbWVzID0gdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOworICAgICAgICBzX2ZpbGxfbWVtX2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSB1NF9zaGFyZV9kaXNwX2J1ZjsKKyAgICAgICAgc19maWxsX21lbV9pcC51NF9udW1fZXh0cmFfZGlzcF9idWYgPSAwOworICAgICAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworCisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IGRpc3BsYXlTdHJpZGU7CisgICAgICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IGRpc3BsYXlIZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9CisgICAgICAgICAgICBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKQorICAgICAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19maWxsX21lbV9pcCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSZzX2ZpbGxfbWVtX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0KKyAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkOworCisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBJVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KKyAgICB7CisgICAgICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgICAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgICAgICB2b2lkICpkZWNfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gZGlzcGxheVN0cmlkZTsKKyAgICAgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gZGlzcGxheUhlaWdodDsKKworICAgICAgICBzX2luaXRfaXAuaTRfbGV2ZWwgPSBpNF9sZXZlbDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZW9yZGVyX2ZyYW1lcyA9IHU0X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9yZWZfZnJhbWVzID0gdTRfbnVtX3JlZl9mcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IHU0X3NoYXJlX2Rpc3BfYnVmOworICAgICAgICBzX2luaXRfaXAudTRfbnVtX2V4dHJhX2Rpc3BfYnVmID0gMDsKKworICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2Yoc19pbml0X29wKTsKKworICAgICAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3JGb3JtYXQ7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90KiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgICAgICBtQ29kZWNDdHgtPnB2X2Z4bnMgPSBkZWNfZnhuczsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgICAgICBBTE9HRCgiSW5pdGlhbGl6aW5nIGRlY29kZXIiKTsKKyAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICh2b2lkICopJnNfaW5pdF9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIGluaXQ6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNldCB0aGUgcGx1Z2luIHN0YXRlICovCisgICAgcmVzZXRQbHVnaW4oKTsKKworICAgIC8qIFNldCB0aGUgcnVuIHRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KKyAgICBzZXRQYXJhbXMoZGlzcGxheVN0cmlkZSk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGNvcmVzL3RocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgY29kZWMgKi8KKyAgICBzZXROdW1Db3JlcygpOworCisgICAgLyogR2V0IGNvZGVjIHZlcnNpb24gKi8KKyAgICBsb2dWZXJzaW9uKCk7CisKKyAgICAvKiBBbGxvY2F0ZSBpbnRlcm5hbCBwaWN0dXJlIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKKyAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbUluaXROZWVkZWQgPSBmYWxzZTsKKyAgICBtRmx1c2hOZWVkZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpkZUluaXREZWNvZGVyKCkgeworICAgIHNpemVfdCBpOworCisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIEFMT0dEKCJGcmVlaW5nIGNvZGVjIG1lbW9yeSIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgaWYocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihtRmx1c2hPdXRCdWZmZXIpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtRmx1c2hPdXRCdWZmZXIpOworICAgICAgICBtRmx1c2hPdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICBtQ2hhbmdpbmdSZXNvbHV0aW9uID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNvZnRIRVZDOjpyZUluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldDsKKworICAgIGRlSW5pdERlY29kZXIoKTsKKworICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKKyAgICAgICAgZGVJbml0RGVjb2RlcigpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgU29mdEhFVkM6Om9uUmVzZXQoKSB7CisgICAgQUxPR0QoIm9uUmVzZXQgY2FsbGVkIik7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOworCisgICAgcmVzZXREZWNvZGVyKCk7CisgICAgcmVzZXRQbHVnaW4oKTsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0SEVWQzo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRXaWR0aCA9IG1XaWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBvbGRIZWlnaHQgPSBtSGVpZ2h0OworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgaWYgKG1XaWR0aCAhPSBvbGRXaWR0aCB8fCBtSGVpZ2h0ICE9IG9sZEhlaWdodCkgeworICAgICAgICByZUluaXREZWNvZGVyKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCisgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgeworICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICBzaXplX3Qgc2l6ZVVWOworCisgICAgcHNfZGVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICBwc19kZWNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisKKyAgICAvKiBXaGVuIGluIGZsdXNoIGFuZCBhZnRlciBFT1Mgd2l0aCB6ZXJvIGJ5dGUgaW5wdXQsCisgICAgICogaW5IZWFkZXIgaXMgc2V0IHRvIHplcm8uIEhlbmNlIGNoZWNrIGZvciBub24tbnVsbCAqLworICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gdGltZVN0YW1wSXg7CisgICAgICAgIHBzX2RlY19pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGluSGVhZGVyLT5wQnVmZmVyCisgICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKworICAgIHNpemVVViA9IHNpemVZIC8gNDsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOworCisgICAgdWludDhfdCAqcEJ1ZjsKKyAgICBpZiAob3V0SGVhZGVyKSB7CisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IHNpemVZICsgKHNpemVVViAqIDIpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtRmx1c2hPdXRCdWZmZXIgYWx3YXlzIGhhcyB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKKyAgICB9CisKKyAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CisgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHJldHVybiB0cnVlOworfQordm9pZCBTb2Z0SEVWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICAvKiBPbmNlIHRoZSBvdXRwdXQgYnVmZmVycyBhcmUgZmx1c2hlZCwgaWdub3JlIGFueSBidWZmZXJzIHRoYXQgYXJlIGhlbGQgaW4gZGVjb2RlciAqLworICAgIGlmIChrT3V0cHV0UG9ydEluZGV4ID09IHBvcnRJbmRleCkgeworICAgICAgICBzZXRGbHVzaE1vZGUoKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CisKKyAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIE5VTEwsIE5VTEwsIDApOworCisgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgaWYgKDAgPT0gc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRIRVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgVU5VU0VEKHBvcnRJbmRleCk7CisKKyAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworCisgICAgLyogSWYgaW5wdXQgRU9TIGlzIHNlZW4gYW5kIGRlY29kZXIgaXMgbm90IGluIGZsdXNoIG1vZGUsCisgICAgICogc2V0IHRoZSBkZWNvZGVyIGluIGZsdXNoIG1vZGUuCisgICAgICogVGhlcmUgY2FuIGJlIGEgY2FzZSB3aGVyZSBFT1MgaXMgc2VudCBhbG9uZyB3aXRoIGxhc3QgcGljdHVyZSBkYXRhCisgICAgICogSW4gdGhhdCBjYXNlLCBvbmx5IGFmdGVyIGRlY29kaW5nIHRoYXQgaW5wdXQgZGF0YSwgZGVjb2RlciBoYXMgdG8gYmUKKyAgICAgKiBwdXQgaW4gZmx1c2guIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGhlcmUgICovCisKKyAgICBpZiAobVJlY2VpdmVkRU9TICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgIHNldEZsdXNoTW9kZSgpOworICAgIH0KKworICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyOworICAgICAgICBzaXplX3QgdGltZVN0YW1wSXg7CisKKyAgICAgICAgaW5JbmZvID0gTlVMTDsKKyAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworCisgICAgICAgIGlmICghbUlzSW5GbHVzaCkgeworICAgICAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAwOworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMICYmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgQUxPR0QoIkVPUyBzZWVuIG9uIGlucHV0Iik7CisgICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIGFuIGluaXQgcmVxdWlyZWQgYW5kIHRoZSBkZWNvZGVyIGlzIG5vdCBpbiBmbHVzaCBtb2RlLAorICAgICAgICAvLyB1cGRhdGUgb3V0cHV0IHBvcnQncyBkZWZpbml0aW9uIGFuZCByZWluaXRpYWxpemUgZGVjb2Rlci4KKyAgICAgICAgaWYgKG1Jbml0TmVlZGVkICYmICFtSXNJbkZsdXNoKSB7CisgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgbU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGEgZnJlZSBzbG90IGluIHRpbWVzdGFtcCBhcnJheSB0byBob2xkIGlucHV0IHRpbWVzdGFtcCAqLworICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgICAgIHRpbWVTdGFtcEl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVElNRV9TVEFNUFM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghbVRpbWVTdGFtcHNWYWxpZFtpXSkgeworICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXBJeCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSB0cnVlOworICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzW3RpbWVTdGFtcEl4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOworICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOworICAgICAgICAgICAgV09SRDMyIHRpbWVEZWxheSwgdGltZVRha2VuOworICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CisKKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgYXJnIHNldHVwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBDb21wYXJlIHxzdGF0dXN8IHRvIElIRVZDRF9VTlNVUFBPUlRFRF9ESU1FTlNJT05TLCB3aGljaCBpcyBub3Qgb25lIG9mIHRoZQorICAgICAgICAgICAgLy8gSVZfQVBJX0NBTExfU1RBVFVTX1QsIHNlZW1zIGJlIHdyb25nLiBCdXQgdGhpcyBpcyB3aGF0IHRoZSBkZWNvZGVyIHJldHVybnMgcmlnaHQgbm93LgorICAgICAgICAgICAgLy8gVGhlIGRlY29kZXIgc2hvdWxkIGJlIGZpeGVkIHNvIHRoYXQgfHU0X2Vycm9yX2NvZGV8IGluc3RlYWQgb2YgfHN0YXR1c3wgcmV0dXJucworICAgICAgICAgICAgLy8gSUhFVkNEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMuCisgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkRGltZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgKChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHx8IChJSEVWQ0RfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY19vcC51NF9lcnJvcl9jb2RlKSk7CisgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworCisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgTlVMTCk7CisgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lVGFrZW49JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCB0aW1lVGFrZW4sIHRpbWVEZWxheSwKKyAgICAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyAmJiAhbUZsdXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChpbkhlYWRlciAhPSBOVUxMKSAmJiAoMSAhPSBzX2RlY19vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpKSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGlucHV0IGRpZCBub3QgY29udGFpbiBwaWN0dXJlIGRhdGEsIHRoZW4gaWdub3JlCisgICAgICAgICAgICAgICAgICogdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wICovCisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIENUUyBEZWNvZGVyVGVzdCB0ZXN0Q29kZWNSZXNldHNIRVZDV2l0aG91dFN1cmZhY2UsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3Qgc2VuZGluZyBTUFMvUFBTIGFmdGVyIHBvcnQgcmVjb25maWd1cmF0aW9uIGFuZCBmbHVzaCB0byB0aGUgY29kZWMuCisgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWREaW1lbnNpb25zICYmICFtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIHNfZGVjX29wLnU0X3BpY193ZCwgc19kZWNfb3AudTRfcGljX2h0KTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKworICAgICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KTsKKworICAgICAgICAgICAgICAgIGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgY2hhbmdpbmcgcmVzb2x1dGlvbiBtb2RlIGFuZCB0aGVyZSBpcyBubyBvdXRwdXQgcHJlc2VudCwKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMgdGhlIHN3aXRjaGluZyBpcyBkb25lIGFuZCBpdCdzIHJlYWR5IHRvIHJlc2V0IHRoZSBkZWNvZGVyIGFuZCB0aGUgcGx1Z2luLgorICAgICAgICAgICAgaWYgKG1DaGFuZ2luZ1Jlc29sdXRpb24gJiYgIXNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgbUNoYW5naW5nUmVzb2x1dGlvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgfHwgcmVzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkRGltZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICBtTmV3V2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgICAgIG1OZXdIZWlnaHQgPSBzX2RlY19vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoMCA8IHNfZGVjX29wLnU0X3BpY193ZCkgJiYgKDAgPCBzX2RlY19vcC51NF9waWNfaHQpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBzX2RlY19vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG1XaWR0aCAqIG1IZWlnaHQgKiAzKSAvIDI7CisKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtVGltZVN0YW1wc1tzX2RlY19vcC51NF90c107CisgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFtzX2RlY19vcC51NF90c10gPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIElmIGluIGZsdXNoIG1vZGUgYW5kIG5vIG91dHB1dCBpcyByZXR1cm5lZCBieSB0aGUgY29kZWMsCisgICAgICAgICAgICAgICAgICogdGhlbiBjb21lIG91dCBvZiBmbHVzaCBtb2RlICovCisgICAgICAgICAgICAgICAgbUlzSW5GbHVzaCA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLyogSWYgRU9TIHdhcyByZWNpZXZlZCBvbiBpbnB1dCBwb3J0IGFuZCB0aGVyZSBpcyBubyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBjb2RlYywgdGhlbiBzaWduYWwgRU9TIG9uIG91dHB1dCBwb3J0ICovCisgICAgICAgICAgICAgICAgaWYgKG1SZWNlaXZlZEVPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogSGFuZGxlIG1vcmUgdGhhbiBvbmUgcGljdHVyZSBkYXRhCisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCithbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdEhFVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyOTlhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNPRlRfSEVWQ19IXworCisjZGVmaW5lIFNPRlRfSEVWQ19IXworCisjaW5jbHVkZSAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBzaXplKSBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpCisjZGVmaW5lIGl2ZF9hbGlnbmVkX2ZyZWUoYnVmKSBmcmVlKGJ1ZikKKworLyoqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0aW1lLXN0YW1wIGFycmF5ICovCisjZGVmaW5lIE1BWF9USU1FX1NUQU1QUyA2NAorCisvKiogTWF4aW11bSBudW1iZXIgb2YgY29yZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYyAqLworI2RlZmluZSBDT0RFQ19NQVhfTlVNX0NPUkVTIDQKKworI2RlZmluZSBDT0RFQ19NQVhfV0lEVEggICAgIDE5MjAKKworI2RlZmluZSBDT0RFQ19NQVhfSEVJR0hUICAgIDEwODgKKworLyoqIElucHV0IGJ1ZmZlciBzaXplICovCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICgxMDI0ICogMTAyNCkKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKworLyoqIFVzZWQgdG8gcmVtb3ZlIHdhcm5pbmdzIGFib3V0IHVudXNlZCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYik7CisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSBcCisgICAgZGlmZiA9ICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgIChlbmQudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpOworCitzdHJ1Y3QgU29mdEhFVkM6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKKyAgICBTb2Z0SEVWQyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvZnRIRVZDKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7Citwcml2YXRlOgorICAgIC8vIE51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMKKyAgICBlbnVtIHsKKyAgICAgICAga051bUJ1ZmZlcnMgPSA4CisgICAgfTsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHRvIGJlIHVlc2QgYnkgdGhlIGNvZGVjCisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICAgIC8vIEludGVybmFsIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGZsdXNoIG91dCB0aGUgYnVmZmVycyBmcm9tIGRlY29kZXIKKyAgICB1aW50OF90ICptRmx1c2hPdXRCdWZmZXI7CisKKyAgICAvLyBTdGF0dXMgb2YgZW50cmllcyBpbiB0aGUgdGltZXN0YW1wIGFycmF5CisgICAgYm9vbCBtVGltZVN0YW1wc1ZhbGlkW01BWF9USU1FX1NUQU1QU107CisKKyAgICAvLyBUaW1lc3RhbXAgYXJyYXkgLSBTaW5jZSBjb2RlYyBkb2VzIG5vdCB0YWtlIDY0IGJpdCB0aW1lc3RhbXBzLAorICAgIC8vIHRoZXkgYXJlIG1haW50YWluZWQgaW4gdGhlIHBsdWdpbgorICAgIE9NWF9TNjQgbVRpbWVTdGFtcHNbTUFYX1RJTUVfU1RBTVBTXTsKKworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1PbXhDb2xvckZvcm1hdDsgICAgLy8gT01YIENvbG9yIGZvcm1hdAorICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OyAgICAgICAgLy8gSXR0aWFtIENvbG9yIGZvcm1hdAorCisgICAgYm9vbCBtSXNJbkZsdXNoOyAgICAgICAgLy8gY29kZWMgaXMgZmx1c2ggbW9kZQorICAgIGJvb2wgbVJlY2VpdmVkRU9TOyAgICAgIC8vIEVPUyBpcyByZWNlaWV2ZWQgb24gaW5wdXQgcG9ydAorICAgIGJvb2wgbUluaXROZWVkZWQ7CisgICAgdWludDMyX3QgbU5ld1dpZHRoOworICAgIHVpbnQzMl90IG1OZXdIZWlnaHQ7CisgICAgLy8gVGhlIGlucHV0IHN0cmVhbSBoYXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudCByZXNvbHV0aW9uLCB3aGljaCBpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhlCisgICAgLy8gY29kZWMuIFNvIHRoZSBjb2RlYyBpcyBzd2l0Y2hpbmcgdG8gZGVjb2RlIHRoZSBuZXcgcmVzb2x1dGlvbi4KKyAgICBib29sIG1DaGFuZ2luZ1Jlc29sdXRpb247CisgICAgYm9vbCBtRmx1c2hOZWVkZWQ7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlSW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgdm9pZCBsb2dWZXJzaW9uKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwKKyAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTIChTb2Z0SEVWQyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9IRVZDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQubWsKaW5kZXggYTNkNTc3OS4uMWQyMzJjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5tawpAQCAtNDYsNiArNDYsOCBAQAogCiBMT0NBTF9DRkxBR1MgOj0gLURPU0NMX0VYUE9SVF9SRUY9IC1ET1NDTF9JTVBPUlRfUkVGPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC03Miw0ICs3NCw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IGQ1MGEyMTkuLmY1MDNhNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTI3LDEwICsyNyw2IEBACiAKICNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCiAKLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrTTRWUHJvZmlsZUxldmVsc1tdID0gewpAQCAtOTUsNyArOTEsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTb2Z0TVBFRzQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdE1QRUc0OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEzOCw2ICsxMzQsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHVpbnQzMl90ICpzdGFydF9jb2RlID0gKHVpbnQzMl90ICopYml0c3RyZWFtOworICAgICAgICBib29sIHZvbEhlYWRlciA9ICpzdGFydF9jb2RlID09IDB4QjAwMTAwMDA7CisgICAgICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKTsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKnZvbF9kYXRhWzFdOwpAQCAtMTQ1LDcgKzE0Nyw3IEBACiAKICAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gTlVMTDsKIAotICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgaWYgKChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHx8IHZvbEhlYWRlcikgewogICAgICAgICAgICAgICAgIHZvbF9kYXRhWzBdID0gYml0c3RyZWFtOwogICAgICAgICAgICAgICAgIHZvbF9zaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAgICAgICAgICAgICB9CkBAIC0xNTQsNyArMTU2LDggQEAKICAgICAgICAgICAgICAgICAobU1vZGUgPT0gTU9ERV9NUEVHNCkgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOwogCiAgICAgICAgICAgICBCb29sIHN1Y2Nlc3MgPSBQVkluaXRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1XaWR0aCwgbUhlaWdodCwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcldpZHRoKCksIG91dHB1dEJ1ZmZlckhlaWdodCgpLCBtb2RlKTsKIAogICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIlBWSW5pdFZpZGVvRGVjb2RlciBmYWlsZWQuIFVuc3VwcG9ydGVkIGNvbnRlbnQ/Iik7CkBAIC0xNzMsMjEgKzE3NiwyNiBAQAogCiAgICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZSgoVmlkZW9EZWNDb250cm9scyAqKSBtSGFuZGxlLCAwKTsKIAorICAgICAgICAgICAgYm9vbCBoYXNGcmFtZURhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgaW5JbmZvID0gTlVMTDsKICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogICAgICAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaGFzRnJhbWVEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSAmJiBwb3J0U2V0dGluZ3NDaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1QRUc0X01PREUgJiYgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFoYXNGcmFtZURhdGEpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKQEAgLTI1Myw3ICsyNjEsOSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQoKSkgeworICAgICAgICAvLyBIMjYzIGRvZXNuJ3QgaGF2ZSBWT0wgaGVhZGVyLCB0aGUgZnJhbWUgc2l6ZSBpbmZvcm1hdGlvbiBpcyBpbiBzaG9ydCBoZWFkZXIsIGkuZS4gdGhlCisgICAgICAgIC8vIGRlY29kZXIgbWF5IGRldGVjdCBzaXplIGNoYW5nZSBhZnRlciBQVkRlY29kZVZpZGVvRnJhbWUuCisgICAgICAgIGlmIChoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTI5OSw3ICszMDksNyBAQAogICAgIH0KIH0KIAotYm9vbCBTb2Z0TVBFRzQ6OnBvcnRTZXR0aW5nc0NoYW5nZWQoKSB7Citib29sIFNvZnRNUEVHNDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCkgewogICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OwogICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1IYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOwogCkBAIC0zMTIsMjUgKzMyMiwyNCBAQAogICAgIEFMT0dWKCJkaXNwX3dpZHRoID0gJWQsIGRpc3BfaGVpZ2h0ID0gJWQsIGJ1Zl93aWR0aCA9ICVkLCBidWZfaGVpZ2h0ID0gJWQiLAogICAgICAgICAgICAgZGlzcF93aWR0aCwgZGlzcF9oZWlnaHQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCk7CiAKLSAgICBpZiAobUNyb3BXaWR0aCAhPSBkaXNwX3dpZHRoCi0gICAgICAgICAgICB8fCBtQ3JvcEhlaWdodCAhPSBkaXNwX2hlaWdodCkgewotICAgICAgICBtQ3JvcExlZnQgPSAwOwotICAgICAgICBtQ3JvcFRvcCA9IDA7Ci0gICAgICAgIG1Dcm9wV2lkdGggPSBkaXNwX3dpZHRoOwotICAgICAgICBtQ3JvcEhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQ7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gYnVmX3dpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IGJ1Zl9oZWlnaHQpIHsKKyAgICAgICAgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wU2V0OwogCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLAotICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCi0gICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKG1Dcm9wV2lkdGggIT0gZGlzcF93aWR0aCB8fCBtQ3JvcEhlaWdodCAhPSBkaXNwX2hlaWdodCkgeworICAgICAgICAgICAgbUNyb3BMZWZ0ID0gMDsKKyAgICAgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgICAgIG1Dcm9wV2lkdGggPSBkaXNwX3dpZHRoOworICAgICAgICAgICAgbUNyb3BIZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICAgICAgICAgIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcENoYW5nZWQ7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoYnVmX3dpZHRoICE9IG1XaWR0aCB8fCBidWZfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgbVdpZHRoID0gYnVmX3dpZHRoOwotICAgICAgICBtSGVpZ2h0ID0gYnVmX2hlaWdodDsKLQotICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLQorICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGNvbnN0IGJvb2wgZmFrZVN0cmlkZSA9IHRydWU7CisgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAorICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCwgY3JvcFNldHRpbmdzTW9kZSwgZmFrZVN0cmlkZSk7CisgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfSDI2MykgewogICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1IYW5kbGUpOwogCkBAIC0zMzksNyArMzQ4LDcgQEAKIAogICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBOVUxMOwogICAgICAgICAgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgb3V0cHV0QnVmZmVyV2lkdGgoKSwgb3V0cHV0QnVmZmVySGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgIEgyNjNfTU9ERSkpIHsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTM0OCwxMyArMzU3LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7Ci0KLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gcG9ydFdpbGxSZXNldDsKIH0KIAogdm9pZCBTb2Z0TVBFRzQ6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuaAppbmRleCBkZTE0YWFmLi44YTA2YTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwogCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOwotICAgIGJvb2wgcG9ydFNldHRpbmdzQ2hhbmdlZCgpOworICAgIGJvb2wgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0TVBFRzQpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwCmluZGV4IGUyM2YyM2QuLmZlOWU3ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcApAQCAtOTYsNyArOTYsNyBAQAogICAgIG9mZnNldCA9IHdpZHRoIC0gQl9TSVpFOyAvKiBvZmZzZXQgZm9yIHByZXYgKi8KICAgICBvZmZzZXQyID0gKHByZWRfd2lkdGhfcm5kID4+IDEpIC0gNDsgLyogb2Zmc2V0IGZvciBwcmVkX2Jsb2NrICovCiAKLSAgICB0bXAgPSAodWludDMyKXByZXYgJiAweDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMHgzOwogICAgIHByZWRfYmxvY2sgLT0gb2Zmc2V0MjsgLyogcHJlc2V0ICovCiAKICAgICBpZiAodG1wID09IDApICAvKiB3b3JkLWFsaWduZWQgKi8KQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcHJlZF9ibG9jayAtPSBvZmZzZXQyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9ICh1aW50MzIpcHJldiAmIDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMzsKICAgICBtYXNrID0gMjU0OwogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4RkVGRUZFRkUgKi8KQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcHJlZF9ibG9jayAtPSBvZmZzZXQyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9ICh1aW50MzIpcHJldiAmIDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMzsKICAgICBtYXNrID0gMjU0OwogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4RkVGRUZFRkUgKi8KQEAgLTg4NCw3ICs4ODQsNyBAQAogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4M2YzZjNmM2YgKi8KIAotICAgIHRtcCA9ICh1aW50MzIpcHJldiAmIDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMzsKIAogICAgIHByZWRfYmxvY2sgLT0gNDsgLyogcHJlc2V0ICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCmluZGV4IGIzYzM1MGYuLmIwM2VjOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApAQCAtMTQyNiw3ICsxNDI2LDcgQEAKICAgICAgICAgdmlkZW8tPm5CaXRzRm9yTUJJRCA9IENhbGNOdW1CaXRzKCh1aW50KXZpZGVvLT5uVG90YWxNQiAtIDEpOyAvKiBvdGhlcndpc2UgY2FsY3VsYXRlIGFib3ZlICovCiAgICAgfQogICAgIHNpemUgPSAoaW50MzIpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKLSAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QICYmIHNpemUgPiB2aWRlby0+dmlkZW9EZWNDb250cm9scy0+c2l6ZSkKKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1AgJiYgc2l6ZSA+IHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzLT5zaXplKQogICAgIHsKICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKICAgICAgICAgZ290byByZXR1cm5fcG9pbnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQubWsKaW5kZXggODNhMmRkMi4uYzkwMDZkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpAQCAtMzMsNiArMzMsOCBAQAogICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtNzIsNCArNzQsNiBAQAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCmluZGV4IDc4N2M0NmUuLjU5NmIzMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcApAQCAtMzMsNiArMzMsOCBAQAogCiAjaW5jbHVkZSAiU29mdE1QRUc0RW5jb2Rlci5oIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2lmbmRlZiBJTlQzMl9NQVgKICNkZWZpbmUgSU5UMzJfTUFYICAgMjE0NzQ4MzY0NwogI2VuZGlmCkBAIC00OCw0MiArNTAsMTIgQEAKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwogfQogCi1pbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKLSAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKLQotICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKLSAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OwotICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOwotICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOwotCi0gICAgLyogWSBjb3B5aW5nICovCi0gICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIFNvZnRNUEVHNEVuY29kZXI6OlNvZnRNUEVHNEVuY29kZXIoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAogICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCi0gICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICA6IFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbUVuY29kZU1vZGUoQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUyksCiAgICAgICBtVmlkZW9XaWR0aCgxNzYpLAogICAgICAgbVZpZGVvSGVpZ2h0KDE0NCksCkBAIC0xNTUsNyArMTI3LDggQEAKICAgICBtRW5jUGFyYW1zLT5xdWFudFR5cGVbMF0gPSAwOwogICAgIG1FbmNQYXJhbXMtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOwogCi0gICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIKKyAgICAgICAgICAgIHx8IG1TdG9yZU1ldGFEYXRhSW5CdWZmZXJzKSB7CiAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gaXMgbmVlZGVkLgogICAgICAgICBmcmVlKG1JbnB1dEZyYW1lRGF0YSk7CiAgICAgICAgIG1JbnB1dEZyYW1lRGF0YSA9IE5VTEw7CkBAIC0yMjcsNyArMjAwLDcgQEAKIAogICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKIAotICAgIGRlbGV0ZSBtSW5wdXRGcmFtZURhdGE7CisgICAgZnJlZShtSW5wdXRGcmFtZURhdGEpOwogICAgIG1JbnB1dEZyYW1lRGF0YSA9IE5VTEw7CiAKICAgICBkZWxldGUgbUVuY1BhcmFtczsKQEAgLTUyNiw2ICs0OTksMTcgQEAKICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAgICAgICAgICAgICAgICAgbVZpZGVvRnJhbWVSYXRlID0gZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA+PiAxNjsKICAgICAgICAgICAgICAgICBtVmlkZW9Db2xvckZvcm1hdCA9IGRlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdDsKKworICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWYgPQorICAgICAgICAgICAgICAgICAgICAmZWRpdFBvcnRJbmZvKDApLT5tRGVmOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1WaWRlb1dpZHRoOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgcG9ydERlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAoT01YX0NPTE9SX0ZPUk1BVFRZUEUpIG1WaWRlb0NvbG9yRm9ybWF0OworICAgICAgICAgICAgICAgIHBvcnREZWYgPSAmZWRpdFBvcnRJbmZvKDEpLT5tRGVmOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1WaWRlb1dpZHRoOworICAgICAgICAgICAgICAgIHBvcnREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBkZWYtPmZvcm1hdC52aWRlby5uQml0cmF0ZTsKICAgICAgICAgICAgIH0KQEAgLTY2OCwxMSArNjUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMgPyAiIHRydWUiIDogImZhbHNlIik7CiAKICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewotICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOwotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRGcmFtZURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopIG1hbGxvYygobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzICkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1WaWRlb0NvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtNjgzLDcgKzY2Myw3IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRNUEVHNEVuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNhd0lucHV0RU9TKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC03NDAsMzYgKzcyMCwzNiBAQAogICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBzcmNCdWZmZXI7IC8vIGZvciBNZXRhRGF0YU1vZGUgb25seQogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7Ci0gICAgICAgICAgICB1aW50OF90ICppbnB1dERhdGEgPSBOVUxMOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXREYXRhID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluQnVmZmVycykgewogICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiAhPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNZXRhRGF0YSBidWZmZXIgaXMgd3Jvbmcgc2l6ZSEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZ290ICVsdSBieXRlcywgZXhwZWN0ZWQgOCkiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJXUgYnl0ZXMsIGV4cGVjdGVkIDgpIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RHcmFsbG9jRGF0YShpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVEYXRhLCAobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgICAgIGlmIChpbnB1dERhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgZ3JhbGxvYyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSIpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFZlcmlmeS9jb252ZXJ0IHBpeGVsIGZvcm1hdCBlbnVtCiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlucHV0RGF0YSA9ICh1aW50OF90ICopaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEgPSAoY29uc3QgdWludDhfdCAqKWluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAotICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgaW5wdXREYXRhID0gbUlucHV0RnJhbWVEYXRhOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0hFQ0soaW5wdXREYXRhICE9IE5VTEwpOwogCiAgICAgICAgICAgICBWaWRlb0VuY0ZyYW1lSU8gdmluLCB2b3V0OwpAQCAtNzc4LDE3ICs3NTgsMTcgQEAKICAgICAgICAgICAgIHZpbi5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCAgKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgIHZpbi5waXRjaCA9ICgobVZpZGVvV2lkdGggKyAxNSkgPj4gNCkgPDwgNDsKICAgICAgICAgICAgIHZpbi50aW1lc3RhbXAgPSAoaW5IZWFkZXItPm5UaW1lU3RhbXAgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCi0gICAgICAgICAgICB2aW4ueUNoYW4gPSBpbnB1dERhdGE7CisgICAgICAgICAgICB2aW4ueUNoYW4gPSAodWludDhfdCAqKWlucHV0RGF0YTsKICAgICAgICAgICAgIHZpbi51Q2hhbiA9IHZpbi55Q2hhbiArIHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2g7CiAgICAgICAgICAgICB2aW4udkNoYW4gPSB2aW4udUNoYW4gKyAoKHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2gpID4+IDIpOwogCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1vZFRpbWVNcyA9IDA7CisgICAgICAgICAgICBVTG9uZyBtb2RUaW1lTXMgPSAwOwogICAgICAgICAgICAgaW50MzJfdCBuTGF5ZXIgPSAwOwogICAgICAgICAgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKICAgICAgICAgICAgIGlmICghUFZFbmNvZGVWaWRlb0ZyYW1lKG1IYW5kbGUsICZ2aW4sICZ2b3V0LAogICAgICAgICAgICAgICAgICAgICAmbW9kVGltZU1zLCBvdXRQdHIsICZkYXRhTGVuZ3RoLCAmbkxheWVyKSB8fAogICAgICAgICAgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW5rIHRyYWNrIGF0IGZyYW1lICVsbGQiLAorICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZyYW1lIG9yIGdldCBoaW5rIHRyYWNrIGF0IGZyYW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKQEAgLTgwNSw3ICs3ODUsNiBAQAogCiAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIHJlbGVhc2VHcmFsbG9jRGF0YShzcmNCdWZmZXIpOwogICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwpAQCAtODIwLDQ3ICs3OTksNiBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0TVBFRzRFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci19Ci0KLXVpbnQ4X3QgKlNvZnRNUEVHNEVuY29kZXI6OmV4dHJhY3RHcmFsbG9jRGF0YSh2b2lkICpkYXRhLCBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcikgewotICAgIE9NWF9VMzIgdHlwZSA9ICooT01YX1UzMiopZGF0YTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKHR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgQUxPR0UoIkRhdGEgcGFzc2VkIGluIHdpdGggbWV0YWRhdGEgbW9kZSBkb2VzIG5vdCBoYXZlIHR5cGUgIgotICAgICAgICAgICAgICAgICJrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSAoJWQpLCBoYXMgdHlwZSAlbGQgaW5zdGVhZCIsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UsIHR5cGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnVmZmVyX2hhbmRsZV90IGltZ0J1ZmZlciA9ICooYnVmZmVyX2hhbmRsZV90KikoKHVpbnQ4X3QqKWRhdGEgKyA0KTsKLQotICAgIGNvbnN0IFJlY3QgcmVjdChtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKLSAgICB1aW50OF90ICppbWc7Ci0gICAgcmVzID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9jayhpbWdCdWZmZXIsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICByZWN0LCAodm9pZCoqKSZpbWcpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gbG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqYnVmZmVyID0gaW1nQnVmZmVyOwotICAgIHJldHVybiBpbWc7Ci19Ci0KLXZvaWQgU29mdE1QRUc0RW5jb2Rlcjo6cmVsZWFzZUdyYWxsb2NEYXRhKGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIpIHsKLSAgICBpZiAobVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMpIHsKLSAgICAgICAgR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkudW5sb2NrKGJ1ZmZlcik7Ci0gICAgfQotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAppbmRleCBjYzRlYThmLi5iMDYwNWI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKICNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCiAKIApAQCAtMjcsNyArMjcsNyBAQAogCiBzdHJ1Y3QgTWVkaWFCdWZmZXI7CiAKLXN0cnVjdCBTb2Z0TVBFRzRFbmNvZGVyIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworc3RydWN0IFNvZnRNUEVHNEVuY29kZXIgOiBwdWJsaWMgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdE1QRUc0RW5jb2RlcigKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCkBAIC00MywxMSArNDMsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogCi0gICAgLy8gT3ZlcnJpZGUgU29mdE9NWENvbXBvbmVudCBtZXRob2RzCi0KLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Tb2Z0TVBFRzRFbmNvZGVyKCk7CiAKQEAgLTU2LDEwICs1MSw2IEBACiAgICAgICAgIGtOdW1CdWZmZXJzID0gMiwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEKLSAgICB9OwotCiAgICAgLy8gT01YIGlucHV0IGJ1ZmZlcidzIHRpbWVzdGFtcCBhbmQgZmxhZ3MKICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKQEAgLTkwLDkgKzgxLDYgQEAKICAgICBPTVhfRVJST1JUWVBFIGluaXRFbmNvZGVyKCk7CiAgICAgT01YX0VSUk9SVFlQRSByZWxlYXNlRW5jb2RlcigpOwogCi0gICAgdWludDhfdCogZXh0cmFjdEdyYWxsb2NEYXRhKHZvaWQgKmRhdGEsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKLSAgICB2b2lkIHJlbGVhc2VHcmFsbG9jRGF0YShidWZmZXJfaGFuZGxlX3QgYnVmZmVyKTsKLQogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRNUEVHNEVuY29kZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKaW5kZXggYTU0ZmQ4Yi4uOTQ1MTQ3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCkBAIC0yOSw3ICsyOSw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTaG9ydDsKIHR5cGVkZWYgc2hvcnQgU2hvcnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMb25nOwordHlwZWRlZiB1aW50MzJfdCBVTG9uZzsKIAogI2RlZmluZSBQVl9DT0RFQ19JTklUICAwCiAjZGVmaW5lIFBWX0NPREVDX1NUT1AgIDEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCmluZGV4IGZhNTBlZWIuLmZhNGFlMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcApAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgICAgICAgICBvdXRbNDBdID0gazQgOyAgIC8qIHJvdyA1ICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgICAgIG91dFs4XSA9IGs1IDsgICAgICAgLyogcm93IDEgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KQEAgLTYzNSw3ICs2MzUsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpAQCAtODQ2LDcgKzg0Niw3IEBACiAgICAgICAgICAgICBvdXRbNDBdID0gazQgOyAgIC8qIHJvdyA1ICovCiAgICAgICAgICAgICBvdXQrKzsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisgICAgICAgIHdoaWxlICgodWludHB0cl90KW91dCA8ICh1aW50cHRyX3QpZHN0KSA7CiAKICAgICAgICAgcmV0dXJuIDsKICAgICB9CkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLwogICAgICAgICAgICAgb3V0Kys7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworICAgICAgICB3aGlsZSAoKHVpbnRwdHJfdClvdXQgPCAodWludHB0cl90KWRzdCkgOwogCiAgICAgICAgIHJldHVybiA7CiAgICAgfQpAQCAtMTE5NSw3ICsxMTk1LDcgQEAKICAgICAgICAgICAgIG91dFs4XSA9IGs1IDsgICAgICAgLyogcm93IDEgKi8KICAgICAgICAgICAgIG91dCsrOwogICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKyAgICAgICAgd2hpbGUgKCh1aW50cHRyX3Qpb3V0IDwgKHVpbnRwdHJfdClkc3QpIDsKIAogICAgICAgICByZXR1cm4gOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKaW5kZXggNmZkNDFjMy4uMGFkMzlhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKQEAgLTU3Miw3ICs1NzIsNyBAQAogICAgICAgICBjdXIyICAgID0gY3VyMiAmIChtYXNrIDw8IDgpOyAgIC8qIG1hc2sgZmlyc3QgYW5kIHRoaXJkIGJ5dGVzICovCiAgICAgICAgIHN1bTIgICAgPSBzdW0yICsgKChVSW50KWN1cjIgPj4gOCk7CiAgICAgfQotICAgIHdoaWxlICgoVUludCljdXJJbnQgPCAoVUludCllbmQpOworICAgIHdoaWxlICgodWludHB0cl90KWN1ckludCA8ICh1aW50cHRyX3QpZW5kKTsKIAogICAgIGN1cjEgPSBzdW00IC0gKHN1bTIgPDwgOCk7ICAvKiBnZXQgZXZlbi1zdW0gKi8KICAgICBjdXIxID0gY3VyMSArIHN1bTI7ICAgICAgICAgLyogYWRkIDE2IGJpdCBldmVuLXN1bSBhbmQgb2RkLXN1bSovCkBAIC02MTEsNyArNjExLDcgQEAKICAgICAgICAgbG9hZDIgPSBsb2FkMiAmIChtYXNrIDw8IDgpOyAvKiBldmVuIGJ5dGVzICovCiAgICAgICAgIHN1bTIgKz0gKChVSW50KWxvYWQyID4+IDgpOyAvKiBzdW0gZXZlbiBieXRlcywgMTYgYml0ICovCiAgICAgfQotICAgIHdoaWxlICgoVUludCljdXJJbnQgPCAoVUludCllbmQpOworICAgIHdoaWxlICgodWludHB0cl90KWN1ckludCA8ICh1aW50cHRyX3QpZW5kKTsKICAgICBsb2FkMSA9IHN1bTQgLSAoc3VtMiA8PCA4KTsgICAgIC8qIGdldCBldmVuLXN1bSAqLwogICAgIGxvYWQxID0gbG9hZDEgKyBzdW0yOyAgICAgICAgICAgLyogYWRkIDE2IGJpdCBldmVuLXN1bSBhbmQgb2RkLXN1bSovCiAgICAgbG9hZDEgPSBsb2FkMSArIChsb2FkMSA8PCAxNik7ICAvKiBhZGQgdXBwZXIgYW5kIGxvd2VyIDE2IGJpdCBzdW0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcAppbmRleCBiODFkMjc4Li45YTk2N2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICAvKiBpbml0aWFsaXplIG9mZnNldCB0byBhZGp1c3QgcGl4ZWwgY291bnRlciAqLwogICAgIC8qICAgIHRoZSBuZXh0IHJvdzsgZnVsbC1wZWwgcmVzb2x1dGlvbiAgICAgICovCiAKLSAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDB4MzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAweDM7CiAKICAgICBpZiAodG1wID09IDApICAvKiB3b3JkLWFsaWduZWQgKi8KICAgICB7CkBAIC00NjYsNyArNDY2LDcgQEAKICAgICAvKiBCcmFuY2ggYmFzZWQgb24gcGl4ZWwgbG9jYXRpb24gKGhhbGYtcGVsIG9yIGZ1bGwtcGVsKSBmb3IgeCBhbmQgeSAqLwogICAgIHJlYyAtPSAxMjsgLyogcHJlc2V0ICovCiAKLSAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMzsKICAgICBtYXNrID0gMjU0OwogICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CiAgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4RkVGRUZFRkUgKi8KQEAgLTc5MSw3ICs3OTEsNyBAQAogICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCiAgICAgcmVjIC09IDEyOyAvKiBwcmVzZXQgKi8KIAotICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICB0bXAgPSAodWludHB0cl90KXByZXYgJiAzOwogICAgIG1hc2sgPSAyNTQ7CiAgICAgbWFzayB8PSAobWFzayA8PCA4KTsKICAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLwpAQCAtMTE0MCw3ICsxMTQwLDcgQEAKICAgICBtYXNrIHw9IChtYXNrIDw8IDgpOwogICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweDNmM2YzZjNmICovCiAKLSAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDM7CisgICAgdG1wID0gKHVpbnRwdHJfdClwcmV2ICYgMzsKIAogICAgIHJlYyAtPSA0OyAvKiBwcmVzZXQgKi8KIApAQCAtMTk1OSw3ICsxOTU5LDcgQEAKICAgICAgICAgZHN0ICs9IG9mZnNldDsKICAgICAgICAgc3JjICs9IG9mZnNldDsKICAgICB9Ci0gICAgd2hpbGUgKChVSW50KXNyYyA8IChVSW50KWVuZCk7CisgICAgd2hpbGUgKCh1aW50cHRyX3Qpc3JjIDwgKHVpbnRwdHJfdCllbmQpOwogCiAgICAgcmV0dXJuIDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKaW5kZXggMGQ1YTNlOC4uMmQ0NDQ4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKQEAgLTYwLDcgKzYwLDcgQEAKIHR5cGVkZWYgc2hvcnQgU2hvcnQ7CiB0eXBlZGVmIHNob3J0IGludCBTSW50OwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgQm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFVMb25nOwordHlwZWRlZiB1aW50MzJfdCBVTG9uZzsKIHR5cGVkZWYgdm9pZCBWb2lkOwogCiAjZGVmaW5lIFBWX0NPREVDX0lOSVQgICAgICAgMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCmluZGV4IGJhNzdkZmQuLmI4NjVmMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKQEAgLTg1LDcgKzg1LDcgQEAKIAogICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLwogCi0gICAgICAgIHg4ID0gKHVpbnQzMilyZWYgJiAweDM7CisgICAgICAgIHg4ID0gKHVpbnRwdHJfdClyZWYgJiAweDM7CiAgICAgICAgIGlmICh4OCA9PSAzKQogICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDM7CiAgICAgICAgIGlmICh4OCA9PSAyKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLm1rCmluZGV4IDEzNWM3MTUuLjgyODQ0OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQubWsKQEAgLTUwLDYgKzUwLDggQEAKIExPQ0FMX0NGTEFHUyA6PSBcCiAgICAgICAgIC1ET1NDTF9VTlVTRURfQVJHPQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfbXAzZGVjCiAKIExPQ0FMX0FSTV9NT0RFIDo9IGFybQpAQCAtNjksNiArNzEsOCBAQAogICAgICAgICAkKExPQ0FMX1BBVEgpL3NyYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlic3RhZ2VmcmlnaHRfb214IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IDEyMjExODEuLjQ5NGQ4M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtNDksNiArNDksOCBAQAogICAgICAgbU51bUNoYW5uZWxzKDIpLAogICAgICAgbVNhbXBsaW5nUmF0ZSg0NDEwMCksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbVNhd0lucHV0RW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CiAgICAgaW5pdFBvcnRzKCk7CiAgICAgaW5pdERlY29kZXIoKTsKQEAgLTIzMCw3ICsyMzIsNyBAQAogICAgIH0KIH0KIAotdm9pZCBTb2Z0TVAzOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRNUDM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjM4LDUwICsyNDAsMzYgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgKG1TYXdJbnB1dEVvcyAmJiAhbVNpZ25hbGxlZE91dHB1dEVvcykpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9IE5VTEw7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgICAgIH0KIAogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFtSXNGaXJzdCkgewotICAgICAgICAgICAgICAgIC8vIHBhZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aCA1Mjkgc2FtcGxlcywgc2luY2UgdGhhdCBtYW55IHNhbXBsZXMKLSAgICAgICAgICAgICAgICAvLyB3ZXJlIHRyaW1tZWQgb2ZmIHRoZSBiZWdpbm5pbmcgd2hlbiBkZWNvZGluZyBzdGFydGVkCi0gICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0KLSAgICAgICAgICAgICAgICAgICAga1BWTVAzRGVjb2RlckRlbGF5ICogbU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtZW1zZXRTYWZlKG91dEhlYWRlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBuZXZlciBkaXNjYXJkZWQgZnJhbWVzIGZyb20gdGhlIHN0YXJ0LCB3ZSB3b24ndCBoYXZlCi0gICAgICAgICAgICAgICAgLy8gdG8gYWRkIGFueSBwYWRkaW5nIGF0IHRoZSBlbmQgZWl0aGVyLgotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDAgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBtU2F3SW5wdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPQorICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7CisKKyAgICAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IDA7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoaW5IZWFkZXItPm5PZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPQotICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOwogCkBAIC0zMTYsMTMgKzMwNCwzMCBAQAogICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKLSAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgotICAgICAgICAgICAgaWYgKCFtZW1zZXRTYWZlKG91dEhlYWRlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IgJiYgbVNhd0lucHV0RW9zKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtSXNGaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwYWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGggNTI5IHNhbXBsZXMsIHNpbmNlIHRoYXQgbWFueSBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgIC8vIHdlcmUgdHJpbW1lZCBvZmYgdGhlIGJlZ2lubmluZyB3aGVuIGRlY29kaW5nIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbU51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOwogCi0gICAgICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1zZXRTYWZlKG91dEhlYWRlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY292ZXJhYmxlLCBqdXN0IGlnbm9yZSB0aGUgY3VycmVudCBmcmFtZSBhbmQKKyAgICAgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICBpZiAoIW1lbXNldFNhZmUob3V0SGVhZGVyLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1Db25maWctPnNhbXBsaW5nUmF0ZSAhPSBtU2FtcGxpbmdSYXRlCiAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG1OdW1DaGFubmVscykgewogICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKQEAgLTM0Myw3ICszNDgsNyBAQAogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPQogICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAtIG91dEhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmICghbVNpZ25hbGxlZE91dHB1dEVvcykgewogICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICAgfQpAQCAtMzUyLDIzICszNTcsMjQgQEAKICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKICAgICAgICAgICAgICAgICArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZTsKIAotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CiAKLSAgICAgICAgQ0hFQ0tfR0UoaW5IZWFkZXItPm5GaWxsZWRMZW4sIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCk7CisgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CiAKLSAgICAgICAgaW5IZWFkZXItPm5PZmZzZXQgKz0gbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoOwotICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIG1OdW1DaGFubmVsczsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLSAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKLSAgICAgICAgfQotCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgIG91dEluZm8gPSBOVUxMOwpAQCAtMzgzLDYgKzM4OSw5IEBACiAgICAgICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KICAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgICAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgICAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtNDE2LDYgKzQyNSw4IEBACiAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOwogICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKaW5kZXggM2UzMDQ5OC4uM2JmYTZjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTYxLDYgKzYxLDggQEAKIAogICAgIGJvb2wgbUlzRmlyc3Q7CiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2F3SW5wdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOwogCiAgICAgZW51bSB7CiAgICAgICAgIE5PTkUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfYXJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNmRkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzkucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwuZHJlY3R2ZXwsIERSRUNUVkUKLQotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWRsbC5saWIgIgotICAgIERDQiAiLWRlZmF1bHRsaWI6Y29yZWxpYmMubGliICIKLQotICBJTVBPUlQgcHZtcDNfbWRjdF8xOCA7IHB2bXAzX21kY3RfMTguY3BwCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBUkVBICB8LnJkYXRhfCwgREFUQSwgUkVBRE9OTFkKLSAgJSA0Ci0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFSRUEgIHwudGV4dHwsIENPREUsIFJFQURPTkxZCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gRVhQT1JUIHxwdm1wM19kY3RfOXwKLQotfHB2bXAzX2RjdF85fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBsZHIgICAgICByMiwgW3IwLCAjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjMsIFtyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyMCwgIzRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIyLHIzCi0gICAgICAgIHN1YiAgICAgIGxyLHIyLHIzCi0gICAgICAgIGxkciAgICAgIHIzLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkciAgICAgIHI0LFtyMCwgIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIyLHIzLHIxMgotICAgICAgICBsZHIgICAgICByNSxbcjAsIzhdCi0gICAgICAgIHN1YiAgICAgIHIzLHIzLHIxMgotICAgICAgICBhZGQgICAgICByMTIscjQscjUKLSAgICAgICAgc3ViICAgICAgcjQscjQscjUKLSAgICAgICAgbGRyICAgICAgcjUsW3IwLCAjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IwLCAjMHhjXQotICAgICAgICBsZHIgICAgICByOSxbcjAsICMweDEwXQotICAgICAgICBhZGQgICAgICByNixyNSxyNwotICAgICAgICBzdWIgICAgICByNSxyNSxyNwotICAgICAgICBhZGQgICAgICByNyxyMSxyMTIKLSAgICAgICAgYWRkICAgICAgcjgscjkscjIKLSAgICAgICAgYWRkICAgICAgcjcscjcscjYKLSAgICAgICAgYWRkICAgICAgcjEwLHI3LHI4Ci0gICAgICAgIHJzYiAgICAgIHI3LHI4LHI3LGFzciAjMQotICAgICAgICBzdHIgICAgICByNyxbcjAsICMweDE4XQotICAgICAgICByc2IgICAgICByMixyOSxyMixhc3IgIzEKLSAgICAgICAgc3RyICAgICAgcjEwLFtyMF0KLSAgICAgICAgbGRyICAgICAgcjExLHxjb3NfMnBpXzl8Ci0gICAgICAgIHJzYiAgICAgIHI3LHIyLCMwCi0KLSAgICAgICAgbW92ICAgICAgcjkscjEsbHNsICMxCi0JCW1vdiAgICAgIHIxLHI5CQkJOzs7Ozs7ICAhISEhISEKLSAgICAgICAgbW92ICAgICAgcjgscjcKLQotOyAgICB2ZWNbNF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzRdLCB0bXAwPDwxLCBjb3NfMnBpXzkpOyAKLQotICAgICAgICBzbWxhbCAgICByMSxyOCxyMTEscjkKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfNHBpXzl8Ci0gICAgICAgIGxkciAgICAgIHIxMSx8Y29zX3BpXzl8Ci0KLTsgICAgdmVjWzhdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s4XSwgdG1wMDw8MSwgY29zXzRwaV85KTsKLQotICAgICAgICBzbWxhbCAgICByMSxyNyxyMTAscjkKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMDw8MSwgY29zX3BpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHI5LHIyLHIxMSxyOQotICAgICAgICBtb3YgICAgICByMSxyMTIsbHNsICMxCi0gICAgICAgIHJzYiAgICAgIHI5LHIxMCwjMAotICAgICAgICBsZHIgICAgICByMTEsfGNvc181cGlfOXwKLQotICAgICAgICBzbWxhbCAgICByMTIscjIscjkscjEKLQotCi0KLTsgICAgdmVjWzJdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1syXSwgdG1wMjw8MSwgY29zXzVwaV85KTsKLQotICAgICAgICBsZHIgICAgICByOSx8Y29zXzJwaV85fAotICAgICAgICBtb3YgICAgICByMTIscjEJCQk7Ozs7OzsgICEhISEhIQotICAgICAgICBzbWxhbCAgICByMTIscjgscjExLHIxCi0KLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAyPDwxLCBjb3NfMnBpXzkpOwotCi0gICAgICAgIHNtbGFsICAgIHIxLHI3LHI5LHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHI2LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjcscjExLHIxCi0gICAgICAgIGFuZCAgICAgIHI2LHIxMCxyMTEsYXNyICMxNAotICAgICAgICBzbWxhbCAgICByMTIscjgscjYscjEKLSAgICAgICAgbGRyICAgICAgcjEwLHxjb3NfMTFwaV8xOHwKLSAgICAgICAgYWRkICAgICAgcjEyLHIxMSxyNgotICAgICAgICBzbWxhbCAgICByMSxyMixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjksfGNvc184cGlfOXwKLSAgICAgICAgc3RyICAgICAgcjIsW3IwLCM4XQotICAgICAgICBtb3YgICAgICByMSxyNSxsc2wgIzEKLQotOyAgICB2ZWNbOF0gID0gZnhwX21hYzMyX1EzMiggdmVjWzhdLCB0bXAzPDwxLCBjb3NfOHBpXzkpOwotCi0gICAgICAgIHNtdWxsICAgIHIyLHI2LHI5LHIxCi0gICAgICAgIHN0ciAgICAgIHI3LFtyMCwjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjIscjQsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHI3LHxjb3NfMTNwaV8xOHwKLSAgICAgICAgc21sYWwgICAgcjEyLHI2LHIxMCxyMgotCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDg8PDEsIGNvc18xM3BpXzE4KTsKLQotICAgICAgICBzbWxhbCAgICByMTIscjYscjcscjMKLSAgICAgICAgYWRkICAgICAgcjQscjUscjQKLSAgICAgICAgbW92ICAgICAgcjEyLGxyLGxzbCAjMQotICAgICAgICBzdWIgICAgICBscixyNCxscgotICAgICAgICBsZHIgICAgICByNyx8Y29zXzE3cGlfMTh8Ci0gICAgICAgIHN0ciAgICAgIHI4LFtyMCwgIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI0LHxjb3NfcGlfNnwKLQotICAgICAgICBtb3YgICAgICBscixscixsc2wgIzEKLQotOyAgICB2ZWNbMV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzFdLCB0bXA4PDwxLCBjb3NfMTdwaV8xOCk7Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjYscjcscjEyCi0KLTsgICAgdmVjWzNdICA9IGZ4cF9tdWwzMl9RMzIoKHRtcDUgKyB0bXA2ICAtIHRtcDgpPDwxLCBjb3NfcGlfNik7Ci0KLSAgICAgICAgc211bGwgICAgcjUsbHIscjQsbHIKLSAgICAgICAgc3RyICAgICAgcjYsW3IwLCAjNF0KLSAgICAgICAgc3RyICAgICAgbHIsW3IwLCAjMHhjXQotCi0KLTsgICAgdmVjWzVdICA9IGZ4cF9tdWwzMl9RMzIodG1wNTw8MSwgY29zXzE3cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxscixyNyxyMQotICAgICAgICByc2IgICAgICByNixyOSwjMAotOyAgICB2ZWNbNV0gID0gZnhwX21hYzMyX1EzMiggdmVjWzVdLCB0bXA2PDwxLCAgY29zXzdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHI1LGxyLHI2LHIyCi07ICAgIHZlY1s1XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbNV0sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjUsbHIscjQscjMKLTsgICAgdmVjWzVdICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s1XSwgdG1wODw8MSwgY29zXzEzcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByNSxscixyMTAscjEyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyMCwgIzB4MTRdCi0gICAgICAgIHJzYiAgICAgIGxyLHIxMCwjMAotCi07ICAgIHZlY1s3XSAgPSBmeHBfbXVsMzJfUTMyKHRtcDU8PDEsIGNvc181cGlfMTgpOwotICAgICAgICBzbXVsbCAgICByNSxyMSxscixyMQotOyAgICB2ZWNbN10gID0gZnhwX21hYzMyX1EzMiggdmVjWzddLCB0bXA2PDwxLCBjb3NfMTdwaV8xOCk7Ci0gICAgICAgIHNtbGFsICAgIHIyLHIxLHI3LHIyCi07ICAgIHZlY1s3XSAgPSBmeHBfbWFjMzJfUTMyKCB2ZWNbN10sIHRtcDc8PDEsICAgIGNvc19waV82KTsKLSAgICAgICAgc21sYWwgICAgcjMscjEscjQscjMKLTsgICAgdmVjWzddICA9IGZ4cF9tYWMzMl9RMzIoIHZlY1s3XSwgdG1wODw8MSwgY29zXzExcGlfMTgpOwotICAgICAgICBzbWxhbCAgICByMTIscjEscjkscjEyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyMCwgIzB4MWNdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotfGNvc18ycGlfOXwKLSAgICAgICAgRENEICAgICAgMHg2MjBkYmU4MAotfGNvc180cGlfOXwKLSAgICAgICAgRENEICAgICAgMHgxNjNhMWE4MAotfGNvc19waV85fAotICAgICAgICBEQ0QgICAgICAweDc4NDdkOTAwCi18Y29zXzVwaV85fAotICAgICAgICBEQ0QgICAgICAweDg3YjgyNzAwCi18Y29zXzhwaV85fAotICAgICAgICBEQ0QgICAgICAweGQ0MzhhZjAwCi18Y29zXzExcGlfMTh8Ci0gICAgICAgIERDRCAgICAgIDB4YWRiOTIyODAKLXxjb3NfMTNwaV8xOHwKLSAgICAgICAgRENEICAgICAgMHg5MTI2MTQ4MAotfGNvc18xN3BpXzE4fAotICAgICAgICBEQ0QgICAgICAweDgxZjFkMjAwCi18Y29zX3BpXzZ8Ci0gICAgICAgIERDRCAgICAgIDB4NmVkOWViODAKLSAgICAgICAgRU5EUAotCi0KLQotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9hcm0ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDAxZDhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2FybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLTsgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLTsgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsKLTsKLTsgICBGaWxlbmFtZTogcHZtcDNfZGN0XzE4LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfbWRjdF8xOAotCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkYXJtbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCB8fExpYiQkUmVxdWVzdCQkY3BwbGlifHwgW1dFQUtdCi0gICAgICAgIElNUE9SVCBwdm1wM19kY3RfOQotCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIEFSRUEgfC50ZXh0fCwgQ09ERSwgUkVBRE9OTFksIEFMSUdOPTIKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXxwdm1wM19tZGN0XzE4fCBQUk9DCi0gICAgICAgIHN0bWZkICAgIHNwISx7cjQtcjEwLGxyfQotICAgICAgICBtb3YgICAgICByNyxyMgotICAgICAgICBsZHIgICAgICByMix0YWJsZQotICAgICAgICBtb3YgICAgICByNixyMQotICAgICAgICBhZGQgICAgICByMyxyMiwjMHgyNAotICAgICAgICBhZGQgICAgICByMTIscjMsIzB4NDQKLSAgICAgICAgYWRkICAgICAgcjEscjAsIzB4NDQKLSAgICAgICAgbW92ICAgICAgcjUscjAKLQotOyAgICBmb3IgKCBpPTk7IGkhPTA7IGktLSkKLTsgICAgewotCi0gICAgICAgIG1vdiAgICAgIHI0LCM5Ci1Mb29wXzEKLQotOyAgICAgICB0bXAgID0gKihwdF92ZWMpOwotOwkJdG1wMSA9ICoocHRfdmVjX28pOwotCi0gICAgICAgIGxkciAgICAgIGxyLFtyMF0JCTs7IHRtcCAgPT0gbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IzXSwjNAkJOzsgdG1wMSA9PSByOAotCi07ICAgICAgICB0bXAgID0gZnhwX211bDMyX1EzMiggdG1wPDwxLCAgKihwdF9jb3MrKyAgKSk7Ci07ICAgICAgICB0bXAxID0gZnhwX211bDMyX1EyNyggdG1wMSwgKihwdF9jb3NfeC0tKSk7Ci0KLSAgICAgICAgbW92ICAgICAgbHIsbHIsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHIxMCxscixyOCxscgotICAgICAgICBsZHIgICAgICByOCxbcjEyXSwjLTQKLSAgICAgICAgbGRyICAgICAgcjksW3IxXQotICAgICAgICBzdWJzICAgICByNCxyNCwjMQotICAgICAgICBzbXVsbCAgICByOSxyMTAscjgscjkKLSAgICAgICAgbW92ICAgICAgcjgscjksbHNyICMyNwotICAgICAgICBhZGQgICAgICByOCxyOCxyMTAsbHNsICM1Ci0KLTsgICAgICAgICoocHRfdmVjKyspICAgPSAgIHRtcCArIHRtcDEgOwotOyAgICAgICAgKihwdF92ZWNfby0tKSA9IGZ4cF9tdWwzMl9RMjgoICh0bXAgLSB0bXAxKSwgKihwdF9jb3Nfc3BsaXQrKykpOwotCi0gICAgICAgIGFkZCAgICAgIHI5LGxyLHI4Ci0gICAgICAgIHN1YiAgICAgIHI4LGxyLHI4Ci0gICAgICAgIGxkciAgICAgIGxyLFtyMl0sIzQKLSAgICAgICAgc3RyICAgICAgcjksW3IwXSwjNAotICAgICAgICBzbXVsbCAgICByOCxyOSxscixyOAotICAgICAgICBtb3YgICAgICBscixyOCxsc3IgIzI4Ci0gICAgICAgIGFkZCAgICAgIGxyLGxyLHI5LGxzbCAjNAotICAgICAgICBzdHIgICAgICBscixbcjFdLCMtNAotICAgICAgICBibmUgICAgICBMb29wXzEKLQotOwkJfQotCi0gICAgICAgIG1vdiAgICAgIHIwLHI1CQkJOzsgcjAgPSB2ZWMKLSAgICAgICAgYmwgICAgICAgcHZtcDNfZGN0XzkKLSAgICAgICAgYWRkICAgICAgcjAscjUsIzB4MjQJOzsgcjAgPSAmdmVjWzldCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMixbcjUsIzB4NDBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweGNdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzhdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MjRdCi0gICAgICAgIHN1YiAgICAgIHIxMixyMTIscjEKLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjNF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHhjXQotICAgICAgICBzdWIgICAgICByMSxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDE0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc3ViICAgICAgcjAscjEscjMKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDI0XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIHN1YiAgICAgIHIzLHIxLHIzCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzNF0KLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzY10KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMF0KLQotTG9vcF8yCi0gICAgICAgIGFkZCAgICAgIHIxLHI1LHI0LGxzbCAjMgotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHIwLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIHIwLFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbGRyICAgICAgcjEsW3IxLCM0XQotICAgICAgICBzbWxhbCAgICByMCxyMyxscixyMAotICAgICAgICBtb3YgICAgICByMCxyMgotICAgICAgICBhZGQgICAgICByMixyMTIscjEKLSAgICAgICAgcnNiICAgICAgcjIscjIsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LHI0LGxzbCAjMl0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LHI0LGxzbCAjMl0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzEKLSAgICAgICAgY21wICAgICAgcjQsIzYKLSAgICAgICAgbW92ICAgICAgcjEyLHIxCi0KLSAgICAgICAgYmx0ICAgICAgTG9vcF8yCi0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMixbcjYsIzB4MThdCi0gICAgICAgIGFkZCAgICAgIHIzLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LHI0LGxzbCAjMl0KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgc21sYWwgICAgcjMscjIsbHIscjMKLSAgICAgICAgYWRkICAgICAgcjMscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDFjXQotICAgICAgICByc2IgICAgICByMyxyMywjMAotICAgICAgICBzdHIgICAgICByMyxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjAscjMscjAKLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDFjXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgyMF0KLSAgICAgICAgYWRkICAgICAgcjMscjMscjEKLSAgICAgICAgbW92ICAgICAgcjEscjIKLSAgICAgICAgbGRyICAgICAgcjEwLFtyNywjMHgxY10KLSAgICAgICAgbW92ICAgICAgcjIscjMsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMSxyMTAscjIKLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDFjXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgYWRkICAgICAgcjEscjEscjMKLSAgICAgICAgcnNiICAgICAgcjEscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHgyMF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxMixyMCxyMyxyMQotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgyNF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDIwXQotICAgICAgICBzbWxhbCAgICByMSxyMyxscixyMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4NDRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4NDRdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMSxyMTIscjMscjEKLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDQ0XQotICAgICAgICByc2IgICAgICByOCxyMSwjMAotICAgICAgICBzdHIgICAgICByOCxbcjUsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQwXQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjAscjMscjEKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDQwXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNiwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDNjXQotICAgICAgICByc2IgICAgICByOSxyMCwjMAotICAgICAgICBzdHIgICAgICByOSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHgzY10KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgzOF0KLSAgICAgICAgcnNiICAgICAgcjAscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4MzhdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMyxyMSxyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgzOF0KLSAgICAgICAgbGRyICAgICAgcjQsW3I3LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEscjQscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgyY10KLSAgICAgICAgbGRyICAgICAgbHIsW3I2LCMweDI4XQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNywjMHgzMF0KLSAgICAgICAgbW92ICAgICAgcjAscjksbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIwLHIzLHIxLHIwCi0gICAgICAgIG1vdiAgICAgIHIwLHI4LGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MmNdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgzMF0KLSAgICAgICAgc21sYWwgICAgcjAscjEyLHIxLHIwCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyY10KLSAgICAgICAgc21sYWwgICAgcjIsbHIscjAscjIKLSAgICAgICAgc3RyICAgICAgbHIsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NDhdCi0gICAgICAgIG1vdiAgICAgIHIyLHIxLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MjBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNl0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MWNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNl0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg0Y10KLSAgICAgICAgbW92ICAgICAgcjMscjMsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI0LGxyLHIxMixyMwotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2NF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCM0XQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2OF0KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDFjXQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg2Y10KLSAgICAgICAgc3RyICAgICAgbHIsW3I2LCMweDIwXQotICAgICAgICBzbXVsbCAgICBscixyMCxyMTIscjAKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNywjMHg3MF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDI0XQotICAgICAgICBzbXVsbCAgICByMCxyMixyMTIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg4XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MjhdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4Y10KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDQwXQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4NDRdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDUwXQotICAgICAgICBtb3YgICAgICByMSxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDE0XQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDEwXQotICAgICAgICBtb3YgICAgICByMyxyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweGNdCi0gICAgICAgIG1vdiAgICAgIHIxMixyMTIsbHNsICMxCi0gICAgICAgIG1vdiAgICAgIHIyLHIwLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzhdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjOF0KLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU0XQotICAgICAgICBtb3YgICAgICByMCxyMCxsc2wgIzEKLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjMKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDU4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4Y10KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEyCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1Y10KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDEwXQotICAgICAgICBzbXVsbCAgICByNSxyNCxscixyMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NjBdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjAKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDc0XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MThdCi0gICAgICAgIHNtdWxsICAgIHI0LHIwLGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3OF0KLSAgICAgICAgc3RyICAgICAgcjAsW3I2LCMweDJjXQotICAgICAgICBzbXVsbCAgICByMCxyMixscixyMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4N2NdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzMF0KLSAgICAgICAgc211bGwgICAgcjEyLHIyLHIwLHIxMgotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4ODBdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHgzNF0KLSAgICAgICAgc211bGwgICAgcjMscjIscjAscjMKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDg0XQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzhdCi0gICAgICAgIHNtdWxsICAgIHIyLHIxLHIwLHIxCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgzY10KLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTAscGN9Ci10YWJsZQotICAgICAgICBEQ0QgICAgICB8fC5jb25zdGRhdGEkMXx8Ci0gICAgICAgIEVORFAKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gQVJFQSB8LmNvbnN0ZGF0YXwsIERBVEEsIFJFQURPTkxZLCBBTElHTj0yCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfHwuY29uc3RkYXRhJDF8fAotY29zVGVybXNfZGN0MTgKLSAgICAgICAgRENEICAgICAgMHgwODA3ZDJiMAotICAgICAgICBEQ0QgICAgICAweDA4NDgzZWUwCi0gICAgICAgIERDRCAgICAgIDB4MDhkM2I3ZDAKLSAgICAgICAgRENEICAgICAgMHgwOWM0MjU3MAotICAgICAgICBEQ0QgICAgICAweDBiNTA0ZjMwCi0gICAgICAgIERDRCAgICAgIDB4MGRmMjk0NDAKLSAgICAgICAgRENEICAgICAgMHgxMmVkZmIyMAotICAgICAgICBEQ0QgICAgICAweDFlZThkZDQwCi0gICAgICAgIERDRCAgICAgIDB4NWJjYTJhMDAKLWNvc1Rlcm1zXzFfb3ZfY29zX3BoaQotICAgICAgICBEQ0QgICAgICAweDQwMGY5YzAwCi0gICAgICAgIERDRCAgICAgIDB4NDA4ZDYwODAKLSAgICAgICAgRENEICAgICAgMHg0MThkY2I4MAotICAgICAgICBEQ0QgICAgICAweDQzMWIxYTAwCi0gICAgICAgIERDRCAgICAgIDB4NDU0NWVhMDAKLSAgICAgICAgRENEICAgICAgMHg0ODI3MDY4MAotICAgICAgICBEQ0QgICAgICAweDRiZTI1NDgwCi0gICAgICAgIERDRCAgICAgIDB4NTBhYjk0ODAKLSAgICAgICAgRENEICAgICAgMHg1NmNlNGQ4MAotICAgICAgICBEQ0QgICAgICAweDA1ZWJiNjMwCi0gICAgICAgIERDRCAgICAgIDB4MDY5MjFhOTgKLSAgICAgICAgRENEICAgICAgMHgwNzcxZDNhOAotICAgICAgICBEQ0QgICAgICAweDA4YTlhODMwCi0gICAgICAgIERDRCAgICAgIDB4MGE3M2Q3NTAKLSAgICAgICAgRENEICAgICAgMHgwZDRkNTI2MAotICAgICAgICBEQ0QgICAgICAweDEyN2IxY2EwCi0gICAgICAgIERDRCAgICAgIDB4MWVhNTJiNDAKLSAgICAgICAgRENEICAgICAgMHg1YmIzY2M4MAotCi0KLQotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X3dtLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNzVkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF93bS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotOyBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotOyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOwotOwotOyAgIEZpbGVuYW1lOiBwdm1wM19kY3RfMTgucwotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBSRVZJU0lPTiBISVNUT1JZCi07Ci07Ci07IFdobzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGU6IE1NL0REL1lZWVkKLTsgRGVzY3JpcHRpb246IAotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIEVYUE9SVCB8cHZtcDNfbWRjdF8xOHwKLQotICAgICAgICBJTVBPUlQgcHZtcDNfZGN0XzkKLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfbWRjdF8xOHwgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3I0LXIxMCxscn0KLSAgICAgICAgbW92ICAgICAgcjcscjIKLSAgICAgICAgbGRyICAgICAgcjIsdGFibGUKLSAgICAgICAgbW92ICAgICAgcjYscjEKLSAgICAgICAgYWRkICAgICAgcjMscjIsIzB4MjQKLSAgICAgICAgYWRkICAgICAgcjEyLHIzLCMweDQ0Ci0gICAgICAgIGFkZCAgICAgIHIxLHIwLCMweDQ0Ci0gICAgICAgIG1vdiAgICAgIHI1LHIwCi0KLTsgICAgZm9yICggaT05OyBpIT0wOyBpLS0pCi07ICAgIHsKLQotICAgICAgICBtb3YgICAgICByNCwjOQotTG9vcF8xCi0KLTsgICAgICAgdG1wICA9ICoocHRfdmVjKTsKLTsJCXRtcDEgPSAqKHB0X3ZlY19vKTsKLQotICAgICAgICBsZHIgICAgICBscixbcjBdCQk7OyB0bXAgID09IGxyCi0gICAgICAgIGxkciAgICAgIHI4LFtyM10sIzQJCTs7IHRtcDEgPT0gcjgKLQotOyAgICAgICAgdG1wICA9IGZ4cF9tdWwzMl9RMzIoIHRtcDw8MSwgICoocHRfY29zKysgICkpOwotOyAgICAgICAgdG1wMSA9IGZ4cF9tdWwzMl9RMjcoIHRtcDEsICoocHRfY29zX3gtLSkpOwotCi0gICAgICAgIG1vdiAgICAgIGxyLGxyLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByMTAsbHIscjgsbHIKLSAgICAgICAgbGRyICAgICAgcjgsW3IxMl0sIy00Ci0gICAgICAgIGxkciAgICAgIHI5LFtyMV0KLSAgICAgICAgc3VicyAgICAgcjQscjQsIzEKLSAgICAgICAgc211bGwgICAgcjkscjEwLHI4LHI5Ci0gICAgICAgIG1vdiAgICAgIHI4LHI5LGxzciAjMjcKLSAgICAgICAgYWRkICAgICAgcjgscjgscjEwLGxzbCAjNQotCi07ICAgICAgICAqKHB0X3ZlYysrKSAgID0gICB0bXAgKyB0bXAxIDsKLTsgICAgICAgICoocHRfdmVjX28tLSkgPSBmeHBfbXVsMzJfUTI4KCAodG1wIC0gdG1wMSksICoocHRfY29zX3NwbGl0KyspKTsKLQotICAgICAgICBhZGQgICAgICByOSxscixyOAotICAgICAgICBzdWIgICAgICByOCxscixyOAotICAgICAgICBsZHIgICAgICBscixbcjJdLCM0Ci0gICAgICAgIHN0ciAgICAgIHI5LFtyMF0sIzQKLSAgICAgICAgc211bGwgICAgcjgscjksbHIscjgKLSAgICAgICAgbW92ICAgICAgbHIscjgsbHNyICMyOAotICAgICAgICBhZGQgICAgICBscixscixyOSxsc2wgIzQKLSAgICAgICAgc3RyICAgICAgbHIsW3IxXSwjLTQKLSAgICAgICAgYm5lICAgICAgTG9vcF8xCi0KLTsJCX0KLQotICAgICAgICBtb3YgICAgICByMCxyNQkJCTs7IHIwID0gdmVjCi0gICAgICAgIGJsICAgICAgIHB2bXAzX2RjdF85Ci0gICAgICAgIGFkZCAgICAgIHIwLHI1LCMweDI0CTs7IHIwID0gJnZlY1s5XQotICAgICAgICBibCAgICAgICBwdm1wM19kY3RfOQotCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I1LCMweDQwXQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIHIwLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM4XQotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDMwXQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MTRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHgxMF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEyLFtyNSwjMHhjXQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDE4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCMweDEwXQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCM0XQotICAgICAgICBzdHIgICAgICByMTIsW3I1LCM4XQotICAgICAgICBsZHIgICAgICByMTIsW3I1LCMweDI0XQotICAgICAgICBzdWIgICAgICByMTIscjEyLHIxCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHN1YiAgICAgIHIxLHIxMixyMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4Y10KLSAgICAgICAgc3ViICAgICAgcjEscjEyLHIwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBzdWIgICAgICByMCxyMSxyMAotICAgICAgICBzdHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHN1YiAgICAgIHIwLHIxLHIzCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDNjXQotICAgICAgICBzdWIgICAgICByMyxyMSxyMwotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzRdCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSwjMHgyY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBzdWIgICAgICByMSxyMSxyMgotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4M2NdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjUsIzBdCi0KLUxvb3BfMgotICAgICAgICBhZGQgICAgICByMSxyNSxyNCxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI4XQotICAgICAgICBsZHIgICAgICByMyxbcjYscjQsbHNsICMyXQotICAgICAgICBhZGQgICAgICByMCxyMCxyMgotICAgICAgICBzdHIgICAgICByMCxbcjEsIzB4MjhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIGxkciAgICAgIHIxLFtyMSwjNF0KLSAgICAgICAgc21sYWwgICAgcjAscjMsbHIscjAKLSAgICAgICAgbW92ICAgICAgcjAscjIKLSAgICAgICAgYWRkICAgICAgcjIscjEyLHIxCi0gICAgICAgIHJzYiAgICAgIHIyLHIyLCMwCi0gICAgICAgIHN0ciAgICAgIHIzLFtyNSxyNCxsc2wgIzJdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNixyNCxsc2wgIzJdCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LCMxCi0gICAgICAgIGNtcCAgICAgIHI0LCM2Ci0gICAgICAgIG1vdiAgICAgIHIxMixyMQotCi0gICAgICAgIGJsdCAgICAgIExvb3BfMgotCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjIsW3I2LCMweDE4XQotICAgICAgICBhZGQgICAgICByMyxyMCxyMQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4NDBdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNyxyNCxsc2wgIzJdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MWNdCi0gICAgICAgIHNtbGFsICAgIHIzLHIyLGxyLHIzCi0gICAgICAgIGFkZCAgICAgIHIzLHIxMixyMAotICAgICAgICBzdHIgICAgICByMixbcjUsIzB4MThdCi0gICAgICAgIGxkciAgICAgIHIyLFtyNiwjMHgxY10KLSAgICAgICAgcnNiICAgICAgcjMscjMsIzAKLSAgICAgICAgc3RyICAgICAgcjMsW3I2LCMweDE4XQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIwLHIzLHIwCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MjBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLHIxCi0gICAgICAgIG1vdiAgICAgIHIxLHIyCi0gICAgICAgIGxkciAgICAgIHIxMCxbcjcsIzB4MWNdCi0gICAgICAgIG1vdiAgICAgIHIyLHIzLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjEscjEwLHIyCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNSwjMHgxY10KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDIwXQotICAgICAgICBsZHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGFkZCAgICAgIHIxLHIxLHIzCi0gICAgICAgIHJzYiAgICAgIHIxLHIxLCMwCi0gICAgICAgIHN0ciAgICAgIHIxLFtyNiwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I1LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMyxbcjcsIzB4MjBdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMTIscjAscjMscjEKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDI0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MjRdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgyMF0KLSAgICAgICAgc21sYWwgICAgcjEscjMsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCMweDQwXQotICAgICAgICBsZHIgICAgICByMTIsW3I2LCMweDQ0XQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MjRdCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I3LCMweDQ0XQotICAgICAgICBtb3YgICAgICByMSxyMSxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjEscjEyLHIzLHIxCi0gICAgICAgIGxkciAgICAgIHIxLFtyNSwjMHg0MF0KLSAgICAgICAgc3RyICAgICAgcjEyLFtyNSwjMHg0NF0KLSAgICAgICAgcnNiICAgICAgcjgscjEsIzAKLSAgICAgICAgc3RyICAgICAgcjgsW3I1LCMweDI4XQotICAgICAgICBsZHIgICAgICByMSxbcjUsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNywjMHg0MF0KLSAgICAgICAgbW92ICAgICAgcjEscjEsbHNsICMxCi0gICAgICAgIHNtbGFsICAgIHIxLHIwLHIzLHIxCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHg0MF0KLSAgICAgICAgbGRyICAgICAgcjAsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMSxbcjYsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHIzLFtyNiwjMHgzY10KLSAgICAgICAgcnNiICAgICAgcjkscjAsIzAKLSAgICAgICAgc3RyICAgICAgcjksW3I1LCMweDJjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzBdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4M2NdCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMTIscjAKLSAgICAgICAgc3RyICAgICAgcjMsW3I1LCMweDNjXQotICAgICAgICBsZHIgICAgICByMCxbcjUsIzB4MzhdCi0gICAgICAgIHJzYiAgICAgIHIwLHIwLCMwCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjMsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDM4XQotICAgICAgICBtb3YgICAgICByMyxyMyxsc2wgIzEKLSAgICAgICAgc21sYWwgICAgcjMscjEscjEyLHIzCi0gICAgICAgIG1vdiAgICAgIHIwLHIwLGxzbCAjMQotICAgICAgICBzdHIgICAgICByMSxbcjUsIzB4MzhdCi0gICAgICAgIGxkciAgICAgIHI0LFtyNywjMHgzNF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDM0XQotICAgICAgICBsZHIgICAgICByMyxbcjYsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxLHI0LHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjYsIzB4MmNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNiwjMHgyOF0KLSAgICAgICAgc3RyICAgICAgcjEsW3I1LCMweDM0XQotICAgICAgICBsZHIgICAgICByMSxbcjcsIzB4MzBdCi0gICAgICAgIG1vdiAgICAgIHIwLHI5LGxzbCAjMQotICAgICAgICBzbWxhbCAgICByMCxyMyxyMSxyMAotICAgICAgICBtb3YgICAgICByMCxyOCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I3LCMweDJjXQotICAgICAgICBzdHIgICAgICByMyxbcjUsIzB4MzBdCi0gICAgICAgIHNtbGFsICAgIHIwLHIxMixyMSxyMAotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4MjhdCi0gICAgICAgIHN0ciAgICAgIHIxMixbcjUsIzB4MmNdCi0gICAgICAgIHNtbGFsICAgIHIyLGxyLHIwLHIyCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCM0XQotICAgICAgICBsZHIgICAgICByMTIsW3I3LCMweDQ4XQotICAgICAgICBtb3YgICAgICByMixyMSxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjEsW3I2LCMweDIwXQotICAgICAgICBsZHIgICAgICByMCxbcjZdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjEKLSAgICAgICAgbGRyICAgICAgcjMsW3I2LCMweDFjXQotICAgICAgICBzdHIgICAgICBscixbcjZdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NGNdCi0gICAgICAgIG1vdiAgICAgIHIzLHIzLGxzbCAjMQotICAgICAgICBzbXVsbCAgICByNCxscixyMTIscjMKLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjRdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjNF0KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NjhdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgxY10KLSAgICAgICAgc211bGwgICAgcjQsbHIscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NmNdCi0gICAgICAgIHN0ciAgICAgIGxyLFtyNiwjMHgyMF0KLSAgICAgICAgc211bGwgICAgbHIscjAscjEyLHIwCi0gICAgICAgIGxkciAgICAgIHIxMixbcjcsIzB4NzBdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyNF0KLSAgICAgICAgc211bGwgICAgcjAscjIscjEyLHIyCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4OF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDI4XQotICAgICAgICBzbXVsbCAgICByMyxyMixyMCxyMwotICAgICAgICBsZHIgICAgICByMCxbcjcsIzB4OGNdCi0gICAgICAgIHN0ciAgICAgIHIyLFtyNiwjMHg0MF0KLSAgICAgICAgc211bGwgICAgcjIscjEscjAscjEKLSAgICAgICAgc3RyICAgICAgcjEsW3I2LCMweDQ0XQotICAgICAgICBsZHIgICAgICByMCxbcjYsIzB4MThdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1MF0KLSAgICAgICAgbW92ICAgICAgcjEscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHgxNF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjEKLSAgICAgICAgbGRyICAgICAgcjEyLFtyNiwjMHgxMF0KLSAgICAgICAgbW92ICAgICAgcjMscjAsbHNsICMxCi0gICAgICAgIGxkciAgICAgIHIwLFtyNiwjMHhjXQotICAgICAgICBtb3YgICAgICByMTIscjEyLGxzbCAjMQotICAgICAgICBtb3YgICAgICByMixyMCxsc2wgIzEKLSAgICAgICAgbGRyICAgICAgcjAsW3I2LCM4XQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzhdCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1NF0KLSAgICAgICAgbW92ICAgICAgcjAscjAsbHNsICMxCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIzCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg1OF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweGNdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIxMgotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NWNdCi0gICAgICAgIHN0ciAgICAgIHI0LFtyNiwjMHgxMF0KLSAgICAgICAgc211bGwgICAgcjUscjQsbHIscjIKLSAgICAgICAgbGRyICAgICAgbHIsW3I3LCMweDYwXQotICAgICAgICBzdHIgICAgICByNCxbcjYsIzB4MTRdCi0gICAgICAgIHNtdWxsICAgIHI1LHI0LGxyLHIwCi0gICAgICAgIGxkciAgICAgIGxyLFtyNywjMHg3NF0KLSAgICAgICAgc3RyICAgICAgcjQsW3I2LCMweDE4XQotICAgICAgICBzbXVsbCAgICByNCxyMCxscixyMAotICAgICAgICBsZHIgICAgICBscixbcjcsIzB4NzhdCi0gICAgICAgIHN0ciAgICAgIHIwLFtyNiwjMHgyY10KLSAgICAgICAgc211bGwgICAgcjAscjIsbHIscjIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDdjXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzBdCi0gICAgICAgIHNtdWxsICAgIHIxMixyMixyMCxyMTIKLSAgICAgICAgbGRyICAgICAgcjAsW3I3LCMweDgwXQotICAgICAgICBzdHIgICAgICByMixbcjYsIzB4MzRdCi0gICAgICAgIHNtdWxsICAgIHIzLHIyLHIwLHIzCi0gICAgICAgIGxkciAgICAgIHIwLFtyNywjMHg4NF0KLSAgICAgICAgc3RyICAgICAgcjIsW3I2LCMweDM4XQotICAgICAgICBzbXVsbCAgICByMixyMSxyMCxyMQotICAgICAgICBzdHIgICAgICByMSxbcjYsIzB4M2NdCi0gICAgICAgIGxkbWZkICAgIHNwISx7cjQtcjEwLHBjfQotdGFibGUKLSAgICAgICAgRENEICAgICAgY29zVGVybXNfZGN0MTgKLSAgICAgICAgRU5EUAotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwuY29uc3RkYXRhfCwgREFUQSwgUkVBRE9OTFksIEFMSUdOPTIKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb3NUZXJtc19kY3QxOAotICAgICAgICBEQ0QgICAgICAweDA4MDdkMmIwCi0gICAgICAgIERDRCAgICAgIDB4MDg0ODNlZTAKLSAgICAgICAgRENEICAgICAgMHgwOGQzYjdkMAotICAgICAgICBEQ0QgICAgICAweDA5YzQyNTcwCi0gICAgICAgIERDRCAgICAgIDB4MGI1MDRmMzAKLSAgICAgICAgRENEICAgICAgMHgwZGYyOTQ0MAotICAgICAgICBEQ0QgICAgICAweDEyZWRmYjIwCi0gICAgICAgIERDRCAgICAgIDB4MWVlOGRkNDAKLSAgICAgICAgRENEICAgICAgMHg1YmNhMmEwMAotY29zVGVybXNfMV9vdl9jb3NfcGhpCi0gICAgICAgIERDRCAgICAgIDB4NDAwZjljMDAKLSAgICAgICAgRENEICAgICAgMHg0MDhkNjA4MAotICAgICAgICBEQ0QgICAgICAweDQxOGRjYjgwCi0gICAgICAgIERDRCAgICAgIDB4NDMxYjFhMDAKLSAgICAgICAgRENEICAgICAgMHg0NTQ1ZWEwMAotICAgICAgICBEQ0QgICAgICAweDQ4MjcwNjgwCi0gICAgICAgIERDRCAgICAgIDB4NGJlMjU0ODAKLSAgICAgICAgRENEICAgICAgMHg1MGFiOTQ4MAotICAgICAgICBEQ0QgICAgICAweDU2Y2U0ZDgwCi0gICAgICAgIERDRCAgICAgIDB4MDVlYmI2MzAKLSAgICAgICAgRENEICAgICAgMHgwNjkyMWE5OAotICAgICAgICBEQ0QgICAgICAweDA3NzFkM2E4Ci0gICAgICAgIERDRCAgICAgIDB4MDhhOWE4MzAKLSAgICAgICAgRENEICAgICAgMHgwYTczZDc1MAotICAgICAgICBEQ0QgICAgICAweDBkNGQ1MjYwCi0gICAgICAgIERDRCAgICAgIDB4MTI3YjFjYTAKLSAgICAgICAgRENEICAgICAgMHgxZWE1MmI0MAotICAgICAgICBEQ0QgICAgICAweDViYjNjYzgwCi0KLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2FybS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmVjNTk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19hcm0ucworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBFWFBPUlQgcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cKLQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGFybWxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgfHxMaWIkJFJlcXVlc3QkJGNwcGxpYnx8IFtXRUFLXQotICAgICAgICBJTVBPUlQgcHFtZlN5bnRoV2luCi0KLQotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBBUkVBIHwudGV4dHwsIENPREUsIFJFQURPTkxZLCBBTElHTj0yCi0KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi18cHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3d8IFBST0MKLQotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCi0gICAgICAgIEVORFAKLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCmluZGV4IGI3NGM4NDkuLjExNDBlZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKQEAgLTM1LDYgKzM1LDcgQEAKIC50ZXh0CiAKIC5leHRlcm4gcHFtZlN5bnRoV2luCisuaGlkZGVuIHBxbWZTeW50aFdpbgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd193bS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTcyNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X3dtLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi07IGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi07IGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi07Ci07Ci07ICAgRmlsZW5hbWU6IHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LnMKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgUkVWSVNJT04gSElTVE9SWQotOwotOwotOyBXaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlOiBNTS9ERC9ZWVlZCi07IERlc2NyaXB0aW9uOiAKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCUNPREUzMgotCi0JQVJFQQl8LmRyZWN0dmV8LCBEUkVDVFZFCi0KLQlFWFBPUlQJfHB2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93fAotCUlNUE9SVAl8cHFtZlN5bnRoV2lufAotCi0JQVJFQQl8LnBkYXRhfCwgUERBVEEKLQotCUFSRUEJfC50ZXh0fCwgQ09ERSwgQVJNCi0KLXxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wgUFJPQwotICAgICAgICBzdG1mZCAgICBzcCEse3IwLXIyLHI0LXIxMSxscn0KLQotICAgICAgICBzdWIgICAgICBzcCxzcCwjNAotICAgICAgICBsZHIgICAgICByMixbc3AsIzB4Y10KLSAgICAgICAgbGRyICAgICAgcjEsUG9seVBoX2ZpbHRlcl9jb2VmZgotCQkKLSAgICAgICAgc3ViICAgICAgcjIscjIsIzEKLSAgICAgICAgbW92ICAgICAgcjEwLCMxCi0gICAgICAgIHN0ciAgICAgIHIyLFtzcF0KLQotOyBBY2N1bXVsYXRvcnMgcjksIHIxMTo6PiBJbml0aWFsaXphdGlvbgotCi1Mb29wX2oKLSAgICAgICAgbW92ICAgICAgcjksICAjMHgyMAotICAgICAgICBtb3YgICAgICByMTEsICMweDIwCi0gICAgICAgIG1vdiAgICAgIHI0LCAgIzB4MTAKLUxvb3BfaQotICAgICAgICBhZGQgICAgICByMixyNCxyMTAKLSAgICAgICAgYWRkICAgICAgcjMscjAscjIsbHNsICMyCi0gICAgICAgIHN1YiAgICAgIHIyLHI0LHIxMAotICAgICAgICBsZHIgICAgICByNSxbcjNdCi0gICAgICAgIGxkciAgICAgIGxyLFtyMV0KLSAgICAgICAgYWRkICAgICAgcjEyLHIwLHIyLGxzbCAjMgotICAgICAgICBsZHIgICAgICByNixbcjEyLCMweDc4MF0KLSAgICAgICAgc21sYWwgICAgcjIscjksbHIscjUKLSAgICAgICAgc21sYWwgICAgcjIscjExLGxyLHI2Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IxMiwjMHg4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDcwMF0KLSAgICAgICAgYWRkICAgICAgcjQscjQsIzB4MjAwCi0gICAgICAgIHNtbGFsICAgIHI2LHI5LHI1LHI3Ci0gICAgICAgIHNtdWxsICAgIHI2LHIyLHI1LHI4Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMSwjMHhjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHIyCi0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI1LHI4Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyNSxyNwotICAgICAgICBsZHIgICAgICByNSxbcjMsIzB4MTAwXQotICAgICAgICBsZHIgICAgICByMixbcjEsIzB4MTBdCi0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NjgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDE0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDE4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgxOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDYwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDFjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0gICAgICAgIHNtbGFsICAgIHI4LHI5LHI2LHI4Ci0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgyMF0KLSAgICAgICAgbGRyICAgICAgcjUsW3IzLCMweDIwMF0KLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMTIsIzB4NTgwXQotICAgICAgICBzbWxhbCAgICBscixyOSxyMixyNQotICAgICAgICBzbWxhbCAgICBscixyMTEscjIscjYKLSAgICAgICAgbGRyICAgICAgcjIsW3IxLCMweDI0XQotICAgICAgICBsZHIgICAgICByNyxbcjEyLCMweDI4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHIyLHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHIyLHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgyOF0KLSAgICAgICAgbGRyICAgICAgcjgsW3IzLCMweDUwMF0KLSAgICAgICAgc3ViICAgICAgcjkscjkscjUKLSAgICAgICAgc21sYWwgICAgcjUscjkscjYscjcKLSAgICAgICAgc211bGwgICAgcjIscjUscjYscjgKLSAgICAgICAgbGRyICAgICAgcjYsW3IxLCMweDJjXQotICAgICAgICBzdWIgICAgICByMTEscjExLHI1Ci0KLSAgICAgICAgc21sYWwgICAgcjgscjkscjYscjgKLSAgICAgICAgc21sYWwgICAgcjcscjExLHI2LHI3Ci0gICAgICAgIGxkciAgICAgIHI1LFtyMywjMHgzMDBdCi0gICAgICAgIGxkciAgICAgIHI4LFtyMSwjMHgzMF0KLSAgICAgICAgbGRyICAgICAgcjYsW3IxMiwjMHg0ODBdCi0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI4LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHIxMSxyOCxyNgotICAgICAgICBsZHIgICAgICByOCxbcjEsIzB4MzRdCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEyLCMweDM4MF0KLSAgICAgICAgc21sYWwgICAgcjUscjExLHI4LHI1Ci0gICAgICAgIHNtdWxsICAgIHI2LHI1LHI4LHI2Ci0gICAgICAgIGxkciAgICAgIHI2LFtyMSwjMHgzOF0KLQotCi0gICAgICAgIGxkciAgICAgIHIzLFtyMywjMHg0MDBdCi0gICAgICAgIHN1YiAgICAgIHI5LHI5LHI1Ci0gICAgICAgIHNtbGFsICAgIHI3LHI5LHI2LHIxMgotICAgICAgICBzbXVsbCAgICByOCxyNyxyNixyMwotICAgICAgICBjbXAgICAgICByNCwjMHgyMTAKLSAgICAgICAgc3ViICAgICAgcjExLHIxMSxyNwotCi0gICAgICAgIGxkciAgICAgIHIyLFtyMSwjMHgzY10KLSAgICAgICAgYWRkICAgICAgcjEscjEsIzB4NDAKLSAgICAgICAgc21sYWwgICAgcjMscjkscjIscjMKLSAgICAgICAgc21sYWwgICAgcjEyLHIxMSxyMixyMTIKLQotICAgICAgICBibHQgICAgICBMb29wX2kKLQotICAgICAgICBtb3YgICAgICByMyxyOSwgYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHI0LHIzLCBhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLCBhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixMT1dfMTZCSVRTCi0gICAgICAgIGxkciAgICAgIHIyLFtzcF0KLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjQsW3NwLCM4XQotICAgICAgICBtb3YgICAgICByMixyMTAsbHNsIHIyCi0gICAgICAgIGFkZCAgICAgIHI0LHI0LHIyLGxzbCAjMQotICAgICAgICBzdHJoICAgICByMyxbcjRdCi0KLSAgICAgICAgbW92ICAgICAgcjMscjExLGFzciAjNgotICAgICAgICBtb3YgICAgICByNCxyMyxhc3IgIzE1Ci0gICAgICAgIHRlcSAgICAgIHI0LHIzLGFzciAjMzEKLSAgICAgICAgZW9ybmUgICAgcjMscjEyLHIzLGFzciAjMzEKLSAgICAgICAgbGRyICAgICAgcjEyLFtzcCwjMHhjXQotICAgICAgICBsZHIgICAgICByMTEsW3NwLCM4XQotICAgICAgICByc2IgICAgICByMixyMixyMTIsbHNsICM1Ci0gICAgICAgIGFkZCAgICAgIHIyLHIxMSxyMixsc2wgIzEKLSAgICAgICAgc3RyaCAgICAgcjMsW3IyXQotCi0gICAgICAgIGFkZCAgICAgIHIxMCxyMTAsIzEKLSAgICAgICAgY21wICAgICAgcjEwLCMweDEwCi0gICAgICAgIGJsdCAgICAgIExvb3BfagotCi07IEFjY3VtdWxhdG9ycyByNCwgcjUgSW5pdGlhbGl6YXRpb24KLQotICAgICAgICBtb3YgICAgICByNCwjMHgyMAotICAgICAgICBtb3YgICAgICByNSwjMHgyMAotICAgICAgICBtb3YgICAgICByMywjMHgxMAotUG9seVBoX2ZpbHRlcl9sb29wMgotICAgICAgICBhZGQgICAgICByMixyMCxyMyxsc2wgIzIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMl0KLSAgICAgICAgbGRyICAgICAgcjgsW3IxXQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4ODBdCi0gICAgICAgIHNtbGFsICAgIHIxMixyNCxyOCxyMTIKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMSwjNF0KLSAgICAgICAgbGRyICAgICAgcjcsW3IyLCMweDQwXQotICAgICAgICBzbWxhbCAgICByNixyNCxyMTIscjYKLQotICAgICAgICBsZHIgICAgICByMTIsW3IxLCM4XQotICAgICAgICBsZHIgICAgICByNixbcjIsIzB4MTgwXQotICAgICAgICBzbWxhbCAgICByNyxyNSxyMTIscjcKLSAgICAgICAgbGRyICAgICAgcjEyLFtyMiwjMHgxMDBdCi0gICAgICAgIGxkciAgICAgIHI3LFtyMSwjMHhjXQotICAgICAgICBsZHIgICAgICByMixbcjIsIzB4MTQwXQotICAgICAgICBzbWxhbCAgICByMTIscjQscjcscjEyCi0gICAgICAgIGxkciAgICAgIHIxMixbcjEsIzB4MTBdCi0gICAgICAgIGFkZCAgICAgIHIzLHIzLCMweDgwCi0gICAgICAgIHNtbGFsICAgIHI2LHI0LHIxMixyNgotICAgICAgICBsZHIgICAgICByNixbcjEsIzB4MTRdCi0gICAgICAgIGNtcCAgICAgIHIzLCMweDIxMAotICAgICAgICBzbWxhbCAgICByMixyNSxyNixyMgotICAgICAgICBhZGQgICAgICByMSxyMSwjMHgxOAotCi0gICAgICAgIGJsdCAgICAgIFBvbHlQaF9maWx0ZXJfbG9vcDIKLSAgICAgICAgbW92ICAgICAgcjAscjQsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMSxbc3AsIzhdCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMSwjMF0KLSAgICAgICAgbW92ICAgICAgcjAscjUsYXNyICM2Ci0gICAgICAgIG1vdiAgICAgIHIyLHIwLGFzciAjMTUKLSAgICAgICAgdGVxICAgICAgcjIscjAsYXNyICMzMQotICAgICAgICBsZHJuZSAgICByMTIsTE9XXzE2QklUUwotICAgICAgICBsZHIgICAgICByMixbc3BdCi0gICAgICAgIG1vdiAgICAgIHIxLCMweDEwCi0gICAgICAgIGVvcm5lICAgIHIwLHIxMixyMCxhc3IgIzMxCi0gICAgICAgIGxkciAgICAgIHIxMixbc3AsIzhdCi0gICAgICAgIG1vdiAgICAgIHIxLHIxLGxzbCByMgotICAgICAgICBhZGQgICAgICByMSxyMTIscjEsbHNsICMxCi0gICAgICAgIHN0cmggICAgIHIwLFtyMV0KLSAgICAgICAgYWRkICAgICAgc3Asc3AsIzB4MTAKLSAgICAgICAgbGRtZmQgICAgc3AhLHtyNC1yMTEscGN9Ci0KLQotUG9seVBoX2ZpbHRlcl9jb2VmZgotICAgICAgICBEQ0QgICAgICBwcW1mU3ludGhXaW4KLUxPV18xNkJJVFMKLSAgICAgICAgRENEICAgICAgMHgwMDAwN2ZmZgotCQotCQlFTkRQICA7IHxwdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd3wKLQkJRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcAppbmRleCBlZTQyZGM1Li40OTk2NzJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBpbnQxNiBibG9ja251bWJlciA9IDA7CiAKICAgICBncmFudWxlSW5mbyAqZ3JfaW5mbyA9ICYoc2ktPmNoW2NoXS5ncmFuW2dyXSk7Ci0gICAgdWludDMyIHNjYWxlZmFjX2NvbXAsIGludF9zY2FsZWZhY19jb21wLCBuZXdfc2xlbls0XTsKKyAgICB1aW50MzIgc2NhbGVmYWNfY29tcCwgaW50X3NjYWxlZmFjX2NvbXAsIG5ld19zbGVuWzRdID0geyAwLDAsMCwwIH07CiAKICAgICBzY2FsZWZhY19jb21wID0gIGdyX2luZm8tPnNjYWxlZmFjX2NvbXByZXNzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5tawppbmRleCA3ZjJjNDZkLi45M2ZmNjRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsKQEAgLTIwLDQgKzIwLDYgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCAxNjkxZDAzLi40MWZmYzU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMjMsMTMgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCi0jaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCi0jaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgotI2luY2x1ZGUgInZweC92cDhkeC5oIgotCi0jaWZuZGVmIFVJTlQzMl9NQVgKLSNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAoNDI5NDk2NzI5NVUpCi0jZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NSw3ICszOCw4IEBACiAgICAgICAgICAgICBOVUxMIC8qIHByb2ZpbGVMZXZlbHMgKi8sIDAgLyogbnVtUHJvZmlsZUxldmVscyAqLywKICAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbU1vZGUoY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTU9ERV9WUDggOiBNT0RFX1ZQOSksCi0gICAgICBtQ3R4KE5VTEwpIHsKKyAgICAgIG1DdHgoTlVMTCksCisgICAgICBtSW1nKE5VTEwpIHsKICAgICBpbml0UG9ydHMoa051bUJ1ZmZlcnMsIDc2OCAqIDEwMjQgLyogaW5wdXRCdWZmZXJTaXplICovLAogICAgICAgICAgICAga051bUJ1ZmZlcnMsCiAgICAgICAgICAgICBjb2RpbmdUeXBlID09IE9NWF9WSURFT19Db2RpbmdWUDggPyBNRURJQV9NSU1FVFlQRV9WSURFT19WUDggOiBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOwpAQCAtODksNyArODMsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBTb2Z0VlBYOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNvZnRWUFg6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKICAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMjIsNzEgKzExNiw1MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LAotICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOworICAgICAgICBpZiAobUltZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIik7CiAKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKyAgICAgICAgICAgIG1JbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LCAmaXRlcik7CiAgICAgICAgIH0KIAotICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOwotICAgICAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOworICAgICAgICBpZiAobUltZyAhPSBOVUxMKSB7CisgICAgICAgICAgICBDSEVDS19FUShtSW1nLT5mbXQsIFZQWF9JTUdfRk1UX0k0MjApOwogCi0gICAgICAgIGlmIChpbWcgIT0gTlVMTCkgewotICAgICAgICAgICAgQ0hFQ0tfRVEoaW1nLT5mbXQsIFZQWF9JTUdfRk1UX0k0MjApOwotCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IGltZy0+ZF93OwotICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gaW1nLT5kX2g7Ci0KLSAgICAgICAgICAgIGlmICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBtV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgdXBkYXRlUG9ydERlZmluaXRpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IEFXQUlUSU5HX0RJU0FCTEVEOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtSW1nLT5kX3c7CisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtSW1nLT5kX2g7CisgICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gRU9Tc2VlbiA/IE9NWF9CVUZGRVJGTEFHX0VPUyA6IDA7CiAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLQogICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbWctPmRfaDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93KTsKLQotICAgICAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKLSAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltZy0+ZF9oIC8gMjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyY0xpbmUsIGltZy0+ZF93IC8gMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07Ci0gICAgICAgICAgICAgICAgICAgIGRzdCArPSBpbWctPmRfdyAvIDI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3JjTGluZSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKLQotICAgICAgICAgICAgICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKLSAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGltZy0+ZF93IC8gMjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtSW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisgICAgICAgICAgICAgICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1JbWcgPSBOVUxMOwogICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKQEAgLTIwMyw4ICsxNzcsOCBAQAogfQogCiBib29sIFNvZnRWUFg6Om91dHB1dEJ1ZmZlclNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlcikgewotICAgIHVpbnQzMl90IHdpZHRoID0gbVdpZHRoOwotICAgIHVpbnQzMl90IGhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3Qgd2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIHVpbnQ2NF90IG5GaWxsZWRMZW4gPSB3aWR0aDsKICAgICBuRmlsbGVkTGVuICo9IGhlaWdodDsKICAgICBpZiAobkZpbGxlZExlbiA+IFVJTlQzMl9NQVggLyAzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKaW5kZXggNTgwMWI0YS4uYTFiNTQ4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaApAQCAtMjAsNiArMjAsMTAgQEAKIAogI2luY2x1ZGUgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCIKIAorI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKKyNpbmNsdWRlICJ2cHgvdnA4ZHguaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgU29mdFZQWCA6IHB1YmxpYyBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IHsKQEAgLTQ3LDYgKzUxLDggQEAKIAogICAgIHZvaWQgKm1DdHg7CiAKKyAgICB2cHhfaW1hZ2VfdCAqbUltZzsKKwogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBvdXRwdXRCdWZmZXJTYWZlKE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5tawppbmRleCA0MDYwYTBhLi5lMjY1MTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQubWsKQEAgLTEyLDEwICsxMiw2IEBACiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKLWlmZXEgKCQoVEFSR0VUX0RFVklDRSksIG1hbnRhKQotICAgIExPQ0FMX0NGTEFHUyArPSAtRFNVUkZBQ0VfSVNfQkdSMzIKLWVuZGlmCi0KIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJ2cHgKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IDgwYzI5YWIuLmFkZjkwNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTMxLDcgKzMxLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIHRlbXBsYXRlPGNsYXNzIFQ+CiBzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgewogICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CkBAIC01NSwxMDcgKzU0LDM3IEBACiAgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKIH0KIAotCi0vLyBUaGlzIGNvbG9yIGNvbnZlcnNpb24gdXRpbGl0eSBpcyBjb3BpZWQgZnJvbSBTb2Z0TVBFRzRFbmNvZGVyLmNwcAotaW5saW5lIHN0YXRpYyB2b2lkIENvbnZlcnRTZW1pUGxhbmFyVG9QbGFuYXIodWludDhfdCAqaW55dXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXR5dXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpIHsKLSAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKLSAgICB1aW50MTZfdCAqb3V0Y2IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplKTsKLSAgICB1aW50MTZfdCAqb3V0Y3IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKLQotICAgIC8qIFkgY29weWluZyAqLwotICAgIG1lbWNweShvdXR5LCBpbnl1diwgb3V0WXNpemUpOwotCi0gICAgLyogVSAmIFYgY29weWluZyAqLwotICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgewotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOwotICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOwotCi0gICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKLSAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7Ci0gICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0UkdCMzJUb1BsYW5hcigKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3RZLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotICAgIENIRUNLKCh3aWR0aCAmIDEpID09IDApOwotICAgIENIRUNLKChoZWlnaHQgJiAxKSA9PSAwKTsKLQotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RZICsgd2lkdGggKiBoZWlnaHQ7Ci0gICAgdWludDhfdCAqZHN0ViA9IGRzdFUgKyAod2lkdGggLyAyKSAqIChoZWlnaHQgLyAyKTsKLQotICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSNpZmRlZiBTVVJGQUNFX0lTX0JHUjMyCi0gICAgICAgICAgICB1bnNpZ25lZCBibHVlID0gc3JjWzQgKiB4XTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuID0gc3JjWzQgKiB4ICsgMV07Ci0gICAgICAgICAgICB1bnNpZ25lZCByZWQ9IHNyY1s0ICogeCArIDJdOwotI2Vsc2UKLSAgICAgICAgICAgIHVuc2lnbmVkIHJlZD0gc3JjWzQgKiB4XTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGdyZWVuID0gc3JjWzQgKiB4ICsgMV07Ci0gICAgICAgICAgICB1bnNpZ25lZCBibHVlID0gc3JjWzQgKiB4ICsgMl07Ci0jZW5kaWYKLQotICAgICAgICAgICAgdW5zaWduZWQgbHVtYSA9Ci0gICAgICAgICAgICAgICAgKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2OwotCi0gICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKLQotICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KLSAgICAgICAgICAgICAgICAgICAgKCgtcmVkICogMzggLSBncmVlbiAqIDc0ICsgYmx1ZSAqIDExMikgPj4gOCkgKyAxMjg7Ci0KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0KLSAgICAgICAgICAgICAgICAgICAgKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyODsKLQotICAgICAgICAgICAgICAgIGRzdFVbeCAvIDJdID0gVTsKLSAgICAgICAgICAgICAgICBkc3RWW3ggLyAyXSA9IFY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICBkc3RVICs9IHdpZHRoIC8gMjsKLSAgICAgICAgICAgIGRzdFYgKz0gd2lkdGggLyAyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IDQgKiB3aWR0aDsKLSAgICAgICAgZHN0WSArPSB3aWR0aDsKLSAgICB9Ci19Ci0KIFNvZnRWUFhFbmNvZGVyOjpTb2Z0VlBYRW5jb2Rlcihjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCi0gICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICA6IFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbUNvZGVjQ29udGV4dChOVUxMKSwKICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24oTlVMTCksCiAgICAgICBtQ29kZWNJbnRlcmZhY2UoTlVMTCksCiAgICAgICBtV2lkdGgoMTc2KSwKICAgICAgIG1IZWlnaHQoMTQ0KSwKICAgICAgIG1CaXRyYXRlKDE5MjAwMCksICAvLyBpbiBicHMKKyAgICAgIG1GcmFtZXJhdGUoMzAgPDwgMTYpLCAvLyBpbiBRMTYgZm9ybWF0CiAgICAgICBtQml0cmF0ZVVwZGF0ZWQoZmFsc2UpLAogICAgICAgbUJpdHJhdGVDb250cm9sTW9kZShWUFhfVkJSKSwgIC8vIHZhcmlhYmxlIGJpdHJhdGUKLSAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMzMzMzMpLCAgLy8gRGVmYXVsdHMgdG8gMzAgZnBzCiAgICAgICBtRENUUGFydGl0aW9ucygwKSwKICAgICAgIG1FcnJvclJlc2lsaWVuY2UoT01YX0ZBTFNFKSwKICAgICAgIG1Db2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKICAgICAgIG1MZXZlbChPTVhfVklERU9fVlA4TGV2ZWxfVmVyc2lvbjApLAorICAgICAgbUtleUZyYW1lSW50ZXJ2YWwoMCksCisgICAgICBtTWluUXVhbnRpemVyKDApLAorICAgICAgbU1heFF1YW50aXplcigwKSwKKyAgICAgIG1UZW1wb3JhbExheWVycygwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5UeXBlKE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZMTCksCiAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcihOVUxMKSwKICAgICAgIG1JbnB1dERhdGFJc01ldGEoZmFsc2UpLAotICAgICAgbUdyYWxsb2NNb2R1bGUoTlVMTCksCiAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOwogICAgIGluaXRQb3J0cygpOwogfQogCkBAIC0xODQsOSArMTEzLDggQEAKICAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAgICAgaW5wdXRQb3J0LmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IDA7Ci0gICAgLy8gZnJhbWVSYXRlIGlzIHJlY2lwcm9jYWwgb2YgZnJhbWVEdXJhdGlvbiwgd2hpY2ggaXMKLSAgICAvLyBpbiBtaWNyb3NlY29uZHMuIEl0IGlzIGFsc28gaW4gUTE2IGZvcm1hdC4KLSAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMTAwMDAwMC9tRnJhbWVEdXJhdGlvblVzKSA8PCAxNjsKKyAgICAvLyBmcmFtZVJhdGUgaXMgaW4gUTE2IGZvcm1hdC4KKyAgICBpbnB1dFBvcnQuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBtRnJhbWVyYXRlOwogICAgIGlucHV0UG9ydC5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOwogICAgIGlucHV0UG9ydC5uUG9ydEluZGV4ID0ga0lucHV0UG9ydEluZGV4OwogICAgIGlucHV0UG9ydC5lRGlyID0gT01YX0RpcklucHV0OwpAQCAtMjI0LDcgKzE1Miw3IEBACiAgICAgb3V0cHV0UG9ydC5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1ZQODsKICAgICBvdXRwdXRQb3J0LmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwogICAgIG91dHB1dFBvcnQuZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOwotICAgIG91dHB1dFBvcnQubkJ1ZmZlclNpemUgPSAyNTYgKiAxMDI0OyAgLy8gYXJiaXRyYXJ5CisgICAgb3V0cHV0UG9ydC5uQnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDI0OyAvLyBhcmJpdHJhcnkKIAogICAgIGFkZFBvcnQob3V0cHV0UG9ydCk7CiB9CkBAIC0yNDAsNyArMTY4LDkgQEAKICAgICBpZiAobUNvZGVjSW50ZXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQotCisgICAgQUxPR0QoIlZQODogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1LZXlGcmFtZUludGVydmFsLAorICAgICAgICAgIG1NaW5RdWFudGl6ZXIsIG1NYXhRdWFudGl6ZXIpOwogICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQobUNvZGVjSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgLy8gQ29kZWMgc3BlY2lmaWMgZmxhZ3MKQEAgLTI4MSw4ICsyMTEsMTIwIEBACiAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5udW0gPSAxOwogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UuZGVuID0gMTAwMDAwMDsKICAgICAvLyByY190YXJnZXRfYml0cmF0ZSBpcyBpbiBrYnBzLCBtQml0cmF0ZSBpbiBicHMKLSAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IG1CaXRyYXRlLzEwMDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSAobUJpdHJhdGUgKyA1MDApIC8gMTAwMDsKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOworICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgLy8gRGlzYWJsZSBzcGF0aWFsIHJlc2l6aW5nLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19yZXNpemVfYWxsb3dlZCA9IDA7CisgICAgICAgIC8vIFNpbmdsZS1wYXNzIG1vZGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcGFzcyA9IFZQWF9SQ19PTkVfUEFTUzsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY191bmRlcnNob290X3BjdCA9IDEwMDsKKyAgICAgICAgLy8gTWF4aW11bSBhbW91bnQgb2YgYml0cyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX292ZXJzaG9vdF9wY3QgPSAxNTsKKyAgICAgICAgLy8gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgYnVmZmVyIGxldmVsIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfaW5pdGlhbF9zeiA9IDUwMDsKKyAgICAgICAgLy8gQW1vdW50IG9mIGRhdGEgdGhhdCB0aGUgZW5jb2RlciBzaG91bGQgdHJ5IHRvIG1haW50YWluIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiA9IDYwMDsKKyAgICAgICAgLy8gVGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgbWF5IGJlIGJ1ZmZlcmVkIGJ5IHRoZSBkZWNvZGluZworICAgICAgICAvLyBhcHBsaWNhdGlvbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX3N6ID0gMTAwMDsKKyAgICAgICAgLy8gRW5hYmxlIGVycm9yIHJlc2lsaWVuY2UgLSBuZWVkZWQgZm9yIHBhY2tldCBsb3NzLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2Vycm9yX3Jlc2lsaWVudCA9IDE7CisgICAgICAgIC8vIERpc2FibGUgbGFnZ2VkIGVuY29kaW5nLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX2xhZ19pbl9mcmFtZXMgPSAwOworICAgICAgICAvLyBNYXhpbXVtIGtleSBmcmFtZSBpbnRlcnZhbCAtIGZvciBDQlIgYm9vc3QgdG8gMzAwMAorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IDMwMDA7CisgICAgICAgIC8vIEVuY29kZXIgZGV0ZXJtaW5lcyBvcHRpbWFsIGtleSBmcmFtZSBwbGFjZW1lbnQgYXV0b21hdGljYWxseS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKworICAgIC8vIEZyYW1lcyB0ZW1wb3JhbCBwYXR0ZXJuIC0gZm9yIG5vdyBXZWJSVEMgbGlrZSBwYXR0ZXJuIGlzIG9ubHkgc3VwcG9ydGVkLgorICAgIHN3aXRjaCAobVRlbXBvcmFsTGF5ZXJzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgeworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgeworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDE7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDM7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDQ7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsyXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFszXSA9IDI7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzICV6dSIsIG1UZW1wb3JhbExheWVycyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBiaXRyYXRlIHZhbHVlcyBmb3IgZWFjaCBsYXllcgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVyczsgaSsrKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlICoKKyAgICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldIC8gMTAwOworICAgIH0KKyAgICBpZiAobUtleUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21pbl9kaXN0ID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisgICAgaWYgKG1NaW5RdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21pbl9xdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgIH0KKyAgICBpZiAobU1heFF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWF4X3F1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgfQogCiAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19pbml0KG1Db2RlY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0ludGVyZmFjZSwKQEAgLTMwMiwxNyArMzQ0LDQ0IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwgbUlucHV0RGF0YUlzTWV0YSkgeworICAgIC8vIEV4dHJhIENCUiBzZXR0aW5ncworICAgIGlmIChtQml0cmF0ZUNvbnRyb2xNb2RlID09IFZQWF9DQlIpIHsKKyAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfU1RBVElDX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICB1aW50MzJfdCByY19tYXhfaW50cmFfdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiAqIChtRnJhbWVyYXRlID4+IDE3KSAvIDEwOworICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgMyB0aW1lcyBwZXIgZnJhbWUgYmFuZHdpZHRoLgorICAgICAgICAgICAgaWYgKHJjX21heF9pbnRyYV90YXJnZXQgPCAzMDApIHsKKyAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0ID0gMzAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgY2JyIHBhcmFtZXRlcnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgfHwgbUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoKCh1aW50NjRfdCltV2lkdGggKiBtSGVpZ2h0KSA+ICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI1ODEyNzk0LCBCdWZmZXIgc2l6ZSBpcyB0b28gYmlnLiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDIpOwogICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCgodWludDY0X3QpbVdpZHRoICogbUhlaWdodCkgPiAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMik7Ci0gICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKQEAgLTMzMiw3ICs0MDEsNyBAQAogICAgIH0KIAogICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQ29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcik7CiAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKICAgICB9CiAKQEAgLTM3Myw5ICs0NDIsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0aW5nIGZyb20gbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgLy8gQWxzbyBjb252ZXJ0aW5nIHRvIFExNiBmb3JtYXQKLSAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSAoMTAwMDAwMC9tRnJhbWVEdXJhdGlvblVzKSA8PCAxNjsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPnhGcmFtZXJhdGUgPSBtRnJhbWVyYXRlOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1ZQODsKQEAgLTQzMSw2ICs0OTgsMjggQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZFZwOEVuY29kZXI6IHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICp2cDhBbmRyb2lkUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUgKilwYXJhbTsKKworICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHZwOEFuZHJvaWRQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbCA9IG1LZXlGcmFtZUludGVydmFsOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gPSBtVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKyAgICAgICAgICAgICAgICB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID0gbVRlbXBvcmFsTGF5ZXJzOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5NYXhRdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgICAgICAgICAgICAgIG1lbWNweSh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQ6IHsKICAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwcm9maWxlQW5kTGV2ZWwgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqKXBhcmFtOwpAQCAtNTY4LDcgKzY1NywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0UHJvZmlsZUxldmVsKHZwOFBhcmFtcyk7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkOgorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjoKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW0pOworCisgICAgICAgIGNhc2Uga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RvcmVNZXRhRGF0YUluQnVmZmVycwogICAgICAgICAgICAgY29uc3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyAqc3RvcmVQYXJhbSA9CkBAIC02MzksNiArNzMyLDExIEBACiAKIE9NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcHJvZmlsZUFuZExldmVsKSB7CisKKyAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwcm9maWxlQW5kTGV2ZWwpKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCiAgICAgaWYgKHByb2ZpbGVBbmRMZXZlbC0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KQEAgLTY4OSw2ICs3ODcsNTUgQEAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAorT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zKAorICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSogdnA4QW5kcm9pZFBhcmFtcykgeworCisgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0odnA4QW5kcm9pZFBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lICYmCisgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gIT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID4gT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPiB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCisgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUgPSB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuOworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50OworICAgIH0gZWxzZSBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IDA7CisgICAgfQorICAgIC8vIENoZWNrIHRoZSBiaXRyYXRlIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIGxheWVycyBpcyBpbiBpbmNyZWFzaW5nIG9yZGVyCisgICAgaWYgKG1UZW1wb3JhbExheWVycyA+IDEpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGVtcG9yYWxMYXllcnMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpICsgMV0gPD0KKyAgICAgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgYml0cmF0ZSByYXRpbyAtIHNob3VsZCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUtleUZyYW1lSW50ZXJ2YWwgPSB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbDsKKyAgICBtTWluUXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplcjsKKyAgICBtTWF4UXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplcjsKKyAgICBtZW1jcHkobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgQUxPR0QoIlZQODogaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zLiBCUk1vZGU6ICV1LiBUUzogJXp1LiBLRjogJXUuIgorICAgICAgICAgICIgUVA6ICV1IC0gJXUgQlIwOiAldS4gQlIxOiAldS4gQlIyOiAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplciwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0sCisgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMV0sIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzJdKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KSB7CkBAIC03MzksOSArODg2LDcgQEAKICAgICAgICAgbUhlaWdodCA9IHBvcnQtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICAgICAgLy8geEZyYW1lcmF0ZSBjb21lcyBpbiBRMTYgZm9ybWF0LCBpbiBmcmFtZXMgcGVyIHNlY29uZCB1bml0Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID4+IDE2OwotICAgICAgICAvLyBmcmFtZSBkdXJhdGlvbiBpcyBpbiBtaWNyb3NlY29uZHMKLSAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDAwMDAwL2ZyYW1lcmF0ZSk7CisgICAgICAgIG1GcmFtZXJhdGUgPSBwb3J0LT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKIAogICAgICAgICBpZiAocG9ydC0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CiAgICAgICAgICAgICBwb3J0LT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyIHx8CkBAIC03NTQsMTIgKzg5OSwyMiBAQAogICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OwotICAgICAgICBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gcG9ydC0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSBtRnJhbWVyYXRlOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtQ29sb3JGb3JtYXQ7CisgICAgICAgIGRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OwogCiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0gZWxzZSBpZiAocG9ydC0+blBvcnRJbmRleCA9PSBrT3V0cHV0UG9ydEluZGV4KSB7CiAgICAgICAgIG1CaXRyYXRlID0gcG9ydC0+Zm9ybWF0LnZpZGVvLm5CaXRyYXRlOworICAgICAgICBtV2lkdGggPSBwb3J0LT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBwb3J0LT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IG1CaXRyYXRlOwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwpAQCAtNzg2LDYgKzk0MSw3NCBAQAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCit2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgU29mdFZQWEVuY29kZXI6OmdldEVuY29kZUZsYWdzKCkgeworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgaW50IHBhdHRlcm5JZHggPSBtVGVtcG9yYWxQYXR0ZXJuSWR4ICUgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKyAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4Kys7CisgICAgc3dpdGNoIChtVGVtcG9yYWxQYXR0ZXJuW3BhdHRlcm5JZHhdKSB7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdDoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5OgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmU6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQogCiB2b2lkIFNvZnRWUFhFbmNvZGVyOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5CkBAIC04MjUsNDEgKzEwNDgsMjAgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ4X3QgKnNvdXJjZSA9CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNvdXJjZSA9CiAgICAgICAgICAgICBpbnB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0QnVmZmVySGVhZGVyLT5uT2Zmc2V0OwogCiAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CiAgICAgICAgIGlmIChtSW5wdXREYXRhSXNNZXRhKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShpbnB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlclR5cGUgPSAqKHVpbnQzMl90ICopc291cmNlOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnVmZmVyVHlwZSwga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpOwotCi0gICAgICAgICAgICBpZiAobUdyYWxsb2NNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGh3X2dldF9tb2R1bGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtR3JhbGxvY01vZHVsZSkpOworICAgICAgICAgICAgc291cmNlID0gZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLCBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGV4dHJhY3QgZ3JhbGxvYyBidWZmZXIgaW4gbWV0YWRhdGEgbW9kZSIpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnN0IGdyYWxsb2NfbW9kdWxlX3QgKmdybW9kdWxlID0KLSAgICAgICAgICAgICAgICAoY29uc3QgZ3JhbGxvY19tb2R1bGVfdCAqKW1HcmFsbG9jTW9kdWxlOwotCi0gICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QgKikoc291cmNlICsgNCk7Ci0KLSAgICAgICAgICAgIHZvaWQgKmJpdHM7Ci0gICAgICAgICAgICBDSEVDS19FUSgwLAotICAgICAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUtPmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUsIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTkVWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbVdpZHRoLCBtSGVpZ2h0LCAmYml0cykpOwotCi0gICAgICAgICAgICBDb252ZXJ0UkdCMzJUb1BsYW5hcigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiliaXRzLCBtQ29udmVyc2lvbkJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0KTsKLQotICAgICAgICAgICAgc291cmNlID0gbUNvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIENIRUNLX0VRKDAsIGdybW9kdWxlLT51bmxvY2soZ3Jtb2R1bGUsIGhhbmRsZSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuIDwgZnJhbWVTaXplKSB7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzU2OTYzNSIpOwpAQCAtODcwLDcgKzEwNzIsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKSB7Ci0gICAgICAgICAgICAgICAgQ29udmVydFNlbWlQbGFuYXJUb1BsYW5hcigKKyAgICAgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBtQ29udmVyc2lvbkJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgIHNvdXJjZSA9IG1Db252ZXJzaW9uQnVmZmVyOwpAQCAtODc4LDkgKzEwODAsMTIgQEAKICAgICAgICAgfQogICAgICAgICB2cHhfaW1hZ2VfdCByYXdfZnJhbWU7CiAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCBtV2lkdGgsIG1IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICBrSW5wdXRCdWZmZXJBbGlnbm1lbnQsICh1aW50OF90ICopc291cmNlKTsKIAogICAgICAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobUtleUZyYW1lUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CiAgICAgICAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQgPSBmYWxzZTsKQEAgLTkwMSwxMSArMTEwNiwxOCBAQAogICAgICAgICAgICAgbUJpdHJhdGVVcGRhdGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAorICAgICAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KTEwMDAwMDAgPDwgMTYpIC8gbUZyYW1lcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZSgKICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICZyYXdfZnJhbWUsCiAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAsICAvLyBpbiB0aW1lYmFzZSB1bml0cwotICAgICAgICAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMsICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cworICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sICAvLyBmcmFtZSBkdXJhdGlvbiBpbiB0aW1lYmFzZSB1bml0cwogICAgICAgICAgICAgICAgIGZsYWdzLCAgLy8gZnJhbWUgZmxhZ3MKICAgICAgICAgICAgICAgICBWUFhfRExfUkVBTFRJTUUpOyAgLy8gZW5jb2RpbmcgZGVhZGxpbmUKICAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKQEAgLTk0OSwxNiArMTE2MSw2IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKSkgewotICAgICAgICAqaW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZDsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCAwNzY4MzBmLi5mNGMxNTY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBTT0ZUX1ZQWF9FTkNPREVSX0hfCiAKLSNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oIgogCiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CkBAIC01OSw3ICs1OSw3IEBACiAvLyAgICAtIE9NWCB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZQogLy8gZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZCB0byAxLzEwMDAwMDAKIAotc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworc3RydWN0IFNvZnRWUFhFbmNvZGVyIDogcHVibGljIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFhFbmNvZGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTg3LDEwICs4Nyw0NCBAQAogICAgIC8vIGVuY29kaW5nIG9mIHRoZSBmcmFtZQogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKLQogcHJpdmF0ZToKKyAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAvLyB1cGRhdGUgbGFzdC4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAvLyBnb2xkZW4gd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZiA9IDEwLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAvLyBCYXNlIGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgIC8vIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWYgPSA2LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAvLyB0aGUgc2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW4gPSAyLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3kgPSAxLAorICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICB9OworICAgIGVudW0geworICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgIH07CisKICAgICAvLyBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgcGVyIHBvcnQKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga051bUJ1ZmZlcnMgPSA0OwogCkBAIC0xMzAsMTYgKzE2NCwxNSBAQAogICAgIC8vIFRhcmdldCBiaXRyYXRlIHNldCBmb3IgdGhlIGVuY29kZXIsIGluIGJpdHMgcGVyIHNlY29uZC4KICAgICB1aW50MzJfdCBtQml0cmF0ZTsKIAorICAgIC8vIFRhcmdldCBmcmFtZXJhdGUgc2V0IGZvciB0aGUgZW5jb2Rlci4KKyAgICB1aW50MzJfdCBtRnJhbWVyYXRlOworCiAgICAgLy8gSWYgYSByZXF1ZXN0IGZvciBhIGNoYW5nZSBpdCBiaXRyYXRlIGhhcyBiZWVuIHJlY2VpdmVkLgogICAgIGJvb2wgbUJpdHJhdGVVcGRhdGVkOwogCiAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQogICAgIHZweF9yY19tb2RlIG1CaXRyYXRlQ29udHJvbE1vZGU7CiAKLSAgICAvLyBGcmFtZSBkdXJhdGlvbiBpcyB0aGUgcmVjaXByb2NhbCBvZiBmcmFtZXJhdGUsIGRlbm90ZWQKLSAgICAvLyBpbiBtaWNyb3NlY29uZHMKLSAgICB1aW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwotCiAgICAgLy8gdnA4IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCiAgICAgLy8gdGhhdCBlbmFibGVzIHRva2VuIHBhcnRpdGlvbmluZyBvZgogICAgIC8vIHRoZSBzdHJlYW0gaW50byBzdWJzdHJlYW1zCkBAIC0xNjAsNiArMTkzLDM2IEBACiAgICAgLy8gc29tZXRoaW5nIGVsc2UuCiAgICAgT01YX1ZJREVPX1ZQOExFVkVMVFlQRSBtTGV2ZWw7CiAKKyAgICAvLyBLZXkgZnJhbWUgaW50ZXJ2YWwgaW4gZnJhbWVzCisgICAgdWludDMyX3QgbUtleUZyYW1lSW50ZXJ2YWw7CisKKyAgICAvLyBNaW5pbXVtIChiZXN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICB1aW50MzJfdCBtTWF4UXVhbnRpemVyOworCisgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgLy8gVGVtcG9yYWwgbGF5ZXIgYml0cmFyZSByYXRpbyBpbiBwZXJjZW50YWdlCisgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKworICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgLy8gRnJhbWUgdHlwZSB0ZW1wb3JhbCBwYXR0ZXJuCisgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICBPTVhfVElDS1MgbUxhc3RUaW1lc3RhbXA7CisKICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gY29udmVydCBzZW1pCiAgICAgLy8gcGxhbmFyIHl1djQyMCB0byBwbGFuYXIgZm9ybWF0CiAgICAgLy8gSXQgaXMgb25seSBhbGxvY2F0ZWQgaWYgaW5wdXQgZm9ybWF0IGlzCkBAIC0xNjcsNyArMjMwLDYgQEAKICAgICB1aW50OF90KiBtQ29udmVyc2lvbkJ1ZmZlcjsKIAogICAgIGJvb2wgbUlucHV0RGF0YUlzTWV0YTsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbUdyYWxsb2NNb2R1bGU7CiAKICAgICBib29sIG1LZXlGcmFtZVJlcXVlc3RlZDsKIApAQCAtMTg1LDYgKzI0Nyw5IEBACiAgICAgLy8gZHRvci4KICAgICBzdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOwogCisgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGdldEVuY29kZUZsYWdzKCk7CisKICAgICAvLyBIYW5kbGVzIHBvcnQgY2hhbmdlcyB3aXRoIHJlc3BlY3QgdG8gY29sb3IgZm9ybWF0cwogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KTsKQEAgLTIwNiw2ICsyNzEsMTAgQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSogdnA4UGFyYW1zKTsKIAorICAgIC8vIEhhbmRsZXMgQW5kcm9pZCB2cDggc3BlY2lmaWMgcGFyYW1ldGVycy4KKyAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpOworCiAgICAgLy8gVXBkYXRlcyBlbmNvZGVyIHByb2ZpbGUKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UHJvZmlsZUxldmVsKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSogcHJvZmlsZUFuZExldmVsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKaW5kZXggNjU1YjJhYi4uYmYwM2FkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTg0LDggKzg0LDggQEAKIAkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMgXAogCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBcCiAKLQotaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisgIGlmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQogICAgIExPQ0FMX0FSTV9ORU9OICAgOj0gdHJ1ZQogIyAgICBMT0NBTF9DRkxBR1MgICAgIDo9IC1zdGQ9Yzk5IC1ELl9ORU9OIC1ELl9PTVhETAogICAgIExPQ0FMX0NGTEFHUyAgICAgOj0gLURIMjY0REVDX05FT04gLURIMjY0REVDX09NWERMCkBAIC05NCw2ICs5NCw3IEBACiAgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vYXBpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9hcGkgXAogICAgICAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaQorICBlbmRpZgogZW5kaWYKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKaW5kZXggMWY5ZjhkNy4uMjUzMjFiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApAQCAtNTgsNyArNTgsNiBAQAogICAgICAgICAgICAgMzIwIC8qIHdpZHRoICovLCAyNDAgLyogaGVpZ2h0ICovLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCksCiAgICAgICBtSGFuZGxlKE5VTEwpLAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCi0gICAgICBtUGljdHVyZVNpemUobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwKICAgICAgIG1GaXJzdFBpY3R1cmUoTlVMTCksCiAgICAgICBtRmlyc3RQaWN0dXJlSWQoLTEpLAogICAgICAgbVBpY0lkKDApLApAQCAtOTgsNyArOTcsNyBAQAogICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQogCi12b2lkIFNvZnRBVkM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xMTgsNyArMTE3LDcgQEAKICAgICB9CiAKICAgICBIMjY0U3dEZWNSZXQgcmV0ID0gSDI2NFNXREVDX1BJQ19SRFk7Ci0gICAgYm9vbCBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CiAgICAgd2hpbGUgKChtRU9TU3RhdHVzICE9IElOUFVUX0RBVEFfQVZBSUxBQkxFIHx8ICFpblF1ZXVlLmVtcHR5KCkpCiAgICAgICAgICAgICAmJiBvdXRRdWV1ZS5zaXplKCkgPT0ga051bU91dHB1dEJ1ZmZlcnMpIHsKIApAQCAtMTYxLDE3ICsxNjAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoJmRlY29kZXJJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckluZm8uY3JvcHBpbmdGbGFnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDcm9wUmVjdEV2ZW50KCZkZWNvZGVySW5mby5jcm9wUGFyYW1zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFNldHRpbmdzQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BQYXJhbXMoZGVjb2RlckluZm8pOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGRlY29kZXJJbmZvLnBpY1dpZHRoLCBkZWNvZGVySW5mby5waWNIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDApCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgewogCkBAIC0xOTksOCArMTk1LDcgQEAKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CiAKLSAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQpIHsKLSAgICAgICAgICAgIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMjAsNTEgKzIxNSw0MiBAQAogICAgIH0KIH0KIAotYm9vbCBTb2Z0QVZDOjpoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pIHsKLSAgICBpZiAobVdpZHRoICE9IGluZm8tPnBpY1dpZHRoIHx8IG1IZWlnaHQgIT0gaW5mby0+cGljSGVpZ2h0KSB7Ci0gICAgICAgIG1XaWR0aCAgPSBpbmZvLT5waWNXaWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGluZm8tPnBpY0hlaWdodDsKLSAgICAgICAgbVBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwotICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7Ci0gICAgICAgIHJldHVybiB0cnVlOworU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBTb2Z0QVZDOjpoYW5kbGVDcm9wUGFyYW1zKAorICAgICAgICBjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKSB7CisgICAgaWYgKCFkZWNJbmZvLmNyb3BwaW5nRmxhZykgeworICAgICAgICByZXR1cm4ga0Nyb3BVblNldDsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU29mdEFWQzo6aGFuZGxlQ3JvcFJlY3RFdmVudChjb25zdCBDcm9wUGFyYW1zICpjcm9wKSB7Ci0gICAgaWYgKG1Dcm9wTGVmdCAhPSBjcm9wLT5jcm9wTGVmdE9mZnNldCB8fAotICAgICAgICBtQ3JvcFRvcCAhPSBjcm9wLT5jcm9wVG9wT2Zmc2V0IHx8Ci0gICAgICAgIG1Dcm9wV2lkdGggIT0gY3JvcC0+Y3JvcE91dFdpZHRoIHx8Ci0gICAgICAgIG1Dcm9wSGVpZ2h0ICE9IGNyb3AtPmNyb3BPdXRIZWlnaHQpIHsKLSAgICAgICAgbUNyb3BMZWZ0ID0gY3JvcC0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgICAgIG1Dcm9wVG9wID0gY3JvcC0+Y3JvcFRvcE9mZnNldDsKLSAgICAgICAgbUNyb3BXaWR0aCA9IGNyb3AtPmNyb3BPdXRXaWR0aDsKLSAgICAgICAgbUNyb3BIZWlnaHQgPSBjcm9wLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLAotICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsIE5VTEwpOwotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgIGNvbnN0IENyb3BQYXJhbXMmIGNyb3AgPSBkZWNJbmZvLmNyb3BQYXJhbXM7CisgICAgaWYgKG1Dcm9wTGVmdCA9PSBjcm9wLmNyb3BMZWZ0T2Zmc2V0ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3AuY3JvcFRvcE9mZnNldCAmJgorICAgICAgICBtQ3JvcFdpZHRoID09IGNyb3AuY3JvcE91dFdpZHRoICYmCisgICAgICAgIG1Dcm9wSGVpZ2h0ID09IGNyb3AuY3JvcE91dEhlaWdodCkgeworICAgICAgICByZXR1cm4ga0Nyb3BTZXQ7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKworICAgIG1Dcm9wTGVmdCA9IGNyb3AuY3JvcExlZnRPZmZzZXQ7CisgICAgbUNyb3BUb3AgPSBjcm9wLmNyb3BUb3BPZmZzZXQ7CisgICAgbUNyb3BXaWR0aCA9IGNyb3AuY3JvcE91dFdpZHRoOworICAgIG1Dcm9wSGVpZ2h0ID0gY3JvcC5jcm9wT3V0SGVpZ2h0OworICAgIHJldHVybiBrQ3JvcENoYW5nZWQ7CiB9CiAKIHZvaWQgU29mdEFWQzo6c2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpIHsKICAgICBDSEVDSyhtRmlyc3RQaWN0dXJlID09IE5VTEwpOwogICAgIG1GaXJzdFBpY3R1cmVJZCA9IHBpY0lkOwogCi0gICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W21QaWN0dXJlU2l6ZV07Ci0gICAgbWVtY3B5KG1GaXJzdFBpY3R1cmUsIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgdWludDMyX3QgcGljdHVyZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbUZpcnN0UGljdHVyZSA9IG5ldyB1aW50OF90W3BpY3R1cmVTaXplXTsKKyAgICBtZW1jcHkobUZpcnN0UGljdHVyZSwgZGF0YSwgcGljdHVyZVNpemUpOwogfQogCiBib29sIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwogICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQgPCBtUGljdHVyZVNpemUpIHsKKyAgICBPTVhfVTMyIGZyYW1lU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQgPCBmcmFtZVNpemUpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjcyLDkgKzI1OCwxNyBAQAogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAudmFsdWVGb3IocGljSWQpOwogICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGhlYWRlci0+blRpbWVTdGFtcDsKICAgICBvdXRIZWFkZXItPm5GbGFncyA9IGhlYWRlci0+bkZsYWdzOwotICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG1QaWN0dXJlU2l6ZTsKLSAgICBtZW1jcHkob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgZGF0YSwgbVBpY3R1cmVTaXplKTsKKyAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBmcmFtZVNpemU7CisKKyAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IHNyY1kgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSBzcmNVICsgbVdpZHRoICogbUhlaWdodCAvIDQ7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtV2lkdGg7CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBtV2lkdGggLyAyOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gc3JjVVN0cmlkZTsKKyAgICBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlKTsKKwogICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtKHBpY0lkKTsKICAgICBkZWxldGUgaGVhZGVyOwogICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCmluZGV4IDUyOGVmMWMuLmI4YzE4MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuaApAQCAtNTUsOCArNTUsNiBAQAogCiAgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OwogCi0gICAgdWludDMyX3QgbVBpY3R1cmVTaXplOwotCiAgICAgdWludDhfdCAqbUZpcnN0UGljdHVyZTsKICAgICBpbnQzMl90IG1GaXJzdFBpY3R1cmVJZDsKIApAQCAtNzUsOCArNzMsNyBAQAogICAgIHZvaWQgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGJvb2wgZW9zKTsKICAgICBib29sIGRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpOwogICAgIHZvaWQgc2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGlkSWQsIHVpbnQ4X3QgKmRhdGEpOwotICAgIGJvb2wgaGFuZGxlQ3JvcFJlY3RFdmVudChjb25zdCBDcm9wUGFyYW1zKiBjcm9wKTsKLSAgICBib29sIGhhbmRsZVBvcnRTZXR0aW5nQ2hhbmdlRXZlbnQoY29uc3QgSDI2NFN3RGVjSW5mbyAqaW5mbyk7CisgICAgQ3JvcFNldHRpbmdzTW9kZSBoYW5kbGVDcm9wUGFyYW1zKGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdEFWQyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9vbXh0eXBlcy5oCmluZGV4IDhiMjk1YTYuLjkxMmNiMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX09NWFRZUEVTX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4gCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNkZWZpbmUgT01YX0lOCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTc1LDY0ICs3NiwyMiBAQAogCiAgCiAvKiBPTVhfVTggKi8KLSNpZiBVQ0hBUl9NQVggPT0gMHhmZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLSNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1U4IHVuZGVmaW5lZAotI2VuZGlmIAotCit0eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwogIAogLyogT01YX1M4ICovCi0jaWYgU0NIQVJfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLSNlbGlmIFNIUlRfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1M4IHVuZGVmaW5lZAotI2VuZGlmCi0gCit0eXBlZGVmIGludDhfdCBPTVhfUzg7CiAgCiAvKiBPTVhfVTE2ICovCi0jaWYgVVNIUlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKLSNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwogCiAvKiBPTVhfUzE2ICovCi0jaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7Ci0jZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDE2X3QgT01YX1MxNjsKIAogLyogT01YX1UzMiAqLwotI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKIAogLyogT01YX1MzMiAqLwotI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDMyX3QgT01YX1MzMjsKIAogLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KICNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKQEAgLTE0MywxNSArMTAyLDE0IEBACiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCiAjZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCiAgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKICNlbmRpZgogCi0KIC8qIE9NWF9TQzggKi8KIHR5cGVkZWYgc3RydWN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKaW5kZXggOGIyOTVhNi4uOTEyY2IwZCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfT01YVFlQRVNfSF8KIAogI2luY2x1ZGUgPGxpbWl0cy5oPiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2RlZmluZSBPTVhfSU4KICNkZWZpbmUgT01YX09VVApAQCAtNzUsNjQgKzc2LDIyIEBACiAKICAKIC8qIE9NWF9VOCAqLwotI2lmIFVDSEFSX01BWCA9PSAweGZmCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1U4OwotI2VsaWYgVVNIUlRfTUFYID09IDB4ZmYgCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTg7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTggdW5kZWZpbmVkCi0jZW5kaWYgCi0KK3R5cGVkZWYgdWludDhfdCBPTVhfVTg7CiAgCiAvKiBPTVhfUzggKi8KLSNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OwotI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKLXR5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzggdW5kZWZpbmVkCi0jZW5kaWYKLSAKK3R5cGVkZWYgaW50OF90IE9NWF9TODsKICAKIC8qIE9NWF9VMTYgKi8KLSNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OwotI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7CiAKIC8qIE9NWF9TMTYgKi8KLSNpZiBTSFJUX01BWCA9PSAweDdmZmYgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKLSNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwogCiAvKiBPTVhfVTMyICovCi0jaWYgVUlOVF9NQVggPT0gMHhmZmZmZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgT01YX1UzMjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMzIgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MzJfdCBPTVhfVTMyOwogCiAvKiBPTVhfUzMyICovCi0jaWYgSU5UX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIHNpZ25lZCBpbnQgT01YX1MzMjsKLSNlbGlmIExPTkdfTUFYID09IDB4N2ZmZmZmZmYKLXR5cGVkZWYgbG9uZyBzaWduZWQgaW50IE9NWF9TMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfUzMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwogCiAvKiBPTVhfVTY0ICYgT01YX1M2NCAqLwogI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQpAQCAtMTQzLDE1ICsxMDIsMTQgQEAKICAgICAjZGVmaW5lIE9NWF9NQVhfUzY0CQkJKDB4N0ZGRkZGRkZGRkZGRkZGRmk2NCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRmk2NCkKICNlbHNlCi0gICAgdHlwZWRlZiBsb25nIGxvbmcgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgaW50NjRfdCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KICAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKICAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQogI2VuZGlmCiAKLQogLyogT01YX1NDOCAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MuUwppbmRleCAwNzNkYmJhLi5iY2M2YjZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCkBAIC0xMCw2ICsxMCwyMiBAQAogICAgIC5mcHUgbmVvbgogICAgIC50ZXh0CiAKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5leHRlcm4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlcworICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCiAgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgogYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXI6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwppbmRleCA0NGViNDI4Li41YmM3ODc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKQEAgLTIwLDYgKzIwLDE0IEBACiAgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKICAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeFUxNgogCisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4CisgICAgLmhpZGRlbiBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAuaGlkZGVuIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorCiBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NDoKICAgICAuYnl0ZSAgMCwgMiwgMCwgMgogICAgIC5ieXRlICAyLCAxLCAyLCAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvb214dHlwZXMuaAppbmRleCA4YjI5NWE2Li45MTJjYjBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNkZWZpbmUgX09NWFRZUEVTX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4gCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNkZWZpbmUgT01YX0lOCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTc1LDY0ICs3NiwyMiBAQAogCiAgCiAvKiBPTVhfVTggKi8KLSNpZiBVQ0hBUl9NQVggPT0gMHhmZgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKLSNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1U4IHVuZGVmaW5lZAotI2VuZGlmIAotCit0eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwogIAogLyogT01YX1M4ICovCi0jaWYgU0NIQVJfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKLSNlbGlmIFNIUlRfTUFYID09IDB4N2YgCi10eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1M4OyAKLSNlbHNlCi0jZXJyb3IgT01YX1M4IHVuZGVmaW5lZAotI2VuZGlmCi0gCit0eXBlZGVmIGludDhfdCBPTVhfUzg7CiAgCiAvKiBPTVhfVTE2ICovCi0jaWYgVVNIUlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1UxNjsKLSNlbGlmIFVJTlRfTUFYID09IDB4ZmZmZgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgT01YX1UxNjsgCi0jZWxzZQotI2Vycm9yIE9NWF9VMTYgdW5kZWZpbmVkCi0jZW5kaWYKLQordHlwZWRlZiB1aW50MTZfdCBPTVhfVTE2OwogCiAvKiBPTVhfUzE2ICovCi0jaWYgU0hSVF9NQVggPT0gMHg3ZmZmIAotdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IE9NWF9TMTY7Ci0jZWxpZiBJTlRfTUFYID09IDB4N2ZmZiAKLXR5cGVkZWYgc2lnbmVkIGludCBPTVhfUzE2OyAKLSNlbHNlCi0jZXJyb3IgT01YX1MxNiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDE2X3QgT01YX1MxNjsKIAogLyogT01YX1UzMiAqLwotI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKLXR5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAotI2Vsc2UKLSNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAotI2VuZGlmCi0KK3R5cGVkZWYgdWludDMyX3QgT01YX1UzMjsKIAogLyogT01YX1MzMiAqLwotI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgotdHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7Ci0jZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCi10eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKLSNlbHNlCi0jZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKLSNlbmRpZgotCit0eXBlZGVmIGludDMyX3QgT01YX1MzMjsKIAogLyogT01YX1U2NCAmIE9NWF9TNjQgKi8KICNpZiBkZWZpbmVkKCBfV0lOMzIgKSB8fCBkZWZpbmVkICggX1dJTjY0ICkKQEAgLTE0MywxNSArMTAyLDE0IEBACiAgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCiAjZWxzZQotICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KLSAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLworICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCiAgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKICAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQogICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCiAgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKICNlbmRpZgogCi0KIC8qIE9NWF9TQzggKi8KIHR5cGVkZWYgc3RydWN0CiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwppbmRleCBhNmYzOWRjLi4yYzE1MmViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvSDI2NFN3RGVjQXBpLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICNpbmNsdWRlICJoMjY0YnNkX2RlY29kZXIuaCIKICNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVmVyc2lvbiBJbmZvcm1hdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTc1LDYgKzc3LDcgQEAKICNlbmRpZgogCiB2b2lkIEgyNjRTd0RlY1RyYWNlKGNoYXIgKnN0cmluZykgeworICAgIFVOVVNFRChzdHJpbmcpOwogfQogCiB2b2lkKiBIMjY0U3dEZWNNYWxsb2ModTMyIHNpemUsIHUzMiBudW0pIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCmluZGV4IDQ5M2ZiOWUuLjdhMjYyZWQgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgaTMyIGZpcnN0UGhhc2VbMTZdOwogICAgIGkzMiAqcFRtcDsKICAgICAvKiBuZWlnaGJvdXJzIGFib3ZlLCBiZWxvdywgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBpMzIgYVs0XSwgYls0XSwgbFs0XSwgcls0XTsKKyAgICBpMzIgYVs0XSA9IHsgMCwwLDAsMCB9LCBiWzRdLCBsWzRdID0geyAwLDAsMCwwIH0sIHJbNF07CiAgICAgdTMyIEEsIEIsIEwsIFI7CiAjaWZkZWYgSDI2NERFQ19PTVhETAogICAgIHU4IGZpbGxCdWZmWzMyKjIxICsgMTUgKyAzMl07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYwppbmRleCAxNWVhYmZiLi41MmM4NWU1IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIC8qIFZhcmlhYmxlcyAqLwogCi0gICAgdTMyIGksIGo7CisgICAgaTMyIGksIGo7CiAgICAgaTMyIGEsIGIsIGM7CiAgICAgaTMyIHRtcDsKIApAQCAtMTEyMywyMCArMTEyMywyMCBAQAogICAgIGEgPSAxNiAqIChhYm92ZVsxNV0gKyBsZWZ0WzE1XSk7CiAKICAgICBmb3IgKGkgPSAwLCBiID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgYiArPSAoKGkzMilpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOworICAgICAgICBiICs9IChpICsgMSkgKiAoYWJvdmVbOCtpXSAtIGFib3ZlWzYtaV0pOwogICAgIGIgPSAoNSAqIGIgKyAzMikgPj4gNjsKIAogICAgIGZvciAoaSA9IDAsIGMgPSAwOyBpIDwgNzsgaSsrKQotICAgICAgICBjICs9ICgoaTMyKWkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOworICAgICAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gbGVmdFs2LWldKTsKICAgICAvKiBwWy0xLC0xXSBoYXMgdG8gYmUgYWNjZXNzZWQgdGhyb3VnaCBhYm92ZSBwb2ludGVyICovCi0gICAgYyArPSAoKGkzMilpICsgMSkgKiAobGVmdFs4K2ldIC0gYWJvdmVbLTFdKTsKKyAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gYWJvdmVbLTFdKTsKICAgICBjID0gKDUgKiBjICsgMzIpID4+IDY7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKICAgICB7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQogICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSAoYSArIGIgKiAoKGkzMilqIC0gNykgKyBjICogKChpMzIpaSAtIDcpICsgMTYpID4+IDU7CisgICAgICAgICAgICB0bXAgPSAoYSArIGIgKiAoaiAtIDcpICsgYyAqIChpIC0gNykgKyAxNikgPj4gNTsKICAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3JlY29uc3RydWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwppbmRleCBjOTQ4Nzc2Li5iNDA5YTA2IDEwMDc1NQotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYwpAQCAtNDIsNiArNDIsOCBAQAogI2luY2x1ZGUgImFybVZDLmgiCiAjZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwogCisjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxMzYsNyArMjEzOCw4IEBACiAgIGkzMiBjZW50ZXIsCiAgIGkzMiByaWdodCkKIHsKLQorICAgIFVOVVNFRChsZWZ0KTsKKyAgICBVTlVTRUQocmlnaHQpOwogICAgIEFTU0VSVChyZWYpOwogICAgIEFTU0VSVChmaWxsKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCmluZGV4IGE3YzZmNjQuLjIzNDAxYzYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCiAjaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKIAorI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDA3LDYgKzE0MDksNyBAQAogICAgIHUzMiB0bXAsIHZhbHVlLCBpOwogICAgIGkzMiBpdmFsdWU7CiAgICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKKyAgICBVTlVTRUQobmFsVW5pdFR5cGUpOwogCiAvKiBDb2RlICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCmluZGV4IGNjODM4ZmQuLmZiOTdhMjggMTAwNzU1Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwogCiAgICAgaWYgKCAoYml0cyA+IDgpIHx8Ci0gICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDEgPDwgKGJpdHMtMSkpKSApCisgICAgICAgICAoKGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk+PigzMi1iaXRzKSkgIT0gKDF1bCA8PCAoYml0cy0xKSkpICkKICAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKaW5kZXggNDBkZmE5Yi4uOWYwZWI3ZCAxMDA3NTUKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3V0aWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNlbmRpZgogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAiYmFzZXR5cGUuaCIKICNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgogI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKQEAgLTE1MCw3ICsxNTEsNyBAQAogfQogCiAjZGVmaW5lIEFMSUdOKHB0ciwgYnl0ZVBvcykgXAotICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAoaW50KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQorICAgICAgICAocHRyICsgKCAoKGJ5dGVQb3MgLSAodWludHB0cl90KXB0cikgJiAoYnl0ZVBvcyAtIDEpKSAvIHNpemVvZigqcHRyKSApKQogCiBleHRlcm4gY29uc3QgdTMyIGgyNjRic2RRcENbNTJdOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjViMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzljNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBTb2Z0T3B1cy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgIGV4dGVybmFsL2xpYm9wdXMvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJvcHVzIGxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlidXRpbHMgbGlibG9nCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X29wdXNkZWMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQxNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMCwwICsxLDU2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU29mdE9wdXMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTb2Z0T3B1cy5oIgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgeworICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOworfQorCitTb2Z0T3B1czo6U29mdE9wdXMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCisgICAgICBtRGVjb2RlcihOVUxMKSwKKyAgICAgIG1IZWFkZXIoTlVMTCksCisgICAgICBtQ29kZWNEZWxheSgwKSwKKyAgICAgIG1TZWVrUHJlUm9sbCgwKSwKKyAgICAgIG1BbmNob3JUaW1lVXMoMCksCisgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAorICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CisgICAgaW5pdFBvcnRzKCk7CisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworU29mdE9wdXM6On5Tb2Z0T3B1cygpIHsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1IZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUhlYWRlcjsKKyAgICAgICAgbUhlYWRlciA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIFNvZnRPcHVzOjppbml0UG9ydHMoKSB7CisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKworICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKKyAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gOTYwICogNjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPQorICAgICAgICAoT01YX0FVRElPX0NPRElOR1RZUEUpT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSAxOworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBzaXplb2YoaW50MTZfdCkgKiBrTWF4Q2hhbm5lbHM7CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOworICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nUENNOworCisgICAgYWRkUG9ydChkZWYpOworfQorCitzdGF0dXNfdCBTb2Z0T3B1czo6aW5pdERlY29kZXIoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitPTVhfRVJST1JUWVBFIFNvZnRPcHVzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFICpvcHVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKG9wdXNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9wdXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7CisgICAgICAgICAgICBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkJpdFJhdGUgPSAwOworCisgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKnBjbVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGNtUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CisgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBrUmF0ZTsKKworICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0T3B1czo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgc3dpdGNoICgoaW50KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocm9sZVBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RybmNtcCgoY29uc3QgY2hhciAqKXJvbGVQYXJhbXMtPmNSb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIub3B1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1czoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgKm9wdXNQYXJhbXMgPQorICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ob3B1c1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworYm9vbCBTb2Z0T3B1czo6aXNDb25maWd1cmVkKCkgY29uc3QgeworICAgIHJldHVybiBtSW5wdXRCdWZmZXJDb3VudCA+PSAxOworfQorCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIGlmIChyZWFkX29mZnNldCArIDEgPiBkYXRhX3NpemUpCisgICAgICAgIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorc3RhdGljIGNvbnN0IGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0geyAwLCAxIH07CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitzdGF0aWMgYm9vbCBQYXJzZU9wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICAvLyBTaXplIG9mIHRoZSBPcHVzIGhlYWRlciBleGNsdWRpbmcgb3B0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CisKKyAgICAvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKworICAgIC8vIE9mZnNldCB0byB0aGUgZ2FpbiB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyR2Fpbk9mZnNldCA9IDE2OworCisgICAgLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIG1hcHBpbmcgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgPSAxODsKKworICAgIC8vIE9wdXMgSGVhZGVyIGNvbnRhaW5zIGEgc3RyZWFtIG1hcC4gVGhlIG1hcHBpbmcgdmFsdWVzIGFyZSBpbiB0aGUgaGVhZGVyCisgICAgLy8gYmV5b25kIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZworICAgIC8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKyAgICAvLyB2YWx1ZXM6CisgICAgLy8gICAtIEJ5dGUgMDogTnVtYmVyIG9mIHN0cmVhbXMuCisgICAgLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisgICAgLy8gICAtIEJ5dGUgMjogU3RhcnRpbmcgYXQgYnl0ZSAyIGFyZSB8aGVhZGVyLT5jaGFubmVsc3wgdWludDggbWFwcGluZworICAgIC8vICAgICAgICAgICAgIHZhbHVlcy4KKyAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0ga09wdXNIZWFkZXJTaXplOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQgPSBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgKyAxOworICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCArIDI7CisKKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9ICooZGF0YSArIGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQpOworCisgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPD0gMCB8fCBoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgd3JvbmcgY2hhbm5lbCBjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPnNraXBfc2FtcGxlcyA9IFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gKihkYXRhICsga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCk7CisgICAgaWYgKCFoZWFkZXItPmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIG1pc3Npbmcgc3RyZWFtIG1hcC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gMTsKKyAgICAgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGhlYWRlci0+Y2hhbm5lbHMgPiAxOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMF0gPSAwOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMV0gPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBzdHJlYW0gbWFwOyBpbnN1ZmZpY2llbnQgZGF0YSBmb3IgY3VycmVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgImNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQpOworICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSAqKGRhdGEgKyBrT3B1c0hlYWRlck51bUNvdXBsZWRPZmZzZXQpOworICAgIGlmIChoZWFkZXItPm51bV9zdHJlYW1zICsgaGVhZGVyLT5udW1fY291cGxlZCAhPSBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgY2hhbm5lbCBtYXBwaW5nLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLT5jaGFubmVsczsgKytpKQorICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gKihkYXRhICsga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBuYW5vc2Vjb25kcyB0byBudW1iZXIgb2Ygc2FtcGxlcy4KK3N0YXRpYyB1aW50NjRfdCBuc190b19zYW1wbGVzKHVpbnQ2NF90IG5zLCBpbnQga1JhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiBrUmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKworICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0gMCAmJiBtSW5wdXRCdWZmZXJDb3VudCA8IDMpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBpbmZvLT5tSGVhZGVyOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBoZWFkZXItPnBCdWZmZXIgKyBoZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplID0gaGVhZGVyLT5uRmlsbGVkTGVuOworCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOworICAgICAgICAgICAgbUhlYWRlciA9IG5ldyBPcHVzSGVhZGVyKCk7CisgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJzaW5nIE9wdXMgSGVhZGVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OworICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+bnVtX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFtRGVjb2RlciB8fCBzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXM9JXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci0+Z2Fpbl9kYikpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPihoZWFkZXItPnBCdWZmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5PZmZzZXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaGVhZGVyLT5wQnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bk9mZnNldCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgaW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaGVhZGVyKTsKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOworCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKworICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hlbiBzZWVraW5nIHRvIHplcm8sIHxtQ29kZWNEZWxheXwgc2FtcGxlcyBoYXMgdG8gYmUgZGlzY2FyZGVkCisgICAgICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgICAgICAvLyBvdGhlciB0aW1lc3RhbXApLgorICAgICAgICBpZiAoaW5IZWFkZXItPm5UaW1lU3RhbXAgPT0gMCkgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OworICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzOworICAgICAgICBpZiAoZnJhbWVTaXplID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCkgLyBtSGVhZGVyLT5jaGFubmVscykgeworICAgICAgICAgICAgZnJhbWVTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLyBzaXplb2YoaW50MTZfdCkgLyBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBudW1GcmFtZXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZShtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilvdXRIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZSByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOworICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiBudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC09IG1TYW1wbGVzVG9EaXNjYXJkOworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLT5jaGFubmVsczsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOworCisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1BbmNob3JUaW1lVXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZTsKKworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKKworICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SW5mbyA9IE5VTEw7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICB9Cit9CisKK3ZvaWQgU29mdE9wdXM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSAwICYmIG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCisgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbUFuY2hvclRpbWVVcyA9IDA7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgIH0KK30KKwordm9pZCBTb2Z0T3B1czo6b25SZXNldCgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChtSGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1IZWFkZXI7CisgICAgICAgIG1IZWFkZXIgPSBOVUxMOworICAgIH0KKworICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworfQorCit2b2lkIFNvZnRPcHVzOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgeworICAgIGlmIChwb3J0SW5kZXggIT0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2FuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6U29mdE9wdXMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y2NTYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIFNPRlRfT1BVU19IXworCisjZGVmaW5lIFNPRlRfT1BVU19IXworCisjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgorCitzdHJ1Y3QgT3B1c01TRGVjb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgIGludCBjaGFubmVsczsKKyAgaW50IHNraXBfc2FtcGxlczsKKyAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgaW50IG51bV9zdHJlYW1zOworICBpbnQgbnVtX2NvdXBsZWQ7CisgIGludDE2X3QgZ2Fpbl9kYjsKKyAgdWludDhfdCBzdHJlYW1fbWFwWzhdOworfTsKKworc3RydWN0IFNvZnRPcHVzIDogcHVibGljIFNpbXBsZVNvZnRPTVhDb21wb25lbnQgeworICAgIFNvZnRPcHVzKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Tb2Z0T3B1cygpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtQnVmZmVycyA9IDQsCisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyID0gOTYwICogNgorICAgIH07CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyICptSGVhZGVyOworCisgICAgaW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOworICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRPcHVzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9PUFVTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQubWsKaW5kZXggZmU5MGEwMy4uODcwODBlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5tawpAQCAtOCw2ICs4LDggQEAKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKICAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9vbXggbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJ1dGlscyBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKaW5kZXggNWMxZmFkYi4uNGY3YWU5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU29mdFJhdzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewordm9pZCBTb2Z0UmF3OjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7CiAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQubWsKaW5kZXggMjIzMjM1My4uMjE3YTZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLm1rCkBAIC0xNiw0ICsxNiw2IEBACiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggZWMzZDk3Mi4uNWY0ZTM0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTU0LDYgKzU0LDggQEAKICAgICAgIG1BbmNob3JUaW1lVXMoMCksCiAgICAgICBtTnVtRnJhbWVzT3V0cHV0KDApLAogICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UoLTEpLAorICAgICAgbVNhd0lucHV0RW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MoZmFsc2UpLAogICAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZShOT05FKSB7CiAgICAgaW5pdFBvcnRzKCk7CiAgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKQEAgLTMxMiw0OCArMzE0LDQ3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IChtU2F3SW5wdXRFb3MgJiYgIW1TaWduYWxsZWRPdXRwdXRFb3MpKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSBOVUxMOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBOVUxMOworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzID0gMDsKIAotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBpZiAoaW5IZWFkZXIpIHsKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgbVNhd0lucHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuIHx8ICFtU2F3SW5wdXRFb3MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpbkhlYWRlci0+bkZpbGxlZExlbiwgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPnBCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW5IZWFkZXItPm5PZmZzZXQgKyBpbkhlYWRlci0+bkZpbGxlZExlbiAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOworCisgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgIENIRUNLX0dFKGluSGVhZGVyLT5uRmlsbGVkTGVuLCBzaXplb2YobnVtUGFnZVNhbXBsZXMpKTsKLSAgICAgICAgbWVtY3B5KCZudW1QYWdlU2FtcGxlcywKLSAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyCi0gICAgICAgICAgICAgICAgKyBpbkhlYWRlci0+bk9mZnNldCArIGluSGVhZGVyLT5uRmlsbGVkTGVuIC0gNCwKLSAgICAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwotCiAgICAgICAgIGlmIChudW1QYWdlU2FtcGxlcyA+PSAwKSB7CiAgICAgICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VTYW1wbGVzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluSGVhZGVyLT5uT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4gLT0gc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKTs7Ci0KICAgICAgICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgICAgIGJ1Zi5kYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgYnVmLnNpemUgPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgYnVmLmRhdGEgPSBpbkhlYWRlciA/IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQgOiBOVUxMOworICAgICAgICBidWYuc2l6ZSA9IGluSGVhZGVyID8gaW5IZWFkZXItPm5GaWxsZWRMZW4gOiAwOwogICAgICAgICBidWYucmVmY291bnQgPSAxOwogICAgICAgICBidWYucHRyLm93bmVyID0gTlVMTDsKIApAQCAtMzczLDkgKzM3NCwxNSBAQAogCiAgICAgICAgIGludCBudW1GcmFtZXMgPSAwOwogCisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgaW50IGVyciA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOwogICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBsb2cgc3BhbQorI2lmICFkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgICAgICAgQUxPR1YoInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkIiwgZXJyKTsKKyNlbHNlCiAgICAgICAgICAgICBBTE9HVygidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOworI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlc1BlckJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyOwogICAgICAgICAgICAgaWYgKG51bVNhbXBsZXNQZXJCdWZmZXIgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSkgewpAQCAtMzk3LDEzICs0MDQsMTYgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiZGlzY2FyZGluZyAlZCBmcmFtZXMgYXQgZW5kIG9mIHBhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOwogICAgICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICAgICAgICAgIGlmIChtU2F3SW5wdXRFb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKICAgICAgICAgfQogCiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1WaS0+Y2hhbm5lbHM7CiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7Ci0gICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwpAQCAtNDExLDExICs0MjEsMTMgQEAKIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKIAotICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbkluZm8gPSBOVUxMOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICBpbkhlYWRlciA9IE5VTEw7CisgICAgICAgIGlmIChpbkhlYWRlcikgeworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKKyAgICAgICAgICAgIGluSGVhZGVyID0gTlVMTDsKKyAgICAgICAgfQogCiAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CkBAIC00NTIsNiArNDY0LDggQEAKICAgICAgICAgbVZpID0gTlVMTDsKICAgICB9CiAKKyAgICBtU2F3SW5wdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuaAppbmRleCBjYjYyOGEwLi4xZDAwODE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5oCkBAIC01OSw2ICs1OSw4IEBACiAgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOwogICAgIGludDY0X3QgbU51bUZyYW1lc091dHB1dDsKICAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNhd0lucHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKIAogICAgIGVudW0gewogICAgICAgICBOT05FLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDk5MGQ1NTQuLmY5MDY3NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KQEAgLTMzLDM0ICszMyw3MSBAQAogICAgIHJldHVybiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHByb3AsIE5VTEwpID4gMCk7CiB9CiAKLVNvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKLSAgICA6IG1Db252ZXJ0ZXIoTlVMTCksCitzdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgeworICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7Cit9CisKK1NvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykKKyAgICA6IG1Db2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0VW51c2VkKSwKKyAgICAgIG1Db252ZXJ0ZXIoTlVMTCksCiAgICAgICBtWVVWTW9kZShOb25lKSwKLSAgICAgIG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KSB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJnRtcCkpOwotICAgIG1Db2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSl0bXA7CisgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApLAorICAgICAgbUNyb3BMZWZ0KDApLAorICAgICAgbUNyb3BUb3AoMCksCisgICAgICBtQ3JvcFJpZ2h0KDApLAorICAgICAgbUNyb3BCb3R0b20oMCksCisgICAgICBtQ3JvcFdpZHRoKDApLAorICAgICAgbUNyb3BIZWlnaHQoMCkgeworfQogCi0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOworU29mdHdhcmVSZW5kZXJlcjo6flNvZnR3YXJlUmVuZGVyZXIoKSB7CisgICAgZGVsZXRlIG1Db252ZXJ0ZXI7CisgICAgbUNvbnZlcnRlciA9IE5VTEw7Cit9CiAKLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwKLSAgICAgICAgICAgICAgICAmbUNyb3BMZWZ0LCAmbUNyb3BUb3AsICZtQ3JvcFJpZ2h0LCAmbUNyb3BCb3R0b20pKSB7Ci0gICAgICAgIG1Dcm9wTGVmdCA9IG1Dcm9wVG9wID0gMDsKLSAgICAgICAgbUNyb3BSaWdodCA9IG1XaWR0aCAtIDE7Ci0gICAgICAgIG1Dcm9wQm90dG9tID0gbUhlaWdodCAtIDE7Cit2b2lkIFNvZnR3YXJlUmVuZGVyZXI6OnJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQ0hFQ0soZm9ybWF0ICE9IE5VTEwpOworCisgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKKyAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CisKKyAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisKKyAgICBpbnQzMl90IGNyb3BMZWZ0TmV3LCBjcm9wVG9wTmV3LCBjcm9wUmlnaHROZXcsIGNyb3BCb3R0b21OZXc7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRSZWN0KAorICAgICAgICAgICAgImNyb3AiLCAmY3JvcExlZnROZXcsICZjcm9wVG9wTmV3LCAmY3JvcFJpZ2h0TmV3LCAmY3JvcEJvdHRvbU5ldykpIHsKKyAgICAgICAgY3JvcExlZnROZXcgPSBjcm9wVG9wTmV3ID0gMDsKKyAgICAgICAgY3JvcFJpZ2h0TmV3ID0gd2lkdGhOZXcgLSAxOworICAgICAgICBjcm9wQm90dG9tTmV3ID0gaGVpZ2h0TmV3IC0gMTsKICAgICB9CiAKKyAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvbG9yRm9ybWF0KSA9PSBjb2xvckZvcm1hdE5ldyAmJgorICAgICAgICBtV2lkdGggPT0gd2lkdGhOZXcgJiYKKyAgICAgICAgbUhlaWdodCA9PSBoZWlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BMZWZ0ID09IGNyb3BMZWZ0TmV3ICYmCisgICAgICAgIG1Dcm9wVG9wID09IGNyb3BUb3BOZXcgJiYKKyAgICAgICAgbUNyb3BSaWdodCA9PSBjcm9wUmlnaHROZXcgJiYKKyAgICAgICAgbUNyb3BCb3R0b20gPT0gY3JvcEJvdHRvbU5ldykgeworICAgICAgICAvLyBOb3RoaW5nIGNoYW5nZWQsIG5vIG5lZWQgdG8gcmVzZXQgcmVuZGVyZXIuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOworICAgIG1XaWR0aCA9IHdpZHRoTmV3OworICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbUNyb3BMZWZ0ID0gY3JvcExlZnROZXc7CisgICAgbUNyb3BUb3AgPSBjcm9wVG9wTmV3OworICAgIG1Dcm9wUmlnaHQgPSBjcm9wUmlnaHROZXc7CisgICAgbUNyb3BCb3R0b20gPSBjcm9wQm90dG9tTmV3OworCiAgICAgbUNyb3BXaWR0aCA9IG1Dcm9wUmlnaHQgLSBtQ3JvcExlZnQgKyAxOwogICAgIG1Dcm9wSGVpZ2h0ID0gbUNyb3BCb3R0b20gLSBtQ3JvcFRvcCArIDE7CiAKLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCiAgICAgaW50IGhhbEZvcm1hdDsKICAgICBzaXplX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKIApAQCAtMTA2LDEyICsxNDMsMjkgQEAKICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVykpOwogCiAgICAgLy8gV2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiAzMj8/PwotICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgYnVmV2lkdGgsCi0gICAgICAgICAgICAgICAgYnVmSGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCkpOworICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CiAKKyAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKKyAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKKyAgICBjcm9wLmxlZnQgPSBtQ3JvcExlZnQ7CisgICAgY3JvcC50b3AgPSBtQ3JvcFRvcDsKKyAgICBjcm9wLnJpZ2h0ID0gbUNyb3BSaWdodCArIDE7CisgICAgY3JvcC5ib3R0b20gPSBtQ3JvcEJvdHRvbSArIDE7CisgICAgQUxPR1YoInNldHRpbmcgY3JvcDogWyVkLCAlZCwgJWQsICVkXSBmb3Igc2l6ZSBbJXp1LCAlenVdIiwKKyAgICAgICAgICBjcm9wLmxlZnQsIGNyb3AudG9wLCBjcm9wLnJpZ2h0LCBjcm9wLmJvdHRvbSwgYnVmV2lkdGgsIGJ1ZkhlaWdodCk7CisKKyAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZjcm9wKSk7CisKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJyb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uRGVncmVlcykpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKKyAgICB9CiAgICAgdWludDMyX3QgdHJhbnNmb3JtOwogICAgIHN3aXRjaCAocm90YXRpb25EZWdyZWVzKSB7CiAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7CkBAIC0xMjEsMjQgKzE3NSwxNSBAQAogICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKICAgICB9CiAKLSAgICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKAotICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pKTsKLSAgICB9Ci19Ci0KLVNvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgewotICAgIGRlbGV0ZSBtQ29udmVydGVyOwotICAgIG1Db252ZXJ0ZXIgPSBOVUxMOwotfQotCi1zdGF0aWMgaW50IEFMSUdOKGludCB4LCBpbnQgeSkgewotICAgIC8vIHkgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0gICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7CisgICAgQ0hFQ0tfRVEoMCwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKSk7CiB9CiAKIHZvaWQgU29mdHdhcmVSZW5kZXJlcjo6cmVuZGVyKAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqcGxhdGZvcm1Qcml2YXRlKSB7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zLAorICAgICAgICB2b2lkKiAvKnBsYXRmb3JtUHJpdmF0ZSovLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgeworICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCk7CisKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWY7CiAgICAgaW50IGVycjsKICAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwKQEAgLTIzNyw2ICsyODIsMTEgQEAKIHNraXBfY29weWluZzoKICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CiAKKyAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICB0aW1lc3RhbXBOcykpICE9IDApIHsKKyAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgfQorCiAgICAgaWYgKChlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBidWYsCiAgICAgICAgICAgICAtMSkpICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTkwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCkBAIC0wLDAgKzEsOTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC0zMjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5nNzExLm1sYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjQwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgdHlwZT0iYXVkaW8vdm9yYmlzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCw5NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtOTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0RlY29kZXJzPgorICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiZWYzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV92aWRlby54bWwKQEAgLTAsMCArMSwxMDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CisgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS05ODMwNDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTEzOTI2NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKworICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTI4MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iODk2eDg5NiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTExODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xNDg1IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAKaW5kZXggNTQ5OWMzMi4uYmViNWNjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAgICAgICBtTnVtQml0c0xlZnQoMCkgewogfQogCitBQml0UmVhZGVyOjp+QUJpdFJlYWRlcigpIHsKK30KKwogdm9pZCBBQml0UmVhZGVyOjpmaWxsUmVzZXJ2b2lyKCkgewogICAgIENIRUNLX0dUKG1TaXplLCAwdSk7CiAKQEAgLTk5LDQgKzEwMiw2OSBAQAogICAgIHJldHVybiBtRGF0YSAtIChtTnVtQml0c0xlZnQgKyA3KSAvIDg7CiB9CiAKK05BTEJpdFJlYWRlcjo6TkFMQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogQUJpdFJlYWRlcihkYXRhLCBzaXplKSwKKyAgICAgIG1OdW1aZXJvcygwKSB7Cit9CisKK2Jvb2wgTkFMQml0UmVhZGVyOjphdExlYXN0TnVtQml0c0xlZnQoc2l6ZV90IG4pIGNvbnN0IHsKKyAgICAvLyBjaGVjayBhZ2FpbnN0IHJhdyBzaXplIGFuZCByZXNlcnZvaXIgYml0cyBmaXJzdAorICAgIHNpemVfdCBudW1CaXRzID0gbnVtQml0c0xlZnQoKTsKKyAgICBpZiAobiA+IG51bUJpdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgbnVtQml0c1JlbWFpbmluZyA9IG4gLSBtTnVtQml0c0xlZnQ7CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1TaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtRGF0YTsKKyAgICBpbnQzMl90IG51bVplcm9zID0gbU51bVplcm9zOworICAgIHdoaWxlIChzaXplID4gMCAmJiBudW1CaXRzUmVtYWluaW5nID4gMCkgeworICAgICAgICBib29sIGlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUgPSAobnVtWmVyb3MgPj0gMiAmJiAqZGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKmRhdGEgPT0gMCkgeworICAgICAgICAgICAgKytudW1aZXJvczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNFbXVsYXRpb25QcmV2ZW50aW9uQnl0ZSkgeworICAgICAgICAgICAgbnVtQml0c1JlbWFpbmluZyAtPSA4OworICAgICAgICB9CisKKyAgICAgICAgKytkYXRhOworICAgICAgICAtLXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIChudW1CaXRzUmVtYWluaW5nIDw9IDApOworfQorCit2b2lkIE5BTEJpdFJlYWRlcjo6ZmlsbFJlc2Vydm9pcigpIHsKKyAgICBDSEVDS19HVChtU2l6ZSwgMHUpOworCisgICAgbVJlc2Vydm9pciA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChtU2l6ZSA+IDAgJiYgaSA8IDQpIHsKKyAgICAgICAgYm9vbCBpc0VtdWxhdGlvblByZXZlbnRpb25CeXRlID0gKG1OdW1aZXJvcyA+PSAyICYmICptRGF0YSA9PSAzKTsKKworICAgICAgICBpZiAoKm1EYXRhID09IDApIHsKKyAgICAgICAgICAgICsrbU51bVplcm9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU51bVplcm9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorICAgICAgICBpZiAoIWlzRW11bGF0aW9uUHJldmVudGlvbkJ5dGUpIHsKKyAgICAgICAgICAgIG1SZXNlcnZvaXIgPSAobVJlc2Vydm9pciA8PCA4KSB8ICptRGF0YTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgICsrbURhdGE7CisgICAgICAgIC0tbVNpemU7CisgICAgfQorCisgICAgbU51bUJpdHNMZWZ0ID0gOCAqIGk7CisgICAgbVJlc2Vydm9pciA8PD0gMzIgLSBtTnVtQml0c0xlZnQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcAppbmRleCA1ZjVjOTc3Li40OTEzZmQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKQEAgLTE5LDExICsxOSwxMyBAQAogI2luY2x1ZGUgIkFEZWJ1Zy5oIgogI2luY2x1ZGUgIkFMb29wZXIuaCIKICNpbmNsdWRlICJBTWVzc2FnZS5oIgorI2luY2x1ZGUgIk1lZGlhQnVmZmVyQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFCdWZmZXI6OkFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQotICAgIDogbVJhbmdlT2Zmc2V0KDApLAorICAgIDogbU1lZGlhQnVmZmVyQmFzZShOVUxMKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1JbnQzMkRhdGEoMCksCiAgICAgICBtT3duc0RhdGEodHJ1ZSkgewogICAgIG1EYXRhID0gbWFsbG9jKGNhcGFjaXR5KTsKQEAgLTM3LDcgKzM5LDggQEAKIH0KIAogQUJ1ZmZlcjo6QUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtRGF0YShkYXRhKSwKKyAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCisgICAgICBtRGF0YShkYXRhKSwKICAgICAgIG1DYXBhY2l0eShjYXBhY2l0eSksCiAgICAgICBtUmFuZ2VPZmZzZXQoMCksCiAgICAgICBtUmFuZ2VMZW5ndGgoY2FwYWNpdHkpLApAQCAtNDUsNiArNDgsMTQgQEAKICAgICAgIG1Pd25zRGF0YShmYWxzZSkgewogfQogCisvLyBzdGF0aWMKK3NwPEFCdWZmZXI+IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY2FwYWNpdHkpCit7CisgICAgc3A8QUJ1ZmZlcj4gcmVzID0gbmV3IEFCdWZmZXIoY2FwYWNpdHkpOworICAgIG1lbWNweShyZXMtPmRhdGEoKSwgZGF0YSwgY2FwYWNpdHkpOworICAgIHJldHVybiByZXM7Cit9CisKIEFCdWZmZXI6On5BQnVmZmVyKCkgewogICAgIGlmIChtT3duc0RhdGEpIHsKICAgICAgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKQEAgLTU2LDYgKzY3LDggQEAKICAgICBpZiAobUZhcmV3ZWxsICE9IE5VTEwpIHsKICAgICAgICAgbUZhcmV3ZWxsLT5wb3N0KCk7CiAgICAgfQorCisgICAgc2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogfQogCiB2b2lkIEFCdWZmZXI6OnNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CkBAIC03Nyw1ICs5MCwxOSBAQAogICAgIHJldHVybiBtTWV0YTsKIH0KIAorTWVkaWFCdWZmZXJCYXNlICpBQnVmZmVyOjpnZXRNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5hZGRfcmVmKCk7CisgICAgfQorICAgIHJldHVybiBtTWVkaWFCdWZmZXJCYXNlOworfQorCit2b2lkIEFCdWZmZXI6OnNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKSB7CisgICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5yZWxlYXNlKCk7CisgICAgfQorICAgIG1NZWRpYUJ1ZmZlckJhc2UgPSBtZWRpYUJ1ZmZlcjsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKaW5kZXggZjdhMDBkOC4uNWY3YzcwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCkBAIC01MSw3ICs1MSw3IEBACiBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKIH0KIAotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewordm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwogCiAgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAppbmRleCBlYmY5ZDhkLi44OGIxYzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTY4LDE0ICs2OCwxNCBAQAogCiBBTG9vcGVyOjpBTG9vcGVyKCkKICAgICA6IG1SdW5uaW5nTG9jYWxseShmYWxzZSkgeworICAgIC8vIGNsZWFuIHVwIHN0YWxlIEFIYW5kbGVycy4gRG9pbmcgaXQgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBkZXN0cnVjdG9yIGF2b2lkcworICAgIC8vIHRoZSBzaWRlIGVmZmVjdCBvZiBvYmplY3RzIGJlaW5nIGRlbGV0ZWQgZnJvbSB0aGUgdW5yZWdpc3RlciBmdW5jdGlvbiByZWN1cnNpdmVseS4KKyAgICBnTG9vcGVyUm9zdGVyLnVucmVnaXN0ZXJTdGFsZUhhbmRsZXJzKCk7CiB9CiAKIEFMb29wZXI6On5BTG9vcGVyKCkgewogICAgIHN0b3AoKTsKLQotICAgIC8vIFNpbmNlIHRoaXMgbG9vcGVyIGlzICJkZWFkIiAob3IgYXMgZ29vZCBhcyBkZWFkIGJ5IG5vdyksCi0gICAgLy8gaGF2ZSBBTG9vcGVyUm9zdGVyIHVucmVnaXN0ZXIgYW55IGhhbmRsZXJzIHN0aWxsIHJlZ2lzdGVyZWQgZm9yIGl0LgotICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKTsKKyAgICAvLyBzdGFsZSBBSGFuZGxlcnMgYXJlIG5vdyBjbGVhbmVkIHVwIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbmV4dCBBTG9vcGVyIHRvIGNvbWUgYWxvbmcKIH0KIAogdm9pZCBBTG9vcGVyOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCmluZGV4IDBjMTgxZmYuLmUwZGM3NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcApAQCAtNzIsNTAgKzcyLDQwIEBACiB9CiAKIHZvaWQgQUxvb3BlclJvc3Rlcjo6dW5yZWdpc3RlclN0YWxlSGFuZGxlcnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSBtSGFuZGxlcnMuc2l6ZSgpOyBpLS0gPiAwOykgewotICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworICAgIFZlY3RvcjxzcDxBTG9vcGVyPiA+IGFjdGl2ZUxvb3BlcnM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGluZm8ubUxvb3Blci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgICAgICAgICBjb25zdCBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVucmVnaXN0ZXJpbmcgc3RhbGUgaGFuZGxlciAlZCIsIG1IYW5kbGVycy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgJ2xvb3BlcicgbWlnaHQgYmUgdGhlIG9ubHkgc3A8PiBrZWVwaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIG9iamVjdCBhbGl2ZS4gVG8gcHJldmVudCBpdCBmcm9tIGdvaW5nIG91dCBvZiBzY29wZQorICAgICAgICAgICAgICAgIC8vIGFuZCBoYXZpbmcgfkFMb29wZXIgY2FsbCB0aGlzIG1ldGhvZCBhZ2FpbiByZWN1cnNpdmVseQorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRlYWRsb2NraW5nIGJlY2F1c2Ugb2YgdGhlIEF1dG9sb2NrIGFib3ZlLCBhZGQKKyAgICAgICAgICAgICAgICAvLyBpdCB0byBhIFZlY3RvciB3aGljaCB3aWxsIGdvIG91dCBvZiBzY29wZSBhZnRlciB0aGUgbG9jaworICAgICAgICAgICAgICAgIC8vIGhhcyBiZWVuIHJlbGVhc2VkLgorICAgICAgICAgICAgICAgIGFjdGl2ZUxvb3BlcnMuYWRkKGxvb3Blcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gcG9zdE1lc3NhZ2VfbChtc2csIGRlbGF5VXMpOwotfQogCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0TWVzc2FnZV9sKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZSAnJXMnLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iLAotICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBmaW5kTG9vcGVyKG1zZy0+dGFyZ2V0KCkpOwogCiAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiAiCi0gICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgIG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CiAgICAgfQotCiAgICAgbG9vcGVyLT5wb3N0KG1zZywgZGVsYXlVcyk7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2OSwxOCArMTU5LDIzIEBACiAKIHN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7CisKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgc3RpbGwgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCisgICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7CisgICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgdWludDMyX3QgcmVwbHlJRCA9IG1OZXh0UmVwbHlJRCsrOwogCiAgICAgbXNnLT5zZXRJbnQzMigicmVwbHlJRCIsIHJlcGx5SUQpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gcG9zdE1lc3NhZ2VfbChtc2csIDAgLyogZGVsYXlVcyAqLyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KKyAgICBsb29wZXItPnBvc3QobXNnLCAwIC8qIGRlbGF5VXMgKi8pOwogCiAgICAgc3NpemVfdCBpbmRleDsKICAgICB3aGlsZSAoKGluZGV4ID0gbVJlcGxpZXMuaW5kZXhPZktleShyZXBseUlEKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IDEzMDBmMTYuLjI2YmVhMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0xNCw2ICsxNCwxMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBTWVzc2FnZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBEVU1QX1NUQVRTCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCiAjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC02MCwxMiArNjUsMTQgQEAKIHZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKICAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBkZWxldGVbXSBpdGVtLT5tTmFtZTsKKyAgICAgICAgaXRlbS0+bU5hbWUgPSBOVUxMOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0KICAgICBtTnVtSXRlbXMgPSAwOwogfQogCi12b2lkIEFNZXNzYWdlOjpmcmVlSXRlbShJdGVtICppdGVtKSB7Cit2b2lkIEFNZXNzYWdlOjpmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pIHsKICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6CiAgICAgICAgIHsKQEAgLTg4LDI1ICs5NSw4NSBAQAogICAgIH0KIH0KIAotQU1lc3NhZ2U6Okl0ZW0gKkFNZXNzYWdlOjphbGxvY2F0ZUl0ZW0oY29uc3QgY2hhciAqbmFtZSkgewotICAgIG5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7CisjaWZkZWYgRFVNUF9TVEFUUworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBtTnVtSXRlbXMgJiYgbUl0ZW1zW2ldLm1OYW1lICE9IG5hbWUpIHsKLSAgICAgICAgKytpOworTXV0ZXggZ0xvY2s7CitzdGF0aWMgaW50MzJfdCBnRmluZEl0ZW1DYWxscyA9IDE7CitzdGF0aWMgaW50MzJfdCBnRHVwQ2FsbHMgPSAxOworc3RhdGljIGludDMyX3QgZ0F2ZXJhZ2VOdW1JdGVtcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IDA7CitzdGF0aWMgaW50MzJfdCBnQXZlcmFnZUR1cEl0ZW1zID0gMDsKK3N0YXRpYyBpbnQzMl90IGdMYXN0Q2hlY2tlZCA9IC0xOworCitzdGF0aWMgdm9pZCByZXBvcnRTdGF0cygpIHsKKyAgICBpbnQzMl90IHRpbWUgPSAoQUxvb3Blcjo6R2V0Tm93VXMoKSAvIDEwMDApOworICAgIGlmICh0aW1lIC8gMTAwMCAhPSBnTGFzdENoZWNrZWQgLyAxMDAwKSB7CisgICAgICAgIGdMYXN0Q2hlY2tlZCA9IHRpbWU7CisgICAgICAgIEFMT0dJKCJjYWxsZWQgZmluZEl0ZW1JeCAlenUgdGltZXMgKGZvciBsZW49JS4xZiBpPSUuMWYvJS4xZiBtZW0pIGR1cCAlenUgdGltZXMgKGZvciBsZW49JS4xZikiLAorICAgICAgICAgICAgICAgIGdGaW5kSXRlbUNhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgLyAoZmxvYXQpZ0ZpbmRJdGVtQ2FsbHMsCisgICAgICAgICAgICAgICAgZ0R1cENhbGxzLAorICAgICAgICAgICAgICAgIGdBdmVyYWdlRHVwSXRlbXMgLyAoZmxvYXQpZ0R1cENhbGxzKTsKKyAgICAgICAgZ0ZpbmRJdGVtQ2FsbHMgPSBnRHVwQ2FsbHMgPSAxOworICAgICAgICBnQXZlcmFnZU51bUl0ZW1zID0gZ0F2ZXJhZ2VOdW1DaGVja3MgPSBnQXZlcmFnZU51bU1lbUNoZWNrcyA9IGdBdmVyYWdlRHVwSXRlbXMgPSAwOworICAgICAgICBnTGFzdENoZWNrZWQgPSB0aW1lOwogICAgIH0KK30KKyNlbmRpZgogCitpbmxpbmUgc2l6ZV90IEFNZXNzYWdlOjpmaW5kSXRlbUluZGV4KGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIGNvbnN0IHsKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgc2l6ZV90IG1lbWNoZWNrcyA9IDA7CisjZW5kaWYKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7IGkgPCBtTnVtSXRlbXM7IGkrKykgeworICAgICAgICBpZiAobGVuICE9IG1JdGVtc1tpXS5tTmFtZUxlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgICAgICsrbWVtY2hlY2tzOworI2VuZGlmCisgICAgICAgIGlmICghbWVtY21wKG1JdGVtc1tpXS5tTmFtZSwgbmFtZSwgbGVuKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgRFVNUF9TVEFUUworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgKytnRmluZEl0ZW1DYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIGdBdmVyYWdlTnVtTWVtQ2hlY2tzICs9IG1lbWNoZWNrczsKKyAgICAgICAgZ0F2ZXJhZ2VOdW1DaGVja3MgKz0gaTsKKyAgICAgICAgcmVwb3J0U3RhdHMoKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gaTsKK30KKworLy8gYXNzdW1lcyBpdGVtJ3MgbmFtZSB3YXMgdW5pbml0aWFsaXplZCBvciBOVUxMCit2b2lkIEFNZXNzYWdlOjpJdGVtOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKKyAgICBtTmFtZUxlbmd0aCA9IGxlbjsKKyAgICBtTmFtZSA9IG5ldyBjaGFyW2xlbiArIDFdOworICAgIG1lbWNweSgodm9pZCopbU5hbWUsIG5hbWUsIGxlbiArIDEpOworfQorCitBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgbGVuKTsKICAgICBJdGVtICppdGVtOwogCiAgICAgaWYgKGkgPCBtTnVtSXRlbXMpIHsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgICAgICBmcmVlSXRlbVZhbHVlKGl0ZW0pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1OdW1JdGVtcyA8IGtNYXhOdW1JdGVtcyk7CiAgICAgICAgIGkgPSBtTnVtSXRlbXMrKzsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0KLSAgICAgICAgaXRlbS0+bU5hbWUgPSBuYW1lOworICAgICAgICBpdGVtLT5zZXROYW1lKG5hbWUsIGxlbik7CiAgICAgfQogCiAgICAgcmV0dXJuIGl0ZW07CkBAIC0xMTQsMTkgKzE4MSwyMCBAQAogCiBjb25zdCBBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmZpbmRJdGVtKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBUeXBlIHR5cGUpIGNvbnN0IHsKLSAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOworICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwogCi0gICAgICAgIGlmIChpdGVtLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbS0+bVR5cGUgPT0gdHlwZSA/IGl0ZW0gOiBOVUxMOwotICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK2Jvb2wgQU1lc3NhZ2U6OmNvbnRhaW5zKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0IHsKKyAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICByZXR1cm4gaSA8IG1OdW1JdGVtczsKK30KKwogI2RlZmluZSBCQVNJQ19UWVBFKE5BTUUsRklFTEROQU1FLFRZUEVOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBBTWVzc2FnZTo6c2V0IyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FIHZhbHVlKSB7ICAgICAgICAgICAgXAogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTYwLDYgKzIyOCwxMSBAQAogICAgIGl0ZW0tPnUuc3RyaW5nVmFsdWUgPSBuZXcgQVN0cmluZyhzLCBsZW4gPCAwID8gc3RybGVuKHMpIDogbGVuKTsKIH0KIAordm9pZCBBTWVzc2FnZTo6c2V0U3RyaW5nKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBU3RyaW5nICZzKSB7CisgICAgc2V0U3RyaW5nKG5hbWUsIHMuY19zdHIoKSwgcy5zaXplKCkpOworfQorCiB2b2lkIEFNZXNzYWdlOjpzZXRPYmplY3RJbnRlcm5hbCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaiwgVHlwZSB0eXBlKSB7CiAgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKQEAgLTI3OCwxMSArMzUxLDIwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShtV2hhdCwgbVRhcmdldCk7CiAgICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CiAKKyNpZmRlZiBEVU1QX1NUQVRTCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICArK2dEdXBDYWxsczsKKyAgICAgICAgZ0F2ZXJhZ2VEdXBJdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIHJlcG9ydFN0YXRzKCk7CisgICAgfQorI2VuZGlmCisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKmZyb20gPSAmbUl0ZW1zW2ldOwogICAgICAgICBJdGVtICp0byA9ICZtc2ctPm1JdGVtc1tpXTsKIAotICAgICAgICB0by0+bU5hbWUgPSBmcm9tLT5tTmFtZTsKKyAgICAgICAgdG8tPnNldE5hbWUoZnJvbS0+bU5hbWUsIGZyb20tPm1OYW1lTGVuZ3RoKTsKICAgICAgICAgdG8tPm1UeXBlID0gZnJvbS0+bVR5cGU7CiAKICAgICAgICAgc3dpdGNoIChmcm9tLT5tVHlwZSkgewpAQCAtNDAzLDcgKzQ4NSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihpdGVtLnUucmVmVmFsdWUpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+ZGF0YSgpICE9IE5VTEwgJiYgYnVmZmVyLT5zaXplKCkgPD0gNjQpIHsKICAgICAgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCJCdWZmZXIgJXMgPSB7XG4iLCBpdGVtLm1OYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIGluZGVudCArIDQsICZ0bXApOwogICAgICAgICAgICAgICAgICAgICBhcHBlbmRJbmRlbnQoJnRtcCwgaW5kZW50ICsgMik7CkBAIC00NjgsOCArNTUwLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaXRlbS0+bU5hbWUgPSBBQXRvbWl6ZXI6OkF0b21pemUobmFtZSk7CiAgICAgICAgIGl0ZW0tPm1UeXBlID0gc3RhdGljX2Nhc3Q8VHlwZT4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICAgICAgLy8gc2V0TmFtZSgpIGhhcHBlbnMgYmVsb3cgc28gdGhhdCB3ZSBkb24ndCBsZWFrIG1lbW9yeSB3aGVuIHBhcnNpbmcKKyAgICAgICAgLy8gaXMgYWJvcnRlZCBpbiB0aGUgbWlkZGxlLgogICAgICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6CiAgICAgICAgICAgICB7CkBAIC01MzEsNiArNjE0LDggQEAKICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaXRlbS0+c2V0TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwogICAgIH0KIAogICAgIHJldHVybiBtc2c7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKaW5kZXggZTYyOTU4OC4uNDUwNGMyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApAQCAtNTIxLDcgKzUyMSw3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICZmcmFnKSB7Cit2b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6ZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJiAvKiBmcmFnICovKSB7CiAjaWYgMAogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3QgZGVsYXlNcyA9IChub3dVcyAtIGZyYWcubVRpbWVVcykgLyAxMDAwbGw7CkBAIC01NzksNyArNTc5LDcgQEAKIAogICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKICAgICAgICAgICAgIGlmICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiVkIGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXp1IGRhdGFncmFtcyByZW1haW4gcXVldWVkLiIsIG1PdXRGcmFnbWVudHMuc2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IE9LOwogICAgICAgICB9CkBAIC02MjMsNyArNjIzLDcgQEAKICAgICBDSEVDS19FUShtU3RhdGUsIENPTk5FQ1RFRCk7CiAgICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7CiAKLSAgICBzc2l6ZV90IG47CisgICAgc3NpemVfdCBuID0gLTE7CiAgICAgd2hpbGUgKCFtT3V0RnJhZ21lbnRzLmVtcHR5KCkpIHsKICAgICAgICAgY29uc3QgRnJhZ21lbnQgJmZyYWcgPSAqbU91dEZyYWdtZW50cy5iZWdpbigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBkZWU3ODZkLi45ODM1Y2EzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCkBAIC00OCw2ICs1MCwxMyBAQAogICAgIHNldFRvKHMsIHNpemUpOwogfQogCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IFN0cmluZzggJmZyb20pCisgICAgOiBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUFsbG9jU2l6ZSgxKSB7CisgICAgc2V0VG8oZnJvbS5zdHJpbmcoKSwgZnJvbS5sZW5ndGgoKSk7Cit9CisKIEFTdHJpbmc6OkFTdHJpbmcoY29uc3QgQVN0cmluZyAmZnJvbSkKICAgICA6IG1EYXRhKE5VTEwpLAogICAgICAgbVNpemUoMCksCkBAIC0xODksNjQgKzE5OCw2NCBAQAogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChpbnQgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWQiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIldSIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiV1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgeCkgewotICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWxkIiwgeCk7Ci0KKyAgICBjaGFyIHNbMzJdOworICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbGQiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodW5zaWduZWQgbG9uZyB4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlbHUiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsdSIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChsb25nIGxvbmcgeCkgewogICAgIGNoYXIgc1szMl07Ci0gICAgc3ByaW50ZihzLCAiJWxsZCIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsbGQiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodW5zaWduZWQgbG9uZyBsb25nIHgpIHsKICAgICBjaGFyIHNbMzJdOwotICAgIHNwcmludGYocywgIiVsbHUiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlbGx1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGZsb2F0IHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVmIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWYiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQoZG91YmxlIHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVmIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWYiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQodm9pZCAqeCkgewotICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJXAiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVwIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKQEAgLTI5OCw2ICszMDcsMTQgQEAKICAgICByZXR1cm4gc3RyY21wKG1EYXRhLCBvdGhlci5tRGF0YSk7CiB9CiAKK2ludCBBU3RyaW5nOjpjb21wYXJlSWdub3JlQ2FzZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdHJjYXNlY21wKG1EYXRhLCBvdGhlci5tRGF0YSk7Cit9CisKK2Jvb2wgQVN0cmluZzo6ZXF1YWxzSWdub3JlQ2FzZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlSWdub3JlQ2FzZShvdGhlcikgPT0gMDsKK30KKwogdm9pZCBBU3RyaW5nOjp0b2xvd2VyKCkgewogICAgIG1ha2VNdXRhYmxlKCk7CiAKQEAgLTMyMCw2ICszMzcsMzUgQEAKICAgICByZXR1cm4gIXN0cmNtcChtRGF0YSArIG1TaXplIC0gc3VmZml4TGVuLCBzdWZmaXgpOwogfQogCitib29sIEFTdHJpbmc6OnN0YXJ0c1dpdGhJZ25vcmVDYXNlKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QgeworICAgIHJldHVybiAhc3RybmNhc2VjbXAobURhdGEsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCitib29sIEFTdHJpbmc6OmVuZHNXaXRoSWdub3JlQ2FzZShjb25zdCBjaGFyICpzdWZmaXgpIGNvbnN0IHsKKyAgICBzaXplX3Qgc3VmZml4TGVuID0gc3RybGVuKHN1ZmZpeCk7CisKKyAgICBpZiAobVNpemUgPCBzdWZmaXhMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAhc3RyY2FzZWNtcChtRGF0YSArIG1TaXplIC0gc3VmZml4TGVuLCBzdWZmaXgpOworfQorCisvLyBzdGF0aWMKK0FTdHJpbmcgQVN0cmluZzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgeworICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIHJldHVybiBBU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIgKj4ocGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpKSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IEFTdHJpbmc6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBDSEVDS19MRShtU2l6ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihJTlQzMl9NQVgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVNpemUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gcGFyY2VsLT53cml0ZShtRGF0YSwgbVNpemUpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBBU3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgewogICAgIHZhX2xpc3QgYXA7CiAgICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKaW5kZXggYWQyZGFiNS4uOTBhNmEyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5tawpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICBsaWJ1dGlscyAgICAgICAgICBcCiAgICAgICAgIGxpYmxvZwogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IDk1ODE5ODYuLjdkYTdkYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTMzLDYgKzMzLDEwIEBACiAKICAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CisKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzYsNyArODAsNyBAQAogICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CiAgICAgICAgICAgICBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7CiAKLSAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfSAKKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQogICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KIAogICAgICAgICAgICAgYWNjdW0gPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyOCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAorICAgICAgICBIVFRQSGVscGVyLmNwcCAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCSQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAorICAgICAgICBsaWJtZWRpYQorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9odHRwX3N1cHBvcnQKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODQ1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhUVFBIZWxwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJIVFRQSGVscGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3V0aWxfQmluZGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9TY29wZWRMb2NhbFJlZi5oPgorI2luY2x1ZGUgImpuaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPElNZWRpYUhUVFBTZXJ2aWNlPiBDcmVhdGVIVFRQU2VydmljZUluQ3VycmVudEphdmFDb250ZXh0KCkgeworICAgIGlmIChBbmRyb2lkUnVudGltZTo6Z2V0SmF2YVZNKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlSFRUUFNlcnZpY2VJbkN1cnJlbnRKYXZhQ29udGV4dCBjYWxsZWQgb3V0c2lkZSAiCisgICAgICAgICAgICAgICJKQVZBIGVudmlyb25tZW50LiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIFNjb3BlZExvY2FsUmVmPGpjbGFzcz4gY2xhenooCisgICAgICAgICAgICBlbnYsIGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKSk7CisgICAgQ0hFQ0soY2xhenouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBqbWV0aG9kSUQgY29uc3RydWN0SUQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LmdldCgpLCAiPGluaXQ+IiwgIigpViIpOworICAgIENIRUNLKGNvbnN0cnVjdElEICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VPYmooCisgICAgICAgICAgICBlbnYsIGVudi0+TmV3T2JqZWN0KGNsYXp6LmdldCgpLCBjb25zdHJ1Y3RJRCkpOworCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgIGlmIChodHRwU2VydmljZU9iai5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIGptZXRob2RJRCBhc0JpbmRlcklEID0KKyAgICAgICAgICAgIGVudi0+R2V0TWV0aG9kSUQoY2xhenouZ2V0KCksICJhc0JpbmRlciIsICIoKUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7CisgICAgICAgIENIRUNLKGFzQmluZGVySUQgIT0gTlVMTCk7CisKKyAgICAgICAgU2NvcGVkTG9jYWxSZWY8am9iamVjdD4gaHR0cFNlcnZpY2VCaW5kZXJPYmooCisgICAgICAgICAgICAgICAgZW52LCBlbnYtPkNhbGxPYmplY3RNZXRob2QoaHR0cFNlcnZpY2VPYmouZ2V0KCksIGFzQmluZGVySUQpKTsKKyAgICAgICAgQ0hFQ0soaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkgIT0gTlVMTCk7CisKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgICAgIGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgaHR0cFNlcnZpY2VCaW5kZXJPYmouZ2V0KCkpOworCisgICAgICAgIGh0dHBTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorCisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY1JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKaW5kZXggMTNjYWM2ZC4uOGFlZjExNQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2lmbmRlZiBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworI2RlZmluZSBIVFRQX0hFTFBFUl9IXwogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCituYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKKworc3A8SU1lZGlhSFRUUFNlcnZpY2U+IENyZWF0ZUhUVFBTZXJ2aWNlSW5DdXJyZW50SmF2YUNvbnRleHQoKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBIVFRQX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjk5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKKyAgICBtSW5pdENoZWNrID0gT0s7Cit9CisKK01lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKKyAgICBjbGVhckRSTVN0YXRlX2woKTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworCisgICAgYm9vbCBzdWNjZXNzID0gbUhUVFBDb25uZWN0aW9uLT5jb25uZWN0KHVyaSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKyAgICBtTGFzdFVSSSA9IHVyaTsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IE9LOworfQorCit1aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKy8vIERSTS4uLgorCitzcDxEZWNyeXB0SGFuZGxlPiBNZWRpYUhUVFA6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpIHsKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CisgICAgfQorCisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBtRHJtTWFuYWdlckNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgICAgIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSksIG1pbWUpOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKK30KKwordm9pZCBNZWRpYUhUVFA6OmdldERybUluZm8oCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKKyAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKKyAgICAqY2xpZW50ID0gbURybU1hbmFnZXJDbGllbnQ7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IE1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit2b2lkIE1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tawppbmRleCBmMzUyOWY5Li5lOGQ1NThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKQEAgLTEzLDYgKzEzLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJjcnlwdG8gXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IGU1M2UzNWEuLmZiYTZiMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw1MiArMzYsNTMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTGl2ZVNlc3Npb246OkxpdmVTZXNzaW9uKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1VSURWYWxpZCh1aWRWYWxpZCksCi0gICAgICBtVUlEKHVpZCksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAogICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgICAgSFRUUEJhc2U6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykKLSAgICAgICAgICAgICAgICAgICAgPyBIVFRQQmFzZTo6a0ZsYWdJbmNvZ25pdG8KLSAgICAgICAgICAgICAgICAgICAgOiAwKSksCi0gICAgICBtUHJldkJhbmR3aWR0aEluZGV4KC0xKSwKKyAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICAgIG1DdXJCYW5kd2lkdGhJbmRleCgtMSksCiAgICAgICBtU3RyZWFtTWFzaygwKSwKICAgICAgIG1OZXdTdHJlYW1NYXNrKDApLAogICAgICAgbVN3YXBNYXNrKDApLAogICAgICAgbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbigwKSwKICAgICAgIG1Td2l0Y2hHZW5lcmF0aW9uKDApLAorICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbigwKSwKICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMGxsKSwKICAgICAgIG1SZWFsVGltZUJhc2VVcygwbGwpLAogICAgICAgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbURpc2Nvbm5lY3RSZXBseUlEKDApLAotICAgICAgbVNlZWtSZXBseUlEKDApIHsKLSAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0VUlEKG1VSUQpOwotICAgIH0KKyAgICAgIG1TZWVrUmVwbHlJRCgwKSwKKyAgICAgIG1GaXJzdFRpbWVVc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1GaXJzdFRpbWVVcygwKSwKKyAgICAgIG1MYXN0U2Vla1RpbWVVcygwKSB7CiAKICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBTdHJlYW1JdGVtKCJhdWRpbyIpOwogICAgIG1TdHJlYW1zW2tWaWRlb0luZGV4XSA9IFN0cmVhbUl0ZW0oInZpZGVvIik7CiAgICAgbVN0cmVhbXNba1N1YnRpdGxlSW5kZXhdID0gU3RyZWFtSXRlbSgic3VidGl0bGVzIik7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgbURpc2NvbnRpbnVpdGllcy5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwogICAgICAgICBtUGFja2V0U291cmNlcy5hZGQoaW5kZXhUb1R5cGUoaSksIG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwgLyogbWV0YSAqLykpOwogICAgICAgICBtUGFja2V0U291cmNlczIuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKKyAgICAgICAgbUJ1ZmZlcmluZ1tpXSA9IGZhbHNlOwogICAgIH0KIH0KIApAQCAtMTEyLDMxICsxMTUsOTAgQEAKICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWUgID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihzdHJlYW0pOworICAgIGlmIChkaXNjb250aW51aXR5UXVldWUtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgIC8vIHNlZWtpbmcsIHRyYWNrIHN3aXRjaGluZworICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpCisgICAgICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAvLyBzZWVraW5nIG9ubHkKKyAgICAgICAgICAgIG1MYXN0U2Vla1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5jbGVhcigpOworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOworICAgIH0KKwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKHN0cmVhbSk7CiAKLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7CiAgICAgaWYgKCFwYWNrZXRTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgbUJ1ZmZlcmluZ1tpZHhdID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgeworICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MKKyAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmlzRmluaXNoZWQoMCkKKyAgICAgICAgICAgICAgICB8fCBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKSA+IDEwMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIG1CdWZmZXJpbmdbaWR4XSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1CdWZmZXJpbmdbaWR4XSkgeworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICAvLyB3YWl0IGZvciBjb3VudGVycGFydAorICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG90aGVyU291cmNlOworICAgIHVpbnQzMl90IG1hc2sgPSBtTmV3U3RyZWFtTWFzayAmIG1TdHJlYW1NYXNrOworICAgIHVpbnQzMl90IGZldGNoZXJzTWFzayAgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCBmZXRjaGVyTWFzayA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKKyAgICAgICAgZmV0Y2hlcnNNYXNrIHw9IGZldGNoZXJNYXNrOworICAgIH0KKyAgICBtYXNrICY9IGZldGNoZXJzTWFzazsKKyAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX1ZJREVPKSkgeworICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pOworICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8gJiYgKG1hc2sgJiBTVFJFQU1UWVBFX0FVRElPKSkgeworICAgICAgICBvdGhlclNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pOworICAgIH0KKyAgICBpZiAob3RoZXJTb3VyY2UgIT0gTlVMTCAmJiAhb3RoZXJTb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdCA9PSBPSyA/IC1FQUdBSU4gOiBmaW5hbFJlc3VsdDsKICAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBwYWNrZXRTb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCisgICAgc2l6ZV90IHN0cmVhbUlkeDsKICAgICBjb25zdCBjaGFyICpzdHJlYW1TdHI7CiAgICAgc3dpdGNoIChzdHJlYW0pIHsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FVRElPOgorICAgICAgICAgICAgc3RyZWFtSWR4ID0ga0F1ZGlvSW5kZXg7CiAgICAgICAgICAgICBzdHJlYW1TdHIgPSAiYXVkaW8iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHN0cmVhbUlkeCA9IGtWaWRlb0luZGV4OwogICAgICAgICAgICAgc3RyZWFtU3RyID0gInZpZGVvIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgorICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1N1YnRpdGxlSW5kZXg7CiAgICAgICAgICAgICBzdHJlYW1TdHIgPSAic3VicyI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogCisgICAgU3RyZWFtSXRlbSYgc3RybSA9IG1TdHJlYW1zW3N0cmVhbUlkeF07CiAgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkpIHsKKyAgICAgICAgLy8gYWRhcHRpdmUgc3RyZWFtaW5nLCBkaXNjb250aW51aXRpZXMgaW4gdGhlIHBsYXlsaXN0CiAgICAgICAgIGludDMyX3QgdHlwZTsKICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpOwogCkBAIC0xNTEsMTAgKzIxMyw3IEBACiAgICAgICAgICAgICAgIGV4dHJhID09IE5VTEwgPyAiTlVMTCIgOiBleHRyYS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICBpbnQzMl90IHN3YXA7Ci0gICAgICAgIGlmICh0eXBlID09IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKLSAgICAgICAgICAgICAgICAmJiAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigic3dhcFBhY2tldFNvdXJjZSIsICZzd2FwKQotICAgICAgICAgICAgICAgICYmIHN3YXApIHsKLQorICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCAmc3dhcCkgJiYgc3dhcCkgewogICAgICAgICAgICAgaW50MzJfdCBzd2l0Y2hHZW5lcmF0aW9uOwogICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCAmc3dpdGNoR2VuZXJhdGlvbikpOwogICAgICAgICAgICAgewpAQCAtMTY3LDE2ICsyMjYsNzUgQEAKICAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHNlcSA9IHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShzZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgPSBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMudmFsdWVGb3Ioc2VxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VxICs9IDE7CisgICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuaW5kZXhPZktleShzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLnZhbHVlRm9yKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgLSBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyArPSBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmFkZChzZXEsIG9mZnNldFRpbWVVcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgeworCiAgICAgICAgIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9BVURJTyB8fCBzdHJlYW0gPT0gU1RSRUFNVFlQRV9WSURFTykgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXEgPSAwOwogICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICAmdGltZVVzKSk7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSByZWFkIGJ1ZmZlciBhdCB0aW1lICVsbGQgdXMiLCBzdHJlYW1TdHIsIHRpbWVVcyk7CisgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgIHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEgPSBkaXNjb250aW51aXR5U2VxOwogCisgICAgICAgICAgICBpbnQzMl90IGRpc2NhcmQgPSAwOworICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1clVzOyAvLyBhcHByb3hpbWF0ZSBzYW1wbGUgZHVyYXRpb24KKyAgICAgICAgICAgICAgICBpZiAodGltZVVzID4gc3RybS5tTGFzdERlcXVldWVkVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIGR1clVzID0gdGltZVVzIC0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR1clVzID0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzIC0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJtLm1MYXN0U2FtcGxlRHVyYXRpb25VcyA9IGR1clVzOworICAgICAgICAgICAgICAgIGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3Ioc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjYXJkIiwgJmRpc2NhcmQpICYmIGRpc2NhcmQpIHsKKyAgICAgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuYWRkKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gZmlyc3RUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICB0aW1lVXMgLT0gZmlyc3RUaW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lVXMgKz0gbUxhc3RTZWVrVGltZVVzOworICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KGRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lVXMgKz0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKGRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiWyVzXSByZWFkIGJ1ZmZlciBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwgc3RyZWFtU3RyLCB0aW1lVXMpOworICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgIHRpbWVVcyk7CiAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJzdWJ0aXRsZUdlbmVyYXRpb24iLCAmc3VidGl0bGVHZW5lcmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAmJiBzdWJ0aXRsZUdlbmVyYXRpb24gIT0gbVN1YnRpdGxlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICB9OwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQzMigKICAgICAgICAgICAgICAgICAgICAgInRyYWNrSW5kZXgiLCBtUGxheWxpc3QtPmdldFNlbGVjdGVkSW5kZXgoKSk7CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJiYXNlVXMiLCBtUmVhbFRpbWVCYXNlVXMpOwpAQCAtMjM1LDEwICszNTMsNiBAQAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CiAKLSAgICB1aW50MzJfdCByZXBseUlEOwotICAgIENIRUNLKHJlc3BvbnNlID09IG1TZWVrUmVwbHkgJiYgMCAhPSBtU2Vla1JlcGx5SUQpOwotICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKLSAgICBtU2Vla1JlcGx5SUQgPSAwOwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTI2NCwxMiArMzc4LDE2IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFNlZWs6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TZWVrUmVwbHlJRCkpOworICAgICAgICAgICAgdWludDMyX3Qgc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZzZWVrUmVwbHlJRCkpOworICAgICAgICAgICAgbVNlZWtSZXBseUlEID0gc2Vla1JlcGx5SUQ7CisgICAgICAgICAgICBtU2Vla1JlcGx5ID0gbmV3IEFNZXNzYWdlOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblNlZWsobXNnKTsKIAotICAgICAgICAgICAgbVNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yOTIsNyArNDEwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnRpbnVhdGlvbiAhPSBOVUxMKSB7CkBAIC0zMDIsNyArNDIyLDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVNlZWtSZXBseSAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS0+c2V0SW50MzIoImVyciIsIE9LKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMyOSw2ICs0NTIsMjMgQEAKIAogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiWFhYIFJlY2VpdmVkIGVycm9yICVkIGZyb20gUGxheWxpc3RGZXRjaGVyLiIsIGVycik7CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIEVPUyBvbiBzdWJ0aXRsZSB0cmFja3MgaW5kZXBlbmRlbnRseQorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNICYmIG1zZy0+ZmluZFN0cmluZygidXJpIiwgJnVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBsYXlsaXN0RmV0Y2hlcj4gJmZldGNoZXIgPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gZmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1UWVBFX1NVQlRJVExFUyktPnNpZ25hbEVPUyhlcnIpOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQcmVwYXJlZChlcnIpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNTQsNiArNDk0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZ1cmkpKTsKIAorICAgICAgICAgICAgICAgICAgICBpZiAobUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZmluZCB1cmkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEZldGNoZXJJbmZvICppbmZvID0gJm1GZXRjaGVySW5mb3MuZWRpdFZhbHVlRm9yKHVyaSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1Jc1ByZXBhcmVkID0gdHJ1ZTsKIApAQCAtNDEwLDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG9uQ2hlY2tCYW5kd2lkdGgoKTsKKyAgICAgICAgICAgIG9uQ2hlY2tCYW5kd2lkdGgobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTQ0Myw2ICs1ODcsMTkgQEAKICAgICAgICAgICAgIG9uU3dhcHBlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2hlY2tTd2l0Y2hEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBvbkNoZWNrU3dpdGNoRG93bigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3dpdGNoRG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25Td2l0Y2hEb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC00NjYsNiArNjIzLDIxIEBACiAgICAgcmV0dXJuIChTdHJlYW1UeXBlKSgxIDw8IGlkeCk7CiB9CiAKKy8vIHN0YXRpYworc3NpemVfdCBMaXZlU2Vzc2lvbjo6dHlwZVRvSW5kZXgoaW50MzJfdCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfVklERU86CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH07CisgICAgcmV0dXJuIC0xOworfQorCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBBU3RyaW5nIHVybDsKICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVybCIsICZ1cmwpKTsKQEAgLTQ4MCwxMSArNjUyLDggQEAKICAgICAgICAgaGVhZGVycyA9IE5VTEw7CiAgICAgfQogCi0jaWYgMQotICAgIEFMT0dJKCJvbkNvbm5lY3QgPFVSTCBzdXBwcmVzc2VkPiIpOwotI2Vsc2UKLSAgICBBTE9HSSgib25Db25uZWN0ICVzIiwgdXJsLmNfc3RyKCkpOwotI2VuZGlmCisgICAgLy8gVE9ETyBjdXJyZW50bHkgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgY29taW5nIGhlcmUgZnJvbSBpbmNvZ25pdG8gbW9kZQorICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOwogCiAgICAgbU1hc3RlclVSTCA9IHVybDsKIApAQCAtNDkyLDcgKzY2MSw3IEBACiAgICAgbVBsYXlsaXN0ID0gZmV0Y2hQbGF5bGlzdCh1cmwuY19zdHIoKSwgTlVMTCAvKiBjdXJQbGF5bGlzdEhhc2ggKi8sICZkdW1teSk7CiAKICAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBmZXRjaCBtYXN0ZXIgcGxheWxpc3QgJyVzJy4iLCB1cmwuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gZmV0Y2ggbWFzdGVyIHBsYXlsaXN0ICVzLiIsIHVyaURlYnVnU3RyaW5nKHVybCkuY19zdHIoKSk7CiAKICAgICAgICAgcG9zdFByZXBhcmVkKEVSUk9SX0lPKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNTQ0LDggKzcxMyw5IEBACiAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5wdXNoKGl0ZW0pOwogICAgIH0KIAorICAgIG1QbGF5bGlzdC0+cGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgMGxsIC8qIHRpbWVVcyAqLywgaW5pdGlhbEJhbmR3aWR0aEluZGV4LCB0cnVlIC8qIHBpY2tUcmFjayAqLyk7CisgICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OmZpbmlzaERpc2Nvbm5lY3QoKSB7CkBAIC01NTcsNiArNzI3LDkgQEAKICAgICAvLyAoZmluaXNoRGlzY29ubmVjdCwgb25GaW5pc2hEaXNjb25uZWN0MikKICAgICBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKIAorICAgIC8vIGNhbmNlbCBzd2l0Y2ggZG93biBtb25pdG9yCisgICAgbVN3aXRjaERvd25Nb25pdG9yLmNsZWFyKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5zdG9wQXN5bmMoKTsKICAgICB9CkBAIC01OTksNyArNzcyLDcgQEAKICAgICBub3RpZnktPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgbVN3aXRjaEdlbmVyYXRpb24pOwogCiAgICAgRmV0Y2hlckluZm8gaW5mbzsKLSAgICBpbmZvLm1GZXRjaGVyID0gbmV3IFBsYXlsaXN0RmV0Y2hlcihub3RpZnksIHRoaXMsIHVyaSk7CisgICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIobm90aWZ5LCB0aGlzLCB1cmksIG1TdWJ0aXRsZUdlbmVyYXRpb24pOwogICAgIGluZm8ubUR1cmF0aW9uVXMgPSAtMWxsOwogICAgIGluZm8ubUlzUHJlcGFyZWQgPSBmYWxzZTsKICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOwpAQCAtNjc5LDcgKzg1Miw3IEBACiAKICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IDA7CiAgICAgLy8gYWRqdXN0IHJhbmdlX2xlbmd0aCBpZiBvbmx5IHJlYWRpbmcgcGFydGlhbCBibG9jawotICAgIGlmIChibG9ja19zaXplID4gMCAmJiAocmFuZ2VfbGVuZ3RoID09IC0xIHx8IGJ1ZmZlci0+c2l6ZSgpICsgYmxvY2tfc2l6ZSA8IHJhbmdlX2xlbmd0aCkpIHsKKyAgICBpZiAoYmxvY2tfc2l6ZSA+IDAgJiYgKHJhbmdlX2xlbmd0aCA9PSAtMSB8fCAoaW50NjRfdCkoYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplKSA8IHJhbmdlX2xlbmd0aCkpIHsKICAgICAgICAgcmFuZ2VfbGVuZ3RoID0gYnVmZmVyLT5zaXplKCkgKyBibG9ja19zaXplOwogICAgIH0KICAgICBmb3IgKDs7KSB7CkBAIC02ODgsNyArODYxLDcgQEAKICAgICAgICAgaWYgKGJ1ZmZlclJlbWFpbmluZyA9PSAwICYmIGdldFNpemVFcnIgIT0gT0spIHsKICAgICAgICAgICAgIGJ1ZmZlclJlbWFpbmluZyA9IDMyNzY4OwogCi0gICAgICAgICAgICBBTE9HVigiaW5jcmVhc2luZyBkb3dubG9hZCBidWZmZXIgdG8gJWQgYnl0ZXMiLAorICAgICAgICAgICAgQUxPR1YoImluY3JlYXNpbmcgZG93bmxvYWQgYnVmZmVyIHRvICV6dSBieXRlcyIsCiAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSgpICsgYnVmZmVyUmVtYWluaW5nKTsKIAogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29weSA9IG5ldyBBQnVmZmVyKGJ1ZmZlci0+c2l6ZSgpICsgYnVmZmVyUmVtYWluaW5nKTsKQEAgLTcwMSw3ICs4NzQsNyBAQAogICAgICAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPSBidWZmZXJSZW1haW5pbmc7CiAgICAgICAgIGlmIChyYW5nZV9sZW5ndGggPj0gMCkgewogICAgICAgICAgICAgaW50NjRfdCBieXRlc0xlZnRJblJhbmdlID0gcmFuZ2VfbGVuZ3RoIC0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA8IG1heEJ5dGVzVG9SZWFkKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXNMZWZ0SW5SYW5nZSA8IChpbnQ2NF90KW1heEJ5dGVzVG9SZWFkKSB7CiAgICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBieXRlc0xlZnRJblJhbmdlOwogCiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPT0gMCkgewpAQCAtNzY5LDkgKzk0Miw2IEBACiAgICAgICAgIC8vIHBsYXlsaXN0IHVuY2hhbmdlZAogICAgICAgICAqdW5jaGFuZ2VkID0gdHJ1ZTsKIAotICAgICAgICBBTE9HVigiUGxheWxpc3QgdW5jaGFuZ2VkLCByZWZyZXNoIHN0YXRlIGlzIG5vdyAlZCIsCi0gICAgICAgICAgICAgKGludCltUmVmcmVzaFN0YXRlKTsKLQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTgzNiwxNCArMTAwNiwyMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ29uc2lkZXIgb25seSA4MCUgb2YgdGhlIGF2YWlsYWJsZSBiYW5kd2lkdGggdXNhYmxlLgotICAgICAgICBiYW5kd2lkdGhCcHMgPSAoYmFuZHdpZHRoQnBzICogOCkgLyAxMDsKLQogICAgICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gZXN0aW1hdGVkIGJhbmR3aWR0aC4KIAogICAgICAgICBpbmRleCA9IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgLSAxOwotICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoaW5kZXgpLm1CYW5kd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAoc2l6ZV90KWJhbmR3aWR0aEJwcykgeworICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICAvLyBjb25zaWRlciBvbmx5IDgwJSBvZiB0aGUgYXZhaWxhYmxlIGJhbmR3aWR0aCwgYnV0IGlmIHdlIGFyZSBzd2l0Y2hpbmcgdXAsCisgICAgICAgICAgICAvLyBiZSBldmVuIG1vcmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQorICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGJhY2suCisgICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHM7CisgICAgICAgICAgICBpZiAoaW5kZXggPiBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogNyAvIDEwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogOCAvIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoaW5kZXgpLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC0taW5kZXg7CiAgICAgICAgIH0KICAgICB9CkBAIC04NTYsMjAgKzEwMzQsMjAgQEAKICAgICAvLyB0byBsb3dlc3QpCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5JbmRleCA9IDA7CiAKLSAgICBzdGF0aWMgc3NpemVfdCBtUHJldkJhbmR3aWR0aEluZGV4ID0gLTE7CisgICAgc3RhdGljIHNzaXplX3QgbUN1ckJhbmR3aWR0aEluZGV4ID0gLTE7CiAKICAgICBzaXplX3QgaW5kZXg7Ci0gICAgaWYgKG1QcmV2QmFuZHdpZHRoSW5kZXggPCAwKSB7CisgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA8IDApIHsKICAgICAgICAgaW5kZXggPSBrTWluSW5kZXg7CiAgICAgfSBlbHNlIGlmICh1bmlmb3JtUmFuZCgpIDwgMC41KSB7Ci0gICAgICAgIGluZGV4ID0gKHNpemVfdCltUHJldkJhbmR3aWR0aEluZGV4OworICAgICAgICBpbmRleCA9IChzaXplX3QpbUN1ckJhbmR3aWR0aEluZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gbVByZXZCYW5kd2lkdGhJbmRleCArIDE7CisgICAgICAgIGluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4ICsgMTsKICAgICAgICAgaWYgKGluZGV4ID09IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpIHsKICAgICAgICAgICAgIGluZGV4ID0ga01pbkluZGV4OwogICAgICAgICB9CiAgICAgfQotICAgIG1QcmV2QmFuZHdpZHRoSW5kZXggPSBpbmRleDsKKyAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBpbmRleDsKICNlbGlmIDAKICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gYmVsb3cgb3IgZXF1YWwgdG8gMS4yIE1iaXQvc2VjCiAKQEAgLTkwMCwxNSArMTA3OCwzNCBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAoraW50NjRfdCBMaXZlU2Vzc2lvbjo6bGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKSB7CisgICAgc3A8QU1lc3NhZ2U+IGF1ZGlvTWV0YSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICBpbnQ2NF90IG1pblNlZ21lbnRTdGFydFRpbWVVcyA9IC0xLCB2aWRlb1NlZ21lbnRTdGFydFRpbWVVcyA9IC0xOworICAgIGlmIChhdWRpb01ldGEgIT0gTlVMTCkgeworICAgICAgICBhdWRpb01ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJm1pblNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvTWV0YSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfVklERU8pLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICBpZiAodmlkZW9NZXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHZpZGVvTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMpKSB7CisgICAgICAgIGlmIChtaW5TZWdtZW50U3RhcnRUaW1lVXMgPCAwIHx8IHZpZGVvU2VnbWVudFN0YXJ0VGltZVVzIDwgbWluU2VnbWVudFN0YXJ0VGltZVVzKSB7CisgICAgICAgICAgICBtaW5TZWdtZW50U3RhcnRUaW1lVXMgPSB2aWRlb1NlZ21lbnRTdGFydFRpbWVVczsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBtaW5TZWdtZW50U3RhcnRUaW1lVXM7Cit9CisKIHN0YXR1c190IExpdmVTZXNzaW9uOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCiAgICAgaWYgKCFtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKHRpbWVVcywgZ2V0QmFuZHdpZHRoSW5kZXgoKSk7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9Ci0KLSAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdCB7CkBAIC05MzUsMTQgKzExMzIsMzQgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IExpdmVTZXNzaW9uOjpnZXRUcmFja0luZm8oUGFyY2VsICpyZXBseSkgY29uc3QgewotICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrSW5mbyhyZXBseSk7CitzaXplX3QgTGl2ZVNlc3Npb246OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrQ291bnQoKTsKKyAgICB9Cit9CisKK3NwPEFNZXNzYWdlPiBMaXZlU2Vzc2lvbjo6Z2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdCB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICB9CiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICArK21TdWJ0aXRsZUdlbmVyYXRpb247CiAgICAgc3RhdHVzX3QgZXJyID0gbVBsYXlsaXN0LT5zZWxlY3RUcmFjayhpbmRleCwgc2VsZWN0KTsKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24sIGlkKCkpOworICAgICAgICBtc2ctPnNldEludDMyKCJiYW5kd2lkdGhJbmRleCIsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHNlbGVjdCk7CisgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtOTY5LDE1ICsxMTg2LDExIEBACiAgICAgQ0hFQ0soIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKTsKICAgICBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyA9IHRydWU7CiAKLSAgICBtUHJldkJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CisgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gYmFuZHdpZHRoSW5kZXg7CiAKLSAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbiA9PiB0aW1lVXM6JWxsZCB1cywgYndJbmRleDolZCwgcGlja1RyYWNrOiVkIiwKKyAgICBBTE9HVigiY2hhbmdlQ29uZmlndXJhdGlvbiA9PiB0aW1lVXM6JSIgUFJJZDY0ICIgdXMsIGJ3SW5kZXg6JXp1LCBwaWNrVHJhY2s6JWQiLAogICAgICAgICAgIHRpbWVVcywgYmFuZHdpZHRoSW5kZXgsIHBpY2tUcmFjayk7CiAKLSAgICBpZiAocGlja1RyYWNrKSB7Ci0gICAgICAgIG1QbGF5bGlzdC0+cGlja1JhbmRvbU1lZGlhSXRlbXMoKTsKLSAgICB9Ci0KICAgICBDSEVDS19MVChiYW5kd2lkdGhJbmRleCwgbUJhbmR3aWR0aEl0ZW1zLnNpemUoKSk7CiAgICAgY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSA9IG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoYmFuZHdpZHRoSW5kZXgpOwogCkBAIC0xMDAwLDE0ICsxMjEzLDE1IEBACiAKICAgICAgICAgLy8gSWYgd2UncmUgc2Vla2luZyBhbGwgY3VycmVudCBmZXRjaGVycyBhcmUgZGlzY2FyZGVkLgogICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgICAgICAvLyBkZWxheSBmZXRjaGVyIHJlbW92YWwKLSAgICAgICAgICAgIGRpc2NhcmRGZXRjaGVyID0gZmFsc2U7CisgICAgICAgICAgICAvLyBkZWxheSBmZXRjaGVyIHJlbW92YWwgaWYgbm90IHBpY2tpbmcgdHJhY2tzCisgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IHBpY2tUcmFjazsKIAogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7CiAgICAgICAgICAgICAgICAgU3RyZWFtVHlwZSB0eXBlID0gaW5kZXhUb1R5cGUoaik7CiAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgdHlwZSkgJiYgdXJpID09IFVSSXNbal0pIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdW1lTWFzayB8PSB0eXBlOwogICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrICY9IH50eXBlOworICAgICAgICAgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTAyMSwxNiArMTIzNSwxNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZzsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIC8vIHNraXAgb25DaGFuZ2VDb25maWd1cmF0aW9uMiAoZGVjb2RlciBkZXN0cnVjdGlvbikgaWYgc3dpdGNoaW5nLgorICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIG5vdCBzZWVraW5nLgogICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgaWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjIsIGlkKCkpOwogICAgIH0KICAgICBtc2ctPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CiAgICAgbXNnLT5zZXRJbnQzMigicmVzdW1lTWFzayIsIHJlc3VtZU1hc2spOworICAgIG1zZy0+c2V0SW50MzIoInBpY2tUcmFjayIsIHBpY2tUcmFjayk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKLSAgICAgICAgaWYgKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkgeworICAgICAgICBpZiAoKHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrKSAmIGluZGV4VG9UeXBlKGkpKSB7CiAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCBVUklzW2ldLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA0NywxNCArMTI2MiwyMCBAQAogCiAgICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewogICAgICAgICAgICAgQ0hFQ0sobVNlZWtSZXBseSAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBPSyk7CiAgICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IDA7CisgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ2hhbmdlQ29uZmlndXJhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGlmICghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgZ2V0QmFuZHdpZHRoSW5kZXgoKSk7CisgICAgICAgIGludDMyX3QgcGlja1RyYWNrID0gMCwgYmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgIG1zZy0+ZmluZEludDMyKCJwaWNrVHJhY2siLCAmcGlja1RyYWNrKTsKKyAgICAgICAgbXNnLT5maW5kSW50MzIoImJhbmR3aWR0aEluZGV4IiwgJmJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgYmFuZHdpZHRoSW5kZXgsIHBpY2tUcmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7IC8vIHJldHJ5IGluIDEgc2VjCiAgICAgfQpAQCAtMTA2NSw4ICsxMjg2LDE0IEBACiAKICAgICAvLyBBbGwgZmV0Y2hlcnMgYXJlIGVpdGhlciBzdXNwZW5kZWQgb3IgaGF2ZSBiZWVuIHJlbW92ZWQgbm93LgogCi0gICAgdWludDMyX3Qgc3RyZWFtTWFzazsKKyAgICB1aW50MzJfdCBzdHJlYW1NYXNrLCByZXN1bWVNYXNrOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOworCisgICAgLy8gY3VycmVudGx5IG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgaXMgb25seSBjYWxsZWQgZm9yIHNlZWtpbmc7CisgICAgLy8gcmVtb3ZlIHRoZSBmb2xsb3dpbmcgQ0hFQ0sgaWYgdXNpbmcgaXQgZWxzZSB3aGVyZS4KKyAgICBDSEVDS19FUShyZXN1bWVNYXNrLCAwKTsKKyAgICBzdHJlYW1NYXNrIHw9IHJlc3VtZU1hc2s7CiAKICAgICBBU3RyaW5nIFVSSXNba01heFN0cmVhbXNdOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgewpAQCAtMTEyMywyMyArMTM1MCwzNSBAQAogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOwogCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBwaWNrVHJhY2s7CisgICAgYm9vbCBzd2l0Y2hpbmcgPSBmYWxzZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwaWNrVHJhY2siLCAmcGlja1RyYWNrKSk7CisKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIGlmICghcGlja1RyYWNrKSB7CisgICAgICAgICAgICBzd2l0Y2hpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBtTGFzdERlcXVldWVkVGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZWFsVGltZUJhc2VVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSB0aW1lVXM7CisgICAgfQorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CiAgICAgICAgIGlmIChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCAmbVN0cmVhbXNbaV0ubVVyaSkpOworICAgICAgICAgICAgaWYgKHN3aXRjaGluZykgeworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZyhtU3RyZWFtc1tpXS51cmlLZXkoKS5jX3N0cigpLCAmbVN0cmVhbXNbaV0ubU5ld1VyaSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcobVN0cmVhbXNbaV0udXJpS2V5KCkuY19zdHIoKSwgJm1TdHJlYW1zW2ldLm1VcmkpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdGltZVVzOwotICAgIGJvb2wgc3dpdGNoaW5nID0gZmFsc2U7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKLSAgICAgICAgdGltZVVzID0gbUxhc3REZXF1ZXVlZFRpbWVVczsKLSAgICAgICAgc3dpdGNoaW5nID0gdHJ1ZTsKKyAgICBtTmV3U3RyZWFtTWFzayA9IHN0cmVhbU1hc2sgfCByZXN1bWVNYXNrOworICAgIGlmIChzd2l0Y2hpbmcpIHsKKyAgICAgICAgbVN3YXBNYXNrID0gbVN0cmVhbU1hc2sgJiB+cmVzdW1lTWFzazsKICAgICB9Ci0gICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKLQotICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzazsKIAogICAgIC8vIE9mIGFsbCBleGlzdGluZyBmZXRjaGVyczoKICAgICAvLyAqIFJlc3VtZSBmZXRjaGVycyB0aGF0IGFyZSBzdGlsbCBuZWVkZWQgYW5kIGFzc2lnbiB0aGVtIG9yaWdpbmFsIHBhY2tldCBzb3VyY2VzLgpAQCAtMTE1Miw2ICsxMzkxLDE2IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewogICAgICAgICAgICAgaWYgKChyZXN1bWVNYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBtU3RyZWFtc1tqXS5tVXJpKSB7CiAgICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKworICAgICAgICAgICAgICAgIGlmIChqICE9IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBkdW1teSBkaXNjb250aW51aXR5IGZvciBzdHJlYW0gdHlwZSAlZCIsIGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTE3OSw0MyArMTQyOCw4NiBAQAogICAgICAgICB9CiAKICAgICAgICAgQVN0cmluZyB1cmk7Ci0gICAgICAgIHVyaSA9IG1TdHJlYW1zW2ldLm1Vcmk7CisgICAgICAgIHVyaSA9IHN3aXRjaGluZyA/IG1TdHJlYW1zW2ldLm1OZXdVcmkgOiBtU3RyZWFtc1tpXS5tVXJpOwogCiAgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gZmV0Y2hlciA9IGFkZEZldGNoZXIodXJpLmNfc3RyKCkpOwogICAgICAgICBDSEVDSyhmZXRjaGVyICE9IE5VTEwpOwogCiAgICAgICAgIGludDMyX3QgbGF0ZXN0U2VxID0gLTE7Ci0gICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMGxsOworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTE7CisgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbDsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gLTE7CiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba01heFN0cmVhbXNdOwogCisgICAgICAgIGlmIChpID09IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWVVcygpOworICAgICAgICB9CisKICAgICAgICAgLy8gVFJJQ0tZOiBsb29waW5nIGZyb20gaSBhcyBlYXJsaWVyIHN0cmVhbXMgYXJlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN0cmVhbU1hc2sKICAgICAgICAgZm9yIChzaXplX3QgaiA9IGk7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7Ci0gICAgICAgICAgICBpZiAoKHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShqKSkgJiYgdXJpID09IG1TdHJlYW1zW2pdLm1VcmkpIHsKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnN0cmVhbVVyaSA9IHN3aXRjaGluZyA/IG1TdHJlYW1zW2pdLm1OZXdVcmkgOiBtU3RyZWFtc1tqXS5tVXJpOworICAgICAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBzdHJlYW1VcmkpIHsKICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFzd2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0aW1lVXM7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihpbmRleFRvVHlwZShqKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLCBleHRyYSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlLCBzZXE7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3JjVGltZVVzOwotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNyY1NlZ21lbnRTdGFydFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaWNrVHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdERlcXVldWVkTWV0YSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRhcHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgIW1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJzZXEiLCAmc2VxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VxID4gbGF0ZXN0U2VxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0U2VxID0gc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0bXBVczsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRtcFVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCAwIHx8IHRtcFVzIDwgc3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA9IHRtcFVzOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmc3JjVGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjVGltZVVzID4gbGF0ZXN0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0VGltZVVzID0gc3JjVGltZVVzOworCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ0bXBVcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGFydFRpbWVVcyA8IDAgfHwgdG1wVXMgPCBzZWdtZW50U3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSB0bXBVczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXE7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmc2VxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzY29udGludWl0eVNlcSA8IDAgfHwgc2VxIDwgZGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlTZXEgPSBzZXE7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXh0cmFTdHJlYW1zID0gbU5ld1N0cmVhbU1hc2sgJiAofm1TdHJlYW1NYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZUFjY2Vzc1VuaXQoY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKC8qIHN3YXAgPSAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdHJhY2ssIHF1ZXVlIGRpc2NvbnRpbnVpdGllcyBiZWZvcmUgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGtTdWJ0aXRsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWU7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+cXVldWVEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYWZ0ZXIgcmVzdW1lCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMyLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHRyYVN0cmVhbXMgPSBtTmV3U3RyZWFtTWFzayAmICh+bVN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhU3RyZWFtcyAmIGluZGV4VG9UeXBlKGopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+cXVldWVBY2Nlc3NVbml0KGNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigvKnN3YXAqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xMjI3LDE0ICsxNTE5LDE2IEBACiAgICAgICAgICAgICAgICAgc291cmNlc1trQXVkaW9JbmRleF0sCiAgICAgICAgICAgICAgICAgc291cmNlc1trVmlkZW9JbmRleF0sCiAgICAgICAgICAgICAgICAgc291cmNlc1trU3VidGl0bGVJbmRleF0sCi0gICAgICAgICAgICAgICAgdGltZVVzLAotICAgICAgICAgICAgICAgIGxhdGVzdFRpbWVVcyAvKiBtaW4gc3RhcnQgdGltZSh1cykgKi8sCi0gICAgICAgICAgICAgICAgbGF0ZXN0U2VxID49IDAgPyBsYXRlc3RTZXEgKyAxIDogLTEgLyogc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGhpbnQgKi8gKTsKKyAgICAgICAgICAgICAgICBzdGFydFRpbWVVcyA8IDAgPyBtTGFzdFNlZWtUaW1lVXMgOiBzdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMsCisgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVNlcSwKKyAgICAgICAgICAgICAgICBzd2l0Y2hpbmcpOwogICAgIH0KIAogICAgIC8vIEFsbCBmZXRjaGVycyBoYXZlIG5vdyBiZWVuIHN0YXJ0ZWQsIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZQogICAgIC8vIGhhcyBjb21wbGV0ZWQuCiAKKyAgICBjYW5jZWxDaGVja0JhbmR3aWR0aEV2ZW50KCk7CiAgICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7CiAKICAgICBBTE9HVigiWFhYIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNvbXBsZXRlZC4iKTsKQEAgLTEyNTksOCArMTU1MywxNyBAQAogCiAgICAgaW50MzJfdCBzdHJlYW07CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbSIsICZzdHJlYW0pKTsKLSAgICBtU3dhcE1hc2sgfD0gc3RyZWFtOwotICAgIGlmIChtU3dhcE1hc2sgIT0gbVN0cmVhbU1hc2spIHsKKworICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKKyAgICBDSEVDSyhpZHggPj0gMCk7CisgICAgaWYgKChtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkgJiYgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgIH0KKyAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CisgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CisKKyAgICBtU3dhcE1hc2sgJj0gfnN0cmVhbTsKKyAgICBpZiAobVN3YXBNYXNrICE9IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTI3MCwxNSArMTU3Myw2NSBAQAogICAgICAgICBTdHJlYW1UeXBlIGV4dHJhU3RyZWFtID0gKFN0cmVhbVR5cGUpIChleHRyYVN0cmVhbXMgJiB+KGV4dHJhU3RyZWFtcyAtIDEpKTsKICAgICAgICAgc3dhcFBhY2tldFNvdXJjZShleHRyYVN0cmVhbSk7CiAgICAgICAgIGV4dHJhU3RyZWFtcyAmPSB+ZXh0cmFTdHJlYW07CisKKyAgICAgICAgaWR4ID0gdHlwZVRvSW5kZXgoZXh0cmFTdHJlYW0pOworICAgICAgICBDSEVDSyhpZHggPj0gMCk7CisgICAgICAgIGlmIChtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIGV4dHJhIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOworICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKICAgICB9CiAKICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOwogfQogCit2b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrU3dpdGNoRG93bigpIHsKKyAgICBpZiAobVN3aXRjaERvd25Nb25pdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihpbmRleFRvVHlwZShpKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKworICAgICAgICBpZiAobWV0YSAhPSBOVUxMICYmIG1ldGEtPmZpbmRJbnQzMigidGFyZ2V0RHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb24pICkgeworICAgICAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSBwYWNrZXRTb3VyY2UtPmdldEVzdGltYXRlZER1cmF0aW9uVXMoKTsKKyAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uICogMTAwMDAwMGxsOworCisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgdGFyZ2V0RHVyYXRpb25VcyAvIDMpIHsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3dpdGNoRG93biwgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoMTAwMDAwMGxsKTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6b25Td2l0Y2hEb3duKCkgeworICAgIGlmIChtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcyB8fCBtU3dpdGNoSW5Qcm9ncmVzcyB8fCBtQ3VyQmFuZHdpZHRoSW5kZXggPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3NpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KCk7CisgICAgaWYgKGJhbmR3aWR0aEluZGV4IDwgbUN1ckJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTEsIGJhbmR3aWR0aEluZGV4LCBmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xLCBtQ3VyQmFuZHdpZHRoSW5kZXggLSAxLCBmYWxzZSk7Cit9CisKIC8vIE1hcmsgc3dpdGNoIGRvbmUgd2hlbjoKLS8vICAgMS4gYWxsIG9sZCBidWZmZXJzIGFyZSBzd2FwcGVkIG91dCwgQU5ECi0vLyAgIDIuIGFsbCBvbGQgZmV0Y2hlcnMgYXJlIHJlbW92ZWQuCisvLyAgIDEuIGFsbCBvbGQgYnVmZmVycyBhcmUgc3dhcHBlZCBvdXQKIHZvaWQgTGl2ZVNlc3Npb246OnRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCkgeworICAgIGlmICghbVN3aXRjaEluUHJvZ3Jlc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGJvb2wgbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tVG9CZVJlbW92ZWQpIHsKQEAgLTEyODYsMTAgKzE2MzksMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgJiYgbVN3YXBNYXNrID09IG1TdHJlYW1NYXNrKSB7CisKKyAgICBpZiAoIW5lZWRUb1JlbW92ZUZldGNoZXJzICYmIG1Td2FwTWFzayA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlIik7CiAgICAgICAgIG1TdHJlYW1NYXNrID0gbU5ld1N0cmVhbU1hc2s7CiAgICAgICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgIG1Td2FwTWFzayA9IDA7CiAgICAgfQogfQogCkBAIC0xMzA4LDYgKzE2NjIsMjggQEAKICAgICBtU3dpdGNoR2VuZXJhdGlvbisrOwogICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7CiAgICAgbVN3YXBNYXNrID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICBGZXRjaGVySW5mbyYgaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICBpZiAoIW1TdHJlYW1zW2ldLm1OZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgc3NpemVfdCBqID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG1TdHJlYW1zW2ldLm1OZXdVcmkpOworICAgICAgICAgICAgaWYgKGogPCAwKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MudmFsdWVBdChqKTsKKyAgICAgICAgICAgIGluZm8ubUZldGNoZXItPnN0b3BBc3luYygpOworICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtc0F0KGopOworICAgICAgICAgICAgbVN0cmVhbXNbaV0ubU5ld1VyaS5jbGVhcigpOworICAgICAgICB9CisgICAgfQogfQogCiBib29sIExpdmVTZXNzaW9uOjpjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpIHsKQEAgLTEzMTUsMzMgKzE2OTEsMjkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChtUHJldkJhbmR3aWR0aEluZGV4IDwgMCkgeworICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGlmIChiYW5kd2lkdGhJbmRleCA9PSAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXgpIHsKKyAgICBpZiAoYmFuZHdpZHRoSW5kZXggPT0gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoSW5kZXggPiAoc2l6ZV90KW1QcmV2QmFuZHdpZHRoSW5kZXgpIHsKKyAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aEluZGV4ID4gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKICAgICAgICAgcmV0dXJuIGNhblN3aXRjaFVwKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvbkNoZWNrQmFuZHdpZHRoKCkgewordm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja0JhbmR3aWR0aChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHNpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KCk7CiAgICAgaWYgKGNhblN3aXRjaEJhbmR3aWR0aFRvKGJhbmR3aWR0aEluZGV4KSkgewogICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCBiYW5kd2lkdGhJbmRleCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50KCk7CisgICAgICAgIC8vIENvbWUgYmFjayBhbmQgY2hlY2sgYWdhaW4gMTAgc2Vjb25kcyBsYXRlciBpbiBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gbm93LgorICAgICAgICAvLyBJZiB3ZSBETyBjaGFuZ2UgY29uZmlndXJhdGlvbiwgb25jZSB0aGF0IGNvbXBsZXRlcyBpdCdsbCBzY2hlZHVsZSBhIG5ldworICAgICAgICAvLyBjaGVjayBiYW5kd2lkdGggZXZlbnQgd2l0aCBhbiBpbmNyZW1lbnRlZCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uLgorICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMDBsbCk7CiAgICAgfQotCi0gICAgLy8gSGFuZGxpbmcgdGhlIGtXaGF0Q2hlY2tCYW5kd2lkdGggZXZlbiBoZXJlIGRvZXMgX25vdF8gYXV0b21hdGljYWxseQotICAgIC8vIHNjaGVkdWxlIGFub3RoZXIgb25lIG9uIHJldHVybiwgb25seSBhbiBleHBsaWNpdCBjYWxsIHRvCi0gICAgLy8gc2NoZWR1bGVDaGVja0JhbmR3aWR0aEV2ZW50IHdpbGwgZG8gdGhhdC4KLSAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGNoYW5nZSBpcyBvbmdvaW5nIGF0IGFueQotICAgIC8vIG9uZSB0aW1lLCBvbmNlIHRoYXQgY29tcGxldGVzIGl0J2xsIHNjaGVkdWxlIGFub3RoZXIgY2hlY2sgYmFuZHdpZHRoCi0gICAgLy8gZXZlbnQuCiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OnBvc3RQcmVwYXJlZChzdGF0dXNfdCBlcnIpIHsKQEAgLTEzNTgsNiArMTczMCw5IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID0gZmFsc2U7CisKKyAgICBtU3dpdGNoRG93bk1vbml0b3IgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja1N3aXRjaERvd24sIGlkKCkpOworICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKaW5kZXggM2Y4ZmVlNS4uN2FhY2NhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCkBAIC0yOCw2ICsyOCw3IEBACiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CkBAIC00MCw3ICs0MSw4IEBACiAgICAgfTsKICAgICBMaXZlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLCBib29sIHVpZFZhbGlkID0gZmFsc2UsIHVpZF90IHVpZCA9IDApOworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIGVudW0gU3RyZWFtSW5kZXggewogICAgICAgICBrQXVkaW9JbmRleCAgICA9IDAsCkBAIC02OCw3ICs3MCw4IEBACiAgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZVVzKTsKIAogICAgIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdDsKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOwogCiAgICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7CkBAIC0xMDUsNiArMTA4LDggQEAKICAgICAgICAga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMyAgICAgICA9ICdjaEMzJywKICAgICAgICAga1doYXRGaW5pc2hEaXNjb25uZWN0MiAgICAgICAgICA9ICdmaW4yJywKICAgICAgICAga1doYXRTd2FwcGVkICAgICAgICAgICAgICAgICAgICA9ICdzd2FwJywKKyAgICAgICAga1doYXRDaGVja1N3aXRjaERvd24gICAgICAgICAgICA9ICdja1NEJywKKyAgICAgICAga1doYXRTd2l0Y2hEb3duICAgICAgICAgICAgICAgICA9ICdzRHduJywKICAgICB9OwogCiAgICAgc3RydWN0IEJhbmR3aWR0aEl0ZW0gewpAQCAtMTIxLDkgKzEyNiwyMCBAQAogCiAgICAgc3RydWN0IFN0cmVhbUl0ZW0gewogICAgICAgICBjb25zdCBjaGFyICptVHlwZTsKLSAgICAgICAgQVN0cmluZyBtVXJpOwotICAgICAgICBTdHJlYW1JdGVtKCkgOiBtVHlwZSgiIikge30KLSAgICAgICAgU3RyZWFtSXRlbShjb25zdCBjaGFyICp0eXBlKSA6IG1UeXBlKHR5cGUpIHt9CisgICAgICAgIEFTdHJpbmcgbVVyaSwgbU5ld1VyaTsKKyAgICAgICAgc2l6ZV90IG1DdXJEaXNjb250aW51aXR5U2VxOworICAgICAgICBpbnQ2NF90IG1MYXN0RGVxdWV1ZWRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICBTdHJlYW1JdGVtKCkKKyAgICAgICAgICAgIDogbVR5cGUoIiIpLAorICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKKyAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKKyAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CisgICAgICAgIFN0cmVhbUl0ZW0oY29uc3QgY2hhciAqdHlwZSkKKyAgICAgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgICAgIG1DdXJEaXNjb250aW51aXR5U2VxKDApLAorICAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDApLAorICAgICAgICAgICAgICBtTGFzdFNhbXBsZUR1cmF0aW9uVXMoMCkge30KICAgICAgICAgQVN0cmluZyB1cmlLZXkoKSB7CiAgICAgICAgICAgICBBU3RyaW5nIGtleShtVHlwZSk7CiAgICAgICAgICAgICBrZXkuYXBwZW5kKCJVUkkiKTsKQEAgLTEzNCwxMCArMTUwLDEwIEBACiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgYm9vbCBtVUlEVmFsaWQ7Ci0gICAgdWlkX3QgbVVJRDsKKyAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCiAgICAgYm9vbCBtSW5QcmVwYXJhdGlvblBoYXNlOworICAgIGJvb2wgbUJ1ZmZlcmluZ1trTWF4U3RyZWFtc107CiAKICAgICBzcDxIVFRQQmFzZT4gbUhUVFBEYXRhU291cmNlOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1FeHRyYUhlYWRlcnM7CkBAIC0xNDUsNyArMTYxLDcgQEAKICAgICBBU3RyaW5nIG1NYXN0ZXJVUkw7CiAKICAgICBWZWN0b3I8QmFuZHdpZHRoSXRlbT4gbUJhbmR3aWR0aEl0ZW1zOwotICAgIHNzaXplX3QgbVByZXZCYW5kd2lkdGhJbmRleDsKKyAgICBzc2l6ZV90IG1DdXJCYW5kd2lkdGhJbmRleDsKIAogICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OwogCkBAIC0xNjEsNiArMTc3LDcgQEAKICAgICAvLyB3ZSB1c2UgdGhpcyB0byB0cmFjayByZWNvbmZpZ3VyYXRpb24gcHJvZ3Jlc3MuCiAgICAgdWludDMyX3QgbVN3YXBNYXNrOwogCisgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtRGlzY29udGludWl0aWVzOwogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXM7CiAgICAgLy8gQSBzZWNvbmQgc2V0IG9mIHBhY2tldCBzb3VyY2VzIHRoYXQgYnVmZmVyIGNvbnRlbnQgZm9yIHRoZSB2YXJpYW50IHdlJ3JlIHN3aXRjaGluZyB0by4KICAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1QYWNrZXRTb3VyY2VzMjsKQEAgLTE3Miw2ICsxODksNyBAQAogCiAgICAgaW50MzJfdCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVN3aXRjaEdlbmVyYXRpb247CisgICAgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCiAgICAgc2l6ZV90IG1Db250aW51YXRpb25Db3VudGVyOwogICAgIHNwPEFNZXNzYWdlPiBtQ29udGludWF0aW9uOwpAQCAtMTg1LDYgKzIwMywxMyBAQAogICAgIHVpbnQzMl90IG1EaXNjb25uZWN0UmVwbHlJRDsKICAgICB1aW50MzJfdCBtU2Vla1JlcGx5SUQ7CiAKKyAgICBib29sIG1GaXJzdFRpbWVVc1ZhbGlkOworICAgIGludDY0X3QgbUZpcnN0VGltZVVzOworICAgIGludDY0X3QgbUxhc3RTZWVrVGltZVVzOworICAgIHNwPEFNZXNzYWdlPiBtU3dpdGNoRG93bk1vbml0b3I7CisgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBpbnQ2NF90PiBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVczsKKyAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVczsKKwogICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gYWRkRmV0Y2hlcihjb25zdCBjaGFyICp1cmkpOwogCiAgICAgdm9pZCBvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMjE2LDkgKzI0MSwxMSBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCk7CiAKICAgICBzaXplX3QgZ2V0QmFuZHdpZHRoSW5kZXgoKTsKKyAgICBpbnQ2NF90IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CiAKICAgICBzdGF0aWMgaW50IFNvcnRCeUJhbmR3aWR0aChjb25zdCBCYW5kd2lkdGhJdGVtICosIGNvbnN0IEJhbmR3aWR0aEl0ZW0gKik7CiAgICAgc3RhdGljIFN0cmVhbVR5cGUgaW5kZXhUb1R5cGUoaW50IGlkeCk7CisgICAgc3RhdGljIHNzaXplX3QgdHlwZVRvSW5kZXgoaW50MzJfdCB0eXBlKTsKIAogICAgIHZvaWQgY2hhbmdlQ29uZmlndXJhdGlvbigKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBzaXplX3QgYmFuZHdpZHRoSW5kZXgsIGJvb2wgcGlja1RyYWNrID0gZmFsc2UpOwpAQCAtMjI2LDYgKzI1Myw4IEBACiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25Td2FwcGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQ2hlY2tTd2l0Y2hEb3duKCk7CisgICAgdm9pZCBvblN3aXRjaERvd24oKTsKICAgICB2b2lkIHRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCk7CiAKICAgICB2b2lkIHNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwpAQCAtMjM3LDcgKzI2Niw3IEBACiAgICAgdm9pZCBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKIAogICAgIGJvb2wgY2FuU3dpdGNoQmFuZHdpZHRoVG8oc2l6ZV90IGJhbmR3aWR0aEluZGV4KTsKLSAgICB2b2lkIG9uQ2hlY2tCYW5kd2lkdGgoKTsKKyAgICB2b2lkIG9uQ2hlY2tCYW5kd2lkdGgoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCBmaW5pc2hEaXNjb25uZWN0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCmluZGV4IGUzMWFkNDAuLjE2NTFkZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CkBAIC01OCw4ICs1OSw4IEBACiAKICAgICB2b2lkIHBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7Ci0gICAgdm9pZCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7CiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFHcm91cCgpOwpAQCAtMTI2LDcgKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgbVNlbGVjdGVkSW5kZXggPSBzdHJ0b3VsKHZhbHVlLCAmZW5kLCAxMCk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soZW5kID4gdmFsdWUgJiYgKmVuZCA9PSAnXDAnKTsKIAotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA+PSBtTWVkaWFJdGVtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggPj0gKHNzaXplX3QpbU1lZGlhSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gbU1lZGlhSXRlbXMuc2l6ZSgpIC0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTU2LDY1ICsxNTcsNzIgQEAKIH0KIAogc3RhdHVzX3QgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KSB7Ci0gICAgaWYgKG1UeXBlICE9IFRZUEVfU1VCUykgewotICAgICAgICBBTE9HRSgib25seSBzZWxlY3Qgc3VidGl0aWxlIHRyYWNrcyBmb3Igbm93ISIpOworICAgIGlmIChtVHlwZSAhPSBUWVBFX1NVQlMgJiYgbVR5cGUgIT0gVFlQRV9BVURJTykgeworICAgICAgICBBTE9HRSgib25seSBzZWxlY3Qgc3VidGl0aWxlL2F1ZGlvIHRyYWNrcyBmb3Igbm93ISIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKHNlbGVjdCkgewogICAgICAgICBpZiAoaW5kZXggPj0gbU1lZGlhSXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJhY2sgJWQgZG9lcyBub3QgZXhpc3QiLCBpbmRleCk7CisgICAgICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGRvZXMgbm90IGV4aXN0IiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA9PSBpbmRleCkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICVkIGFscmVhZHkgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgIGlmIChtU2VsZWN0ZWRJbmRleCA9PSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJWQiLCBpbmRleCk7CisgICAgICAgIEFMT0dWKCJzZWxlY3RlZCB0cmFjayAlenUiLCBpbmRleCk7CiAgICAgICAgIG1TZWxlY3RlZEluZGV4ID0gaW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ICE9IGluZGV4KSB7Ci0gICAgICAgICAgICBBTE9HRSgidHJhY2sgJWQgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICBpZiAobVNlbGVjdGVkSW5kZXggIT0gKHNzaXplX3QpaW5kZXgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaXMgbm90IHNlbGVjdGVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigidW5zZWxlY3RlZCB0cmFjayAlZCIsIGluZGV4KTsKKyAgICAgICAgQUxPR1YoInVuc2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwogICAgICAgICBtU2VsZWN0ZWRJbmRleCA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBNM1VQYXJzZXI6Ok1lZGlhR3JvdXA6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFJdGVtcy5zaXplKCk7ICsraSkgewotICAgICAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gMiBmaWVsZHMKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgewotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBNZWRpYSAmaXRlbSA9IG1NZWRpYUl0ZW1zLml0ZW1BdChpKTsKLSAgICAgICAgY29uc3QgY2hhciAqbGFuZyA9IGl0ZW0ubUxhbmd1YWdlLmVtcHR5KCkgPyAidW5kIiA6IGl0ZW0ubUxhbmd1YWdlLmNfc3RyKCk7Ci0gICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcpKTsKLQotICAgICAgICBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7Ci0gICAgICAgICAgICAvLyBUTy1ETzogcGFzcyBpbiBhIE1lZGlhRm9ybWF0IGluc3RlYWQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19BVVRPU0VMRUNUKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMighIShpdGVtLm1GbGFncyAmIE1lZGlhR3JvdXA6OkZMQUdfREVGQVVMVCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0ZPUkNFRCkpOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzaXplX3QgTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpjb3VudFRyYWNrcygpIGNvbnN0IHsKICAgICByZXR1cm4gbU1lZGlhSXRlbXMuc2l6ZSgpOwogfQogCitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpNZWRpYUdyb3VwOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKGluZGV4ID49IG1NZWRpYUl0ZW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAobVR5cGUgPT0gVFlQRV9BVURJTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9WSURFTykgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgIH0gZWxzZSBpZiAobVR5cGUgPT0gVFlQRV9TVUJTKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBmb3JtYXQtPnNldEludDMyKCJ0eXBlIiwgdHJhY2tUeXBlKTsKKworICAgIGNvbnN0IE1lZGlhICZpdGVtID0gbU1lZGlhSXRlbXMuaXRlbUF0KGluZGV4KTsKKyAgICBjb25zdCBjaGFyICpsYW5nID0gaXRlbS5tTGFuZ3VhZ2UuZW1wdHkoKSA/ICJ1bmQiIDogaXRlbS5tTGFuZ3VhZ2UuY19zdHIoKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCBsYW5nKTsKKworICAgIGlmIChtVHlwZSA9PSBUWVBFX1NVQlMpIHsKKyAgICAgICAgLy8gVE8tRE86IHBhc3MgaW4gYSBNZWRpYUZvcm1hdCBpbnN0ZWFkCisgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISEoaXRlbS5tRmxhZ3MgJiBNZWRpYUdyb3VwOjpGTEFHX0FVVE9TRUxFQ1QpKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZGVmYXVsdCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19ERUZBVUxUKSk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsICEhKGl0ZW0ubUZsYWdzICYgTWVkaWFHcm91cDo6RkxBR19GT1JDRUQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCiBib29sIE0zVVBhcnNlcjo6TWVkaWFHcm91cDo6Z2V0QWN0aXZlVVJJKEFTdHJpbmcgKnVyaSkgY29uc3QgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhSXRlbXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKG1TZWxlY3RlZEluZGV4ID49IDAgJiYgaSA9PSAoc2l6ZV90KW1TZWxlY3RlZEluZGV4KSB7CkBAIC0yMzgsNiArMjQ2LDcgQEAKICAgICAgIG1Jc1ZhcmlhbnRQbGF5bGlzdChmYWxzZSksCiAgICAgICBtSXNDb21wbGV0ZShmYWxzZSksCiAgICAgICBtSXNFdmVudChmYWxzZSksCisgICAgICBtRGlzY29udGludWl0eVNlcSgwKSwKICAgICAgIG1TZWxlY3RlZEluZGV4KC0xKSB7CiAgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOwogfQpAQCAtMjY1LDYgKzI3NCwxMCBAQAogICAgIHJldHVybiBtSXNFdmVudDsKIH0KIAorc2l6ZV90IE0zVVBhcnNlcjo6Z2V0RGlzY29udGludWl0eVNlcSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURpc2NvbnRpbnVpdHlTZXE7Cit9CisKIHNwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQpAQCAtMzE5LDE3ICszMzIsMjQgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE0zVVBhcnNlcjo6Z2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKK3NpemVfdCBNM1VQYXJzZXI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CiAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhR3JvdXBzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHRyYWNrQ291bnQgKz0gbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmNvdW50VHJhY2tzKCk7CiAgICAgfQotICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrQ291bnQpOworICAgIHJldHVybiB0cmFja0NvdW50OworfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbU1lZGlhR3JvdXBzLnZhbHVlQXQoaSktPmdldFRyYWNrSW5mbyhyZXBseSk7CitzcDxBTWVzc2FnZT4gTTNVUGFyc2VyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGlpID0gaW5kZXg7IGkgPCBtTWVkaWFHcm91cHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8TWVkaWFHcm91cD4gZ3JvdXAgPSBtTWVkaWFHcm91cHMudmFsdWVBdChpKTsKKyAgICAgICAgc2l6ZV90IHRyYWNrcyA9IGdyb3VwLT5jb3VudFRyYWNrcygpOworICAgICAgICBpZiAoaWkgPCB0cmFja3MpIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cC0+Z2V0VHJhY2tJbmZvKGlpKTsKKyAgICAgICAgfQorICAgICAgICBpaSAtPSB0cmFja3M7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3NpemVfdCBNM1VQYXJzZXI6OmdldFNlbGVjdGVkSW5kZXgoKSBjb25zdCB7CkBAIC0zOTgsNiArNDE4LDggQEAKICAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGNvbnN0IHNpemVfdCBzY2hlbWVFbmQgPSAoc3Ryc3RyKGJhc2VVUkwsICIvLyIpIC0gYmFzZVVSTCkgKyAyOworICAgIENIRUNLKHNjaGVtZUVuZCA9PSA3IHx8IHNjaGVtZUVuZCA9PSA4KTsKIAogICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmwsIDgpKSB7CiAgICAgICAgIC8vICJ1cmwiIGlzIGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLCBpZ25vcmUgYmFzZSBVUkwuCkBAIC00NDIsNyArNDY0LDcgQEAKIAogICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBmb3VuZCBzbGFzaCBhY3R1YWxseSBpcyBwYXJ0IG9mIHRoZSBwYXRoCiAgICAgICAgIC8vIGFuZCBub3QgcGFydCBvZiB0aGUgImh0dHA6Ly8iLgotICAgICAgICBpZiAoZW5kID4gNikgeworICAgICAgICBpZiAoZW5kID49IHNjaGVtZUVuZCkgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBlbmQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKQEAgLTU1MCw2ICs1NzIsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLU1FRElBIikpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1lZGlhKGxpbmUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFIikpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2VxOworICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlRGlzY29udGludWl0eVNlcXVlbmNlKGxpbmUsICZzZXEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzZXE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC03MTMsNiArNzQxLDkgQEAKIAogICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvZGVjcyA9IHVucXVvdGVTdHJpbmcodmFsKTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKm1ldGEpLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIGNvZGVjcy5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCgiYXVkaW8iLCBrZXkuY19zdHIoKSkKICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcCgidmlkZW8iLCBrZXkuY19zdHIoKSkKQEAgLTczNiw2ICs3NjcsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBrZXkudG9sb3dlcigpOworICAgICAgICAgICAgaWYgKG1ldGEtPmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgICgqbWV0YSktPnNldFN0cmluZyhrZXkuY19zdHIoKSwgZ3JvdXBJRC5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc5OCw4ICs4MzIsOCBAQAogICAgICAgICAgICAgICAgIGlmIChNYWtlVVJMKGJhc2VVUkkuY19zdHIoKSwgdmFsLmNfc3RyKCksICZhYnNVUkkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFic1VSSTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIG1ha2UgYWJzb2x1dGUgdXJsIGZvciAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKGJhc2VVUkkpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTA4Nyw2ICsxMTIxLDMwIEBACiB9CiAKIC8vIHN0YXRpYworc3RhdHVzX3QgTTNVUGFyc2VyOjpwYXJzZURpc2NvbnRpbnVpdHlTZXF1ZW5jZShjb25zdCBBU3RyaW5nICZsaW5lLCBzaXplX3QgKnNlcSkgeworICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKworICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHg7CisgICAgc3RhdHVzX3QgZXJyID0gUGFyc2VJbnQzMihsaW5lLmNfc3RyKCkgKyBjb2xvblBvcyArIDEsICZ4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNlcSkgeworICAgICAgICAqc2VxID0geDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKIHN0YXR1c190IE0zVVBhcnNlcjo6UGFyc2VJbnQzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp4KSB7CiAgICAgY2hhciAqZW5kOwogICAgIGxvbmcgbHZhbCA9IHN0cnRvbChzLCAmZW5kLCAxMCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCmluZGV4IGNjZDY1NTYuLmQ1ODhhZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCkBAIC0zNCw2ICszNCw3IEBACiAgICAgYm9vbCBpc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0OwogICAgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0OwogICAgIGJvb2wgaXNFdmVudCgpIGNvbnN0OworICAgIHNpemVfdCBnZXREaXNjb250aW51aXR5U2VxKCkgY29uc3Q7CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCkBAIC00Miw3ICs0Myw4IEBACiAKICAgICB2b2lkIHBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRJbmRleCgpIGNvbnN0OwogCiAgICAgYm9vbCBnZXRUeXBlVVJJKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp1cmkpIGNvbnN0OwpAQCAtNjUsNiArNjcsNyBAQAogICAgIGJvb2wgbUlzVmFyaWFudFBsYXlsaXN0OwogICAgIGJvb2wgbUlzQ29tcGxldGU7CiAgICAgYm9vbCBtSXNFdmVudDsKKyAgICBzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CiAKICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CiAgICAgVmVjdG9yPEl0ZW0+IG1JdGVtczsKQEAgLTkzLDYgKzk2LDggQEAKIAogICAgIHN0YXR1c190IHBhcnNlTWVkaWEoY29uc3QgQVN0cmluZyAmbGluZSk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UoY29uc3QgQVN0cmluZyAmbGluZSwgc2l6ZV90ICpzZXEpOworCiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCk7CiAgICAgc3RhdGljIHN0YXR1c190IFBhcnNlRG91YmxlKGNvbnN0IGNoYXIgKnMsIGRvdWJsZSAqeCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCmluZGV4IDY2OGNiZDQuLjMwZmE4NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogCkBAIC00OCwzMSArNDksMzYgQEAKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAxMDAwMDAwMGxsOwogY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNYXhNb25pdG9yRGVsYXlVcyA9IDMwMDAwMDBsbDsKLWNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprRG93bmxvYWRCbG9ja1NpemUgPSAxOTI7Citjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gMjA0ODsKIGNvbnN0IGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjprTnVtU2tpcEZyYW1lcyA9IDEwOwogCiBQbGF5bGlzdEZldGNoZXI6OlBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKLSAgICAgICAgY29uc3QgY2hhciAqdXJpKQorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5KG5vdGlmeS0+ZHVwKCkpLAogICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCiAgICAgICBtVVJJKHVyaSksCiAgICAgICBtU3RyZWFtVHlwZU1hc2soMCksCiAgICAgICBtU3RhcnRUaW1lVXMoLTFsbCksCi0gICAgICBtTWluU3RhcnRUaW1lVXMoMGxsKSwKLSAgICAgIG1TdG9wUGFyYW1zKE5VTEwpLAorICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMWxsKSwKKyAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xbGwpLAorICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUoZmFsc2UpLAogICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xbGwpLAogICAgICAgbVNlcU51bWJlcigtMSksCiAgICAgICBtTnVtUmV0cmllcygwKSwKICAgICAgIG1TdGFydHVwKHRydWUpLAorICAgICAgbUFkYXB0aXZlKGZhbHNlKSwKICAgICAgIG1QcmVwYXJlZChmYWxzZSksCiAgICAgICBtTmV4dFBUU1RpbWVVcygtMWxsKSwKICAgICAgIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKDApLAorICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbihzdWJ0aXRsZUdlbmVyYXRpb24pLAogICAgICAgbVJlZnJlc2hTdGF0ZShJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKLSAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygwbGwpIHsKKyAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygwbGwpLAorICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSB7CiAgICAgbWVtc2V0KG1QbGF5bGlzdEhhc2gsIDAsIHNpemVvZihtUGxheWxpc3RIYXNoKSk7CiAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgMCk7CkBAIC0zMTYsNyArMzIyLDcgQEAKICAgICAgICAgbWF4RGVsYXlVcyA9IG1pbkRlbGF5VXM7CiAgICAgfQogICAgIGlmIChkZWxheVVzID4gbWF4RGVsYXlVcykgewotICAgICAgICBBTE9HVigiTmVlZCB0byByZWZyZXNoIHBsYXlsaXN0IGluICVsbGQiLCBtYXhEZWxheVVzKTsKKyAgICAgICAgQUxPR1YoIk5lZWQgdG8gcmVmcmVzaCBwbGF5bGlzdCBpbiAlIiBQUklkNjQgLCBtYXhEZWxheVVzKTsKICAgICAgICAgZGVsYXlVcyA9IG1heERlbGF5VXM7CiAgICAgfQogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNb25pdG9yUXVldWUsIGlkKCkpOwpAQCAtMzMzLDggKzMzOSw5IEBACiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAogICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzLAotICAgICAgICBpbnQ2NF90IG1pblN0YXJ0VGltZVVzLAotICAgICAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludCkgeworICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcywKKyAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEsCisgICAgICAgIGJvb2wgYWRhcHRpdmUpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIGlkKCkpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtVHlwZU1hc2sgPSAwdWw7CkBAIC0zNTYsOCArMzYzLDkgQEAKIAogICAgIG1zZy0+c2V0SW50MzIoInN0cmVhbVR5cGVNYXNrIiwgc3RyZWFtVHlwZU1hc2spOwogICAgIG1zZy0+c2V0SW50NjQoInN0YXJ0VGltZVVzIiwgc3RhcnRUaW1lVXMpOwotICAgIG1zZy0+c2V0SW50NjQoIm1pblN0YXJ0VGltZVVzIiwgbWluU3RhcnRUaW1lVXMpOwotICAgIG1zZy0+c2V0SW50MzIoInN0YXJ0U2VxTnVtYmVySGludCIsIHN0YXJ0U2VxTnVtYmVySGludCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgc2VnbWVudFN0YXJ0VGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJzdGFydERpc2NvbnRpbnVpdHlTZXEiLCBzdGFydERpc2NvbnRpbnVpdHlTZXEpOworICAgIG1zZy0+c2V0SW50MzIoImFkYXB0aXZlIiwgYWRhcHRpdmUpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC0zNjUsOSArMzczLDkgQEAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIGlkKCkpKS0+cG9zdCgpOwogfQogCi12b2lkIFBsYXlsaXN0RmV0Y2hlcjo6c3RvcEFzeW5jKGJvb2wgc2VsZlRyaWdnZXJlZCkgewordm9pZCBQbGF5bGlzdEZldGNoZXI6OnN0b3BBc3luYyhib29sIGNsZWFyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoInNlbGZUcmlnZ2VyZWQiLCBzZWxmVHJpZ2dlcmVkKTsKKyAgICBtc2ctPnNldEludDMyKCJjbGVhciIsIGNsZWFyKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDQ3LDEwICs0NTUsMTMgQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RyZWFtVHlwZU1hc2siLCAoaW50MzJfdCAqKSZzdHJlYW1UeXBlTWFzaykpOwogCiAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKLSAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludDsKKyAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVczsKKyAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcTsKKyAgICBpbnQzMl90IGFkYXB0aXZlOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJtaW5TdGFydFRpbWVVcyIsIChpbnQ2NF90ICopICZtTWluU3RhcnRUaW1lVXMpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RhcnRTZXFOdW1iZXJIaW50IiwgJnN0YXJ0U2VxTnVtYmVySGludCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmc2VnbWVudFN0YXJ0VGltZVVzKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsICZzdGFydERpc2NvbnRpbnVpdHlTZXEpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYWRhcHRpdmUiLCAmYWRhcHRpdmUpKTsKIAogICAgIGlmIChzdHJlYW1UeXBlTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKQEAgLTQ4MCwxNiArNDkxLDE2IEBACiAgICAgfQogCiAgICAgbVN0cmVhbVR5cGVNYXNrID0gc3RyZWFtVHlwZU1hc2s7Ci0gICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CiAKLSAgICBpZiAobVN0YXJ0VGltZVVzID49IDBsbCkgeworICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSBzZWdtZW50U3RhcnRUaW1lVXM7CisgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBzdGFydERpc2NvbnRpbnVpdHlTZXE7CisKKyAgICBpZiAoc3RhcnRUaW1lVXMgPj0gMCkgeworICAgICAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVVczsKICAgICAgICAgbVNlcU51bWJlciA9IC0xOwogICAgICAgICBtU3RhcnR1cCA9IHRydWU7CiAgICAgICAgIG1QcmVwYXJlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChzdGFydFNlcU51bWJlckhpbnQgPj0gMCkgewotICAgICAgICBtU2VxTnVtYmVyID0gc3RhcnRTZXFOdW1iZXJIaW50OworICAgICAgICBtQWRhcHRpdmUgPSBhZGFwdGl2ZTsKICAgICB9CiAKICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CkBAIC01MDQsMTEgKzUxNSw5IEBACiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6b25TdG9wKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgY2FuY2VsTW9uaXRvclF1ZXVlKCk7CiAKLSAgICBpbnQzMl90IHNlbGZUcmlnZ2VyZWQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGZUcmlnZ2VyZWQiLCAmc2VsZlRyaWdnZXJlZCkpOwotICAgIGlmICghc2VsZlRyaWdnZXJlZCkgewotICAgICAgICAvLyBTZWxmIHRyaWdnZXJlZCBzdG9wcyBvbmx5IGhhcHBlbiBkdXJpbmcgc3dpdGNoaW5nLCBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCB3YW50Ci0gICAgICAgIC8vIHRvIGNsZWFyIHRoZSBkaXNjb250aW51aXRpZXMgcXVldWVkIGF0IHRoZSBlbmQgb2YgcGFja2V0IHNvdXJjZXMuCisgICAgaW50MzJfdCBjbGVhcjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY2xlYXIiLCAmY2xlYXIpKTsKKyAgICBpZiAoY2xlYXIpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKTsKICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+Y2xlYXIoKTsKQEAgLTU1MCwxNSArNTU5LDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBEb24ndCByZXN1bWUgaWYgd2Ugd291bGQgc3RvcCB3aXRoaW4gYSByZXN1bWUgdGhyZXNob2xkLgorICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CiAgICAgICAgIGludDY0X3QgbGF0ZXN0VGltZVVzID0gMCwgc3RvcFRpbWVVcyA9IDA7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3RNZXRhKCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBsYXRlc3RNZXRhID0gcGFja2V0U291cmNlLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKICAgICAgICAgaWYgKGxhdGVzdE1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIChsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCi0gICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpKSkgewotICAgICAgICAgICAgaW50NjRfdCBkaWZmVXMgPSBzdG9wVGltZVVzIC0gbGF0ZXN0VGltZVVzOwotICAgICAgICAgICAgaWYgKGRpZmZVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgewotICAgICAgICAgICAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICYmIGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAmJiBsYXRlc3RNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXRlc3RUaW1lVXMpCisgICAgICAgICAgICAgICAgJiYgcGFyYW1zLT5maW5kSW50NjQoc3RvcEtleSwgJnN0b3BUaW1lVXMpCisgICAgICAgICAgICAgICAgJiYgc3RvcFRpbWVVcyAtIGxhdGVzdFRpbWVVcyA8IHJlc3VtZVRocmVzaG9sZChsYXRlc3RNZXRhKSkgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU2Niw3ICs1NzYsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKICAgICAgICAgfQotICAgICAgICBzdG9wQXN5bmMoLyogc2VsZlRyaWdnZXJlZCA9ICovIHRydWUpOworICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTU4Niw3ICs1OTYsMTAgQEAKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVBdChpKS0+cXVldWVEaXNjb250aW51aXR5KHR5cGUsIGV4dHJhKTsKKyAgICAgICAgLy8gZG8gbm90IGRpc2NhcmQgYnVmZmVyIHVwb24gI0VYVC1YLURJU0NPTlRJTlVJVFkgdGFnCisgICAgICAgIC8vIChzZWVrIHdpbGwgZGlzY2FyZCBidWZmZXIgYnkgYWJhbmRvbmluZyBvbGQgZmV0Y2hlcnMpCisgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICB0eXBlLCBleHRyYSwgZmFsc2UgLyogZGlzY2FyZCAqLyk7CiAgICAgfQogfQogCkBAIC02MjcsNyArNjQwLDcgQEAKIAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcmVkICVsbGQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICBBTE9HVigiYnVmZmVyZWQgJSIgUFJJZDY0ICIgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcywgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcyA+IGJ1ZmZlcmVkRHVyYXRpb25VcykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VczsKQEAgLTY0MCw3ICs2NTMsNyBAQAogICAgIGlmICghbVByZXBhcmVkICYmIGJ1ZmZlcmVkRHVyYXRpb25VcyA+IHRhcmdldER1cmF0aW9uVXMgJiYgZG93bmxvYWRNb3JlKSB7CiAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7CiAKLSAgICAgICAgQUxPR1YoInByZXBhcmVkLCBidWZmZXJlZD0lbGxkID4gJWxsZCIsCisgICAgICAgIEFMT0dWKCJwcmVwYXJlZCwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzLCB0YXJnZXREdXJhdGlvblVzKTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwogICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZyk7CkBAIC02NDgsNyArNjYxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0sgJiYgZG93bmxvYWRNb3JlKSB7Ci0gICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lbGxkIDwgJWxsZCIsCisgICAgICAgIEFMT0dWKCJtb25pdG9yaW5nLCBidWZmZXJlZD0lIiBQUklkNjQgIiA8ICUiIFBSSWQ2NCAiIiwKICAgICAgICAgICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMsIGR1cmF0aW9uVG9CdWZmZXJVcyk7CiAgICAgICAgIC8vIGRlbGF5IHRoZSBuZXh0IGRvd25sb2FkIHNsaWdodGx5OyBob3BlZnVsbHkgdGhpcyBnaXZlcyBvdGhlciBjb25jdXJyZW50IGZldGNoZXJzCiAgICAgICAgIC8vIGEgYmV0dGVyIGNoYW5jZSB0byBydW4uCkBAIC02NjQsNyArNjc3LDcgQEAKICAgICAgICAgbXNnLT5wb3N0KCk7CiAKICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gbVByZXBhcmVkID8ga01heE1vbml0b3JEZWxheVVzIDogdGFyZ2V0RHVyYXRpb25VcyAvIDI7Ci0gICAgICAgIEFMT0dWKCJwYXVzaW5nIGZvciAlbGxkLCBidWZmZXJlZD0lbGxkID4gJWxsZCIsCisgICAgICAgIEFMT0dWKCJwYXVzaW5nIGZvciAlIiBQUklkNjQgIiwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCiAgICAgICAgICAgICAgICAgZGVsYXlVcywgYnVmZmVyZWREdXJhdGlvblVzLCBkdXJhdGlvblRvQnVmZmVyVXMpOwogICAgICAgICAvLyA6VFJJQ0tZOiBuZWVkIHRvIGVuZm9yY2UgbWluaW11bSBkZWxheSBiZWNhdXNlIHRoZSBkZWxheSB0bwogICAgICAgICAvLyByZWZyZXNoIHRoZSBwbGF5bGlzdCB3aWxsIGJlY29tZSAwCkBAIC03MjEsMzggKzczNCw1NSBAQAogICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwogICAgIH0KIAotICAgIGJvb2wgc2Vla0Rpc2NvbnRpbnVpdHkgPSBmYWxzZTsKLSAgICBib29sIGV4cGxpY2l0RGlzY29udGludWl0eSA9IGZhbHNlOworICAgIGJvb2wgZGlzY29udGludWl0eSA9IGZhbHNlOwogCiAgICAgY29uc3QgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9CiAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKIAotICAgIGlmIChtU3RhcnR1cCAmJiBtU2VxTnVtYmVyID49IDAKLSAgICAgICAgICAgICYmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IHx8IG1TZXFOdW1iZXIgPiBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgLy8gaW4gY2FzZSB3ZSBndWVzc2VkIHdyb25nIGR1cmluZyByZWNvbmZpZ3VyYXRpb24sIHRyeSBmZXRjaGluZyB0aGUgbGF0ZXN0IGNvbnRlbnQuCi0gICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpZiAobURpc2NvbnRpbnVpdHlTZXEgPCAwKSB7CisgICAgICAgIG1EaXNjb250aW51aXR5U2VxID0gbVBsYXlsaXN0LT5nZXREaXNjb250aW51aXR5U2VxKCk7CiAgICAgfQogCiAgICAgaWYgKG1TZXFOdW1iZXIgPCAwKSB7CiAgICAgICAgIENIRUNLX0dFKG1TdGFydFRpbWVVcywgMGxsKTsKIAotICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgfHwgbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKLSAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TdGFydFRpbWVVcyk7Ci0gICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIHRpbWUgJWxsZCBpcyAlbGQgZnJvbSAoJWxkIC4uICVsZCkiLAorICAgICAgICBpZiAobVNlZ21lbnRTdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgJiYgIW1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc2Vzc2lvbiwgc3RhcnQgMyBzZWdtZW50cyBmcm9tIHRoZSBlbmQgb24gY29ubmVjdAorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDM7CisgICAgICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJGb3JUaW1lKG1TdGFydFRpbWVVcyk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzIC09IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGFydFRpbWVVc1JlbGF0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgdGltZSAlIiBQUklkNjQgIiBpcyAlZCBmcm9tICglZCAuLiAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMsIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxpdmUgc2Vzc2lvbiwgc3RhcnQgMyBzZWdtZW50cyBmcm9tIHRoZSBlbmQuCi0gICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3QgLSAzOworICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcyk7CisgICAgICAgICAgICBpZiAobUFkYXB0aXZlKSB7CisgICAgICAgICAgICAgICAgLy8gYXZvaWQgZG91YmxlIGZldGNoL2RlY29kZQorICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3QgbWluU2VxID0gZ2V0U2VxTnVtYmVyRm9yRGlzY29udGludWl0eShtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICBpZiAobVNlcU51bWJlciA8IG1pblNlcSkgeworICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBtaW5TZXE7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBmb3IgbGl2ZSBldmVudCAlbGQgZnJvbSAoJWxkIC4uICVsZCkiLAorCisgICAgICAgICAgICBpZiAobVNlcU51bWJlciA+IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciBsaXZlIGV2ZW50ICVkIGZyb20gKCVkIC4uICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXJ0VGltZVVzID0gLTFsbDsKICAgICB9CiAKICAgICBpZiAobVNlcU51bWJlciA8IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdApAQCAtNzcxLDcgKzgwMSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiBrTWF4TW9uaXRvckRlbGF5VXMpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyA9IGtNYXhNb25pdG9yRGVsYXlVczsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlbGQgZnJvbSAoJWxkIC4uICVsZCksIG1vbml0b3IgaW4gJWxsZCAocmV0cnk9JWQpIiwKKyAgICAgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbnVtYmVyIGhpZ2g6ICVkIGZyb20gKCVkIC4uICVkKSwgIgorICAgICAgICAgICAgICAgICAgICAgICJtb25pdG9yIGluICUiIFBSSWQ2NCAiIChyZXRyeT0lZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QsIGRlbGF5VXMsIG1OdW1SZXRyaWVzKTsKICAgICAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKGRlbGF5VXMpOwpAQCAtNzg5LDE0ICs4MjAsMTQgQEAKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CiAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSA9IHRydWU7CisgICAgICAgICAgICBkaXNjb250aW51aXR5ID0gdHJ1ZTsKIAogICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgc2VxdWVuY2UgbnVtYmVyICVkIGluIHBsYXlsaXN0ICIKICAgICAgICAgICAgICAgICAgIihjb250YWlucyAlZCAtICVkKSIsCiAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKLSAgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMSk7CiAKICAgICAgICAgICAgIG5vdGlmeUVycm9yKEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtODE0LDcgKzg0NSw4IEBACiAKICAgICBpbnQzMl90IHZhbDsKICAgICBpZiAoaXRlbU1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ2YWwpICYmIHZhbCAhPSAwKSB7Ci0gICAgICAgIGV4cGxpY2l0RGlzY29udGludWl0eSA9IHRydWU7CisgICAgICAgIG1EaXNjb250aW51aXR5U2VxKys7CisgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOwogICAgIH0KIAogICAgIGludDY0X3QgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGg7CkBAIC04NDUsNiArODc3LDcgQEAKICAgICB9CiAKICAgICAvLyBibG9jay13aXNlIGRvd25sb2FkCisgICAgYm9vbCBzdGFydHVwID0gbVN0YXJ0dXA7CiAgICAgc3NpemVfdCBieXRlc1JlYWQ7CiAgICAgZG8gewogICAgICAgICBieXRlc1JlYWQgPSBtU2Vzc2lvbi0+ZmV0Y2hGaWxlKApAQCAtODc0LDcgKzkwNyw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVN0YXJ0dXAgfHwgc2Vla0Rpc2NvbnRpbnVpdHkgfHwgZXhwbGljaXREaXNjb250aW51aXR5KSB7CisgICAgICAgIGlmIChzdGFydHVwIHx8IGRpc2NvbnRpbnVpdHkpIHsKICAgICAgICAgICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5LgogCiAgICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgfHwgbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKQEAgLTg4NCwxNiArOTE3LDE3IEBACiAgICAgICAgICAgICAgICAgbU5leHRQVFNUaW1lVXMgPSBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzZWVrRGlzY29udGludWl0eSB8fCBleHBsaWNpdERpc2NvbnRpbnVpdHkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgZGlzY29udGludWl0eSAoc2Vlaz0lZCwgZXhwbGljaXQ9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgIHNlZWtEaXNjb250aW51aXR5LCBleHBsaWNpdERpc2NvbnRpbnVpdHkpOworICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgZGlzY29udGludWl0eSAoZXhwbGljaXQ9JWQpIiwgZGlzY29udGludWl0eSk7CiAKICAgICAgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdERpc2NvbnRpbnVpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9TRUVLLAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogZXh0cmEgKi8pOworCisgICAgICAgICAgICAgICAgZGlzY29udGludWl0eSA9IGZhbHNlOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydHVwID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBlcnIgPSBPSzsKQEAgLTkxMywyMyArOTQ3LDE5IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIC8vIGJhZCBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgaGludAorICAgICAgICAgICAgLy8gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIHRvbyBsb3cvaGlnaAorICAgICAgICAgICAgbVRTUGFyc2VyLmNsZWFyKCk7CiAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKICAgICAgICAgICAgIC8vIHJlYWNoZWQgc3RvcHBpbmcgcG9pbnQKLSAgICAgICAgICAgIHN0b3BBc3luYygvKiBzZWxmVHJpZ2dlcmVkID0gKi8gdHJ1ZSk7CisgICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKICAgICB9IHdoaWxlIChieXRlc1JlYWQgIT0gMCk7CiAKICAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoYnVmZmVyKSkgewpAQCAtOTgxLDcgKzEwMTEsMTYgQEAKIAogICAgIC8vIGJ1bGsgZXh0cmFjdCBub24tdHMgZmlsZXMKICAgICBpZiAodHNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgZXJyID0gZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoYnVmZmVyLCBpdGVtTWV0YSk7CisgICAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOworICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciB0b28gbG93L2hpZ2gKKyAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50CisgICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTk5NCw2ICsxMDMzLDY2IEBACiAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOwogfQogCitpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUoaW50NjRfdCBhbmNob3JUaW1lVXMpIGNvbnN0IHsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwKKyAgICAgICAgICAgIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7CisgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgfQorICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgbVBsYXlsaXN0LT5zaXplKCkgLSAxOworCisgICAgaW50MzJfdCBpbmRleCA9IG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgLSAxOworICAgIHdoaWxlIChpbmRleCA+PSAwICYmIGFuY2hvclRpbWVVcyA+IG1TdGFydFRpbWVVcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KGluZGV4LCBOVUxMIC8qIHVyaSAqLywgJml0ZW1NZXRhKSk7CisKKyAgICAgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgICAgIGFuY2hvclRpbWVVcyAtPSBpdGVtRHVyYXRpb25VczsKKyAgICAgICAgLS1pbmRleDsKKyAgICB9CisKKyAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4ICsgMTsKKyAgICBpZiAobmV3U2VxTnVtYmVyIDw9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CisgICAgICAgIHJldHVybiBuZXdTZXFOdW1iZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIH0KK30KKworaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkoc2l6ZV90IGRpc2NvbnRpbnVpdHlTZXEpIGNvbnN0IHsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKyAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAorICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKKyAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgY3VyRGlzY29udGludWl0eVNlcSA9IG1QbGF5bGlzdC0+Z2V0RGlzY29udGludWl0eVNlcSgpOworICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgY3VyRGlzY29udGludWl0eVNlcSkgeworICAgICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IDw9IDAgPyAwIDogKGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDEpOworICAgIH0KKworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgd2hpbGUgKGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCggaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKKworICAgICAgICBpbnQ2NF90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDY0KCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICBjdXJEaXNjb250aW51aXR5U2VxKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyRGlzY29udGludWl0eVNlcSA9PSBkaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICArK2luZGV4OworICAgIH0KKworICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBtUGxheWxpc3QtPnNpemUoKTsKK30KKwogaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0IHsKICAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKICAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTCB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigKQEAgLTEwMjYsNiArMTEyNSwyMyBAQAogICAgIHJldHVybiBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKIH0KIAorY29uc3Qgc3A8QUJ1ZmZlcj4gJlBsYXlsaXN0RmV0Y2hlcjo6c2V0QWNjZXNzVW5pdFByb3BlcnRpZXMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LCBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLCBib29sIGRpc2NhcmQpIHsKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZm9yIHNpbXBsaWNpdHksIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3JtYXQgaW4gZWFjaCB1bml0CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0T2JqZWN0KCJmb3JtYXQiLCBmb3JtYXQpOworICAgIH0KKworICAgIGlmIChkaXNjYXJkKSB7CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRpc2NhcmQiLCBkaXNjYXJkKTsKKyAgICB9CisKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgbURpc2NvbnRpbnVpdHlTZXEpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6ZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNGcm9tVHMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChtVFNQYXJzZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBVc2UgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUgc28gcHRzIGNhcnJ5IG92ZXIgYmV0d2VlbiBmZXRjaGVycy4KQEAgLTEwNDEsNyArMTE1Nyw5IEBACiAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfU0VFSywgZXh0cmEpOwogCisgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1OZXh0UFRTVGltZVVzOwogICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CkBAIC0xMTAxLDQzICsxMjE5LDEwOCBAQAogICAgICAgICAgICAgICAgICYmIHNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpID09IE9LKSB7CiAKICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBpZiAobU1pblN0YXJ0VGltZVVzID4gMCkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtTWluU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB1bnRlc3RlZCBwYXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSBhIGxhdGVyIHRzCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5jciA9IChtTWluU3RhcnRUaW1lVXMgLSB0aW1lVXMpIC8gMTAwMDAwMCAvIHRhcmdldER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5jciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgbVNlcU51bWJlciBieSBhdCBsZWFzdCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAxOworCisgICAgICAgICAgICBpZiAobVN0YXJ0dXApIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVVzIC09IG1GaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciArPSBpbmNyOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRUFHQUlOOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzTm90aWZ5ICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50NjQoa2V5LCAmc3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDY0KGtleSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU1hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSAmc3RyZWFtTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrIHw9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHVwIHRvIHRoZSBjbG9zZXN0IHByZWNlZGluZyBJRFIgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRpbWVVcyAlIiBQUklkNjQgIiB1cyA8IG1TdGFydFRpbWVVcyAlIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCBtU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ICA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBdmMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMICYmIGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0F2YyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjICYmIElzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtTWFzayA9PSBtU3RyZWFtVHlwZU1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMICYmIHRpbWVVcyA+IG1TdGFydFRpbWVVcykgeworCisgICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7CisgICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOworICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKKyAgICAgICAgICAgICAgICAvLyBtU3RhcnR1cAorICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0dXAgaXMgdHJ1ZSB1bnRpbCB3ZSBoYXZlIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsIHRoZSBzdHJlYW1zCisgICAgICAgICAgICAgICAgLy8gICB3ZSBhcmUgZmV0Y2hpbmcuIFdlIHF1ZXVlIHBhY2tldHMgd2hvc2UgdGltZXN0YW1wcyBhcmUgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgLy8gICBtU3RhcnRUaW1lVXMuCisgICAgICAgICAgICAgICAgLy8gbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgLy8gICBtU2VnbWVudFN0YXJ0VGltZVVzIGlzIG5vbi1uZWdhdGl2ZSB3aGVuIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MKKyAgICAgICAgICAgICAgICAvLyB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzOgorICAgICAgICAgICAgICAgIC8vICAgVGhpcyBhbmQgdGhlIDIgYWJvdmUgY29uZGl0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBhZGFwdGluZyBpbiBhIGxpdmUKKyAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbTsgdGhlIG9sZCBmZXRjaGVyIGhhcyBhbHJlYWR5IGZldGNoZWQgdG8gbVN0YXJ0VGltZVVzOyB0aGUgbmV3IGZldGNoZXIKKyAgICAgICAgICAgICAgICAvLyAgIHdvdWxkIHN0YXJ0IGZldGNoaW5nIGFmdGVyIHRpbWVVcywgd2hpY2ggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtU3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgLy8gICB0aGUgb2xkIGZldGNoZXIgd291bGQgdGhlbiBjb250aW51ZSBmZXRjaGluZyBkYXRhIHVudGlsIHRpbWVVcy4gV2UgZG9uJ3Qgd2FudAorICAgICAgICAgICAgICAgIC8vICAgdGltZVVzIHRvIGJlIHRvbyBmYXIgYWhlYWQgb2YgbVN0YXJ0VGltZVVzIGJlY2F1c2Ugd2Ugd2FudCB0aGUgb2xkIGZldGNoZXIgdG8KKyAgICAgICAgICAgICAgICAvLyAgIHN0b3AgYXMgZWFybHkgYXMgcG9zc2libGUuIFRoZSBkZWZpbml0aW9uIG9mIGJlaW5nICJ0b28gZmFyIGFoZWFkIiBpcworICAgICAgICAgICAgICAgIC8vICAgYXJiaXRyYXJ5OyBoZXJlIHdlIHVzZSB0YXJnZXREdXJhdGlvblVzIGFzIHRocmVzaG9sZC4KKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgZ3Vlc3NlZCBhIHN0YXJ0aW5nIHRpbWVzdGFtcCB0aGF0IGlzIHRvbyBoaWdoIHdoZW4gYWRhcHRpbmcgaW4gYQorICAgICAgICAgICAgICAgICAgICAvLyBsaXZlIHN0cmVhbTsgcmUtYWRqdXN0IGJhc2VkIG9uIHRoZSBhY3R1YWwgdGltZXN0YW1wIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzZWdtZW50OyBpZiB3ZSBkaWRuJ3QgbW92ZSBiYWNrd2FyZCBhZnRlciB0aGUgcmUtYWRqdXN0bWVudAorICAgICAgICAgICAgICAgICAgICAvLyAobmV3U2VxTnVtYmVyKSwgc3RhcnQgYXQgbGVhc3QgMSBzZWdtZW50IHByaW9yLgorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXFOdW1iZXIgPj0gbVNlcU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1tU2VxTnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IG5ld1NlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50MzJfdCBzZXE7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQ2NChrZXksICZzdGFydFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NChrZXksIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrIHw9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbU1hc2sgPT0gbVN0cmVhbVR5cGVNYXNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnR1cCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1TdG9wUGFyYW1zICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHlTZXE7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBzdG9wVGltZVVzOwotICAgICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKSB8fCB0aW1lVXMgPj0gc3RvcFRpbWVVcykgeworICAgICAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGlzY29udGludWl0eVNlcSA+IG1EaXNjb250aW51aXR5U2VxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NChrZXksICZzdG9wVGltZVVzKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGltZVVzID49IHN0b3BUaW1lVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayAmPSB+c3RyZWFtOwogICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5yZW1vdmVJdGVtc0F0KGkpOwpAQCAtMTE0NiwxNSArMTMyOSwxOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gTk9UIGRlcXVldWUgYW55IGRpc2NvbnRpbnVpdGllcyBleGNlcHQgZm9yIGZvcm1hdCBjaGFuZ2UuCi0KLSAgICAgICAgICAgIC8vIGZvciBzaW1wbGljaXR5LCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgZm9ybWF0IGluIGVhY2ggdW5pdAotICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldE9iamVjdCgiZm9ybWF0IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIGRpc2NhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgICAgICAgICB3aGlsZSAobVZpZGVvQnVmZmVyLT5oYXNCdWZmZXJBdmFpbGFibGUoJnN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdmlkZW9CdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJnZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModmlkZW9CdWZmZXIsIHNvdXJjZSwgZGlzY2FyZCk7CisgICAgICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHZpZGVvQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBzZXF1ZW5jZSBudW1iZXIgc28gd2UgY2FuIGhpbnQgZnV0dXJlIHBsYXlsaXN0IHdoZXJlIHRvIHN0YXJ0IGF0LgotICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigic2VxIiwgbVNlcU51bWJlcik7CisgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyhhY2Nlc3NVbml0LCBzb3VyY2UpOwogICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApAQCAtMTE4MCw5ICsxMzY2LDM1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvKiBzdGF0aWMgKi8KK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjpidWZmZXJTdGFydHNXaXRoV2ViVlRUTWFnaWNTZXF1ZW5jZSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNpemVfdCBwb3MgPSAwOworCisgICAgLy8gc2tpcCBwb3NzaWJsZSBCT00KKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPj0gcG9zICsgMyAmJgorICAgICAgICAgICAgIW1lbWNtcCgiXHhlZlx4YmJceGJmIiwgYnVmZmVyLT5kYXRhKCkgKyBwb3MsIDMpKSB7CisgICAgICAgIHBvcyArPSAzOworICAgIH0KKworICAgIC8vIGFjY2VwdCBXRUJWVFQgZm9sbG93ZWQgYnkgU1BBQ0UsIFRBQiBvciAoQ1IpIExGCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgcG9zICsgNiB8fAorICAgICAgICAgICAgbWVtY21wKCJXRUJWVFQiLCBidWZmZXItPmRhdGEoKSArIHBvcywgNikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb3MgKz0gNjsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSBwb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdWludDhfdCBzZXAgPSBidWZmZXItPmRhdGEoKVtwb3NdOworICAgIHJldHVybiBzZXAgPT0gJyAnIHx8IHNlcCA9PSAnXHQnIHx8IHNlcCA9PSAnXG4nIHx8IHNlcCA9PSAnXHInOworfQorCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBjb25zdCBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhKSB7Ci0gICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID49IDcgJiYgIW1lbWNtcCgiV0VCVlRUXG4iLCBidWZmZXItPmRhdGEoKSwgNykpIHsKKyAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoYnVmZmVyKSkgewogICAgICAgICBpZiAobVN0cmVhbVR5cGVNYXNrICE9IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgewogICAgICAgICAgICAgQUxPR0UoIlRoaXMgc3RyZWFtIG9ubHkgY29udGFpbnMgc3VidGl0bGVzLiIpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTExOTUsNyArMTQwNyw5IEBACiAgICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwotICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInNlcSIsIG1TZXFOdW1iZXIpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsIGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJzdWJ0aXRsZUdlbmVyYXRpb24iLCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKIAogICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChidWZmZXIpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xMjYxLDE0ICsxNDc1LDYgQEAKICAgICAgICAgZmlyc3RJRDNUYWcgPSBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7Ci0gICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgbUZpcnN0UFRTID0gUFRTOwotICAgIH0KLSAgICBQVFMgLT0gbUZpcnN0UFRTOwotCi0gICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsICsgbUFic29sdXRlVGltZUFuY2hvclVzOwotCiAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayAhPSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTykgewogICAgICAgICBBTE9HVygiVGhpcyBzdHJlYW0gb25seSBjb250YWlucyBhdWRpbyBkYXRhISIpOwogCkBAIC0xMzExLDYgKzE1MTcsMTIgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0socGFja2V0U291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCisgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwbGwpIC8gOWxsOworICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKKyAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOworICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CisgICAgfQorCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSBidWZmZXItPmRhdGEoKSArIG9mZnNldDsKQEAgLTEzMzUsMTkgKzE1NDcsNzAgQEAKIAogICAgICAgICBDSEVDS19MRShvZmZzZXQgKyBhYWNfZnJhbWVfbGVuZ3RoLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKGFhY19mcmFtZV9sZW5ndGgpOwotICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCBhZHRzSGVhZGVyLCBhYWNfZnJhbWVfbGVuZ3RoKTsKLQogICAgICAgICBpbnQ2NF90IHVuaXRUaW1lVXMgPSB0aW1lVXMgKyBudW1TYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKLSAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdW5pdFRpbWVVcyk7CisgICAgICAgIG9mZnNldCArPSBhYWNfZnJhbWVfbGVuZ3RoOwogCiAgICAgICAgIC8vIEVhY2ggQUFDIGZyYW1lIGVuY29kZXMgMTAyNCBzYW1wbGVzLgogICAgICAgICBudW1TYW1wbGVzICs9IDEwMjQ7CiAKLSAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigic2VxIiwgbVNlcU51bWJlcik7Ci0gICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KHVuaXQpOworICAgICAgICBpZiAobVN0YXJ0dXApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSB1bml0VGltZVVzOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgLT0gbUZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyAgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBvZmZzZXQgKz0gYWFjX2ZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOworICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisKKyAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGVkIGxvZ2ljIGZyb20gaG93IHdlIGhhbmRsZSAudHMgcGxheWxpc3RzLgorICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyAtIG1TdGFydFRpbWVVcyA+IHRhcmdldER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NCgidGltZVVzQXVkaW8iLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBRdWV1ZSBkaXNjb250aW51aXR5IGluIG9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKKyAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKKyAgICAgICAgICAgIGlmICghbVN0b3BQYXJhbXMtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZkaXNjb250aW51aXR5U2VxKQorICAgICAgICAgICAgICAgICAgICB8fCBkaXNjb250aW51aXR5U2VxID4gbURpc2NvbnRpbnVpdHlTZXEKKyAgICAgICAgICAgICAgICAgICAgfHwgIW1TdG9wUGFyYW1zLT5maW5kSW50NjQoInRpbWVVc0F1ZGlvIiwgJnN0b3BUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgIHx8IChkaXNjb250aW51aXR5U2VxID09IG1EaXNjb250aW51aXR5U2VxICYmIHVuaXRUaW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOworICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayA9IDA7CisgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKGFhY19mcmFtZV9sZW5ndGgpOworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCBhZHRzSGVhZGVyLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKworICAgICAgICB1bml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB1bml0VGltZVVzKTsKKyAgICAgICAgc2V0QWNjZXNzVW5pdFByb3BlcnRpZXModW5pdCwgcGFja2V0U291cmNlKTsKKyAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQodW5pdCk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCA3ZTIxNTIzLi43OGMzNThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtNDksNyArNDksOCBAQAogICAgIFBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgY29uc3Qgc3A8TGl2ZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGdldERhdGFTb3VyY2UoKTsKIApAQCAtNTcsMTYgKzU4LDIyIEBACiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXVkaW9Tb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmdmlkZW9Tb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc3VidGl0bGVTb3VyY2UsCi0gICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTFsbCwKLSAgICAgICAgICAgIGludDY0X3QgbWluU3RhcnRUaW1lVXMgPSAwbGwgLyogc3RhcnQgYWZ0ZXIgdGhpcyB0aW1lc3RhbXAgKi8sCi0gICAgICAgICAgICBpbnQzMl90IHN0YXJ0U2VxTnVtYmVySGludCA9IC0xIC8qIHRyeSBzdGFydGluZyBhdCB0aGlzIHNlcXVlbmNlIG51bWJlciAqLyk7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTFsbCwgICAgICAgICAvLyBzdGFydGluZyB0aW1lc3RhbXBzCisgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGwsIC8vIHN0YXJ0aW5nIHBvc2l0aW9uIHdpdGhpbiBwbGF5bGlzdAorICAgICAgICAgICAgLy8gc3RhcnRUaW1lVXMhPXNlZ21lbnRTdGFydFRpbWVVcyBvbmx5IHdoZW4gcGxheWxpc3QgaXMgbGl2ZQorICAgICAgICAgICAgaW50MzJfdCBzdGFydERpc2NvbnRpbnVpdHlTZXEgPSAwLAorICAgICAgICAgICAgYm9vbCBhZGFwdGl2ZSA9IGZhbHNlKTsKIAogICAgIHZvaWQgcGF1c2VBc3luYygpOwogCi0gICAgdm9pZCBzdG9wQXN5bmMoYm9vbCBzZWxmVHJpZ2dlcmVkID0gZmFsc2UpOworICAgIHZvaWQgc3RvcEFzeW5jKGJvb2wgY2xlYXIgPSB0cnVlKTsKIAogICAgIHZvaWQgcmVzdW1lVW50aWxBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKKyAgICB1aW50MzJfdCBnZXRTdHJlYW1UeXBlTWFzaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlTWFzazsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5QbGF5bGlzdEZldGNoZXIoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtOTEsNiArOTgsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1Ta2lwRnJhbWVzOwogCiAgICAgc3RhdGljIGJvb2wgYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7CisgICAgc3RhdGljIGJvb2wgYnVmZmVyU3RhcnRzV2l0aFdlYlZUVE1hZ2ljU2VxdWVuY2UoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcik7CiAKICAgICAvLyBub3RpZmljYXRpb25zIHRvIG1TZXNzaW9uCiAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CkBAIC0xMDEsNyArMTA5LDE0IEBACiAKICAgICB1aW50MzJfdCBtU3RyZWFtVHlwZU1hc2s7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7Ci0gICAgaW50NjRfdCBtTWluU3RhcnRUaW1lVXM7IC8vIHN0YXJ0IGZldGNoaW5nIG5vIGVhcmxpZXIgdGhhbiB0aGlzIHZhbHVlCisKKyAgICAvLyBTdGFydCB0aW1lIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IHNlZ21lbnQgaW4gdGhlIGluaXRpYWwKKyAgICAvLyBwbGF5bGlzdC4gSXQncyB2YWx1ZSBpcyBpbml0aWFsaXplZCB0byBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBvbmx5IHdoZW4gd2UgYXJlCisgICAgLy8gYWRhcHRpbmcgb3Igc3dpdGNoaW5nIHRyYWNrcy4KKyAgICBpbnQ2NF90IG1TZWdtZW50U3RhcnRUaW1lVXM7CisKKyAgICBzc2l6ZV90IG1EaXNjb250aW51aXR5U2VxOworICAgIGJvb2wgbVN0YXJ0VGltZVVzUmVsYXRpdmU7CiAgICAgc3A8QU1lc3NhZ2U+IG1TdG9wUGFyYW1zOyAvLyBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCB0aW1lc3RhbXBzIHdlIHNob3VsZCBmZXRjaC4KIAogICAgIEtleWVkVmVjdG9yPExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+CkBAIC0xMTQsMTAgKzEyOSwxMiBAQAogICAgIGludDMyX3QgbVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1SZXRyaWVzOwogICAgIGJvb2wgbVN0YXJ0dXA7CisgICAgYm9vbCBtQWRhcHRpdmU7CiAgICAgYm9vbCBtUHJlcGFyZWQ7CiAgICAgaW50NjRfdCBtTmV4dFBUU1RpbWVVczsKIAogICAgIGludDMyX3QgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb247CisgICAgY29uc3QgaW50MzJfdCBtU3VidGl0bGVHZW5lcmF0aW9uOwogCiAgICAgZW51bSBSZWZyZXNoU3RhdGUgewogICAgICAgICBJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZLApAQCAtMTMzLDcgKzE1MCw5IEBACiAKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwogICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKKyAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKICAgICBpbnQ2NF90IG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9CdWZmZXI7CiAKICAgICAvLyBTdG9yZXMgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB0byBkZWNyeXB0IHRoZSBuZXh0IGJsb2NrIG9mIGNpcGhlciB0ZXh0LCB3aGljaCBjYW4KICAgICAvLyBlaXRoZXIgYmUgZGVyaXZlZCBmcm9tIHRoZSBzZXF1ZW5jZSBudW1iZXIsIHJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIG9yIGNvcGllZCBmcm9tCkBAIC0xNzIsNiArMTkxLDEwIEBACiAgICAgLy8gUmVzdW1lIGEgZmV0Y2hlciB0byBjb250aW51ZSB1bnRpbCB0aGUgc3RvcHBpbmcgcG9pbnQgc3RvcmVkIGluIG1zZy4KICAgICBzdGF0dXNfdCBvblJlc3VtZVVudGlsKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAorICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzZXRBY2Nlc3NVbml0UHJvcGVydGllcygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LAorICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGJvb2wgZGlzY2FyZCA9IGZhbHNlKTsKICAgICBzdGF0dXNfdCBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKApAQCAtMTgyLDYgKzIwNSw4IEBACiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwogCisgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShpbnQ2NF90IGFuY2hvclRpbWVVcykgY29uc3Q7CisgICAgaW50MzJfdCBnZXRTZXFOdW1iZXJGb3JEaXNjb250aW51aXR5KHNpemVfdCBkaXNjb250aW51aXR5U2VxKSBjb25zdDsKICAgICBpbnQzMl90IGdldFNlcU51bWJlckZvclRpbWUoaW50NjRfdCB0aW1lVXMpIGNvbnN0OwogCiAgICAgdm9pZCB1cGRhdGVEdXJhdGlvbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCBiZjZmN2JiLi4yMTk0YzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtNCw2ICs0LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJSUQzLmNwcAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfaWQzCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKQEAgLTE1LDYgKzE3LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJdGVzdGlkMy5jcHAKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlic3RhZ2VmcmlnaHQgbGlidXRpbHMgbGlibG9nIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggYjI1ZmM0ZC4uYjFiNzYxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTQxLDkgKzQxLDkgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBvZmY2NF90IGF2YWlsYWJsZSA9IChvZmZzZXQgPj0gbVNpemUpID8gMGxsIDogbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIG9mZjY0X3QgYXZhaWxhYmxlID0gKG9mZnNldCA+PSAob2ZmNjRfdCltU2l6ZSkgPyAwbGwgOiBtU2l6ZSAtIG9mZnNldDsKIAotICAgICAgICBzaXplX3QgY29weSA9IChhdmFpbGFibGUgPiBzaXplKSA/IHNpemUgOiBhdmFpbGFibGU7CisgICAgICAgIHNpemVfdCBjb3B5ID0gKGF2YWlsYWJsZSA+IChvZmY2NF90KXNpemUpID8gc2l6ZSA6IGF2YWlsYWJsZTsKICAgICAgICAgbWVtY3B5KGRhdGEsIG1EYXRhICsgb2Zmc2V0LCBjb3B5KTsKIAogICAgICAgICByZXR1cm4gY29weTsKQEAgLTc3LDcgKzc3LDEwIEBACiAgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKICAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKICAgICAgIG1SYXdTaXplKDApIHsKLSAgICBzcDxNZW1vcnlTb3VyY2U+IHNvdXJjZSA9IG5ldyBNZW1vcnlTb3VyY2UoZGF0YSwgc2l6ZSk7CisgICAgc3A8TWVtb3J5U291cmNlPiBzb3VyY2UgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVtb3J5U291cmNlKGRhdGEsIHNpemUpOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKICAgICBtSXNWYWxpZCA9IHBhcnNlVjIoc291cmNlLCAwKTsKIApAQCAtMTcyLDcgKzE3NSw3IEBACiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBrTWF4TWV0YWRhdGFTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJza2lwcGluZyBodWdlIElEMyBtZXRhZGF0YSBvZiBzaXplICVkIiwgc2l6ZSk7CisgICAgICAgIEFMT0dFKCJza2lwcGluZyBodWdlIElEMyBtZXRhZGF0YSBvZiBzaXplICV6dSIsIHNpemUpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC00ODgsNDkgKzQ5MSw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0SVNPODg1OVRvU3RyaW5nOCgKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIFN0cmluZzggKnMpIHsKLSAgICBzaXplX3QgdXRmOGxlbiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1wwJykgewotICAgICAgICAgICAgc2l6ZSA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChkYXRhW2ldIDwgMHg4MCkgewotICAgICAgICAgICAgKyt1dGY4bGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXRmOGxlbiArPSAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHV0ZjhsZW4gPT0gc2l6ZSkgewotICAgICAgICAvLyBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgcHJlc2VudC4KLQotICAgICAgICBzLT5zZXRUbygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2hhciAqdG1wID0gbmV3IGNoYXJbdXRmOGxlbl07Ci0gICAgY2hhciAqcHRyID0gdG1wOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIGlmIChkYXRhW2ldID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweDgwKSB7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldOwotICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaV0gPCAweGMwKSB7Ci0gICAgICAgICAgICAqcHRyKysgPSAweGMyOwotICAgICAgICAgICAgKnB0cisrID0gZGF0YVtpXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4YzM7Ci0gICAgICAgICAgICAqcHRyKysgPSBkYXRhW2ldIC0gNjQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzLT5zZXRUbyh0bXAsIHV0ZjhsZW4pOwotCi0gICAgZGVsZXRlW10gdG1wOwotICAgIHRtcCA9IE5VTEw7Ci19CiAKIC8vIHRoZSAybmQgYXJndW1lbnQgaXMgdXNlZCB0byBnZXQgdGhlIGRhdGEgZm9sbG93aW5nIHRoZSBcMCBpbiBhIGNvbW1lbnQgZmllbGQKIHZvaWQgSUQzOjpJdGVyYXRvcjo6Z2V0U3RyaW5nKFN0cmluZzggKmlkLCBTdHJpbmc4ICpjb21tZW50KSBjb25zdCB7CkBAIC01NjMsNyArNTIzLDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KGZyYW1lRGF0YSwgbUZyYW1lU2l6ZSwgaWQpOworICAgICAgICAvLyB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIElTTy04ODU5LTEsIGJ1dCBwYXNzIGl0IHVwIGFzLWlzIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGZpZ3VyZQorICAgICAgICAvLyBvdXQgdGhlIHJlYWwgZW5jb2RpbmcKKyAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyKilmcmFtZURhdGEsIG1GcmFtZVNpemUpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01ODMsNDkgKzU0NSw5MyBAQAogICAgICAgICBuIC09IHNraXBwZWQ7CiAgICAgfQogCisgICAgaWYgKG4gPD0gMCkgeworICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoZW5jb2RpbmcgPT0gMHgwMCkgewotICAgICAgICAvLyBJU08gODg1OS0xCi0gICAgICAgIGNvbnZlcnRJU084ODU5VG9TdHJpbmc4KGZyYW1lRGF0YSArIDEsIG4sIGlkKTsKKyAgICAgICAgLy8gc3VwcG9zZWRseSBJU08gODg1OS0xCisgICAgICAgIGlkLT5zZXRUbygoY29uc3QgY2hhciopZnJhbWVEYXRhICsgMSwgbik7CiAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAweDAzKSB7Ci0gICAgICAgIC8vIFVURi04CisgICAgICAgIC8vIHN1cHBvc2VkbHkgVVRGLTgKICAgICAgICAgaWQtPnNldFRvKChjb25zdCBjaGFyICopKGZyYW1lRGF0YSArIDEpLCBuKTsKICAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDB4MDIpIHsKLSAgICAgICAgLy8gVVRGLTE2IEJFLCBubyBieXRlIG9yZGVyIG1hcmsuCisgICAgICAgIC8vIHN1cHBvc2VkbHkgVVRGLTE2IEJFLCBubyBieXRlIG9yZGVyIG1hcmsuCiAgICAgICAgIC8vIEFQSSB3YW50cyBudW1iZXIgb2YgY2hhcmFjdGVycywgbm90IG51bWJlciBvZiBieXRlcy4uLgogICAgICAgICBpbnQgbGVuID0gbiAvIDI7CiAgICAgICAgIGNvbnN0IGNoYXIxNl90ICpmcmFtZWRhdGEgPSAoY29uc3QgY2hhcjE2X3QgKikgKGZyYW1lRGF0YSArIDEpOwogICAgICAgICBjaGFyMTZfdCAqZnJhbWVkYXRhY29weSA9IE5VTEw7CiAjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCi0gICAgICAgIGZyYW1lZGF0YWNvcHkgPSBuZXcgY2hhcjE2X3RbbGVuXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgZnJhbWVkYXRhY29weVtpXSA9IGJzd2FwXzE2KGZyYW1lZGF0YVtpXSk7CisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBmcmFtZWRhdGFjb3B5ID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXIxNl90W2xlbl07CisgICAgICAgICAgICBpZiAoZnJhbWVkYXRhY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGZyYW1lZGF0YWNvcHlbaV0gPSBic3dhcF8xNihmcmFtZWRhdGFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWVkYXRhID0gZnJhbWVkYXRhY29weTsKICAgICAgICAgfQotICAgICAgICBmcmFtZWRhdGEgPSBmcmFtZWRhdGFjb3B5OwogI2VuZGlmCiAgICAgICAgIGlkLT5zZXRUbyhmcmFtZWRhdGEsIGxlbik7CiAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZVtdIGZyYW1lZGF0YWNvcHk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT0gMHgwMSkgewogICAgICAgICAvLyBVQ1MtMgogICAgICAgICAvLyBBUEkgd2FudHMgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBudW1iZXIgb2YgYnl0ZXMuLi4KICAgICAgICAgaW50IGxlbiA9IG4gLyAyOwogICAgICAgICBjb25zdCBjaGFyMTZfdCAqZnJhbWVkYXRhID0gKGNvbnN0IGNoYXIxNl90ICopIChmcmFtZURhdGEgKyAxKTsKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YWNvcHkgPSBOVUxMOwogICAgICAgICBpZiAoKmZyYW1lZGF0YSA9PSAweGZmZmUpIHsKLSAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MgbWFya2VyIGRvZXNuJ3QgbWF0Y2ggaG9zdCBlbmRpYW5uZXNzLCBjb252ZXJ0Ci0gICAgICAgICAgICBmcmFtZWRhdGFjb3B5ID0gbmV3IGNoYXIxNl90W2xlbl07CisgICAgICAgICAgICAvLyBlbmRpYW5uZXNzIG1hcmtlciAhPSBob3N0IGVuZGlhbm5lc3MsIGNvbnZlcnQgJiBza2lwCisgICAgICAgICAgICBpZiAobGVuIDw9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgLy8gbm90aGluZyBhZnRlciB0aGUgbWFya2VyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZWRhdGFjb3B5ID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXIxNl90W2xlbl07CisgICAgICAgICAgICBpZiAoZnJhbWVkYXRhY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgIGZyYW1lZGF0YWNvcHlbaV0gPSBic3dhcF8xNihmcmFtZWRhdGFbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZnJhbWVkYXRhID0gZnJhbWVkYXRhY29weTsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGFuIGVuZGlhbm5lc3MgbWFya2VyLCBza2lwIGl0Ci0gICAgICAgIGlmICgqZnJhbWVkYXRhID09IDB4ZmVmZikgeworICAgICAgICAgICAgLy8gYW5kIHNraXAgb3ZlciB0aGUgbWFya2VyCisgICAgICAgICAgICBmcmFtZWRhdGErKzsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9IGVsc2UgaWYgKCpmcmFtZWRhdGEgPT0gMHhmZWZmKSB7CisgICAgICAgICAgICAvLyBlbmRpYW5uZXNzIG1hcmtlciA9PSBob3N0IGVuZGlhbm5lc3MsIHNraXAgaXQKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAvLyBub3RoaW5nIGFmdGVyIHRoZSBtYXJrZXIKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZyYW1lZGF0YSsrOwogICAgICAgICAgICAgbGVuLS07CiAgICAgICAgIH0KLSAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgcmVzdWx0aW5nIGRhdGEgY29uc2lzdHMgZW50aXJlbHkgb2YgOC1iaXQgdmFsdWVzCisgICAgICAgIGJvb2wgZWlnaHRCaXQgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVkYXRhW2ldID4gMHhmZikgeworICAgICAgICAgICAgICAgIGVpZ2h0Qml0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVpZ2h0Qml0KSB7CisgICAgICAgICAgICAvLyBjb2xsYXBzZSB0byA4IGJpdCwgdGhlbiBsZXQgdGhlIG1lZGlhIHNjYW5uZXIgY2xpZW50IGZpZ3VyZSBvdXQgdGhlIHJlYWwgZW5jb2RpbmcKKyAgICAgICAgICAgIGNoYXIgKmZyYW1lOCA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW2xlbl07CisgICAgICAgICAgICBpZiAoZnJhbWU4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lOFtpXSA9IGZyYW1lZGF0YVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWQtPnNldFRvKGZyYW1lOCwgbGVuKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gZnJhbWU4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZC0+c2V0VG8oZnJhbWVkYXRhLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWQtPnNldFRvKGZyYW1lZGF0YSwgbGVuKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChmcmFtZWRhdGFjb3B5ICE9IE5VTEwpIHsKICAgICAgICAgICAgIGRlbGV0ZVtdIGZyYW1lZGF0YWNvcHk7CiAgICAgICAgIH0KQEAgLTY4Miw4ICs2ODgsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobU9mZnNldCArIG1GcmFtZVNpemUgPiBtUGFyZW50Lm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICVkIChzaXplID0gJWQsIGJ5dGVzLXJlbWFpbmluZyA9ICVkKSIsCi0gICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtRnJhbWVTaXplLCBtUGFyZW50Lm1TaXplIC0gbU9mZnNldCAtIDYpOworICAgICAgICAgICAgICAgIEFMT0dWKCJwYXJ0aWFsIGZyYW1lIGF0IG9mZnNldCAlenUgKHNpemUgPSAlenUsIGJ5dGVzLXJlbWFpbmluZyA9ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0LCBtRnJhbWVTaXplLCBtUGFyZW50Lm1TaXplIC0gbU9mZnNldCAtIChzaXplX3QpNik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC03MzcsOCArNzQzLDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1PZmZzZXQgKyBtRnJhbWVTaXplID4gbVBhcmVudC5tU2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJwYXJ0aWFsIGZyYW1lIGF0IG9mZnNldCAlZCAoc2l6ZSA9ICVkLCBieXRlcy1yZW1haW5pbmcgPSAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUZyYW1lU2l6ZSwgbVBhcmVudC5tU2l6ZSAtIG1PZmZzZXQgLSAxMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInBhcnRpYWwgZnJhbWUgYXQgb2Zmc2V0ICV6dSAoc2l6ZSA9ICV6dSwgYnl0ZXMtcmVtYWluaW5nID0gJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIG1PZmZzZXQsIG1GcmFtZVNpemUsIG1QYXJlbnQubVNpemUgLSBtT2Zmc2V0IC0gKHNpemVfdCkxMCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKaW5kZXggYmM0NTcyYy4uYjJmNDE4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcApAQCAtMzMsNyArMzMsNyBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIHByaW50ZigiMHglMDR4ICAiLCBvZmZzZXQpOworICAgICAgICBwcmludGYoIjB4JTA0enggICIsIG9mZnNldCk7CiAKICAgICAgICAgc2l6ZV90IG4gPSBzaXplIC0gb2Zmc2V0OwogICAgICAgICBpZiAobiA+IDE2KSB7CkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IHRhZy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKIAogICAgICAgICBpZiAoZGF0YSkgewotICAgICAgICAgICAgcHJpbnRmKCJmb3VuZCBhbGJ1bSBhcnQ6IHNpemU9JWQgbWltZT0nJXMnXG4iLCBkYXRhU2l6ZSwKKyAgICAgICAgICAgIHByaW50ZigiZm91bmQgYWxidW0gYXJ0OiBzaXplPSV6dSBtaW1lPSclcydcbiIsIGRhdGFTaXplLAogICAgICAgICAgICAgICAgICAgIG1pbWUuc3RyaW5nKCkpOwogCiAgICAgICAgICAgICBoZXhkdW1wKGRhdGEsIGRhdGFTaXplID4gMTI4ID8gMTI4IDogZGF0YVNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCAyNzFkZjhlLi43N2Q2NWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtMzIsNiArMzIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQXVkaW9QbGF5ZXI7CitzdHJ1Y3QgQ2xvY2tFc3RpbWF0b3I7CiBzdHJ1Y3QgRGF0YVNvdXJjZTsKIHN0cnVjdCBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUV4dHJhY3RvcjsKQEAgLTYzLDYgKzY0LDcgQEAKICAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwpOwogCkBAIC0xNTksNiArMTYxLDcgQEAKICAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwogICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOwogCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBTdHJpbmc4IG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CiAKQEAgLTIzNCw2ICsyMzcsNyBAQAogCiAgICAgTWVkaWFCdWZmZXIgKm1WaWRlb0J1ZmZlcjsKIAorICAgIHNwPENsb2NrRXN0aW1hdG9yPiBtQ2xvY2tFc3RpbWF0b3I7CiAgICAgc3A8SFRUUEJhc2U+IG1Db25uZWN0aW5nRGF0YVNvdXJjZTsKICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CiAKQEAgLTI0Nyw2ICsyNTEsNyBAQAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKQEAgLTI5Myw2ICsyOTgsNyBAQAogCiAgICAgYm9vbCBnZXRCaXRyYXRlKGludDY0X3QgKmJpdHJhdGUpOwogCisgICAgaW50NjRfdCBlc3RpbWF0ZVJlYWxUaW1lVXMoVGltZVNvdXJjZSAqdHMsIGludDY0X3Qgc3lzdGVtVGltZVVzKTsKICAgICB2b2lkIGZpbmlzaFNlZWtJZk5lY2Vzc2FyeShpbnQ2NF90IHZpZGVvVGltZVVzKTsKICAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTg4ZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0hST01FX0hUVFBfREFUQV9TT1VSQ0VfSF8KLQotI2RlZmluZSBDSFJPTUVfSFRUUF9EQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2ZEZWxlZ2F0ZTsKLQotc3RydWN0IENocm9taXVtSFRUUERhdGFTb3VyY2UgOiBwdWJsaWMgSFRUUEJhc2UgewotICAgIENocm9taXVtSFRUUERhdGFTb3VyY2UodWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKLQotICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DaHJvbWl1bUhUVFBEYXRhU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBTZkRlbGVnYXRlOwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIERJU0NPTk5FQ1RFRCwKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVELAotICAgICAgICBSRUFESU5HLAotICAgICAgICBESVNDT05ORUNUSU5HCi0gICAgfTsKLQotICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBTdGF0ZSBtU3RhdGU7Ci0KLSAgICBTZkRlbGVnYXRlICptRGVsZWdhdGU7Ci0KLSAgICBBU3RyaW5nIG1VUkk7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUhlYWRlcnM7Ci0KLSAgICBvZmY2NF90IG1DdXJyZW50T2Zmc2V0OwotCi0gICAgLy8gQW55IGNvbm5lY3Rpb24gZXJyb3Igb3IgdGhlIHJlc3VsdCBvZiBhIHJlYWQgb3BlcmF0aW9uCi0gICAgLy8gKGZvciB0aGUgbGF0dHRlciB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgaWYgc3VjY2Vzc2Z1bCkuCi0gICAgc3NpemVfdCBtSU9SZXN1bHQ7Ci0KLSAgICBpbnQ2NF90IG1Db250ZW50U2l6ZTsKLQotICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOwotCi0gICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7Ci0gICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdF9sKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBJbml0aWF0ZVJlYWQoCi0gICAgICAgICAgICBDaHJvbWl1bUhUVFBEYXRhU291cmNlICptZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBpbml0aWF0ZVJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgKLSAgICAgICAgICAgIGludDY0X3QgY29udGVudFNpemUsIGNvbnN0IGNoYXIgKmNvbnRlbnRUeXBlKTsKLQotICAgIHZvaWQgb25Db25uZWN0aW9uRmFpbGVkKHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBvblJlYWRDb21wbGV0ZWQoc3NpemVfdCBzaXplKTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdENvbXBsZXRlKCk7Ci0gICAgdm9pZCBvblJlZGlyZWN0KGNvbnN0IGNoYXIgKnVybCk7Ci0KLSAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIENIUk9NRV9IVFRQX0RBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYWdtZW50ZWRNUDRQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmUwMmI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBBUlNFUl9IXwotCi0jZGVmaW5lIFBBUlNFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIHN0cnVjdCBTb3VyY2UgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIFNvdXJjZSgpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLSAgICAgICAgdmlydHVhbCBib29sIGlzU2Vla2FibGUoKSA9IDA7Ci0KLSAgICAgICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQotCi0gICAgICAgIHByaXZhdGU6Ci0gICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZSk7Ci0gICAgfTsKLQotICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIoKTsKLQotICAgIHZvaWQgc3RhcnQoY29uc3QgY2hhciAqZmlsZW5hbWUpOwotICAgIHZvaWQgc3RhcnQoY29uc3Qgc3A8U291cmNlPiAmc291cmNlKTsKLSAgICB2b2lkIHN0YXJ0KHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvLCBib29sIHN5bmNocm9ub3VzID0gZmFsc2UpOwotICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0LCBib29sIHN5bmNocm9ub3VzID0gZmFsc2UpOwotICAgIHN0YXR1c190IHNlZWtUbyhib29sIGF1ZGlvLCBpbnQ2NF90IHRpbWVVcyk7Ci0gICAgYm9vbCBpc1NlZWthYmxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RnJhZ21lbnRlZE1QNFBhcnNlcigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdFN0YXJ0LAotICAgICAgICBrV2hhdFByb2NlZWQsCi0gICAgICAgIGtXaGF0UmVhZE1vcmUsCi0gICAgICAgIGtXaGF0R2V0Rm9ybWF0LAotICAgICAgICBrV2hhdERlcXVldWVBY2Nlc3NVbml0LAotICAgICAgICBrV2hhdFNlZWtUbywKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrRnJhZ21lbnQ7Ci0gICAgc3RydWN0IER5bmFtaWNUcmFja0ZyYWdtZW50OwotICAgIHN0cnVjdCBTdGF0aWNUcmFja0ZyYWdtZW50OwotCi0gICAgc3RydWN0IERpc3BhdGNoRW50cnkgewotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgdWludDMyX3QgbVBhcmVudFR5cGU7Ci0gICAgICAgIHN0YXR1c190IChGcmFnbWVudGVkTVA0UGFyc2VyOjoqbUhhbmRsZXIpKHVpbnQzMl90LCBzaXplX3QsIHVpbnQ2NF90KTsKLSAgICB9OwotCi0gICAgc3RydWN0IENvbnRhaW5lciB7Ci0gICAgICAgIHVpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgICAgIHVpbnQ2NF90IG1CeXRlc1JlbWFpbmluZzsKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIGJvb2wgbUV4dGVuZHNUb0VPRjsKLSAgICB9OwotCi0gICAgc3RydWN0IFNhbXBsZURlc2NyaXB0aW9uIHsKLSAgICAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgICAgIHVpbnQxNl90IG1EYXRhUmVmSW5kZXg7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBTYW1wbGVJbmZvIHsKLSAgICAgICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgICAgICBzaXplX3QgbVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1QcmVzZW50YXRpb25UaW1lOwotICAgICAgICBzaXplX3QgbVNhbXBsZURlc2NJbmRleDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTWVkaWFEYXRhSW5mbyB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICB9OwotCi0gICAgc3RydWN0IFNpZHhFbnRyeSB7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbUR1cmF0aW9uVXM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFja0luZm8gewotICAgICAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgICAgIGtUcmFja0VuYWJsZWQgICAgID0gMHgwMSwKLSAgICAgICAgICAgIGtUcmFja0luTW92aWUgICAgID0gMHgwMiwKLSAgICAgICAgICAgIGtUcmFja0luUHJldmlldyAgID0gMHgwNCwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICB1aW50MzJfdCBtRHVyYXRpb247ICAvLyBUaGlzIGlzIHRoZSBkdXJhdGlvbiBpbiB0ZXJtcyBvZiBtb3ZpZSB0aW1lc2NhbGUhCi0gICAgICAgIHVpbnQ2NF90IG1TaWR4RHVyYXRpb247IC8vIHVzZWMsIGZyb20gc2lkeCBib3gsIHdoaWNoIGNhbiB1c2UgYSBkaWZmZXJlbnQgdGltZXNjYWxlCi0KLSAgICAgICAgdWludDMyX3QgbU1lZGlhVGltZVNjYWxlOwotCi0gICAgICAgIHVpbnQzMl90IG1NZWRpYUhhbmRsZXJUeXBlOwotICAgICAgICBWZWN0b3I8U2FtcGxlRGVzY3JpcHRpb24+IG1TYW1wbGVEZXNjczsKLQotICAgICAgICAvLyBmcm9tIHRyYWNrIGV4dGVuZHM6Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUZsYWdzOwotCi0gICAgICAgIHVpbnQzMl90IG1EZWNvZGluZ1RpbWU7Ci0KLSAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHg7Ci0gICAgICAgIHNwPFN0YXRpY1RyYWNrRnJhZ21lbnQ+IG1TdGF0aWNGcmFnbWVudDsKLSAgICAgICAgTGlzdDxzcDxUcmFja0ZyYWdtZW50PiA+IG1GcmFnbWVudHM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7Ci0gICAgICAgIGVudW0gRmxhZ3MgewotICAgICAgICAgICAga0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCAgICAgICAgID0gMHgwMSwKLSAgICAgICAgICAgIGtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCA9IDB4MDIsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCAgPSAweDA4LAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCAgICAgID0gMHgxMCwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50ICAgICA9IDB4MjAsCi0gICAgICAgICAgICBrRHVyYXRpb25Jc0VtcHR5ICAgICAgICAgICAgICAgPSAweDEwMDAwLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1UcmFja0lEOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHVpbnQ2NF90IG1CYXNlRGF0YU9mZnNldDsKLSAgICAgICAgdWludDMyX3QgbVNhbXBsZURlc2NyaXB0aW9uSW5kZXg7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICAgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVGbGFnczsKLQotICAgICAgICB1aW50NjRfdCBtRGF0YU9mZnNldDsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IERpc3BhdGNoRW50cnkga0Rpc3BhdGNoVGFibGVbXTsKLQotICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKLSAgICBvZmZfdCBtQnVmZmVyUG9zOwotICAgIGJvb2wgbVN1c3BlbmRlZDsKLSAgICBib29sIG1Eb25lV2l0aE1vb3Y7Ci0gICAgb2ZmX3QgbUZpcnN0TW9vZk9mZnNldDsgLy8gdXNlZCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIG9mZnNldHMgY2FsY3VsYXRlZCBmcm9tIHRoZSBzaWR4IGJveAotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgVmVjdG9yPENvbnRhaW5lcj4gbVN0YWNrOwotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBUcmFja0luZm8+IG1UcmFja3M7ICAvLyBUcmFja0luZm8gYnkgdHJhY2tJRAotICAgIFZlY3RvcjxNZWRpYURhdGFJbmZvPiBtTWVkaWFEYXRhOwotCi0gICAgdWludDMyX3QgbUN1cnJlbnRUcmFja0lEOwotCi0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotCi0gICAgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOwotCi0gICAgc3RhdHVzX3Qgb25Qcm9jZWVkKCk7Ci0gICAgc3RhdHVzX3Qgb25EZXF1ZXVlQWNjZXNzVW5pdChzaXplX3QgdHJhY2tJbmRleCwgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwotICAgIHN0YXR1c190IG9uU2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHBvc2l0aW9uKTsKLQotICAgIHZvaWQgZW50ZXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90IHR5cGUsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgdWludDE2X3QgcmVhZFUxNihzaXplX3Qgb2Zmc2V0KTsKLSAgICB1aW50MzJfdCByZWFkVTMyKHNpemVfdCBvZmZzZXQpOwotICAgIHVpbnQ2NF90IHJlYWRVNjQoc2l6ZV90IG9mZnNldCk7Ci0gICAgdm9pZCBza2lwKG9mZl90IGRpc3RhbmNlKTsKLSAgICBzdGF0dXNfdCBuZWVkKHNpemVfdCBzaXplKTsKLSAgICBib29sIGZpdHNDb250YWluZXIodWludDY0X3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVRyYWNrSGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhSGVhZGVyKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZU1lZGlhSGFuZGxlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0V4dGVuZHMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50UnVuKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVZpc3VhbFNhbXBsZUVudHJ5KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUF1ZGlvU2FtcGxlRW50cnkoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ29tcGFjdFNhbXBsZVNpemVzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rT2Zmc2V0czY0KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VNZWRpYURhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlU2VnbWVudEluZGV4KAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBUcmFja0luZm8gKmVkaXRUcmFjayh1aW50MzJfdCB0cmFja0lELCBib29sIGNyZWF0ZUlmTmVjZXNzYXJ5ID0gZmFsc2UpOwotCi0gICAgc3NpemVfdCBmaW5kVHJhY2soYm9vbCB3YW50QXVkaW8pIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgbWFrZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBUcmFja0luZm8gKmluZm8sCi0gICAgICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsCi0gICAgICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbywKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotICAgIHN0YXR1c190IGdldFNhbXBsZSgKLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbywKLSAgICAgICAgICAgIHNwPFRyYWNrRnJhZ21lbnQ+ICpmcmFnbWVudCwKLSAgICAgICAgICAgIFNhbXBsZUluZm8gKnNhbXBsZUluZm8pOwotCi0gICAgc3RhdGljIGludCBDb21wYXJlU2FtcGxlTG9jYXRpb24oCi0gICAgICAgIGNvbnN0IFNhbXBsZUluZm8gJnNhbXBsZSwgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8pOwotCi0gICAgdm9pZCByZXN1bWVJZk5lY2Vzc2FyeSgpOwotCi0gICAgdm9pZCBjb3B5QnVmZmVyKAotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKmRzdCwKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIGNvbnN0OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRnJhZ21lbnRlZE1QNFBhcnNlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFBBUlNFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKaW5kZXggZDRiN2Y5Zi4uMWMzY2Q1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApAQCAtNDgsMTQgKzQ4LDYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBVcGRhdGVQcm94eUNvbmZpZygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIGludDMyX3QgcG9ydCwgY29uc3QgY2hhciAqZXhjbHVzaW9uTGlzdCk7Ci0KLSAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwotICAgIGJvb2wgZ2V0VUlEKHVpZF90ICp1aWQpIGNvbnN0OwotCi0gICAgc3RhdGljIHNwPEhUVFBCYXNlPiBDcmVhdGUodWludDMyX3QgZmxhZ3MgPSAwKTsKLQogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOwogICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOwogCkBAIC04Nyw5ICs3OSw2IEBACiAgICAgaW50MzJfdCBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CiAgICAgaW50MzJfdCBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNczsKIAotICAgIGJvb2wgbVVJRFZhbGlkOwotICAgIHVpZF90IG1VSUQ7Ci0KICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQQmFzZSk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggN2I0YmM2ZC4uMWZlNmZjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtMzksNiArMzksMTQgQEAKICAgICB1aW50MzJfdCBtRHVyYXRpb25VczsKIH07CiAKK3N0cnVjdCBUcmV4IHsKKyAgICB1aW50MzJfdCB0cmFja19JRDsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKKyAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9zaXplOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOworfTsKKwogY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewogcHVibGljOgogICAgIC8vIEV4dHJhY3RvciBhc3N1bWVzIG93bmVyc2hpcCBvZiAic291cmNlIi4KQEAgLTc0LDExICs4MiwxMiBAQAogICAgIH07CiAKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7Ci0gICAgdWludDY0X3QgbVNpZHhEdXJhdGlvbjsKICAgICBvZmY2NF90IG1Nb29mT2Zmc2V0OwogCiAgICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKIAorICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKKwogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSGFzVmlkZW87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAppbmRleCA5NDlhNDllLi5hMjliZGY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAorICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogCkBAIC0xMDgsNiArMTEwLDcgQEAKICAgICBvZmY2NF90IG1MYXN0QWNjZXNzUG9zOwogICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNSZXN1bHQ7CiAgICAgYm9vbCBtRmV0Y2hpbmc7CisgICAgYm9vbCBtRGlzY29ubmVjdGluZzsKICAgICBpbnQ2NF90IG1MYXN0RmV0Y2hUaW1lVXM7CiAKICAgICBpbnQzMl90IG1OdW1SZXRyaWVzTGVmdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCmluZGV4IDc0OGQxODQuLjgyOWMzOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaApAQCAtNzUsNiArNzUsMTAgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4X2ZyYW1lX3dpZHRoLCBPTVhfVTMyIG1heF9mcmFtZV9oZWlnaHQpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKQEAgLTEzNiwxMCArMTQwLDEwIEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKICAgICBPTVhfRVJST1JUWVBFIE9uRmlsbEJ1ZmZlckRvbmUoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKICAgICB2b2lkIGludmFsaWRhdGVOb2RlSUQobm9kZV9pZCBub2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggMTYyNWYwNy4uZDViZDA0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCkBAIC02Myw2ICs2MywxMCBAQAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKICAgICAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCk7CiAKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSk7CisKICAgICBzdGF0dXNfdCB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CkBAIC0xNDcsNiArMTUxLDExIEBACiAgICAgICAgIE9NWDo6YnVmZmVyX2lkIG1JRDsKICAgICB9OwogICAgIFZlY3RvcjxBY3RpdmVCdWZmZXI+IG1BY3RpdmVCdWZmZXJzOworICAgIC8vIGZvciBidWZmZXIgcHRyIHRvIGJ1ZmZlciBpZCB0cmFuc2xhdGlvbgorICAgIE11dGV4IG1CdWZmZXJJRExvY2s7CisgICAgdWludDMyX3QgbUJ1ZmZlcklEQ291bnQ7CisgICAgS2V5ZWRWZWN0b3I8T01YOjpidWZmZXJfaWQsIE9NWF9CVUZGRVJIRUFERVJUWVBFICo+IG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyOworICAgIEtleWVkVmVjdG9yPE9NWF9CVUZGRVJIRUFERVJUWVBFICosIE9NWDo6YnVmZmVyX2lkPiBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRDsKIAogICAgIC8vIG1ldGFkYXRhIG1vZGUgdHJhY2tpbmcKICAgICBib29sIG1Vc2luZ01ldGFkYXRhWzJdOwpAQCAtMTU3LDYgKzE2NiwxMiBAQAogICAgIHZvaWQgcmVtb3ZlQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCk7CiAgICAgdm9pZCBmcmVlQWN0aXZlQnVmZmVycygpOwogCisgICAgLy8gRm9yIGJ1ZmZlciBpZCBtYW5hZ2VtZW50CisgICAgT01YOjpidWZmZXJfaWQgbWFrZUJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpmaW5kQnVmZmVySGVhZGVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwgT01YX1UzMiBwb3J0SW5kZXgpOworICAgIE9NWDo6YnVmZmVyX2lkIGZpbmRCdWZmZXJJRChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGVhZGVyKTsKKyAgICB2b2lkIGludmFsaWRhdGVCdWZmZXJJRChPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOworCiAgICAgYm9vbCBpc1Byb2hpYml0ZWRJbmRleF9sKE9NWF9JTkRFWFRZUEUgaW5kZXgpOwogCiAgICAgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcjJfbCgKQEAgLTE4MCw3ICsxOTUsOSBAQAogICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOwogCi0gICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUpOworICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgICAgICBPTVhfQk9PTCB1c2VHcmFwaGljQnVmZmVyLCBPTVhfQk9PTCAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhKTsKIAogICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdldEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKICAgICB2b2lkIHNldEdyYXBoaWNCdWZmZXJTb3VyY2UoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIGJ1ZmZlclNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaAppbmRleCBjYTU5ZGMwLi4yYzRmNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEhUVFBCYXNlOworc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogCiBzdHJ1Y3QgU0RQTG9hZGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM0LDcgKzM1LDEwIEBACiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U0RQTG9hZGVkID0gJ3NkcGwnCiAgICAgfTsKLSAgICBTRFBMb2FkZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzID0gMCwgYm9vbCB1aWRWYWxpZCA9IGZhbHNlLCB1aWRfdCB1aWQgPSAwKTsKKyAgICBTRFBMb2FkZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CiAKICAgICB2b2lkIGxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKQEAgLTU1LDggKzU5LDYgQEAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBjb25zdCBjaGFyKiBtVXJsOwogICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1VSURWYWxpZDsKLSAgICB1aWRfdCBtVUlEOwogICAgIHNwPEFMb29wZXI+IG1OZXRMb29wZXI7CiAgICAgYm9vbCBtQ2FuY2VsbGVkOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKaW5kZXggYjVhMDQzYy4uNjBjOWU3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaApAQCAtMzAsNiArMzAsNyBAQAogICAgIG9mZjY0X3QgZ2V0U2FtcGxlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVPZmZzZXQ7IH0KICAgICBzaXplX3QgZ2V0U2FtcGxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlU2l6ZTsgfQogICAgIHVpbnQzMl90IGdldFNhbXBsZVRpbWUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVRpbWU7IH0KKyAgICB1aW50MzJfdCBnZXRTYW1wbGVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlRHVyYXRpb247IH0KIAogICAgIHN0YXR1c190IGdldFNhbXBsZVNpemVEaXJlY3QoCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzaXplKTsKQEAgLTYxLDExICs2MiwxMiBAQAogICAgIG9mZjY0X3QgbUN1cnJlbnRTYW1wbGVPZmZzZXQ7CiAgICAgc2l6ZV90IG1DdXJyZW50U2FtcGxlU2l6ZTsKICAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZVRpbWU7CisgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsKIAogICAgIHZvaWQgcmVzZXQoKTsKICAgICBzdGF0dXNfdCBmaW5kQ2h1bmtSYW5nZSh1aW50MzJfdCBzYW1wbGVJbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0Q2h1bmtPZmZzZXQodWludDMyX3QgY2h1bmssIG9mZjY0X3QgKm9mZnNldCk7Ci0gICAgc3RhdHVzX3QgZmluZFNhbXBsZVRpbWUodWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lKTsKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKTsKIAogICAgIFNhbXBsZUl0ZXJhdG9yKGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwogICAgIFNhbXBsZUl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKaW5kZXggMDM2ZGEyZS4uNTUyZWVmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApAQCAtNjYsNyArNjYsOCBAQAogICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICAgICAgc2l6ZV90ICpzaXplLAogICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSA9IE5VTEwpOworICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbiA9IE5VTEwpOwogCiAgICAgZW51bSB7CiAgICAgICAgIGtGbGFnQmVmb3JlLApAQCAtNzQsNyArNzUsOCBAQAogICAgICAgICBrRmxhZ0Nsb3Nlc3QKICAgICB9OwogICAgIHN0YXR1c190IGZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgICAgICB1aW50MzJfdCByZXFfdGltZSwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCiAgICAgc3RhdHVzX3QgZmluZFN5bmNTYW1wbGVOZWFyKAogICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRfc2FtcGxlX2luZGV4LCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LApAQCAtMTQ0LDYgKzE0NiwxNCBAQAogCiAgICAgZnJpZW5kIHN0cnVjdCBTYW1wbGVJdGVyYXRvcjsKIAorICAgIC8vIG5vcm1hbGx5IHdlIGRvbid0IHJvdW5kCisgICAgaW5saW5lIHVpbnQ2NF90IGdldFNhbXBsZVRpbWUoCisgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX2luZGV4LCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbikgY29uc3QgeworICAgICAgICByZXR1cm4gKHNhbXBsZV9pbmRleCA8IChzaXplX3QpbU51bVNhbXBsZVNpemVzICYmIG1TYW1wbGVUaW1lRW50cmllcyAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgc2NhbGVfZGVuICE9IDApCisgICAgICAgICAgICAgICAgPyAobVNhbXBsZVRpbWVFbnRyaWVzW3NhbXBsZV9pbmRleF0ubUNvbXBvc2l0aW9uVGltZSAqIHNjYWxlX251bSkgLyBzY2FsZV9kZW4gOiAwOworICAgIH0KKwogICAgIHN0YXR1c190IGdldFNhbXBsZVNpemVfbCh1aW50MzJfdCBzYW1wbGVfaW5kZXgsIHNpemVfdCAqc2FtcGxlX3NpemUpOwogICAgIHVpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggZjhjNjFlYi4uNTkxYjM4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKQEAgLTU4LDYgKzU4LDExIEBACiAgICAgICAgIH0gbVRyYW5zaXRpb247CiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4ID0gT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgKyAxLAorICAgICAgICBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCwKKyAgICB9OworCiAgICAgdm9pZCBhZGRQb3J0KGNvbnN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgJmRlZik7CiAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxHZXRQYXJhbWV0ZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCmluZGV4IGQwNTBmYTYuLjllOTdlYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCkBAIC0yNyw4ICsyNyw2IEBACiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigqKGEpKSkKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCA6IHB1YmxpYyBTaW1wbGVTb2Z0T01YQ29tcG9uZW50IHsKQEAgLTU3LDEyICs1NSwzMSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CisKICAgICB2b2lkIGluaXRQb3J0cyhPTVhfVTMyIG51bUlucHV0QnVmZmVycywKICAgICAgICAgICAgIE9NWF9VMzIgaW5wdXRCdWZmZXJTaXplLAogICAgICAgICAgICAgT01YX1UzMiBudW1PdXRwdXRCdWZmZXJzLAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUpOwogCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoYm9vbCB1cGRhdGVDcm9wID0gdHJ1ZSk7CisKKyAgICB1aW50MzJfdCBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IG91dHB1dEJ1ZmZlckhlaWdodCgpOworCisgICAgZW51bSBDcm9wU2V0dGluZ3NNb2RlIHsKKyAgICAgICAga0Nyb3BVblNldCA9IDAsCisgICAgICAgIGtDcm9wU2V0LAorICAgICAgICBrQ3JvcENoYW5nZWQsCisgICAgfTsKKyAgICB2b2lkIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgICAgIGJvb2wgKnBvcnRXaWxsUmVzZXQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcFVuU2V0LCBib29sIGZha2VTdHJpZGUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUpOwogCiAgICAgZW51bSB7CiAgICAgICAgIGtJbnB1dFBvcnRJbmRleCAgPSAwLApAQCAtNzAsNiArODcsOCBAQAogICAgICAgICBrTWF4UG9ydEluZGV4ID0gMSwKICAgICB9OwogCisgICAgYm9vbCBtSXNBZGFwdGl2ZTsKKyAgICB1aW50MzJfdCBtQWRhcHRpdmVNYXhXaWR0aCwgbUFkYXB0aXZlTWF4SGVpZ2h0OwogICAgIHVpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKICAgICB1aW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2I4MTBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX1ZJREVPX0VOQ09ERVJfT01YX0NPTVBPTkVOVF9IXworCisjZGVmaW5lIFNPRlRfVklERU9fRU5DT0RFUl9PTVhfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCitzdHJ1Y3QgaHdfbW9kdWxlX3Q7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCk7CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKAorICAgICAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgICAgIHN0cnVjdCBhbmRyb2lkX3ljYmNyICp5Y2JjciwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluWVZVLCB1aW50OF90KiBvdXRZVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgIHN0YXRpYyB2b2lkIENvbnZlcnRSR0IzMlRvUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCisgICAgICAgIGJvb2wgYmdyKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmV4dHJhY3RHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgdWludDhfdCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0RXh0ZW5zaW9uSW5kZXgoY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOworCisgICAgZW51bSB7CisgICAgICAgIGtJbnB1dFBvcnRJbmRleCA9IDAsCisgICAgICAgIGtPdXRwdXRQb3J0SW5kZXggPSAxLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgbXV0YWJsZSBjb25zdCBod19tb2R1bGVfdCAqbUdyYWxsb2NNb2R1bGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggN2FiMDA0Mi4uZmEzZWE4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTI0LDE3ICsyNCwxNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZXRhRGF0YTsKK3N0cnVjdCBBTWVzc2FnZTsKIAogY2xhc3MgU29mdHdhcmVSZW5kZXJlciB7CiBwdWJsaWM6Ci0gICAgU29mdHdhcmVSZW5kZXJlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisgICAgZXhwbGljaXQgU29mdHdhcmVSZW5kZXJlcihjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlV2luZG93KTsKIAogICAgIH5Tb2Z0d2FyZVJlbmRlcmVyKCk7CiAKICAgICB2b2lkIHJlbmRlcigKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCB2b2lkICpwbGF0Zm9ybVByaXZhdGUpOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZXN0YW1wTnMsCisgICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogcHJpdmF0ZToKICAgICBlbnVtIFlVVk1vZGUgewpAQCAtNTEsNiArNTEsOCBAQAogCiAgICAgU29mdHdhcmVSZW5kZXJlcihjb25zdCBTb2Z0d2FyZVJlbmRlcmVyICYpOwogICAgIFNvZnR3YXJlUmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBTb2Z0d2FyZVJlbmRlcmVyICYpOworCisgICAgdm9pZCByZXNldEZvcm1hdElmQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCBiMDJlZDBlLi42NjMyYzI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMzMsNiArMzMsNyBAQAogICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCmluZGV4IDNlODQyNTYuLjI5NjMxNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaApAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgfTsKIAogICAgIHN0cnVjdCBTdG9wRXZlbnQgOiBwdWJsaWMgVGltZWRFdmVudFF1ZXVlOjpFdmVudCB7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3Qgbm93X3VzKSB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBmaXJlKFRpbWVkRXZlbnRRdWV1ZSAqcXVldWUsIGludDY0X3QgLyogbm93X3VzICovKSB7CiAgICAgICAgICAgICBxdWV1ZS0+bVN0b3BwZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCmluZGV4IDhlNjI5NDYuLmFiN2U4YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaApAQCAtNDksNiArNDksNyBAQAogICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKIAogICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgY2FjaGVkIGZyb20gdGhlIGN1cnJlbnQKICAgICAvLyBwbGF5YmFjayBwb3NpdGlpb24gKGluIHVzKS4KQEAgLTc0LDggKzc1LDYgQEAKICAgICAvLyBjb2RlYy4KICAgICB2b2lkIHNldENyeXB0b1BsdWdpbk1vZGUoYm9vbCBjcnlwdG9QbHVnaW5Nb2RlKTsKIAotICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7Ci0KICAgICBzdGF0aWMgYm9vbCBnZXRWZW5kb3JMaWJIYW5kbGUoKTsKIAogICAgIHN0YXR1c190IGdldEVycm9yKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9jaHJvbWl1bV9odHRwX3N0dWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2NTFhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2Nocm9taXVtX2h0dHBfc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ0hST01JVU1fSFRUUF9TVFVCX0hfCi0jZGVmaW5lIENIUk9NSVVNX0hUVFBfU1RVQl9IXwotCi0jaW5jbHVkZSA8aW5jbHVkZS9IVFRQQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotZXh0ZXJuICJDIiB7Ci1IVFRQQmFzZSAqY3JlYXRlQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSh1aW50MzJfdCBmbGFncyk7Ci0KLXN0YXR1c190IFVwZGF0ZUNocm9taXVtSFRUUERhdGFTb3VyY2VQcm94eUNvbmZpZygKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgaW50MzJfdCBwb3J0LCBjb25zdCBjaGFyICpleGNsdXNpb25MaXN0KTsKLQotRGF0YVNvdXJjZSAqY3JlYXRlRGF0YVVyaVNvdXJjZShjb25zdCBjaGFyICp1cmkpOwotfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCmluZGV4IDJkOGMxZTEuLjQ0NmZmOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tawpAQCAtOCw3ICs4LDcgQEAKICAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC9saWJ3ZWJtIFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbWF0cm9za2EKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IDI1ZDBjZjEuLjQ0YTFlMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIk1hdHJvc2thRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlICJta3ZwYXJzZXIuaHBwIgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgpAQCAtMzQsNiArMzIsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRGF0YVNvdXJjZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewpAQCAtODgsNyArODgsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IEJsb2NrSXRlcmF0b3IgewotICAgIEJsb2NrSXRlcmF0b3IoTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSk7CisgICAgQmxvY2tJdGVyYXRvcihNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBsb25nIHRyYWNrTnVtLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKIAogICAgIGJvb2wgZW9zKCkgY29uc3Q7CiAKQEAgLTEwNCw3ICsxMDQsOCBAQAogCiBwcml2YXRlOgogICAgIE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwotICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOworICAgIGxvbmcgbG9uZyBtVHJhY2tOdW07CisgICAgdW5zaWduZWQgbG9uZyBtSW5kZXg7CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkNsdXN0ZXIgKm1DbHVzdGVyOwogICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2tFbnRyeSAqbUJsb2NrRW50cnk7CkBAIC0xNTYsNiArMTU3LDUzIEBACiAgICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKIH07CiAKK2NvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmdldFRyYWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0VHJhY2tzKCktPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgbWt2cGFyc2VyOjpDdWVzOjpGaW5kLCBleGNlcHQgdGhhdCBpdAorLy8gc2VhcmNoZXMgaW4gb3VyIG93biB0cmFjayBiYXNlZCB2ZWN0b3JzLiBXZSBzaG91bGQgbm90IG5lZWQgdGhpcyBvbmNlIG1rdnBhcnNlcgorLy8gYWRkcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6ZmluZCgKKyAgICAgICAgbG9uZyBsb25nIHRpbWVOcykgY29uc3QgeworICAgIEFMT0dWKCJtQ3VlUG9pbnRzLnNpemUgJXp1IiwgbUN1ZVBvaW50cy5zaXplKCkpOworICAgIGlmIChtQ3VlUG9pbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdCgwKTsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiB0cmFjayA9IGdldFRyYWNrKCk7CisgICAgaWYgKHRpbWVOcyA8PSBjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkpIHsKKyAgICAgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKKyAgICB9CisKKyAgICAvLyBCaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCByZWxldmFudCBjdWVzOyBhc3N1bWVzIGN1ZXMgYXJlIG9yZGVyZWQgYnkgdGltZWNvZGUuCisgICAgLy8gSWYgd2UgZG8gZGV0ZWN0IG91dC1vZi1vcmRlciBjdWVzLCByZXR1cm4gTlVMTC4KKyAgICBzaXplX3QgbG8gPSAwOworICAgIHNpemVfdCBoaSA9IG1DdWVQb2ludHMuc2l6ZSgpOworICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNvbnN0IG1pZENwID0gbUN1ZVBvaW50cy5pdGVtQXQobWlkKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGN1ZVRpbWVOcyA9IG1pZENwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KTsKKyAgICAgICAgaWYgKGN1ZVRpbWVOcyA8PSB0aW1lTnMpIHsKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChsbyAtIDEpOworICAgIGlmIChjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkgPiB0aW1lTnMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKK30KKwogTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAogICAgICAgICBjb25zdCBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLApAQCAtMTYzLDcgKzIxMSw4IEBACiAgICAgICBtVHlwZShPVEhFUiksCiAgICAgICBtSXNBdWRpbyhmYWxzZSksCiAgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0pLAorICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAorICAgICAgICAgICAgICAgICBpbmRleCksCiAgICAgICBtTkFMU2l6ZUxlbigwKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CiAKQEAgLTE4NCw3ICsyMzMsNyBAQAogICAgICAgICBDSEVDS19HRShhdmNjU2l6ZSwgNXUpOwogCiAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICVkIiwgbU5BTFNpemVMZW4pOworICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlenUiLCBtTkFMU2l6ZUxlbik7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CiAgICAgICAgIG1UeXBlID0gQUFDOwogICAgIH0KQEAgLTE5NCw3ICsyNDMsNyBAQAogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICogLyogcGFyYW1zICovKSB7CiAgICAgbUJsb2NrSXRlci5yZXNldCgpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjEzLDkgKzI2MiwxMCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogQmxvY2tJdGVyYXRvcjo6QmxvY2tJdGVyYXRvcigKLSAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSkKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSwgdW5zaWduZWQgbG9uZyBpbmRleCkKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKICAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtSW5kZXgoaW5kZXgpLAogICAgICAgbUNsdXN0ZXIoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeShOVUxMKSwKICAgICAgIG1CbG9ja0VudHJ5SW5kZXgoMCkgewpAQCAtMzE0LDE0ICszNjQsMTQgQEAKIAogICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IC0xbGw7CiAKLSAgICBjb25zdCBpbnQ2NF90IHNlZWtUaW1lTnMgPSBzZWVrVGltZVVzICogMTAwMGxsOworICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGwgLSBtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOczsKIAogICAgIG1rdnBhcnNlcjo6U2VnbWVudCogY29uc3QgcFNlZ21lbnQgPSBtRXh0cmFjdG9yLT5tU2VnbWVudDsKIAogICAgIC8vIFNwZWNpYWwgY2FzZSB0aGUgMCBzZWVrIHRvIGF2b2lkIGxvYWRpbmcgQ3VlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbgogICAgIC8vIGV4dHJhbmVvdXNseSBzZWVrcyB0byAwIGJlZm9yZSBwbGF5aW5nLgogICAgIGlmIChzZWVrVGltZU5zIDw9IDApIHsKLSAgICAgICAgQUxPR1YoIlNlZWsgdG8gYmVnaW5uaW5nOiAlbGxkIiwgc2Vla1RpbWVVcyk7CisgICAgICAgIEFMT0dWKCJTZWVrIHRvIGJlZ2lubmluZzogJSIgUFJJZDY0LCBzZWVrVGltZVVzKTsKICAgICAgICAgbUNsdXN0ZXIgPSBwU2VnbWVudC0+R2V0Rmlyc3QoKTsKICAgICAgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CiAgICAgICAgIGRvIHsKQEAgLTMzMCw3ICszODAsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1YoIlNlZWtpbmcgdG86ICVsbGQiLCBzZWVrVGltZVVzKTsKKyAgICBBTE9HVigiU2Vla2luZyB0bzogJSIgUFJJZDY0LCBzZWVrVGltZVVzKTsKIAogICAgIC8vIElmIHRoZSBDdWVzIGhhdmUgbm90IGJlZW4gbG9jYXRlZCB0aGVuIGZpbmQgdGhlbS4KICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZXMqIHBDdWVzID0gcFNlZ21lbnQtPkdldEN1ZXMoKTsKQEAgLTM2Myw5ICs0MTMsMjAgQEAKICAgICB9CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBwQ1A7CisgICAgbWt2cGFyc2VyOjpUcmFja3MgY29uc3QgKnBUcmFja3MgPSBwU2VnbWVudC0+R2V0VHJhY2tzKCk7CisgICAgdW5zaWduZWQgbG9uZyBpbnQgdHJhY2tDb3VudCA9IHBUcmFja3MtPkdldFRyYWNrc0NvdW50KCk7CiAgICAgd2hpbGUgKCFwQ3Vlcy0+RG9uZVBhcnNpbmcoKSkgewogICAgICAgICBwQ3Vlcy0+TG9hZEN1ZVBvaW50KCk7CiAgICAgICAgIHBDUCA9IHBDdWVzLT5HZXRMYXN0KCk7CisgICAgICAgIENIRUNLKHBDUCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CisgICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcENQLT5GaW5kKHBUcmFjaykpIHsgLy8gVklERU9fVFJBQ0sKKyAgICAgICAgICAgICAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvJiB0cmFjayA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICAgICAgdHJhY2subUN1ZVBvaW50cy5wdXNoX2JhY2socENQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmIChwQ1AtPkdldFRpbWUocFNlZ21lbnQpID49IHNlZWtUaW1lTnMpIHsKICAgICAgICAgICAgIEFMT0dWKCJQYXJzZWQgcGFzdCByZWxldmFudCBDdWUiKTsKQEAgLTM3MywyMiArNDM0LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGUgQ3VlIGluZGV4IGlzIGJ1aWx0IGFyb3VuZCB2aWRlbyBrZXlmcmFtZXMKLSAgICBta3ZwYXJzZXI6OlRyYWNrcyBjb25zdCAqcFRyYWNrcyA9IHBTZWdtZW50LT5HZXRUcmFja3MoKTsKLSAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBOVUxMOwotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwVHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOyArK2luZGV4KSB7Ci0gICAgICAgIHBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7Ci0gICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSkgeyAvLyBWSURFT19UUkFDSwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvIHRyYWNrIGxvY2F0ZWQgYXQgJWQiLCBpbmRleCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpwVFAgPSBOVUxMOworICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRoaXNUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChtSW5kZXgpOworICAgIGlmICh0aGlzVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7IC8vIHZpZGVvCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgICAgIHBUUCA9IHRyYWNrLmZpbmQoc2Vla1RpbWVOcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIEN1ZSBpbmRleCBpcyBidWlsdCBhcm91bmQgdmlkZW8ga2V5ZnJhbWVzCisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOworICAgICAgICAgICAgaWYgKHBUcmFjayAmJiBwVHJhY2stPkdldFR5cGUoKSA9PSAxICYmIHBDdWVzLT5GaW5kKHNlZWtUaW1lTnMsIHBUcmFjaywgcENQLCBwVFApKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvIHRyYWNrIGxvY2F0ZWQgYXQgJXp1IiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisKICAgICAvLyBBbHdheXMgKnNlYXJjaCogYmFzZWQgb24gdGhlIHZpZGVvIHRyYWNrLCBidXQgZmluYWxpemUgYmFzZWQgb24gbVRyYWNrTnVtCi0gICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiogcFRQOwotICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSkgewotICAgICAgICBwQ3Vlcy0+RmluZChzZWVrVGltZU5zLCBwVHJhY2ssIHBDUCwgcFRQKTsKLSAgICB9IGVsc2UgeworICAgIGlmICghcFRQKSB7CiAgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQwOSwxMCArNDczLDEzIEBACiAKICAgICAgICAgaWYgKGlzQXVkaW8gfHwgYmxvY2soKS0+SXNLZXkoKSkgewogICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBmaXJzdCBrZXkgZnJhbWUKLSAgICAgICAgICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IChibG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMExMKSAvIDEwMDBMTDsKLSAgICAgICAgICAgIEFMT0dWKCJSZXF1ZXN0ZWQgc2VlayBwb2ludDogJWxsZCBhY3R1YWw6ICVsbGQiLAotICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgYWN0dWFsRnJhbWVUaW1lVXMpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gKGJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwTEwpIC8gMTAwMExMOworICAgICAgICAgICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEgfHwgZnJhbWVUaW1lVXMgPj0gc2Vla1RpbWVVcykgeworICAgICAgICAgICAgICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IGZyYW1lVGltZVVzOworICAgICAgICAgICAgICAgIEFMT0dWKCJSZXF1ZXN0ZWQgc2VlayBwb2ludDogJSIgUFJJZDY0ICIgYWN0dWFsOiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgKmFjdHVhbEZyYW1lVGltZVVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTYzNCw3ICs3MDEsOCBAQAogICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZVJlYWRlcihtRGF0YVNvdXJjZSkpLAogICAgICAgbVNlZ21lbnQoTlVMTCksCiAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyhmYWxzZSksCi0gICAgICBtSXNXZWJtKGZhbHNlKSB7CisgICAgICBtSXNXZWJtKGZhbHNlKSwKKyAgICAgIG1TZWVrUHJlUm9sbE5zKDApIHsKICAgICBvZmY2NF90IHNpemU7CiAgICAgbUlzTGl2ZVN0cmVhbWluZyA9CiAgICAgICAgIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKQpAQCAtNjYwLDE0ICs3MjgsMjIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIGZyb20gbWt2cGFyc2VyOjpTZWdtZW50OjpMb2FkKCksIGJ1dCBzdG9wIGF0IGZpcnN0IGNsdXN0ZXIKICAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7Ci0gICAgQ0hFQ0tfRVEocmV0LCAwKTsKLQotICAgIGxvbmcgbGVuOwotICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7Ci0gICAgQ0hFQ0tfRVEocmV0LCAwKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgIGlmIChyZXQgPj0gMSkgeworICAgICAgICAgICAgLy8gbm8gbW9yZSBjbHVzdGVycworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOworICAgIH0KIAogICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJDb3JydXB0ICVzIHNvdXJjZTogJXMiLCBtSXNXZWJtID8gIndlYm0iIDogIm1hdHJvc2thIiwKKyAgICAgICAgICAgICAgICB1cmlEZWJ1Z1N0cmluZyhtRGF0YVNvdXJjZS0+Z2V0VXJpKCkpLmNfc3RyKCkpOwogICAgICAgICBkZWxldGUgbVNlZ21lbnQ7CiAgICAgICAgIG1TZWdtZW50ID0gTlVMTDsKICAgICAgICAgcmV0dXJuOwpAQCAtOTM4LDYgKzEwMTQsMTIgQEAKIAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOworICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9NUEVHL0wzIiwgY29kZWNJRCkpIHsKICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05NjYsNiArMTA0OCw3IEBACiAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpOwogICAgICAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKICAgICAgICAgdHJhY2tJbmZvLT5tTWV0YSA9IG1ldGE7CisgICAgICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgfQogfQogCkBAIC05ODAsNyArMTA2Myw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCBpbmZvLT5tVHJhY2tOdW0pOworICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgaW5mby0+bVRyYWNrTnVtLCBpKTsKICAgICAgICAgaW50MzJfdCBqID0gMDsKICAgICAgICAgaW50NjRfdCB0aHVtYm5haWxUaW1lVXMgPSAwOwogICAgICAgICBzaXplX3QgbWF4QmxvY2tTaXplID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDEyOTRiNGYuLmRiMzZiZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMTgsMTQgKzE4LDEyIEBACiAKICNkZWZpbmUgTUFUUk9TS0FfRVhUUkFDVE9SX0hfCiAKKyNpbmNsdWRlICJta3ZwYXJzZXIuaHBwIgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLW5hbWVzcGFjZSBta3ZwYXJzZXIgewotc3RydWN0IFNlZ21lbnQ7Ci19OwotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKQEAgLTU4LDYgKzU2LDExIEBACiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOwogICAgICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CisgICAgICAgIGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOworICAgICAgICBWZWN0b3I8Y29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCo+IG1DdWVQb2ludHM7CisKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKICAgICB9OwogCiAgICAgTXV0ZXggbUxvY2s7CkBAIC02OSw2ICs3Miw3IEBACiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKICAgICBib29sIG1Jc0xpdmVTdHJlYW1pbmc7CiAgICAgYm9vbCBtSXNXZWJtOworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsTnM7CiAKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wNC9GcmFnbWVudGVkTVA0UGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwMjY1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvRnJhZ21lbnRlZE1QNFBhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkZyYWdtZW50ZWRNUDRQYXJzZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotI2luY2x1ZGUgImluY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotI2luY2x1ZGUgIlRyYWNrRnJhZ21lbnQuaCIKLQotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJjYzJTdHJpbmcodWludDMyX3QgZm91cmNjKSB7Ci0gICAgc3RhdGljIGNoYXIgYnVmZmVyWzVdOwotICAgIGJ1ZmZlcls0XSA9ICdcMCc7Ci0gICAgYnVmZmVyWzBdID0gZm91cmNjID4+IDI0OwotICAgIGJ1ZmZlclsxXSA9IChmb3VyY2MgPj4gMTYpICYgMHhmZjsKLSAgICBidWZmZXJbMl0gPSAoZm91cmNjID4+IDgpICYgMHhmZjsKLSAgICBidWZmZXJbM10gPSBmb3VyY2MgJiAweGZmOwotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKkluZGVudFN0cmluZyhzaXplX3QgbikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Ci0gICAgcmV0dXJuIGtTcGFjZSArIHNpemVvZihrU3BhY2UpIC0gMiAqIG4gLSAxOwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkRpc3BhdGNoRW50cnkgRnJhZ21lbnRlZE1QNFBhcnNlcjo6a0Rpc3BhdGNoVGFibGVbXSA9IHsKLSAgICB7IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCAwLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSwgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpLCBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKSwgTlVMTCB9LAotCi0gICAgeyBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrSGVhZGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4JyksIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygndCcsICdyJywgJ2UnLCAneCcpLCBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tFeHRlbmRzCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdlJywgJ2QnLCAndCcsICdzJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2QnLCAnaCcsICdkJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhlYWRlcgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnaCcsICdkJywgJ2wnLCAncicpLCBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFIYW5kbGVyCi0gICAgfSwKLQotICAgIHsgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ2QnLCAnaScsICduJywgJ2YnKSwgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyksIE5VTEwgfSwKLSAgICB7IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLCBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKSwgTlVMTCB9LAotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ3MnLCAneicpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlU2l6ZXMgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMgfSwKLQotICAgIHsgRk9VUkNDKCdzJywgJ3QnLCAncycsICdjJyksIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTYW1wbGVUb0NodW5rIH0sCi0KLSAgICB7IEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzIH0sCi0KLSAgICB7IEZPVVJDQygnYycsICdvJywgJzYnLCAnNCcpLCBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzNjQgfSwKLQotICAgIHsgRk9VUkNDKCdhJywgJ3YnLCAnYycsICdDJyksIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKSwgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ2UnLCAncycsICdkJywgJ3MnKSwgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JyksCi0gICAgICAgICZGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSB9LAotCi0gICAgeyBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSwgMCwgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlTWVkaWFEYXRhIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpLCAwLCBOVUxMIH0sCi0gICAgeyBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyksIE5VTEwgfSwKLQotICAgIHsgRk9VUkNDKCd0JywgJ2YnLCAnaCcsICdkJyksIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpLAotICAgICAgICAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyCi0gICAgfSwKLSAgICB7IEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpLCBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKSwKLSAgICAgICAgJkZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bgotICAgIH0sCi0KLSAgICB7IEZPVVJDQygnbScsICdmJywgJ3InLCAnYScpLCAwLCBOVUxMIH0sCi0KLSAgICB7IEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpLCAwLCAmRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTZWdtZW50SW5kZXggfSwKLX07Ci0KLXN0cnVjdCBGaWxlU291cmNlIDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlNvdXJjZSB7Ci0gICAgRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICAgICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgInJiIikpIHsKLSAgICAgICAgICAgIENIRUNLKG1GaWxlICE9IE5VTEwpOwotICAgICAgICB9Ci0KLSAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCkgewotICAgICAgICBmY2xvc2UobUZpbGUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGZzZWVrKG1GaWxlLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgcmV0dXJuIGZyZWFkKGRhdGEsIDEsIHNpemUsIG1GaWxlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWVrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICBGSUxFICptRmlsZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVTb3VyY2UpOwotfTsKLQotc3RydWN0IFJlYWRUcmFja2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIFJlYWRUcmFja2VyKG9mZjY0X3Qgc2l6ZSkgewotICAgICAgICBhbGxvY1NpemUgPSAxICsgc2l6ZSAvIDgxOTI7IC8vIDEgYml0IHBlciBraWxvYnl0ZQotICAgICAgICBiaXRtYXAgPSAoY2hhciopIGNhbGxvYygxLCBhbGxvY1NpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5SZWFkVHJhY2tlcigpIHsKLSAgICAgICAgZHVtcFRvTG9nKCk7Ci0gICAgICAgIGZyZWUoYml0bWFwKTsKLSAgICB9Ci0gICAgdm9pZCBtYXJrKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpbnQgZmlyc3RiaXQgPSBvZmZzZXQgLyAxMDI0OwotICAgICAgICBpbnQgbGFzdGJpdCA9IChvZmZzZXQgKyBzaXplIC0gMSkgLyAxMDI0OwotICAgICAgICBmb3IgKGludCBpID0gZmlyc3RiaXQ7IGkgPD0gbGFzdGJpdDsgaSsrKSB7Ci0gICAgICAgICAgICBiaXRtYXBbaS84XSB8PSAoMHg4MCA+PiAoaSAmIDcpKTsKLSAgICAgICAgfQotICAgIH0KLQotIHByaXZhdGU6Ci0gICAgdm9pZCBkdW1wVG9Mb2coKSB7Ci0gICAgICAgIC8vIDk2IGNoYXJzIHBlciBsaW5lLCBlYWNoIGNoYXIgcmVwcmVzZW50cyBvbmUga2lsb2J5dGUsIDEga2IgcGVyIGJpdAotICAgICAgICBpbnQgbnVtbGluZXMgPSBhbGxvY1NpemUgLyAxMjsKLSAgICAgICAgY2hhciBidWZbOTddOwotICAgICAgICBjaGFyICpjdXIgPSBiaXRtYXA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtbGluZXM7IGkrKyAmJiBjdXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTI7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgODsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZlsoaiAqIDgpICsga10gPSAoKmN1ciAmICgweDgwID4+IGspKSA/ICdYJyA6ICcuJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZbOTZdID0gJ1wwJzsKLSAgICAgICAgICAgIEFMT0dJKCIlNWRrOiAlcyIsIGkgKiA5NiwgYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfdCBhbGxvY1NpemU7Ci0gICAgY2hhciAqYml0bWFwOwotfTsKLQotc3RydWN0IERhdGFTb3VyY2VTb3VyY2UgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U291cmNlIHsKLSAgICBEYXRhU291cmNlU291cmNlKHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSB7Ci0gICAgICAgICAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKLSNpZiAwCi0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIG1SZWFkVHJhY2tlciA9IG5ldyBSZWFkVHJhY2tlcihzaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGdldCBkYXRhIHNvdXJjZSBzaXplIik7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaWYgKG1SZWFkVHJhY2tlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVhZFRyYWNrZXItPm1hcmsob2Zmc2V0LCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1NlZWthYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPFJlYWRUcmFja2VyPiBtUmVhZFRyYWNrZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEYXRhU291cmNlU291cmNlKTsKLX07Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkZyYWdtZW50ZWRNUDRQYXJzZXIoKQotICAgIDogbUJ1ZmZlclBvcygwKSwKLSAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAotICAgICAgbURvbmVXaXRoTW9vdihmYWxzZSksCi0gICAgICBtRmlyc3RNb29mT2Zmc2V0KDApLAotICAgICAgbUZpbmFsUmVzdWx0KE9LKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6On5GcmFnbWVudGVkTVA0UGFyc2VyKCkgewotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnN0YXJ0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydCglcykiLCBmaWxlbmFtZSk7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoY29uc3Qgc3A8U291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKLSAgICBtc2ctPnBvc3QoKTsKLSAgICBBTE9HVigiUGFyc2VyOjpzdGFydChTb3VyY2UpIik7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c3RhcnQoc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIG5ldyBEYXRhU291cmNlU291cmNlKHNvdXJjZSkpOwotICAgIG1zZy0+cG9zdCgpOwotICAgIEFMT0dWKCJQYXJzZXI6OnN0YXJ0KERhdGFTb3VyY2UpIik7Ci19Ci0KLXNwPEFNZXNzYWdlPiBGcmFnbWVudGVkTVA0UGFyc2VyOjpnZXRGb3JtYXQoYm9vbCBhdWRpbywgYm9vbCBzeW5jaHJvbm91cykgewotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgYm9vbCBtb292RG9uZSA9IG1Eb25lV2l0aE1vb3Y7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIGlkKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0Rm9ybWF0IHBvc3QgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChzeW5jaHJvbm91cyAmJiBlcnIgPT0gLUVXT1VMREJMT0NLICYmICFtb292RG9uZSkgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkBnZXRGb3JtYXQgcGFyc2VyIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nIik7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJnZXRGb3JtYXQgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOwotCi0gICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgZm9ybWF0ICVzIiwgZm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZm9ybWF0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6c2Vla1RvKGJvb2wgd2FudEF1ZGlvLCBpbnQ2NF90IHRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrVG8sIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgd2FudEF1ZGlvKTsKLSAgICBtc2ctPnNldEludDY0KCJwb3NpdGlvbiIsIHRpbWVVcyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWJvb2wgRnJhZ21lbnRlZE1QNFBhcnNlcjo6aXNTZWVrYWJsZSgpIGNvbnN0IHsKLSAgICB3aGlsZSAobUZpcnN0TW9vZk9mZnNldCA9PSAwICYmIG1GaW5hbFJlc3VsdCA9PSBPSykgewotICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgIH0KLSAgICBib29sIHNlZWthYmxlID0gbVNvdXJjZS0+aXNTZWVrYWJsZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzZWVrYWJsZSAmJiBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICBzZWVrYWJsZSAmPSAhaW5mby0+bVNpZHguZW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlZWthYmxlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvblNlZWtUbyhib29sIHdhbnRBdWRpbywgaW50NjRfdCBwb3NpdGlvbikgewotICAgIHN0YXR1c190IGVyciA9IC1FSU5WQUw7Ci0gICAgc3NpemVfdCB0cmFja0luZGV4ID0gZmluZFRyYWNrKHdhbnRBdWRpbyk7Ci0gICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgIGVyciA9IHRyYWNrSW5kZXg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdFZhbHVlQXQodHJhY2tJbmRleCk7Ci0KLSAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gaW5mby0+bVNpZHguc2l6ZSgpOwotICAgICAgICBpbnQ2NF90IHRvdGFsVGltZSA9IDA7Ci0gICAgICAgIG9mZl90IHRvdGFsT2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWR4RW50cmllczsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBTaWR4RW50cnkgKnNlID0gJmluZm8tPm1TaWR4W2ldOwotICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwwKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyUG9zID0gdG90YWxPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1GaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IE9LOwotICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkID0gdHJ1ZTsgLy8gZm9yY2UgcmVzdW1lCi0gICAgICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZm8tPm1GcmFnbWVudHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBpbmZvLT5tRGVjb2RpbmdUaW1lID0gdG90YWxUaW1lICogaW5mby0+bU1lZGlhVGltZVNjYWxlIC8gMTAwMDAwMGxsOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsVGltZSArPSBzZS0+bUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB0b3RhbE9mZnNldCArPSBzZS0+bVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInNlZWtUbyBvdXQgb2YgcmFuZ2UiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3luY2hyb25vdXMpIHsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREZXF1ZXVlQWNjZXNzVW5pdCwgaWQoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlIGZhaWwgMTogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChzeW5jaHJvbm91cyAmJiBlcnIgPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUGFyc2VyIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nIik7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlIGZhaWwgMjogJWQsICVkIiwgZXJyLCBzeW5jaHJvbm91cyk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRCdWZmZXIoImFjY2Vzc1VuaXQiLCBhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLX0KLQotc3NpemVfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpmaW5kVHJhY2soYm9vbCB3YW50QXVkaW8pIGNvbnN0IHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MudmFsdWVBdChpKTsKLQotICAgICAgICBib29sIGlzQXVkaW8gPQotICAgICAgICAgICAgaW5mby0+bU1lZGlhSGFuZGxlclR5cGUgPT0gRk9VUkNDKCdzJywgJ28nLCAndScsICduJyk7Ci0KLSAgICAgICAgYm9vbCBpc1ZpZGVvID0KLSAgICAgICAgICAgIGluZm8tPm1NZWRpYUhhbmRsZXJUeXBlID09IEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOwotCi0gICAgICAgIGlmICgod2FudEF1ZGlvICYmIGlzQXVkaW8pIHx8ICghd2FudEF1ZGlvICYmICFpc0F1ZGlvKSkgewotICAgICAgICAgICAgaWYgKGluZm8tPm1TYW1wbGVEZXNjcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKLQotICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICBtQnVmZmVyID0gbmV3IEFCdWZmZXIoNTEyICogMTAyNCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLQotICAgICAgICAgICAgZW50ZXIoMGxsLCAwLCAwKTsKLQotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHJvY2VlZDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0soIW1TdXNwZW5kZWQpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvblByb2NlZWQoKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmICghbVN1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm9uUHJvY2VlZCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlYWRNb3JlOgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgbmVlZGVkOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibmVlZGVkIiwgJm5lZWRlZCkpOwotCi0gICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmJhc2UoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgbUJ1ZmZlclBvcyArPSBtQnVmZmVyLT5vZmZzZXQoKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9IG1CdWZmZXItPmNhcGFjaXR5KCkgLSBtQnVmZmVyLT5zaXplKCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvUmVhZCA8IG5lZWRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXNpemluZyBidWZmZXIuIik7Ci0KLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcigobUJ1ZmZlci0+c2l6ZSgpICsgbmVlZGVkICsgMTAyMykgJiB+MTAyMyk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG5ld0J1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CdWZmZXItPmNhcGFjaXR5KCkgLSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLX0dFKG1heEJ5dGVzVG9SZWFkLCBuZWVkZWQpOwotCi0gICAgICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJQb3MgKyBtQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgbmVlZGVkKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdCluZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVhY2hlZCBFT0Ygd2hlbiByZWFkaW5nICVkIEAgJWQgKyAlZCIsIG5lZWRlZCwgbUJ1ZmZlclBvcywgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GaW5hbFJlc3VsdCA9IEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgbik7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRHZXRGb3JtYXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdCh0cmFja0luZGV4KTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBpbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KDApLm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8tPm1TaWR4RHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGluZm8tPm1TaWR4RHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUgemVyby4gT2ggd2VsbC4uLgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJkdXJhdGlvblVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgKiBpbmZvLT5tRHVyYXRpb24gLyBpbmZvLT5tTWVkaWFUaW1lU2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiLCBmb3JtYXQpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdERlcXVldWVBY2Nlc3NVbml0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdhbnRBdWRpbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZ3YW50QXVkaW8pKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXggPSBmaW5kVHJhY2sod2FudEF1ZGlvKTsKLQotICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gdHJhY2tJbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKLSAgICAgICAgICAgICAgICBlcnIgPSBvbkRlcXVldWVBY2Nlc3NVbml0KHRyYWNrSW5kZXgsICZhY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotCi0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2Vla1RvOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigia1doYXRTZWVrVG8iKTsKLSAgICAgICAgICAgIGludDMyX3Qgd2FudEF1ZGlvOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJndhbnRBdWRpbykpOwotICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJwb3NpdGlvbiIsICZwb3NpdGlvbikpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgdHJhY2tJbmRleCA9IGZpbmRUcmFjayh3YW50QXVkaW8pOwotCi0gICAgICAgICAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSB0cmFja0luZGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBvblNlZWtUbyh3YW50QXVkaW8sIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpvblByb2NlZWQoKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgaWYgKChlcnIgPSBuZWVkKDgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHNpemUgPSByZWFkVTMyKDApOwotICAgIHVpbnQzMl90IHR5cGUgPSByZWFkVTMyKDQpOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDg7Ci0KLSAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmICgoZXJyID0gbmVlZCgxNikpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZSA9IHJlYWRVNjQob2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfQotCi0gICAgdWludDhfdCB1c2VyVHlwZVsxNl07Ci0KLSAgICBpZiAodHlwZSA9PSBGT1VSQ0MoJ3UnLCAndScsICdpJywgJ2QnKSkgewotICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgMTYpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSh1c2VyVHlwZSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCAxNik7Ci0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICB9Ci0KLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgdWludDMyX3QgcHR5cGUgPSBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAxKS5tVHlwZTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bURpc3BhdGNoZXJzID0KLSAgICAgICAgc2l6ZW9mKGtEaXNwYXRjaFRhYmxlKSAvIHNpemVvZihrRGlzcGF0Y2hUYWJsZVswXSk7Ci0KLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwga051bURpc3BhdGNoZXJzOyArK2kpIHsKLSAgICAgICAgaWYgKGtEaXNwYXRjaFRhYmxlW2ldLm1UeXBlID09IHR5cGUKLSAgICAgICAgICAgICAgICAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tUGFyZW50VHlwZSA9PSBwdHlwZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTYW1wbGVFbnRyeSBib3hlcyBhcmUgY29udGFpbmVyIGJveGVzIHRoYXQgc3RhcnQgd2l0aCBhIHZhcmlhYmxlCi0gICAgLy8gYW1vdW50IG9mIGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBtZWRpYSBoYW5kbGVyIHR5cGUuCi0gICAgLy8gV2UgZG9uJ3QgbG9vayBpbnNpZGUgJ2hpbnQnIHR5cGUgU2FtcGxlRW50cnkgYm94ZXMuCi0KLSAgICBib29sIGlzU2FtcGxlRW50cnlCb3ggPQotICAgICAgICAocHR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpCi0gICAgICAgICYmIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tTWVkaWFIYW5kbGVyVHlwZQotICAgICAgICAhPSBGT1VSQ0MoJ2gnLCAnaScsICduJywgJ3QnKTsKLQotICAgIGlmICgoaSA8IGtOdW1EaXNwYXRjaGVycyAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlciA9PSAwKQotICAgICAgICAgICAgfHwgaXNTYW1wbGVFbnRyeUJveCB8fCBwdHlwZSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKSkgewotICAgICAgICAvLyBUaGlzIGlzIGEgY29udGFpbmVyIGJveC4KLSAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmlyc3QgbW9vZiBAICUwOHgiLCBtQnVmZmVyUG9zICsgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBtRmlyc3RNb29mT2Zmc2V0ID0gbUJ1ZmZlclBvcyArIG9mZnNldCAtIDg7IC8vIHBvaW50IGF0IHRoZSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykpIHsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbmVlZChvZmZzZXQgKyA0KSkgPCBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZPVVJDQygncycsICd0JywgJ3MnLCAnZCcpKSB7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG5lZWQob2Zmc2V0ICsgOCkpIDwgT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRVMzIob2Zmc2V0ICsgNCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgYXQgbGVhc3Qgc29tZSBlbnRyaWVzLgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgfSBlbHNlIGlmIChpc1NhbXBsZUVudHJ5Qm94KSB7Ci0gICAgICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZTsKLQotICAgICAgICAgICAgc3dpdGNoIChlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygndicsICdpJywgJ2QnLCAnZScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeSArIDcwIGJ5dGVzIFZpc3VhbFNhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSA3ODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDggYnl0ZXMgU2FtcGxlRW50cnkgKyAyMCBieXRlcyBBdWRpb1NhbXBsZUVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSAyODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUgPSA4OyAgLy8gOCBieXRlcyBTYW1wbGVFbnRyeQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgaGVhZGVyU2l6ZSA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKG9mZnNldCArIGhlYWRlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1NZWRpYUhhbmRsZXJUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlVmlzdWFsU2FtcGxlRW50cnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBvZmZzZXQgKyBoZWFkZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvZmZzZXQsIG9mZnNldCArIGhlYWRlclNpemUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gaGVhZGVyU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNraXAob2Zmc2V0KTsKLQotICAgICAgICBBTE9HVigiJXNlbnRlcmluZyBib3ggb2YgdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksIEZvdXJjYzJTdHJpbmcodHlwZSkpOwotCi0gICAgICAgIGVudGVyKG1CdWZmZXJQb3MgLSBvZmZzZXQsIHR5cGUsIHNpemUgLSBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghZml0c0NvbnRhaW5lcihzaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA8IGtOdW1EaXNwYXRjaGVycyAmJiBrRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlciAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyBib3ggdHlwZS4KLQotICAgICAgICAgICAgaWYgKChlcnIgPSBuZWVkKHNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCIlc3BhcnNpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgIEluZGVudFN0cmluZyhtU3RhY2suc2l6ZSgpKSwgRm91cmNjMlN0cmluZyh0eXBlKSk7Ci0KLSAgICAgICAgICAgIGlmICgoZXJyID0gKHRoaXMtPiprRGlzcGF0Y2hUYWJsZVtpXS5tSGFuZGxlcikoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb2Zmc2V0LCBzaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVW5rbm93biBib3ggdHlwZQotCi0gICAgICAgICAgICBBTE9HVigiJXNza2lwcGluZyBib3ggb2YgdHlwZSAnJXMnLCBzaXplICVsbHUiLAotICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgIEZvdXJjYzJTdHJpbmcodHlwZSksIHNpemUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBza2lwKHNpemUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1pbnQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Q29tcGFyZVNhbXBsZUxvY2F0aW9uKAotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvKSB7Ci0gICAgaWYgKHNhbXBsZS5tT2Zmc2V0ICsgc2FtcGxlLm1TaXplIDwgbWRhdEluZm8ubU9mZnNldCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZS5tT2Zmc2V0ID49IG1kYXRJbmZvLm1PZmZzZXQgKyBtZGF0SW5mby5tQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIG1ha2Ugc3VyZSB0aGUgc2FtcGxlIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiB0aGlzCi0gICAgLy8gbWVkaWEgZGF0YSBibG9jay4KLQotICAgIENIRUNLX0dFKHNhbXBsZS5tT2Zmc2V0LCBtZGF0SW5mby5tT2Zmc2V0KTsKLQotICAgIENIRUNLX0xFKHNhbXBsZS5tT2Zmc2V0ICsgc2FtcGxlLm1TaXplLAotICAgICAgICAgICAgIG1kYXRJbmZvLm1PZmZzZXQgKyBtZGF0SW5mby5tQnVmZmVyLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cmVzdW1lSWZOZWNlc3NhcnkoKSB7Ci0gICAgaWYgKCFtU3VzcGVuZGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigicmVzdW1pbmcuIik7Ci0KLSAgICBtU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2NlZWQsIGlkKCkpKS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpnZXRTYW1wbGUoCi0gICAgICAgIFRyYWNrSW5mbyAqaW5mbywgc3A8VHJhY2tGcmFnbWVudD4gKmZyYWdtZW50LCBTYW1wbGVJbmZvICpzYW1wbGVJbmZvKSB7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoaW5mby0+bUZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAobUZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdW1lSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7Ci0gICAgICAgIH0KLQotICAgICAgICAqZnJhZ21lbnQgPSAqaW5mby0+bUZyYWdtZW50cy5iZWdpbigpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9ICgqZnJhZ21lbnQpLT5nZXRTYW1wbGUoc2FtcGxlSW5mbyk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVhbGx5LCBlbmQgb2YgdGhpcyBmcmFnbWVudC4uLgotCi0gICAgICAgIGluZm8tPm1GcmFnbWVudHMuZXJhc2UoaW5mby0+bUZyYWdtZW50cy5iZWdpbigpKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om9uRGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRWYWx1ZUF0KHRyYWNrSW5kZXgpOwotCi0gICAgc3A8VHJhY2tGcmFnbWVudD4gZnJhZ21lbnQ7Ci0gICAgU2FtcGxlSW5mbyBzYW1wbGVJbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZShpbmZvLCAmZnJhZ21lbnQsICZzYW1wbGVJbmZvKTsKLQotICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0KLSAgICBib29sIGNoZWNrRHJvcHBhYmxlID0gZmFsc2U7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYURhdGEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgTWVkaWFEYXRhSW5mbyAmbWRhdEluZm8gPSBtTWVkaWFEYXRhLml0ZW1BdChpKTsKLQotICAgICAgICBpbnQgY21wID0gQ29tcGFyZVNhbXBsZUxvY2F0aW9uKHNhbXBsZUluZm8sIG1kYXRJbmZvKTsKLQotICAgICAgICBpZiAoY21wIDwgMCAmJiAhbVNvdXJjZS0+aXNTZWVrYWJsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVQSVBFOwotICAgICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaGVja0Ryb3BwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IG1ha2VBY2Nlc3NVbml0KGluZm8sIHNhbXBsZUluZm8sIG1kYXRJbmZvLCBhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZyYWdtZW50LT5hZHZhbmNlKCk7Ci0KLSAgICBpZiAoIW1NZWRpYURhdGEuZW1wdHkoKSAmJiBjaGVja0Ryb3BwYWJsZSkgewotICAgICAgICBzaXplX3QgbnVtRHJvcHBhYmxlID0gMDsKLSAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gWFhYIEZJWE1FOiBpZiBvbmUgb2YgdGhlIHRyYWNrcyBpcyBub3QgYWR2YW5jZWQgKGUuZy4gaWYgeW91IHBsYXkgYW4gYXVkaW8rdmlkZW8KLSAgICAgICAgLy8gZmlsZSB3aXRoIHNmMiksIHRoZW4gbU1lZGlhRGF0YSB3aWxsIG5vdCBiZSBwcnVuZWQgYW5kIGtlZXBzIGdyb3dpbmcKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7ICFkb25lICYmIGkgPCBtTWVkaWFEYXRhLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBNZWRpYURhdGFJbmZvICZtZGF0SW5mbyA9IG1NZWRpYURhdGEuaXRlbUF0KGkpOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1UcmFja3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0VmFsdWVBdChqKTsKLQotICAgICAgICAgICAgICAgIHNwPFRyYWNrRnJhZ21lbnQ+IGZyYWdtZW50OwotICAgICAgICAgICAgICAgIFNhbXBsZUluZm8gc2FtcGxlSW5mbzsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRTYW1wbGUoaW5mbywgJmZyYWdtZW50LCAmc2FtcGxlSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgY21wID0gQ29tcGFyZVNhbXBsZUxvY2F0aW9uKHNhbXBsZUluZm8sIG1kYXRJbmZvKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbXAgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICArK251bURyb3BwYWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudW1Ecm9wcGFibGUgPiAwKSB7Ci0gICAgICAgICAgICBtTWVkaWFEYXRhLnJlbW92ZUl0ZW1zQXQoMCwgbnVtRHJvcHBhYmxlKTsKLQotICAgICAgICAgICAgaWYgKG1NZWRpYURhdGEuc2l6ZSgpIDwgNSkgewotICAgICAgICAgICAgICAgIHJlc3VtZUlmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc2l6ZV90IHBhcnNlTkFMU2l6ZShzaXplX3QgbmFsTGVuZ3RoU2l6ZSwgY29uc3QgdWludDhfdCAqZGF0YSkgewotICAgIHN3aXRjaCAobmFsTGVuZ3RoU2l6ZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gKmRhdGE7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiBVMTZfQVQoZGF0YSk7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiAoKHNpemVfdClkYXRhWzBdIDw8IDE2KSB8IFUxNl9BVCgmZGF0YVsxXSk7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJldHVybiBVMzJfQVQoZGF0YSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuLCBtTkFMTGVuZ3RoU2l6ZSBzcHJpbmdzIHRvIGxpZmUgYnkgYWRkaW5nIDEgdG8KLSAgICAvLyBhIDItYml0IGludGVnZXIuCi0gICAgVFJFU1BBU1MoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjptYWtlQWNjZXNzVW5pdCgKLSAgICAgICAgVHJhY2tJbmZvICppbmZvLAotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZzYW1wbGUsCi0gICAgICAgIGNvbnN0IE1lZGlhRGF0YUluZm8gJm1kYXRJbmZvLAotICAgICAgICBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIGlmIChzYW1wbGUubVNhbXBsZURlc2NJbmRleCA8IDEKLSAgICAgICAgICAgIHx8IHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4ID4gaW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzID0KLSAgICAgICAgMTAwMDAwMGxsICogc2FtcGxlLm1QcmVzZW50YXRpb25UaW1lIC8gaW5mby0+bU1lZGlhVGltZVNjYWxlOwotCi0gICAgY29uc3QgU2FtcGxlRGVzY3JpcHRpb24gJnNhbXBsZURlc2MgPQotICAgICAgICBpbmZvLT5tU2FtcGxlRGVzY3MuaXRlbUF0KHNhbXBsZS5tU2FtcGxlRGVzY0luZGV4IC0gMSk7Ci0KLSAgICBzaXplX3QgbmFsTGVuZ3RoU2l6ZTsKLSAgICBpZiAoIXNhbXBsZURlc2MubUZvcm1hdC0+ZmluZFNpemUoIm5hbC1sZW5ndGgtc2l6ZSIsICZuYWxMZW5ndGhTaXplKSkgewotICAgICAgICAqYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHNhbXBsZS5tU2l6ZSk7Ci0KLSAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSwKLSAgICAgICAgICAgICAgIG1kYXRJbmZvLm1CdWZmZXItPmRhdGEoKSArIChzYW1wbGUubU9mZnNldCAtIG1kYXRJbmZvLm1PZmZzZXQpLAotICAgICAgICAgICAgICAgc2FtcGxlLm1TaXplKTsKLQotICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBwcmVzZW50YXRpb25UaW1lVXMpOwotICAgICAgICBpZiAoSXNJRFIoKmFjY2Vzc1VuaXQpKSB7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqc3JjUHRyID0KLSAgICAgICAgbWRhdEluZm8ubUJ1ZmZlci0+ZGF0YSgpICsgKHNhbXBsZS5tT2Zmc2V0IC0gbWRhdEluZm8ubU9mZnNldCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDIgOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzYW1wbGUubVNpemUpIHsKLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBuYWxMZW5ndGhTaXplID4gc2FtcGxlLm1TaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IG5hbFNpemUgPSBwYXJzZU5BTFNpemUobmFsTGVuZ3RoU2l6ZSwgJnNyY1B0cltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGhTaXplOwotCi0gICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsU2l6ZSA+IHNhbXBsZS5tU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpID09IDEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKCphY2Nlc3NVbml0KS0+ZGF0YSgpICsgZHN0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMSIsCi0gICAgICAgICAgICAgICAgICAgICAgIDQpOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KCgqYWNjZXNzVW5pdCktPmRhdGEoKSArIGRzdE9mZnNldCArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciArIHNyY09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxTaXplOwotICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbFNpemUgKyA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgKCphY2Nlc3NVbml0KSA9IG5ldyBBQnVmZmVyKGRzdE9mZnNldCk7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAidGltZVVzIiwgcHJlc2VudGF0aW9uVGltZVVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoSXNJRFIoKmFjY2Vzc1VuaXQpKSB7Ci0gICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoImlzLXN5bmMtZnJhbWUiLCAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6Om5lZWQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoIWZpdHNDb250YWluZXIoc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPD0gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZE1vcmUsIGlkKCkpOwotICAgIG1zZy0+c2V0U2l6ZSgibmVlZGVkIiwgc2l6ZSAtIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICAvLyBBTE9HVigibmVlZCglZCkgcmV0dXJuaW5nIC1FQUdBSU4sIG9ubHkgaGF2ZSAlZCIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gLUVBR0FJTjsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjplbnRlcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgdHlwZSwgdWludDY0X3Qgc2l6ZSkgewotICAgIENvbnRhaW5lciBjb250YWluZXI7Ci0gICAgY29udGFpbmVyLm1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgY29udGFpbmVyLm1UeXBlID0gdHlwZTsKLSAgICBjb250YWluZXIubUV4dGVuZHNUb0VPRiA9IChzaXplID09IDApOwotICAgIGNvbnRhaW5lci5tQnl0ZXNSZW1haW5pbmcgPSBzaXplOwotCi0gICAgbVN0YWNrLnB1c2goY29udGFpbmVyKTsKLX0KLQotYm9vbCBGcmFnbWVudGVkTVA0UGFyc2VyOjpmaXRzQ29udGFpbmVyKHVpbnQ2NF90IHNpemUpIGNvbnN0IHsKLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgY29uc3QgQ29udGFpbmVyICZjb250YWluZXIgPSBtU3RhY2suaXRlbUF0KG1TdGFjay5zaXplKCkgLSAxKTsKLQotICAgIHJldHVybiBjb250YWluZXIubUV4dGVuZHNUb0VPRiB8fCBzaXplIDw9IGNvbnRhaW5lci5tQnl0ZXNSZW1haW5pbmc7Ci19Ci0KLXVpbnQxNl90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVMTYoc2l6ZV90IG9mZnNldCkgewotICAgIENIRUNLX0xFKG9mZnNldCArIDIsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0gICAgcmV0dXJuIChwdHJbMF0gPDwgOCkgfCBwdHJbMV07Ci19Ci0KLXVpbnQzMl90IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnJlYWRVMzIoc2l6ZV90IG9mZnNldCkgewotICAgIENIRUNLX0xFKG9mZnNldCArIDQsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0gICAgcmV0dXJuIChwdHJbMF0gPDwgMjQpIHwgKHB0clsxXSA8PCAxNikgfCAocHRyWzJdIDw8IDgpIHwgcHRyWzNdOwotfQotCi11aW50NjRfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpyZWFkVTY0KHNpemVfdCBvZmZzZXQpIHsKLSAgICByZXR1cm4gKCgodWludDY0X3QpcmVhZFUzMihvZmZzZXQpKSA8PCAzMikgfCByZWFkVTMyKG9mZnNldCArIDQpOwotfQotCi12b2lkIEZyYWdtZW50ZWRNUDRQYXJzZXI6OnNraXAob2ZmX3QgZGlzdGFuY2UpIHsKLSAgICBDSEVDSyghbVN0YWNrLmlzRW1wdHkoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IG1TdGFjay5zaXplKCk7IGktLSA+IDA7KSB7Ci0gICAgICAgIENvbnRhaW5lciAqY29udGFpbmVyID0gJm1TdGFjay5lZGl0SXRlbUF0KGkpOwotICAgICAgICBpZiAoIWNvbnRhaW5lci0+bUV4dGVuZHNUb0VPRikgewotICAgICAgICAgICAgQ0hFQ0tfTEUoZGlzdGFuY2UsIChvZmZfdCljb250YWluZXItPm1CeXRlc1JlbWFpbmluZyk7Ci0KLSAgICAgICAgICAgIGNvbnRhaW5lci0+bUJ5dGVzUmVtYWluaW5nIC09IGRpc3RhbmNlOwotCi0gICAgICAgICAgICBpZiAoY29udGFpbmVyLT5tQnl0ZXNSZW1haW5pbmcgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlc2xlYXZpbmcgYm94IG9mIHR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRTdHJpbmcobVN0YWNrLnNpemUoKSAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgRm91cmNjMlN0cmluZyhjb250YWluZXItPm1UeXBlKSk7Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8IHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm9ybWF0ICMlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLml0ZW1BdChpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubUZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci0+bVR5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudC0+c2lnbmFsQ29tcGxldGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrSW5mby0+bUZyYWdtZW50cy5lbXB0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tRnJhZ21lbnRzLnB1c2hfYmFjayh0cmFja0luZm8tPm1TdGF0aWNGcmFnbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVN0YXRpY0ZyYWdtZW50LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrRnJhZ21lbnQ+ICZmcmFnbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLS10cmFja0luZm8tPm1GcmFnbWVudHMuZW5kKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RHluYW1pY1RyYWNrRnJhZ21lbnQgKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuZ2V0KCkpLT5zaWduYWxDb21wbGV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluZXItPm1UeXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Eb25lV2l0aE1vb3YgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbVN0YWNrLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGlzdGFuY2UgPCAob2ZmX3QpbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgIG1CdWZmZXItPnNldFJhbmdlKG1CdWZmZXItPm9mZnNldCgpICsgZGlzdGFuY2UsIG1CdWZmZXItPnNpemUoKSAtIGRpc3RhbmNlKTsKLSAgICAgICAgbUJ1ZmZlclBvcyArPSBkaXN0YW5jZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwotICAgIG1CdWZmZXJQb3MgKz0gZGlzdGFuY2U7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tIZWFkZXIoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gZmxhZ3MgPj4gMjQ7Ci0gICAgZmxhZ3MgJj0gMHhmZmZmZmY7Ci0KLSAgICB1aW50MzJfdCB0cmFja0lEOwotICAgIHVpbnQ2NF90IGR1cmF0aW9uOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICBpZiAob2Zmc2V0ICsgMzYgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLSAgICAgICAgZHVyYXRpb24gPSByZWFkVTY0KG9mZnNldCArIDI4KTsKLQotICAgICAgICBvZmZzZXQgKz0gMzY7Ci0gICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDI0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyAxMik7Ci0gICAgICAgIGR1cmF0aW9uID0gcmVhZFUzMihvZmZzZXQgKyAyMCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDI0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayh0cmFja0lELCB0cnVlIC8qIGNyZWF0ZUlmTmVjZXNzYXJ5ICovKTsKLSAgICBpbmZvLT5tRmxhZ3MgPSBmbGFnczsKLSAgICBpbmZvLT5tRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICBpZiAoaW5mby0+bUR1cmF0aW9uID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgLy8gZmZtcGVnIHNldHMgdGhpcyB0byAtMSwgd2hpY2ggaXMgaW5jb3JyZWN0LgotICAgICAgICBpbmZvLT5tRHVyYXRpb24gPSAwOwotICAgIH0KLQotICAgIGluZm8tPm1TdGF0aWNGcmFnbWVudCA9IG5ldyBTdGF0aWNUcmFja0ZyYWdtZW50OwotCi0gICAgbUN1cnJlbnRUcmFja0lEID0gdHJhY2tJRDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYUhlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uQW5kRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAodmVyc2lvbkFuZEZsYWdzICYgMHhmZmZmZmYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uID0gdmVyc2lvbkFuZEZsYWdzID4+IDI0OwotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ICsgMzIgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgPSBVMzJfQVQobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0ICsgMjApOwotICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ICsgMjAgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWVkaWFUaW1lU2NhbGUgPSBVMzJfQVQobUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0ICsgMTIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZU1lZGlhSGFuZGxlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IGhhbmRsZXJUeXBlID0gcmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIHN3aXRjaCAoaGFuZGxlclR5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAnaScsICdkJywgJ2UnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnbycsICd1JywgJ24nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnaScsICduJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bU1lZGlhSGFuZGxlclR5cGUgPSBoYW5kbGVyVHlwZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VWaXN1YWxTYW1wbGVFbnRyeSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA3OCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnB1c2goKTsKLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlRGVzYy0+bVR5cGUgPSB0eXBlOwotICAgIHNhbXBsZURlc2MtPm1EYXRhUmVmSW5kZXggPSByZWFkVTE2KG9mZnNldCArIDYpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPVVJDQygncycsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIHJlYWRVMTYob2Zmc2V0ICsgOCArIDE2KSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgcmVhZFUxNihvZmZzZXQgKyA4ICsgMTgpKTsKLQotICAgIHNhbXBsZURlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQXVkaW9TYW1wbGVFbnRyeSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAyOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKTsKLQotICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnB1c2goKTsKLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlRGVzYy0+bVR5cGUgPSB0eXBlOwotICAgIHNhbXBsZURlc2MtPm1EYXRhUmVmSW5kZXggPSByZWFkVTE2KG9mZnNldCArIDYpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLQotICAgIGZvcm1hdC0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCByZWFkVTE2KG9mZnNldCArIDggKyA4KSk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXNpemUiLCByZWFkVTE2KG9mZnNldCArIDggKyAxMCkpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcmVhZFUzMihvZmZzZXQgKyA4ICsgMTYpIC8gNjU1MzYuMGYpOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIDEpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCA4MDAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6Ci0gICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMSk7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDE2MDAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgdm9pZCBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgaW5kZXgsCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICBib29sIGluc2VydFN0YXJ0Q29kZSA9IGZhbHNlKSB7Ci0gICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIoaW5zZXJ0U3RhcnRDb2RlID8gc2l6ZSArIDQgOiBzaXplKTsKLQotICAgIG1lbWNweShjc2QtPmRhdGEoKSArIChpbnNlcnRTdGFydENvZGUgPyA0IDogMCksIGRhdGEsIHNpemUpOwotCi0gICAgaWYgKGluc2VydFN0YXJ0Q29kZSkgewotICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksICJceDAwXHgwMFx4MDBceDAxIiwgNCk7Ci0gICAgfQotCi0gICAgY3NkLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICBjc2QtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDBsbCk7Ci0KLSAgICBmb3JtYXQtPnNldEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lZCIsIGluZGV4KS5jX3N0cigpLCBjc2QpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgcmV0dXJuIGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpLT5tU3RhdGljRnJhZ21lbnQtPnBhcnNlU2FtcGxlU2l6ZXMoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICB0aGlzLCB0eXBlLCBvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIHJldHVybiBlZGl0VHJhY2sobUN1cnJlbnRUcmFja0lEKS0+bVN0YXRpY0ZyYWdtZW50LT5wYXJzZUNodW5rT2Zmc2V0cygKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICByZXR1cm4gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCktPm1TdGF0aWNGcmFnbWVudC0+cGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgICAgIHRoaXMsIHR5cGUsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBUcmFja0luZm8gKnRyYWNrSW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotCi0gICAgU2FtcGxlRGVzY3JpcHRpb24gKnNhbXBsZURlc2MgPQotICAgICAgICAmdHJhY2tJbmZvLT5tU2FtcGxlRGVzY3MuZWRpdEl0ZW1BdCgKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5zaXplKCkgLSAxKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0KLSAgICBzaXplIC09IG9mZnNldDsKLSAgICBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNpemUgPCA3IHx8IHB0clswXSAhPSAweDAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc2FtcGxlRGVzYy0+bUZvcm1hdC0+c2V0U2l6ZSgibmFsLWxlbmd0aC1zaXplIiwgMSArIChwdHJbNF0gJiAzKSk7Ci0KLSAgICBzaXplX3QgbnVtU1BTID0gcHRyWzVdICYgMzE7Ci0KLSAgICBwdHIgKz0gNjsKLSAgICBzaXplIC09IDY7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNQUzsgKytpKSB7Ci0gICAgICAgIGlmIChzaXplIDwgMikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBsZW5ndGggPSBVMTZfQVQocHRyKTsKLQotICAgICAgICBwdHIgKz0gMjsKLSAgICAgICAgc2l6ZSAtPSAyOwotCi0gICAgICAgIGlmIChzaXplIDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAgICAgc2FtcGxlRGVzYy0+bUZvcm1hdCwgaSwgcHRyLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbnNlcnRTdGFydENvZGUgKi8pOwotCi0gICAgICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gbGVuZ3RoOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNpemVfdCBudW1QUFMgPSAqcHRyOwotICAgICsrcHRyOwotICAgIC0tc2l6ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUFBTOyArK2kpIHsKLSAgICAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IFUxNl9BVChwdHIpOwotCi0gICAgICAgIHB0ciArPSAyOwotICAgICAgICBzaXplIC09IDI7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LCBudW1TUFMgKyBpLCBwdHIsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICB0cnVlIC8qIGluc2VydFN0YXJ0Q29kZSAqLyk7Ci0KLSAgICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICAgICAgc2l6ZSAtPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZUVTRFNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gZWRpdFRyYWNrKG1DdXJyZW50VHJhY2tJRCk7Ci0KLSAgICBTYW1wbGVEZXNjcmlwdGlvbiAqc2FtcGxlRGVzYyA9Ci0gICAgICAgICZ0cmFja0luZm8tPm1TYW1wbGVEZXNjcy5lZGl0SXRlbUF0KAotICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bVNhbXBsZURlc2NzLnNpemUoKSAtIDEpOwotCi0gICAgaWYgKHNhbXBsZURlc2MtPm1UeXBlICE9IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpCi0gICAgICAgICAgICAmJiBzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7Ci0KLSAgICBzaXplIC09IG9mZnNldDsKLSAgICBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmIChVMzJfQVQocHRyKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHB0ciArPSA0OwotICAgIHNpemUgLT00OwotCi0gICAgRVNEUyBlc2RzKHB0ciwgc2l6ZSk7Ci0KLSAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOwotICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpjc2Q7Ci0gICAgc2l6ZV90IGNzZF9zaXplOwotICAgIGlmIChlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAotICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKSZjc2QsICZjc2Rfc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBhZGRDb2RlY1NwZWNpZmljRGF0YShzYW1wbGVEZXNjLT5tRm9ybWF0LCAwLCBjc2QsIGNzZF9zaXplKTsKLQotICAgIGlmIChzYW1wbGVEZXNjLT5tVHlwZSAhPSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplID09IDApIHsKLSAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKLSAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBtcGVnNCBoZWFkZXJzCi0gICAgICAgIC8vIGlzIGFjY3VyYXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNzZF9zaXplIDwgMikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IG9iamVjdFR5cGUgPSBjc2RbMF0gPj4gMzsKLQotICAgIGlmIChvYmplY3RUeXBlID09IDMxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmcmVxSW5kZXggPSAoY3NkWzBdICYgNykgPDwgMSB8IChjc2RbMV0gPj4gNyk7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKLSAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKLSAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7Ci0gICAgICAgIGlmIChjc2Rfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVSYXRlID0gKGNzZFsxXSAmIDB4N2YpIDw8IDE3Ci0gICAgICAgICAgICAgICAgICAgICAgICB8IGNzZFsyXSA8PCA5Ci0gICAgICAgICAgICAgICAgICAgICAgICB8IGNzZFszXSA8PCAxCi0gICAgICAgICAgICAgICAgICAgICAgICB8IChjc2RbNF0gPj4gNyk7Ci0KLSAgICAgICAgbnVtQ2hhbm5lbHMgPSAoY3NkWzRdID4+IDMpICYgMTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGljIHVpbnQzMl90IGtTYW1wbGluZ1JhdGVbXSA9IHsKLSAgICAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKLSAgICAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAoZnJlcUluZGV4ID09IDEzIHx8IGZyZXFJbmRleCA9PSAxNCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2ZyZXFJbmRleF07Ci0gICAgICAgIG51bUNoYW5uZWxzID0gKGNzZFsxXSA+PiAzKSAmIDE1OwotICAgIH0KLQotICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKLSAgICBzYW1wbGVEZXNjLT5tRm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VNZWRpYURhdGEoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBBTE9HVigic2tpcHBpbmcgJ21kYXQnIGNodW5rIGF0IG9mZnNldHMgMHglMDhseC0weCUwOGxseC4iLAotICAgICAgICAgIG1CdWZmZXJQb3MgKyBvZmZzZXQsIG1CdWZmZXJQb3MgKyBzaXplKTsKLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUgLSBvZmZzZXQpOwotICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKLQotICAgIG1NZWRpYURhdGEucHVzaCgpOwotICAgIE1lZGlhRGF0YUluZm8gKmluZm8gPSAmbU1lZGlhRGF0YS5lZGl0SXRlbUF0KG1NZWRpYURhdGEuc2l6ZSgpIC0gMSk7Ci0gICAgaW5mby0+bUJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBpbmZvLT5tT2Zmc2V0ID0gbUJ1ZmZlclBvcyArIG9mZnNldDsKLQotICAgIGlmIChtTWVkaWFEYXRhLnNpemUoKSA+IDEwKSB7Ci0gICAgICAgIEFMT0dWKCJzdXNwZW5kaW5nIGZvciBub3cuIik7Ci0gICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VTZWdtZW50SW5kZXgoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBBTE9HVigic2lkeCBib3ggdHlwZSAlZCwgb2Zmc2V0ICVkLCBzaXplICVkIiwgdHlwZSwgaW50KG9mZnNldCksIGludChzaXplKSk7Ci0vLyAgICBBU3RyaW5nIHNpZHhzdHI7Ci0vLyAgICBoZXhkdW1wKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgc2l6ZSwgMCAvKiBpbmRlbnQgKi8sICZzaWR4c3RyKTsKLS8vICAgIEFMT0dWKCJyYXcgc2lkeDoiKTsKLS8vICAgIEFMT0dWKCIlcyIsIHNpZHhzdHIuY19zdHIoKSk7Ci0gICAgaWYgKG9mZnNldCArIDEyID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKLSAgICBmbGFncyAmPSAweGZmZmZmZjsKLQotICAgIEFMT0dWKCJzaWR4IHZlcnNpb24gJWQiLCB2ZXJzaW9uKTsKLQotICAgIHVpbnQzMl90IHJlZmVyZW5jZUlkID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICB1aW50MzJfdCB0aW1lU2NhbGUgPSByZWFkVTMyKG9mZnNldCArIDgpOwotICAgIEFMT0dWKCJzaWR4IHJlZmlkL3RpbWVzY2FsZTogJWQvJWQiLCByZWZlcmVuY2VJZCwgdGltZVNjYWxlKTsKLQotICAgIHVpbnQ2NF90IGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZTsKLSAgICB1aW50NjRfdCBmaXJzdE9mZnNldDsKLQotICAgIG9mZnNldCArPSAxMjsKLQotICAgIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIGZpcnN0T2Zmc2V0ID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDE2ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWFybGllc3RQcmVzZW50YXRpb25UaW1lID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBmaXJzdE9mZnNldCA9IHJlYWRVNjQob2Zmc2V0ICsgOCk7Ci0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICB9Ci0gICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICVMZC8lTGQiLCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUsIGZpcnN0T2Zmc2V0KTsKLQotICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKHJlYWRVMTYob2Zmc2V0KSAhPSAwKSB7IC8vIHJlc2VydmVkCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBpbnQzMl90IHJlZmVyZW5jZUNvdW50ID0gcmVhZFUxNihvZmZzZXQgKyAyKTsKLSAgICBvZmZzZXQgKz0gNDsKLSAgICBBTE9HVigicmVmY291bnQ6ICVkIiwgcmVmZXJlbmNlQ291bnQpOwotCi0gICAgaWYgKG9mZnNldCArIHJlZmVyZW5jZUNvdW50ICogMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtQ3VycmVudFRyYWNrSUQpOwotICAgIHVpbnQ2NF90IHRvdGFsX2R1cmF0aW9uID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZUNvdW50OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgZDEgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIHVpbnQzMl90IGQyID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICAgICAgdWludDMyX3QgZDMgPSByZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgICAgIGlmIChkMSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJzdWItc2lkeCBib3hlcyBub3Qgc3VwcG9ydGVkIHlldCIpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgc2FwID0gZDMgJiAweDgwMDAwMDAwOwotICAgICAgICBib29sIHNhcHR5cGUgPSBkMyA+PiAyODsKLSAgICAgICAgaWYgKCFzYXAgfHwgc2FwdHlwZSA+IDIpIHsKLSAgICAgICAgICAgIEFMT0dXKCJub3QgYSBzdHJlYW0gYWNjZXNzIHBvaW50LCBvciB1bnN1cHBvcnRlZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxfZHVyYXRpb24gKz0gZDI7Ci0gICAgICAgIG9mZnNldCArPSAxMjsKLSAgICAgICAgQUxPR1YoIiBpdGVtICVkLCAlMDh4ICUwOHggJTA4eCIsIGksIGQxLCBkMiwgZDMpOwotICAgICAgICBTaWR4RW50cnkgc2U7Ci0gICAgICAgIHNlLm1TaXplID0gZDEgJiAweDdmZmZmZmZmOwotICAgICAgICBzZS5tRHVyYXRpb25VcyA9IDEwMDAwMDBMTCAqIGQyIC8gdGltZVNjYWxlOwotICAgICAgICBpbmZvLT5tU2lkeC5hZGQoc2UpOwotICAgIH0KLQotICAgIGluZm8tPm1TaWR4RHVyYXRpb24gPSB0b3RhbF9kdXJhdGlvbiAqIDEwMDAwMDAgLyB0aW1lU2NhbGU7Ci0gICAgQUxPR1YoImR1cmF0aW9uOiAlbGxkIiwgaW5mby0+bVNpZHhEdXJhdGlvbik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpwYXJzZVRyYWNrRXh0ZW5kcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAyNCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHVpbnQzMl90IHRyYWNrSUQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgVHJhY2tJbmZvICppbmZvID0gZWRpdFRyYWNrKHRyYWNrSUQsIHRydWUgLyogY3JlYXRlSWZOZWNlc3NhcnkgKi8pOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRGVzY3JpcHRpb25JbmRleCA9IHJlYWRVMzIob2Zmc2V0ICsgOCk7Ci0gICAgaW5mby0+bURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IHJlYWRVMzIob2Zmc2V0ICsgMTIpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0ICsgMTYpOwotICAgIGluZm8tPm1EZWZhdWx0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCArIDIwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tJbmZvICpGcmFnbWVudGVkTVA0UGFyc2VyOjplZGl0VHJhY2soCi0gICAgICAgIHVpbnQzMl90IHRyYWNrSUQsIGJvb2wgY3JlYXRlSWZOZWNlc3NhcnkpIHsKLSAgICBzc2l6ZV90IGkgPSBtVHJhY2tzLmluZGV4T2ZLZXkodHJhY2tJRCk7Ci0KLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIHJldHVybiAmbVRyYWNrcy5lZGl0VmFsdWVBdChpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNyZWF0ZUlmTmVjZXNzYXJ5KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFRyYWNrSW5mbyBpbmZvOwotICAgIGluZm8ubVRyYWNrSUQgPSB0cmFja0lEOwotICAgIGluZm8ubUZsYWdzID0gMDsKLSAgICBpbmZvLm1EdXJhdGlvbiA9IDB4ZmZmZmZmZmY7Ci0gICAgaW5mby5tU2lkeER1cmF0aW9uID0gMDsKLSAgICBpbmZvLm1NZWRpYVRpbWVTY2FsZSA9IDA7Ci0gICAgaW5mby5tTWVkaWFIYW5kbGVyVHlwZSA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbiA9IDA7Ci0gICAgaW5mby5tRGVmYXVsdFNhbXBsZVNpemUgPSAwOwotICAgIGluZm8ubURlZmF1bHRTYW1wbGVGbGFncyA9IDA7Ci0KLSAgICBpbmZvLm1EZWNvZGluZ1RpbWUgPSAwOwotCi0gICAgbVRyYWNrcy5hZGQodHJhY2tJRCwgaW5mbyk7Ci0gICAgcmV0dXJuICZtVHJhY2tzLmVkaXRWYWx1ZUF0KG1UcmFja3MuaW5kZXhPZktleSh0cmFja0lEKSk7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcigKLSAgICAgICAgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IHJlYWRVMzIob2Zmc2V0KTsKLQotICAgIGlmIChmbGFncyAmIDB4ZmYwMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncyA9IGZsYWdzOwotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEID0gcmVhZFUzMihvZmZzZXQgKyA0KTsKLSAgICBvZmZzZXQgKz0gODsKLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprQmFzZURhdGFPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0ID0gcmVhZFU2NChvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXggPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUZsYWdzID0gcmVhZFUzMihvZmZzZXQpOwotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoIShmbGFncyAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprQmFzZURhdGFPZmZzZXRQcmVzZW50KSkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBwb2ludCB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlCi0gICAgICAgIC8vIGVuY2xvc2luZyAnbW9vZicgY29udGFpbmVyIGZvciB0aGUgZmlyc3QgdHJhY2sgYW5kCi0gICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGRhdGEgb2YgdGhlIHByZWNlZGluZyBmcmFnbWVudCBmb3Igc3Vic2VxdWVudAotICAgICAgICAvLyB0cmFja3MuCi0KLSAgICAgICAgQ0hFQ0tfR0UobVN0YWNrLnNpemUoKSwgMnUpOwotCi0gICAgICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgPQotICAgICAgICAgICAgbVN0YWNrLml0ZW1BdChtU3RhY2suc2l6ZSgpIC0gMikubU9mZnNldDsKLQotICAgICAgICAvLyBYWFggVE9ETzogVGhpcyBkb2VzIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZSAybmQgYW5kCi0gICAgICAgIC8vIHN1YnNlcXVlbnQgdHJhY2tzIHlldC4KLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPQotICAgICAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUJhc2VEYXRhT2Zmc2V0OwotCi0gICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSBlZGl0VHJhY2sobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1UcmFja0lEKTsKLQotICAgIGlmICh0cmFja0luZm8tPm1GcmFnbWVudHMuZW1wdHkoKQotICAgICAgICAgICAgfHwgKCp0cmFja0luZm8tPm1GcmFnbWVudHMuYmVnaW4oKSktPmNvbXBsZXRlKCkpIHsKLSAgICAgICAgdHJhY2tJbmZvLT5tRnJhZ21lbnRzLnB1c2hfYmFjayhuZXcgRHluYW1pY1RyYWNrRnJhZ21lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6cGFyc2VUcmFja0ZyYWdtZW50UnVuKAotICAgICAgICB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGVudW0gewotICAgICAgICBrRGF0YU9mZnNldFByZXNlbnQgICAgICAgICAgICAgICAgICA9IDB4MDEsCi0gICAgICAgIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgICAgICAgID0gMHgwNCwKLSAgICAgICAga1NhbXBsZUR1cmF0aW9uUHJlc2VudCAgICAgICAgICAgICAgPSAweDEwMCwKLSAgICAgICAga1NhbXBsZVNpemVQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDIwMCwKLSAgICAgICAga1NhbXBsZUZsYWdzUHJlc2VudCAgICAgICAgICAgICAgICAgPSAweDQwMCwKLSAgICAgICAga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQgPSAweDgwMCwKLSAgICB9OwotCi0gICAgdWludDMyX3QgZmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmICgoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpKSB7Ci0gICAgICAgIC8vIFRoZXNlIHR3byBzaGFsbCBub3QgYmUgdXNlZCB0b2dldGhlci4KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSByZWFkVTMyKG9mZnNldCArIDQpOwotICAgIG9mZnNldCArPSA4OwotCi0gICAgdWludDY0X3QgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldDsKLQotICAgIHVpbnQzMl90IGZpcnN0U2FtcGxlRmxhZ3MgPSAwOwotCi0gICAgaWYgKGZsYWdzICYga0RhdGFPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgKyA0ID4gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IGRhdGFPZmZzZXREZWx0YSA9IChpbnQzMl90KXJlYWRVMzIob2Zmc2V0KTsKLQotICAgICAgICBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCArIGRhdGFPZmZzZXREZWx0YTsKLQotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgaWYgKG9mZnNldCArIDQgPiBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGZpcnN0U2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIFRyYWNrSW5mbyAqaW5mbyA9IGVkaXRUcmFjayhtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQpOwotCi0gICAgaWYgKGluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVEdXJhdGlvbiA9IDAsIHNhbXBsZVNpemUgPSAwLCBzYW1wbGVGbGFncyA9IDAsCi0gICAgICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKLQotICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IDA7Ci0gICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbjsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IGluZm8tPm1EZWZhdWx0U2FtcGxlRHVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBpbmZvLT5tRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSBpZiAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgc2FtcGxlRmxhZ3MgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFnczsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVGbGFncyA9IGluZm8tPm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgewotICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotICAgIH0KLQotICAgIGlmIChvZmZzZXQgKyBzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVEZXNjSW5kZXggPQotICAgICAgICAobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1GbGFncwotICAgICAgICAgICAgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a1NhbXBsZURlc2NyaXB0aW9uSW5kZXhQcmVzZW50KQotICAgICAgICAgICAgPyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVNhbXBsZURlc2NyaXB0aW9uSW5kZXgKLSAgICAgICAgICAgIDogaW5mby0+bURlZmF1bHRTYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlU2l6ZSA9IHJlYWRVMzIob2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkgewotICAgICAgICAgICAgc2FtcGxlRmxhZ3MgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50KSB7Ci0gICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSByZWFkVTMyKG9mZnNldCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlIGF0IG9mZnNldCAweCUwOGxseCwgc2l6ZSAldSwgZHVyYXRpb24gJXUsICIKLSAgICAgICAgICAgICAgInNhbXBsZURlc2NJbmRleD0ldSwgZmxhZ3MgMHglMDh4IiwKLSAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOwotCi0gICAgICAgIGNvbnN0IHNwPFRyYWNrRnJhZ21lbnQ+ICZmcmFnbWVudCA9ICotLWluZm8tPm1GcmFnbWVudHMuZW5kKCk7Ci0KLSAgICAgICAgdWludDMyX3QgZGVjb2RpbmdUaW1lID0gaW5mby0+bURlY29kaW5nVGltZTsKLSAgICAgICAgaW5mby0+bURlY29kaW5nVGltZSArPSBzYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSA9IGRlY29kaW5nVGltZSArIHNhbXBsZUN0c09mZnNldDsKLQotICAgICAgICBzdGF0aWNfY2FzdDxEeW5hbWljVHJhY2tGcmFnbWVudCAqPigKLSAgICAgICAgICAgICAgICBmcmFnbWVudC5nZXQoKSktPmFkZFNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY0luZGV4LAotICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7Ci0KLSAgICAgICAgZGF0YU9mZnNldCArPSBzYW1wbGVTaXplOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGF0YU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6Y29weUJ1ZmZlcigKLSAgICAgICAgc3A8QUJ1ZmZlcj4gKmRzdCwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgY29uc3QgewotICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIG1lbWNweShidWYtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplKTsKLQotICAgICpkc3QgPSBidWY7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OTkwMzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlRyYWNrRnJhZ21lbnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJUcmFja0ZyYWdtZW50LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6RHluYW1pY1RyYWNrRnJhZ21lbnQoKQotICAgIDogbUNvbXBsZXRlKGZhbHNlKSwKLSAgICAgIG1TYW1wbGVJbmRleCgwKSB7Ci19Ci0KLUZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50Ojp+RHluYW1pY1RyYWNrRnJhZ21lbnQoKSB7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50OjpnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBtQ29tcGxldGUgPyBFUlJPUl9FTkRfT0ZfU1RSRUFNIDogLUVXT1VMREJMT0NLOwotICAgIH0KLQotICAgICppbmZvID0gbVNhbXBsZXMuaXRlbUF0KG1TYW1wbGVJbmRleCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmFkdmFuY2UoKSB7Ci0gICAgKyttU2FtcGxlSW5kZXg7Ci19Ci0KLXZvaWQgRnJhZ21lbnRlZE1QNFBhcnNlcjo6RHluYW1pY1RyYWNrRnJhZ21lbnQ6OmFkZFNhbXBsZSgKLSAgICAgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0LCBzaXplX3Qgc2FtcGxlU2l6ZSwKLSAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgc2l6ZV90IHNhbXBsZURlc2NJbmRleCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBtU2FtcGxlcy5wdXNoKCk7Ci0gICAgU2FtcGxlSW5mbyAqc2FtcGxlSW5mbyA9ICZtU2FtcGxlcy5lZGl0SXRlbUF0KG1TYW1wbGVzLnNpemUoKSAtIDEpOwotCi0gICAgc2FtcGxlSW5mby0+bU9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0gICAgc2FtcGxlSW5mby0+bVNpemUgPSBzYW1wbGVTaXplOwotICAgIHNhbXBsZUluZm8tPm1QcmVzZW50YXRpb25UaW1lID0gcHJlc2VudGF0aW9uVGltZTsKLSAgICBzYW1wbGVJbmZvLT5tU2FtcGxlRGVzY0luZGV4ID0gc2FtcGxlRGVzY0luZGV4OwotICAgIHNhbXBsZUluZm8tPm1GbGFncyA9IGZsYWdzOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpEeW5hbWljVHJhY2tGcmFnbWVudDo6c2lnbmFsQ29tcGxldGlvbigpIHsKLSAgICBtQ29tcGxldGUgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50Ojpjb21wbGV0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNvbXBsZXRlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1GcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpTdGF0aWNUcmFja0ZyYWdtZW50KCkKLSAgICA6IG1TYW1wbGVJbmRleCgwKSwKLSAgICAgIG1TYW1wbGVDb3VudCgwKSwKLSAgICAgIG1DaHVua0luZGV4KDApLAotICAgICAgbVNhbXBsZVRvQ2h1bmtJbmRleCgtMSksCi0gICAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZygwKSwKLSAgICAgIG1QcmV2Q2h1bmtJbmRleCgweGZmZmZmZmZmKSwKLSAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0KDApIHsKLX0KLQotRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6flN0YXRpY1RyYWNrRnJhZ21lbnQoKSB7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TYW1wbGVJbmRleCA+PSBtU2FtcGxlQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgKmluZm8gPSBtU2FtcGxlSW5mbzsKLQotICAgIEFMT0dWKCJyZXR1cm5pbmcgc2FtcGxlICVkIGF0IFsweCUwOGxseCwgMHglMDhsbHgpIiwKLSAgICAgICAgICBtU2FtcGxlSW5kZXgsCi0gICAgICAgICAgaW5mby0+bU9mZnNldCwgaW5mby0+bU9mZnNldCArIGluZm8tPm1TaXplKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50Ojp1cGRhdGVTYW1wbGVJbmZvKCkgewotICAgIGlmIChtU2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVNhbXBsZVNpemVzICE9IE5VTEwpIHsKLSAgICAgICAgdWludDMyX3QgZGVmYXVsdFNhbXBsZVNpemUgPSBVMzJfQVQobVNhbXBsZVNpemVzLT5kYXRhKCkgKyA0KTsKLSAgICAgICAgaWYgKGRlZmF1bHRTYW1wbGVTaXplID4gMCkgewotICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSBkZWZhdWx0U2FtcGxlU2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplPSBVMzJfQVQobVNhbXBsZVNpemVzLT5kYXRhKCkgKyAxMiArIDQgKiBtU2FtcGxlSW5kZXgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0sobUNvbXBhY3RTYW1wbGVTaXplcyAhPSBOVUxMKTsKLQotICAgICAgICB1aW50MzJfdCBmaWVsZFNpemUgPSBVMzJfQVQobUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpICsgNCk7Ci0KLSAgICAgICAgc3dpdGNoIChmaWVsZFNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBieXRlID0gbUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpWzEyICsgbVNhbXBsZUluZGV4IC8gMl07Ci0gICAgICAgICAgICAgICAgbVNhbXBsZUluZm8ubVNpemUgPSAobVNhbXBsZUluZGV4ICYgMSkgPyBieXRlICYgMHgwZiA6IGJ5dGUgPj4gNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLm1TaXplID0gbUNvbXBhY3RTYW1wbGVTaXplcy0+ZGF0YSgpWzEyICsgbVNhbXBsZUluZGV4XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShmaWVsZFNpemUsIDE2KTsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5mby5tU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFUxNl9BVChtQ29tcGFjdFNhbXBsZVNpemVzLT5kYXRhKCkgKyAxMiArIG1TYW1wbGVJbmRleCAqIDIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ0hFQ0tfR1QobVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcsIDApOwotCi0gICAgLy8gVGhlIHNhbXBsZSBkZXNjIGluZGV4IGlzIDEtYmFzZWQuLi4gWFhYCi0gICAgbVNhbXBsZUluZm8ubVNhbXBsZURlc2NJbmRleCA9Ci0gICAgICAgIFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDgpOwotCi0gICAgaWYgKG1DaHVua0luZGV4ICE9IG1QcmV2Q2h1bmtJbmRleCkgewotICAgICAgICBtUHJldkNodW5rSW5kZXggPSBtQ2h1bmtJbmRleDsKLQotICAgICAgICBpZiAobUNodW5rT2Zmc2V0cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gVTMyX0FUKG1DaHVua09mZnNldHMtPmRhdGEoKSArIDQpOwotCi0gICAgICAgICAgICBpZiAobUNodW5rSW5kZXggPj0gZW50cnlDb3VudCkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVJbmRleCA9IG1TYW1wbGVDb3VudDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1OZXh0U2FtcGxlT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICBVMzJfQVQobUNodW5rT2Zmc2V0cy0+ZGF0YSgpICsgOCArIDQgKiBtQ2h1bmtJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyhtQ2h1bmtPZmZzZXRzNjQgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobUNodW5rT2Zmc2V0czY0LT5kYXRhKCkgKyA0KTsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgICAgICBtU2FtcGxlSW5kZXggPSBtU2FtcGxlQ291bnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTmV4dFNhbXBsZU9mZnNldCA9Ci0gICAgICAgICAgICAgICAgVTY0X0FUKG1DaHVua09mZnNldHM2NC0+ZGF0YSgpICsgOCArIDggKiBtQ2h1bmtJbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU2FtcGxlSW5mby5tT2Zmc2V0ID0gbU5leHRTYW1wbGVPZmZzZXQ7Ci0KLSAgICBtU2FtcGxlSW5mby5tUHJlc2VudGF0aW9uVGltZSA9IDA7Ci0gICAgbVNhbXBsZUluZm8ubUZsYWdzID0gMDsKLX0KLQotdm9pZCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjphZHZhbmNlKCkgewotICAgIG1OZXh0U2FtcGxlT2Zmc2V0ICs9IG1TYW1wbGVJbmZvLm1TaXplOwotCi0gICAgKyttU2FtcGxlSW5kZXg7Ci0gICAgaWYgKC0tbVNhbXBsZVRvQ2h1bmtSZW1haW5pbmcgPT0gMCkgewotICAgICAgICArK21DaHVua0luZGV4OwotCi0gICAgICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDQpOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHNhbXBsZSB0byBjaHVuayB0YWJsZSwgd2Ugd2lsbAotICAgICAgICAvLyBzdGF5IG9uIHRoaXMgZW50cnkuCi0gICAgICAgIGlmICgodWludDMyX3QpKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxKSA8IGVudHJ5Q291bnQpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG5leHRDaHVua0luZGV4ID0KLSAgICAgICAgICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIChtU2FtcGxlVG9DaHVua0luZGV4ICsgMSkpOwotCi0gICAgICAgICAgICBDSEVDS19HRShuZXh0Q2h1bmtJbmRleCwgMXUpOwotICAgICAgICAgICAgLS1uZXh0Q2h1bmtJbmRleDsKLQotICAgICAgICAgICAgaWYgKG1DaHVua0luZGV4ID49IG5leHRDaHVua0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNodW5rSW5kZXgsIG5leHRDaHVua0luZGV4KTsKLSAgICAgICAgICAgICAgICArK21TYW1wbGVUb0NodW5rSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9Ci0gICAgICAgICAgICBVMzJfQVQobVNhbXBsZVRvQ2h1bmstPmRhdGEoKSArIDggKyAxMiAqIG1TYW1wbGVUb0NodW5rSW5kZXggKyA0KTsKLSAgICB9Ci0KLSAgICB1cGRhdGVTYW1wbGVJbmZvKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldFUzMkF0KHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgeCkgewotICAgIHB0clswXSA9IHggPj4gMjQ7Ci0gICAgcHRyWzFdID0gKHggPj4gMTYpICYgMHhmZjsKLSAgICBwdHJbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7Ci0gICAgcHRyWzNdID0geCAmIDB4ZmY7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnNpZ25hbENvbXBsZXRpb24oKSB7Ci0gICAgbVNhbXBsZVRvQ2h1bmtJbmRleCA9IDA7Ci0KLSAgICBtU2FtcGxlVG9DaHVua1JlbWFpbmluZyA9Ci0gICAgICAgIChtU2FtcGxlVG9DaHVuayA9PSBOVUxMKQotICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICA6IFUzMl9BVChtU2FtcGxlVG9DaHVuay0+ZGF0YSgpICsgOCArIDEyICogbVNhbXBsZVRvQ2h1bmtJbmRleCArIDQpOwotCi0gICAgdXBkYXRlU2FtcGxlSW5mbygpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OmNvbXBsZXRlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0dXNfdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpTdGF0aWNUcmFja0ZyYWdtZW50OjpwYXJzZVNhbXBsZVNpemVzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgMTIgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVTaXplID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDgpOwotCi0gICAgaWYgKHNhbXBsZVNpemUgPT0gMCAmJiBvZmZzZXQgKyAxMiArIHNhbXBsZUNvdW50ICogNCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtU2FtcGxlU2l6ZXMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICBtU2FtcGxlQ291bnQgPSBzYW1wbGVDb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRnJhZ21lbnRlZE1QNFBhcnNlcjo6U3RhdGljVHJhY2tGcmFnbWVudDo6cGFyc2VDb21wYWN0U2FtcGxlU2l6ZXMoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyAxMiA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZpZWxkU2l6ZSA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChmaWVsZFNpemUgIT0gNCAmJiBmaWVsZFNpemUgIT0gOCAmJiBmaWVsZFNpemUgIT0gMTYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA4KTsKLQotICAgIGlmIChvZmZzZXQgKyAxMiArIChzYW1wbGVDb3VudCAqIGZpZWxkU2l6ZSArIDQpIC8gOCAhPSBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jb3B5QnVmZmVyKCZtQ29tcGFjdFNhbXBsZVNpemVzLCBvZmZzZXQsIHNpemUpOwotCi0gICAgbVNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlU2FtcGxlVG9DaHVuaygKLSAgICAgICAgRnJhZ21lbnRlZE1QNFBhcnNlciAqcGFyc2VyLCB1aW50MzJfdCB0eXBlLCBzaXplX3Qgb2Zmc2V0LCB1aW50NjRfdCBzaXplKSB7Ci0gICAgaWYgKG9mZnNldCArIDggPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHBhcnNlci0+cmVhZFUzMihvZmZzZXQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBlbnRyeUNvdW50ID0gcGFyc2VyLT5yZWFkVTMyKG9mZnNldCArIDQpOwotCi0gICAgaWYgKGVudHJ5Q291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG9mZnNldCArIDggKyBlbnRyeUNvdW50ICogMTIgIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbVNhbXBsZVRvQ2h1bmssIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ2h1bmtPZmZzZXRzKAotICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpIHsKLSAgICBpZiAob2Zmc2V0ICsgOCA+IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VyLT5yZWFkVTMyKG9mZnNldCkgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQgPSBwYXJzZXItPnJlYWRVMzIob2Zmc2V0ICsgNCk7Ci0KLSAgICBpZiAob2Zmc2V0ICsgOCArIGVudHJ5Q291bnQgKiA0ICE9IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYXJzZXItPmNvcHlCdWZmZXIoJm1DaHVua09mZnNldHMsIG9mZnNldCwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQ6OnBhcnNlQ2h1bmtPZmZzZXRzNjQoCi0gICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChwYXJzZXItPnJlYWRVMzIob2Zmc2V0KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZW50cnlDb3VudCA9IHBhcnNlci0+cmVhZFUzMihvZmZzZXQgKyA0KTsKLQotICAgIGlmIChvZmZzZXQgKyA4ICsgZW50cnlDb3VudCAqIDggIT0gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlci0+Y29weUJ1ZmZlcigmbUNodW5rT2Zmc2V0czY0LCBvZmZzZXQsIHNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXA0L1RyYWNrRnJhZ21lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZDQ2ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDQvVHJhY2tGcmFnbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRSQUNLX0ZSQUdNRU5UX0hfCi0KLSNkZWZpbmUgVFJBQ0tfRlJBR01FTlRfSF8KLQotI2luY2x1ZGUgImluY2x1ZGUvRnJhZ21lbnRlZE1QNFBhcnNlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBGcmFnbWVudGVkTVA0UGFyc2VyOjpUcmFja0ZyYWdtZW50IDogcHVibGljIFJlZkJhc2UgewotICAgIFRyYWNrRnJhZ21lbnQoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxDb21wbGV0aW9uKCkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0ID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRyYWNrRnJhZ21lbnQoKSB7fQotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRyYWNrRnJhZ21lbnQpOwotfTsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OkR5bmFtaWNUcmFja0ZyYWdtZW50IDogcHVibGljIEZyYWdtZW50ZWRNUDRQYXJzZXI6OlRyYWNrRnJhZ21lbnQgewotICAgIER5bmFtaWNUcmFja0ZyYWdtZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZShTYW1wbGVJbmZvICppbmZvKTsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2YW5jZSgpOwotCi0gICAgdm9pZCBhZGRTYW1wbGUoCi0gICAgICAgICAgICBvZmY2NF90IGRhdGFPZmZzZXQsIHNpemVfdCBzYW1wbGVTaXplLAotICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uVGltZSwKLSAgICAgICAgICAgIHNpemVfdCBzYW1wbGVEZXNjSW5kZXgsCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBObyBtb3JlIHNhbXBsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGlzIGZyYWdtZW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpOwotCi0gICAgdmlydHVhbCBib29sIGNvbXBsZXRlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EeW5hbWljVHJhY2tGcmFnbWVudCgpOwotCi1wcml2YXRlOgotICAgIGJvb2wgbUNvbXBsZXRlOwotICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7Ci0gICAgVmVjdG9yPFNhbXBsZUluZm8+IG1TYW1wbGVzOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHluYW1pY1RyYWNrRnJhZ21lbnQpOwotfTsKLQotc3RydWN0IEZyYWdtZW50ZWRNUDRQYXJzZXI6OlN0YXRpY1RyYWNrRnJhZ21lbnQgOiBwdWJsaWMgRnJhZ21lbnRlZE1QNFBhcnNlcjo6VHJhY2tGcmFnbWVudCB7Ci0gICAgU3RhdGljVHJhY2tGcmFnbWVudCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGUoU2FtcGxlSW5mbyAqaW5mbyk7Ci0gICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsQ29tcGxldGlvbigpOwotICAgIHZpcnR1YWwgYm9vbCBjb21wbGV0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVTaXplcygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNvbXBhY3RTYW1wbGVTaXplcygKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZVRvQ2h1bmsoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHMoCi0gICAgICAgICAgICBGcmFnbWVudGVkTVA0UGFyc2VyICpwYXJzZXIsIHVpbnQzMl90IHR5cGUsIHNpemVfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VDaHVua09mZnNldHM2NCgKLSAgICAgICAgICAgIEZyYWdtZW50ZWRNUDRQYXJzZXIgKnBhcnNlciwgdWludDMyX3QgdHlwZSwgc2l6ZV90IG9mZnNldCwgdWludDY0X3Qgc2l6ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TdGF0aWNUcmFja0ZyYWdtZW50KCk7Ci0KLXByaXZhdGU6Ci0gICAgc2l6ZV90IG1TYW1wbGVJbmRleDsKLSAgICBzaXplX3QgbVNhbXBsZUNvdW50OwotICAgIHVpbnQzMl90IG1DaHVua0luZGV4OwotCi0gICAgU2FtcGxlSW5mbyBtU2FtcGxlSW5mbzsKLQotICAgIHNwPEFCdWZmZXI+IG1TYW1wbGVTaXplczsKLSAgICBzcDxBQnVmZmVyPiBtQ29tcGFjdFNhbXBsZVNpemVzOwotCi0gICAgc3A8QUJ1ZmZlcj4gbVNhbXBsZVRvQ2h1bms7Ci0gICAgc3NpemVfdCBtU2FtcGxlVG9DaHVua0luZGV4OwotICAgIHNpemVfdCBtU2FtcGxlVG9DaHVua1JlbWFpbmluZzsKLQotICAgIHNwPEFCdWZmZXI+IG1DaHVua09mZnNldHM7Ci0gICAgc3A8QUJ1ZmZlcj4gbUNodW5rT2Zmc2V0czY0OwotICAgIHVpbnQzMl90IG1QcmV2Q2h1bmtJbmRleDsKLSAgICB1aW50NjRfdCBtTmV4dFNhbXBsZU9mZnNldDsKLQotICAgIHZvaWQgdXBkYXRlU2FtcGxlSW5mbygpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RhdGljVHJhY2tGcmFnbWVudCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFRSQUNLX0ZSQUdNRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggY2I1N2EyZi4uNmQ4ODY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCkBAIC01MDEsMTEgKzUwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFRzRfVklERU8pOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BDTV9BVURJTzoKLSAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6UENNX0FVRElPKTsKLSAgICAgICAgICAgIGJyZWFrOwotCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKICAgICAgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUoCiAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzKTsKQEAgLTU1Myw3ICs1NTEsOSBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGlmICghcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQogCiAgICAgbUV4cGVjdGVkQ29udGludWl0eUNvdW50ZXIgPSAoY29udGludWl0eV9jb3VudGVyICsgMSkgJiAweDBmOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAgICAgICAgIC8vIEluY3JlbWVudCBpbiBtdWx0aXBsZXMgb2YgNjRLLgogICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7CiAKLSAgICAgICAgQUxPR0koInJlc2l6aW5nIGJ1ZmZlciB0byAlZCBieXRlcyIsIG5lZWRlZFNpemUpOworICAgICAgICBBTE9HSSgicmVzaXppbmcgYnVmZmVyIHRvICV6dSBieXRlcyIsIG5lZWRlZFNpemUpOwogCiAgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBBQnVmZmVyKG5lZWRlZFNpemUpOwogICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKQEAgLTYxOCw3ICs2MTgsNyBAQAogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzFfQVVESU86CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJTzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01QRUcyX0FVRElPX0FEVFM6Ci0gICAgICAgIGNhc2UgU1RSRUFNVFlQRV9QQ01fQVVESU86CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9MUENNX0FDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDMzoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCkBAIC02NjUsNyArNjY1LDcgQEAKICAgICB9CiAKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSh0eXBlLCBleHRyYSk7CisgICAgICAgIG1Tb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSh0eXBlLCBleHRyYSwgdHJ1ZSk7CiAgICAgfQogfQogCkBAIC03NDgsNyArNzQ4LDcgQEAKICAgICAgICAgICAgIFBUUyB8PSBici0+Z2V0Qml0cygxNSk7CiAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICBBTE9HVigiUFRTID0gMHglMDE2bGx4ICglLjJmKSIsIFBUUywgUFRTIC8gOTAwMDAuMCk7CisgICAgICAgICAgICBBTE9HVigiUFRTID0gMHglMDE2IiBQUkl4NjQgIiAoJS4yZikiLCBQVFMsIFBUUyAvIDkwMDAwLjApOwogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKIApAQCAtNzY0LDcgKzc2NCw3IEBACiAgICAgICAgICAgICAgICAgRFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICVsbHUiLCBEVFMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7CiAKICAgICAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKICAgICAgICAgICAgIH0KQEAgLTc4Miw3ICs3ODIsNyBAQAogICAgICAgICAgICAgRVNDUiB8PSBici0+Z2V0Qml0cygxNSk7CiAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICBBTE9HVigiRVNDUiA9ICVsbHUiLCBFU0NSKTsKKyAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKICAgICAgICAgICAgIE1ZX0xPR1YoIkVTQ1JfZXh0ZW5zaW9uID0gJXUiLCBici0+Z2V0Qml0cyg5KSk7CiAKICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CkBAIC04MTIsNyArODEyLDcgQEAKIAogICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUEVTIHBhY2tldCBkb2VzIG5vdCBjYXJyeSBlbm91Z2ggZGF0YSB0byBjb250YWluICIKLSAgICAgICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlZCwgcmVxdWlyZWQgPSAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgInBheWxvYWQuIChudW1CaXRzTGVmdCA9ICV6dSwgcmVxdWlyZWQgPSAldSkiLAogICAgICAgICAgICAgICAgICAgICAgYnItPm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC04MzIsNyArODMyLDcgQEAKICAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkU2l6ZUJpdHMgPSBici0+bnVtQml0c0xlZnQoKTsKICAgICAgICAgICAgIENIRUNLX0VRKHBheWxvYWRTaXplQml0cyAlIDgsIDB1KTsKIAotICAgICAgICAgICAgQUxPR1YoIlRoZXJlJ3MgJWQgYnl0ZXMgb2YgcGF5bG9hZC4iLCBwYXlsb2FkU2l6ZUJpdHMgLyA4KTsKKyAgICAgICAgICAgIEFMT0dWKCJUaGVyZSdzICV6dSBieXRlcyBvZiBwYXlsb2FkLiIsIHBheWxvYWRTaXplQml0cyAvIDgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KICAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgQUxPR1YoImZsdXNoaW5nIHN0cmVhbSAweCUwNHggc2l6ZSA9ICVkIiwgbUVsZW1lbnRhcnlQSUQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1YoImZsdXNoaW5nIHN0cmVhbSAweCUwNHggc2l6ZSA9ICV6dSIsIG1FbGVtZW50YXJ5UElELCBtQnVmZmVyLT5zaXplKCkpOwogCiAgICAgQUJpdFJlYWRlciBicihtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKQEAgLTg2Miw3ICs4NjIsNyBAQAogfQogCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpvblBheWxvYWREYXRhKAotICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKKyAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCAvKiBEVFMgKi8sCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAjaWYgMAogICAgIEFMT0dJKCJwYXlsb2FkIHN0cmVhbVR5cGUgMHglMDJ4LCBQVFMgPSAweCUwMTZsbHgsIGRQVFMgPSAlbGxkIiwKQEAgLTg5NCw2ICs4OTQsMTIgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiU3RyZWFtIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMnggbm93IGhhcyBkYXRhLiIsCiAgICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbVN0cmVhbVR5cGUpOwogCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgIH0KQEAgLTExNzIsNyArMTE3OCw3IEBACiAKICAgICAgICAgICAgIHVpbnQ2NF90IFBDUiA9IFBDUl9iYXNlICogMzAwICsgUENSX2V4dDsKIAotICAgICAgICAgICAgQUxPR1YoIlBJRCAweCUwNHg6IFBDUiA9IDB4JTAxNmxseCAoJS4yZikiLAorICAgICAgICAgICAgQUxPR1YoIlBJRCAweCUwNHg6IFBDUiA9IDB4JTAxNiIgUFJJeDY0ICIgKCUuMmYpIiwKICAgICAgICAgICAgICAgICAgIFBJRCwgUENSLCBQQ1IgLyAyN0U2KTsKIAogICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBieSB0aGlzIHBhcnNlciB1cCB0byBhbmQKQEAgLTEyNjcsOCArMTI3Myw4IEBACiB9CiAKIHZvaWQgQVRTUGFyc2VyOjp1cGRhdGVQQ1IoCi0gICAgICAgIHVuc2lnbmVkIFBJRCwgdWludDY0X3QgUENSLCBzaXplX3QgYnl0ZU9mZnNldEZyb21TdGFydCkgewotICAgIEFMT0dWKCJQQ1IgMHglMDE2bGx4IEAgJWQiLCBQQ1IsIGJ5dGVPZmZzZXRGcm9tU3RhcnQpOworICAgICAgICB1bnNpZ25lZCAvKiBQSUQgKi8sIHVpbnQ2NF90IFBDUiwgc2l6ZV90IGJ5dGVPZmZzZXRGcm9tU3RhcnQpIHsKKyAgICBBTE9HVigiUENSIDB4JTAxNiIgUFJJeDY0ICIgQCAlenUiLCBQQ1IsIGJ5dGVPZmZzZXRGcm9tU3RhcnQpOwogCiAgICAgaWYgKG1OdW1QQ1JzID09IDIpIHsKICAgICAgICAgbVBDUlswXSA9IG1QQ1JbMV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCA4NmIwMjVmLi44OTg2YTIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTkzLDcgKzkzLDkgQEAKICAgICAgICAgLy8gRnJvbSBBVFNDIEEvNTMgUGFydCAzOjIwMDksIDYuNy4xCiAgICAgICAgIFNUUkVBTVRZUEVfQUMzICAgICAgICAgICAgICAgICAgPSAweDgxLAogCi0gICAgICAgIFNUUkVBTVRZUEVfUENNX0FVRElPICAgICAgICAgICAgPSAweDgzLAorICAgICAgICAvLyBTdHJlYW0gdHlwZSAweDgzIGlzIG5vbi1zdGFuZGFyZCwKKyAgICAgICAgLy8gaXQgY291bGQgYmUgTFBDTSBvciBUcnVlSEQgQUMzCisgICAgICAgIFNUUkVBTVRZUEVfTFBDTV9BQzMgICAgICAgICAgICAgPSAweDgzLAogICAgIH07CiAKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawppbmRleCBjMWE3YTlkLi5jMTdhMGI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCkBAIC0xMyw2ICsxMyw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cwogCiBpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCAyYjBiZjMwLi5hMDNmNmY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQW5vdGhlclBhY2tldFNvdXJjZSIKKwogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtMjYsMTYgKzI5LDIxIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY29uc3QgaW50NjRfdCBrTmVhckVPU01hcmtVcyA9IDIwMDAwMDBsbDsgLy8gMiBzZWNzCiAKIEFub3RoZXJQYWNrZXRTb3VyY2U6OkFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQogICAgIDogbUlzQXVkaW8oZmFsc2UpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAogICAgICAgbUZvcm1hdChOVUxMKSwKICAgICAgIG1MYXN0UXVldWVkVGltZVVzKDApLAogICAgICAgbUVPU1Jlc3VsdChPSyksCi0gICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhKE5VTEwpIHsKKyAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEoTlVMTCksCisgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhKE5VTEwpLAorICAgICAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCgwKSB7CiAgICAgc2V0Rm9ybWF0KG1ldGEpOwogfQogCkBAIC00Myw2ICs1MSw3IEBACiAgICAgQ0hFQ0sobUZvcm1hdCA9PSBOVUxMKTsKIAogICAgIG1Jc0F1ZGlvID0gZmFsc2U7CisgICAgbUlzVmlkZW8gPSBmYWxzZTsKIAogICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNTQsMTUgKzYzLDE3IEBACiAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBtSXNBdWRpbyA9IHRydWU7CisgICAgfSBlbHNlICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSk7CisgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcCgidGV4dC8iLCBtaW1lLCA1KSk7CiAgICAgfQogfQogCiBBbm90aGVyUGFja2V0U291cmNlOjp+QW5vdGhlclBhY2tldFNvdXJjZSgpIHsKIH0KIAotc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTg2LDcgKzk3LDcgQEAKIAogICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gbUZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKICAgICAgICAgfQogCiAgICAgICAgICsraXQ7CkBAIC0xMTIsOSArMTIzLDEyIEBACiAgICAgICAgICAgICAgICAgbUZvcm1hdC5jbGVhcigpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAtLW1RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CiAgICAgICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOwogICAgICAgICB9CiAKKyAgICAgICAgbUxhdGVzdERlcXVldWVkTWV0YSA9ICgqYnVmZmVyKS0+bWV0YSgpLT5kdXAoKTsKKwogICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CiAgICAgICAgIGlmICgoKmJ1ZmZlciktPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKICAgICAgICAgICAgIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CkBAIC0xMzYsOCArMTUwLDEwIEBACiAgICAgfQogCiAgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CisKICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKm1CdWZmZXJzLmJlZ2luKCk7CiAgICAgICAgIG1CdWZmZXJzLmVyYXNlKG1CdWZmZXJzLmJlZ2luKCkpOworICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gYnVmZmVyLT5tZXRhKCktPmR1cCgpOwogCiAgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKQEAgLTE3Myw3ICsxODksMTEgQEAKICAgICAgICAgcmV0dXJuIChkaXNjb250aW51aXR5VHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQpICE9IDA7CiAgICAgfQogCi0gICAgcmV0dXJuIChkaXNjb250aW51aXR5VHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9WSURFT19GT1JNQVQpICE9IDA7CisgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgIHJldHVybiAoZGlzY29udGludWl0eVR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUKSAhPSAwOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewpAQCAtMTg2LDEzICsyMDYsMTggQEAKICAgICBpbnQ2NF90IGxhc3RRdWV1ZWRUaW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhc3RRdWV1ZWRUaW1lVXMpKTsKICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7Ci0gICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1MYXN0UXVldWVkVGltZVVzLCBtTGFzdFF1ZXVlZFRpbWVVcyAvIDFFNik7CisgICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JSIgUFJJaTY0ICIgdXMgKCUuMmYgc2VjcykiLCBtTGFzdFF1ZXVlZFRpbWVVcywgbUxhc3RRdWV1ZWRUaW1lVXMgLyAxRTYpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtQnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogCi0gICAgaWYgKCFtTGF0ZXN0RW5xdWV1ZWRNZXRhLmdldCgpKSB7CisgICAgaW50MzJfdCBkaXNjb250aW51aXR5OworICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICsrbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudDsKKyAgICB9CisKKyAgICBpZiAobUxhdGVzdEVucXVldWVkTWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIG1MYXRlc3RFbnF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQ2NF90IGxhdGVzdFRpbWVVcyA9IDA7CkBAIC0yMDgsNiArMjMzLDcgQEAKIAogICAgIG1CdWZmZXJzLmNsZWFyKCk7CiAgICAgbUVPU1Jlc3VsdCA9IE9LOworICAgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQgPSAwOwogCiAgICAgbUZvcm1hdCA9IE5VTEw7CiAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CkBAIC0yMTUsMjcgKzI0MSwzMSBAQAogCiB2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnF1ZXVlRGlzY29udGludWl0eSgKICAgICAgICAgQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZSB0eXBlLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEsCisgICAgICAgIGJvb2wgZGlzY2FyZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICAvLyBMZWF2ZSBvbmx5IGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgcXVldWUuCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IG9sZEJ1ZmZlciA9ICppdDsKKyAgICBpZiAoZGlzY2FyZCkgeworICAgICAgICAvLyBMZWF2ZSBvbmx5IGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgcXVldWUuCisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IG9sZEJ1ZmZlciA9ICppdDsKIAotICAgICAgICBpbnQzMl90IG9sZERpc2NvbnRpbnVpdHlUeXBlOwotICAgICAgICBpZiAoIW9sZEJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJkaXNjb250aW51aXR5IiwgJm9sZERpc2NvbnRpbnVpdHlUeXBlKSkgewotICAgICAgICAgICAgaXQgPSBtQnVmZmVycy5lcmFzZShpdCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGludDMyX3Qgb2xkRGlzY29udGludWl0eVR5cGU7CisgICAgICAgICAgICBpZiAoIW9sZEJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAiZGlzY29udGludWl0eSIsICZvbGREaXNjb250aW51aXR5VHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytpdDsKICAgICAgICAgfQotCi0gICAgICAgICsraXQ7CiAgICAgfQogCiAgICAgbUVPU1Jlc3VsdCA9IE9LOwogICAgIG1MYXN0UXVldWVkVGltZVVzID0gMDsKICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKKyAgICArK21RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CiAKICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcigwKTsKICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHkiLCBzdGF0aWNfY2FzdDxpbnQzMl90Pih0eXBlKSk7CkBAIC0yNjUsNyArMjk1LDEwIEBACiAKIGludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QnVmZmVyZWREdXJhdGlvblVzKHN0YXR1c190ICpmaW5hbFJlc3VsdCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKGZpbmFsUmVzdWx0KTsKK30KIAoraW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICAqZmluYWxSZXN1bHQgPSBtRU9TUmVzdWx0OwogCiAgICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKQEAgLTI3NCw2ICszMDcsNyBAQAogCiAgICAgaW50NjRfdCB0aW1lMSA9IC0xOwogICAgIGludDY0X3QgdGltZTIgPSAtMTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogCiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7CiAgICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7CkBAIC0yODEsMjAgKzMxNSw2NCBAQAogCiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgIGlmICh0aW1lMSA8IDApIHsKKyAgICAgICAgICAgIGlmICh0aW1lMSA8IDAgfHwgdGltZVVzIDwgdGltZTEpIHsKICAgICAgICAgICAgICAgICB0aW1lMSA9IHRpbWVVczsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdGltZTIgPSB0aW1lVXM7CisgICAgICAgICAgICBpZiAodGltZTIgPCAwIHx8IHRpbWVVcyA+IHRpbWUyKSB7CisgICAgICAgICAgICAgICAgdGltZTIgPSB0aW1lVXM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZGlzY29udGludWl0eSwgcmVzZXQgZXZlcnl0aGluZy4KKyAgICAgICAgICAgIGR1cmF0aW9uVXMgKz0gdGltZTIgLSB0aW1lMTsKICAgICAgICAgICAgIHRpbWUxID0gdGltZTIgPSAtMTsKICAgICAgICAgfQogCiAgICAgICAgICsraXQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHRpbWUyIC0gdGltZTE7CisgICAgcmV0dXJuIGR1cmF0aW9uVXMgKyAodGltZTIgLSB0aW1lMSk7Cit9CisKKy8vIEEgY2hlYXBlciBidXQgbGVzcyBwcmVjaXNlIHZlcnNpb24gb2YgZ2V0QnVmZmVyZWREdXJhdGlvblVzIHRoYXQgd2Ugd291bGQgbGlrZSB0byB1c2UgaW4KKy8vIExpdmVTZXNzaW9uOjpkZXF1ZXVlQWNjZXNzVW5pdCB0byB0cmlnZ2VyIGRvd253YXJkcyBhZGFwdGF0aW9uLgoraW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRFc3RpbWF0ZWREdXJhdGlvblVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQgPiAwKSB7CisgICAgICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgICAgICByZXR1cm4gZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woJmZpbmFsUmVzdWx0KTsKKyAgICB9CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqaXQ7CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZzdGFydFRpbWVVcyk7CisgICAgaWYgKHN0YXJ0VGltZVVzIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpdCA9IG1CdWZmZXJzLmVuZCgpOworICAgIC0taXQ7CisgICAgYnVmZmVyID0gKml0OworCisgICAgaW50NjRfdCBlbmRUaW1lVXM7CisgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmVuZFRpbWVVcyk7CisgICAgaWYgKGVuZFRpbWVVcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50NjRfdCBkaWZmVXM7CisgICAgaWYgKGVuZFRpbWVVcyA+IHN0YXJ0VGltZVVzKSB7CisgICAgICAgIGRpZmZVcyA9IGVuZFRpbWVVcyAtIHN0YXJ0VGltZVVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZmZVcyA9IHN0YXJ0VGltZVVzIC0gZW5kVGltZVVzOworICAgIH0KKyAgICByZXR1cm4gZGlmZlVzOwogfQogCiBzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpuZXh0QnVmZmVyVGltZShpbnQ2NF90ICp0aW1lVXMpIHsKQEAgLTMyMyw5ICs0MDEsMTQgQEAKICAgICByZXR1cm4gKG1FT1NSZXN1bHQgIT0gT0spOwogfQogCi1zcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TGF0ZXN0TWV0YSgpIHsKK3NwPEFNZXNzYWdlPiBBbm90aGVyUGFja2V0U291cmNlOjpnZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbUxhdGVzdEVucXVldWVkTWV0YTsKIH0KIAorc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldExhdGVzdERlcXVldWVkTWV0YSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtTGF0ZXN0RGVxdWV1ZWRNZXRhOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAppbmRleCA5YjE5M2EyLi44MDlhODU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApAQCAtNDksMTIgKzQ5LDE2IEBACiAgICAgLy8gcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMgc2luY2UgdGhlIGxhc3QgZGlzY29udGludWl0eSAoaWYgYW55KS4KICAgICBpbnQ2NF90IGdldEJ1ZmZlcmVkRHVyYXRpb25VcyhzdGF0dXNfdCAqZmluYWxSZXN1bHQpOwogCisgICAgaW50NjRfdCBnZXRFc3RpbWF0ZWREdXJhdGlvblVzKCk7CisKICAgICBzdGF0dXNfdCBuZXh0QnVmZmVyVGltZShpbnQ2NF90ICp0aW1lVXMpOwogCiAgICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICB2b2lkIHF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSk7CisgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhLAorICAgICAgICAgICAgYm9vbCBkaXNjYXJkKTsKIAogICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCk7CiAKQEAgLTYyLDcgKzY2LDggQEAKIAogICAgIGJvb2wgaXNGaW5pc2hlZChpbnQ2NF90IGR1cmF0aW9uKSBjb25zdDsKIAotICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3RNZXRhKCk7CisgICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdEVucXVldWVkTWV0YSgpOworICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFub3RoZXJQYWNrZXRTb3VyY2UoKTsKQEAgLTcyLDEzICs3NywxOCBAQAogICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwogCiAgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBib29sIG1Jc1ZpZGVvOwogICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwogICAgIGludDY0X3QgbUxhc3RRdWV1ZWRUaW1lVXM7CiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1CdWZmZXJzOwogICAgIHN0YXR1c190IG1FT1NSZXN1bHQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1MYXRlc3RFbnF1ZXVlZE1ldGE7CisgICAgc3A8QU1lc3NhZ2U+IG1MYXRlc3REZXF1ZXVlZE1ldGE7CisKKyAgICBzaXplX3QgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CiAKICAgICBib29sIHdhc0Zvcm1hdENoYW5nZShpbnQzMl90IGRpc2NvbnRpbnVpdHlUeXBlKSBjb25zdDsKKyAgICBpbnQ2NF90IGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBbm90aGVyUGFja2V0U291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCAyYjA3MTFiLi5lZjFjZDNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTMxLDYgKzMxLDcgQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjY0LDcgKzI2NSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NC9NUEVHIHN5bmN3b3JkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjk3LDcgKzI5OCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBILjI2NC9NUEVHIHN5bmN3b3JkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IG9mZnNldCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzMwLDcgKzMzMSw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBBQUMgc3luY3dvcmQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zNTgsNyArMzU5LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTM4NSw3ICszODYsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gTVBFRyBhdWRpbyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jd29yZCBhdCBvZmZzZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3luY3dvcmQgYXQgb2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQwOSw3ICs0MTAsNyBAQAogICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbmVlZGVkU2l6ZSA+IG1CdWZmZXItPmNhcGFjaXR5KCkpIHsKICAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgNjU1MzUpICYgfjY1NTM1OwogCi0gICAgICAgIEFMT0dWKCJyZXNpemluZyBidWZmZXIgdG8gc2l6ZSAlZCIsIG5lZWRlZFNpemUpOworICAgICAgICBBTE9HVigicmVzaXppbmcgYnVmZmVyIHRvIHNpemUgJXp1IiwgbmVlZGVkU2l6ZSk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIobmVlZGVkU2l6ZSk7CiAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKQEAgLTQzMiw3ICs0MzMsNyBAQAogCiAjaWYgMAogICAgIGlmIChtTW9kZSA9PSBBQUMpIHsKLSAgICAgICAgQUxPR0koInNpemUgPSAlZCwgdGltZVVzID0gJS4yZiBzZWNzIiwgc2l6ZSwgdGltZVVzIC8gMUU2KTsKKyAgICAgICAgQUxPR0koInNpemUgPSAlenUsIHRpbWVVcyA9ICUuMmYgc2VjcyIsIHNpemUsIHRpbWVVcyAvIDFFNik7CiAgICAgICAgIGhleGR1bXAoZGF0YSwgc2l6ZSk7CiAgICAgfQogI2VuZGlmCkBAIC02MDMsNiArNjA0LDggQEAKICAgICAvLyBoYXZpbmcgdG8gaW50ZXJwb2xhdGUuCiAgICAgLy8gVGhlIGZpbmFsIEFBQyBmcmFtZSBtYXkgd2VsbCBleHRlbmQgaW50byB0aGUgbmV4dCBSYW5nZUluZm8gYnV0CiAgICAgLy8gdGhhdCdzIG9rLgorICAgIC8vIFRPRE86IHRoZSBsb2dpYyBjb21tZW50ZWQgYWJvdmUgaXMgc2tpcHBlZCBiZWNhdXNlIGNvZGVjIGNhbm5vdCB0YWtlCisgICAgLy8gYXJiaXRyYXJ5IHNpemVkIGlucHV0IGJ1ZmZlcnM7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGluZm8ubUxlbmd0aCkgewogICAgICAgICBpZiAob2Zmc2V0ICsgNyA+IG1CdWZmZXItPnNpemUoKSkgewpAQCAtNjY3LDkgKzY3MCwxMiBAQAogICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IHByb3RlY3Rpb25fYWJzZW50ID8gNyA6IDk7CiAKICAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CisgICAgICAgIC8vIFRPRE86IG1vdmUgYmFjayB0byBjb25jYXRlbmF0aW9uIHdoZW4gY29kZWMgY2FuIHN1cHBvcnQgYXJiaXRyYXJ5IGlucHV0IGJ1ZmZlcnMuCisgICAgICAgIC8vIEZvciBub3cgb25seSBxdWV1ZSBhIHNpbmdsZSBidWZmZXIKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOworICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXBBQUMob2Zmc2V0KTsKIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOwogICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgb2Zmc2V0KTsKQEAgLTcxNiw2ICs3MjIsNDUgQEAKICAgICByZXR1cm4gdGltZVVzOwogfQogCisvLyBUT0RPOiBhdm9pZCBpbnRlcnBvbGF0aW5nIHRpbWVzdGFtcHMgb25jZSBjb2RlYyBzdXBwb3J0cyBhcmJpdHJhcnkgc2l6ZWQgaW5wdXQgYnVmZmVycworaW50NjRfdCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmZldGNoVGltZXN0YW1wQUFDKHNpemVfdCBzaXplKSB7CisgICAgaW50NjRfdCB0aW1lVXMgPSAtMTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIHNpemVfdCBzYW1wbGVzaXplID0gc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgQ0hFQ0soIW1SYW5nZUluZm9zLmVtcHR5KCkpOworCisgICAgICAgIFJhbmdlSW5mbyAqaW5mbyA9ICYqbVJhbmdlSW5mb3MuYmVnaW4oKTsKKworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIHRpbWVVcyA9IGluZm8tPm1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5mby0+bUxlbmd0aCA+IHNpemUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKKyAgICAgICAgICAgIGluZm8tPm1MZW5ndGggLT0gc2l6ZTsKKyAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gMTAyNCAqIHNpemUgLyBzYW1wbGVzaXplOworICAgICAgICAgICAgaW5mby0+bVRpbWVzdGFtcFVzICs9IG51bVNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGVSYXRlOworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplIC09IGluZm8tPm1MZW5ndGg7CisKKyAgICAgICAgICAgIG1SYW5nZUluZm9zLmVyYXNlKG1SYW5nZUluZm9zLmJlZ2luKCkpOworICAgICAgICAgICAgaW5mbyA9IE5VTEw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGlmICh0aW1lVXMgPT0gMGxsKSB7CisgICAgICAgIEFMT0dWKCJSZXR1cm5pbmcgMCB0aW1lc3RhbXAiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGltZVVzOworfQorCiBzdHJ1Y3QgTkFMUG9zaXRpb24gewogICAgIHNpemVfdCBuYWxPZmZzZXQ7CiAgICAgc2l6ZV90IG5hbFNpemU7CkBAIC03NzYsNiArODIxLDEyIEBACiAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbUJ1ZmZlci0+ZGF0YSgpW3Bvcy5uYWxPZmZzZXRdICYgMHgxZjsKIAorICAgICAgICAgICAgICAgIGlmIChuYWxUeXBlID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gbmV3IEFCdWZmZXIocG9zLm5hbFNpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2VpLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIHBvcy5uYWxPZmZzZXQsIHBvcy5uYWxTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CisgICAgICAgICAgICAgICAgfQorCiAjaWYgIUxPR19OREVCVUcKICAgICAgICAgICAgICAgICBjaGFyIHRtcFsxMjhdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiMHglMDJ4IiwgbmFsVHlwZSk7CkBAIC03OTQsNyArODQ1LDkgQEAKICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gcG9zLm5hbFNpemUgKyA0OwogICAgICAgICAgICAgfQogCisjaWYgIUxPR19OREVCVUcKICAgICAgICAgICAgIEFMT0dWKCJhY2Nlc3NVbml0IGNvbnRhaW5zIG5hbCB0eXBlcyAlcyIsIG91dC5jX3N0cigpKTsKKyNlbmRpZgogCiAgICAgICAgICAgICBjb25zdCBOQUxQb3NpdGlvbiAmcG9zID0gbmFscy5pdGVtQXQobmFscy5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIHNpemVfdCBuZXh0U2NhbiA9IHBvcy5uYWxPZmZzZXQgKyBwb3MubmFsU2l6ZTsKQEAgLTEwMjUsNyArMTA3OCw3IEBACiAKICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHIHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgQUxPR1YoInJldHVybmluZyBNUEVHIHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CiAKICAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKQEAgLTExODQsNyArMTIzNyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAotICAgICAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUc0IHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRzQgdmlkZW8gYWNjZXNzIHVuaXQgYXQgdGltZSAlIiBQUklkNjQgIiB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBoZXhkdW1wKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKaW5kZXggYTJjY2E3Ny4uN2M4MWZmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKQEAgLTc3LDYgKzc3LDcgQEAKICAgICAvLyBjb25zdW1lIGEgbG9naWNhbCAoY29tcHJlc3NlZCkgYWNjZXNzIHVuaXQgb2Ygc2l6ZSAic2l6ZSIsCiAgICAgLy8gcmV0dXJucyBpdHMgdGltZXN0YW1wIGluIHVzIChvciAtMSBpZiBubyB0aW1lIGluZm9ybWF0aW9uKS4KICAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wKHNpemVfdCBzaXplKTsKKyAgICBpbnQ2NF90IGZldGNoVGltZXN0YW1wQUFDKHNpemVfdCBzaXplKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggZGQ3MTRjOTkuLjg1ODU5ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewpAQCAtMTMwLDcgKzEzMiw4IEBACiAgICAgcmV0dXJuIG5ldyBXcmFwcGVkVHJhY2sodGhpcywgbVRyYWNrcy52YWx1ZUF0KGluZGV4KSk7CiB9CiAKLXNwPE1ldGFEYXRhPiBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKK3NwPE1ldGFEYXRhPiBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTQwOCw3ICs0MTEsNyBAQAogICAgICAgICAgICAgUFRTIHw9IGJyLmdldEJpdHMoMTUpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICBBTE9HVigiUFRTID0gJWxsdSIsIFBUUyk7CisgICAgICAgICAgICBBTE9HVigiUFRTID0gJSIgUFJJdTY0LCBQVFMpOwogICAgICAgICAgICAgLy8gQUxPR0koIlBUUyA9ICUuMmYgc2VjcyIsIFBUUyAvIDkwMDAwLjBmKTsKIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CkBAIC00MjUsNyArNDI4LDcgQEAKICAgICAgICAgICAgICAgICBEVFMgfD0gYnIuZ2V0Qml0cygxNSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOwogCi0gICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICVsbHUiLCBEVFMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7CiAKICAgICAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKICAgICAgICAgICAgIH0KQEAgLTQ0Myw3ICs0NDYsNyBAQAogICAgICAgICAgICAgRVNDUiB8PSBici5nZXRCaXRzKDE1KTsKICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKIAotICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlbGx1IiwgRVNDUik7CisgICAgICAgICAgICBBTE9HVigiRVNDUiA9ICUiIFBSSXU2NCwgRVNDUik7CiAgICAgICAgICAgICAvKiB1bnNpZ25lZCBFU0NSX2V4dGVuc2lvbiA9ICovYnIuZ2V0Qml0cyg5KTsKIAogICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOwpAQCAtNDcyLDcgKzQ3NSw3IEBACiAKICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgewogICAgICAgICAgICAgQUxPR0UoIlBFUyBwYWNrZXQgZG9lcyBub3QgY2FycnkgZW5vdWdoIGRhdGEgdG8gY29udGFpbiAiCi0gICAgICAgICAgICAgICAgICJwYXlsb2FkLiAobnVtQml0c0xlZnQgPSAlZCwgcmVxdWlyZWQgPSAlZCkiLAorICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJXp1LCByZXF1aXJlZCA9ICV1KSIsCiAgICAgICAgICAgICAgICAgIGJyLm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKIAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTYyNSw3ICs2MjgsNyBAQAogCiBzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6YXBwZW5kUEVTRGF0YSgKICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywKLSAgICAgICAgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCisgICAgICAgIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtUXVldWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCBkNDQ5YzM0Li4zNWNhMTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTE0MSw3ICsxNDEsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgcmV0dXJuIGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQogICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawppbmRleCBjZDkxMmU3Li5hYWE4MzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawpAQCAtMSw2ICsxLDEwIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitpZmVxICgkKFRBUkdFVF9ERVZJQ0UpLCBtYW50YSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURTVVJGQUNFX0lTX0JHUjMyCitlbmRpZgorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgICAgICAgXAogICAgICAgICBPTVguY3BwICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMCw2ICsxNCw3IEBACiAgICAgICAgIFNvZnRPTVhDb21wb25lbnQuY3BwICAgICAgICAgIFwKICAgICAgICAgU29mdE9NWFBsdWdpbi5jcHAgICAgICAgICAgICAgXAogICAgICAgICBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBcCisgICAgICAgIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIFwKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTE4LDYgKzIzLDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICAgICAgICAgIFwKICAgICAgICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpYmhhcmR3YXJlICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGxpYmxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDQ0ZjBiZTcuLjNlNzA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjZGVmaW5lIExPR19UQUcgIkdyYXBoaWNCdWZmZXJTb3VyY2UiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yNywxMyArMjksMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBib29sIEVYVFJBX0NIRUNLID0gdHJ1ZTsKIAogCiBHcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKE9NWE5vZGVJbnN0YW5jZSogbm9kZUluc3RhbmNlLAotICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCkgOgorICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgYm9vbCB1c2VHcmFwaGljQnVmZmVySW5NZXRhKSA6CiAgICAgbUluaXRDaGVjayhVTktOT1dOX0VSUk9SKSwKICAgICBtTm9kZUluc3RhbmNlKG5vZGVJbnN0YW5jZSksCiAgICAgbUV4ZWN1dGluZyhmYWxzZSksCkBAIC00MSwxNiArNDYsMjIgQEAKICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKDApLAogICAgIG1FbmRPZlN0cmVhbShmYWxzZSksCiAgICAgbUVuZE9mU3RyZWFtU2VudChmYWxzZSksCi0gICAgbVJlcGVhdEFmdGVyVXMoLTFsbCksCiAgICAgbU1heFRpbWVzdGFtcEdhcFVzKC0xbGwpLAogICAgIG1QcmV2T3JpZ2luYWxUaW1lVXMoLTFsbCksCiAgICAgbVByZXZNb2RpZmllZFRpbWVVcygtMWxsKSwKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xbGwpLAorICAgIG1SZXBlYXRBZnRlclVzKC0xbGwpLAogICAgIG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKDApLAogICAgIG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXAoLTFsbCksCiAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkKC0xKSwKICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0oMCksCiAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50KDApLAotICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZChmYWxzZSkgeworICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZChmYWxzZSksCisgICAgbVRpbWVQZXJDYXB0dXJlVXMoLTFsbCksCisgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAorICAgIG1QcmV2Q2FwdHVyZVVzKC0xbGwpLAorICAgIG1QcmV2RnJhbWVVcygtMWxsKSwKKyAgICBtVXNlR3JhcGhpY0J1ZmZlckluTWV0YSh1c2VHcmFwaGljQnVmZmVySW5NZXRhKSB7CiAKICAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSB3PSV1IGg9JXUgYz0ldSIsCiAgICAgICAgICAgICBidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0LCBidWZmZXJDb3VudCk7CkBAIC02MywxMyArNzQsMTIgQEAKIAogICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOwogCi0gICAgbUJ1ZmZlclF1ZXVlID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXRDb25zdW1lck5hbWUobmFtZSk7Ci0gICAgbUJ1ZmZlclF1ZXVlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKLSAgICBtQnVmZmVyUXVldWUtPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiB8Ci0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKyAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKKyAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOworICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKTsKIAotICAgIG1Jbml0Q2hlY2sgPSBtQnVmZmVyUXVldWUtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOworICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKICAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgbUluaXRDaGVjayk7CkBAIC04Myw3ICs5Myw3IEBACiAgICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIqPih0aGlzKTsKICAgICBzcDxCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9IG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKIAotICAgIG1Jbml0Q2hlY2sgPSBtQnVmZmVyUXVldWUtPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOworICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvciBjb25uZWN0aW5nIHRvIEJ1ZmZlclF1ZXVlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBzdHJlcnJvcigtbUluaXRDaGVjayksIG1Jbml0Q2hlY2spOwpAQCAtOTUsOCArMTA1LDggQEAKIAogR3JhcGhpY0J1ZmZlclNvdXJjZTo6fkdyYXBoaWNCdWZmZXJTb3VyY2UoKSB7CiAgICAgQUxPR1YoIn5HcmFwaGljQnVmZmVyU291cmNlIik7Ci0gICAgaWYgKG1CdWZmZXJRdWV1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJRdWV1ZS0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CisgICAgaWYgKG1Db25zdW1lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCJjb25zdW1lckRpc2Nvbm5lY3QgZmFpbGVkOiAlZCIsIGVycik7CiAgICAgICAgIH0KQEAgLTEwNSw3ICsxMTUsNyBAQAogCiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9teEV4ZWN1dGluZygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBBTE9HVigiLS0+IGV4ZWN1dGluZzsgYXZhaWw9JWQsIGNvZGVjIHZlYyBzaXplPSV6ZCIsCisgICAgQUxPR1YoIi0tPiBleGVjdXRpbmc7IGF2YWlsPSV6dSwgY29kZWMgdmVjIHNpemU9JXpkIiwKICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUsIG1Db2RlY0J1ZmZlcnMuc2l6ZSgpKTsKICAgICBDSEVDSyghbUV4ZWN1dGluZyk7CiAgICAgbUV4ZWN1dGluZyA9IHRydWU7CkBAIC0xMjcsNyArMTM3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJkb25lIGxvYWRpbmcgaW5pdGlhbCBmcmFtZXMsIGF2YWlsPSVkIiwgbU51bUZyYW1lc0F2YWlsYWJsZSk7CisgICAgQUxPR1YoImRvbmUgbG9hZGluZyBpbml0aWFsIGZyYW1lcywgYXZhaWw9JXp1IiwgbU51bUZyYW1lc0F2YWlsYWJsZSk7CiAKICAgICAvLyBJZiBFT1MgaGFzIGFscmVhZHkgYmVlbiBzaWduYWxlZCwgYW5kIHRoZXJlIGFyZSBubyBtb3JlIGZyYW1lcyB0bwogICAgIC8vIHN1Ym1pdCwgdHJ5IHRvIHNlbmQgRU9TIG5vdyBhcyB3ZWxsLgpAQCAtMTc5LDcgKzE4OSw3IEBACiAgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKICAgICB9CiAKLSAgICBBTE9HVigiLS0+IGxvYWRlZDsgYXZhaWw9JWQgZW9zPSVkIGVvc1NlbnQ9JWQiLAorICAgIEFMT0dWKCItLT4gbG9hZGVkOyBhdmFpbD0lenUgZW9zPSVkIGVvc1NlbnQ9JWQiLAogICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUVuZE9mU3RyZWFtLCBtRW5kT2ZTdHJlYW1TZW50KTsKIAogICAgIC8vIENvZGVjIGlzIG5vIGxvbmdlciBleGVjdXRpbmcuICBEaXNjYXJkIGFsbCBjb2RlYy1yZWxhdGVkIHN0YXRlLgpAQCAtMjAwLDcgKzIxMCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiYWRkQ29kZWNCdWZmZXIgaD0lcCBzaXplPSVsdSBwPSVwIiwKKyAgICBBTE9HVigiYWRkQ29kZWNCdWZmZXIgaD0lcCBzaXplPSUiIFBSSXUzMiAiIHA9JXAiLAogICAgICAgICAgICAgaGVhZGVyLCBoZWFkZXItPm5BbGxvY0xlbiwgaGVhZGVyLT5wQnVmZmVyKTsKICAgICBDb2RlY0J1ZmZlciBjb2RlY0J1ZmZlcjsKICAgICBjb2RlY0J1ZmZlci5tSGVhZGVyID0gaGVhZGVyOwpAQCAtMjIxLDcgKzIzMSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVigiY29kZWNCdWZmZXJFbXB0aWVkIGg9JXAgc2l6ZT0lbHUgZmlsbGVkPSVsdSBwPSVwIiwKKyAgICBBTE9HVigiY29kZWNCdWZmZXJFbXB0aWVkIGg9JXAgc2l6ZT0lIiBQUkl1MzIgIiBmaWxsZWQ9JSIgUFJJdTMyICIgcD0lcCIsCiAgICAgICAgICAgICBoZWFkZXIsIGhlYWRlci0+bkFsbG9jTGVuLCBoZWFkZXItPm5GaWxsZWRMZW4sCiAgICAgICAgICAgICBoZWFkZXItPnBCdWZmZXIpOwogICAgIENvZGVjQnVmZmVyJiBjb2RlY0J1ZmZlcihtQ29kZWNCdWZmZXJzLmVkaXRJdGVtQXQoY2JpKSk7CkBAIC0yNDYsMTMgKzI1NiwyNSBAQAogICAgICAgICAvLyBQdWxsIHRoZSBncmFwaGljIGJ1ZmZlciBoYW5kbGUgYmFjayBvdXQgb2YgdGhlIGJ1ZmZlciwgYW5kIGNvbmZpcm0KICAgICAgICAgLy8gdGhhdCBpdCBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KICAgICAgICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwotICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlOwotICAgICAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgZGF0YSArIDQsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLSAgICAgICAgaWYgKGJ1ZmZlckhhbmRsZSAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKSB7Ci0gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIncyBoYW5kbGUgaXMgJXAsIGV4cGVjdGVkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVySGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLSAgICAgICAgICAgIENIRUNLKCEiY29kZWNCdWZmZXJFbXB0aWVkOiBtaXNtYXRjaGVkIGJ1ZmZlciIpOworICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9ICooTWV0YWRhdGFCdWZmZXJUeXBlICopZGF0YTsKKyAgICAgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGU7CisgICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgZGF0YSArIDQsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJIYW5kbGUgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIncyBoYW5kbGUgaXMgJXAsIGV4cGVjdGVkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcikgeworICAgICAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgbWVtY3B5KCZidWZmZXIsIGRhdGEgKyA0LCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyICE9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIEFMT0dFKCJjb2RlY0J1ZmZlckVtcHRpZWQ6IGJ1ZmZlciBpcyAlcCwgZXhwZWN0ZWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci5nZXQoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soISJjb2RlY0J1ZmZlckVtcHRpZWQ6IG1pc21hdGNoZWQgYnVmZmVyIik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2OCw3ICsyOTAsNyBAQAogICAgICAgICBpZiAoaWQgPT0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkKSB7CiAgICAgICAgICAgICBDSEVDS19HVChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQtLSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpZCwgY29kZWNCdWZmZXIubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTI4Miw3ICszMDQsNyBAQAogICAgIGlmIChtTnVtRnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgIC8vIEZpbGwgdGhpcyBjb2RlYyBidWZmZXIuCiAgICAgICAgIENIRUNLKCFtRW5kT2ZTdHJlYW1TZW50KTsKLSAgICAgICAgQUxPR1YoImJ1ZmZlciBmcmVlZCwgJWQgZnJhbWVzIGF2YWlsIChlb3M9JWQpIiwKKyAgICAgICAgQUxPR1YoImJ1ZmZlciBmcmVlZCwgJXp1IGZyYW1lcyBhdmFpbCAoZW9zPSVkKSIsCiAgICAgICAgICAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUVuZE9mU3RyZWFtKTsKICAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKICAgICB9IGVsc2UgaWYgKG1FbmRPZlN0cmVhbSkgewpAQCAtMzExLDcgKzMzMyw4IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtT3JpZ2luYWxUaW1lVXMuaW5kZXhPZktleShoZWFkZXItPm5UaW1lU3RhbXApOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgQUxPR1YoIk9VVCB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlci0+blRpbWVTdGFtcCwgbU9yaWdpbmFsVGltZVVzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oaGVhZGVyLT5uVGltZVN0YW1wKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtT3JpZ2luYWxUaW1lVXNbaW5kZXhdKSk7CiAgICAgICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSBtT3JpZ2luYWxUaW1lVXNbaW5kZXhdOwogICAgICAgICAgICAgbU9yaWdpbmFsVGltZVVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzIyLDcgKzM0NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKG1PcmlnaW5hbFRpbWVVcy5zaXplKCkgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykgewogICAgICAgICAgICAgLy8gc29tZXRoaW5nIHRlcnJpYmx5IHdyb25nIG11c3QgaGF2ZSBoYXBwZW5lZCwgZ2l2aW5nIHVwLi4uCi0gICAgICAgICAgICBBTE9HRSgibU9yaWdpbmFsVGltZVVzIGhhcyB0b28gbWFueSBlbnRyaWVzICglZCkiLAorICAgICAgICAgICAgQUxPR0UoIm1PcmlnaW5hbFRpbWVVcyBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5zaXplKCkpOwogICAgICAgICAgICAgbU1heFRpbWVzdGFtcEdhcFVzID0gLTFsbDsKICAgICAgICAgfQpAQCAtMzM3LDcgKzM2MCw3IEBACiAKICAgICAgICAgd2hpbGUgKG1OdW1GcmFtZXNBdmFpbGFibGUgPiAwKSB7CiAgICAgICAgICAgICBCdWZmZXJRdWV1ZTo6QnVmZmVySXRlbSBpdGVtOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLgpAQCAtMzUwLDcgKzM3Myw3IEBACiAKICAgICAgICAgICAgIC0tbU51bUZyYW1lc0F2YWlsYWJsZTsKIAotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgaXRlbS5tRmVuY2UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKQEAgLTM3OSwxNSArNDAyLDE1IEBACiAgICAgaW50IGNiaSA9IGZpbmRBdmFpbGFibGVDb2RlY0J1ZmZlcl9sKCk7CiAgICAgaWYgKGNiaSA8IDApIHsKICAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCi0gICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWwgbm93ICVkIiwKKyAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLCBhdmFpbCBub3cgJXp1IiwKICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogYWNxdWlyaW5nIGJ1ZmZlciwgYXZhaWw9JWQiLAorICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogYWNxdWlyaW5nIGJ1ZmZlciwgYXZhaWw9JXp1IiwKICAgICAgICAgICAgIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogICAgIEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtIGl0ZW07Ci0gICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmFjcXVpcmVCdWZmZXIoJml0ZW0sIDApOwogICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbgogICAgICAgICBBTE9HVygiZmlsbENvZGVjQnVmZmVyX2w6IGZyYW1lIHdhcyBub3QgYXZhaWxhYmxlIik7CkBAIC00MTQsMTAgKzQzNywyMSBAQAogICAgICAgICBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKICAgICB9CiAKLSAgICBlcnIgPSBzdWJtaXRCdWZmZXJfbChpdGVtLCBjYmkpOworICAgIGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCisgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQorICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcCA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7CisgICAgICAgIC8vIGlmIHN0YXJ0IHRpbWUgaXMgc2V0LCBvZmZzZXQgdGltZSBzdGFtcCBieSBzdGFydCB0aW1lCisgICAgICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zID4gMCkgeworICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wIC09IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKKyAgICB9CisKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dWKCJzdWJtaXRCdWZmZXJfbCBmYWlsZWQsIHJlbGVhc2luZyBicSBidWYgJWQiLCBpdGVtLm1CdWYpOwotICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCiAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiYnVmZmVyIHN1Ym1pdHRlZCAoYnEgJWQsIGNiaSAlZCkiLCBpdGVtLm1CdWYsIGNiaSk7CkBAIC00NDAsNyArNDc0LDcgQEAKICAgICAgICAgLy8KICAgICAgICAgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSB0cnkgdG8gcmVsZWFzZSB0aGUgYnVmZmVyLgogICAgICAgICBBTE9HRCgicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2w6IHNsb3Qgd2FzIE5VTEwiKTsKLSAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCiAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAogICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwKQEAgLTQ5NCw3ICs1MjgsNyBAQAogCiAgICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA+PSAwKSB7CiAgICAgICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVyVXNlQ291bnQgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLT5yZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCiAgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSwKICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCkBAIC01MjAsNyArNTU0LDcgQEAKIAogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBBTE9HVigic2lnbmFsRW5kT2ZJbnB1dFN0cmVhbTogZXhlYz0lZCBhdmFpbD0lZCBlb3M9JWQiLAorICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjPSVkIGF2YWlsPSV6dSBlb3M9JWQiLAogICAgICAgICAgICAgbUV4ZWN1dGluZywgbU51bUZyYW1lc0F2YWlsYWJsZSwgbUVuZE9mU3RyZWFtKTsKIAogICAgIGlmIChtRW5kT2ZTdHJlYW0pIHsKQEAgLTU0OCw3ICs1ODIsMzIgQEAKIGludDY0X3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0VGltZXN0YW1wKGNvbnN0IEJ1ZmZlclF1ZXVlOjpCdWZmZXJJdGVtICZpdGVtKSB7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXAgLyAxMDAwOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCkgeworICAgIGlmIChtVGltZVBlckNhcHR1cmVVcyA+IDBsbCkgeworICAgICAgICAvLyBUaW1lIGxhcHNlIG9yIHNsb3cgbW90aW9uIG1vZGUKKyAgICAgICAgaWYgKG1QcmV2Q2FwdHVyZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjYXB0dXJlCisgICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIG1QcmV2RnJhbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNuYXAgdG8gbmVhcmVzdCBjYXB0dXJlIHBvaW50CisgICAgICAgICAgICBpbnQ2NF90IG5GcmFtZXMgPSAodGltZVVzICsgbVRpbWVQZXJDYXB0dXJlVXMgLyAyIC0gbVByZXZDYXB0dXJlVXMpCisgICAgICAgICAgICAgICAgICAgIC8gbVRpbWVQZXJDYXB0dXJlVXM7CisgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldkNhcHR1cmVVcyA9IG1QcmV2Q2FwdHVyZVVzICsgbkZyYW1lcyAqIG1UaW1lUGVyQ2FwdHVyZVVzOworICAgICAgICAgICAgbVByZXZGcmFtZVVzICs9IG1UaW1lUGVyRnJhbWVVcyAqIG5GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigidGltZVVzICVsbGQsIGNhcHR1cmVVcyAlbGxkLCBmcmFtZVVzICVsbGQiLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2Q2FwdHVyZVVzKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1QcmV2RnJhbWVVcykpOworCisgICAgICAgIHJldHVybiBtUHJldkZyYW1lVXM7CisgICAgfSBlbHNlIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPiAwbGwpIHsKICAgICAgICAgLyogQ2FwIHRpbWVzdGFtcCBnYXAgYmV0d2VlbiBhZGphY2VudCBmcmFtZXMgdG8gc3BlY2lmaWVkIG1heAogICAgICAgICAgKgogICAgICAgICAgKiBJbiB0aGUgc2NlbmFyaW8gb2YgY2FzdCBtaXJyb3JpbmcsIGVuY29kaW5nIGNvdWxkIGJlIHN1c3BlbmRlZCBmb3IKQEAgLTU3Miw3ICs2MzEsOSBAQAogICAgICAgICBtUHJldk9yaWdpbmFsVGltZVVzID0gb3JpZ2luYWxUaW1lVXM7CiAgICAgICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgIG1PcmlnaW5hbFRpbWVVcy5hZGQodGltZVVzLCBvcmlnaW5hbFRpbWVVcyk7Ci0gICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLCBvcmlnaW5hbFRpbWVVcywgdGltZVVzKTsKKyAgICAgICAgQUxPR1YoIklOICB0aW1lc3RhbXA6ICVsbGQgLT4gJWxsZCIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG9yaWdpbmFsVGltZVVzKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRpbWVVczsKQEAgLTU5NSwxMCArNjU2LDIyIEBACiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciA9IGNvZGVjQnVmZmVyLm1IZWFkZXI7CiAgICAgQ0hFQ0soaGVhZGVyLT5uQWxsb2NMZW4gPj0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7Ci0gICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZSA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKLSAgICBtZW1jcHkoZGF0YSArIDQsICZoYW5kbGUsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKKyAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlOworICAgIGlmICghbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIHsKKyAgICAgICAgY29uc3QgT01YX1UzMiB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgIGhhbmRsZSA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7CisgICAgICAgIG1lbWNweShkYXRhLCAmdHlwZSwgNCk7CisgICAgICAgIG1lbWNweShkYXRhICsgNCwgJmhhbmRsZSwgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNvZGVjQnVmZmVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBHcmFwaGljQnVmZmVyLCBzbworICAgICAgICAvLyBpdCBpcyB2YWxpZCB3aGlsZSBpdCBpcyB3aXRoIHRoZSBPTVggY29tcG9uZW50CisgICAgICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOworICAgICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOworICAgICAgICAvLyBwYXNzaW5nIGEgbm9uLXJlZmVyZW5jZS1jb3VudGVkIGdyYXBoaWNCdWZmZXIKKyAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCk7CisgICAgICAgIGhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOworICAgICAgICBtZW1jcHkoZGF0YSArIDQsICZidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICB9CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eURpcmVjdEJ1ZmZlcihoZWFkZXIsIDAsCiAgICAgICAgICAgICA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCksIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUsCkBAIC02ODAsNyArNzUzLDcgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25GcmFtZUF2YWlsYWJsZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIAotICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIGV4ZWM9JWQgYXZhaWw9JWQiLAorICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIGV4ZWM9JWQgYXZhaWw9JXp1IiwKICAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1OdW1GcmFtZXNBdmFpbGFibGUpOwogCiAgICAgaWYgKG1FbmRPZlN0cmVhbSB8fCBtU3VzcGVuZGVkKSB7CkBAIC02OTQsMTUgKzc2NywxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgQnVmZmVyUXVldWU6OkJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlclF1ZXVlLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBzZWVpbmcgdGhpcyBidWZmZXIsIGFkZCBpdCB0byBvdXIKICAgICAgICAgICAgIC8vIHNsb3QgdGFibGUuCiAgICAgICAgICAgICBpZiAoaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxDb2RlY0J1ZmZlcl9sOiBzZXR0aW5nIG1CdWZmZXJTbG90ICVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVmZmVyUXVldWUtPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwpAQCAtNzIyLDEzICs3OTUsMTMgQEAKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAotICAgIHVpbnQzMl90IHNsb3RNYXNrOwotICAgIGlmIChtQnVmZmVyUXVldWUtPmdldFJlbGVhc2VkQnVmZmVycygmc2xvdE1hc2spICE9IE5PX0VSUk9SKSB7CisgICAgdWludDY0X3Qgc2xvdE1hc2s7CisgICAgaWYgKG1Db25zdW1lci0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZzbG90TWFzaykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIm9uQnVmZmVyc1JlbGVhc2VkOiB1bmFibGUgdG8gZ2V0IHJlbGVhc2VkIGJ1ZmZlciBzZXQiKTsKLSAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmOworICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTDsKICAgICB9CiAKLSAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTA4eCIsIHNsb3RNYXNrKTsKKyAgICBBTE9HVigib25CdWZmZXJzUmVsZWFzZWQ6IDB4JTAxNiIgUFJJeDY0LCBzbG90TWFzayk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKICAgICAgICAgaWYgKChzbG90TWFzayAmIDB4MDEpICE9IDApIHsKQEAgLTczOCw2ICs4MTEsMTEgQEAKICAgICB9CiB9CiAKKy8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAiR3JhcGhpY0J1ZmZlclNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKK30KKwogc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCiAgICAgICAgIGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwpAQCAtNzYyLDYgKzg0MCwyNyBAQAogCiAgICAgcmV0dXJuIE9LOwogfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9CisgICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzID4gMCkgPyAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VVcyhpbnQ2NF90KiBkYXRhKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICBpZiAobUV4ZWN1dGluZyB8fCBkYXRhWzBdIDw9IDBsbCB8fCBkYXRhWzFdIDw9IDBsbCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbVRpbWVQZXJGcmFtZVVzID0gZGF0YVswXTsKKyAgICBtVGltZVBlckNhcHR1cmVVcyA9IGRhdGFbMV07CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRSZXBlYXRMYXN0RnJhbWU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCAzYjBlNDU0Li5jMDg2MGFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTQ5LDcgKzQ5LDggQEAKIGNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgewogcHVibGljOgogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCk7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGJvb2wgdXNlR3JhcGhpY0J1ZmZlckluTWV0YSA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyU291cmNlKCk7CiAKICAgICAvLyBXZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxzLCBzbyB3ZSBqdXN0IHNldApAQCAtNjEsNyArNjIsNyBAQAogICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuICBCdWZmZXJzCiAgICAgLy8gcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVyUXVldWU7CisgICAgICAgIHJldHVybiBtUHJvZHVjZXI7CiAgICAgfQogCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlRXhlY3V0aW5nLCB3aGljaCBtZWFucwpAQCAtMTE4LDYgKzExOSwxNyBAQAogICAgIC8vIG9mIHN1c3BlbnNpb24gb24gaW5wdXQuCiAgICAgc3RhdHVzX3Qgc2V0TWF4VGltZXN0YW1wR2FwVXMoaW50NjRfdCBtYXhHYXBVcyk7CiAKKyAgICAvLyBTZXRzIHRoZSB0aW1lIGxhcHNlIChvciBzbG93IG1vdGlvbikgcGFyYW1ldGVycy4KKyAgICAvLyBkYXRhWzBdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBwbGF5YmFjaworICAgIC8vIGRhdGFbMV0gaXMgdGhlIHRpbWUgKHVzKSBiZXR3ZWVuIHR3byBmcmFtZXMgZm9yIGNhcHR1cmUKKyAgICAvLyBXaGVuIHNldCwgdGhlIHNhbXBsZSdzIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIHBsYXliYWNrIGZyYW1lcmF0ZSwKKyAgICAvLyBhbmQgY2FwdHVyZSB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBjYXB0dXJlIHJhdGUuCisgICAgc3RhdHVzX3Qgc2V0VGltZUxhcHNlVXMoaW50NjRfdCogZGF0YSk7CisKKyAgICAvLyBTZXRzIHRoZSBzdGFydCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYmVmb3JlIHdoaWNoIHNob3VsZAorICAgIC8vIGJlIGRyb3BwZWQgYW5kIG5vdCBzdWJtaXR0ZWQgdG8gZW5jb2RlcgorICAgIHZvaWQgc2V0U2tpcEZyYW1lc0JlZm9yZVVzKGludDY0X3Qgc3RhcnRUaW1lVXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiBhIG5ldyBmcmFtZSBvZgogICAgIC8vIGRhdGEgaXMgYXZhaWxhYmxlLiAgSWYgd2UncmUgZXhlY3V0aW5nIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcwpAQCAtMTMyLDYgKzE0NCwxMSBAQAogICAgIC8vIHNldCBvZiBtQnVmZmVyU2xvdCBlbnRyaWVzLgogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpOwogCisgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcworICAgIC8vIGNoYW5nZWQgdGhlIHNpZGViYW5kIHN0cmVhbS4gR3JhcGhpY0J1ZmZlclNvdXJjZSBkb2Vzbid0IGhhbmRsZSBzaWRlYmFuZAorICAgIC8vIHN0cmVhbXMgc28gdGhpcyBpcyBhIG5vLW9wIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCkuCisgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CisKIHByaXZhdGU6CiAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2RlYyBpbnB1dCBidWZmZXJzLiAgVGhleSBtYXkgZWl0aGVyIGJlIGF2YWlsYWJsZQogICAgIC8vIChtR3JhcGhpY0J1ZmZlciA9PSBOVUxMKSBvciBpbiB1c2UgYnkgdGhlIGNvZGVjLgpAQCAtMTk0LDggKzIxMSwxMSBAQAogCiAgICAgYm9vbCBtU3VzcGVuZGVkOwogCi0gICAgLy8gV2UgY29uc3VtZSBncmFwaGljIGJ1ZmZlcnMgZnJvbSB0aGlzLgotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgLy8gT3VyIEJ1ZmZlclF1ZXVlIGludGVyZmFjZXMuIG1Qcm9kdWNlciBpcyBwYXNzZWQgdG8gdGhlIHByb2R1Y2VyIHRocm91Z2gKKyAgICAvLyBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBhbmQgbUNvbnN1bWVyIGlzIHVzZWQgaW50ZXJuYWxseSB0byByZXRyaWV2ZQorICAgIC8vIHRoZSBidWZmZXJzIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKIAogICAgIC8vIE51bWJlciBvZiBmcmFtZXMgcGVuZGluZyBpbiBCdWZmZXJRdWV1ZSB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4KICAgICAvLyBmb3J3YXJkZWQgdG8gdGhlIGNvZGVjLgpAQCAtMjIzLDE2ICsyNDMsMTcgQEAKICAgICBlbnVtIHsKICAgICAgICAga1JlcGVhdExhc3RGcmFtZUNvdW50ID0gMTAsCiAgICAgfTsKLSAgICBpbnQ2NF90IG1SZXBlYXRBZnRlclVzOwotICAgIGludDY0X3QgbU1heFRpbWVzdGFtcEdhcFVzOwogCiAgICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgaW50NjRfdD4gbU9yaWdpbmFsVGltZVVzOworICAgIGludDY0X3QgbU1heFRpbWVzdGFtcEdhcFVzOwogICAgIGludDY0X3QgbVByZXZPcmlnaW5hbFRpbWVVczsKICAgICBpbnQ2NF90IG1QcmV2TW9kaWZpZWRUaW1lVXM7CisgICAgaW50NjRfdCBtU2tpcEZyYW1lc0JlZm9yZU5zOwogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPiA+IG1SZWZsZWN0b3I7CiAKKyAgICBpbnQ2NF90IG1SZXBlYXRBZnRlclVzOwogICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wOwogICAgIGludDMyX3QgbVJlcGVhdExhc3RGcmFtZUNvdW50OwpAQCAtMjQ1LDYgKzI2NiwxNCBAQAogICAgIC8vIG5vIGNvZGVjIGJ1ZmZlciB3YXMgYXZhaWxhYmxlIGF0IHRoZSB0aW1lLgogICAgIGJvb2wgbVJlcGVhdEJ1ZmZlckRlZmVycmVkOwogCisgICAgLy8gVGltZSBsYXBzZSAvIHNsb3cgbW90aW9uIGNvbmZpZ3VyYXRpb24KKyAgICBpbnQ2NF90IG1UaW1lUGVyQ2FwdHVyZVVzOworICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOworICAgIGludDY0X3QgbVByZXZDYXB0dXJlVXM7CisgICAgaW50NjRfdCBtUHJldkZyYW1lVXM7CisKKyAgICBib29sIG1Vc2VHcmFwaGljQnVmZmVySW5NZXRhOworCiAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHcmFwaGljQnVmZmVyU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKaW5kZXggYzUyZDE4NC4uMWZhZjcyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk9NWCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTE5NSw3ICsxOTcsNyBAQAogICAgIHJldHVybiAoaW5zdGFuY2UgPT0gTlVMTCA/IGZhbHNlIDogaW5zdGFuY2UtPmlzU2VjdXJlKCkpOwogfQogCi1ib29sIE9NWDo6bGl2ZXNMb2NhbGx5KG5vZGVfaWQgbm9kZSwgcGlkX3QgcGlkKSB7Citib29sIE9NWDo6bGl2ZXNMb2NhbGx5KG5vZGVfaWQgLyogbm9kZSAqLywgcGlkX3QgcGlkKSB7CiAgICAgcmV0dXJuIHBpZCA9PSBnZXRwaWQoKTsKIH0KIApAQCAtMjQxLDcgKzI0Myw3IEBACiAgICAgICAgICAgICBpbnN0YW5jZSwgJmhhbmRsZSk7CiAKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgQUxPR1YoIkZBSUxFRCB0byBhbGxvY2F0ZSBvbXggY29tcG9uZW50ICclcyciLCBuYW1lKTsKKyAgICAgICAgQUxPR0UoIkZBSUxFRCB0byBhbGxvY2F0ZSBvbXggY29tcG9uZW50ICclcyciLCBuYW1lKTsKIAogICAgICAgICBpbnN0YW5jZS0+b25HZXRIYW5kbGVGYWlsZWQoKTsKIApAQCAtMjk1LDYgKzI5Nyw3IEBACiBzdGF0dXNfdCBPTVg6OmdldFBhcmFtZXRlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU5ERVhUWVBFIGluZGV4LAogICAgICAgICB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoImdldFBhcmFtZXRlcigldSAlI3ggJXAgJXpkKSIsIG5vZGUsIGluZGV4LCBwYXJhbXMsIHNpemUpOwogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmdldFBhcmFtZXRlcigKICAgICAgICAgICAgIGluZGV4LCBwYXJhbXMsIHNpemUpOwogfQpAQCAtMzAyLDYgKzMwNSw3IEBACiBzdGF0dXNfdCBPTVg6OnNldFBhcmFtZXRlcigKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfSU5ERVhUWVBFIGluZGV4LAogICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoInNldFBhcmFtZXRlcigldSAlI3ggJXAgJXpkKSIsIG5vZGUsIGluZGV4LCBwYXJhbXMsIHNpemUpOwogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIGluZGV4LCBwYXJhbXMsIHNpemUpOwogfQpAQCAtMzQ4LDYgKzM1MiwxMyBAQAogICAgICAgICAgICAgcG9ydEluZGV4LCBlbmFibGUsIG1heEZyYW1lV2lkdGgsIG1heEZyYW1lSGVpZ2h0KTsKIH0KIAorc3RhdHVzX3QgT01YOjpjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIHBvcnRJbmRleCwgdHVubmVsZWQsIGF1ZGlvSHdTeW5jLCBzaWRlYmFuZEhhbmRsZSk7Cit9CisKIHN0YXR1c190IE9NWDo6dXNlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgewpAQCAtNDM0LDggKzQ0NSw4IEBACiAgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAogICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCi0gICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpIHsKLSAgICBBTE9HVigiT25FdmVudCglZCwgJWxkLCAlbGQpIiwgZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CisgICAgICAgIE9NWF9JTiBPTVhfUFRSIC8qIHBFdmVudERhdGEgKi8pIHsKKyAgICBBTE9HVigiT25FdmVudCglZCwgJSIgUFJJdTMyIiwgJSIgUFJJdTMyICIpIiwgZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CiAKICAgICAvLyBGb3J3YXJkIHRvIE9NWE5vZGVJbnN0YW5jZS4KICAgICBmaW5kSW5zdGFuY2Uobm9kZSktPm9uRXZlbnQoZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CkBAIC00NTMsMTMgKzQ2NCwxMyBAQAogfQogCiBPTVhfRVJST1JUWVBFIE9NWDo6T25FbXB0eUJ1ZmZlckRvbmUoCi0gICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CisgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKSB7CiAgICAgQUxPR1YoIk9uRW1wdHlCdWZmZXJEb25lIGJ1ZmZlcj0lcCIsIHBCdWZmZXIpOwogCiAgICAgb214X21lc3NhZ2UgbXNnOwogICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOwogICAgIG1zZy5ub2RlID0gbm9kZTsKLSAgICBtc2cudS5idWZmZXJfZGF0YS5idWZmZXIgPSBwQnVmZmVyOworICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IGJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CiAKQEAgLTQ2NywxOSArNDc4LDE3IEBACiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkZpbGxCdWZmZXJEb25lKAotICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikgeworICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikgewogICAgIEFMT0dWKCJPbkZpbGxCdWZmZXJEb25lIGJ1ZmZlcj0lcCIsIHBCdWZmZXIpOwogCiAgICAgb214X21lc3NhZ2UgbXNnOwogICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU7CiAgICAgbXNnLm5vZGUgPSBub2RlOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciA9IHBCdWZmZXI7CisgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCA9IHBCdWZmZXItPm5PZmZzZXQ7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoID0gcEJ1ZmZlci0+bkZpbGxlZExlbjsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5mbGFncyA9IHBCdWZmZXItPm5GbGFnczsKICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPSBwQnVmZmVyLT5uVGltZVN0YW1wOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUgPSBwQnVmZmVyLT5wUGxhdGZvcm1Qcml2YXRlOwotICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyID0gcEJ1ZmZlci0+cEJ1ZmZlcjsKIAogICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKaW5kZXggNmI2ZDBhYi4uYWUzY2IzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vTW9yZSkgewotICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICVkICIKKyAgICAgICAgQUxPR0UoIk9NWCBwbHVnaW4gZmFpbGVkIHcvIGVycm9yIDB4JTA4eCBhZnRlciByZWdpc3RlcmluZyAlenUgIgogICAgICAgICAgICAgICJjb21wb25lbnRzIiwgZXJyLCBtUGx1Z2luQnlDb21wb25lbnROYW1lLnNpemUoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCAxMjIxZTdlLi45MjY1NTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMTE3LDEyICsxMTcsMTQgQEAKIE9NWE5vZGVJbnN0YW5jZTo6T01YTm9kZUluc3RhbmNlKAogICAgICAgICBPTVggKm93bmVyLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwgY29uc3QgY2hhciAqbmFtZSkKICAgICA6IG1Pd25lcihvd25lciksCi0gICAgICBtTm9kZUlEKE5VTEwpLAorICAgICAgbU5vZGVJRCgwKSwKICAgICAgIG1IYW5kbGUoTlVMTCksCiAgICAgICBtT2JzZXJ2ZXIob2JzZXJ2ZXIpLAogICAgICAgbUR5aW5nKGZhbHNlKSwKICAgICAgIG1TYWlsZWQoZmFsc2UpLAotICAgICAgbVF1ZXJpZWRQcm9oaWJpdGVkRXh0ZW5zaW9ucyhmYWxzZSkgeworICAgICAgbVF1ZXJpZWRQcm9oaWJpdGVkRXh0ZW5zaW9ucyhmYWxzZSksCisgICAgICBtQnVmZmVySURDb3VudCgwKQorewogICAgIG1Vc2luZ01ldGFkYXRhWzBdID0gZmFsc2U7CiAgICAgbVVzaW5nTWV0YWRhdGFbMV0gPSBmYWxzZTsKICAgICBtSXNTZWN1cmUgPSBBU3RyaW5nKG5hbWUpLmVuZHNXaXRoKCIuc2VjdXJlIik7CkBAIC0xNzUsNiArMTc3LDExIEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZyZWVOb2RlKE9NWE1hc3RlciAqbWFzdGVyKSB7CiAgICAgc3RhdGljIGludDMyX3Qga01heE51bUl0ZXJhdGlvbnMgPSAxMDsKIAorICAgIC8vIGV4aXQgaWYgd2UgaGF2ZSBhbHJlYWR5IGZyZWVkIHRoZSBub2RlCisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgLy8gVHJhbnNpdGlvbiB0aGUgbm9kZSBmcm9tIGl0cyBjdXJyZW50IHN0YXRlIGFsbCB0aGUgd2F5IGRvd24KICAgICAvLyB0byAiTG9hZGVkIi4KICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgYWN0aXZlIGJ1ZmZlcnMgYXJlIHByb3Blcmx5IGZyZWVkIGV2ZW4KQEAgLTI2Miw3ICsyNjksNyBAQAogICAgIH0KIAogICAgIG1Pd25lci0+aW52YWxpZGF0ZU5vZGVJRChtTm9kZUlEKTsKLSAgICBtTm9kZUlEID0gTlVMTDsKKyAgICBtTm9kZUlEID0gMDsKIAogICAgIEFMT0dWKCJPTVhOb2RlSW5zdGFuY2UgZ29pbmcgYXdheS4iKTsKICAgICBkZWxldGUgdGhpczsKQEAgLTMwNSw2ICszMTIsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpyZXN0cmljdGVkX2V4dGVuc2lvbnNbXSA9IHsKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayIsCisgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyMiIsCiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciIsCiAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMiLApAQCAtMzE3LDggKzMyNSwxMCBAQAogICAgICAgICAgICAgfHwgKGluZGV4ID4gT01YX0luZGV4VmlkZW9TdGFydFVudXNlZCAmJiBpbmRleCA8PSBPTVhfSW5kZXhDb25maWdWaWRlb05hbFNpemUpCiAgICAgICAgICAgICB8fCAoaW5kZXggPiBPTVhfSW5kZXhDb21tb25TdGFydFVudXNlZAogICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCA8PSBPTVhfSW5kZXhDb25maWdDb21tb25UcmFuc2l0aW9uRWZmZWN0KQorICAgICAgICAgICAgfHwgKGluZGV4ID4gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4RXh0QXVkaW9TdGFydFVudXNlZAorICAgICAgICAgICAgICAgICAgICAmJiBpbmRleCA8PSAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbikKICAgICAgICAgICAgIHx8IChpbmRleCA+IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleEV4dFZpZGVvU3RhcnRVbnVzZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggPD0gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnVmlkZW9WcDhSZWZlcmVuY2VGcmFtZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtU2xpY2VTZWdtZW50cykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzM2LDcgKzM0Niw3IEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKGlzUHJvaGliaXRlZEluZGV4X2woaW5kZXgpKSB7CkBAIC0zNDUsMTIgKzM1NSwxMiBAQAogICAgIH0KIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0dldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgcGFyYW1zKTsKLQorICAgIEFMT0dFX0lGKGVyciAhPSBPTVhfRXJyb3JOb25lLCAiZ2V0UGFyYW1ldGVyKCVkKSBFUlJPUjogJSN4IiwgaW5kZXgsIGVycik7CiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldFBhcmFtZXRlcigKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChpc1Byb2hpYml0ZWRJbmRleF9sKGluZGV4KSkgewpAQCAtMzYwLDEyICszNzAsMTIgQEAKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX1NldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1IYW5kbGUsIGluZGV4LCBjb25zdF9jYXN0PHZvaWQgKj4ocGFyYW1zKSk7Ci0KKyAgICBBTE9HRV9JRihlcnIgIT0gT01YX0Vycm9yTm9uZSwgInNldFBhcmFtZXRlciglZCkgRVJST1I6ICUjeCIsIGluZGV4LCBlcnIpOwogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAoaXNQcm9oaWJpdGVkSW5kZXhfbChpbmRleCkpIHsKQEAgLTM3OCw3ICszODgsNyBAQAogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCAvKiBzaXplICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChpc1Byb2hpYml0ZWRJbmRleF9sKGluZGV4KSkgewpAQCAtNDc5LDEyICs0ODksMTYgQEAKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCiAgICAgICAgIE9NWF9CT09MIGVuYWJsZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIGVuYWJsZSk7CisgICAgcmV0dXJuIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKKyAgICAgICAgICAgIHBvcnRJbmRleCwgZW5hYmxlLAorICAgICAgICAgICAgT01YX0ZBTFNFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sIE5VTEwgLyogdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSAqLyk7CiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX0JPT0wgZW5hYmxlKSB7CisgICAgICAgIE9NWF9CT09MIGVuYWJsZSwKKyAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEpIHsKICAgICBpZiAobVNhaWxlZCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIwIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTQ5OCwxMCArNTEyLDI1IEBACiAgICAgT01YX1NUUklORyBuYW1lID0gY29uc3RfY2FzdDxPTVhfU1RSSU5HPigKICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpOwogCi0gICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmFtZSwgJmluZGV4KTsKKyAgICBPTVhfU1RSSU5HIGdyYXBoaWNCdWZmZXJOYW1lID0gY29uc3RfY2FzdDxPTVhfU1RSSU5HPigKKyAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVHcmFwaGljQnVmZmVySW5NZXRhRGF0YSIpOworICAgIGlmICh1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9ICZ1c2VHcmFwaGljQnVmZmVyOworICAgIH0KKworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KKyAgICAgICAgKHVzZUdyYXBoaWNCdWZmZXIgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkKKyAgICAgICAgICAgICAgICA/IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBncmFwaGljQnVmZmVyTmFtZSwgJmluZGV4KQorICAgICAgICAgICAgICAgIDogT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgICp1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gT01YX0ZBTFNFOworICAgICAgICBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmFtZSwgJmluZGV4KTsKKyAgICB9CisKICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgQUxPR0UoIk9NWF9HZXRFeHRlbnNpb25JbmRleCAlcyBmYWlsZWQiLCBuYW1lKTsKLQogICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiAgICAgfQogCkBAIC01MTYsNiArNTQ1LDcgQEAKICAgICBwYXJhbXMuYlN0b3JlTWV0YURhdGEgPSBlbmFibGU7CiAgICAgaWYgKChlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKSkgIT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICBBTE9HRSgiT01YX1NldFBhcmFtZXRlcigpIGZhaWxlZCBmb3IgU3RvcmVNZXRhRGF0YUluQnVmZmVyczogMHglMDh4IiwgZXJyKTsKKyAgICAgICAgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPSBPTVhfRkFMU0U7CiAgICAgICAgIGlmIChlbmFibGUpIHsKICAgICAgICAgICAgIG1Vc2luZ01ldGFkYXRhW3BvcnRJbmRleF0gPSBmYWxzZTsKICAgICAgICAgfQpAQCAtNTY0LDYgKzU5NCw1MyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsIE9NWF9VMzIgYXVkaW9Id1N5bmMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNhaWxlZCkgeworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIwIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBPTVhfSU5ERVhUWVBFIGluZGV4OworICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCisgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSIpOworCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmFtZSwgJmluZGV4KTsKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSBleHRlbnNpb24gaXMgbWlzc2luZyEiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOworICAgIH0KKworICAgIENvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZVBhcmFtcyB0dW5uZWxQYXJhbXM7CisgICAgdHVubmVsUGFyYW1zLm5TaXplID0gc2l6ZW9mKHR1bm5lbFBhcmFtcyk7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IDA7CisgICAgdHVubmVsUGFyYW1zLm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKKyAgICB0dW5uZWxQYXJhbXMublZlcnNpb24ucy5uU3RlcCA9IDA7CisKKyAgICB0dW5uZWxQYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKyAgICB0dW5uZWxQYXJhbXMuYlR1bm5lbGVkID0gdHVubmVsZWQ7CisgICAgdHVubmVsUGFyYW1zLm5BdWRpb0h3U3luYyA9IGF1ZGlvSHdTeW5jOworICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZ0dW5uZWxQYXJhbXMpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBBTE9HRSgiY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlIGZhaWxlZCEgKGVyciAlZCkuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZXJyID0gT01YX0dldFBhcmFtZXRlcihtSGFuZGxlLCBpbmRleCwgJnR1bm5lbFBhcmFtcyk7CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIEFMT0dFKCJHZXRWaWRlb1R1bm5lbFdpbmRvdyBmYWlsZWQhIChlcnIgJWQpLiIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoc2lkZWJhbmRIYW5kbGUpIHsKKyAgICAgICAgKnNpZGViYW5kSGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCopdHVubmVsUGFyYW1zLnBTaWRlYmFuZFdpbmRvdzsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCiAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgewpAQCAtNjEzLDcgKzY5MCw3IEBACiAKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJfbWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwogCkBAIC02NjksNyArNzQ2LDcgQEAKICAgICBDSEVDS19FUShoZWFkZXItPnBCdWZmZXIsIGJ1ZmZlckhhbmRsZSk7CiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyTWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwogCkBAIC03MzMsNyArODEwLDcgQEAKIAogICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlck1ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKIApAQCAtNzQ1LDE1ICs4MjIsMTMgQEAKICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikoYnVmZmVyKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIHBvcnRJbmRleCk7CisgICAgaWYgKGhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhICptZXRhZGF0YSA9CiAgICAgICAgIChWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOwogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlck1ldGEgPSAoQnVmZmVyTWV0YSAqKShoZWFkZXItPnBBcHBQcml2YXRlKTsKLSAgICBpZiAoYnVmZmVyTWV0YS0+Z2V0UG9ydEluZGV4KCkgIT0gcG9ydEluZGV4KSB7Ci0gICAgICAgIEFMT0dXKCJidWZmZXIgJXUgaGFzIGFuIGluY29ycmVjdCBwb3J0IGluZGV4LiIsIGJ1ZmZlcik7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg4MTY4MjciKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQogICAgIGJ1ZmZlck1ldGEtPnNldEdyYXBoaWNCdWZmZXIoZ3JhcGhpY0J1ZmZlcik7CiAgICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CiAgICAgbWV0YWRhdGEtPnBIYW5kbGUgPSBncmFwaGljQnVmZmVyLT5oYW5kbGU7CkBAIC03ODEsNyArODU2LDEwIEBACiAgICAgfQogCiAgICAgLy8gSW5wdXQgYnVmZmVycyB3aWxsIGhvbGQgbWV0YS1kYXRhIChncmFsbG9jIHJlZmVyZW5jZXMpLgotICAgIGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIE9NWF9UUlVFKTsKKyAgICBPTVhfQk9PTCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgZXJyID0gc3RvcmVNZXRhRGF0YUluQnVmZmVyc19sKAorICAgICAgICAgICAgcG9ydEluZGV4LCBPTVhfVFJVRSwKKyAgICAgICAgICAgIE9NWF9UUlVFIC8qIHVzZUdyYXBoaWNCdWZmZXIgKi8sICZ1c2luZ0dyYXBoaWNCdWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC04MDcsNyArODg1LDcgQEAKIAogICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UqIGJ1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKAogICAgICAgICAgICAgdGhpcywgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsKTsKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIHVzaW5nR3JhcGhpY0J1ZmZlcik7CiAgICAgaWYgKChlcnIgPSBidWZmZXJTb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgewogICAgICAgICBkZWxldGUgYnVmZmVyU291cmNlOwogICAgICAgICByZXR1cm4gZXJyOwpAQCAtODU3LDcgKzkzNSw3IEBACiAKICAgICBDSEVDS19FUShoZWFkZXItPnBBcHBQcml2YXRlLCBidWZmZXJfbWV0YSk7CiAKLSAgICAqYnVmZmVyID0gaGVhZGVyOworICAgICpidWZmZXIgPSBtYWtlQnVmZmVySUQoaGVhZGVyKTsKICAgICAqYnVmZmVyX2RhdGEgPSBoZWFkZXItPnBCdWZmZXI7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKQEAgLTkwOCw3ICs5ODYsNyBAQAogCiAgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOwogCi0gICAgKmJ1ZmZlciA9IGhlYWRlcjsKKyAgICAqYnVmZmVyID0gbWFrZUJ1ZmZlcklEKGhlYWRlcik7CiAKICAgICBhZGRBY3RpdmVCdWZmZXIocG9ydEluZGV4LCAqYnVmZmVyKTsKIApAQCAtOTI2LDE4ICsxMDA0LDE3IEBACiAKICAgICByZW1vdmVBY3RpdmVCdWZmZXIocG9ydEluZGV4LCBidWZmZXIpOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKLSAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9IHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgaWYgKGJ1ZmZlcl9tZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBwb3J0SW5kZXgpIHsKLSAgICAgICAgQUxPR1coImJ1ZmZlciAldSBoYXMgYW4gaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODgxNjgyNyIpOwotICAgICAgICAvLyBjb250aW51ZSBmcmVlaW5nCisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyLCBwb3J0SW5kZXgpOworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9IHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9GcmVlQnVmZmVyKG1IYW5kbGUsIHBvcnRJbmRleCwgaGVhZGVyKTsKIAogICAgIGRlbGV0ZSBidWZmZXJfbWV0YTsKICAgICBidWZmZXJfbWV0YSA9IE5VTEw7CisgICAgaW52YWxpZGF0ZUJ1ZmZlcklEKGJ1ZmZlcik7CiAKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CiB9CkBAIC05NDUsMTggKzEwMjIsMTQgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKWJ1ZmZlcjsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSAwOwogICAgIGhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgaGVhZGVyLT5uRmxhZ3MgPSAwOwogCi0gICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBzdGF0aWNfY2FzdDxCdWZmZXJNZXRhICo+KGhlYWRlci0+cEFwcFByaXZhdGUpOwotICAgIGlmIChidWZmZXJfbWV0YS0+Z2V0UG9ydEluZGV4KCkgIT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICBBTE9HVygiYnVmZmVyICV1IGhhcyBhbiBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOwotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI4ODE2ODI3Iik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0ZpbGxUaGlzQnVmZmVyKG1IYW5kbGUsIGhlYWRlcik7CiAKICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CkBAIC05NjgsMTQgKzEwNDEsMTMgQEAKICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopYnVmZmVyOwotCiAgICAgLy8gbm8gZW1wdHlidWZmZXIgaWYgdXNpbmcgaW5wdXQgc3VyZmFjZQogICAgIGlmIChnZXRHcmFwaGljQnVmZmVyU291cmNlKCkgIT0gTlVMTCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIwIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIGtQb3J0SW5kZXhJbnB1dCk7CiAgICAgLy8gcmFuZ2VMZW5ndGggYW5kIHJhbmdlT2Zmc2V0IG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIGFsbG9jYXRlZCBkYXRhIGluIHRoZSBidWZmZXIuCiAgICAgLy8gY29ybmVyIGNhc2U6IHdlIHBlcm1pdCByYW5nZU9mZnNldCA9PSBlbmQtb2YtYnVmZmVyIHdpdGggcmFuZ2VMZW5ndGggPT0gMC4KICAgICBpZiAoaGVhZGVyID09IE5VTEwKQEAgLTk5MCwxMSArMTA2Miw2IEBACiAKICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgaWYgKGJ1ZmZlcl9tZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBrUG9ydEluZGV4SW5wdXQpIHsKLSAgICAgICAgQUxPR1coImJ1ZmZlciAldSBoYXMgYW4gaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODgxNjgyNyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9CiAgICAgYnVmZmVyX21ldGEtPkNvcHlUb09NWChoZWFkZXIpOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRW1wdHlUaGlzQnVmZmVyKG1IYW5kbGUsIGhlYWRlcik7CkBAIC0xMDQxLDYgKzExMDgsOCBAQAogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVVNQRU5EOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9SRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVk6CiAgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FOgorICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9USU1FX0xBUFNFOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlID0KICAgICAgICAgICAgICAgICBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CkBAIC0xMDY1LDcgKzExMzQsOCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyU291cmNlLT5zZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyhkZWxheVVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0KKyAgICAgICAgICAgICAgICAgICAgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9USU1FU1RBTVBfR0FQKXsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwNzMsNiArMTE0MywyMCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgbWF4R2FwVXMgPSAqKGludDY0X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0TWF4VGltZXN0YW1wR2FwVXMobWF4R2FwVXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcyA9ICooaW50NjRfdCAqKWRhdGE7CisKKyAgICAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPnNldFNraXBGcmFtZXNCZWZvcmVVcyhza2lwRnJhbWVzQmVmb3JlVXMpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gSU9NWDo6SU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0UKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoaW50NjRfdCkgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPnNldFRpbWVMYXBzZVVzKChpbnQ2NF90ICopZGF0YSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTEwODgsMTcgKzExNzIsMTUgQEAKIAogICAgIGlmIChtc2cudHlwZSA9PSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORSkgewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9CVUZGRVJIRUFERVJUWVBFICo+KAotICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOworICAgICAgICAgICAgZmluZEJ1ZmZlckhlYWRlcihtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOworICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCiAgICAgICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oYnVmZmVyLT5wQXBwUHJpdmF0ZSk7Ci0gICAgICAgIGlmIChidWZmZXJfbWV0YS0+Z2V0UG9ydEluZGV4KCkgIT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICAgICAgQUxPR1coImJ1ZmZlciAldSBoYXMgYW4gaW5jb3JyZWN0IHBvcnQgaW5kZXguIiwgYnVmZmVyKTsKLSAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg4MTY4MjciKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlcl9tZXRhLT5Db3B5RnJvbU9NWChidWZmZXIpOwotICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyX21ldGEtPkNvcHlGcm9tT01YKGJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGJ1ZmZlclNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBmaXggdXAgdGhlIGJ1ZmZlciBpbmZvIChlc3BlY2lhbGx5IHRpbWVzdGFtcCkgaWYgbmVlZGVkCkBAIC0xMTE4LDggKzEyMDAsMTAgQEAKICAgICAgICAgICAgIC8vIGJlIHZlcnkgY29uZnVzZWQuCiAKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9CVUZGRVJIRUFERVJUWVBFICo+KAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmaW5kQnVmZmVySGVhZGVyKG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciwga1BvcnRJbmRleElucHV0KTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckVtcHRpZWQoYnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTExNjMsNyArMTI0Nyw3IEBACiAKIC8vIHN0YXRpYwogT01YX0VSUk9SVFlQRSBPTVhOb2RlSW5zdGFuY2U6Ok9uRXZlbnQoCi0gICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgLyogaENvbXBvbmVudCAqLywKICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCiAgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLApAQCAtMTE3OSwyNiArMTI2MywyOCBAQAogCiAvLyBzdGF0aWMKIE9NWF9FUlJPUlRZUEUgT01YTm9kZUluc3RhbmNlOjpPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAvKiBoQ29tcG9uZW50ICovLAogICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKSB7CiAgICAgT01YTm9kZUluc3RhbmNlICppbnN0YW5jZSA9IHN0YXRpY19jYXN0PE9NWE5vZGVJbnN0YW5jZSAqPihwQXBwRGF0YSk7CiAgICAgaWYgKGluc3RhbmNlLT5tRHlpbmcpIHsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQotICAgIHJldHVybiBpbnN0YW5jZS0+b3duZXIoKS0+T25FbXB0eUJ1ZmZlckRvbmUoaW5zdGFuY2UtPm5vZGVJRCgpLCBwQnVmZmVyKTsKKyAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRW1wdHlCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIpOwogfQogCiAvLyBzdGF0aWMKIE9NWF9FUlJPUlRZUEUgT01YTm9kZUluc3RhbmNlOjpPbkZpbGxCdWZmZXJEb25lKAotICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIC8qIGhDb21wb25lbnQgKi8sCiAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAogICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpIHsKICAgICBPTVhOb2RlSW5zdGFuY2UgKmluc3RhbmNlID0gc3RhdGljX2Nhc3Q8T01YTm9kZUluc3RhbmNlICo+KHBBcHBEYXRhKTsKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkZpbGxCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwgcEJ1ZmZlcik7CisgICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkZpbGxCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwKKyAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6YWRkQWN0aXZlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBPTVg6OmJ1ZmZlcl9pZCBpZCkgewpAQCAtMTIzMyw0ICsxMzE5LDYwIEBACiAgICAgfQogfQogCitPTVg6OmJ1ZmZlcl9pZCBPTVhOb2RlSW5zdGFuY2U6Om1ha2VCdWZmZXJJRChPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVySGVhZGVyKSB7CisgICAgaWYgKGJ1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7CisgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyOworICAgIGRvIHsgLy8gaGFuZGxlIHRoZSB2ZXJ5IHVubGlrZWx5IGNhc2Ugb2YgSUQgb3ZlcmZsb3cKKyAgICAgICAgaWYgKCsrbUJ1ZmZlcklEQ291bnQgPT0gMCkgeworICAgICAgICAgICArK21CdWZmZXJJRENvdW50OworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IChPTVg6OmJ1ZmZlcl9pZCltQnVmZmVySURDb3VudDsKKyAgICB9IHdoaWxlIChtQnVmZmVySURUb0J1ZmZlckhlYWRlci5pbmRleE9mS2V5KGJ1ZmZlcikgPj0gMCk7CisgICAgbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIuYWRkKGJ1ZmZlciwgYnVmZmVySGVhZGVyKTsKKyAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5hZGQoYnVmZmVySGVhZGVyLCBidWZmZXIpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKK09NWF9CVUZGRVJIRUFERVJUWVBFICpPTVhOb2RlSW5zdGFuY2U6OmZpbmRCdWZmZXJIZWFkZXIoCisgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwgT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAoYnVmZmVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIuaW5kZXhPZktleShidWZmZXIpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coImZpbmRCdWZmZXJIZWFkZXI6IGJ1ZmZlciAldSBub3QgZm91bmQiLCBidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlQXQoaW5kZXgpOworICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKKyAgICBpZiAoYnVmZmVyX21ldGEtPmdldFBvcnRJbmRleCgpICE9IHBvcnRJbmRleCkgeworICAgICAgICBBTE9HVygiZmluZEJ1ZmZlckhlYWRlcjogYnVmZmVyICV1IGZvdW5kIGJ1dCB3aXRoIGluY29ycmVjdCBwb3J0IGluZGV4LiIsIGJ1ZmZlcik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg4MTY4MjciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBoZWFkZXI7Cit9CisKK09NWDo6YnVmZmVyX2lkIE9NWE5vZGVJbnN0YW5jZTo6ZmluZEJ1ZmZlcklEKE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXJIZWFkZXIpIHsKKyAgICBpZiAoYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQnVmZmVySURMb2NrKTsKKyAgICByZXR1cm4gbUJ1ZmZlckhlYWRlclRvQnVmZmVySUQudmFsdWVGb3IoYnVmZmVySGVhZGVyKTsKK30KKwordm9pZCBPTVhOb2RlSW5zdGFuY2U6OmludmFsaWRhdGVCdWZmZXJJRChPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7CisgICAgbUJ1ZmZlckhlYWRlclRvQnVmZmVySUQucmVtb3ZlSXRlbShtQnVmZmVySURUb0J1ZmZlckhlYWRlci52YWx1ZUZvcihidWZmZXIpKTsKKyAgICBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5yZW1vdmVJdGVtKGJ1ZmZlcik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggYjFjMzRkYy4uNjQ2Y2QzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMjU3LDY5ICsyNTcsNjkgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6c2VuZENvbW1hbmQoCi0gICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSkgeworICAgICAgICBPTVhfQ09NTUFORFRZUEUgLyogY21kICovLCBPTVhfVTMyIC8qIHBhcmFtICovLCBPTVhfUFRSIC8qIGRhdGEgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmdldFBhcmFtZXRlcigKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSAvKiBpbmRleCAqLywgT01YX1BUUiAvKiBwYXJhbXMgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnNldFBhcmFtZXRlcigKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSAvKiBpbmRleCAqLywgY29uc3QgT01YX1BUUiAvKiBwYXJhbXMgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmdldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSAvKiBpbmRleCAqLywgT01YX1BUUiAvKiBwYXJhbXMgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICAgICAgT01YX0lOREVYVFlQRSAvKiBpbmRleCAqLywgY29uc3QgT01YX1BUUiAvKiBwYXJhbXMgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgICAgICBjb25zdCBjaGFyICogLyogbmFtZSAqLywgT01YX0lOREVYVFlQRSAqIC8qIGluZGV4ICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50Ojp1c2VCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYnVmZmVyLAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX1BUUiBhcHBQcml2YXRlLAotICAgICAgICBPTVhfVTMyIHNpemUsCi0gICAgICAgIE9NWF9VOCAqcHRyKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqIC8qIGJ1ZmZlciAqLywKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8sCisgICAgICAgIE9NWF9QVFIgLyogYXBwUHJpdmF0ZSAqLywKKyAgICAgICAgT01YX1UzMiAvKiBzaXplICovLAorICAgICAgICBPTVhfVTggKiAvKiBwdHIgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmFsbG9jYXRlQnVmZmVyKAotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9QVFIgYXBwUHJpdmF0ZSwKLSAgICAgICAgT01YX1UzMiBzaXplKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqIC8qIGJ1ZmZlciAqLywKKyAgICAgICAgT01YX1UzMiAvKiBwb3J0SW5kZXggKi8sCisgICAgICAgIE9NWF9QVFIgLyogYXBwUHJpdmF0ZSAqLywKKyAgICAgICAgT01YX1UzMiAvKiBzaXplICovKSB7CiAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0T01YQ29tcG9uZW50OjpmcmVlQnVmZmVyKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgICAgICBPTVhfVTMyIC8qIHBvcnRJbmRleCAqLywKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiAvKiBidWZmZXIgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmVtcHR5VGhpc0J1ZmZlcigKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgeworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqIC8qIGJ1ZmZlciAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdE9NWENvbXBvbmVudDo6ZmlsbFRoaXNCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIpIHsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKiAvKiBidWZmZXIgKi8pIHsKICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmdldFN0YXRlKE9NWF9TVEFURVRZUEUgKnN0YXRlKSB7CitPTVhfRVJST1JUWVBFIFNvZnRPTVhDb21wb25lbnQ6OmdldFN0YXRlKE9NWF9TVEFURVRZUEUgKiAvKiBzdGF0ZSAqLykgewogICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcAppbmRleCBkNmNkZTczLi45YjY5NThhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCkBAIC00Miw2ICs0Miw3IEBACiAgICAgeyAiT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiwgImFtcndiZW5jIiwgImF1ZGlvX2VuY29kZXIuYW1yd2IiIH0sCiAgICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIsICJoMjY0ZW5jIiwgInZpZGVvX2VuY29kZXIuYXZjIiB9LAorICAgIHsgIk9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiwgImhldmNkZWMiLCAidmlkZW9fZGVjb2Rlci5oZXZjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuZzcxMS5hbGF3LmRlY29kZXIiLCAiZzcxMWRlYyIsICJhdWRpb19kZWNvZGVyLmc3MTFhbGF3IiB9LAogICAgIHsgIk9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiLCAiZzcxMWRlYyIsICJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiB9LAogICAgIHsgIk9NWC5nb29nbGUuaDI2My5kZWNvZGVyIiwgIm1wZWc0ZGVjIiwgInZpZGVvX2RlY29kZXIuaDI2MyIgfSwKQEAgLTUwLDYgKzUxLDcgQEAKICAgICB7ICJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiLCAibXBlZzRlbmMiLCAidmlkZW9fZW5jb2Rlci5tcGVnNCIgfSwKICAgICB7ICJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiwgIm1wM2RlYyIsICJhdWRpb19kZWNvZGVyLm1wMyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZvcmJpcy5kZWNvZGVyIiwgInZvcmJpc2RlYyIsICJhdWRpb19kZWNvZGVyLnZvcmJpcyIgfSwKKyAgICB7ICJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIsICJvcHVzZGVjIiwgImF1ZGlvX2RlY29kZXIub3B1cyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiwgInZweGRlYyIsICJ2aWRlb19kZWNvZGVyLnZwOCIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiwgInZweGRlYyIsICJ2aWRlb19kZWNvZGVyLnZwOSIgfSwKICAgICB7ICJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiwgInZweGVuYyIsICJ2aWRlb19lbmNvZGVyLnZwOCIgfSwKQEAgLTE1NCw3ICsxNTYsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRPTVhQbHVnaW46OmVudW1lcmF0ZUNvbXBvbmVudHMoCiAgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKLSAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHNpemVfdCAvKiBzaXplICovLAogICAgICAgICBPTVhfVTMyIGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IGtOdW1Db21wb25lbnRzKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggODIwNzEyYy4uMTNjMTYxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMTQsMTIgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtNDgsNiArNTEsOSBAQAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KQogICAgICAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgICBtSXNBZGFwdGl2ZShmYWxzZSksCisgICAgICAgIG1BZGFwdGl2ZU1heFdpZHRoKDApLAorICAgICAgICBtQWRhcHRpdmVNYXhIZWlnaHQoMCksCiAgICAgICAgIG1XaWR0aCh3aWR0aCksCiAgICAgICAgIG1IZWlnaHQoaGVpZ2h0KSwKICAgICAgICAgbUNyb3BMZWZ0KDApLApAQCAtMTE3LDE2ICsxMjMsMTggQEAKICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKTsKIH0KIAotdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50Ojp1cGRhdGVQb3J0RGVmaW5pdGlvbnMoKSB7Cit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnVwZGF0ZVBvcnREZWZpbml0aW9ucyhib29sIHVwZGF0ZUNyb3ApIHsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtJbnB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CiAgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OwogCisgICAgZGVmLT5uQnVmZmVyU2l6ZSA9IGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMyAvIDI7CisKICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOwotICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwotICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKQEAgLTEzNCwxMCArMTQyLDEwNSBAQAogICAgICAgICAgICAgKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICoKICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7CiAKLSAgICBtQ3JvcExlZnQgPSAwOwotICAgIG1Dcm9wVG9wID0gMDsKLSAgICBtQ3JvcFdpZHRoID0gbVdpZHRoOwotICAgIG1Dcm9wSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBpZiAodXBkYXRlQ3JvcCkgeworICAgICAgICBtQ3JvcExlZnQgPSAwOworICAgICAgICBtQ3JvcFRvcCA9IDA7CisgICAgICAgIG1Dcm9wV2lkdGggPSBtV2lkdGg7CisgICAgICAgIG1Dcm9wSGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9Cit9CisKKwordWludDMyX3QgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b3V0cHV0QnVmZmVyV2lkdGgoKSB7CisgICAgcmV0dXJuIG1Jc0FkYXB0aXZlID8gbUFkYXB0aXZlTWF4V2lkdGggOiBtV2lkdGg7Cit9CisKK3VpbnQzMl90IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om91dHB1dEJ1ZmZlckhlaWdodCgpIHsKKyAgICByZXR1cm4gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhIZWlnaHQgOiBtSGVpZ2h0OworfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKKyAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgQ3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlLCBib29sIGZha2VTdHJpZGUpIHsKKyAgICAqcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGJvb2wgc2l6ZUNoYW5nZWQgPSAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KTsKKyAgICBib29sIHVwZGF0ZUNyb3AgPSAoY3JvcFNldHRpbmdzTW9kZSA9PSBrQ3JvcFVuU2V0KTsKKyAgICBib29sIGNyb3BDaGFuZ2VkID0gKGNyb3BTZXR0aW5nc01vZGUgPT0ga0Nyb3BDaGFuZ2VkKTsKKyAgICBib29sIHN0cmlkZUNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZmFrZVN0cmlkZSkgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOworICAgICAgICBpZiAoZGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAhPSB3aWR0aCB8fCBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgIT0gaGVpZ2h0KSB7CisgICAgICAgICAgICBzdHJpZGVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplQ2hhbmdlZCB8fCBjcm9wQ2hhbmdlZCB8fCBzdHJpZGVDaGFuZ2VkKSB7CisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIGlmICgoc2l6ZUNoYW5nZWQgJiYgIW1Jc0FkYXB0aXZlKQorICAgICAgICAgICAgfHwgd2lkdGggPiBtQWRhcHRpdmVNYXhXaWR0aAorICAgICAgICAgICAgfHwgaGVpZ2h0ID4gbUFkYXB0aXZlTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAobUlzQWRhcHRpdmUpIHsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBtQWRhcHRpdmVNYXhXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID4gbUFkYXB0aXZlTWF4SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnModXBkYXRlQ3JvcCk7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwga091dHB1dFBvcnRJbmRleCwgMCwgTlVMTCk7CisgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAqcG9ydFdpbGxSZXNldCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnModXBkYXRlQ3JvcCk7CisKKyAgICAgICAgICAgIGlmIChmYWtlU3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gTUFKT1IgSEFDSyB0aGF0IGlzIG5vdCBwcmV0dHksIGl0J3MganVzdCB0byBmb29sIHRoZSByZW5kZXJlciB0byByZWFkIHRoZSBjb3JyZWN0CisgICAgICAgICAgICAgICAgLy8gZGF0YS4KKyAgICAgICAgICAgICAgICAvLyBTb21lIHNvZnR3YXJlIGRlY29kZXJzIChlLmcuIFNvZnRNUEVHNCkgZmlsbCBkZWNvZGVkIGZyYW1lIGRpcmVjdGx5IHRvIG91dHB1dAorICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdXRwdXQgYnVmZmVyIHN0cmlkZSBhbmQgc2xpY2UgaGVpZ2h0LiBTbyB0aGlzIGlzCisgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzaWduYWwgaG93IHRoZSBidWZmZXIgaXMgYXJyYW5nZWQuICBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gcmUtYXJyYW5nZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIGluIFNvZnRNUEVHNCwgYnV0IHRoYXQgcmVzdWx0cyBpbiBtZW1jb3BpZXMuCisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrT3V0cHV0UG9ydEluZGV4KS0+bURlZjsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gbVdpZHRoOworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsIE5VTEwpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcigKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlKSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGRzdFlTdHJpZGUgLyAyOworICAgIHNpemVfdCBkc3RIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50OF90ICpkc3RTdGFydCA9IGRzdDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCBtV2lkdGgpOworICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogZHN0SGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgbVdpZHRoIC8gMik7CisgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoNSAqIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQpIC8gNDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIG1XaWR0aCAvIDIpOworICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcigKQEAgLTE4NSwxNiArMjg4LDE2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggIT0ga0lucHV0UG9ydEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgcG9ydCBpbmRleDogJWxkIiwgcHJvZmlsZUxldmVsLT5uUG9ydEluZGV4KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IGluZGV4OiAlIiBQUkl1MzIsIHByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgeworICAgICAgICAgICAgaWYgKHByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtTnVtUHJvZmlsZUxldmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1tpbmRleF0ubVByb2ZpbGU7Ci0gICAgICAgICAgICBwcm9maWxlTGV2ZWwtPmVMZXZlbCAgID0gbVByb2ZpbGVMZXZlbHNbaW5kZXhdLm1MZXZlbDsKKyAgICAgICAgICAgIHByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBtUHJvZmlsZUxldmVsc1twcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXhdLm1Qcm9maWxlOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLT5lTGV2ZWwgICA9IG1Qcm9maWxlTGV2ZWxzW3Byb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleF0ubUxldmVsOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMjA1LDcgKzMwOCwxMCBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAvLyBJbmNsdWRlIGV4dGVuc2lvbiBpbmRleCBPTVhfSU5ERVhFWFRUWVBFLgorICAgIGNvbnN0IGludDMyX3QgaW5kZXhGdWxsID0gaW5kZXg7CisKKyAgICBzd2l0Y2ggKGluZGV4RnVsbCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQpAQCAtMjQ0LDYgKzM1MCw2OCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyogYWRhcHRpdmVQbGF5YmFja1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYWRhcHRpdmVQbGF5YmFja1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSXNBZGFwdGl2ZSA9IGFkYXB0aXZlUGxheWJhY2tQYXJhbXMtPmJFbmFibGU7CisgICAgICAgICAgICBpZiAobUlzQWRhcHRpdmUpIHsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCA9IGFkYXB0aXZlUGxheWJhY2tQYXJhbXMtPm5NYXhGcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIG1BZGFwdGl2ZU1heEhlaWdodCA9IGFkYXB0aXZlUGxheWJhY2tQYXJhbXMtPm5NYXhGcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBtQWRhcHRpdmVNYXhXaWR0aDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gbUFkYXB0aXZlTWF4SGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQWRhcHRpdmVNYXhXaWR0aCA9IDA7CisgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKm5ld1BhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKG5ld1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb19kZWYgPSAmbmV3UGFyYW1zLT5mb3JtYXQudmlkZW87CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpkZWYgPSAmZWRpdFBvcnRJbmZvKG5ld1BhcmFtcy0+blBvcnRJbmRleCktPm1EZWY7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG9sZFdpZHRoID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICB1aW50MzJfdCBvbGRIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICB1aW50MzJfdCBuZXdXaWR0aCA9IHZpZGVvX2RlZi0+bkZyYW1lV2lkdGg7CisgICAgICAgICAgICB1aW50MzJfdCBuZXdIZWlnaHQgPSB2aWRlb19kZWYtPm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIGlmIChuZXdXaWR0aCAhPSBvbGRXaWR0aCB8fCBuZXdIZWlnaHQgIT0gb2xkSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXRQb3J0ID0gKG5ld1BhcmFtcy0+blBvcnRJbmRleCA9PSBrT3V0cHV0UG9ydEluZGV4KTsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9CisgICAgICAgICAgICAgICAgICAgIChtSXNBZGFwdGl2ZSAmJiBvdXRwdXRQb3J0KSA/IG1BZGFwdGl2ZU1heFdpZHRoIDogbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgKG1Jc0FkYXB0aXZlICYmIG91dHB1dFBvcnQpID8gbUFkYXB0aXZlTWF4SGVpZ2h0IDogbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICAgICAgZGVmLT5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVdpZHRoID0gbmV3V2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBuZXdIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wTGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1Dcm9wVG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BXaWR0aCA9IG5ld1dpZHRoOworICAgICAgICAgICAgICAgICAgICBtQ3JvcEhlaWdodCA9IG5ld0hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3UGFyYW1zLT5uQnVmZmVyU2l6ZSA9IGRlZi0+bkJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwogICAgIH0KQEAgLTI3Nyw2ICs0NDUsMTYgQEAKICAgICB9CiB9CiAKK09NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CisgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjayIpKSB7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKK30KKwogdm9pZCBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpvblJlc2V0KCkgewogICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmYxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCIKKworI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCisgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1HcmFsbG9jTW9kdWxlKE5VTEwpIHsKK30KKworLy8gc3RhdGljCit2b2lkIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OkNvbnZlcnRGbGV4WVVWVG9QbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdCwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsCisgICAgICAgIHN0cnVjdCBhbmRyb2lkX3ljYmNyICp5Y2JjciwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKXljYmNyLT55OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKXljYmNyLT5jYjsKKyAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKil5Y2Jjci0+Y3I7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdCArIGRzdFZTdHJpZGUgKiBkc3RTdHJpZGU7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFUgKyAoZHN0VlN0cmlkZSA+PiAxKSAqIChkc3RTdHJpZGUgPj4gMSk7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gaGVpZ2h0OyB5ID4gMDsgLS15KSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOworICAgICAgICBzcmMgKz0geWNiY3ItPnlzdHJpZGU7CisgICAgfQorICAgIGlmICh5Y2Jjci0+Y3N0cmlkZSA9PSB5Y2Jjci0+eXN0cmlkZSA+PiAxICYmIHljYmNyLT5jaHJvbWFfc3RlcCA9PSAxKSB7CisgICAgICAgIC8vIHBsYW5hcgorICAgICAgICBmb3IgKHNpemVfdCB5ID0gaGVpZ2h0ID4+IDE7IHkgPiAwOyAtLXkpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBzcmNVICs9IHljYmNyLT5jc3RyaWRlOworICAgICAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoID4+IDEpOworICAgICAgICAgICAgZHN0ViArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgICAgIHNyY1YgKz0geWNiY3ItPmNzdHJpZGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhcmJpdHJhcnkKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IGhlaWdodCA+PiAxOyB5ID4gMDsgLS15KSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB4ID0gd2lkdGggPj4gMTsgeCA+IDA7IC0teCkgeworICAgICAgICAgICAgICAgICpkc3RVKysgPSAqc3JjVTsKKyAgICAgICAgICAgICAgICAqZHN0VisrID0gKnNyY1Y7CisgICAgICAgICAgICAgICAgc3JjVSArPSB5Y2Jjci0+Y2hyb21hX3N0ZXA7CisgICAgICAgICAgICAgICAgc3JjViArPSB5Y2Jjci0+Y2hyb21hX3N0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RVICs9IChkc3RTdHJpZGUgPj4gMSkgLSAod2lkdGggPj4gMSk7CisgICAgICAgICAgICBkc3RWICs9IChkc3RTdHJpZGUgPj4gMSkgLSAod2lkdGggPj4gMSk7CisgICAgICAgICAgICBzcmNVICs9IHljYmNyLT5jc3RyaWRlIC0gKHdpZHRoID4+IDEpICogeWNiY3ItPmNocm9tYV9zdGVwOworICAgICAgICAgICAgc3JjViArPSB5Y2Jjci0+Y3N0cmlkZSAtICh3aWR0aCA+PiAxKSAqIHljYmNyLT5jaHJvbWFfc3RlcDsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OkNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluWVZVLCB1aW50OF90KiBvdXRZVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHN0cmlkZQorICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1aW50MzJfdCAqb3V0WSAgPSAodWludDMyX3QgKikgb3V0WVVWOworICAgIHVpbnQxNl90ICpvdXRDYiA9ICh1aW50MTZfdCAqKSAob3V0WVVWICsgb3V0WXNpemUpOworICAgIHVpbnQxNl90ICpvdXRDciA9ICh1aW50MTZfdCAqKSAob3V0WVVWICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOworCisgICAgLyogWSBjb3B5aW5nICovCisgICAgbWVtY3B5KG91dFksIGluWVZVLCBvdXRZc2l6ZSk7CisKKyAgICAvKiBVICYgViBjb3B5aW5nICovCisgICAgLy8gRklYTUUgdGhpcyBvbmx5IHdvcmtzIGlmIHdpZHRoIGlzIG11bHRpcGxlIG9mIDQKKyAgICB1aW50MzJfdCAqaW5ZVlVfNCA9ICh1aW50MzJfdCAqKSAoaW5ZVlUgKyBvdXRZc2l6ZSk7CisgICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW5ZVlVfNCsrOworICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKKyAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOworCisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgKm91dENiKysgPSB0ZW1wVTsKKyAgICAgICAgICAgICpvdXRDcisrID0gdGVtcFY7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50OjpDb252ZXJ0UkdCMzJUb1BsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAorICAgICAgICBib29sIGJncikgeworICAgIENIRUNLKCh3aWR0aCAmIDEpID09IDApOworICAgIENIRUNLKChoZWlnaHQgJiAxKSA9PSAwKTsKKworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RZICsgZHN0U3RyaWRlICogZHN0VlN0cmlkZTsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0VSArIChkc3RTdHJpZGUgPj4gMSkgKiAoZHN0VlN0cmlkZSA+PiAxKTsKKworI2lmZGVmIFNVUkZBQ0VfSVNfQkdSMzIKKyAgICBiZ3IgPSAhYmdyOworI2VuZGlmCisKKyAgICBjb25zdCBzaXplX3QgcmVkT2Zmc2V0ICAgPSBiZ3IgPyAyIDogMDsKKyAgICBjb25zdCBzaXplX3QgZ3JlZW5PZmZzZXQgPSAxOworICAgIGNvbnN0IHNpemVfdCBibHVlT2Zmc2V0ICA9IGJnciA/IDAgOiAyOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHJlZCAgID0gc3JjW3JlZE9mZnNldF07CisgICAgICAgICAgICB1bnNpZ25lZCBncmVlbiA9IHNyY1tncmVlbk9mZnNldF07CisgICAgICAgICAgICB1bnNpZ25lZCBibHVlICA9IHNyY1tibHVlT2Zmc2V0XTsKKworICAgICAgICAgICAgLy8gdXNpbmcgSVRVLVIgQlQuNjAxIGNvbnZlcnNpb24gbWF0cml4CisgICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KKyAgICAgICAgICAgICAgICAoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTY7CisKKyAgICAgICAgICAgIGRzdFlbeF0gPSBsdW1hOworCisgICAgICAgICAgICBpZiAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFUgPQorICAgICAgICAgICAgICAgICAgICAoKC1yZWQgKiAzOCAtIGdyZWVuICogNzQgKyBibHVlICogMTEyKSA+PiA4KSArIDEyODsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQorICAgICAgICAgICAgICAgICAgICAoKHJlZCAqIDExMiAtIGdyZWVuICogOTQgLSBibHVlICogMTgpID4+IDgpICsgMTI4OworCisgICAgICAgICAgICAgICAgZHN0VVt4ID4+IDFdID0gVTsKKyAgICAgICAgICAgICAgICBkc3RWW3ggPj4gMV0gPSBWOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICBkc3RVICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgZHN0ViArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNyYyArPSBzcmNTdHJpZGUgLSA0ICogd2lkdGg7CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KK30KKworY29uc3QgdWludDhfdCAqU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6ZXh0cmFjdEdyYXBoaWNCdWZmZXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdCwgc2l6ZV90IGRzdFNpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IHNyY1NpemUsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgY29uc3QgeworICAgIHNpemVfdCBkc3RTdHJpZGUgPSB3aWR0aDsKKyAgICBzaXplX3QgZHN0VlN0cmlkZSA9IGhlaWdodDsKKworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBidWZmZXJUeXBlID0gKihNZXRhZGF0YUJ1ZmZlclR5cGUgKilzcmM7CisgICAgYm9vbCB1c2luZ0dyYXBoaWNCdWZmZXIgPSBidWZmZXJUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyOworICAgIGlmICghdXNpbmdHcmFwaGljQnVmZmVyICYmIGJ1ZmZlclR5cGUgIT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1ldGFkYXRhIHR5cGUgKCVkKSIsIGJ1ZmZlclR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUdyYWxsb2NNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICBDSEVDS19FUSgwLCBod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbUdyYWxsb2NNb2R1bGUpKTsKKyAgICB9CisKKyAgICBjb25zdCBncmFsbG9jX21vZHVsZV90ICpncm1vZHVsZSA9CisgICAgICAgIChjb25zdCBncmFsbG9jX21vZHVsZV90ICopbUdyYWxsb2NNb2R1bGU7CisKKyAgICBidWZmZXJfaGFuZGxlX3QgaGFuZGxlOworICAgIGludCBmb3JtYXQ7CisgICAgc2l6ZV90IHNyY1N0cmlkZTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZTsKKyAgICBpZiAodXNpbmdHcmFwaGljQnVmZmVyKSB7CisgICAgICAgIGlmIChzcmNTaXplIDwgNCArIHNpemVvZihHcmFwaGljQnVmZmVyICopKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIDQgKyBzaXplb2YoR3JhcGhpY0J1ZmZlciAqKSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9ICooR3JhcGhpY0J1ZmZlciAqKikoc3JjICsgNCk7CisgICAgICAgIGhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOworICAgICAgICBmb3JtYXQgPSBidWZmZXItPmZvcm1hdDsKKyAgICAgICAgc3JjU3RyaWRlID0gYnVmZmVyLT5zdHJpZGU7CisgICAgICAgIHNyY1ZTdHJpZGUgPSBidWZmZXItPmhlaWdodDsKKyAgICAgICAgLy8gY29udmVydCBzdHJpZGUgZnJvbSBwaXhlbHMgdG8gYnl0ZXMKKyAgICAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1lWMTIgJiYKKyAgICAgICAgICAgIGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgbmVlZCB0byBzdXBwb3J0IG90aGVyIGZvcm1hdHM/CisgICAgICAgICAgICBzcmNTdHJpZGUgKj0gNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHBhcnQuICBDaGVjayBpZiBhbnlvbmUgdXNlcyB0aGlzLgorCisgICAgICAgIGlmIChzcmNTaXplIDwgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNyYyArIDQpOworICAgICAgICAvLyBhc3N1bWUgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgc3JjIHN0cmlkZSB3aXRob3V0IHRoZSBncmFwaGljIGJ1ZmZlcgorICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKKyAgICAgICAgc3JjU3RyaWRlID0gd2lkdGggKiA0OworICAgICAgICBzcmNWU3RyaWRlID0gaGVpZ2h0OworICAgIH0KKworICAgIHNpemVfdCBuZWVkZWRTaXplID0KKyAgICAgICAgZHN0U3RyaWRlICogZHN0VlN0cmlkZSArICh3aWR0aCA+PiAxKQorICAgICAgICAgICAgICAgICsgKGRzdFN0cmlkZSA+PiAxKSAqICgoZHN0VlN0cmlkZSA+PiAxKSArIChoZWlnaHQgPj4gMSkgLSAxKTsKKyAgICBpZiAoZHN0U2l6ZSA8IG5lZWRlZFNpemUpIHsKKyAgICAgICAgQUxPR0UoImRlc3RpbmF0aW9uIGJ1ZmZlciBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgZHN0U2l6ZSwgbmVlZGVkU2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZvaWQgKmJpdHMgPSBOVUxMOworICAgIHN0cnVjdCBhbmRyb2lkX3ljYmNyIHljYmNyOworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICByZXMgPSBncm1vZHVsZS0+bG9ja195Y2JjcigKKyAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9ORVZFUiwKKyAgICAgICAgICAgICAgICAgMCwgMCwgd2lkdGgsIGhlaWdodCwgJnljYmNyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSBncm1vZHVsZS0+bG9jaygKKyAgICAgICAgICAgICAgICAgZ3Jtb2R1bGUsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9ORVZFUiwKKyAgICAgICAgICAgICAgICAgMCwgMCwgd2lkdGgsIGhlaWdodCwgJmJpdHMpOworICAgIH0KKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbG9jayBpbWFnZSBidWZmZXIgJXAgZm9yIGFjY2VzcyIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOiAgLy8gWUNyQ2IgLyBZVlUgcGxhbmFyCisgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIGZsZXggWVVWCisgICAgICAgICAgICB5Y2Jjci55ID0gYml0czsKKyAgICAgICAgICAgIHljYmNyLmNyID0gKHVpbnQ4X3QgKiliaXRzICsgc3JjU3RyaWRlICogc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIHljYmNyLmNiID0gKHVpbnQ4X3QgKil5Y2Jjci5jciArIChzcmNTdHJpZGUgPj4gMSkgKiAoc3JjVlN0cmlkZSA+PiAxKTsKKyAgICAgICAgICAgIHljYmNyLmNocm9tYV9zdGVwID0gMTsKKyAgICAgICAgICAgIHljYmNyLmNzdHJpZGUgPSBzcmNWU3RyaWRlID4+IDE7CisgICAgICAgICAgICB5Y2Jjci55c3RyaWRlID0gc3JjVlN0cmlkZTsKKyAgICAgICAgICAgIENvbnZlcnRGbGV4WVVWVG9QbGFuYXIoZHN0LCBkc3RTdHJpZGUsIGRzdFZTdHJpZGUsICZ5Y2Jjciwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDogIC8vIFlDckNiIC8gWVZVIHNlbWlwbGFuYXIsIE5WMjEKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZmxleCBZVVYKKyAgICAgICAgICAgIHljYmNyLnkgPSBiaXRzOworICAgICAgICAgICAgeWNiY3IuY3IgPSAodWludDhfdCAqKWJpdHMgKyBzcmNTdHJpZGUgKiBzcmNWU3RyaWRlOworICAgICAgICAgICAgeWNiY3IuY2IgPSAodWludDhfdCAqKXljYmNyLmNyICsgMTsKKyAgICAgICAgICAgIHljYmNyLmNocm9tYV9zdGVwID0gMjsKKyAgICAgICAgICAgIHljYmNyLmNzdHJpZGUgPSBzcmNWU3RyaWRlOworICAgICAgICAgICAgeWNiY3IueXN0cmlkZSA9IHNyY1ZTdHJpZGU7CisgICAgICAgICAgICBDb252ZXJ0RmxleFlVVlRvUGxhbmFyKGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLCAmeWNiY3IsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgorICAgICAgICAgICAgQ29udmVydEZsZXhZVVZUb1BsYW5hcihkc3QsIGRzdFN0cmlkZSwgZHN0VlN0cmlkZSwgJnljYmNyLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgICAgICAgICAgQ29udmVydFJHQjMyVG9QbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0U3RyaWRlLCBkc3RWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJpdHMsIHdpZHRoLCBoZWlnaHQsIHNyY1N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICAgICAgZHN0ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChncm1vZHVsZS0+dW5sb2NrKGdybW9kdWxlLCBoYW5kbGUpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gdW5sb2NrIGltYWdlIGJ1ZmZlciAlcCBmb3IgYWNjZXNzIiwgaGFuZGxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0OworfQorCitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIpIHx8CisgICAgICAgICFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIikpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawppbmRleCAxMDYxYzM5Li40NDdiMjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTEsOCArMTEsMTIgQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiBMT0NBTF9NT0RVTEUgOj0gb214X3Rlc3RzCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKwogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggNGJlZTgwOC4uZjRkZmQ2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk9NWEhhcm5lc3MiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIk9NWEhhcm5lc3MuaCIKQEAgLTI1LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtMjQxLDcgKzI0Myw4IEBACiB9OwogCiBzdGF0aWMgc3A8TWVkaWFFeHRyYWN0b3I+IENyZWF0ZUV4dHJhY3RvckZyb21VUkkoY29uc3QgY2hhciAqdXJpKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSh1cmkpOworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgdXJpKTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ2MCw2ICs0NjMsNyBAQAogICAgICAgICB7ICJhdWRpb19kZWNvZGVyLmFhYyIsICJhdWRpby9tcDRhLWxhdG0iIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIubXAzIiwgImF1ZGlvL21wZWciIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIudm9yYmlzIiwgImF1ZGlvL3ZvcmJpcyIgfSwKKyAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5vcHVzIiwgImF1ZGlvL29wdXMiIH0sCiAgICAgICAgIHsgImF1ZGlvX2RlY29kZXIuZzcxMWFsYXciLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgfSwKICAgICAgICAgeyAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyB9LAogICAgIH07CkBAIC00OTIsNiArNDk2LDcgQEAKICAgICAgICAgeyAiYXVkaW8vbXBlZyIsCiAgICAgICAgICAgImZpbGU6Ly8vc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfQ0JSLm1wMyIgfSwKICAgICAgICAgeyAiYXVkaW8vdm9yYmlzIiwgTlVMTCB9LAorICAgICAgICB7ICJhdWRpby9vcHVzIiwgTlVMTCB9LAogICAgICAgICB7ICJ2aWRlby94LXZuZC5vbjIudnA4IiwKICAgICAgICAgICAiZmlsZTovLy9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJmaWxlOi8vL3NkY2FyZC9NMUYxLUFsYXctQUZzcC53YXYiIH0sCkBAIC03MTEsMTEgKzcxNiwxMSBAQAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXM7CiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZidWZmZXJUaW1lVXMpKTsKICAgICAgICAgICAgIGlmICghQ2xvc2VFbm91Z2goYnVmZmVyVGltZVVzLCBhY3R1YWxTZWVrVGltZVVzKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogQXR0ZW1wdGVkIHNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgKiBBdHRlbXB0ZWQgc2Vla2luZyB0byAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlZWtUaW1lVXMsIHJlcXVlc3RlZFNlZWtUaW1lVXMgLyAxRTYpOwotICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogTmVhcmVzdCBrZXlmcmFtZSBpcyBhdCAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIE5lYXJlc3Qga2V5ZnJhbWUgaXMgYXQgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZWVrVGltZVVzLCBhY3R1YWxTZWVrVGltZVVzIC8gMUU2KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIFJldHVybmVkIGJ1ZmZlciB3YXMgYXQgJWxsZCB1cyAoJS4yZiBzZWNzKVxuXG4iLAorICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICogUmV0dXJuZWQgYnVmZmVyIHdhcyBhdCAlIiBQUklkNjQgIiB1cyAoJS4yZiBzZWNzKVxuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJUaW1lVXMsIGJ1ZmZlclRpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCmluZGV4IGE2ODI1ZWIuLjRiYzY3ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcApAQCAtMTI0LDcgKzEyNCw3IEBACiB9CiAKIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6YWRkU2luZ2xlTkFMVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgQUxPR1YoImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAlZCIsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiYWRkU2luZ2xlTkFMVW5pdCBvZiBzaXplICV6dSIsIGJ1ZmZlci0+c2l6ZSgpKTsKICNpZiAhTE9HX05ERUJVRwogICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICNlbmRpZgpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgQ0hFQ0soKGluZGljYXRvciAmIDB4MWYpID09IDI4KTsKIAogICAgIGlmIChzaXplIDwgMikgewotICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlciAoc2l6ZSA9ICVkKSIsIHNpemUpOworICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlciAoc2l6ZSA9ICV6dSkiLCBzaXplKTsKIAogICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOwogICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOwogICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICVkIiwgdG90YWxDb3VudCk7CisgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICV6dSIsIHRvdGFsQ291bnQpOwogCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwogCkBAIC0yOTQsNyArMjk0LDcgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgewogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwogCi0gICAgICAgIEFMT0dWKCJwaWVjZSAjJWQvJWQiLCBpICsgMSwgdG90YWxDb3VudCk7CisgICAgICAgIEFMT0dWKCJwaWVjZSAjJXp1LyV6dSIsIGkgKyAxLCB0b3RhbENvdW50KTsKICNpZiAhTE9HX05ERUJVRwogICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAjZW5kaWYKQEAgLTMxNyw3ICszMTcsNyBAQAogdm9pZCBBQVZDQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgewogICAgIENIRUNLKCFtTkFMVW5pdHMuZW1wdHkoKSk7CiAKLSAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCVkIG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKKyAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCV6dSBuYWwgdW5pdHMpIiwgbU5BTFVuaXRzLnNpemUoKSk7CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAKaW5kZXggNGM5YmY1Yi4uZGNhNWM4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAKQEAgLTM0LDcgKzM0LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQU1QRUcyVFNBc3NlbWJsZXI6OkFNUEVHMlRTQXNzZW1ibGVyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3QgY2hhciAqZGVzYywgY29uc3QgQVN0cmluZyAmcGFyYW1zKQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3QgY2hhciAqIC8qIGRlc2MgKi8sCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJiAvKiBwYXJhbXMgKi8pCiAgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCiAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggZWVmY2ViYS4uN2ViNjU0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0yNDksMTEgKzI0OSwxNSBAQAogICAgICAgICBtUGFja2V0cy5wdXNoX2JhY2soYnVmZmVyKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDJ1KTsKICAgICAgICAgdW5zaWduZWQgQVVfaGVhZGVyc19sZW5ndGggPSBVMTZfQVQoYnVmZmVyLT5kYXRhKCkpOyAgLy8gaW4gYml0cwogCi0gICAgICAgIENIRUNLX0dFKGJ1ZmZlci0+c2l6ZSgpLCAyICsgKEFVX2hlYWRlcnNfbGVuZ3RoICsgNykgLyA4KTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpIDwgMiArIChBVV9oZWFkZXJzX2xlbmd0aCArIDcpIC8gOCkgeworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KIAogICAgICAgICBMaXN0PEFVSGVhZGVyPiBoZWFkZXJzOwogCkBAIC0zNDIsNyArMzQ2LDkgQEAKICAgICAgICAgICAgICBpdCAhPSBoZWFkZXJzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgICAgICBjb25zdCBBVUhlYWRlciAmaGVhZGVyID0gKml0OwogCi0gICAgICAgICAgICBDSEVDS19MRShvZmZzZXQgKyBoZWFkZXIubVNpemUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA8IG9mZnNldCArIGhlYWRlci5tU2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoaGVhZGVyLm1TaXplKTsKICAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBoZWFkZXIubVNpemUpOwpAQCAtMzUzLDcgKzM1OSwxMCBAQAogICAgICAgICAgICAgbVBhY2tldHMucHVzaF9iYWNrKGFjY2Vzc1VuaXQpOwogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfRVEob2Zmc2V0LCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIGlmIChvZmZzZXQgIT0gYnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJwb3RlbnRpYWxseSBtYWxmb3JtZWQgcGFja2V0IChvZmZzZXQgJWQsIHNpemUgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOwpAQCAtMzY1LDcgKzM3NCw3IEBACiB2b2lkIEFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CiAgICAgQ0hFQ0soIW1QYWNrZXRzLmVtcHR5KCkpOwogCi0gICAgQUxPR1YoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglZCBuYWwgdW5pdHMpIiwgbVBhY2tldHMuc2l6ZSgpKTsKKyAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCV6dSBuYWwgdW5pdHMpIiwgbVBhY2tldHMuc2l6ZSgpKTsKIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CiAKQEAgLTQwMCw2ICs0MDksNyBAQAogICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CiAgICAgQXNzZW1ibHlTdGF0dXMgc3RhdHVzID0gYWRkUGFja2V0KHNvdXJjZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBNQUxGT1JNRURfUEFDS0VUKSB7CisgICAgICAgIEFMT0dJKCJhY2Nlc3MgdW5pdCBpcyBkYW1hZ2VkIik7CiAgICAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCA0NjJjMzg0Li4wOWY1MmJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJBUmF3QXVkaW9Bc3NlbWJsZXIuaCIKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCiAKLSNpbmNsdWRlICJhdmNfdXRpbHMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAppbmRleCBhZjM2OWI1Li4zNzJmYmU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtNTYzLDcgKzU2Myw3IEBACiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlVua25vd24gUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggMGQwNzA0My4uNzkzZDExNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICByZXR1cm4gKG1GbGFncyAmIGtGbGFnRU9TKSAhPSAwOwogfQogCi1zdGF0dXNfdCBBUlRQV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CitzdGF0dXNfdCBBUlRQV3JpdGVyOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICB9CiAKICAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCkgewotICAgICAgICBBTE9HVigicmVhZCBidWZmZXIgb2Ygc2l6ZSAlZCIsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIEFMT0dWKCJyZWFkIGJ1ZmZlciBvZiBzaXplICV6dSIsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSk7CiAKICAgICAgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKICAgICAgICAgICAgIFN0cmlwU3RhcnRjb2RlKG1lZGlhQnVmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCBlZmRlN2E5Li5mMjU1MzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yMzksNyArMjM5LDcgQEAKICAgICAgICAgLy8gcmlnaHQgaGVyZSwgc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGFza2luZyB0aGUgdXNlcgogICAgICAgICAvLyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KIAotICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIHJ0c3AgdXJsICVzIiwgdXJsLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIHJ0c3AgdXJsICVzIiwgdXJpRGVidWdTdHJpbmcodXJsKS5jX3N0cigpKTsKIAogICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIEVSUk9SX01BTEZPUk1FRCk7CiAgICAgICAgIHJlcGx5LT5wb3N0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSYXdBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggMGRhNWRkMi4uMTY3ZjdhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUmF3QXVkaW9Bc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJhd0F1ZGlvQXNzZW1ibGVyLmNwcApAQCAtMzQsNyArMzQsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBUmF3QXVkaW9Bc3NlbWJsZXI6OkFSYXdBdWRpb0Fzc2VtYmxlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IGNoYXIgKmRlc2MsIGNvbnN0IEFTdHJpbmcgJnBhcmFtcykKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IGNoYXIgKiAvKiBkZXNjICovLAorICAgICAgICBjb25zdCBBU3RyaW5nICYgLyogcGFyYW1zICovKQogICAgIDogbU5vdGlmeU1zZyhub3RpZnkpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IGU4Y2M1ZTEuLjQ3NTczYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMzIzLDYgKzMyMywxMSBAQAogCiAgICAgcyA9IGVuZCArIDE7ICAvLyBza2lwIHRoZSBkYXNoLgogCisgICAgaWYgKCpzID09ICdcMCcpIHsKKyAgICAgICAgKm5wdDIgPSBGTFRfTUFYOyAgLy8gb3BlbiBlbmRlZC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgaWYgKCFzdHJuY21wKCJub3ciLCBzLCAzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBhYnNvbHV0ZSBlbmQgdGltZSBhdmFpbGFibGUKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKaW5kZXggZTc3YzY5Yy4uZDYwZGMyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpAQCAtMjAsNyArMjAsNyBAQAogICAgICAgICBTRFBMb2FkZXIuY3BwICAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAotCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKIAkkKFRPUCkvZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiAKQEAgLTMwLDYgKzMwLDEwIEBACiAgICAgTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tcHNhYmkKIGVuZGlmCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5taworCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC01NSw0ICs1OSw2IEBACiAKIExPQ0FMX01PRFVMRTo9IHJ0cF90ZXN0CiAKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoTE9DQUxfUEFUSCkvQW5kcm9pZC5taworCiAjIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggY2Q3N2FhMC4uNDIzYTQyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC0xOSw3ICsxOSwxMSBAQAogI2RlZmluZSBNWV9IQU5ETEVSX0hfCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2lmbmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIk15SGFuZGxlciIKKyNlbmRpZgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCkBAIC00Miw2ICs0NiwxMiBAQAogCiAjaW5jbHVkZSAiSFRUUEJhc2UuaCIKIAorI2lmIExPR19OREVCVUcKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCisjZW5kaWYKKwogLy8gSWYgbm8gYWNjZXNzIHVuaXRzIGFyZSByZWNlaXZlZCB3aXRoaW4gNSBzZWNzLCBhc3N1bWUgdGhhdCB0aGUgcnRwCiAvLyBzdHJlYW0gaGFzIGVuZGVkIGFuZCBzaWduYWwgZW5kIG9mIHN0cmVhbS4KIHN0YXRpYyBpbnQ2NF90IGtBY2Nlc3NVbml0VGltZW91dFVzID0gMTAwMDAwMDBsbDsKQEAgLTE0OSw3ICsxNTksNyBAQAogICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKFN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CiAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgIEFMT0dJKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKICAgICAgICAgfQogCiAgICAgICAgIG1TZXNzaW9uSG9zdCA9IGhvc3Q7CkBAIC0xNzgsNyArMTg4LDcgQEAKICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgfQogCi0gICAgQVN0cmluZyBnZXRDb250cm9sVVJMKHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IGRlc2MpIHsKKyAgICBBU3RyaW5nIGdldENvbnRyb2xVUkwoKSB7CiAgICAgICAgIEFTdHJpbmcgc2Vzc2lvbkxldmVsQ29udHJvbFVSTDsKICAgICAgICAgaWYgKG1TZXNzaW9uRGVzYy0+ZmluZEF0dHJpYnV0ZSgKICAgICAgICAgICAgICAgICAwLApAQCAtMjQ0LDcgKzI1NCw5IEBACiAgICAgc3RhdGljIHZvaWQgYWRkU0RFUyhpbnQgcywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKICAgICAgICAgc29ja2xlbl90IGFkZHJTaXplID0gc2l6ZW9mKGFkZHIpOwotICAgICAgICBDSEVDS19FUSgwLCBnZXRzb2NrbmFtZShzLCAoc29ja2FkZHIgKikmYWRkciwgJmFkZHJTaXplKSk7CisgICAgICAgIGlmIChnZXRzb2NrbmFtZShzLCAoc29ja2FkZHIgKikmYWRkciwgJmFkZHJTaXplKSAhPSAwKSB7CisgICAgICAgICAgICBpbmV0X2F0b24oIjAuMC4wLjAiLCAmKGFkZHIuc2luX2FkZHIpKTsKKyAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CkBAIC00NzgsMjEgKzQ5MCwzMiBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA9PSAzMDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA9PSAzMDEgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImxvY2F0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFNlc3Npb25VUkwgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMID0gbU9yaWdpbmFsU2Vzc2lvblVSTDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9ICJERVNDUklCRSAiOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcFxyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBhbnkgYXV0aGVudGljYXRpb24gaW5mbyBmcm9tIHRoZSBzZXNzaW9uIHVybCwgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gdHJhbnNtaXQgdXNlci9wYXNzIGluIGNsZWFydGV4dC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgaG9zdCwgcGF0aCwgdXNlciwgcGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBvcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQVJUU1BDb25uZWN0aW9uOjpQYXJzZVVSTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmNfc3RyKCksICZob3N0LCAmcG9ydCwgJnBhdGgsICZ1c2VyLCAmcGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoInJ0c3A6Ly8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoaG9zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKFN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKHBhdGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rlc2MnLCBpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC01NDUsNyArNTY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhc2VVUkwgPSB0bXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xVUkwgPSBnZXRDb250cm9sVVJMKG1TZXNzaW9uRGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xVUkwgPSBnZXRDb250cm9sVVJMKCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGFjdHVhbCB0cmFja3MgaW4gdGhpcyBzZXNzaW9uLgpAQCAtNTkxLDcgKzYxNCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrYWJsZSA9ICFpc0xpdmVTdHJlYW0obVNlc3Npb25EZXNjKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xVUkwgPSBnZXRDb250cm9sVVJMKG1TZXNzaW9uRGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbFVSTCA9IGdldENvbnRyb2xVUkwoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKSA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIGFjdHVhbCB0cmFja3MgaW4gdGhpcyBzZXNzaW9uLgpAQCAtMTgwNSw2ICsxODI4LDggQEAKICAgICBib29sIGFkZE1lZGlhVGltZXN0YW1wKAogICAgICAgICAgICAgaW50MzJfdCB0cmFja0luZGV4LCBjb25zdCBUcmFja0luZm8gKnRyYWNrLAogICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICAgICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHRyYWNrSW5kZXgpOworCiAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CiAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZWQzZmE3ZS4uNDI0YmFkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMTgsMzQgKzE4LDMwIEBACiAjZGVmaW5lIExPR19UQUcgIlNEUExvYWRlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgIlNEUExvYWRlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvU0RQTG9hZGVyLmgiCiAKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNkZWZpbmUgREVGQVVMVF9TRFBfU0laRSAxMDAwMDAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1TRFBMb2FkZXI6OlNEUExvYWRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWludDMyX3QgZmxhZ3MsIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCkKK1NEUExvYWRlcjo6U0RQTG9hZGVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbVVJRFZhbGlkKHVpZFZhbGlkKSwKLSAgICAgIG1VSUQodWlkKSwKICAgICAgIG1OZXRMb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUNhbmNlbGxlZChmYWxzZSksCi0gICAgICBtSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgIEhUVFBCYXNlOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pCi0gICAgICAgICAgICAgICAgICAgID8gSFRUUEJhc2U6OmtGbGFnSW5jb2duaXRvCi0gICAgICAgICAgICAgICAgICAgIDogMCkpIHsKLSAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIG1IVFRQRGF0YVNvdXJjZS0+c2V0VUlEKG1VSUQpOwotICAgIH0KLQorICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgewogICAgIG1OZXRMb29wZXItPnNldE5hbWUoInNkcCBuZXQiKTsKICAgICBtTmV0TG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCkBAIC05NCwxMSArOTAsNyBAQAogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTDsKICAgICBtc2ctPmZpbmRQb2ludGVyKCJoZWFkZXJzIiwgKHZvaWQgKiopJmhlYWRlcnMpOwogCi0gICAgaWYgKCEobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pKSB7Ci0gICAgICAgIEFMT0dJKCJvbkxvYWQgJyVzJyIsIHVybC5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgib25Mb2FkIDxVUkwgc3VwcHJlc3NlZD4iKTsKLSAgICB9CisgICAgQUxPR1YoIm9uTG9hZCAlcyIsIHVyaURlYnVnU3RyaW5nKHVybCwgbUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pLmNfc3RyKCkpOwogCiAgICAgaWYgKCFtQ2FuY2VsbGVkKSB7CiAgICAgICAgIGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCh1cmwuY19zdHIoKSwgaGVhZGVycyk7CkBAIC0xMzAsNyArMTIyLDcgQEAKICAgICAgICAgc3NpemVfdCByZWFkU2l6ZSA9IG1IVFRQRGF0YVNvdXJjZS0+cmVhZEF0KDAsIGJ1ZmZlci0+ZGF0YSgpLCBzZHBTaXplKTsKIAogICAgICAgICBpZiAocmVhZFNpemUgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgU0RQLCBlcnJvciBjb2RlID0gJWxkIiwgcmVhZFNpemUpOworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIFNEUCwgZXJyb3IgY29kZSA9ICV6dSIsIHJlYWRTaXplKTsKICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZXNjID0gbmV3IEFTZXNzaW9uRGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawppbmRleCAwNmNlMTZiLi45OWI0ODBhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCkBAIC05LDcgKzksNyBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgXAorCVN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBcCiAJRHVtbXlSZWNvcmRlci5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTMzLDE4ICszMyw1NSBAQAogCWxpYmd0ZXN0X21haW4gXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBiaW9uaWMgXAotICAgIGJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwliaW9uaWMgXAorCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCisJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitlbmRpZgorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gVXRpbHNfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVV0aWxzX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKwlsaWJsb2cgXAorCWxpYm1lZGlhIFwKKwlsaWJzdGFnZWZyaWdodCBcCisJbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisJbGlic3RhZ2VmcmlnaHRfb214IFwKKwlsaWJzdGxwb3J0IFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisJbGliZ3Rlc3QgXAorCWxpYmd0ZXN0X21haW4gXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwliaW9uaWMgXAorCWJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCisJZXh0ZXJuYWwvZ3Rlc3QvaW5jbHVkZSBcCisJZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKKwlmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCi1lbmRpZgotCiAjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcAppbmRleCBhYzM3YjI4Li44ZjE3MDg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcApAQCAtNjEsNyArNjEsNyBAQAogICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKLSAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKIAogICAgIEFMT0dWKCJFbmRpbmcgdGhlIHJlYWRpbmcgdGhyZWFkIik7CiAgICAgcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcAppbmRleCA0OWZmY2Q2Li5mZDg4OWY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KQEAgLTExMCw3ICsxMDksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5vIGFjdHVhbCBkaXNwbGF5LiBDaG9vc2luZyBFR0xTdXJmYWNlIGJhc2VkIG9uIFN1cmZhY2VNZWRpYVNvdXJjZSIpOwogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gc21zID0gKG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIGdldFN1cmZhY2VXaWR0aCgpLCBnZXRTdXJmYWNlSGVpZ2h0KCkpKS0+Z2V0QnVmZmVyUXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSkpLT5nZXRQcm9kdWNlcigpOwogICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3RjID0gbmV3IFN1cmZhY2Uoc21zKTsKICAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdyA9IHN0YzsKIApAQCAtMzYxLDkgKzM2MCw3IEBACiAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewogICAgICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0KLSAgICAgICAgLy8gTWFudWFsIGNhc3QgaXMgcmVxdWlyZWQgdG8gYXZvaWQgY29uc3RydWN0b3IgYW1iaWd1aXR5Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShzdGF0aWNfY2FzdDxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+KCBtU01TLT5nZXRCdWZmZXJRdWV1ZSgpKSk7CisgICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICAgICAgbUFOVyA9IG1TVEM7CiAgICAgfQogCkBAIC0zOTgsNyArMzk1LDcgQEAKICAgICAgICAgQUxPR1YoIlNNUy1HTFRlc3Q6OlNldFVwKCkiKTsKICAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2Uoc3RhdGljX2Nhc3Q8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiggbVNNUy0+Z2V0QnVmZmVyUXVldWUoKSkpOworICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7CiAgICAgICAgIG1BTlcgPSBtU1RDOwogCiAgICAgICAgIC8vIERvaW5nIHRoZSBzZXR1cCByZWxhdGVkIHRvIHRoZSBHTCBTaWRlCkBAIC01MjcsNyArNTI0LDggQEAKIH0KIAogLy8gRGVxdWV1aW5nIGFuZCBxdWV1aW5nIHRoZSBidWZmZXIgd2l0aG91dCByZWFsbHkgZmlsbGluZyBpdCBpbi4KLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlVGVzdDo6b25lQnVmZmVyUGFzc05vRmlsbChpbnQgd2lkdGgsIGludCBoZWlnaHQgKSB7Cit2b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6Om9uZUJ1ZmZlclBhc3NOb0ZpbGwoCisgICAgICAgIGludCAvKiB3aWR0aCAqLywgaW50IC8qIGhlaWdodCAgKi8pIHsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKICAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7CkBAIC03NDYsOSArNzQ0LDggQEAKICAgICBDSEVDSyhmZCA+PSAwKTsKIAogICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcE1lZGlhUmVjb3JkZXIoZmQsCi0gICAgICAgICAgICBWSURFT19TT1VSQ0VfR1JBTExPQ19CVUZGRVIsCi0gICAgICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LCBtWXV2VGV4V2lkdGgsCi0gICAgICAgICAgICBtWXV2VGV4SGVpZ2h0LCAzMCk7CisgICAgICAgICAgICBWSURFT19TT1VSQ0VfU1VSRkFDRSwgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwKKyAgICAgICAgICAgIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogICAgIC8vIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgbGl2aW5nIGluCiAgICAgLy8gbWVkaWFzZXJ2ZXIgdGhhdCBpcyBjcmVhdGVkIGJ5IHN0YWdlZnJpZ2h0cmVjb3JkZXIKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpU1QgPSBtci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKQEAgLTc4Myw3ICs3ODAsNyBAQAogICAgIEFMT0dWKCJWZXJpZnkgY3JlYXRpbmcgYSBzdXJmYWNlIHcvIHJpZ2h0IGNvbmZpZyArIGR1bW15IHdyaXRlcioqKioqKioqKiIpOwogCiAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2Uoc3RhdGljX2Nhc3Q8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiggbVNNUy0+Z2V0QnVmZmVyUXVldWUoKSkpOworICAgIG1TVEMgPSBuZXcgU3VyZmFjZShtU01TLT5nZXRQcm9kdWNlcigpKTsKICAgICBtQU5XID0gbVNUQzsKIAogICAgIER1bW15UmVjb3JkZXIgd3JpdGVyKG1TTVMpOwpAQCAtODgwLDcgKzg3Nyw3IEBACiAgICAgfQogICAgIENIRUNLKGZkID49IDApOwogCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9HUkFMTE9DX0JVRkZFUiwKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX1NVUkZBQ0UsCiAgICAgICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LCBtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQsIDMwKTsKIAogICAgIC8vIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdXJmYWNlbWVkaWFzb3VyY2UgbGl2aW5nIGluCkBAIC05MjMsNyArOTIwLDcgQEAKICAgICB9CiAgICAgQ0hFQ0soZmQgPj0gMCk7CiAKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IHNldFVwTWVkaWFSZWNvcmRlcihmZCwgVklERU9fU09VUkNFX0dSQUxMT0NfQlVGRkVSLAorICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKICAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwogCiAgICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1V0aWxzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKaW5kZXggMjJjNGE3My4uMWMxM2YxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTMyLDcgKzMyLDY0IEBACiBjbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKIH07CiAKK1RFU1RfRihVdGlsc1Rlc3QsIFRlc3RGb3VyQ0MpIHsKKyAgICBBU1NFUlRfRVEoRk9VUkNDKCdzJywgJ3QnLCAnbScgLCAndScpLCAnc3RtdScpOworfQorCiBURVNUX0YoVXRpbHNUZXN0LCBUZXN0TWF0aFRlbXBsYXRlcykgeworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTAsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMSwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEyLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTMsIC00KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xNCwgLTQpLCA0KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMCwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDExLCAtNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoMTIsIC00KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMywgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKDE0LCAtNCksIC00KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTAsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xMSwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2Um91bmQoLTEyLCA0KSwgLTMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgtMTMsIDQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlJvdW5kKC0xNCwgNCksIC00KTsKKworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMCwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMSwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMiwgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxMywgNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZSb3VuZCgxNCwgNCksIDQpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMSwgLTQpLCAzKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEyLCAtNCksIDMpOworICAgIEFTU0VSVF9FUShkaXZVcCgtMTMsIC00KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoZGl2VXAoMTEsIC00KSwgLTIpOworICAgIEFTU0VSVF9FUShkaXZVcCgxMiwgLTQpLCAtMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEzLCAtNCksIC0zKTsKKworICAgIEFTU0VSVF9FUShkaXZVcCgtMTEsIDQpLCAtMik7CisgICAgQVNTRVJUX0VRKGRpdlVwKC0xMiwgNCksIC0zKTsKKyAgICBBU1NFUlRfRVEoZGl2VXAoLTEzLCA0KSwgLTMpOworCisgICAgQVNTRVJUX0VRKGRpdlVwKDExLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEyLCA0KSwgMyk7CisgICAgQVNTRVJUX0VRKGRpdlVwKDEzLCA0KSwgNCk7CisKKyAgICBBU1NFUlRfRVEoYWJzKDVMKSwgNUwpOworICAgIEFTU0VSVF9FUShhYnMoLTI1KSwgMjUpOworCisgICAgQVNTRVJUX0VRKG1pbig1LjZmLCA2LjBmKSwgNS42Zik7CisgICAgQVNTRVJUX0VRKG1pbig2LjBmLCA1LjZmKSwgNS42Zik7CisgICAgQVNTRVJUX0VRKG1pbigtNC4zLCA4LjYpLCAtNC4zKTsKKyAgICBBU1NFUlRfRVEobWluKDguNiwgLTQuMyksIC00LjMpOworCisgICAgQVNTRVJUX0VRKG1heCg1LjZmLCA2LjBmKSwgNi4wZik7CisgICAgQVNTRVJUX0VRKG1heCg2LjBmLCA1LjZmKSwgNi4wZik7CisgICAgQVNTRVJUX0VRKG1heCgtNC4zLCA4LjYpLCA4LjYpOworICAgIEFTU0VSVF9FUShtYXgoOC42LCAtNC4zKSwgOC42KTsKKwogICAgIEFTU0VSVF9GQUxTRShpc0luUmFuZ2UoLTQzLCA4NnUsIC00NCkpOwogICAgIEFTU0VSVF9UUlVFKGlzSW5SYW5nZSgtNDMsIDg3dSwgLTQzKSk7CiAgICAgQVNTRVJUX1RSVUUoaXNJblJhbmdlKC00MywgODh1LCAtMSkpOwpAQCAtMTEzLDYgKzE3MCwxMyBAQAogICAgIEFTU0VSVF9GQUxTRShpc0luUmFuZ2UoNDN1LCA5MXUsIDEzNHUsIH42dSkpOwogICAgIEFTU0VSVF9GQUxTRShpc0luUmFuZ2UoNDN1LCA5MnUsIDEzNnUsIDB1KSk7CiAgICAgQVNTRVJUX0ZBTFNFKGlzSW5SYW5nZSg0M3UsIDkydSwgMTM2dSwgMXUpKTsKKworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKDEyNCwgMTAwKSwgMjQpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKDI4OCwgMTAwKSwgMTIpOworICAgIEFTU0VSVF9FUShwZXJpb2RpY0Vycm9yKC0zNDUsIDEwMCksIDQ1KTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNDkzLCAxMDApLCA3KTsKKyAgICBBU1NFUlRfRVEocGVyaW9kaWNFcnJvcigtNTUwLCAxMDApLCA1MCk7CisgICAgQVNTRVJUX0VRKHBlcmlvZGljRXJyb3IoLTYwMCwgMTAwKSwgMCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKaW5kZXggZjA5OWJiZC4uNmE4YjlmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsKQEAgLTksNyArOSw4IEBACiAgICAgICAgIFRpbWVkVGV4dFNSVFNvdXJjZS5jcHAgICAgXAogICAgICAgICBUaW1lZFRleHRQbGF5ZXIuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKKwogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC90aW1lZHRleHQgXAogICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dERyaXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcAppbmRleCAxMmZkN2Y0Li43MWFhMjFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0RHJpdmVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CkBAIC00MCw5ICs0MSwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBUaW1lZFRleHREcml2ZXI6OlRpbWVkVGV4dERyaXZlcigKLSAgICAgICAgY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpCisgICAgICAgIGNvbnN0IHdwPE1lZGlhUGxheWVyQmFzZT4gJmxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKICAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSwKICAgICAgIG1DdXJyZW50VHJhY2tJbmRleChVSU5UX01BWCkgewogICAgIG1Mb29wZXItPnNldE5hbWUoIlRpbWVkVGV4dERyaXZlciIpOwpAQCAtMjA3LDcgKzIxMCw3IEBACiAgICAgfQogCiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKHVyaSk7CisgICAgICAgICAgICBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1IVFRQU2VydmljZSwgdXJpKTsKICAgICByZXR1cm4gY3JlYXRlT3V0T2ZCYW5kVGV4dFNvdXJjZSh0cmFja0luZGV4LCBtaW1lVHlwZSwgZGF0YVNvdXJjZSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKaW5kZXggOWZiMGFmZS4uYTA3MDQ4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiVGltZWRUZXh0UGxheWVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI3MSw3ICsyNzIsNyBAQAogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogICAgIGlmIChsaXN0ZW5lciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRPRE86IGl0IG1heSBiZSBiZXR0ZXIgdG8gcmV0dXJuIGtJbnZhbGlkVGltZVVzCi0gICAgICAgIEFMT0dFKCIlczogTGlzdGVuZXIgaXMgTlVMTC4gKGZpcmVUaW1lVXMgPSAlbGxkKSIsCisgICAgICAgIEFMT0dFKCIlczogTGlzdGVuZXIgaXMgTlVMTC4gKGZpcmVUaW1lVXMgPSAlIiBQUklkNjQiICkiLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZpcmVUaW1lVXMpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGltZWRUZXh0U291cmNlLmgKaW5kZXggNzU2Y2MzMS4uOGMxYzFjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRTb3VyY2UuaApAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICAgIGludDY0X3QgKmVuZFRpbWVVcywKICAgICAgICAgICBQYXJjZWwgKnBhcmNlbCwKICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7Ci0gIHZpcnR1YWwgc3RhdHVzX3QgZXh0cmFjdEdsb2JhbERlc2NyaXB0aW9ucyhQYXJjZWwgKnBhcmNlbCkgeworICB2aXJ0dWFsIHN0YXR1c190IGV4dHJhY3RHbG9iYWxEZXNjcmlwdGlvbnMoUGFyY2VsICogLyogcGFyY2VsICovKSB7CiAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgIH0KICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawppbmRleCBhNWU3YmEyLi45YTlmZGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKQEAgLTIsNyArMiw2IEBACiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBVbml0IHRlc3RzIGZvciBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQKLSMgU2VlIGFsc28gL2RldmVsb3BtZW50L3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTgsMTAgKzE3LDEzIEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QKS9leHRlcm5hbC9leHBhdC9saWIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CisgICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0CiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmJpbmRlciBcCiAgICAgbGliZXhwYXQgXAotICAgIGxpYnN0YWdlZnJpZ2h0CisgICAgbGlic3RhZ2VmcmlnaHQgXAorICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgIGxpYnV0aWxzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgxNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NQUEZMQUdTICs9IC1EX19TVERJTlRfTElNSVRTIFwKKyAgICAgICAgICAgICAgICAgIC1XZXJyb3IKKworTE9DQUxfU1JDX0ZJTEVTOj0gRWJtbFV0aWwuY3BwICAgICAgICBcCisgICAgICAgICAgICAgICAgICBXZWJtRWxlbWVudC5jcHAgICAgIFwKKyAgICAgICAgICAgICAgICAgIFdlYm1GcmFtZS5jcHAgICAgICAgXAorICAgICAgICAgICAgICAgICAgV2VibUZyYW1lVGhyZWFkLmNwcCBcCisgICAgICAgICAgICAgICAgICBXZWJtV3JpdGVyLmNwcAorCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnV0aWxzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlibG9nCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3dlYm0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlmZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9FYm1sVXRpbC5jcHAKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB7CisKKy8vIFRhYmxlIGZvciBTZWFsJ3MgYWxnb3JpdGhtIGZvciBOdW1iZXIgb2YgVHJhaWxpbmcgWmVyb3MuIEhhY2tlcidzIERlbGlnaHQKKy8vIG9ubGluZSwgRmlndXJlIDUtMTggKGh0dHA6Ly93d3cuaGFja2Vyc2RlbGlnaHQub3JnL3JldmlzaW9ucy5wZGYpCisvLyBUaGUgZW50cmllcyB3aG9zZSB2YWx1ZSBpcyAtMSBhcmUgbmV2ZXIgcmVmZXJlbmNlZC4KK2ludCBOVFpfVEFCTEVbXSA9IHsKKyAgICAzMiwgIDAsICAxLCAxMiwgIDIsICA2LCAtMSwgMTMsICAgMywgLTEsICA3LCAtMSwgLTEsIC0xLCAtMSwgMTQsCisgICAgMTAsICA0LCAtMSwgLTEsICA4LCAtMSwgLTEsIDI1LCAgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMSwgMjcsIDE1LAorICAgIDMxLCAxMSwgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgICA5LCAtMSwgLTEsIDI0LCAtMSwgLTEsIDIwLCAyNiwKKyAgICAzMCwgLTEsIC0xLCAtMSwgLTEsIDIzLCAtMSwgMTksICAyOSwgLTEsIDIyLCAxOCwgMjgsIDE3LCAxNiwgLTEKK307CisKK2ludCBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMihpbnQzMl90IGkpIHsKKyAgICB1aW50MzJfdCB1ID0gKGkgJiAtaSkgKiAweDA0NTBGQkFGOworICAgIHJldHVybiBOVFpfVEFCTEVbKHUpID4+IDI2XTsKK30KKwordWludDY0X3QgaGlnaGVzdE9uZUJpdCh1aW50NjRfdCBuKSB7CisgICAgbiB8PSAobiA+PiAxKTsKKyAgICBuIHw9IChuID4+IDIpOworICAgIG4gfD0gKG4gPj4gNCk7CisgICAgbiB8PSAobiA+PiA4KTsKKyAgICBuIHw9IChuID4+IDE2KTsKKyAgICBuIHw9IChuID4+IDMyKTsKKyAgICByZXR1cm4gbiAtIChuID4+IDEpOworfQorCit1aW50NjRfdCBfcG93ZXJPZjIodWludDY0X3QgdSkgeworICAgIHVpbnQ2NF90IHBvd2VyT2YyID0gaGlnaGVzdE9uZUJpdCh1KTsKKyAgICByZXR1cm4gcG93ZXJPZjIgPyBwb3dlck9mMiA6IDE7Cit9CisKKy8vIEJhc2VkIG9uIExvbmcubnVtYmVyT2ZUcmFpbGluZ1plcm9zIGluIExvbmcuamF2YQoraW50IG51bWJlck9mVHJhaWxpbmdaZXJvcyh1aW50NjRfdCB1KSB7CisgICAgaW50MzJfdCBsb3cgPSB1OworICAgIHJldHVybiBsb3cgIT0wID8gbnVtYmVyT2ZUcmFpbGluZ1plcm9zMzIobG93KQorICAgICAgICAgICAgICAgICAgIDogMzIgKyBudW1iZXJPZlRyYWlsaW5nWmVyb3MzMigoaW50MzJfdCkgKHUgPj4gMzIpKTsKK30KK30KKworbmFtZXNwYWNlIHdlYm0geworCisvLyBFbmNvZGUgdGhlIGlkIGFuZC9vciBzaXplIG9mIGFuIEVCTUwgZWxlbWVudCBieXRlcyBieSBzZXR0aW5nIGEgbGVhZGluZyBsZW5ndGggZGVzY3JpcHRvciBiaXQ6CisvLworLy8gICAxeHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDEtYnl0ZSB2YWx1ZXMKKy8vICAgMDF4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDF4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDF4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gLi4uCisvLyAgIDAwMDAxeHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAxeHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAwMDAxeCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAtCisvLyAgIDAwMDAwMDAxIHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IC0gOC1ieXRlIHZhbHVlcworLy8KKy8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyBwb3NzaWJsZS4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpZiAodSArIDEgPT0gcG93ZXJPZjIgPDwgMSkKKyAgICAgICAgcG93ZXJPZjIgPDw9IDE7CisgICAgaW50IHNoaWZ0V2lkdGggPSAoNyArIG51bWJlck9mVHJhaWxpbmdaZXJvcyhwb3dlck9mMikpIC8gNyAqIDc7CisgICAgbG9uZyBsZW5ndGhEZXNjcmlwdG9yID0gMSA8PCBzaGlmdFdpZHRoOworICAgIHJldHVybiBsZW5ndGhEZXNjcmlwdG9yIHwgdTsKK30KKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCkgeworICAgIGludCBzaGlmdFdpZHRoID0gNyAqIHdpZHRoOworICAgIHVpbnQ2NF90IGxlbmd0aERlc2NyaXB0b3IgPSAxOworICAgIGxlbmd0aERlc2NyaXB0b3IgPDw9IHNoaWZ0V2lkdGg7CisgICAgcmV0dXJuIGxlbmd0aERlc2NyaXB0b3IgfCB1OworfQorCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpIHsKKyAgICB1aW50NjRfdCBwb3dlck9mMiA9IF9wb3dlck9mMih1KTsKKyAgICBpbnQgdW5zaWduZWRMZW5ndGggPSBudW1iZXJPZlRyYWlsaW5nWmVyb3MocG93ZXJPZjIpIC8gOCArIDE7CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCisvLyBTZXJpYWxpemUgYW4gRUJNTCBjb2RlZCBpZCBvciBzaXplIGluIGJpZy1lbmRpYW4gb3JkZXIuCitpbnQgc2VyaWFsaXplQ29kZWRVbnNpZ25lZCh1aW50NjRfdCB1LCB1aW50OF90KiBiYXJ5KSB7CisgICAgaW50IHVuc2lnbmVkTGVuZ3RoID0gc2l6ZU9mKHUpOworICAgIGZvciAoaW50IGkgPSB1bnNpZ25lZExlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGJhcnlbaV0gPSB1ICYgMHhmZjsKKyAgICAgICAgdSA+Pj0gODsKKyAgICB9CisgICAgcmV0dXJuIHVuc2lnbmVkTGVuZ3RoOworfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0VibWxVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5YzM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vRWJtbFV0aWwuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBFQk1MVVRJTF9IXworI2RlZmluZSBFQk1MVVRJTF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSB3ZWJtIHsKKworLy8gRW5jb2RlIHRoZSBpZCBhbmQvb3Igc2l6ZSBvZiBhbiBFQk1MIGVsZW1lbnQgYnl0ZXMgYnkgc2V0dGluZyBhIGxlYWRpbmcgbGVuZ3RoIGRlc2NyaXB0b3IgYml0OgorLy8KKy8vICAgMXh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxLWJ5dGUgdmFsdWVzCisvLyAgIDAxeHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAxeHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorLy8gICAwMDAxeHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIC4uLgorLy8gICAwMDAwMXh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisvLyAgIDAwMDAwMXh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4ICAgICAgICAgICAgICAgICAgIC0KKy8vICAgMDAwMDAwMXggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggeHh4eHh4eHggICAgICAgICAgLQorLy8gICAwMDAwMDAwMSB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCAtIDgtYnl0ZSB2YWx1ZXMKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGxlYXN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcG9zc2libGUuCit1aW50NjRfdCBlbmNvZGVVbnNpZ25lZCh1aW50NjRfdCB1KTsKKworLy8gTGlrZSBhYm92ZSBidXQgcGFkcyB0aGUgaW5wdXQgdmFsdWUgd2l0aCBsZWFkaW5nIHplcm9zIHVwIHRvIHRoZSBzcGVjaWZpZWQgd2lkdGguIFRoZSBsZW5ndGgKKy8vIGRlc2NyaXB0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aC4KK3VpbnQ2NF90IGVuY29kZVVuc2lnbmVkKHVpbnQ2NF90IHUsIGludCB3aWR0aCk7CisKKy8vIFNlcmlhbGl6ZSBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgaW4gYmlnLWVuZGlhbiBvcmRlci4KK2ludCBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKHVpbnQ2NF90IHUsIHVpbnQ4X3QqIGJhcnkpOworCisvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBFQk1MIGNvZGVkIGlkIG9yIHNpemUgZnJvbSBpdHMgbGVuZ3RoIGRlc2NyaXB0b3IuCitpbnQgc2l6ZU9mKHVpbnQ2NF90IHUpOworCit9CisKKyNlbmRpZiAvKiBFQk1MVVRJTF9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0xpbmtlZEJsb2NraW5nUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZhOWExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9MaW5rZWRCbG9ja2luZ1F1ZXVlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTElOS0VEQkxPQ0tJTkdRVUVVRV9IXworI2RlZmluZSBMSU5LRURCTE9DS0lOR1FVRVVFX0hfCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgTGlua2VkQmxvY2tpbmdRdWV1ZSB7CisgICAgTGlzdDxUPiBtTGlzdDsKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbnRlbnRBdmFpbGFibGVDb25kaXRpb247CisKKyAgICBUIGZyb250KGJvb2wgcmVtb3ZlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgIHdoaWxlIChtTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29udGVudEF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgfQorICAgICAgICBUIGUgPSAqKG1MaXN0LmJlZ2luKCkpOworICAgICAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgICAgICBtTGlzdC5lcmFzZShtTGlzdC5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaW5rZWRCbG9ja2luZ1F1ZXVlKTsKKworcHVibGljOgorICAgIExpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgfkxpbmtlZEJsb2NraW5nUXVldWUoKSB7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1MaXN0LmVtcHR5KCk7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICAgICAgbUxpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICBUIHBlZWsoKSB7CisgICAgICAgIHJldHVybiBmcm9udChmYWxzZSk7CisgICAgfQorCisgICAgVCB0YWtlKCkgeworICAgICAgICByZXR1cm4gZnJvbnQodHJ1ZSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoKFQgZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICBtTGlzdC5wdXNoX2JhY2soZSk7CisgICAgICAgIG1Db250ZW50QXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK307CisKK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KKyNlbmRpZiAvKiBMSU5LRURCTE9DS0lOR1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUNvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2Y0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Db25zdGFudHMuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUNPTlNUQU5UU19IXworI2RlZmluZSBXRUJNQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIHdlYm0geworCitjb25zdCBpbnQga01pbkVibWxWb2lkU2l6ZSA9IDI7Citjb25zdCBpbnQ2NF90IGtNYXhNZXRhU2Vla1NpemUgPSA2NDsKK2NvbnN0IGludDY0X3Qga01rdlVua25vd25MZW5ndGggPSAweDAxZmZmZmZmZmZmZmZmZmZsOworCisvLyBFQk1MIGVsZW1lbnQgaWQncyBmcm9tIGh0dHA6Ly9tYXRyb3NrYS5vcmcvdGVjaG5pY2FsL3NwZWNzL2luZGV4Lmh0bWwKK2VudW0gTWt2IHsKKyAgICBrTWt2RWJtbCA9IDB4MUE0NURGQTMsCisgICAga01rdkVibWxWZXJzaW9uID0gMHg0Mjg2LAorICAgIGtNa3ZFYm1sUmVhZFZlcnNpb24gPSAweDQyRjcsCisgICAga01rdkVibWxNYXhJZGxlbmd0aCA9IDB4NDJGMiwKKyAgICBrTWt2RWJtbE1heFNpemVMZW5ndGggPSAweDQyRjMsCisgICAga01rdkRvY1R5cGUgPSAweDQyODIsCisgICAga01rdkRvY1R5cGVWZXJzaW9uID0gMHg0Mjg3LAorICAgIGtNa3ZEb2NUeXBlUmVhZFZlcnNpb24gPSAweDQyODUsCisgICAga01rdlZvaWQgPSAweEVDLAorICAgIGtNa3ZTaWduYXR1cmVTbG90ID0gMHgxQjUzODY2NywKKyAgICBrTWt2U2lnbmF0dXJlQWxnbyA9IDB4N0U4QSwKKyAgICBrTWt2U2lnbmF0dXJlSGFzaCA9IDB4N0U5QSwKKyAgICBrTWt2U2lnbmF0dXJlUHVibGljS2V5ID0gMHg3RUE1LAorICAgIGtNa3ZTaWduYXR1cmUgPSAweDdFQjUsCisgICAga01rdlNpZ25hdHVyZUVsZW1lbnRzID0gMHg3RTVCLAorICAgIGtNa3ZTaWduYXR1cmVFbGVtZW50TGlzdCA9IDB4N0U3QiwKKyAgICBrTWt2U2lnbmVkRWxlbWVudCA9IDB4NjUzMiwKKyAgICBrTWt2U2VnbWVudCA9IDB4MTg1MzgwNjcsCisgICAga01rdlNlZWtIZWFkID0gMHgxMTREOUI3NCwKKyAgICBrTWt2U2VlayA9IDB4NERCQiwKKyAgICBrTWt2U2Vla0lkID0gMHg1M0FCLAorICAgIGtNa3ZTZWVrUG9zaXRpb24gPSAweDUzQUMsCisgICAga01rdkluZm8gPSAweDE1NDlBOTY2LAorICAgIGtNa3ZUaW1lY29kZVNjYWxlID0gMHgyQUQ3QjEsCisgICAga01rdlNlZ21lbnREdXJhdGlvbiA9IDB4NDQ4OSwKKyAgICBrTWt2RGF0ZVV0YyA9IDB4NDQ2MSwKKyAgICBrTWt2TXV4aW5nQXBwID0gMHg0RDgwLAorICAgIGtNa3ZXcml0aW5nQXBwID0gMHg1NzQxLAorICAgIGtNa3ZDbHVzdGVyID0gMHgxRjQzQjY3NSwKKyAgICBrTWt2VGltZWNvZGUgPSAweEU3LAorICAgIGtNa3ZQcmV2U2l6ZSA9IDB4QUIsCisgICAga01rdkJsb2NrR3JvdXAgPSAweEEwLAorICAgIGtNa3ZCbG9jayA9IDB4QTEsCisgICAga01rdkJsb2NrQWRkaXRpb25zID0gMHg3NUExLAorICAgIGtNa3ZCbG9ja01vcmUgPSAweEE2LAorICAgIGtNa3ZCbG9ja0FkZElkID0gMHhFRSwKKyAgICBrTWt2QmxvY2tBZGRpdGlvbmFsID0gMHhBNSwKKyAgICBrTWt2QmxvY2tEdXJhdGlvbiA9IDB4OUIsCisgICAga01rdlJlZmVyZW5jZUJsb2NrID0gMHhGQiwKKyAgICBrTWt2TGFjZU51bWJlciA9IDB4Q0MsCisgICAga01rdlNpbXBsZUJsb2NrID0gMHhBMywKKyAgICBrTWt2VHJhY2tzID0gMHgxNjU0QUU2QiwKKyAgICBrTWt2VHJhY2tFbnRyeSA9IDB4QUUsCisgICAga01rdlRyYWNrTnVtYmVyID0gMHhENywKKyAgICBrTWt2VHJhY2tVaWQgPSAweDczQzUsCisgICAga01rdlRyYWNrVHlwZSA9IDB4ODMsCisgICAga01rdkZsYWdFbmFibGVkID0gMHhCOSwKKyAgICBrTWt2RmxhZ0RlZmF1bHQgPSAweDg4LAorICAgIGtNa3ZGbGFnRm9yY2VkID0gMHg1NUFBLAorICAgIGtNa3ZGbGFnTGFjaW5nID0gMHg5QywKKyAgICBrTWt2RGVmYXVsdER1cmF0aW9uID0gMHgyM0UzODMsCisgICAga01rdk1heEJsb2NrQWRkaXRpb25JZCA9IDB4NTVFRSwKKyAgICBrTWt2TmFtZSA9IDB4NTM2RSwKKyAgICBrTWt2TGFuZ3VhZ2UgPSAweDIyQjU5QywKKyAgICBrTWt2Q29kZWNJZCA9IDB4ODYsCisgICAga01rdkNvZGVjUHJpdmF0ZSA9IDB4NjNBMiwKKyAgICBrTWt2Q29kZWNOYW1lID0gMHgyNTg2ODgsCisgICAga01rdlZpZGVvID0gMHhFMCwKKyAgICBrTWt2RmxhZ0ludGVybGFjZWQgPSAweDlBLAorICAgIGtNa3ZTdGVyZW9Nb2RlID0gMHg1M0I4LAorICAgIGtNa3ZBbHBoYU1vZGUgPSAweDUzQzAsCisgICAga01rdlBpeGVsV2lkdGggPSAweEIwLAorICAgIGtNa3ZQaXhlbEhlaWdodCA9IDB4QkEsCisgICAga01rdlBpeGVsQ3JvcEJvdHRvbSA9IDB4NTRBQSwKKyAgICBrTWt2UGl4ZWxDcm9wVG9wID0gMHg1NEJCLAorICAgIGtNa3ZQaXhlbENyb3BMZWZ0ID0gMHg1NENDLAorICAgIGtNa3ZQaXhlbENyb3BSaWdodCA9IDB4NTRERCwKKyAgICBrTWt2RGlzcGxheVdpZHRoID0gMHg1NEIwLAorICAgIGtNa3ZEaXNwbGF5SGVpZ2h0ID0gMHg1NEJBLAorICAgIGtNa3ZEaXNwbGF5VW5pdCA9IDB4NTRCMiwKKyAgICBrTWt2QXNwZWN0UmF0aW9UeXBlID0gMHg1NEIzLAorICAgIGtNa3ZGcmFtZVJhdGUgPSAweDIzODNFMywKKyAgICBrTWt2QXVkaW8gPSAweEUxLAorICAgIGtNa3ZTYW1wbGluZ0ZyZXF1ZW5jeSA9IDB4QjUsCisgICAga01rdk91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMHg3OEI1LAorICAgIGtNa3ZDaGFubmVscyA9IDB4OUYsCisgICAga01rdkJpdERlcHRoID0gMHg2MjY0LAorICAgIGtNa3ZDdWVzID0gMHgxQzUzQkI2QiwKKyAgICBrTWt2Q3VlUG9pbnQgPSAweEJCLAorICAgIGtNa3ZDdWVUaW1lID0gMHhCMywKKyAgICBrTWt2Q3VlVHJhY2tQb3NpdGlvbnMgPSAweEI3LAorICAgIGtNa3ZDdWVUcmFjayA9IDB4RjcsCisgICAga01rdkN1ZUNsdXN0ZXJQb3NpdGlvbiA9IDB4RjEsCisgICAga01rdkN1ZUJsb2NrTnVtYmVyID0gMHg1Mzc4Cit9OworCitlbnVtIFRyYWNrVHlwZXMgeworICAgIGtJbnZhbGlkVHlwZSA9IC0xLAorICAgIGtWaWRlb1R5cGUgPSAweDEsCisgICAga0F1ZGlvVHlwZSA9IDB4MiwKKyAgICBrQ29tcGxleFR5cGUgPSAweDMsCisgICAga0xvZ29UeXBlID0gMHgxMCwKKyAgICBrU3VidGl0bGVUeXBlID0gMHgxMSwKKyAgICBrQnV0dG9uc1R5cGUgPSAweDEyLAorICAgIGtDb250cm9sVHlwZSA9IDB4MjAKK307CisKK2VudW0gVHJhY2tOdW0geworICAgIGtWaWRlb1RyYWNrTnVtID0gMHgxLAorICAgIGtBdWRpb1RyYWNrTnVtID0gMHgyCit9OworfQorCisjZW5kaWYgLyogV0VCTUNPTlNUQU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA4Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJXZWJtRWxlbWVudCIKKworI2luY2x1ZGUgIkVibWxVdGlsLmgiCisjaW5jbHVkZSAiV2VibUVsZW1lbnQuaCIKKyNpbmNsdWRlICJXZWJtQ29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CisKK2ludDY0X3Qgdm9pZFNpemUoaW50NjRfdCB0b3RhbFNpemUpIHsKKyAgICBpZiAodG90YWxTaXplIDwgMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh0b3RhbFNpemUgPCA5KSB7CisgICAgICAgIHJldHVybiB0b3RhbFNpemUgLSAyOworICAgIH0KKyAgICByZXR1cm4gdG90YWxTaXplIC0gOTsKK30KKwordWludDY0X3QgY2hpbGRyZW5TdW0oY29uc3QgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICB1aW50NjRfdCB0b3RhbCA9IDA7CisgICAgZm9yIChMaXN0PHNwPFdlYm1FbGVtZW50PiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNoaWxkcmVuLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgICAgICB0b3RhbCArPSAoKml0KS0+dG90YWxTaXplKCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKwordm9pZCBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgaW50IG51bSwKKyAgICAgICAgdWludDY0X3QgdWlkLAorICAgICAgICBib29sIGxhY2luZywKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZywKKyAgICAgICAgY29uc3QgY2hhciAqY29kZWMsCisgICAgICAgIFRyYWNrVHlwZXMgdHlwZSwKKyAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiAmbHMpIHsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2VHJhY2tOdW1iZXIsIG51bSkpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZUcmFja1VpZCwgdWlkKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkZsYWdMYWNpbmcsIGxhY2luZykpOworICAgIGxzLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2TGFuZ3VhZ2UsIGxhbmcpKTsKKyAgICBscy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkNvZGVjSWQsIGNvZGVjKSk7CisgICAgbHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRyYWNrVHlwZSwgdHlwZSkpOworfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dlYm1FbGVtZW50OjpXZWJtRWxlbWVudCh1aW50NjRfdCBpZCwgdWludDY0X3Qgc2l6ZSkKKyAgICA6IG1JZChpZCksIG1TaXplKHNpemUpIHsKK30KKworV2VibUVsZW1lbnQ6On5XZWJtRWxlbWVudCgpIHsKK30KKworaW50IFdlYm1FbGVtZW50OjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplQ29kZWRVbnNpZ25lZChlbmNvZGVVbnNpZ25lZChtU2l6ZSksIGJ1Zik7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50OjpzZXJpYWxpemVJbnRvKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ4X3QgKmN1ciA9IGJ1ZjsKKyAgICBpbnQgaGVhZCA9IHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQobUlkLCBjdXIpOworICAgIGN1ciArPSBoZWFkOworICAgIGludCBuZWNrID0gc2VyaWFsaXplUGF5bG9hZFNpemUoY3VyKTsKKyAgICBjdXIgKz0gbmVjazsKKyAgICBzZXJpYWxpemVQYXlsb2FkKGN1cik7CisgICAgY3VyICs9IG1TaXplOworICAgIHJldHVybiBjdXIgLSBidWY7Cit9CisKK3VpbnQ2NF90IFdlYm1FbGVtZW50Ojp0b3RhbFNpemUoKSB7CisgICAgdWludDhfdCBidWZbOF07CisgICAgLy8uLi4uLi4uLi4uLi4uLi4gKyBzaXplT2YoZW5jb2RlVW5zaWduZWQoc2l6ZSkpCisgICAgcmV0dXJuIHNpemVPZihtSWQpICsgc2VyaWFsaXplUGF5bG9hZFNpemUoYnVmKSArIG1TaXplOworfQorCit1aW50OF90ICpXZWJtRWxlbWVudDo6c2VyaWFsaXplKHVpbnQ2NF90JiBzaXplKSB7CisgICAgc2l6ZSA9IHRvdGFsU2l6ZSgpOworICAgIHVpbnQ4X3QgKmJ1ZiA9IG5ldyB1aW50OF90W3NpemVdOworICAgIHNlcmlhbGl6ZUludG8oYnVmKTsKKyAgICByZXR1cm4gYnVmOworfQorCitpbnQgV2VibUVsZW1lbnQ6OndyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpIHsKKyAgICB1aW50OF90IGJ1Zls4XTsKKyAgICBzaXplID0gdG90YWxTaXplKCk7CisgICAgb2ZmNjRfdCBvZmYgPSA6OmxzZWVrNjQoZmQsIChzaXplIC0gMSksIFNFRUtfQ1VSKSAtIChzaXplIC0gMSk7CisgICAgOjp3cml0ZShmZCwgYnVmLCAxKTsgLy8gZXh0ZW5kIGZpbGUKKworICAgIG9mZjY0X3QgY3VyT2ZmID0gb2ZmICsgc2l6ZTsKKyAgICBvZmY2NF90IGFsaWduZWRPZmYgPSBvZmYgJiB+KDo6c3lzY29uZihfU0NfUEFHRV9TSVpFKSAtIDEpOworICAgIG9mZjY0X3QgbWFwU2l6ZSA9IGN1ck9mZiAtIGFsaWduZWRPZmY7CisgICAgb2ZmNjRfdCBwYWdlT2ZmID0gb2ZmIC0gYWxpZ25lZE9mZjsKKyAgICB2b2lkICpkc3QgPSA6Om1tYXA2NChOVUxMLCBtYXBTaXplLCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgYWxpZ25lZE9mZik7CisgICAgaWYgKGRzdCA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIEFMT0dFKCJtbWFwNjQgZmFpbGVkOyBlcnJubyA9ICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiZmQgJWQ7IGZsYWdzOiAlbyIsIGZkLCA6OmZjbnRsKGZkLCBGX0dFVEZMLCAwKSk7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXJpYWxpemVJbnRvKCh1aW50OF90KikgZHN0ICsgcGFnZU9mZik7CisgICAgICAgIDo6bXN5bmMoZHN0LCBtYXBTaXplLCBNU19TWU5DKTsKKyAgICAgICAgcmV0dXJuIDo6bXVubWFwKGRzdCwgbWFwU2l6ZSk7CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVVuc2lnbmVkOjpXZWJtVW5zaWduZWQodWludDY0X3QgaWQsIHVpbnQ2NF90IHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVPZih2YWx1ZSkpLCBtVmFsdWUodmFsdWUpIHsKK30KKwordm9pZCBXZWJtVW5zaWduZWQ6OnNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKSB7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChtVmFsdWUsIGJ1Zik7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRmxvYXQ6OldlYm1GbG9hdCh1aW50NjRfdCBpZCwgZG91YmxlIHZhbHVlKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHNpemVvZihkb3VibGUpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK1dlYm1GbG9hdDo6V2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzaXplb2YoZmxvYXQpKSwgbVZhbHVlKHZhbHVlKSB7Cit9CisKK3ZvaWQgV2VibUZsb2F0OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHVpbnQ2NF90IGRhdGE7CisgICAgaWYgKG1TaXplID09IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgZmxvYXQgZiA9IG1WYWx1ZTsKKyAgICAgICAgZGF0YSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oJmYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KCZtVmFsdWUpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gbVNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBidWZbaV0gPSBkYXRhICYgMHhmZjsKKyAgICAgICAgZGF0YSA+Pj0gODsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtQmluYXJ5OjpXZWJtQmluYXJ5KHVpbnQ2NF90IGlkLCBjb25zdCBzcDxBQnVmZmVyPiAmcmVmKQorICAgIDogV2VibUVsZW1lbnQoaWQsIHJlZi0+c2l6ZSgpKSwgbVJlZihyZWYpIHsKK30KKwordm9pZCBXZWJtQmluYXJ5OjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIG1lbWNweShidWYsIG1SZWYtPmRhdGEoKSwgbVJlZi0+c2l6ZSgpKTsKK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlYm1TdHJpbmc6OldlYm1TdHJpbmcodWludDY0X3QgaWQsIGNvbnN0IGNoYXIgKnN0cikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBzdHJsZW4oc3RyKSksIG1TdHIoc3RyKSB7Cit9CisKK3ZvaWQgV2VibVN0cmluZzo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICBtZW1jcHkoYnVmLCBtU3RyLCBzdHJsZW4obVN0cikpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VibVNpbXBsZUJsb2NrOjpXZWJtU2ltcGxlQmxvY2soCisgICAgICAgIGludCB0cmFja051bSwKKyAgICAgICAgaW50MTZfdCByZWxUaW1lY29kZSwKKyAgICAgICAgYm9vbCBrZXksCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+JiBvcmlnKQorICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gdHJhY2tOdW0qMSArIHRpbWVjb2RlKjIgKyBmbGFncyoxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXgorICAgIC8vIE9ubHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdHJhY2tOdW0gaXMgZW5jb2RlZAorICAgIDogV2VibUVsZW1lbnQoa01rdlNpbXBsZUJsb2NrLCBvcmlnLT5zaXplKCkgKyA0KSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtUmVsVGltZWNvZGUocmVsVGltZWNvZGUpLAorICAgICAgbUtleShrZXkpLAorICAgICAgbVJlZihvcmlnKSB7Cit9CisKK3ZvaWQgV2VibVNpbXBsZUJsb2NrOjpzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1ZikgeworICAgIHNlcmlhbGl6ZUNvZGVkVW5zaWduZWQoZW5jb2RlVW5zaWduZWQobVRyYWNrTnVtKSwgYnVmKTsKKyAgICBidWZbMV0gPSAobVJlbFRpbWVjb2RlICYgMHhmZjAwKSA+PiA4OworICAgIGJ1ZlsyXSA9IG1SZWxUaW1lY29kZSAmIDB4ZmY7CisgICAgYnVmWzNdID0gbUtleSA/IDB4ODAgOiAwOworICAgIG1lbWNweShidWYgKyA0LCBtUmVmLT5kYXRhKCksIG1TaXplIC0gNCk7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitFYm1sVm9pZDo6RWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKQorICAgIDogV2VibUVsZW1lbnQoa01rdlZvaWQsIHZvaWRTaXplKHRvdGFsU2l6ZSkpLAorICAgICAgbVNpemVXaWR0aCh0b3RhbFNpemUgLSBzaXplT2Yoa01rdlZvaWQpIC0gdm9pZFNpemUodG90YWxTaXplKSkgeworICAgIENIRUNLX0dFKHZvaWRTaXplKHRvdGFsU2l6ZSksIDApOworfQorCitpbnQgRWJtbFZvaWQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1ZikgeworICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGVuY29kZVVuc2lnbmVkKG1TaXplLCBtU2l6ZVdpZHRoKSwgYnVmKTsKK30KKwordm9pZCBFYm1sVm9pZDo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICA6Om1lbXNldChidWYsIDAsIG1TaXplKTsKKyAgICByZXR1cm47Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtTWFzdGVyOjpXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjaGlsZHJlbikKKyAgICA6IFdlYm1FbGVtZW50KGlkLCBjaGlsZHJlblN1bShjaGlsZHJlbikpLCBtQ2hpbGRyZW4oY2hpbGRyZW4pIHsKK30KKworV2VibU1hc3Rlcjo6V2VibU1hc3Rlcih1aW50NjRfdCBpZCkKKyAgICA6IFdlYm1FbGVtZW50KGlkLCAwKSB7Cit9CisKK2ludCBXZWJtTWFzdGVyOjpzZXJpYWxpemVQYXlsb2FkU2l6ZSh1aW50OF90ICpidWYpIHsKKyAgICBpZiAobVNpemUgPT0gMCl7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVDb2RlZFVuc2lnbmVkKGtNa3ZVbmtub3duTGVuZ3RoLCBidWYpOworICAgIH0KKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OnNlcmlhbGl6ZVBheWxvYWRTaXplKGJ1Zik7Cit9CisKK3ZvaWQgV2VibU1hc3Rlcjo6c2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpIHsKKyAgICB1aW50NjRfdCBvZmYgPSAwOworICAgIGZvciAoTGlzdDxzcDxXZWJtRWxlbWVudD4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtQ2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gbUNoaWxkcmVuLmVuZCgpOworICAgICAgICAgICAgKytpdCkgeworICAgICAgICBzcDxXZWJtRWxlbWVudD4gY2hpbGQgPSAoKml0KTsKKyAgICAgICAgY2hpbGQtPnNlcmlhbGl6ZUludG8oYnVmICsgb2ZmKTsKKyAgICAgICAgb2ZmICs9IGNoaWxkLT50b3RhbFNpemUoKTsKKyAgICB9Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkN1ZVBvaW50RW50cnkodWludDY0X3QgdGltZSwgaW50IHRyYWNrLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGN1ZVBvaW50RW50cnlGaWVsZHM7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlVHJhY2ssIHRyYWNrKSk7CisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2Q3VlQ2x1c3RlclBvc2l0aW9uLCBvZmYpKTsKKyAgICBXZWJtRWxlbWVudCAqY3VlVHJhY2tQb3NpdGlvbnMgPSBuZXcgV2VibU1hc3RlcihrTWt2Q3VlVHJhY2tQb3NpdGlvbnMsIGN1ZVBvaW50RW50cnlGaWVsZHMpOworCisgICAgY3VlUG9pbnRFbnRyeUZpZWxkcy5jbGVhcigpOworICAgIGN1ZVBvaW50RW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkN1ZVRpbWUsIHRpbWUpKTsKKyAgICBjdWVQb2ludEVudHJ5RmllbGRzLnB1c2hfYmFjayhjdWVUcmFja1Bvc2l0aW9ucyk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZDdWVQb2ludCwgY3VlUG9pbnRFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6U2Vla0VudHJ5KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBvZmYpIHsKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHNlZWtFbnRyeUZpZWxkczsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtJZCwgaWQpKTsKKyAgICBzZWVrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlNlZWtQb3NpdGlvbiwgb2ZmKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZTZWVrLCBzZWVrRW50cnlGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoCisgICAgICAgIGludCB2ZXIsCisgICAgICAgIGludCByZWFkVmVyLAorICAgICAgICBpbnQgbWF4SWRMZW4sCisgICAgICAgIGludCBtYXhTaXplTGVuLAorICAgICAgICBpbnQgZG9jVmVyLAorICAgICAgICBpbnQgZG9jUmVhZFZlcikgeworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gaGVhZGVyRmllbGRzOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFZlcnNpb24sIHZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RWJtbFJlYWRWZXJzaW9uLCByZWFkVmVyKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4SWRsZW5ndGgsIG1heElkTGVuKSk7CisgICAgaGVhZGVyRmllbGRzLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZFYm1sTWF4U2l6ZUxlbmd0aCwgbWF4U2l6ZUxlbikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1TdHJpbmcoa01rdkRvY1R5cGUsICJ3ZWJtIikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVZlcnNpb24sIGRvY1ZlcikpOworICAgIGhlYWRlckZpZWxkcy5wdXNoX2JhY2sobmV3IFdlYm1VbnNpZ25lZChrTWt2RG9jVHlwZVJlYWRWZXJzaW9uLCBkb2NSZWFkVmVyKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZFYm1sLCBoZWFkZXJGaWVsZHMpOworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUVsZW1lbnQ6OlNlZ21lbnRJbmZvKHVpbnQ2NF90IHNjYWxlLCBkb3VibGUgZHVyKSB7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWdtZW50SW5mbzsKKyAgICAvLyBwbGFjZSBkdXJhdGlvbiBmaXJzdDsgZWFzaWVyIHRvIHBhdGNoCisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtRmxvYXQoa01rdlNlZ21lbnREdXJhdGlvbiwgZHVyKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlRpbWVjb2RlU2NhbGUsIHNjYWxlKSk7CisgICAgc2VnbWVudEluZm8ucHVzaF9iYWNrKG5ldyBXZWJtU3RyaW5nKGtNa3ZNdXhpbmdBcHAsICJhbmRyb2lkIikpOworICAgIHNlZ21lbnRJbmZvLnB1c2hfYmFjayhuZXcgV2VibVN0cmluZyhrTWt2V3JpdGluZ0FwcCwgImFuZHJvaWQiKSk7CisgICAgcmV0dXJuIG5ldyBXZWJtTWFzdGVyKGtNa3ZJbmZvLCBzZWdtZW50SW5mbyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICBpbnQgY2hhbnMsCisgICAgICAgIGRvdWJsZSByYXRlLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICBpbnQgYnBzLAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtBdWRpb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJBX1ZPUkJJUyIsCisgICAgICAgICAgICBrQXVkaW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IGF1ZGlvSW5mbzsKKyAgICBhdWRpb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdkNoYW5uZWxzLCBjaGFucykpOworICAgIGF1ZGlvSW5mby5wdXNoX2JhY2sobmV3IFdlYm1GbG9hdChrTWt2U2FtcGxpbmdGcmVxdWVuY3ksIHJhdGUpKTsKKyAgICBpZiAoYnBzKSB7CisgICAgICAgIFdlYm1FbGVtZW50ICpiaXREZXB0aCA9IG5ldyBXZWJtVW5zaWduZWQoa01rdkJpdERlcHRoLCBicHMpOworICAgICAgICBhdWRpb0luZm8ucHVzaF9iYWNrKGJpdERlcHRoKTsKKyAgICB9CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2QXVkaW8sIGF1ZGlvSW5mbykpOworICAgIHRyYWNrRW50cnlGaWVsZHMucHVzaF9iYWNrKG5ldyBXZWJtQmluYXJ5KGtNa3ZDb2RlY1ByaXZhdGUsIGJ1ZikpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9CisKK3NwPFdlYm1FbGVtZW50PiBXZWJtRWxlbWVudDo6VmlkZW9UcmFja0VudHJ5KAorICAgICAgICB1aW50NjRfdCB3aWR0aCwKKyAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICB1aW50NjRfdCB1aWQsCisgICAgICAgIGJvb2wgbGFjaW5nLAorICAgICAgICBjb25zdCBjaGFyICpsYW5nKSB7CisgICAgaWYgKHVpZCA9PSAwKSB7CisgICAgICAgIHVpZCA9IGtWaWRlb1RyYWNrTnVtOworICAgIH0KKworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4gdHJhY2tFbnRyeUZpZWxkczsKKyAgICBwb3B1bGF0ZUNvbW1vblRyYWNrRW50cmllcygKKyAgICAgICAgICAgIGtWaWRlb1RyYWNrTnVtLAorICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgbGFjaW5nLAorICAgICAgICAgICAgbGFuZywKKyAgICAgICAgICAgICJWX1ZQOCIsCisgICAgICAgICAgICBrVmlkZW9UeXBlLAorICAgICAgICAgICAgdHJhY2tFbnRyeUZpZWxkcyk7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IHZpZGVvSW5mbzsKKyAgICB2aWRlb0luZm8ucHVzaF9iYWNrKG5ldyBXZWJtVW5zaWduZWQoa01rdlBpeGVsV2lkdGgsIHdpZHRoKSk7CisgICAgdmlkZW9JbmZvLnB1c2hfYmFjayhuZXcgV2VibVVuc2lnbmVkKGtNa3ZQaXhlbEhlaWdodCwgaGVpZ2h0KSk7CisKKyAgICB0cmFja0VudHJ5RmllbGRzLnB1c2hfYmFjayhuZXcgV2VibU1hc3RlcihrTWt2VmlkZW8sIHZpZGVvSW5mbykpOworICAgIHJldHVybiBuZXcgV2VibU1hc3RlcihrTWt2VHJhY2tFbnRyeSwgdHJhY2tFbnRyeUZpZWxkcyk7Cit9Cit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5OTMzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUVMRU1FTlRfSF8KKyNkZWZpbmUgV0VCTUVMRU1FTlRfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgV2VibUVsZW1lbnQgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPFdlYm1FbGVtZW50PiB7CisgICAgY29uc3QgdWludDY0X3QgbUlkLCBtU2l6ZTsKKworICAgIFdlYm1FbGVtZW50KHVpbnQ2NF90IGlkLCB1aW50NjRfdCBzaXplKTsKKyAgICB2aXJ0dWFsIH5XZWJtRWxlbWVudCgpOworCisgICAgdmlydHVhbCBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpPTA7CisgICAgdWludDY0X3QgdG90YWxTaXplKCk7CisgICAgdWludDY0X3Qgc2VyaWFsaXplSW50byh1aW50OF90ICpidWYpOworICAgIHVpbnQ4X3QgKnNlcmlhbGl6ZSh1aW50NjRfdCYgc2l6ZSk7CisgICAgaW50IHdyaXRlKGludCBmZCwgdWludDY0X3QmIHNpemUpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBFYm1sSGVhZGVyKAorICAgICAgICAgICAgaW50IHZlciA9IDEsCisgICAgICAgICAgICBpbnQgcmVhZFZlciA9IDEsCisgICAgICAgICAgICBpbnQgbWF4SWRMZW4gPSA0LAorICAgICAgICAgICAgaW50IG1heFNpemVMZW4gPSA4LAorICAgICAgICAgICAgaW50IGRvY1ZlciA9IDIsCisgICAgICAgICAgICBpbnQgZG9jUmVhZFZlciA9IDIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWdtZW50SW5mbyh1aW50NjRfdCBzY2FsZSA9IDEwMDAwMDAsIGRvdWJsZSBkdXIgPSAwKTsKKworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gQXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgaW50IGNoYW5zLAorICAgICAgICAgICAgZG91YmxlIHJhdGUsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLAorICAgICAgICAgICAgaW50IGJwcyA9IDAsCisgICAgICAgICAgICB1aW50NjRfdCB1aWQgPSAwLAorICAgICAgICAgICAgYm9vbCBsYWNpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmcgPSAidW5kIik7CisKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFZpZGVvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIHVpbnQ2NF90IHdpZHRoLAorICAgICAgICAgICAgdWludDY0X3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDY0X3QgdWlkID0gMCwKKyAgICAgICAgICAgIGJvb2wgbGFjaW5nID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpsYW5nID0gInVuZCIpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBTZWVrRW50cnkodWludDY0X3QgaWQsIHVpbnQ2NF90IG9mZik7CisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiBDdWVQb2ludEVudHJ5KHVpbnQ2NF90IHRpbWUsIGludCB0cmFjaywgdWludDY0X3Qgb2ZmKTsKKyAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IFNpbXBsZUJsb2NrKAorICAgICAgICAgICAgaW50IHRyYWNrTnVtLAorICAgICAgICAgICAgaW50MTZfdCB0aW1lY29kZSwKKyAgICAgICAgICAgIGJvb2wga2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGRhdGFTaXplKTsKK307CisKK3N0cnVjdCBXZWJtVW5zaWduZWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIFdlYm1VbnNpZ25lZCh1aW50NjRfdCBpZCwgdWludDY0X3QgdmFsdWUpOworICAgIGNvbnN0IHVpbnQ2NF90IG1WYWx1ZTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtRmxvYXQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IGRvdWJsZSBtVmFsdWU7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBmbG9hdCB2YWx1ZSk7CisgICAgV2VibUZsb2F0KHVpbnQ2NF90IGlkLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1CaW5hcnkgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1SZWY7CisgICAgV2VibUJpbmFyeSh1aW50NjRfdCBpZCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJnJlZik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgV2VibVN0cmluZyA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgY2hhciAqY29uc3QgbVN0cjsKKyAgICBXZWJtU3RyaW5nKHVpbnQ2NF90IGlkLCBjb25zdCBjaGFyICpzdHIpOworICAgIHZvaWQgc2VyaWFsaXplUGF5bG9hZCh1aW50OF90ICpidWYpOworfTsKKworc3RydWN0IFdlYm1TaW1wbGVCbG9jayA6IHB1YmxpYyBXZWJtRWxlbWVudCB7CisgICAgY29uc3QgaW50IG1UcmFja051bTsKKyAgICBjb25zdCBpbnQxNl90IG1SZWxUaW1lY29kZTsKKyAgICBjb25zdCBib29sIG1LZXk7CisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gbVJlZjsKKworICAgIFdlYm1TaW1wbGVCbG9jayhpbnQgdHJhY2tOdW0sIGludDE2X3QgdGltZWNvZGUsIGJvb2wga2V5LCBjb25zdCBzcDxBQnVmZmVyPiYgb3JpZyk7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCitzdHJ1Y3QgRWJtbFZvaWQgOiBwdWJsaWMgV2VibUVsZW1lbnQgeworICAgIGNvbnN0IHVpbnQ2NF90IG1TaXplV2lkdGg7CisgICAgRWJtbFZvaWQodWludDY0X3QgdG90YWxTaXplKTsKKyAgICBpbnQgc2VyaWFsaXplUGF5bG9hZFNpemUodWludDhfdCAqYnVmKTsKKyAgICB2b2lkIHNlcmlhbGl6ZVBheWxvYWQodWludDhfdCAqYnVmKTsKK307CisKK3N0cnVjdCBXZWJtTWFzdGVyIDogcHVibGljIFdlYm1FbGVtZW50IHsKKyAgICBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+IG1DaGlsZHJlbjsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkKTsKKyAgICBXZWJtTWFzdGVyKHVpbnQ2NF90IGlkLCBjb25zdCBMaXN0PHNwPFdlYm1FbGVtZW50PiA+ICZjaGlsZHJlbik7CisgICAgaW50IHNlcmlhbGl6ZVBheWxvYWRTaXplKHVpbnQ4X3QgKmJ1Zik7CisgICAgdm9pZCBzZXJpYWxpemVQYXlsb2FkKHVpbnQ4X3QgKmJ1Zik7Cit9OworCit9IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCisjZW5kaWYgLyogV0VCTUVMRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTEzNGVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZSIKKworI2luY2x1ZGUgIldlYm1GcmFtZS5oIgorI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHdlYm07CisKK25hbWVzcGFjZSB7CitzcDxBQnVmZmVyPiB0b0FCdWZmZXIoTWVkaWFCdWZmZXIgKm1idWYpIHsKKyAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIG1lbWNweShhYnVmLT5kYXRhKCksICh1aW50OF90KikgbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICByZXR1cm4gYWJ1ZjsKK30KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBzcDxXZWJtRnJhbWU+IFdlYm1GcmFtZTo6RU9TID0gbmV3IFdlYm1GcmFtZSgpOworCitXZWJtRnJhbWU6OldlYm1GcmFtZSgpCisgICAgOiBtVHlwZShrSW52YWxpZFR5cGUpLAorICAgICAgbUtleShmYWxzZSksCisgICAgICBtQWJzVGltZWNvZGUoVUlOVDY0X01BWCksCisgICAgICBtRGF0YShuZXcgQUJ1ZmZlcigwKSksCisgICAgICBtRW9zKHRydWUpIHsKK30KKworV2VibUZyYW1lOjpXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKm1idWYpCisgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgIG1LZXkoa2V5KSwKKyAgICAgIG1BYnNUaW1lY29kZShhYnNUaW1lY29kZSksCisgICAgICBtRGF0YSh0b0FCdWZmZXIobWJ1ZikpLAorICAgICAgbUVvcyhmYWxzZSkgeworfQorCitzcDxXZWJtRWxlbWVudD4gV2VibUZyYW1lOjpTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IFdlYm1TaW1wbGVCbG9jaygKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyBrVmlkZW9UcmFja051bSA6IGtBdWRpb1RyYWNrTnVtLAorICAgICAgICAgICAgbUFic1RpbWVjb2RlIC0gYmFzZVRpbWVjb2RlLAorICAgICAgICAgICAgbUtleSwKKyAgICAgICAgICAgIG1EYXRhKTsKK30KKworYm9vbCBXZWJtRnJhbWU6Om9wZXJhdG9yPChjb25zdCBXZWJtRnJhbWUgJm90aGVyKSBjb25zdCB7CisgICAgaWYgKHRoaXMtPm1Fb3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAob3RoZXIubUVvcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHRoaXMtPm1BYnNUaW1lY29kZSA9PSBvdGhlci5tQWJzVGltZWNvZGUpIHsKKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtBdWRpb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga1ZpZGVvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgb3RoZXIubVR5cGUgPT0ga0F1ZGlvVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMtPm1BYnNUaW1lY29kZSA8IG90aGVyLm1BYnNUaW1lY29kZTsKK30KK30gLyogbmFtZXNwYWNlIGFuZHJvaWQgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMGIwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1GUkFNRV9IXworI2RlZmluZSBXRUJNRlJBTUVfSF8KKworI2luY2x1ZGUgIldlYm1FbGVtZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFdlYm1GcmFtZSA6IExpZ2h0UmVmQmFzZTxXZWJtRnJhbWU+IHsKK3B1YmxpYzoKKyAgICBjb25zdCBpbnQgbVR5cGU7CisgICAgY29uc3QgYm9vbCBtS2V5OworICAgIGNvbnN0IHVpbnQ2NF90IG1BYnNUaW1lY29kZTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBtRGF0YTsKKyAgICBjb25zdCBib29sIG1Fb3M7CisKKyAgICBXZWJtRnJhbWUoKTsKKyAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKmJ1Zik7CisgICAgfldlYm1GcmFtZSgpIHt9CisKKyAgICBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IHNwPFdlYm1GcmFtZT4gRU9TOworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXZWJtRnJhbWUpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1GUkFNRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjhhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1GcmFtZVRocmVhZCIKKworI2luY2x1ZGUgIldlYm1Db25zdGFudHMuaCIKKyNpbmNsdWRlICJXZWJtRnJhbWVUaHJlYWQuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgKldlYm1GcmFtZVRocmVhZDo6d3JhcCh2b2lkICphcmcpIHsKKyAgICBXZWJtRnJhbWVUaHJlYWQgKndvcmtlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8V2VibUZyYW1lVGhyZWFkKj4oYXJnKTsKKyAgICB3b3JrZXItPnJ1bigpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgV2VibUZyYW1lVGhyZWFkOjp3cmFwLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKSB7CisgICAgdm9pZCAqc3RhdHVzOworICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmc3RhdHVzKTsKKyAgICByZXR1cm4gKHN0YXR1c190KShpbnRwdHJfdClzdGF0dXM7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTb3VyY2VUaHJlYWQ6OldlYm1GcmFtZVNvdXJjZVRocmVhZCgKKyAgICBpbnQgdHlwZSwKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaykKKyAgICA6IG1UeXBlKHR5cGUpLCBtU2luayhzaW5rKSB7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZWJtRnJhbWVTaW5rVGhyZWFkOjpXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICBjb25zdCB1aW50NjRfdCYgb2ZmLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IHZpZGVvVGhyZWFkLAorICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9UaHJlYWQtPm1TaW5rKSwKKyAgICAgIG1BdWRpb0ZyYW1lcyhhdWRpb1RocmVhZC0+bVNpbmspLAorICAgICAgbUN1ZXMoY3VlcyksCisgICAgICBtRG9uZSh0cnVlKSB7Cit9CisKK1dlYm1GcmFtZVNpbmtUaHJlYWQ6OldlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgIGNvbnN0IGludCYgZmQsCisgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiB2aWRlb1NvdXJjZSwKKyAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGF1ZGlvU291cmNlLAorICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KG9mZiksCisgICAgICBtVmlkZW9GcmFtZXModmlkZW9Tb3VyY2UpLAorICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvU291cmNlKSwKKyAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbURvbmUodHJ1ZSkgeworfQorCisvLyBJbml0aWFsaXplcyBhIHdlYm0gY2x1c3RlciB3aXRoIGl0cyBzdGFydGluZyB0aW1lY29kZS4KKy8vCisvLyBmcmFtZXM6CisvLyAgIHNlcXVlbmNlIG9mIGlucHV0IGF1ZGlvL3ZpZGVvIGZyYW1lcyByZWNlaXZlZCBmcm9tIHRoZSBzb3VyY2UuCisvLworLy8gY2x1c3RlclRpbWVjb2RlTDoKKy8vICAgdGhlIHN0YXJ0aW5nIHRpbWVjb2RlIG9mIHRoZSBjbHVzdGVyOyB0aGlzIGlzIHRoZSB0aW1lY29kZSBvZiB0aGUgZmlyc3QKKy8vICAgZnJhbWUgc2luY2UgZnJhbWVzIGFyZSBvcmRlcmVkIGJ5IHRpbWVzdGFtcC4KKy8vCisvLyBjaGlsZHJlbjoKKy8vICAgbGlzdCB0byBob2xkIGNoaWxkIGVsZW1lbnRzIGluIGEgd2VibSBjbHVzdGVyIChzdGFydCB0aW1lY29kZSBhbmQKKy8vICAgc2ltcGxlIGJsb2NrcykuCisvLworLy8gc3RhdGljCit2b2lkIFdlYm1GcmFtZVNpbmtUaHJlYWQ6OmluaXRDbHVzdGVyKAorICAgIExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsCisgICAgdWludDY0X3QmIGNsdXN0ZXJUaW1lY29kZUwsCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pIHsKKyAgICBDSEVDSyghZnJhbWVzLmVtcHR5KCkgJiYgY2hpbGRyZW4uZW1wdHkoKSk7CisKKyAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICBjbHVzdGVyVGltZWNvZGVMID0gZi0+bUFic1RpbWVjb2RlOworICAgIFdlYm1VbnNpZ25lZCAqY2x1c3RlclRpbWVjb2RlID0gbmV3IFdlYm1VbnNpZ25lZChrTWt2VGltZWNvZGUsIGNsdXN0ZXJUaW1lY29kZUwpOworICAgIGNoaWxkcmVuLmNsZWFyKCk7CisgICAgY2hpbGRyZW4ucHVzaF9iYWNrKGNsdXN0ZXJUaW1lY29kZSk7Cit9CisKK3ZvaWQgV2VibUZyYW1lU2lua1RocmVhZDo6d3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKSB7CisgICAgLy8gY2hpbGRyZW4gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBzaW1wbGVibG9jayBhbmQgaXRzIHRpbWVjb2RlCisgICAgQ0hFQ0tfR0UoY2hpbGRyZW4uc2l6ZSgpLCAyKTsKKworICAgIHVpbnQ2NF90IHNpemU7CisgICAgc3A8V2VibUVsZW1lbnQ+IGNsdXN0ZXIgPSBuZXcgV2VibU1hc3RlcihrTWt2Q2x1c3RlciwgY2hpbGRyZW4pOworICAgIGNsdXN0ZXItPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgY2hpbGRyZW4uY2xlYXIoKTsKK30KKworLy8gV3JpdGUgb3V0IChwb3NzaWJseSBtdWx0aXBsZSkgd2VibSBjbHVzdGVyKHMpIGZyb20gZnJhbWVzIHNwbGl0IG9uIHZpZGVvIGtleSBmcmFtZXMuCisvLworLy8gbGFzdDoKKy8vICAgY3VycmVudCBmbHVzaCBpcyB0cmlnZ2VyZWQgYnkgRU9TIGluc3RlYWQgb2YgYSBzZWNvbmQgb3V0c3RhbmRpbmcgdmlkZW8ga2V5IGZyYW1lLgordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpmbHVzaEZyYW1lcyhMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgZnJhbWVzLCBib29sIGxhc3QpIHsKKyAgICBpZiAoZnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGNsdXN0ZXJUaW1lY29kZUw7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBpbml0Q2x1c3RlcihmcmFtZXMsIGNsdXN0ZXJUaW1lY29kZUwsIGNoaWxkcmVuKTsKKworICAgIHVpbnQ2NF90IGN1ZVRpbWUgPSBjbHVzdGVyVGltZWNvZGVMOworICAgIG9mZl90IGZwb3MgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19DVVIpOworICAgIHNpemVfdCBuID0gZnJhbWVzLnNpemUoKTsKKyAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBmbHVzaGluZyB0aGUgbGFzdCBzZXF1ZW5jZSBvZiBvdXRzdGFuZGluZyBmcmFtZXMsIGZsdXNoRnJhbWVzCisgICAgICAgIC8vIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCByaWdodCBhZnRlciB3ZSBoYXZlIHB1c2hlZCBhIHNlY29uZCBvdXRzdGFuZGluZyB2aWRlbyBrZXkKKyAgICAgICAgLy8gZnJhbWUgKHRoZSBsYXN0IGZyYW1lKSwgd2hpY2ggYmVsb25ncyB0byB0aGUgbmV4dCBjbHVzdGVyOyBhbHNvIGhvbGQgYmFjayBvbgorICAgICAgICAvLyBmbHVzaGluZyB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUgYmVmb3JlIHdlIGNoZWNrIGl0cyB0eXBlLiBBIGF1ZGlvIGZyYW1lCisgICAgICAgIC8vIHNob3VsZCBwcmVjZWRlIHRoZSBhZm9yZW1lbnRpb25lZCB2aWRlbyBrZXkgZnJhbWUgaW4gdGhlIG5leHQgc2VxdWVuY2UsIGEgdmlkZW8KKyAgICAgICAgLy8gZnJhbWUgc2hvdWxkIGJlIHRoZSBsYXN0IGZyYW1lIGluIHRoZSBjdXJyZW50ICh0by1iZS1mbHVzaGVkKSBzZXF1ZW5jZS4KKyAgICAgICAgQ0hFQ0tfR0UobiwgMik7CisgICAgICAgIG4gLT0gMjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGYgPSAqKGZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgaWYgKGYtPm1UeXBlID09IGtWaWRlb1R5cGUgJiYgZi0+bUtleSkgeworICAgICAgICAgICAgY3VlVGltZSA9IGYtPm1BYnNUaW1lY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmLT5tQWJzVGltZWNvZGUgLSBjbHVzdGVyVGltZWNvZGVMID4gSU5UMTZfTUFYKSB7CisgICAgICAgICAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgICAgICAgICAgaW5pdENsdXN0ZXIoZnJhbWVzLCBjbHVzdGVyVGltZWNvZGVMLCBjaGlsZHJlbik7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZXMuZXJhc2UoZnJhbWVzLmJlZ2luKCkpOworICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soZi0+U2ltcGxlQmxvY2soY2x1c3RlclRpbWVjb2RlTCkpOworICAgIH0KKworICAgIC8vIGVxdWl2YWxlbnQgdG8gbGFzdD09ZmFsc2UKKyAgICBpZiAoIWZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGRlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIG91dCB0aGUgc2Vjb25kIHRvIGxhc3QgZnJhbWUuCisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gc2Vjb25kTGFzdEZyYW1lID0gKihmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIGlmIChzZWNvbmRMYXN0RnJhbWUtPm1UeXBlID09IGtWaWRlb1R5cGUpIHsKKyAgICAgICAgICAgIGZyYW1lcy5lcmFzZShmcmFtZXMuYmVnaW4oKSk7CisgICAgICAgICAgICBjaGlsZHJlbi5wdXNoX2JhY2soc2Vjb25kTGFzdEZyYW1lLT5TaW1wbGVCbG9jayhjbHVzdGVyVGltZWNvZGVMKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZUNsdXN0ZXIoY2hpbGRyZW4pOworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVQb2ludCA9IFdlYm1FbGVtZW50OjpDdWVQb2ludEVudHJ5KGN1ZVRpbWUsIDEsIGZwb3MgLSBtU2VnbWVudERhdGFTdGFydCk7CisgICAgbUN1ZXMucHVzaF9iYWNrKGN1ZVBvaW50KTsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lU2lua1RocmVhZDo6c3RhcnQoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpzdG9wKCkgeworICAgIG1Eb25lID0gdHJ1ZTsKKyAgICBtVmlkZW9GcmFtZXMucHVzaChXZWJtRnJhbWU6OkVPUyk7CisgICAgbUF1ZGlvRnJhbWVzLnB1c2goV2VibUZyYW1lOjpFT1MpOworICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKK30KKwordm9pZCBXZWJtRnJhbWVTaW5rVGhyZWFkOjpydW4oKSB7CisgICAgaW50IG51bVZpZGVvS2V5RnJhbWVzID0gMDsKKyAgICBMaXN0PGNvbnN0IHNwPFdlYm1GcmFtZT4gPiBvdXRzdGFuZGluZ0ZyYW1lczsKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIEFMT0dWKCJ3YWl0IHYgZnJhbWUiKTsKKyAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiB2aWRlb0ZyYW1lID0gbVZpZGVvRnJhbWVzLnBlZWsoKTsKKyAgICAgICAgQUxPR1YoInYgZnJhbWU6ICVwIiwgdmlkZW9GcmFtZS5nZXQoKSk7CisKKyAgICAgICAgQUxPR1YoIndhaXQgYSBmcmFtZSIpOworICAgICAgICBjb25zdCBzcDxXZWJtRnJhbWU+IGF1ZGlvRnJhbWUgPSBtQXVkaW9GcmFtZXMucGVlaygpOworICAgICAgICBBTE9HVigiYSBmcmFtZTogJXAiLCBhdWRpb0ZyYW1lLmdldCgpKTsKKworICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUVvcyAmJiBhdWRpb0ZyYW1lLT5tRW9zKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqYXVkaW9GcmFtZSA8ICp2aWRlb0ZyYW1lKSB7CisgICAgICAgICAgICBBTE9HVigidGFrZSBhIGZyYW1lIik7CisgICAgICAgICAgICBtQXVkaW9GcmFtZXMudGFrZSgpOworICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKGF1ZGlvRnJhbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInRha2UgdiBmcmFtZSIpOworICAgICAgICAgICAgbVZpZGVvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIG91dHN0YW5kaW5nRnJhbWVzLnB1c2hfYmFjayh2aWRlb0ZyYW1lKTsKKyAgICAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5tS2V5KQorICAgICAgICAgICAgICAgIG51bVZpZGVvS2V5RnJhbWVzKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtVmlkZW9LZXlGcmFtZXMgPT0gMikgeworICAgICAgICAgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyBmYWxzZSk7CisgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmbHVzaGluZyBsYXN0IGNsdXN0ZXIgKHNpemUgJXp1KSIsIG91dHN0YW5kaW5nRnJhbWVzLnNpemUoKSk7CisgICAgZmx1c2hGcmFtZXMob3V0c3RhbmRpbmdGcmFtZXMsIC8qIGxhc3QgPSAqLyB0cnVlKTsKKyAgICBtRG9uZSA9IHRydWU7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgY29uc3QgaW50NjRfdCBrSW5pdGlhbERlbGF5VGltZVVzID0gNzAwMDAwTEw7CisKK3ZvaWQgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OmNsZWFyRmxhZ3MoKSB7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Cit9CisKK1dlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKKyAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lT2Zmc2V0TXMsCisgICAgICAgIGludCBudW1UcmFja3MsCisgICAgICAgIGJvb2wgcmVhbFRpbWVSZWNvcmRpbmcpCisgICAgOiBXZWJtRnJhbWVTb3VyY2VUaHJlYWQodHlwZSwgc2luayksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtVGltZUNvZGVTY2FsZSh0aW1lQ29kZVNjYWxlKSwKKyAgICAgIG1UcmFja0R1cmF0aW9uVXMoMCkgeworICAgIGNsZWFyRmxhZ3MoKTsKKyAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVSZWFsVXM7CisgICAgaWYgKHJlYWxUaW1lUmVjb3JkaW5nICYmIG51bVRyYWNrcyA+IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29waWVkIGZyb20gTVBFRzRXcml0ZXIKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBleHRyYSBkZWxheSBvZiBhY2NlcHRpbmcgaW5jb21pbmcgYXVkaW8vdmlkZW8gc2lnbmFscworICAgICAgICAgKiBoZWxwcyB0byBhbGlnbiBhL3Ygc3RhcnQgdGltZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcmVjb3JkaW5nCisgICAgICAgICAqIHNlc3Npb24sIGFuZCBpdCBhbHNvIGhlbHBzIGVsaW1pbmF0ZSB0aGUgInJlY29yZGluZyIgc291bmQgZm9yCisgICAgICAgICAqIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIElmIGNsaWVudCBkb2VzIG5vdCBzZXQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0LCB3ZSBmYWxsIGJhY2sgdG8KKyAgICAgICAgICogdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgZGVsYXkgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZU9mZnNldFVzID0gc3RhcnRUaW1lT2Zmc2V0TXMgKiAxMDAwTEw7CisgICAgICAgIGlmIChzdGFydFRpbWVPZmZzZXRVcyA8IDApIHsgIC8vIFN0YXJ0IHRpbWUgb2Zmc2V0IHdhcyBub3Qgc2V0CisgICAgICAgICAgICBzdGFydFRpbWVPZmZzZXRVcyA9IGtJbml0aWFsRGVsYXlUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXJ0VGltZVVzICs9IHN0YXJ0VGltZU9mZnNldFVzOworICAgICAgICBBTE9HSSgiU3RhcnQgdGltZSBvZmZzZXQ6ICUiIFBSSWQ2NCAiIHVzIiwgc3RhcnRUaW1lT2Zmc2V0VXMpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnN0YXJ0KCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KG1ldGEuZ2V0KCkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gV2VibUZyYW1lVGhyZWFkOjpzdGFydCgpOworICAgIH0KK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnJlc3VtZSgpIHsKKyAgICBpZiAoIW1Eb25lICYmIG1QYXVzZWQpIHsKKyAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworICAgICAgICBtUmVzdW1lZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6OnBhdXNlKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6c3RvcCgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIHJldHVybiBXZWJtRnJhbWVUaHJlYWQ6OnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkOjpydW4oKSB7CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IDB4ZGVhZGJlZWY7CisgICAgaW50NjRfdCBsYXN0VGltZXN0YW1wVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgdGltZSBzdGFtcAorICAgIGludDY0X3QgbGFzdER1cmF0aW9uVXMgPSAwOyAvLyBQcmV2aW91cyBzYW1wbGUgZHVyYXRpb24KKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisKKyAgICBjb25zdCB1aW50NjRfdCBrVW5pbml0aWFsaXplZCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkw7CisgICAgbVN0YXJ0VGltZVVzID0ga1VuaW5pdGlhbGl6ZWQ7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgIHdoaWxlICghbURvbmUgJiYgKGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciwgTlVMTCkpID09IE9LKSB7CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWV0YURhdGE+IG1kID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQ0hFQ0sobWQtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcFVzIC09IG1TdGFydFRpbWVVczsKKworICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgICAgICBsYXN0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsrY291bnQ7CisKKyAgICAgICAgLy8gYWRqdXN0IHRpbWUtc3RhbXBzIGFmdGVyIHBhdXNlL3Jlc3VtZQorICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDS19HRShkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMsIDBsbCk7CisgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0tfR0UocGF1c2VkRHVyYXRpb25VcywgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMGxsKTsKKworICAgICAgICBpbnQzMl90IGlzU3luYyA9IGZhbHNlOworICAgICAgICBtZC0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYyk7CisgICAgICAgIGNvbnN0IHNwPFdlYm1GcmFtZT4gZiA9IG5ldyBXZWJtRnJhbWUoCisgICAgICAgICAgICBtVHlwZSwKKyAgICAgICAgICAgIGlzU3luYywKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyKTsKKyAgICAgICAgbVNpbmsucHVzaChmKTsKKworICAgICAgICBBTE9HVigKKyAgICAgICAgICAgICIlcyAlcyBmcmFtZSBhdCAlIiBQUklkNjQgIiBzaXplICV6dVxuIiwKKyAgICAgICAgICAgIG1UeXBlID09IGtWaWRlb1R5cGUgPyAidmlkZW8iIDogImF1ZGlvIiwKKyAgICAgICAgICAgIGlzU3luYyA/ICJJIiA6ICJQIiwKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzICogMTAwMCAvIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgeworICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIH0KKworICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CisgICAgbVNpbmsucHVzaChXZWJtRnJhbWU6OkVPUyk7Cit9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjVkOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0VCTUZSQU1FVEhSRUFEX0hfCisjZGVmaW5lIFdFQk1GUkFNRVRIUkVBRF9IXworCisjaW5jbHVkZSAiV2VibUZyYW1lLmgiCisjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgV2VibUZyYW1lVGhyZWFkIDogcHVibGljIExpZ2h0UmVmQmFzZTxXZWJtRnJhbWVUaHJlYWQ+IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBydW5uaW5nKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpIHsgcmV0dXJuIE9LOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKSB7IHJldHVybiBPSzsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgfldlYm1GcmFtZVRocmVhZCgpIHsgc3RvcCgpOyB9CisgICAgc3RhdGljIHZvaWQgKndyYXAodm9pZCAqYXJnKTsKKworcHJvdGVjdGVkOgorICAgIFdlYm1GcmFtZVRocmVhZCgpCisgICAgICAgIDogbVRocmVhZCgwKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1GcmFtZVRocmVhZCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkOworY2xhc3MgV2VibUZyYW1lU2lua1RocmVhZCA6IHB1YmxpYyBXZWJtRnJhbWVUaHJlYWQgeworcHVibGljOgorICAgIFdlYm1GcmFtZVNpbmtUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBpbnQmIGZkLAorICAgICAgICAgICAgY29uc3QgdWludDY0X3QmIG9mZiwKKyAgICAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gdmlkZW9UaHJlYWQsCisgICAgICAgICAgICBzcDxXZWJtRnJhbWVTb3VyY2VUaHJlYWQ+IGF1ZGlvVGhyZWFkLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY3Vlcyk7CisKKyAgICBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgaW50JiBmZCwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90JiBvZmYsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgdmlkZW9Tb3VyY2UsCisgICAgICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBjdWVzKTsKKworICAgIHZvaWQgcnVuKCk7CisgICAgYm9vbCBydW5uaW5nKCkgeworICAgICAgICByZXR1cm4gIW1Eb25lOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQmIG1GZDsKKyAgICBjb25zdCB1aW50NjRfdCYgbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1WaWRlb0ZyYW1lczsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbUF1ZGlvRnJhbWVzOworICAgIExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIG1DdWVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKworICAgIHN0YXRpYyB2b2lkIGluaXRDbHVzdGVyKAorICAgICAgICAgICAgTGlzdDxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIGZyYW1lcywKKyAgICAgICAgICAgIHVpbnQ2NF90JiBjbHVzdGVyVGltZWNvZGVMLAorICAgICAgICAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgY2hpbGRyZW4pOworICAgIHZvaWQgd3JpdGVDbHVzdGVyKExpc3Q8c3A8V2VibUVsZW1lbnQ+ID4mIGNoaWxkcmVuKTsKKyAgICB2b2lkIGZsdXNoRnJhbWVzKExpc3Q8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBmcmFtZXMsIGJvb2wgbGFzdCk7Cit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgV2VibUZyYW1lU291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lU291cmNlVGhyZWFkKGludCB0eXBlLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luayk7CisgICAgdmlydHVhbCBpbnQ2NF90IGdldER1cmF0aW9uVXMoKSA9IDA7Citwcm90ZWN0ZWQ6CisgICAgY29uc3QgaW50IG1UeXBlOworICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtU2luazsKKworICAgIGZyaWVuZCBjbGFzcyBXZWJtRnJhbWVTaW5rVGhyZWFkOworfTsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkIDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQoaW50IHR5cGUsIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rKQorICAgICAgICA6IFdlYm1GcmFtZVNvdXJjZVRocmVhZCh0eXBlLCBzaW5rKSB7CisgICAgfQorICAgIHZvaWQgcnVuKCkgeyBtU2luay5wdXNoKFdlYm1GcmFtZTo6RU9TKTsgfQorICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIHsgcmV0dXJuIDA7IH0KK307CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDogcHVibGljIFdlYm1GcmFtZVNvdXJjZVRocmVhZCB7CitwdWJsaWM6CisgICAgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIHNpbmssCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVSZWFsVXMsCisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldE1zLAorICAgICAgICAgICAgaW50IG51bVBlZXJzLAorICAgICAgICAgICAgYm9vbCByZWFsVGltZVJlY29yZGluZyk7CisKKyAgICB2b2lkIHJ1bigpOworICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgc3RhdHVzX3QgcmVzdW1lKCk7CisgICAgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICBzdGF0dXNfdCBzdG9wKCk7CisgICAgaW50NjRfdCBnZXREdXJhdGlvblVzKCkgeworICAgICAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgY29uc3QgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CisgICAgdWludDY0X3QgbVN0YXJ0VGltZVVzOworCisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZDsKKyAgICB2b2xhdGlsZSBib29sIG1TdGFydGVkOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgaW50NjRfdCBtVHJhY2tEdXJhdGlvblVzOworCisgICAgdm9pZCBjbGVhckZsYWdzKCk7Cit9OworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworCisjZW5kaWYgLyogV0VCTUZSQU1FVEhSRUFEX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2NmOTJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldlYm1Xcml0ZXIiCisKKyNpbmNsdWRlICJFYm1sVXRpbC5oIgorI2luY2x1ZGUgIldlYm1Xcml0ZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2Ugeworc2l6ZV90IFhpcGhMYWNlQ29kZUxlbihzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBzaXplIC8gMHhmZiArIDE7Cit9CisKK3NpemVfdCBYaXBoTGFjZUVuYyh1aW50OF90ICpidWYsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgc2l6ZSA+PSAweGZmOyArK2ksIHNpemUgLT0gMHhmZikgeworICAgICAgICBidWZbaV0gPSAweGZmOworICAgIH0KKyAgICBidWZbaSsrXSA9IHNpemU7CisgICAgcmV0dXJuIGk7Cit9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMgPSA1ICogMTAyNCAqIDEwMjQ7CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoaW50IGZkKQorICAgIDogbUZkKGR1cChmZCkpLAorICAgICAgbUluaXRDaGVjayhtRmQgPCAwID8gTk9fSU5JVCA6IE9LKSwKKyAgICAgIG1UaW1lQ29kZVNjYWxlKDEwMDAwMDApLAorICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoMCksCisgICAgICBtU3RhcnRUaW1lT2Zmc2V0TXMoMCksCisgICAgICBtU2VnbWVudE9mZnNldCgwKSwKKyAgICAgIG1TZWdtZW50RGF0YVN0YXJ0KDApLAorICAgICAgbUluZm9PZmZzZXQoMCksCisgICAgICBtSW5mb1NpemUoMCksCisgICAgICBtVHJhY2tzT2Zmc2V0KDApLAorICAgICAgbUN1ZXNPZmZzZXQoMCksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1hYmxlRmlsZSh0cnVlKSwKKyAgICAgIG1Fc3RpbWF0ZWRDdWVzU2l6ZSgwKSB7CisgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gV2VibVN0cmVhbShrQXVkaW9UeXBlLCAiQXVkaW8iLCAmV2VibVdyaXRlcjo6YXVkaW9UcmFjayk7CisgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdID0gV2VibVN0cmVhbShrVmlkZW9UeXBlLCAiVmlkZW8iLCAmV2VibVdyaXRlcjo6dmlkZW9UcmFjayk7CisgICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZCgKKyAgICAgICAgICAgIG1GZCwKKyAgICAgICAgICAgIG1TZWdtZW50RGF0YVN0YXJ0LAorICAgICAgICAgICAgbVN0cmVhbXNba1ZpZGVvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1TaW5rLAorICAgICAgICAgICAgbUN1ZVBvaW50cyk7Cit9CisKK1dlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCisgICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKKyAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKKyAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAorICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCisgICAgICBtSW5mb09mZnNldCgwKSwKKyAgICAgIG1JbmZvU2l6ZSgwKSwKKyAgICAgIG1UcmFja3NPZmZzZXQoMCksCisgICAgICBtQ3Vlc09mZnNldCgwKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAorICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAorICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIEFMT0dWKCJmZCAlZDsgZmxhZ3M6ICVvIiwgbUZkLCBmY250bChtRmQsIEZfR0VURkwsIDApKTsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgIH0KKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKKyAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAorICAgICAgICAgICAgbUZkLAorICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCisgICAgICAgICAgICBtQ3VlUG9pbnRzKTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6dmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIENIRUNLKG1kLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICByZXR1cm4gV2VibUVsZW1lbnQ6OlZpZGVvVHJhY2tFbnRyeSh3aWR0aCwgaGVpZ2h0KTsKK30KKworLy8gc3RhdGljCitzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CisgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKKyAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKKyAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpOworICAgIENIRUNLKG1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKSk7CisgICAgQ0hFQ0sobWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSk7CisKKyAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOworICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgIG9mZl90IG9mZiA9IDA7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKworICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOworICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7CisgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAorICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgcmV0dXJuIGVudHJ5OworfQorCitzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG51bVRyYWNrcysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bVRyYWNrczsKK30KKwordWludDY0X3QgV2VibVdyaXRlcjo6ZXN0aW1hdGVDdWVzU2l6ZShpbnQzMl90IGJpdFJhdGUpIHsKKyAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGVzdGltYXRlTW9vdkJveFNpemUgaW4gTVBFRzRXcml0ZXIuCisgICAgLy8KKyAgICAvLyBTdGF0aXN0aWNhbCBhbmFseXNpcyBzaG93cyB0aGF0IG1ldGFkYXRhIHVzdWFsbHkgYWNjb3VudHMKKyAgICAvLyBmb3IgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSB0b3RhbCBmaWxlIHNpemUsIHVzdWFsbHkgPCAwLjYlLgorCisgICAgLy8gVGhlIGRlZmF1bHQgTUlOX01PT1ZfQk9YX1NJWkUgaXMgc2V0IHRvIDAuNiUgeCAxTUIgLyAyLAorICAgIC8vIHdoZXJlIDFNQiBpcyB0aGUgY29tbW9uIGZpbGUgc2l6ZSBsaW1pdCBmb3IgTU1TIGFwcGxpY2F0aW9uLgorICAgIC8vIFRoZSBkZWZhdWx0IE1BWCBfTU9PVl9CT1hfU0laRSB2YWx1ZSBpcyBiYXNlZCBvbiBhYm91dCAzCisgICAgLy8gbWludXRlIHZpZGVvIHJlY29yZGluZyB3aXRoIGEgYml0IHJhdGUgYWJvdXQgMyBNYnBzLCBiZWNhdXNlCisgICAgLy8gc3RhdGlzdGljcyBhbHNvIHNob3cgdGhhdCBtb3N0IG9mIHRoZSB2aWRlbyBjYXB0dXJlZCBhcmUgZ29pbmcKKyAgICAvLyB0byBiZSBsZXNzIHRoYW4gMyBtaW51dGVzLgorCisgICAgLy8gSWYgdGhlIGVzdGltYXRpb24gaXMgd3JvbmcsIHdlIHdpbGwgcGF5IHRoZSBwcmljZSBvZiB3YXN0aW5nCisgICAgLy8gc29tZSByZXNlcnZlZCBzcGFjZS4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBzbyBvZnRlbiBzdGF0aXN0aWNhbGx5LgorICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGZhY3RvciA9IDI7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUlOX0NVRVNfU0laRSA9IDMgKiAxMDI0OyAgLy8gMyBLQgorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1BWF9DVUVTX1NJWkUgPSAoMTgwICogMzAwMDAwMCAqIDZMTCAvIDgwMDApOworICAgIGludDY0X3Qgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisKKyAgICAvLyBNYXggZmlsZSBzaXplIGxpbWl0IGlzIHNldAorICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzICE9IDAgJiYgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgc2l6ZSA9IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgKiA2IC8gMTAwMDsKKyAgICB9CisKKyAgICAvLyBNYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgIT0gMCkgeworICAgICAgICBpZiAoYml0UmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2l6ZTIgPSAoKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzICogYml0UmF0ZSAqIDYpIC8gMTAwMCAvIDgwMDAwMDApOworICAgICAgICAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCAmJiBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBmaWxlIHNpemUgYW5kIGR1cmF0aW9uIGxpbWl0cyBhcmUgc2V0LAorICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgc21hbGxlciBsaW1pdCBvZiB0aGUgdHdvLgorICAgICAgICAgICAgICAgIGlmIChzaXplID4gc2l6ZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT25seSBtYXggZmlsZSBkdXJhdGlvbiBsaW1pdCBpcyBzZXQKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IE1JTl9DVUVTX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1JTl9DVUVTX1NJWkU7CisgICAgfQorCisgICAgLy8gQW55IGxvbmcgZHVyYXRpb24gcmVjb3JkaW5nIHdpbGwgYmUgcHJvYmFibHkgZW5kIHVwIHdpdGgKKyAgICAvLyBub24tc3RyZWFtYWJsZSB3ZWJtIGZpbGUuCisgICAgaWYgKHNpemUgPiBNQVhfQ1VFU19TSVpFKSB7CisgICAgICAgIHNpemUgPSBNQVhfQ1VFU19TSVpFOworICAgIH0KKworICAgIEFMT0dWKCJsaW1pdHM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCAiIGJ5dGVzL3VzLCIKKyAgICAgICAgICAgICIgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCBjdWVzIHNpemUgJSIgUFJJZDY0ICIgYnl0ZXMiLAorICAgICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOworICAgIHJldHVybiBmYWN0b3IgKiBzaXplOworfQorCit2b2lkIFdlYm1Xcml0ZXI6OmluaXRTdHJlYW0oc2l6ZV90IGlkeCkgeworICAgIGlmIChtU3RyZWFtc1tpZHhdLm1UaHJlYWQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtU3RyZWFtc1tpZHhdLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkaW5nIGR1bW15IHNvdXJjZSAuLi4gIik7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVFbXB0eVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1UeXBlLCBtU3RyZWFtc1tpZHhdLm1TaW5rKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiYWRkaW5nIHNvdXJjZSAlcCIsIG1TdHJlYW1zW2lkeF0ubVNvdXJjZS5nZXQoKSk7CisgICAgICAgIG1TdHJlYW1zW2lkeF0ubVRocmVhZCA9IG5ldyBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZCgKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1Tb3VyY2UsCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVHlwZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1TaW5rLAorICAgICAgICAgICAgICAgIG1UaW1lQ29kZVNjYWxlLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVPZmZzZXRNcywKKyAgICAgICAgICAgICAgICBudW1UcmFja3MoKSwKKyAgICAgICAgICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyk7CisgICAgfQorfQorCit2b2lkIFdlYm1Xcml0ZXI6OnJlbGVhc2UoKSB7CisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKKyAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpyZXNldCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKKyAgICBpbnQ2NF90IG1pbkR1cmF0aW9uVXMgPSAweDdmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UaHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBtU3RyZWFtc1tpXS5tVGhyZWFkLT5nZXREdXJhdGlvblVzKCk7CisgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgeworICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPCBtaW5EdXJhdGlvblVzKSB7CisgICAgICAgICAgICBtaW5EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1UcmFja3MoKSA+IDEpIHsKKyAgICAgICAgQUxPR0QoIkR1cmF0aW9uIGZyb20gdHJhY2tzIHJhbmdlIGlzIFslIiBQUklkNjQgIiwgJSIgUFJJZDY0ICJdIHVzIiwgbWluRHVyYXRpb25VcywgbWF4RHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgbVNpbmtUaHJlYWQtPnN0b3AoKTsKKworICAgIC8vIERvIG5vdCB3cml0ZSBvdXQgbW92aWUgaGVhZGVyIG9uIGVycm9yLgorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBjdWVzID0gbmV3IFdlYm1NYXN0ZXIoa01rdkN1ZXMsIG1DdWVQb2ludHMpOworICAgIHVpbnQ2NF90IGN1ZXNTaXplID0gY3Vlcy0+dG90YWxTaXplKCk7CisgICAgLy8gVFJJQ0tZIEV2ZW4gd2hlbiB0aGUgY3VlcyBkbyBmaXQgaW4gdGhlIHNwYWNlIHdlIHJlc2VydmVkLCBpZiB0aGV5IGRvIG5vdCBmaXQKKyAgICAvLyBwZXJmZWN0bHksIHdlIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoICJleHRyYSBzcGFjZSIgdG8gd3JpdGUgYW4KKyAgICAvLyBFQk1MIHZvaWQgZWxlbWVudC4KKyAgICBpZiAoY3Vlc1NpemUgIT0gbUVzdGltYXRlZEN1ZXNTaXplICYmIGN1ZXNTaXplID4gbUVzdGltYXRlZEN1ZXNTaXplIC0ga01pbkVibWxWb2lkU2l6ZSkgeworICAgICAgICBtQ3Vlc09mZnNldCA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICAgICAgOjpsc2VlayhtRmQsIG1DdWVzT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGN1ZXMtPndyaXRlKG1GZCwgY3Vlc1NpemUpOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQobUVzdGltYXRlZEN1ZXNTaXplIC0gY3Vlc1NpemUpOworICAgICAgICBzcGFjZS0+d3JpdGUobUZkLCBzcGFjZVNpemUpOworICAgIH0KKworICAgIG1DdWVQb2ludHMuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmsuY2xlYXIoKTsKKworICAgIHVpbnQ4X3QgYmFyeVtzaXplb2YodWludDY0X3QpXTsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPSA6OmxzZWVrKG1GZCwgMCwgU0VFS19FTkQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplID0gdG90YWxTaXplIC0gbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50T2Zmc2V0ICsgc2l6ZU9mKGtNa3ZTZWdtZW50KSwgU0VFS19TRVQpOworICAgIHVpbnQ2NF90IHNlZ21lbnRTaXplQ29kZWQgPSBlbmNvZGVVbnNpZ25lZChzZWdtZW50U2l6ZSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisgICAgc2VyaWFsaXplQ29kZWRVbnNpZ25lZChzZWdtZW50U2l6ZUNvZGVkLCBiYXJ5KTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZU9mKGtNa3ZVbmtub3duTGVuZ3RoKSk7CisKKyAgICB1aW50NjRfdCBzaXplOworICAgIHVpbnQ2NF90IGR1cmF0aW9uT2Zmc2V0ID0gbUluZm9PZmZzZXQgKyBzaXplT2Yoa01rdkluZm8pICsgc2l6ZU9mKG1JbmZvU2l6ZSkKKyAgICAgICAgKyBzaXplT2Yoa01rdlNlZ21lbnREdXJhdGlvbikgKyBzaXplT2Yoc2l6ZW9mKGRvdWJsZSkpOworICAgIHNwPFdlYm1FbGVtZW50PiBkdXJhdGlvbiA9IG5ldyBXZWJtRmxvYXQoCisgICAgICAgICAgICBrTWt2U2VnbWVudER1cmF0aW9uLAorICAgICAgICAgICAgKGRvdWJsZSkgKG1heER1cmF0aW9uVXMgKiAxMDAwIC8gbVRpbWVDb2RlU2NhbGUpKTsKKyAgICBkdXJhdGlvbi0+c2VyaWFsaXplUGF5bG9hZChiYXJ5KTsKKyAgICA6OmxzZWVrKG1GZCwgZHVyYXRpb25PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICA6OndyaXRlKG1GZCwgYmFyeSwgc2l6ZW9mKGRvdWJsZSkpOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBzZWVrRW50cmllczsKKyAgICBzZWVrRW50cmllcy5wdXNoX2JhY2soV2VibUVsZW1lbnQ6OlNlZWtFbnRyeShrTWt2SW5mbywgbUluZm9PZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZUcmFja3MsIG1UcmFja3NPZmZzZXQgLSBtU2VnbWVudERhdGFTdGFydCkpOworICAgIHNlZWtFbnRyaWVzLnB1c2hfYmFjayhXZWJtRWxlbWVudDo6U2Vla0VudHJ5KGtNa3ZDdWVzLCBtQ3Vlc09mZnNldCAtIG1TZWdtZW50RGF0YVN0YXJ0KSk7CisgICAgc3A8V2VibUVsZW1lbnQ+IHNlZWtIZWFkID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZWtIZWFkLCBzZWVrRW50cmllcyk7CisKKyAgICB1aW50NjRfdCBtZXRhU2Vla1NpemU7CisgICAgOjpsc2VlayhtRmQsIG1TZWdtZW50RGF0YVN0YXJ0LCBTRUVLX1NFVCk7CisgICAgc2Vla0hlYWQtPndyaXRlKG1GZCwgbWV0YVNlZWtTaXplKTsKKworICAgIHVpbnQ2NF90IHNwYWNlU2l6ZTsKKyAgICBzcDxXZWJtRWxlbWVudD4gc3BhY2UgPSBuZXcgRWJtbFZvaWQoa01heE1ldGFTZWVrU2l6ZSAtIG1ldGFTZWVrU2l6ZSk7CisgICAgc3BhY2UtPndyaXRlKG1GZCwgc3BhY2VTaXplKTsKKworICAgIHJlbGVhc2UoKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGFkZCBzb3VyY2UgQUZURVIgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQXQgbW9zdCAyIHRyYWNrcyBjYW4gYmUgc3VwcG9ydGVkLgorICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgIT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlRvbyBtYW55IHRyYWNrcyAoMikgdG8gYWRkIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7CisKKyAgICAvLyBBIHRyYWNrIG9mIHR5cGUgb3RoZXIgdGhhbiB2aWRlbyBvciBhdWRpbyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKworICAgIHNpemVfdCBzdHJlYW1JbmRleDsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpKSB7CisgICAgICAgIHN0cmVhbUluZGV4ID0ga1ZpZGVvSW5kZXg7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkpIHsKKyAgICAgICAgc3RyZWFtSW5kZXggPSBrQXVkaW9JbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCB2cDgsIHZvcmJpcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBObyBtb3JlIHRoYW4gb25lIHZpZGVvIG9yIG9uZSBhdWRpbyB0cmFjayBpcyBzdXBwb3J0ZWQuCisgICAgaWYgKG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tVHJhY2tFbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlcyB0cmFjayBhbHJlYWR5IGV4aXN0cyIsIG1TdHJlYW1zW3N0cmVhbUluZGV4XS5tTmFtZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0cmFjayBvZiBlaXRoZXIgYXVkaW8gb3IgdmlkZW8uCisgICAgLy8gR28gYWhlYWQgdG8gYWRkIHRoZSB0cmFjay4KKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubVRyYWNrRW50cnkgPSBtU3RyZWFtc1tzdHJlYW1JbmRleF0ubU1ha2VUcmFjayhzb3VyY2UtPmdldEZvcm1hdCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV2VibVdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRyYWNrRW50cnkgPT0gTlVMTAorICAgICAgICAgICAgJiYgbVN0cmVhbXNba0F1ZGlvSW5kZXhdLm1UcmFja0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIHNvdXJjZSBhZGRlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCkgeworICAgICAgICBtSXNGaWxlU2l6ZUxpbWl0RXhwbGljaXRseVJlcXVlc3RlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHBhcmFtcykgeworICAgICAgICBpbnQzMl90IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgJmlzUmVhbFRpbWVSZWNvcmRpbmcpOworICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IGlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+cmVzdW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgaW50MzJfdCB0Y3NsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJnRjc2wpKSB7CisgICAgICAgICAgICBtVGltZUNvZGVTY2FsZSA9IHRjc2w7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfR1QobVRpbWVDb2RlU2NhbGUsIDApOworICAgIEFMT0dWKCJtb3ZpZSB0aW1lIHNjYWxlOiAlIiBQUkl1NjQsIG1UaW1lQ29kZVNjYWxlKTsKKworICAgIC8qCisgICAgICogV2hlbiB0aGUgcmVxdWVzdGVkIGZpbGUgc2l6ZSBsaW1pdCBpcyBzbWFsbCwgdGhlIHByaW9yaXR5CisgICAgICogaXMgdG8gbWVldCB0aGUgZmlsZSBzaXplIGxpbWl0IHJlcXVpcmVtZW50LCByYXRoZXIgdGhhbgorICAgICAqIHRvIG1ha2UgdGhlIGZpbGUgc3RyZWFtYWJsZS4gbVN0cmVhbWFibGVGaWxlIGRvZXMgbm90IHRlbGwKKyAgICAgKiB3aGV0aGVyIHRoZSBhY3R1YWwgcmVjb3JkZWQgZmlsZSBpcyBzdHJlYW1hYmxlIG9yIG5vdC4KKyAgICAgKi8KKyAgICBtU3RyZWFtYWJsZUZpbGUgPSAoIW1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMpCisgICAgICAgIHx8IChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID49IGtNaW5TdHJlYW1hYmxlRmlsZVNpemVJbkJ5dGVzKTsKKworICAgIC8qCisgICAgICogV3JpdGUgdmFyaW91cyBtZXRhZGF0YS4KKyAgICAgKi8KKyAgICBzcDxXZWJtRWxlbWVudD4gZWJtbCwgc2VnbWVudCwgaW5mbywgc2Vla0hlYWQsIHRyYWNrcywgY3VlczsKKyAgICBlYm1sID0gV2VibUVsZW1lbnQ6OkVibWxIZWFkZXIoKTsKKyAgICBzZWdtZW50ID0gbmV3IFdlYm1NYXN0ZXIoa01rdlNlZ21lbnQpOworICAgIHNlZWtIZWFkID0gbmV3IEVibWxWb2lkKGtNYXhNZXRhU2Vla1NpemUpOworICAgIGluZm8gPSBXZWJtRWxlbWVudDo6U2VnbWVudEluZm8obVRpbWVDb2RlU2NhbGUsIDApOworCisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBjaGlsZHJlbjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldLm1UcmFja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhtU3RyZWFtc1tpXS5tVHJhY2tFbnRyeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhY2tzID0gbmV3IFdlYm1NYXN0ZXIoa01rdlRyYWNrcywgY2hpbGRyZW4pOworCisgICAgaWYgKCFtU3RyZWFtYWJsZUZpbGUpIHsKKyAgICAgICAgY3VlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlID0gLTE7CisgICAgICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUVzdGltYXRlZEN1ZXNTaXplID0gZXN0aW1hdGVDdWVzU2l6ZShiaXRSYXRlKTsKKyAgICAgICAgQ0hFQ0tfR0UobUVzdGltYXRlZEN1ZXNTaXplLCA4KTsKKyAgICAgICAgY3VlcyA9IG5ldyBFYm1sVm9pZChtRXN0aW1hdGVkQ3Vlc1NpemUpOworICAgIH0KKworICAgIHNwPFdlYm1FbGVtZW50PiBlbGVtc1tdID0geyBlYm1sLCBzZWdtZW50LCBzZWVrSGVhZCwgaW5mbywgdHJhY2tzLCBjdWVzIH07CisgICAgc2l6ZV90IG5FbGVtcyA9IHNpemVvZihlbGVtcykgLyBzaXplb2YoZWxlbXNbMF0pOworICAgIHVpbnQ2NF90IG9mZnNldHNbbkVsZW1zXTsKKyAgICB1aW50NjRfdCBzaXplc1tuRWxlbXNdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuRWxlbXM7IGkrKykgeworICAgICAgICBXZWJtRWxlbWVudCAqZSA9IGVsZW1zW2ldLmdldCgpOworICAgICAgICBpZiAoIWUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3Qgc2l6ZTsKKyAgICAgICAgb2Zmc2V0c1tpXSA9IDo6bHNlZWsobUZkLCAwLCBTRUVLX0NVUik7CisgICAgICAgIHNpemVzW2ldID0gZS0+bVNpemU7CisgICAgICAgIGUtPndyaXRlKG1GZCwgc2l6ZSk7CisgICAgfQorCisgICAgbVNlZ21lbnRPZmZzZXQgPSBvZmZzZXRzWzFdOworICAgIG1TZWdtZW50RGF0YVN0YXJ0ID0gb2Zmc2V0c1syXTsKKyAgICBtSW5mb09mZnNldCA9IG9mZnNldHNbM107CisgICAgbUluZm9TaXplID0gc2l6ZXNbM107CisgICAgbVRyYWNrc09mZnNldCA9IG9mZnNldHNbNF07CisgICAgbUN1ZXNPZmZzZXQgPSBvZmZzZXRzWzVdOworCisgICAgLy8gc3RhcnQgdGhyZWFkcworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgfQorCisgICAgaW5pdFN0cmVhbShrQXVkaW9JbmRleCk7CisgICAgaW5pdFN0cmVhbShrVmlkZW9JbmRleCk7CisKKyAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVRocmVhZC0+c3RhcnQoKTsKKyAgICBtU2lua1RocmVhZC0+c3RhcnQoKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFdlYm1Xcml0ZXI6OnBhdXNlKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW1zW2ldLm1UaHJlYWQtPnBhdXNlKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBXZWJtV3JpdGVyOjpzdG9wKCkgeworICAgIHJldHVybiByZXNldCgpOworfQorCitib29sIFdlYm1Xcml0ZXI6OnJlYWNoZWRFT1MoKSB7CisgICAgcmV0dXJuICFtU2lua1RocmVhZC0+cnVubmluZygpOworfQorfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI2OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdFQk1XUklURVJfSF8KKyNkZWZpbmUgV0VCTVdSSVRFUl9IXworCisjaW5jbHVkZSAiV2VibUNvbnN0YW50cy5oIgorI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgorI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSB3ZWJtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFdlYm1Xcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgeworcHVibGljOgorICAgIFdlYm1Xcml0ZXIoaW50IGZkKTsKKyAgICBXZWJtV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICB+V2VibVdyaXRlcigpIHsgcmVzZXQoKTsgfQorCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgbXMpIHsgbVN0YXJ0VGltZU9mZnNldE1zID0gbXM7IH0KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U3RhcnRUaW1lT2Zmc2V0TXMoKSBjb25zdCB7IHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0TXM7IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICB1aW50NjRfdCBtVGltZUNvZGVTY2FsZTsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworICAgIGludDMyX3QgbVN0YXJ0VGltZU9mZnNldE1zOworCisgICAgdWludDY0X3QgbVNlZ21lbnRPZmZzZXQ7CisgICAgdWludDY0X3QgbVNlZ21lbnREYXRhU3RhcnQ7CisgICAgdWludDY0X3QgbUluZm9PZmZzZXQ7CisgICAgdWludDY0X3QgbUluZm9TaXplOworICAgIHVpbnQ2NF90IG1UcmFja3NPZmZzZXQ7CisgICAgdWludDY0X3QgbUN1ZXNPZmZzZXQ7CisKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1Jc0ZpbGVTaXplTGltaXRFeHBsaWNpdGx5UmVxdWVzdGVkOworICAgIGJvb2wgbUlzUmVhbFRpbWVSZWNvcmRpbmc7CisgICAgYm9vbCBtU3RyZWFtYWJsZUZpbGU7CisgICAgdWludDY0X3QgbUVzdGltYXRlZEN1ZXNTaXplOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiBtQ3VlUG9pbnRzOworCisgICAgZW51bSB7CisgICAgICAgIGtBdWRpb0luZGV4ICAgICA9ICAwLAorICAgICAgICBrVmlkZW9JbmRleCAgICAgPSAgMSwKKyAgICAgICAga01heFN0cmVhbXMgICAgID0gIDIsCisgICAgfTsKKworICAgIHN0cnVjdCBXZWJtU3RyZWFtIHsKKyAgICAgICAgaW50IG1UeXBlOworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+ICgqbU1ha2VUcmFjaykoY29uc3Qgc3A8TWV0YURhdGE+Jik7CisKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBtVHJhY2tFbnRyeTsKKyAgICAgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBtVGhyZWFkOworICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiBtU2luazsKKworICAgICAgICBXZWJtU3RyZWFtKCkKKyAgICAgICAgICAgIDogbVR5cGUoa0ludmFsaWRUeXBlKSwKKyAgICAgICAgICAgICAgbU5hbWUoIkludmFsaWQiKSwKKyAgICAgICAgICAgICAgbU1ha2VUcmFjayhOVUxMKSB7CisgICAgICAgIH0KKworICAgICAgICBXZWJtU3RyZWFtKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCBzcDxXZWJtRWxlbWVudD4gKCptYWtlVHJhY2spKGNvbnN0IHNwPE1ldGFEYXRhPiYpKQorICAgICAgICAgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgICAgICAgICAgbU5hbWUobmFtZSksCisgICAgICAgICAgICAgIG1NYWtlVHJhY2sobWFrZVRyYWNrKSB7CisgICAgICAgIH0KKworICAgICAgICBXZWJtU3RyZWFtICZvcGVyYXRvcj0oY29uc3QgV2VibVN0cmVhbSAmb3RoZXIpIHsKKyAgICAgICAgICAgIG1UeXBlID0gb3RoZXIubVR5cGU7CisgICAgICAgICAgICBtTmFtZSA9IG90aGVyLm1OYW1lOworICAgICAgICAgICAgbU1ha2VUcmFjayA9IG90aGVyLm1NYWtlVHJhY2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICB9OworICAgIFdlYm1TdHJlYW0gbVN0cmVhbXNba01heFN0cmVhbXNdOworCisgICAgc3A8V2VibUZyYW1lU2lua1RocmVhZD4gbVNpbmtUaHJlYWQ7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzKCk7CisgICAgdWludDY0X3QgZXN0aW1hdGVDdWVzU2l6ZShpbnQzMl90IGJpdFJhdGUpOworICAgIHZvaWQgaW5pdFN0cmVhbShzaXplX3QgaWR4KTsKKyAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICBzdGF0dXNfdCByZXNldCgpOworCisgICAgc3RhdGljIHNwPFdlYm1FbGVtZW50PiB2aWRlb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpOworICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gYXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdlYm1Xcml0ZXIpOworfTsKKworfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLworI2VuZGlmIC8qIFdFQk1XUklURVJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcAppbmRleCAxODg3YjhiLi5lODhhM2JkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuY3BwCkBAIC02ODUsOSArNjg1LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFJUUFNlbmRlcjo6cGFyc2VSZWNlaXZlclJlcG9ydChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIC8vIGhleGR1bXAoZGF0YSwgc2l6ZSk7Ci0KK3N0YXR1c190IFJUUFNlbmRlcjo6cGFyc2VSZWNlaXZlclJlcG9ydCgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBmbG9hdCBmcmFjdGlvbkxvc3QgPSBkYXRhWzEyXSAvIDI1Ni4wZjsKIAogICAgIEFMT0dJKCJsb3N0ICUuMmYgJSUgb2YgcGFja2V0cyBkdXJpbmcgcmVwb3J0IGludGVydmFsLiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL0NvbnZlcnRlci5jcHAKaW5kZXggNzUzYjNlYy4uMjgzNGE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcApAQCAtNzQsMTkgKzc0LDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgewotICAgIHZvaWQgKm1idWY7Ci0gICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1idWYpCi0gICAgICAgICAgICAmJiBtYnVmICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2luZyBtYnVmICVwIiwgbWJ1Zik7Ci0KLSAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIE5VTEwpOwotCi0gICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVyICo+KG1idWYpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1idWYgPSBOVUxMOwotICAgIH0KLX0KLQogdm9pZCBDb252ZXJ0ZXI6OnJlbGVhc2VFbmNvZGVyKCkgewogICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTk1LDE4ICs4Miw3IEBACiAgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKICAgICBtRW5jb2Rlci5jbGVhcigpOwogCi0gICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSAqbUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKLSAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuZXJhc2UobUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7Ci0KLSAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG1FbmNvZGVySW5wdXRCdWZmZXJzLml0ZW1BdChpKTsKLSAgICAgICAgUmVsZWFzZU1lZGlhQnVmZmVyUmVmZXJlbmNlKGFjY2Vzc1VuaXQpOwotICAgIH0KLQorICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKIH0KQEAgLTMyOCw3ICszMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImFjY2Vzc1VuaXQiLCAmYWNjZXNzVW5pdCkpOwogCi0gICAgICAgICAgICAgICAgICAgIFJlbGVhc2VNZWRpYUJ1ZmZlclJlZmVyZW5jZShhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTM1MSwxNSArMzI3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZHJvcHBpbmcgZnJhbWUuIik7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBSZWxlYXNlTWVkaWFCdWZmZXJSZWZlcmVuY2UoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAjaWYgMAotICAgICAgICAgICAgICAgIHZvaWQgKm1idWY7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1idWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9CisgICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShhY2Nlc3NVbml0LT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgbWJ1ZiAlcCIsIG1idWYpOworICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogI2VuZGlmCiAKQEAgLTY0NywxMyArNjI0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgICAgICAgICB2b2lkICptZWRpYUJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgJm1lZGlhQnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAmJiBtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+bWV0YSgpCi0gICAgICAgICAgICAgICAgICAgIC0+c2V0UG9pbnRlcigibWVkaWFCdWZmZXIiLCBtZWRpYUJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPQorICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKKyAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+c2V0TWVkaWFCdWZmZXJCYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXIpOwogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldFBvaW50ZXIoIm1lZGlhQnVmZmVyIiwgTlVMTCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKaW5kZXggN2U4ODkxZC4uODZiOTE4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9NZWRpYVB1bGxlci5jcHAKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvIGVuY29kZXIgd2lsbCByZWxlYXNlIE1lZGlhQnVmZmVyIHdoZW4gZG9uZQogICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRQb2ludGVyKCJtZWRpYUJ1ZmZlciIsIG1idWYpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UobWJ1Zik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCmluZGV4IDI4NmVhMTMuLjJjYjQ3ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTc0OSw3ICs3NTAsOCBAQAogCiAgICAgbUV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtTWVkaWFQYXRoLmNfc3RyKCkpOworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoCisgICAgICAgICAgICBOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBtTWVkaWFQYXRoLmNfc3RyKCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTA1Myw3ICsxMDU1LDcgQEAKICAgICBlcnIgPSBzb3VyY2UtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobnVtSW5wdXRCdWZmZXJzKTsKICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKLSAgICBtQnVmZmVyUXVldWUgPSBzb3VyY2UtPmdldEJ1ZmZlclF1ZXVlKCk7CisgICAgbVByb2R1Y2VyID0gc291cmNlLT5nZXRQcm9kdWNlcigpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTA3Nyw3ICsxMDc5LDcgQEAKIH0KIAogc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6Z2V0U3VyZmFjZVRleHR1cmUoKSB7Ci0gICAgcmV0dXJuIG1CdWZmZXJRdWV1ZTsKKyAgICByZXR1cm4gbVByb2R1Y2VyOwogfQogCiB2b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OnJlcXVlc3RJRFJGcmFtZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1BsYXliYWNrU2Vzc2lvbi5oCmluZGV4IDVjOGVlOTQuLjI4MjQxNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaApAQCAtMjUsNyArMjUsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBCdWZmZXJRdWV1ZTsKIHN0cnVjdCBJSERDUDsKIHN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogc3RydWN0IE1lZGlhUHVsbGVyOwpAQCAtMTExLDcgKzExMCw3IEBACiAKICAgICBpbnQ2NF90IG1MYXN0TGlmZXNpZ25VczsKIAotICAgIHNwPEJ1ZmZlclF1ZXVlPiBtQnVmZmVyUXVldWU7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogCiAgICAgS2V5ZWRWZWN0b3I8c2l6ZV90LCBzcDxUcmFjaz4gPiBtVHJhY2tzOwogICAgIHNzaXplX3QgbVZpZGVvVHJhY2tJbmRleDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKaW5kZXggY2M4ZGVlMy4uNTlkN2U2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKQEAgLTc5LDYgKzc5LDggQEAKIAogICAgIEFMT0dWKCJzdG9wcGluZyIpOwogCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOworCiAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgewogICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CiAgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKQEAgLTkyLDcgKzk0LDYgQEAKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgfQogCi0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RvcCgpOwogCiAgICAgQUxPR1YoInN0b3BwZWQiKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCmluZGV4IGVlYjM3MDAuLjUwZDMxN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKQEAgLTU2NSw3ICs1NjUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gc2l6ZV90IG51bVBhZGRpbmdCeXRlcyA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkIC0gbnVtQnl0ZXNPZlBheWxvYWQ7CisgICAgICAgIHNpemVfdCBudW1QYWRkaW5nQnl0ZXMgPSBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCAtIG51bUJ5dGVzT2ZQYXlsb2FkOwogICAgICAgICBBTE9HVigicGFja2V0IDEgY29udGFpbnMgJXpkIHBhZGRpbmcgYnl0ZXMgYW5kICV6ZCBieXRlcyBvZiBwYXlsb2FkIiwKICAgICAgICAgICAgICAgbnVtUGFkZGluZ0J5dGVzLCBudW1CeXRlc09mUGF5bG9hZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKaW5kZXggMDVlNDAxOC4uZGE0MDVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKQEAgLTc0Niw3ICs3NDYsNyBAQAogfQogCiBzdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTFSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSUQgKi8sIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IHN0YXR1c0NvZGU7CiAgICAgaWYgKCFtc2ctPmdldFN0YXR1c0NvZGUoJnN0YXR1c0NvZGUpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC05OTEsNyArOTkxLDcgQEAKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU01UmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIGludDMyX3QgLyogc2Vzc2lvbklEICovLCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBzdGF0dXNDb2RlOwogICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtMTAwNSw3ICsxMDA1LDcgQEAKIH0KIAogc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU0xNlJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgeworICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKICAgICAvLyBJZiBvbmx5IHRoZSByZXNwb25zZSB3YXMgcmVxdWlyZWQgdG8gaW5jbHVkZSBhICJTZXNzaW9uOiIgaGVhZGVyLi4uCiAKICAgICBDSEVDS19FUShzZXNzaW9uSUQsIG1DbGllbnRTZXNzaW9uSUQpOwpAQCAtMTY4MCw3ICsxNjgwLDcgQEAKIH0KIAogdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6SERDUE9ic2VydmVyOjpub3RpZnkoCi0gICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKKyAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKiAvKiBvYmogKi8pIHsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigibXNnIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCmluZGV4IGIzZjdiMWIuLmJiODZkZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rCkBAIC0xMiw1ICsxMiw3IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF95dXYKIAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IDdiOTAwMGIuLmJiM2UyZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMjI2LDggKzIyNiw4IEBACiAgICAgICAgICAgICAmeVNyY09mZnNldEluY3JlbWVudCwgJnVTcmNPZmZzZXRJbmNyZW1lbnQsICZ2U3JjT2Zmc2V0SW5jcmVtZW50KTsKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7Ci0gICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdURlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIGludDMyX3QgeURlc3RPZmZzZXRJbmNyZW1lbnQ7CiAgICAgaW50MzJfdCB1RGVzdE9mZnNldEluY3JlbWVudDsKLSAgICBpbnQzMl90IHZEZXN0T2Zmc2V0SW5jcmVtZW50OworICAgIGludDMyX3QgdkRlc3RPZmZzZXRJbmNyZW1lbnQgPSAwOwogICAgIGRlc3RJbWFnZS5nZXRPZmZzZXRJbmNyZW1lbnRzUGVyRGF0YVJvdygKICAgICAgICAgICAgICZ5RGVzdE9mZnNldEluY3JlbWVudCwgJnVEZXN0T2Zmc2V0SW5jcmVtZW50LCAmdkRlc3RPZmZzZXRJbmNyZW1lbnQpOwogCkBAIC0zOTMsOSArMzkzLDkgQEAKICAgICBmcHJpbnRmKGZwLCAiMjU1XG4iKTsKICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtSGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbVdpZHRoOyArK3gpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlOwotICAgICAgICAgICAgdWludDhfdCB1VmFsdWU7Ci0gICAgICAgICAgICB1aW50OF90IHZWYWx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeVZhbHVlID0gMHU7CisgICAgICAgICAgICB1aW50OF90IHVWYWx1ZSA9IDB1OworICAgICAgICAgICAgdWludDhfdCB2VmFsdWUgPSAwdTsKICAgICAgICAgICAgIGdldFBpeGVsVmFsdWUoeCwgeSwgJnlWYWx1ZSwgJnVWYWx1ZSwgJiB2VmFsdWUpOwogCiAgICAgICAgICAgICB1aW50OF90IHJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCmluZGV4IGI0MTdiYWQuLmIwMjBjOTggMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMTUsNiArMTUsOCBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAorCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCisJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCiAJbGliY3V0aWxzIFwKQEAgLTIzLDcgKzI1LDggQEAKIAlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAotCWxpYmJpbmRlcgorCWxpYmJpbmRlciBcCisJbGlic291bmR0cmlnZ2Vyc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKIAlsaWJyZWdpc3Rlcm1zZXh0CkBAIC0zMyw4ICszNiwxMiBAQAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2cgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIKIAogTE9DQUxfTU9EVUxFOj0gbWVkaWFzZXJ2ZXIKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IGUzZmQ0ZGIuLmEyODlmYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiTWVkaWFVdGlscy5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtMTM0LDYgKzEzNSw3IEBACiAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQ2FtZXJhU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOworICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIHJlZ2lzdGVyRXh0ZW5zaW9ucygpOwogICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvQW5kcm9pZC5tayBiL21lZGlhL210cC9BbmRyb2lkLm1rCmluZGV4IGFjNjA4YTEuLjNhZjA5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL210cC9BbmRyb2lkLm1rCkBAIC0zOSw5ICszOSw2IEBACiAKIExPQ0FMX0NGTEFHUyA6PSAtRE1UUF9ERVZJQ0UgLURNVFBfSE9TVAogCi0jIE5lZWRlZCBmb3IgPGJpb25pY190aW1lLmg+Ci1MT0NBTF9DX0lOQ0xVREVTIDo9IGJpb25pYy9saWJjL3ByaXZhdGUKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ1dGlscyBsaWJjdXRpbHMgbGlibG9nIGxpYnVzYmhvc3QgbGliYmluZGVyCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAppbmRleCBjNGY4N2EwLi5lNmUxOWUzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKKysrIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCkBAIC0zNjMsNyArMzYzLDcgQEAKIH0KIAogaW50IE10cERhdGFQYWNrZXQ6OndyaXRlRGF0YShpbnQgZmQsIHZvaWQqIGRhdGEsIHVpbnQzMl90IGxlbmd0aCkgewotICAgIGFsbG9jYXRlKGxlbmd0aCk7CisgICAgYWxsb2NhdGUobGVuZ3RoICsgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CiAgICAgbWVtY3B5KG1CdWZmZXIgKyBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFLCBkYXRhLCBsZW5ndGgpOwogICAgIGxlbmd0aCArPSBNVFBfQ09OVEFJTkVSX0hFQURFUl9TSVpFOwogICAgIE10cFBhY2tldDo6cHV0VUludDMyKE1UUF9DT05UQUlORVJfTEVOR1RIX09GRlNFVCwgbGVuZ3RoKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKaW5kZXggZDY3MmRmZi4uZDZkNWRkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERldmljZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5jcHAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCiBNdHBEZXZpY2U6On5NdHBEZXZpY2UoKSB7CiAgICAgY2xvc2UoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1EZXZpY2VQcm9wZXJ0aWVzLnNpemUoKTsgaSsrKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURldmljZVByb3BlcnRpZXMuc2l6ZSgpOyBpKyspCiAgICAgICAgIGRlbGV0ZSBtRGV2aWNlUHJvcGVydGllc1tpXTsKICAgICB1c2JfcmVxdWVzdF9mcmVlKG1SZXF1ZXN0SW4xKTsKICAgICB1c2JfcmVxdWVzdF9mcmVlKG1SZXF1ZXN0SW4yKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgICAgICAgICAgQUxPR0koIioqKiBGT1JNQVQ6ICVzXG4iLCBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSk7CiAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIHByb3BzID0gZ2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoZm9ybWF0KTsKICAgICAgICAgICAgIGlmIChwcm9wcykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvcHMtPnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwcm9wcy0+c2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcCA9ICgqcHJvcHMpW2pdOwogICAgICAgICAgICAgICAgICAgICBNdHBQcm9wZXJ0eSogcHJvcGVydHkgPSBnZXRPYmplY3RQcm9wRGVzYyhwcm9wLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCmluZGV4IDY0ZGQ0NWIuLmM1MDA5MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcApAQCAtMTYsNiArMTYsOCBAQAogCiAjZGVmaW5lIExPR19UQUcgIk10cFByb3BlcnR5IgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwRGVidWcuaCIKICNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgpAQCAtMTg5LDkgKzE5MSw5IEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlUHJvcCkKICAgICAgICAgICAgICAgICB3cml0ZVZhbHVlKHBhY2tldCwgbUN1cnJlbnRWYWx1ZSk7CiAgICAgfQotICAgIHBhY2tldC5wdXRVSW50MzIobUdyb3VwQ29kZSk7CiAgICAgaWYgKCFkZXZpY2VQcm9wKQotICAgICAgICBwYWNrZXQucHV0VUludDgobUZvcm1GbGFnKTsKKyAgICAgICAgcGFja2V0LnB1dFVJbnQzMihtR3JvdXBDb2RlKTsKKyAgICBwYWNrZXQucHV0VUludDgobUZvcm1GbGFnKTsKICAgICBpZiAobUZvcm1GbGFnID09IGtGb3JtUmFuZ2UpIHsKICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWluaW11bVZhbHVlKTsKICAgICAgICAgICAgIHdyaXRlVmFsdWUocGFja2V0LCBtTWF4aW11bVZhbHVlKTsKQEAgLTM4NSwxMCArMzg3LDEwIEBACiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlZCIsIHZhbHVlLnUudTMyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDY0OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWxsZCIsIHZhbHVlLnUuaTY0KTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUiIFBSSWQ2NCwgdmFsdWUudS5pNjQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDY0OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWxsZCIsIHZhbHVlLnUudTY0KTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUiIFBSSXU2NCwgdmFsdWUudS51NjQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMTI4OgogICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJTA4WCUwOFglMDhYJTA4WCIsIHZhbHVlLnUuaTEyOFswXSwgdmFsdWUudS5pMTI4WzFdLApAQCAtNTE3LDggKzUxOSwxNCBAQAogCiBNdHBQcm9wZXJ0eVZhbHVlKiBNdHBQcm9wZXJ0eTo6cmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgaW50JiBsZW5ndGgpIHsKICAgICBsZW5ndGggPSBwYWNrZXQuZ2V0VUludDMyKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIC8vIEZhaWwgaWYgcmVzdWx0aW5nIGFycmF5IGlzIG92ZXIgMkdCLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBtYXhpbXVtIGFycmF5CisgICAgLy8gc2l6ZSBtYXkgYmUgbGVzcyB0aGFuIFNJWkVfTUFYIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgIGlmICggQ0NfVU5MSUtFTFkoCisgICAgICAgICAgICBsZW5ndGggPT0gMCB8fAorICAgICAgICAgICAgbGVuZ3RoID49IElOVDMyX01BWCAvIHNpemVvZihNdHBQcm9wZXJ0eVZhbHVlKSkgKSB7CisgICAgICAgIGxlbmd0aCA9IDA7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBNdHBQcm9wZXJ0eVZhbHVlKiByZXN1bHQgPSBuZXcgTXRwUHJvcGVydHlWYWx1ZVtsZW5ndGhdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCiAgICAgICAgIHJlYWRWYWx1ZShwYWNrZXQsIHJlc3VsdFtpXSk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IGRmODdkYjQuLmFhNDM5NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgpAQCAtOTMsNiArOTQsNyBAQAogICAgIE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwKICAgICBNVFBfRVZFTlRfU1RPUkVfQURERUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsCisgICAgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQsCiB9OwogCiBNdHBTZXJ2ZXI6Ok10cFNlcnZlcihpbnQgZmQsIE10cERhdGFiYXNlKiBkYXRhYmFzZSwgYm9vbCBwdHAsCkBAIC0xMjQsNyArMTI2LDcgQEAKIHZvaWQgTXRwU2VydmVyOjpyZW1vdmVTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1TdG9yYWdlc1tpXSA9PSBzdG9yYWdlKSB7CiAgICAgICAgICAgICBtU3RvcmFnZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpKTsKQEAgLTEzNiw3ICsxMzgsNyBAQAogTXRwU3RvcmFnZSogTXRwU2VydmVyOjpnZXRTdG9yYWdlKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIGlmIChpZCA9PSAwKQogICAgICAgICByZXR1cm4gbVN0b3JhZ2VzWzBdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN0b3JhZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG1TdG9yYWdlc1tpXTsKICAgICAgICAgaWYgKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpID09IGlkKQogICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2U7CkBAIC0yNjEsNiArMjYzLDExIEBACiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELCBpZCk7CiB9CiAKK3ZvaWQgTXRwU2VydmVyOjpzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgQUxPR1YoInNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQgJWRcbiIsIHByb3BlcnR5KTsKKyAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQsIHByb3BlcnR5KTsKK30KKwogdm9pZCBNdHBTZXJ2ZXI6OnNlbmRFdmVudChNdHBFdmVudENvZGUgY29kZSwgdWludDMyX3QgcGFyYW0xKSB7CiAgICAgaWYgKG1TZXNzaW9uT3BlbikgewogICAgICAgICBtRXZlbnQuc2V0RXZlbnRDb2RlKGNvZGUpOwpAQCAtMzE4LDYgKzMyNSwxNCBAQAogICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOwogICAgIH0KIAorICAgIGludCBjb250YWluZXJ0eXBlID0gbVJlcXVlc3QuZ2V0Q29udGFpbmVyVHlwZSgpOworICAgIGlmIChjb250YWluZXJ0eXBlICE9IE1UUF9DT05UQUlORVJfVFlQRV9DT01NQU5EKSB7CisgICAgICAgIEFMT0dFKCJ3cm9uZyBjb250YWluZXIgdHlwZSAlZCIsIGNvbnRhaW5lcnR5cGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoImdvdCBjb21tYW5kICVzICgleCkiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSwgb3BlcmF0aW9uKTsKKwogICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7CiAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfREVWSUNFX0lORk86CiAgICAgICAgICAgICByZXNwb25zZSA9IGRvR2V0RGV2aWNlSW5mbygpOwpAQCAtNDA4LDcgKzQyMyw4IEBACiAgICAgICAgICAgICByZXNwb25zZSA9IGRvRW5kRWRpdE9iamVjdCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiZ290IHVuc3VwcG9ydGVkIGNvbW1hbmQgJXMiLCBNdHBEZWJ1Zzo6Z2V0T3BlcmF0aW9uQ29kZU5hbWUob3BlcmF0aW9uKSk7CisgICAgICAgICAgICBBTE9HRSgiZ290IHVuc3VwcG9ydGVkIGNvbW1hbmQgJXMgKCV4KSIsCisgICAgICAgICAgICAgICAgICAgIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOwogICAgICAgICAgICAgcmVzcG9uc2UgPSBNVFBfUkVTUE9OU0VfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC03ODYsNyArODAyLDcgQEAKICAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIHBhdGhCdWYsIGZpbGVMZW5ndGgsIGZvcm1hdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCiAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGZpbGVMZW5ndGgpCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+ICh1aW50NjRfdClmaWxlTGVuZ3RoKQogICAgICAgICBsZW5ndGggPSBmaWxlTGVuZ3RoIC0gb2Zmc2V0OwogCiAgICAgY29uc3QgY2hhciogZmlsZVBhdGggPSAoY29uc3QgY2hhciAqKXBhdGhCdWY7CkBAIC05NDMsMjIgKzk1OSwyOCBAQAogICAgIGZjaG1vZChtZnIuZmQsIG1GaWxlUGVybWlzc2lvbik7CiAgICAgdW1hc2sobWFzayk7CiAKLSAgICBpZiAoaW5pdGlhbERhdGEgPiAwKQorICAgIGlmIChpbml0aWFsRGF0YSA+IDApIHsKICAgICAgICAgcmV0ID0gd3JpdGUobWZyLmZkLCBtRGF0YS5nZXREYXRhKCksIGluaXRpYWxEYXRhKTsKKyAgICB9CiAKLSAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhID4gMCkgewotICAgICAgICBtZnIub2Zmc2V0ID0gaW5pdGlhbERhdGE7Ci0gICAgICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID09IDB4RkZGRkZGRkYpIHsKLSAgICAgICAgICAgIC8vIHRlbGwgZHJpdmVyIHRvIHJlYWQgdW50aWwgaXQgcmVjZWl2ZXMgYSBzaG9ydCBwYWNrZXQKLSAgICAgICAgICAgIG1mci5sZW5ndGggPSAweEZGRkZGRkZGOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHdyaXRlIGluaXRpYWwgZGF0YSIpOworICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVNlbmRPYmplY3RGaWxlU2l6ZSAtIGluaXRpYWxEYXRhID4gMCkgeworICAgICAgICAgICAgbWZyLm9mZnNldCA9IGluaXRpYWxEYXRhOworICAgICAgICAgICAgaWYgKG1TZW5kT2JqZWN0RmlsZVNpemUgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgICAgIC8vIHRlbGwgZHJpdmVyIHRvIHJlYWQgdW50aWwgaXQgcmVjZWl2ZXMgYSBzaG9ydCBwYWNrZXQKKyAgICAgICAgICAgICAgICBtZnIubGVuZ3RoID0gMHhGRkZGRkZGRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWZyLmxlbmd0aCA9IG1TZW5kT2JqZWN0RmlsZVNpemUgLSBpbml0aWFsRGF0YTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInJlY2VpdmluZyAlc1xuIiwgKGNvbnN0IGNoYXIgKiltU2VuZE9iamVjdEZpbGVQYXRoKTsKKyAgICAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCisgICAgICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOworICAgICAgICAgICAgQUxPR1YoIk1UUF9SRUNFSVZFX0ZJTEUgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAgICAgICAgIH0KLQotICAgICAgICBBTE9HVigicmVjZWl2aW5nICVzXG4iLCAoY29uc3QgY2hhciAqKW1TZW5kT2JqZWN0RmlsZVBhdGgpOwotICAgICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQotICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOwotICAgICAgICBBTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZFxuIiwgcmV0KTsKICAgICB9CiAgICAgY2xvc2UobWZyLmZkKTsKIApAQCAtOTgzLDcgKzEwMDUsNyBAQAogCiBzdGF0aWMgdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCkgewogICAgIGNoYXIgcGF0aGJ1ZltQQVRIX01BWF07Ci0gICAgaW50IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CisgICAgc2l6ZV90IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7CiAgICAgaWYgKHBhdGhMZW5ndGggPj0gc2l6ZW9mKHBhdGhidWYpIC0gMSkgewogICAgICAgICBBTE9HRSgicGF0aCB0b28gbG9uZzogJXNcbiIsIHBhdGgpOwogICAgIH0KQEAgLTExMDUsMTIgKzExMjcsMTMgQEAKIAogICAgIC8vIGNhbid0IHN0YXJ0IHdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiAgICAgaWYgKG9mZnNldCA+IGVkaXQtPm1TaXplKSB7Ci0gICAgICAgIEFMT0dEKCJ3cml0aW5nIHBhc3QgZW5kIG9mIG9iamVjdCwgb2Zmc2V0OiAlbGxkLCBlZGl0LT5tU2l6ZTogJWxsZCIsIG9mZnNldCwgZWRpdC0+bVNpemUpOworICAgICAgICBBTE9HRCgid3JpdGluZyBwYXN0IGVuZCBvZiBvYmplY3QsIG9mZnNldDogJSIgUFJJdTY0ICIsIGVkaXQtPm1TaXplOiAlIiBQUkl1NjQsCisgICAgICAgICAgICBvZmZzZXQsIGVkaXQtPm1TaXplKTsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KIAogICAgIGNvbnN0IGNoYXIqIGZpbGVQYXRoID0gKGNvbnN0IGNoYXIgKillZGl0LT5tUGF0aDsKLSAgICBBTE9HVigicmVjZWl2aW5nIHBhcnRpYWwgJXMgJWxsZCAlbGxkXG4iLCBmaWxlUGF0aCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIEFMT0dWKCJyZWNlaXZpbmcgcGFydGlhbCAlcyAlIiBQUkl1NjQgIiAlIiBQUkl1MzIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CiAKICAgICAvLyByZWFkIHRoZSBoZWFkZXIsIGFuZCBwb3NzaWJseSBzb21lIGRhdGEKICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChtRkQpOwpAQCAtMTEyNCwxNSArMTE0NywxOSBAQAogICAgICAgICBsZW5ndGggLT0gaW5pdGlhbERhdGE7CiAgICAgfQogCi0gICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKLSAgICAgICAgbWZyLmZkID0gZWRpdC0+bUZEOwotICAgICAgICBtZnIub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBkYXRhIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG10cF9maWxlX3JhbmdlICBtZnI7CisgICAgICAgICAgICBtZnIuZmQgPSBlZGl0LT5tRkQ7CisgICAgICAgICAgICBtZnIub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgbWZyLmxlbmd0aCA9IGxlbmd0aDsKIAotICAgICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQotICAgICAgICByZXQgPSBpb2N0bChtRkQsIE1UUF9SRUNFSVZFX0ZJTEUsICh1bnNpZ25lZCBsb25nKSZtZnIpOwotICAgICAgICBBTE9HVigiTVRQX1JFQ0VJVkVfRklMRSByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgICAgICAgICAvLyB0cmFuc2ZlciB0aGUgZmlsZQorICAgICAgICAgICAgcmV0ID0gaW9jdGwobUZELCBNVFBfUkVDRUlWRV9GSUxFLCAodW5zaWduZWQgbG9uZykmbWZyKTsKKyAgICAgICAgICAgIEFMT0dWKCJNVFBfUkVDRUlWRV9GSUxFIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDEsIDApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCmluZGV4IGRmYTgyNTguLmIzYTExZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTEwNCw2ICsxMDQsNyBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOwogCiBwcml2YXRlOgogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZFN0b3JlQWRkZWQoTXRwU3RvcmFnZUlEIGlkKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZUluZm8uY3BwCmluZGV4IGRjZDM3Y2QuLjJiMWE5YWUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTdG9yYWdlSW5mby5jcHAKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2VJbmZvLmNwcApAQCAtMTYsNiArMTYsOCBAQAogCiAjZGVmaW5lIExPR19UQUcgIk10cFN0b3JhZ2VJbmZvIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgogI2luY2x1ZGUgIk10cFN0b3JhZ2VJbmZvLmgiCkBAIC02Myw3ICs2NSw3IEBACiB2b2lkIE10cFN0b3JhZ2VJbmZvOjpwcmludCgpIHsKICAgICBBTE9HRCgiU3RvcmFnZSBJbmZvICUwOFg6XG5cdG1TdG9yYWdlVHlwZTogJWRcblx0bUZpbGVTeXN0ZW1UeXBlOiAlZFxuXHRtQWNjZXNzQ2FwYWJpbGl0eTogJWRcbiIsCiAgICAgICAgICAgICBtU3RvcmFnZUlELCBtU3RvcmFnZVR5cGUsIG1GaWxlU3lzdGVtVHlwZSwgbUFjY2Vzc0NhcGFiaWxpdHkpOwotICAgIEFMT0dEKCJcdG1NYXhDYXBhY2l0eTogJWxsZFxuXHRtRnJlZVNwYWNlQnl0ZXM6ICVsbGRcblx0bUZyZWVTcGFjZU9iamVjdHM6ICVkXG4iLAorICAgIEFMT0dEKCJcdG1NYXhDYXBhY2l0eTogJSIgUFJJdTY0ICJcblx0bUZyZWVTcGFjZUJ5dGVzOiAlIiBQUkl1NjQgIlxuXHRtRnJlZVNwYWNlT2JqZWN0czogJWRcbiIsCiAgICAgICAgICAgICBtTWF4Q2FwYWNpdHksIG1GcmVlU3BhY2VCeXRlcywgbUZyZWVTcGFjZU9iamVjdHMpOwogICAgIEFMT0dEKCJcdG1TdG9yYWdlRGVzY3JpcHRpb246ICVzXG5cdG1Wb2x1bWVJZGVudGlmaWVyOiAlc1xuIiwKICAgICAgICAgICAgIG1TdG9yYWdlRGVzY3JpcHRpb24sIG1Wb2x1bWVJZGVudGlmaWVyKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBVdGlscy5jcHAgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCmluZGV4IDZlYzg4NzYuLjA2NjdiZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBVdGlscy5jcHAKKysrIGIvbWVkaWEvbXRwL010cFV0aWxzLmNwcApAQCAtMTksNyArMTksOCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCi0jaW5jbHVkZSA8Y3V0aWxzL3R6dGltZS5oPgorI2luY2x1ZGUgPC4uL3ByaXZhdGUvYmlvbmljX3RpbWUuaD4gLyogVE9ETzogc3dpdGNoIHRoaXMgY29kZSB0byBpY3U0YyEgKi8KKwogI2luY2x1ZGUgIk10cFV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLm1rIGIvbWVkaWEvbmRrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3OTVjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSwgdHJ1ZSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYUNyeXB0by5jcHAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhRXh0cmFjdG9yLmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgTmRrTWVkaWFGb3JtYXQuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOZGtNZWRpYU11eGVyLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5ka01lZGlhRHJtLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYW5kaworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBiaW9uaWMvbGliYy9wcml2YXRlIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkgXAorICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZS9uZGsKKworTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLUQgRVhQT1JUPSdfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpJworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisgICAgbGlibG9nIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYW5kcm9pZF9ydW50aW1lIFwKKyAgICBsaWJiaW5kZXIgXAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMGI3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhQ29kZWMiCisKKyNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvUHJpdi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gLUVBR0FJTikgeworICAgICAgICByZXR1cm4gKG1lZGlhX3N0YXR1c190KSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUjsKKyAgICB9CisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK2VudW0geworICAgIGtXaGF0QWN0aXZpdHlOb3RpZnksCisgICAga1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb25zLAorICAgIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKK307CisKKworY2xhc3MgQ29kZWNIYW5kbGVyOiBwdWJsaWMgQUhhbmRsZXIgeworcHJpdmF0ZToKKyAgICBBTWVkaWFDb2RlYyogbUNvZGVjOworcHVibGljOgorICAgIENvZGVjSGFuZGxlcihBTWVkaWFDb2RlYyAqY29kZWMpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Cit9OworCit0eXBlZGVmIHZvaWQgKCpPbkNvZGVjRXZlbnQpKEFNZWRpYUNvZGVjICpjb2RlYywgdm9pZCAqdXNlcmRhdGEpOworCitzdHJ1Y3QgQU1lZGlhQ29kZWMgeworICAgIHNwPGFuZHJvaWQ6Ok1lZGlhQ29kZWM+IG1Db2RlYzsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPENvZGVjSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QU1lc3NhZ2U+IG1BY3Rpdml0eU5vdGlmaWNhdGlvbjsKKyAgICBpbnQzMl90IG1HZW5lcmF0aW9uOworICAgIGJvb2wgbVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uOworICAgIE9uQ29kZWNFdmVudCBtQ2FsbGJhY2s7CisgICAgdm9pZCAqbUNhbGxiYWNrVXNlckRhdGE7Cit9OworCitDb2RlY0hhbmRsZXI6OkNvZGVjSGFuZGxlcihBTWVkaWFDb2RlYyAqY29kZWMpIHsKKyAgICBtQ29kZWMgPSBjb2RlYzsKK30KKwordm9pZCBDb2RlY0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb25zOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUNvZGVjLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNvZGVjLT5tQ29kZWMtPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtQ29kZWMtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICBtQ29kZWMtPm1SZXF1ZXN0ZWRBY3Rpdml0eU5vdGlmaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBY3Rpdml0eU5vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKTsKKworICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1Db2RlYy0+bUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2sobUNvZGVjLCBtQ29kZWMtPm1DYWxsYmFja1VzZXJEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFN0b3BBY3Rpdml0eU5vdGlmaWNhdGlvbnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKTsKKworICAgICAgICAgICAgbUNvZGVjLT5tR2VuZXJhdGlvbisrOworICAgICAgICAgICAgbUNvZGVjLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSBmYWxzZTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzaG91bGRuJ3QgYmUgaGVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKKworc3RhdGljIHZvaWQgcmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKEFNZWRpYUNvZGVjICpjb2RlYykgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb25zLCBjb2RlYy0+bUhhbmRsZXItPmlkKCkpKS0+cG9zdCgpOworfQorCitleHRlcm4gIkMiIHsKKworc3RhdGljIEFNZWRpYUNvZGVjICogY3JlYXRlQU1lZGlhQ29kZWMoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBuYW1lX2lzX3R5cGUsIGJvb2wgZW5jb2RlcikgeworICAgIEFNZWRpYUNvZGVjICptRGF0YSA9IG5ldyBBTWVkaWFDb2RlYygpOworICAgIG1EYXRhLT5tTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURhdGEtPm1Mb29wZXItPnNldE5hbWUoIk5ESyBNZWRpYUNvZGVjX2xvb3BlciIpOworICAgIHN0YXR1c190IHJldCA9IG1EYXRhLT5tTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgICAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgdHJ1ZSwgICAgICAgLy8gY2FuQ2FsbEphdmEgWFhYCisgICAgICAgICAgICBQUklPUklUWV9GT1JFR1JPVU5EKTsKKyAgICBpZiAobmFtZV9pc190eXBlKSB7CisgICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobURhdGEtPm1Mb29wZXIsIG5hbWUsIGVuY29kZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobURhdGEtPm1Mb29wZXIsIG5hbWUpOworICAgIH0KKyAgICBtRGF0YS0+bUhhbmRsZXIgPSBuZXcgQ29kZWNIYW5kbGVyKG1EYXRhKTsKKyAgICBtRGF0YS0+bUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1EYXRhLT5tSGFuZGxlcik7CisgICAgbURhdGEtPm1HZW5lcmF0aW9uID0gMTsKKyAgICBtRGF0YS0+bVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgbURhdGEtPm1DYWxsYmFjayA9IE5VTEw7CisKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobmFtZSwgZmFsc2UsIGZhbHNlKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpIHsKKyAgICByZXR1cm4gY3JlYXRlQU1lZGlhQ29kZWMobWltZV90eXBlLCB0cnVlLCBmYWxzZSk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbmFtZSkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhuYW1lLCB0cnVlLCB0cnVlKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgaWYgKG1EYXRhLT5tQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBtRGF0YS0+bUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1EYXRhLT5tQ29kZWMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobURhdGEtPm1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtRGF0YS0+bUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbURhdGEtPm1Mb29wZXItPnN0b3AoKTsKKyAgICAgICAgbURhdGEtPm1Mb29wZXIuY2xlYXIoKTsKKyAgICB9CisgICAgZGVsZXRlIG1EYXRhOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LAorICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csCisgICAgICAgIEFNZWRpYUNyeXB0byAqY3J5cHRvLAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHNwPEFNZXNzYWdlPiBuYXRpdmVGb3JtYXQ7CisgICAgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChmb3JtYXQsICZuYXRpdmVGb3JtYXQpOworICAgIEFMT0dWKCJjb25maWd1cmUgd2l0aCBmb3JtYXQ6ICVzIiwgbmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gTlVMTDsKKyAgICBpZiAod2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgc3VyZmFjZSA9IChTdXJmYWNlKikgd2luZG93OworICAgIH0KKworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+Y29uZmlndXJlKG5hdGl2ZUZvcm1hdCwgc3VyZmFjZSwKKyAgICAgICAgICAgIGNyeXB0byA/IGNyeXB0by0+bUNyeXB0byA6IE5VTEwsIGZsYWdzKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gIG1EYXRhLT5tQ29kZWMtPnN0YXJ0KCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7CisgICAgfQorICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24gPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY3Rpdml0eU5vdGlmeSwgbURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1EYXRhLT5tR2VuZXJhdGlvbik7CisgICAgcmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG1EYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0b3AoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tQ29kZWMtPnN0b3AoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgbURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24uY2xlYXIoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZmx1c2goQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5mbHVzaCgpKTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIGludDY0X3QgdGltZW91dFVzKSB7CisgICAgc2l6ZV90IGlkeDsKKyAgICBzdGF0dXNfdCByZXQgPSBtRGF0YS0+bUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmlkeCwgdGltZW91dFVzKTsKKyAgICByZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obURhdGEpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGlkeDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitFWFBPUlQKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgeworICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzcDxhbmRyb2lkOjpBQnVmZmVyPiA+IGFidWZzOworICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcnMoJmFidWZzKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBuID0gYWJ1ZnMuc2l6ZSgpOworICAgICAgICBpZiAoaWR4ID49IG4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgaW5kZXggJXp1IG91dCBvZiByYW5nZSIsIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0X3NpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgKm91dF9zaXplID0gYWJ1ZnNbaWR4XS0+Y2FwYWNpdHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWJ1ZnNbaWR4XS0+ZGF0YSgpOworICAgIH0KKyAgICBBTE9HRSgiY291bGRuJ3QgZ2V0IGlucHV0IGJ1ZmZlcnMiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworRVhQT1JUCit1aW50OF90KiBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFCdWZmZXI+ID4gYWJ1ZnM7CisgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJmFidWZzKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBuID0gYWJ1ZnMuc2l6ZSgpOworICAgICAgICBpZiAoaWR4ID49IG4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgaW5kZXggJXp1IG91dCBvZiByYW5nZSIsIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0X3NpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgKm91dF9zaXplID0gYWJ1ZnNbaWR4XS0+Y2FwYWNpdHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWJ1ZnNbaWR4XS0+ZGF0YSgpOworICAgIH0KKyAgICBBTE9HRSgiY291bGRuJ3QgZ2V0IG91dHB1dCBidWZmZXJzIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsCisgICAgICAgIHNpemVfdCBpZHgsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKSB7CisKKyAgICBBU3RyaW5nIGVycm9yTXNnOworICAgIHN0YXR1c190IHJldCA9IG1EYXRhLT5tQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaWR4LCBvZmZzZXQsIHNpemUsIHRpbWUsIGZsYWdzLCAmZXJyb3JNc2cpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLAorICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sIGludDY0X3QgdGltZW91dFVzKSB7CisgICAgc2l6ZV90IGlkeDsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzOworICAgIHN0YXR1c190IHJldCA9IG1EYXRhLT5tQ29kZWMtPmRlcXVldWVPdXRwdXRCdWZmZXIoJmlkeCwgJm9mZnNldCwgJnNpemUsICZwcmVzZW50YXRpb25UaW1lVXMsCisgICAgICAgICAgICAmZmxhZ3MsIHRpbWVvdXRVcyk7CisgICAgcmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG1EYXRhKTsKKyAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgaW5mby0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGZsYWdzOworICAgICAgICAgICAgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzID0gcHJlc2VudGF0aW9uVGltZVVzOworICAgICAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgY2FzZSAtRUFHQUlOOgorICAgICAgICAgICAgcmV0dXJuIEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSOworICAgICAgICBjYXNlIGFuZHJvaWQ6OklORk9fRk9STUFUX0NIQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQ7CisgICAgICAgIGNhc2UgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK0VYUE9SVAorQU1lZGlhRm9ybWF0KiBBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBtRGF0YS0+bUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJmZvcm1hdCk7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBib29sIHJlbmRlcikgeworICAgIGlmIChyZW5kZXIpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGlkeCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpZHgpKTsKKyAgICB9Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgQUxPR1YoInJlbmRlciBAICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+cmVuZGVyT3V0cHV0QnVmZmVyQW5kUmVsZWFzZShpZHgsIHRpbWVzdGFtcE5zKSk7Cit9CisKKy8vRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXROb3RpZmljYXRpb25DYWxsYmFjayhBTWVkaWFDb2RlYyAqbURhdGEsIE9uQ29kZWNFdmVudCBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICBtRGF0YS0+bUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgbURhdGEtPm1DYWxsYmFja1VzZXJEYXRhID0gdXNlcmRhdGE7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvIHsKKyAgICAgICAgaW50IG51bXN1YnNhbXBsZXM7CisgICAgICAgIHVpbnQ4X3Qga2V5WzE2XTsKKyAgICAgICAgdWludDhfdCBpdlsxNl07CisgICAgICAgIGNyeXB0b2luZm9fbW9kZV90IG1vZGU7CisgICAgICAgIHNpemVfdCAqY2xlYXJieXRlczsKKyAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlczsKK30gQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIEFNZWRpYUNvZGVjKiBjb2RlYywKKyAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0LAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNyeXB0bywKKyAgICAgICAgdWludDY0X3QgdGltZSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzID0gbmV3IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlW2NyeXB0by0+bnVtc3Vic2FtcGxlc107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjcnlwdG8tPm51bXN1YnNhbXBsZXM7IGkrKykgeworICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhID0gY3J5cHRvLT5jbGVhcmJ5dGVzW2ldOworICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSA9IGNyeXB0by0+ZW5jcnlwdGVkYnl0ZXNbaV07CisgICAgfQorCisgICAgQVN0cmluZyBlcnJvcm1zZzsKKyAgICBzdGF0dXNfdCBlcnIgID0gY29kZWMtPm1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcihpZHgsCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICBzdWJTYW1wbGVzLAorICAgICAgICAgICAgY3J5cHRvLT5udW1zdWJzYW1wbGVzLAorICAgICAgICAgICAgY3J5cHRvLT5rZXksCisgICAgICAgICAgICBjcnlwdG8tPml2LAorICAgICAgICAgICAgKENyeXB0b1BsdWdpbjo6TW9kZSkgY3J5cHRvLT5tb2RlLAorICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgJmVycm9ybXNnKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgQUxPR0UoInF1ZVNlY3VyZUlucHV0QnVmZmVyOiAlcyIsIGVycm9ybXNnLmNfc3RyKCkpOworICAgIH0KKyAgICBkZWxldGUgW10gc3ViU2FtcGxlczsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKKworCitFWFBPUlQKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldygKKyAgICAgICAgaW50IG51bXN1YnNhbXBsZXMsCisgICAgICAgIHVpbnQ4X3Qga2V5WzE2XSwKKyAgICAgICAgdWludDhfdCBpdlsxNl0sCisgICAgICAgIGNyeXB0b2luZm9fbW9kZV90IG1vZGUsCisgICAgICAgIHNpemVfdCAqY2xlYXJieXRlcywKKyAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcykgeworCisgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQorICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbykgKyBzaXplb2Yoc2l6ZV90KSAqIG51bXN1YnNhbXBsZXMgKiAyOworICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqcmV0ID0gKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopIG1hbGxvYyhjcnlwdG9zaXplKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBBTE9HRSgiY291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIiwgY3J5cHRvc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXQtPm51bXN1YnNhbXBsZXMgPSBudW1zdWJzYW1wbGVzOworICAgIG1lbWNweShyZXQtPmtleSwga2V5LCAxNik7CisgICAgbWVtY3B5KHJldC0+aXYsIGl2LCAxNik7CisgICAgcmV0LT5tb2RlID0gbW9kZTsKKworICAgIC8vIGNsZWFyYnl0ZXMgYW5kIGVuY3J5cHRlZGJ5dGVzIHBvaW50IGF0IHRoZSBhY3R1YWwgZGF0YSwgd2hpY2ggZm9sbG93cworICAgIHJldC0+Y2xlYXJieXRlcyA9IChzaXplX3QqKSAocmV0ICsgMSk7IC8vIHBvaW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzdHJ1Y3QKKyAgICByZXQtPmVuY3J5cHRlZGJ5dGVzID0gcmV0LT5jbGVhcmJ5dGVzICsgbnVtc3Vic2FtcGxlczsgLy8gcG9pbnQgYWZ0ZXIgdGhlIGNsZWFyIHNpemVzCisKKyAgICBtZW1jcHkocmV0LT5jbGVhcmJ5dGVzLCBjbGVhcmJ5dGVzLCBudW1zdWJzYW1wbGVzICogc2l6ZW9mKHNpemVfdCkpOworICAgIG1lbWNweShyZXQtPmVuY3J5cHRlZGJ5dGVzLCBlbmNyeXB0ZWRieXRlcywgbnVtc3Vic2FtcGxlcyAqIHNpemVvZihzaXplX3QpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogaW5mbykgeworICAgIGZyZWUoaW5mbyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCitzaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiBjaSkgeworICAgIHJldHVybiBjaS0+bnVtc3Vic2FtcGxlczsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0S2V5KEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2ksIHVpbnQ4X3QgKmRzdCkgeworICAgIGlmICghY2kpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgbWVtY3B5KGRzdCwgY2ktPmtleSwgMTYpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2ksIHVpbnQ4X3QgKmRzdCkgeworICAgIGlmICghY2kpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgbWVtY3B5KGRzdCwgY2ktPml2LCAxNik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCitjcnlwdG9pbmZvX21vZGVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TW9kZShBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpKSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gKGNyeXB0b2luZm9fbW9kZV90KSBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBjaS0+bW9kZTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qIGNpLCBzaXplX3QgKmRzdCkgeworICAgIGlmICghY2kpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgbWVtY3B5KGRzdCwgY2ktPmNsZWFyYnl0ZXMsIHNpemVvZihzaXplX3QpICogY2ktPm51bXN1YnNhbXBsZXMpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyogY2ksIHNpemVfdCAqZHN0KSB7CisgICAgaWYgKCFjaSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIWRzdCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtZW1jcHkoZHN0LCBjaS0+ZW5jcnlwdGVkYnl0ZXMsIHNpemVvZihzaXplX3QpICogY2ktPm51bXN1YnNhbXBsZXMpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2MyZjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFDcnlwdG8iCisKKworI2luY2x1ZGUgIk5ka01lZGlhQ3J5cHRvLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKKworc3RhdGljIHNwPElDcnlwdG8+IG1ha2VDcnlwdG8oKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworCisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKworICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPQorICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPihiaW5kZXIpOworCisgICAgaWYgKHNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBzZXJ2aWNlLT5tYWtlQ3J5cHRvKCk7CisKKyAgICBpZiAoY3J5cHRvID09IE5VTEwgfHwgKGNyeXB0by0+aW5pdENoZWNrKCkgIT0gT0sgJiYgY3J5cHRvLT5pbml0Q2hlY2soKSAhPSBOT19JTklUKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY3J5cHRvOworfQorCitzdHJ1Y3QgQU1lZGlhQ3J5cHRvIHsKKyAgICBzcDxJQ3J5cHRvPiBtQ3J5cHRvOworfTsKKworCitleHRlcm4gIkMiIHsKKworCitFWFBPUlQKK2Jvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgeworICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IG1ha2VDcnlwdG8oKTsKKyAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY3J5cHRvLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUNyeXB0b19yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciAqbWltZSkgeworICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IG1ha2VDcnlwdG8oKTsKKyAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFzaXplKSB7CisKKyAgICBzcDxJQ3J5cHRvPiB0bXAgPSBtYWtlQ3J5cHRvKCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh0bXAtPmNyZWF0ZVBsdWdpbih1dWlkLCBkYXRhLCBkYXRhc2l6ZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTWVkaWFDcnlwdG8gKmNyeXB0byA9IG5ldyBBTWVkaWFDcnlwdG8oKTsKKyAgICBjcnlwdG8tPm1DcnlwdG8gPSB0bXA7CisKKyAgICByZXR1cm4gY3J5cHRvOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhQ3J5cHRvX2RlbGV0ZShBTWVkaWFDcnlwdG8qIGNyeXB0bykgeworICAgIGRlbGV0ZSBjcnlwdG87Cit9CisKKworCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZWE5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfQ1JZUFRPX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0NSWVBUT19QUklWX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgQU1lZGlhQ3J5cHRvIHsKKyAgICBzcDxJQ3J5cHRvPiBtQ3J5cHRvOworfTsKKworI2VuZGlmIC8vIF9OREtfTUVESUFfQ1JZUFRPX1BSSVZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTAsMCArMSw3MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRHJtIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEcm0uaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvSURybS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bmRrL05ka01lZGlhQ3J5cHRvLmg+CisKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3R5cGVkZWYgVmVjdG9yPHVpbnQ4X3Q+IGlkdmVjX3Q7CisKK3N0cnVjdCBEcm1MaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgQm5Ecm1DbGllbnQKK3sKK3ByaXZhdGU6CisgICAgQU1lZGlhRHJtICptT2JqOworICAgIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbUxpc3RlbmVyOworCitwdWJsaWM6CisgICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLCBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisgICAgdm9pZCBub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKTsKK307CisKK3N0cnVjdCBBTWVkaWFEcm0geworICAgIHNwPElEcm0+IG1Ecm07CisgICAgc3A8SURybUNsaWVudD4gbURybUNsaWVudDsKKyAgICBMaXN0PGlkdmVjX3Q+IG1JZHM7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVF1ZXJ5UmVzdWx0czsKKyAgICBWZWN0b3I8dWludDhfdD4gbUtleVJlcXVlc3Q7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1Qcm92aXNpb25SZXF1ZXN0OworICAgIFN0cmluZzggbVByb3Zpc2lvblVybDsKKyAgICBTdHJpbmc4IG1Qcm9wZXJ0eVN0cmluZzsKKyAgICBWZWN0b3I8dWludDhfdD4gbVByb3BlcnR5Qnl0ZUFycmF5OworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gbVNlY3VyZVN0b3BzOworICAgIHNwPERybUxpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCit2b2lkIERybUxpc3RlbmVyOjpub3RpZnkoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IFBhcmNlbCAqb2JqKSB7CisgICAgaWYgKCFtTGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFNZWRpYURybVNlc3Npb25JZCBzZXNzaW9uSWQgPSB7TlVMTCwgMH07CisgICAgaW50MzJfdCBzZXNzaW9uSWRTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICBpZiAoc2Vzc2lvbklkU2l6ZSkgeworICAgICAgICB1aW50OF90ICpzZXNzaW9uSWREYXRhID0gbmV3IHVpbnQ4X3Rbc2Vzc2lvbklkU2l6ZV07CisgICAgICAgIHNlc3Npb25JZC5wdHIgPSBzZXNzaW9uSWREYXRhOworICAgICAgICBzZXNzaW9uSWQubGVuZ3RoID0gc2Vzc2lvbklkU2l6ZTsKKyAgICAgICAgb2JqLT5yZWFkKHNlc3Npb25JZERhdGEsIHNlc3Npb25JZC5sZW5ndGgpOworICAgIH0KKworICAgIGludDMyX3QgZGF0YVNpemUgPSBvYmotPnJlYWRJbnQzMigpOworICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgIGlmIChkYXRhU2l6ZSkgeworICAgICAgICBkYXRhID0gbmV3IHVpbnQ4X3RbZGF0YVNpemVdOworICAgICAgICBvYmotPnJlYWQoZGF0YSwgZGF0YVNpemUpOworICAgIH0KKworICAgIC8vIHRyYW5zbGF0ZSBEcm1QbHVnaW4gZXZlbnQgdHlwZXMgaW50byB0aGVpciBOREsgZXF1aXZhbGVudHMKKyAgICBBTWVkaWFEcm1FdmVudFR5cGUgbmRrRXZlbnRUeXBlOworICAgIHN3aXRjaChldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFByb3Zpc2lvblJlcXVpcmVkOgorICAgICAgICAgICAgbmRrRXZlbnRUeXBlID0gRVZFTlRfUFJPVklTSU9OX1JFUVVJUkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRLZXlOZWVkZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9LRVlfUkVRVUlSRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleUV4cGlyZWQ6CisgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9LRVlfRVhQSVJFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50VmVuZG9yRGVmaW5lZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX1ZFTkRPUl9ERUZJTkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBldmVudCBEcm1QbHVnaW46OkV2ZW50VHlwZSAlZCwgaWdub3JlZCIsIChpbnQpZXZlbnRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAoKm1MaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgbmRrRXZlbnRUeXBlLCBleHRyYSwgZGF0YSwgZGF0YVNpemUpOworCisgICAgZGVsZXRlIFtdIHNlc3Npb25JZC5wdHI7CisgICAgZGVsZXRlIFtdIGRhdGE7Cit9CisKKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVzdWx0ID0gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9PSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX05PVF9QUk9WSVNJT05FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9SRVNPVVJDRV9CVVNZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX0RFVklDRV9SRVZPS0VEOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0RSTV9ERVZJQ0VfUkVWT0tFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOgorICAgICAgICAgICAgcmVzdWx0ID0gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fVEFNUEVSX0RFVEVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX05PX0xJQ0VOU0U6CisgICAgICAgICAgICByZXN1bHQgPSBBTUVESUFfRFJNX05FRURfS0VZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKKyAgICAgICAgICAgIHJlc3VsdCA9IEFNRURJQV9EUk1fTElDRU5TRV9FWFBJUkVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHNwPElEcm0+IENyZWF0ZURybSgpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQorICAgICAgICBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEucGxheWVyIikpOworCisgICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9CisgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7CisKKyAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPElEcm0+IGRybSA9IHNlcnZpY2UtPm1ha2VEcm0oKTsKKworICAgIGlmIChkcm0gPT0gTlVMTCB8fCAoZHJtLT5pbml0Q2hlY2soKSAhPSBPSyAmJiBkcm0tPmluaXRDaGVjaygpICE9IE5PX0lOSVQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBkcm07Cit9CisKKworc3RhdGljIHNwPElEcm0+IENyZWF0ZURybUZyb21VVUlEKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgeworICAgIHNwPElEcm0+IGRybSA9IENyZWF0ZURybSgpOworCisgICAgaWYgKGRybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGRybS0+Y3JlYXRlUGx1Z2luKHV1aWQpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3QgY2hhciAqbWltZVR5cGUpIHsKKyAgICBzcDxJRHJtPiBkcm0gPSBDcmVhdGVEcm0oKTsKKworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lU3RyID0gbWltZVR5cGUgPyBTdHJpbmc4KG1pbWVUeXBlKSA6IFN0cmluZzgoIiIpOworICAgIHJldHVybiBkcm0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVTdHIpOworfQorCitFWFBPUlQKK0FNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCBBTWVkaWFVVUlEIHV1aWQpIHsKKyAgICBBTWVkaWFEcm0gKm1PYmogPSBuZXcgQU1lZGlhRHJtKCk7CisgICAgbU9iai0+bURybSA9IENyZWF0ZURybUZyb21VVUlEKHV1aWQpOworICAgIHJldHVybiBtT2JqOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRHJtX3JlbGVhc2UoQU1lZGlhRHJtICptT2JqKSB7CisgICAgaWYgKG1PYmotPm1Ecm0gIT0gTlVMTCkgeworICAgICAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihOVUxMKTsKKyAgICAgICAgbU9iai0+bURybS0+ZGVzdHJveVBsdWdpbigpOworICAgICAgICBtT2JqLT5tRHJtLmNsZWFyKCk7CisgICAgfQorICAgIGRlbGV0ZSBtT2JqOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIoQU1lZGlhRHJtICptT2JqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworCitzdGF0aWMgYm9vbCBmaW5kSWQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1CeXRlQXJyYXkgJmlkLCBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciAmaXRlcikgeworICAgIGl0ZXIgPSBtT2JqLT5tSWRzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ZXIgIT0gbU9iai0+bUlkcy5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+YXJyYXkoKSA9PSBpZC5wdHIgJiYgaXRlci0+c2l6ZSgpID09IGlkLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9vcGVuU2Vzc2lvbihBTWVkaWFEcm0gKm1PYmosIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5vcGVuU2Vzc2lvbihzZXNzaW9uKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1PYmotPm1JZHMucHVzaF9mcm9udChzZXNzaW9uKTsKKyAgICAgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKKyAgICAgICAgc2Vzc2lvbklkLT5wdHIgPSBpdGVyLT5hcnJheSgpOworICAgICAgICBzZXNzaW9uSWQtPmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uKEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorICAgIG1PYmotPm1Ecm0tPmNsb3NlU2Vzc2lvbigqaXRlcik7CisgICAgbU9iai0+bUlkcy5lcmFzZShpdGVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0KEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2NvcGUgKnNjb3BlLAorICAgICAgICBjb25zdCB1aW50OF90ICppbml0LCBzaXplX3QgaW5pdFNpemUsIGNvbnN0IGNoYXIgKm1pbWVUeXBlLCBBTWVkaWFEcm1LZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEFNZWRpYURybUtleVZhbHVlICpvcHRpb25hbFBhcmFtZXRlcnMsIHNpemVfdCBudW1PcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiprZXlSZXF1ZXN0LCBzaXplX3QgKmtleVJlcXVlc3RTaXplKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghbWltZVR5cGUgfHwgIXNjb3BlIHx8ICFrZXlSZXF1ZXN0IHx8ICFrZXlSZXF1ZXN0U2l6ZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNjb3BlLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1kSW5pdDsKKyAgICBtZEluaXQuYXBwZW5kQXJyYXkoaW5pdCwgaW5pdFNpemUpOworICAgIERybVBsdWdpbjo6S2V5VHlwZSBtZEtleVR5cGU7CisgICAgc3dpdGNoIChrZXlUeXBlKSB7CisgICAgICAgIGNhc2UgS0VZX1RZUEVfU1RSRUFNSU5HOgorICAgICAgICAgICAgbWRLZXlUeXBlID0gRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlfVFlQRV9PRkZMSU5FOgorICAgICAgICAgICAgbWRLZXlUeXBlID0gRHJtUGx1Z2luOjprS2V5VHlwZV9PZmZsaW5lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0VZX1RZUEVfUkVMRUFTRToKKyAgICAgICAgICAgIG1kS2V5VHlwZSA9IERybVBsdWdpbjo6a0tleVR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbWRPcHRpb25hbFBhcmFtZXRlcnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1PcHRpb25hbFBhcmFtZXRlcnM7IGkrKykgeworICAgICAgICBtZE9wdGlvbmFsUGFyYW1ldGVycy5hZGQoU3RyaW5nOChvcHRpb25hbFBhcmFtZXRlcnNbaV0ubUtleSksCisgICAgICAgICAgICAgICAgU3RyaW5nOChvcHRpb25hbFBhcmFtZXRlcnNbaV0ubVZhbHVlKSk7CisgICAgfQorICAgIFN0cmluZzggZGVmYXVsdFVybDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAorICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgICprZXlSZXF1ZXN0ID0gbU9iai0+bUtleVJlcXVlc3QuYXJyYXkoKTsKKyAgICAgICAgKmtleVJlcXVlc3RTaXplID0gbU9iai0+bUtleVJlcXVlc3Quc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlS2V5UmVzcG9uc2UoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzY29wZSB8fCAhcmVzcG9uc2UgfHwgIXJlc3BvbnNlU2l6ZSB8fCAha2V5U2V0SWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzY29wZSwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKyAgICBWZWN0b3I8dWludDhfdD4gbWRSZXNwb25zZTsKKyAgICBtZFJlc3BvbnNlLmFwcGVuZEFycmF5KHJlc3BvbnNlLCByZXNwb25zZVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1kS2V5U2V0SWQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+cHJvdmlkZUtleVJlc3BvbnNlKCppdGVyLCBtZFJlc3BvbnNlLCBtZEtleVNldElkKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1PYmotPm1JZHMucHVzaF9mcm9udChtZEtleVNldElkKTsKKyAgICAgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKKyAgICAgICAga2V5U2V0SWQtPnB0ciA9IGl0ZXItPmFycmF5KCk7CisgICAgICAgIGtleVNldElkLT5sZW5ndGggPSBpdGVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2V5U2V0SWQtPnB0ciA9IE5VTEw7CisgICAgICAgIGtleVNldElkLT5sZW5ndGggPSAwOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9yZXN0b3JlS2V5cyhBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIHsKKworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFzZXNzaW9uSWQgfHwgIWtleVNldElkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKyAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0OworICAgIGtleVNldC5hcHBlbmRBcnJheShrZXlTZXRJZC0+cHRyLCBrZXlTZXRJZC0+bGVuZ3RoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnJlc3RvcmVLZXlzKCppdGVyLCBrZXlTZXQpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVtb3ZlS2V5cyhBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqa2V5U2V0SWQpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKmtleVNldElkLCBpdGVyKSkgeworICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0OworICAgICAgICBrZXlTZXQuYXBwZW5kQXJyYXkoa2V5U2V0SWQtPnB0ciwga2V5U2V0SWQtPmxlbmd0aCk7CisgICAgICAgIHN0YXR1cyA9IG1PYmotPm1Ecm0tPnJlbW92ZUtleXMoa2V5U2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBtT2JqLT5tRHJtLT5yZW1vdmVLZXlzKCppdGVyKTsKKyAgICAgICAgbU9iai0+bUlkcy5lcmFzZShpdGVyKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9xdWVyeUtleVN0YXR1cyhBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1LZXlWYWx1ZSAqa2V5VmFsdWVQYWlycywgc2l6ZV90ICpudW1QYWlycykgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCB8fCAhbnVtUGFpcnMpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoIWZpbmRJZChtT2JqLCAqc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+cXVlcnlLZXlTdGF0dXMoKml0ZXIsIG1PYmotPm1RdWVyeVJlc3VsdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKm51bVBhaXJzID0gMDsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKSA+ICpudW1QYWlycykgeworICAgICAgICAqbnVtUGFpcnMgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU9iai0+bVF1ZXJ5UmVzdWx0cy5zaXplKCk7IGkrKykgeworICAgICAgICBrZXlWYWx1ZVBhaXJzW2ldLm1LZXkgPSBtT2JqLT5tUXVlcnlSZXN1bHRzLmtleUF0KGkpLnN0cmluZygpOworICAgICAgICBrZXlWYWx1ZVBhaXJzW2ldLm1WYWx1ZSA9IG1PYmotPm1RdWVyeVJlc3VsdHMua2V5QXQoaSkuc3RyaW5nKCk7CisgICAgfQorICAgICpudW1QYWlycyA9IG1PYmotPm1RdWVyeVJlc3VsdHMuc2l6ZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3QoQU1lZGlhRHJtICptT2JqLCBjb25zdCB1aW50OF90ICoqcHJvdmlzaW9uUmVxdWVzdCwKKyAgICAgICAgc2l6ZV90ICpwcm92aXNpb25SZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKnNlcnZlclVybCkgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKCFwcm92aXNpb25SZXF1ZXN0IHx8ICFwcm92aXNpb25SZXF1ZXN0U2l6ZSB8fCAhKnByb3Zpc2lvblJlcXVlc3RTaXplIHx8ICFzZXJ2ZXJVcmwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzgoIiIpLCBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgIG1PYmotPm1Qcm92aXNpb25SZXF1ZXN0LCBtT2JqLT5tUHJvdmlzaW9uVXJsKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcHJvdmlzaW9uUmVxdWVzdCA9IG1PYmotPm1Qcm92aXNpb25SZXF1ZXN0LmFycmF5KCk7CisgICAgICAgICpwcm92aXNpb25SZXF1ZXN0U2l6ZSA9IG1PYmotPm1Qcm92aXNpb25SZXF1ZXN0LnNpemUoKTsKKyAgICAgICAgKnNlcnZlclVybCA9IG1PYmotPm1Qcm92aXNpb25Vcmwuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3Byb3ZpZGVQcm92aXNpb25SZXNwb25zZShBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKSB7CisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWRSZXNwb25zZTsKKyAgICBtZFJlc3BvbnNlLmFwcGVuZEFycmF5KHJlc3BvbnNlLCByZXNwb25zZVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHVudXNlZDsKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShtZFJlc3BvbnNlLCB1bnVzZWQsIHVudXNlZCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRTZWN1cmVTdG9wcyhBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIEFNZWRpYURybVNlY3VyZVN0b3AgKnNlY3VyZVN0b3BzLCBzaXplX3QgKm51bVNlY3VyZVN0b3BzKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghbnVtU2VjdXJlU3RvcHMpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0U2VjdXJlU3RvcHMobU9iai0+bVNlY3VyZVN0b3BzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpudW1TZWN1cmVTdG9wcyA9IDA7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisgICAgaWYgKCpudW1TZWN1cmVTdG9wcyA8IG1PYmotPm1TZWN1cmVTdG9wcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSOworICAgIH0KKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bVNlY3VyZVN0b3BzLmJlZ2luKCk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChpdGVyICE9IG1PYmotPm1TZWN1cmVTdG9wcy5lbmQoKSkgeworICAgICAgICBzZWN1cmVTdG9wc1tpXS5wdHIgPSBpdGVyLT5hcnJheSgpOworICAgICAgICBzZWN1cmVTdG9wc1tpXS5sZW5ndGggPSBpdGVyLT5zaXplKCk7CisgICAgICAgICsraXRlcjsKKyAgICAgICAgKytpOworICAgIH0KKyAgICAqbnVtU2VjdXJlU3RvcHMgPSBtT2JqLT5tU2VjdXJlU3RvcHMuc2l6ZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3JlbGVhc2VTZWN1cmVTdG9wcyhBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlY3VyZVN0b3AgKnNzUmVsZWFzZSkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNzUmVsZWFzZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiByZWxlYXNlOworICAgIHJlbGVhc2UuYXBwZW5kQXJyYXkoc3NSZWxlYXNlLT5wdHIsIHNzUmVsZWFzZS0+bGVuZ3RoKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnJlbGVhc2VTZWN1cmVTdG9wcyhyZWxlYXNlKSk7Cit9CisKKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmcoQU1lZGlhRHJtICptT2JqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghcHJvcGVydHlOYW1lIHx8ICFwcm9wZXJ0eVZhbHVlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgbU9iai0+bVByb3BlcnR5U3RyaW5nKTsKKworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgKnByb3BlcnR5VmFsdWUgPSBtT2JqLT5tUHJvcGVydHlTdHJpbmcuc3RyaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnByb3BlcnR5VmFsdWUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBBTWVkaWFEcm1CeXRlQXJyYXkgKnByb3BlcnR5VmFsdWUpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghcHJvcGVydHlOYW1lIHx8ICFwcm9wZXJ0eVZhbHVlKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOChwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgbU9iai0+bVByb3BlcnR5Qnl0ZUFycmF5KTsKKworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgcHJvcGVydHlWYWx1ZS0+cHRyID0gbU9iai0+bVByb3BlcnR5Qnl0ZUFycmF5LmFycmF5KCk7CisgICAgICAgIHByb3BlcnR5VmFsdWUtPmxlbmd0aCA9IG1PYmotPm1Qcm9wZXJ0eUJ5dGVBcnJheS5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJvcGVydHlWYWx1ZS0+cHRyID0gTlVMTDsKKyAgICAgICAgcHJvcGVydHlWYWx1ZS0+bGVuZ3RoID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIGNvbnN0IGNoYXIgKnByb3BlcnR5TmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5zZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgodmFsdWUpKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqbU9iaiwKKyAgICAgICAgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBjb25zdCB1aW50OF90ICp2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSkgeworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKKyAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CisKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7Cit9CisKKworc3RhdGljIG1lZGlhX3N0YXR1c190IGVuY3J5cHRfZGVjcnlwdF9jb21tb24oQU1lZGlhRHJtICptT2JqLAorICAgICAgICBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSwgYm9vbCBlbmNyeXB0KSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgc2Vzc2lvbklkLCBpdGVyKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+c2V0Q2lwaGVyQWxnb3JpdGhtKCppdGVyLCBTdHJpbmc4KGNpcGhlckFsZ29yaXRobSkpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworICAgIH0KKworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlYzsKKyAgICBjb25zdCBzaXplX3Qga0tleUlkU2l6ZSA9IDE2OworICAgIGtleUlkVmVjLmFwcGVuZEFycmF5KGtleUlkLCBrS2V5SWRTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBpbnB1dFZlYzsKKyAgICBpbnB1dFZlYy5hcHBlbmRBcnJheShpbnB1dCwgZGF0YVNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGl2VmVjOworICAgIGNvbnN0IHNpemVfdCBrSXZTaXplID0gMTY7CisgICAgaXZWZWMuYXBwZW5kQXJyYXkoaXYsIGtJdlNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG91dHB1dFZlYzsKKyAgICBpZiAoZW5jcnlwdCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5lbmNyeXB0KCppdGVyLCBrZXlJZFZlYywgaW5wdXRWZWMsIGl2VmVjLCBvdXRwdXRWZWMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmRlY3J5cHQoKml0ZXIsIGtleUlkVmVjLCBpbnB1dFZlYywgaXZWZWMsIG91dHB1dFZlYyk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbWVtY3B5KG91dHB1dCwgb3V0cHV0VmVjLmFycmF5KCksIG91dHB1dFZlYy5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2VuY3J5cHQoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSkgeworICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBlbmNyeXB0X2RlY3J5cHRfY29tbW9uKG1PYmosICpzZXNzaW9uSWQsIGNpcGhlckFsZ29yaXRobSwga2V5SWQsIGl2LAorICAgICAgICAgICAgaW5wdXQsIG91dHB1dCwgZGF0YVNpemUsIHRydWUpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9kZWNyeXB0KEFNZWRpYURybSAqbU9iaiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKmNpcGhlckFsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKml2LAorICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdWludDhfdCAqb3V0cHV0LCBzaXplX3QgZGF0YVNpemUpIHsKKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZW5jcnlwdF9kZWNyeXB0X2NvbW1vbihtT2JqLCAqc2Vzc2lvbklkLCBjaXBoZXJBbGdvcml0aG0sIGtleUlkLCBpdiwKKyAgICAgICAgICAgIGlucHV0LCBvdXRwdXQsIGRhdGFTaXplLCBmYWxzZSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NpZ24oQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCAqc2lnbmF0dXJlU2l6ZSkgeworCisgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworICAgIH0KKyAgICBpZiAoIXNlc3Npb25JZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyOworICAgIGlmICghZmluZElkKG1PYmosICpzZXNzaW9uSWQsIGl0ZXIpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5zZXRNYWNBbGdvcml0aG0oKml0ZXIsIFN0cmluZzgobWFjQWxnb3JpdGhtKSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjOworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAga2V5SWRWZWMuYXBwZW5kQXJyYXkoa2V5SWQsIGtLZXlJZFNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1lc3NhZ2VWZWM7CisgICAgbWVzc2FnZVZlYy5hcHBlbmRBcnJheShtZXNzYWdlLCBtZXNzYWdlU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gc2lnbmF0dXJlVmVjOworICAgIHN0YXR1cyA9IG1PYmotPm1Ecm0tPnNpZ24oKml0ZXIsIGtleUlkVmVjLCBtZXNzYWdlVmVjLCBzaWduYXR1cmVWZWMpOworICAgIGlmIChzaWduYXR1cmVWZWMuc2l6ZSgpID4gKnNpZ25hdHVyZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0hPUlRfQlVGRkVSOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIG1lbWNweShzaWduYXR1cmUsIHNpZ25hdHVyZVZlYy5hcnJheSgpLCBzaWduYXR1cmVWZWMuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhzdGF0dXMpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV92ZXJpZnkoQU1lZGlhRHJtICptT2JqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgY29uc3QgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCBzaWduYXR1cmVTaXplKSB7CisKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmICghc2Vzc2lvbklkKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKCFmaW5kSWQobU9iaiwgKnNlc3Npb25JZCwgaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPnNldE1hY0FsZ29yaXRobSgqaXRlciwgU3RyaW5nOChtYWNBbGdvcml0aG0pKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWM7CisgICAgY29uc3Qgc2l6ZV90IGtLZXlJZFNpemUgPSAxNjsKKyAgICBrZXlJZFZlYy5hcHBlbmRBcnJheShrZXlJZCwga0tleUlkU2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gbWVzc2FnZVZlYzsKKyAgICBtZXNzYWdlVmVjLmFwcGVuZEFycmF5KG1lc3NhZ2UsIG1lc3NhZ2VTaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBzaWduYXR1cmVWZWM7CisgICAgc2lnbmF0dXJlVmVjLmFwcGVuZEFycmF5KHNpZ25hdHVyZSwgc2lnbmF0dXJlU2l6ZSk7CisKKyAgICBib29sIG1hdGNoOworICAgIHN0YXR1cyA9IG1PYmotPm1Ecm0tPnZlcmlmeSgqaXRlciwga2V5SWRWZWMsIG1lc3NhZ2VWZWMsIHNpZ25hdHVyZVZlYywgbWF0Y2gpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoID8gQU1FRElBX09LIDogQU1FRElBX0RSTV9WRVJJRllfRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU3ZDBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFFeHRyYWN0b3IiCisKKworI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKKyNpbmNsdWRlICJOZGtNZWRpYUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0cnVjdCBBTWVkaWFFeHRyYWN0b3IgeworICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOworICAgIHNwPEFCdWZmZXI+IG1Qc3NoQnVmOworCit9OworCitleHRlcm4gIkMiIHsKKworRVhQT1JUCitBTWVkaWFFeHRyYWN0b3IqIEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSB7CisgICAgQUxPR1YoImN0b3IiKTsKKyAgICBBTWVkaWFFeHRyYWN0b3IgKm1EYXRhID0gbmV3IEFNZWRpYUV4dHJhY3RvcigpOworICAgIG1EYXRhLT5tSW1wbCA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yKCk7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIEFMT0dWKCJkdG9yIik7CisgICAgZGVsZXRlIG1EYXRhOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7Cit9CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7CisgICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0CisKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqb2JqZWN0IHNlcnZpY2UgPSBOVUxMOworICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZShwYXRoKSBtdXN0IGJlIGNhbGxlZCBmcm9tIEphdmEgdGhyZWFkIik7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIik7CisgICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWFIdHRwU2VydmljZSIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsCisgICAgICAgICAgICAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7CisgICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAganN0cmluZyBqbG9jID0gZW52LT5OZXdTdHJpbmdVVEYobG9jYXRpb24pOworCisgICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqbG9jKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpsb2MpOworCisgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOworICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gaWJpbmRlckZvckphdmFPYmplY3QoZW52LCBzZXJ2aWNlKTsKKyAgICAgICAgaHR0cFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIGxvY2F0aW9uLCBOVUxMKTsKKyAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCitFWFBPUlQKK3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgcmV0dXJuIG1EYXRhLT5tSW1wbC0+Y291bnRUcmFja3MoKTsKK30KKworRVhQT1JUCitBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBzaXplX3QgaWR4KSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBtRGF0YS0+bUltcGwtPmdldFRyYWNrRm9ybWF0KGlkeCwgJmZvcm1hdCk7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBzaXplX3QgaWR4KSB7CisgICAgQUxPR1YoInNlbGVjdFRyYWNrKCV6dSkiLCBpZHgpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZWxlY3RUcmFjayhpZHgpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBzaXplX3QgaWR4KSB7CisgICAgQUxPR1YoInVuc2VsZWN0VHJhY2soJXp1KSIsIGlkeCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnVuc2VsZWN0VHJhY2soaWR4KSk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgLy9BTE9HVigiYWR2YW5jZSIpOworICAgIHJldHVybiBtRGF0YS0+bUltcGwtPmFkdmFuY2UoKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKEFNZWRpYUV4dHJhY3RvciAqZXgsIGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZm1vZGU7CisgICAgaWYgKG1vZGUgPT0gQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQykgeworICAgICAgICBzZm1vZGUgPSBhbmRyb2lkOjpNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQU1FRElBRVhUUkFDVE9SX1NFRUtfQ0xPU0VTVF9TWU5DKSB7CisgICAgICAgIHNmbW9kZSA9IGFuZHJvaWQ6Ok1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Ztb2RlID0gYW5kcm9pZDo6TWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGV4LT5tSW1wbC0+c2Vla1RvKHNlZWtQb3NVcywgc2Ztb2RlKSk7Cit9CisKK0VYUE9SVAorc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAvL0FMT0dWKCJyZWFkU2FtcGxlRGF0YSIpOworICAgIHNwPEFCdWZmZXI+IHRtcCA9IG5ldyBBQnVmZmVyKGJ1ZmZlciwgY2FwYWNpdHkpOworICAgIGlmIChtRGF0YS0+bUltcGwtPnJlYWRTYW1wbGVEYXRhKHRtcCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRtcC0+c2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK0VYUE9SVAordWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBpbnQgc2FtcGxlRmxhZ3MgPSAwOworICAgIHNwPE1ldGFEYXRhPiBtZXRhOworICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+Z2V0U2FtcGxlTWV0YSgmbWV0YSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludDMyX3QgdmFsOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsKSAmJiB2YWwgIT0gMCkgeworICAgICAgICBzYW1wbGVGbGFncyB8PSBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfU1lOQzsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc2FtcGxlRmxhZ3MgfD0gQU1FRElBRVhUUkFDVE9SX1NBTVBMRV9GTEFHX0VOQ1JZUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIHNhbXBsZUZsYWdzOworfQorCitFWFBPUlQKK2ludCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgc2l6ZV90IGlkeDsKKyAgICBpZiAobURhdGEtPm1JbXBsLT5nZXRTYW1wbGVUcmFja0luZGV4KCZpZHgpICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGlkeDsKK30KKworRVhQT1JUCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKKyAgICBpbnQ2NF90IHRpbWU7CisgICAgaWYgKG1EYXRhLT5tSW1wbC0+Z2V0U2FtcGxlVGltZSgmdGltZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gdGltZTsKK30KKworRVhQT1JUCitQc3NoSW5mbyogQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKEFNZWRpYUV4dHJhY3RvciAqZXgpIHsKKworICAgIGlmIChleC0+bVBzc2hCdWYgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gKFBzc2hJbmZvKikgZXgtPm1Qc3NoQnVmLT5kYXRhKCk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBleC0+bUltcGwtPmdldEZpbGVGb3JtYXQoJmZvcm1hdCk7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGlmKCFmb3JtYXQtPmZpbmRCdWZmZXIoInBzc2giLCAmYnVmZmVyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyB0aGUgZm9ybWF0IG9mIHRoZSBidWZmZXIgaXMgMSBvciBtb3JlIG9mOgorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgMTYgYnl0ZSB1dWlkCisgICAgLy8gICAgICAgIDQgYnl0ZSBkYXRhIGxlbmd0aCBOCisgICAgLy8gICAgICAgIE4gYnl0ZXMgb2YgZGF0YQorICAgIC8vICAgIH0KKworICAgIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNvdXJjZSBkYXRhLgorICAgIC8vIFNpbmNlIHdlIGdvdCB0aGUgZGF0YSBmcm9tIHN0YWdlZnJpZ2h0LCB3ZSB0cnVzdCBpdCBpcyB2YWxpZCBhbmQgcHJvcGVybHkgZm9ybWF0dGVkLgorICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3QgbGVuID0gYnVmZmVyLT5zaXplKCk7CisgICAgc2l6ZV90IG51bWVudHJpZXMgPSAwOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIG51bWVudHJpZXMrKzsKKworICAgICAgICAvLyBza2lwIHV1aWQKKyAgICAgICAgZGF0YSArPSAxNjsKKyAgICAgICAgbGVuIC09IDE2OworCisgICAgICAgIC8vIGdldCBkYXRhIGxlbmd0aAorICAgICAgICB1aW50MzJfdCBkYXRhbGVuID0gKigodWludDMyX3QqKWRhdGEpOworICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgIGxlbiAtPSA0OworCisgICAgICAgIC8vIHNraXAgdGhlIGRhdGEKKyAgICAgICAgZGF0YSArPSBkYXRhbGVuOworICAgICAgICBsZW4gLT0gZGF0YWxlbjsKKyAgICB9CisKKyAgICAvLyB0aGVyZSBhcmUgPG51bWVudHJpZXM+IGluIHRoZSBzb3VyY2UgYnVmZmVyLCB3ZSBuZWVkCisgICAgLy8gKHNvdXJjZSBidWZmZXIgc2l6ZSkgLSAoc2l6ZW9mKHVpbnQzMl90KSAqIG51bWVudHJpZXMpICsgc2l6ZW9mKHNpemVfdCkKKyAgICAvLyAgKyAoKHNpemVvZih2b2lkKikgKyBzaXplb2Yoc2l6ZV90KSkgKiBudW1lbnRyaWVzKSBieXRlcyBmb3IgdGhlIFBzc2hJbmZvIHN0cnVjdHVyZQorICAgIC8vIE9yIGluIG90aGVyIHdvcmRzLCB0aGUgZGF0YSBsZW5ndGhzIGluIHRoZSBzb3VyY2Ugc3RydWN0dXJlIGFyZSByZXBsYWNlZCBieSBzaXplX3QKKyAgICAvLyAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIHNpemUgb3IgbGFyZ2VyLCBmb3IgNjQgYml0KSwgYW5kIGluIGFkZGl0aW9uIHRoZXJlIGlzIGFuCisgICAgLy8gZXh0cmEgcG9pbnRlciBmb3IgZWFjaCBlbnRyeSwgYW5kIGFuIGV4dHJhIHNpemVfdCBmb3IgdGhlIGVudGlyZSBQc3NoSW5mby4KKyAgICBzaXplX3QgbmV3c2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpIC0gKHNpemVvZih1aW50MzJfdCkgKiBudW1lbnRyaWVzKSArIHNpemVvZihzaXplX3QpCisgICAgICAgICAgICArICgoc2l6ZW9mKHZvaWQqKSArIHNpemVvZihzaXplX3QpKSAqIG51bWVudHJpZXMpOworICAgIGV4LT5tUHNzaEJ1ZiA9IG5ldyBBQnVmZmVyKG5ld3NpemUpOworICAgIGV4LT5tUHNzaEJ1Zi0+c2V0UmFuZ2UoMCwgbmV3c2l6ZSk7CisKKyAgICAvLyBjb3B5IGRhdGEKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSBidWZmZXItPmRhdGEoKTsKKyAgICB1aW50OF90KiBkc3QgPSBleC0+bVBzc2hCdWYtPmRhdGEoKTsKKyAgICB1aW50OF90KiBkc3RkYXRhID0gZHN0ICsgc2l6ZW9mKHNpemVfdCkgKyBudW1lbnRyaWVzICogc2l6ZW9mKFBzc2hFbnRyeSk7CisgICAgKigoc2l6ZV90Kilkc3QpID0gbnVtZW50cmllczsKKyAgICBkc3QgKz0gc2l6ZW9mKHNpemVfdCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgLy8gY29weSB1dWlkCisgICAgICAgIG1lbWNweShkc3QsIHNyYywgMTYpOworICAgICAgICBzcmMgKz0gMTY7CisgICAgICAgIGRzdCArPSAxNjsKKworICAgICAgICAvLyBnZXQvY29weSBkYXRhIGxlbmd0aAorICAgICAgICB1aW50MzJfdCBkYXRhbGVuID0gKigodWludDMyX3QqKXNyYyk7CisgICAgICAgICooKHNpemVfdCopZHN0KSA9IGRhdGFsZW47CisgICAgICAgIHNyYyArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICBkc3QgKz0gc2l6ZW9mKHNpemVfdCk7CisKKyAgICAgICAgLy8gdGhlIG5leHQgZW50cnkgaW4gdGhlIGRlc3RpbmF0aW9uIGlzIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIGRhdGEsIHdoaWNoIHdlIHN0b3JlCisgICAgICAgIC8vIGFmdGVyIHRoZSBhcnJheSBvZiBQc3NoRW50cnkKKyAgICAgICAgKigodm9pZCoqKWRzdCkgPSBkc3RkYXRhOworICAgICAgICBkc3QgKz0gc2l6ZW9mKHZvaWQqKTsKKworICAgICAgICAvLyBjb3B5IHRoZSBhY3R1YWwgZGF0YQorICAgICAgICBtZW1jcHkoZHN0ZGF0YSwgc3JjLCBkYXRhbGVuKTsKKyAgICAgICAgZHN0ZGF0YSArPSBkYXRhbGVuOworICAgICAgICBzcmMgKz0gZGF0YWxlbjsKKyAgICB9CisKKyAgICByZXR1cm4gKFBzc2hJbmZvKikgZXgtPm1Qc3NoQnVmLT5kYXRhKCk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhBTWVkaWFFeHRyYWN0b3IgKmV4KSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgaWYoZXgtPm1JbXBsLT5nZXRTYW1wbGVNZXRhKCZtZXRhKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqY3J5cHRlZGRhdGE7CisgICAgc2l6ZV90IGNyeXB0ZWRzaXplOworICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmNyeXB0ZWRkYXRhLCAmY3J5cHRlZHNpemUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7CisKKyAgICBjb25zdCB2b2lkICpjbGVhcmRhdGE7CisgICAgc2l6ZV90IGNsZWFyc2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZ0eXBlLCAmY2xlYXJkYXRhLCAmY2xlYXJzaXplKSkgeworICAgICAgICBpZiAoY2xlYXJzaXplICE9IGNyeXB0ZWRzaXplKSB7CisgICAgICAgICAgICAvLyBUaGUgdHdvIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2b2lkICprZXk7CisgICAgc2l6ZV90IGtleXNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgICAgICBpZiAoa2V5c2l6ZSAhPSAxNikgeworICAgICAgICAgICAgLy8gSVZzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCB2b2lkICppdjsKKyAgICBzaXplX3QgaXZzaXplOworICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZ0eXBlLCAmaXYsICZpdnNpemUpKSB7CisgICAgICAgIGlmIChpdnNpemUgIT0gMTYpIHsKKyAgICAgICAgICAgIC8vIElWcyBtdXN0IGJlIDE2IGJ5dGVzIGluIGxlbmd0aC4KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBtb2RlOworICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbW9kZSkpIHsKKyAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKKyAgICB9CisKKyAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldygKKyAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAodWludDhfdCopIGtleSwKKyAgICAgICAgICAgICh1aW50OF90KikgaXYsCisgICAgICAgICAgICAoY3J5cHRvaW5mb19tb2RlX3QpIG1vZGUsCisgICAgICAgICAgICAoc2l6ZV90KikgY2xlYXJkYXRhLAorICAgICAgICAgICAgKHNpemVfdCopIGNyeXB0ZWRkYXRhKTsKK30KKworCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1NGQ1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0LmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKKyAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKKyAgICBTdHJpbmc4IG1EZWJ1ZzsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Cit9OworCitleHRlcm4gIkMiIHsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQorQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7CisgICAgQUxPR1YoInByaXZhdGUgY3RvciIpOworICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7CisgICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOworICAgIHJldHVybiBtRGF0YTsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKKyAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Cit9CisKKworLyoKKyAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKKyAqLworRVhQT1JUCitBTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdF9uZXcoKSB7CisgICAgQUxPR1YoImN0b3IiKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9kZWxldGUoQU1lZGlhRm9ybWF0ICptRGF0YSkgeworICAgIEFMT0dWKCJkdG9yIik7CisgICAgZGVsZXRlIG1EYXRhOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKKworRVhQT1JUCitjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0ICptRGF0YSkgeworICAgIHNwPEFNZXNzYWdlPiBmID0gbURhdGEtPm1Gb3JtYXQ7CisgICAgU3RyaW5nOCByZXQ7CisgICAgaW50IG51bSA9IGYtPmNvdW50RW50cmllcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmV0LmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBBTWVzc2FnZTo6VHlwZSB0OworICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZi0+Z2V0RW50cnlOYW1lQXQoaSwgJnQpOworICAgICAgICByZXQuYXBwZW5kKG5hbWUpOworICAgICAgICByZXQuYXBwZW5kKCI6ICIpOworICAgICAgICBzd2l0Y2ggKHQpIHsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZEludDMyKG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImludDMyKCUiIFBSSWQzMiAiKSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDY0X3QgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmRJbnQ2NChuYW1lLCAmdmFsKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJpbnQ2NCglIiBQUklkNjQgIikiLCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTaXplOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemVfdCB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZFNpemUobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgic2l6ZV90KCV6dSkiLCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWw7CisgICAgICAgICAgICAgICAgZi0+ZmluZEZsb2F0KG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoImZsb2F0KCVmKSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgIGYtPmZpbmREb3VibGUobmFtZSwgJnZhbCk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiZG91YmxlKCVmKSIsIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHZhbDsKKyAgICAgICAgICAgICAgICBmLT5maW5kU3RyaW5nKG5hbWUsICZ2YWwpOworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoInN0cmluZyglcykiLCB2YWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJkYXRhIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoInVua25vd24oJWQpIiwgdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0LmFwcGVuZCgifSIpOworICAgIG1EYXRhLT5tRGVidWcgPSByZXQ7CisgICAgcmV0dXJuIG1EYXRhLT5tRGVidWcuc3RyaW5nKCk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMihuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQobmFtZSwgb3V0KTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRGbG9hdChBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRGbG9hdChuYW1lLCBvdXQpOworfQorCitFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFNpemUoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSB7CisgICAgcmV0dXJuIGZvcm1hdC0+bUZvcm1hdC0+ZmluZFNpemUobmFtZSwgb3V0KTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQqKiBkYXRhLCBzaXplX3QgKm91dHNpemUpIHsKKyAgICBzcDxBQnVmZmVyPiBidWY7CisgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcihuYW1lLCAmYnVmKSkgeworICAgICAgICAqZGF0YSA9IGJ1Zi0+ZGF0YSgpICsgYnVmLT5vZmZzZXQoKTsKKyAgICAgICAgKm91dHNpemUgPSBidWYtPnNpemUoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRVhQT1JUCitib29sIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiBtRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKm91dCkgeworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS0+bVN0cmluZ0NhY2hlLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobURhdGEtPm1TdHJpbmdDYWNoZS5rZXlBdChpKS5zdHJpbmcoKSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbURhdGEtPm1TdHJpbmdDYWNoZS5yZW1vdmVJdGVtc0F0KGksIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU3RyaW5nIHRtcDsKKyAgICBpZiAobURhdGEtPm1Gb3JtYXQtPmZpbmRTdHJpbmcobmFtZSwgJnRtcCkpIHsKKyAgICAgICAgU3RyaW5nOCByZXQodG1wLmNfc3RyKCkpOworICAgICAgICBtRGF0YS0+bVN0cmluZ0NhY2hlLmFkZChTdHJpbmc4KG5hbWUpLCByZXQpOworICAgICAgICAqb3V0ID0gcmV0LnN0cmluZygpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDMyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90IHZhbHVlKSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRJbnQzMihuYW1lLCB2YWx1ZSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEludDY0KG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldEZsb2F0KG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgLy8gQU1lc3NhZ2U6OnNldFN0cmluZygpIG1ha2VzIGEgY29weSBvZiB0aGUgc3RyaW5nCisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRTdHJpbmcobmFtZSwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKKyAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAorICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIG1lbWNweShidWYtPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgYnVmLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICAvLyBBTWVzc2FnZTo6c2V0QnVmZmVyKCkgaW5jcmVhc2VzIHRoZSByZWZjb3VudCBvZiB0aGUgYnVmZmVyCisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRCdWZmZXIobmFtZSwgYnVmKTsKK30KKworCitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSA9ICJhYWMtcHJvZmlsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSA9ICJiaXRyYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCA9ICJoZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUyA9ICJpcy1hZHRzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QgPSAiaXMtYXV0b3NlbGVjdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUID0gImlzLWRlZmF1bHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFID0gImlzLWZvcmNlZC1zdWJ0aXRsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFID0gIm1heC1pbnB1dC1zaXplIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSA9ICJtaW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERSA9ICJzdHJpZGUiOworCisKK30gLy8gZXh0ZXJuICJDIgorCisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM0MmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCisjaW5jbHVkZSA8TmRrTWVkaWFGb3JtYXQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHZvaWQqKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWIwMzYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYU11eGVyIgorCisKKyNpbmNsdWRlICJOZGtNZWRpYU11eGVyLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFDb2RlYy5oIgorI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0cnVjdCBBTWVkaWFNdXhlciB7CisgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CisKK307CisKK2V4dGVybiAiQyIgeworCitFWFBPUlQKK0FNZWRpYU11eGVyKiBBTWVkaWFNdXhlcl9uZXcoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KSB7CisgICAgQUxPR1YoImN0b3IiKTsKKyAgICBBTWVkaWFNdXhlciAqbURhdGEgPSBuZXcgQU1lZGlhTXV4ZXIoKTsKKyAgICBtRGF0YS0+bUltcGwgPSBuZXcgTWVkaWFNdXhlcihmZCwgKGFuZHJvaWQ6Ok1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdClmb3JtYXQpOworICAgIHJldHVybiBtRGF0YTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9kZWxldGUoQU1lZGlhTXV4ZXIgKm11eGVyKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBkZWxldGUgbXV4ZXI7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciAqbXV4ZXIsIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25ndGl0dWRlKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnNldExvY2F0aW9uKGxhdGl0dWRlICogMTAwMDAsIGxvbmd0aXR1ZGUgKiAxMDAwMCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludChBTWVkaWFNdXhlciAqbXV4ZXIsIGludCBkZWdyZWVzKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPnNldE9yaWVudGF0aW9uSGludChkZWdyZWVzKSk7Cit9CisKK0VYUE9SVAorc3NpemVfdCBBTWVkaWFNdXhlcl9hZGRUcmFjayhBTWVkaWFNdXhlciAqbXV4ZXIsIGNvbnN0IEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZvcm1hdCwgJm1zZyk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtdXhlci0+bUltcGwtPmFkZFRyYWNrKG1zZykpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3N0YXJ0KEFNZWRpYU11eGVyICptdXhlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobXV4ZXItPm1JbXBsLT5zdGFydCgpKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyICptdXhlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobXV4ZXItPm1JbXBsLT5zdG9wKCkpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3dyaXRlU2FtcGxlRGF0YShBTWVkaWFNdXhlciAqbXV4ZXIsCisgICAgICAgIHNpemVfdCB0cmFja0lkeCwgY29uc3QgdWludDhfdCAqZGF0YSwgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvKSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoKHZvaWQqKShkYXRhICsgaW5mby0+b2Zmc2V0KSwgaW5mby0+c2l6ZSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcigKKyAgICAgICAgICAgIG11eGVyLT5tSW1wbC0+d3JpdGVTYW1wbGVEYXRhKGJ1ZiwgdHJhY2tJZHgsIGluZm8tPnByZXNlbnRhdGlvblRpbWVVcywgaW5mby0+ZmxhZ3MpKTsKK30KKworCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA1NDM3N2YxLi42OTdmYjM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMTMsMjUgKzEzLDMzIEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwCisKKyMgRklYTUUgTW92ZSB0aGlzIGxpYnJhcnkgdG8gZnJhbWV3b3Jrcy9uYXRpdmUKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZXJ2aWNldXRpbGl0eQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAogICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgVHJhY2tzLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICBFZmZlY3RzLmNwcCAgICAgICAgICAgICAgICAgXAogICAgIEF1ZGlvTWl4ZXIuY3BwLmFybSAgICAgICAgICBcCi0gICAgQXVkaW9SZXNhbXBsZXIuY3BwLmFybSAgICAgIFwKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwICAgICAgXAotICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwICAgICAgICBcCi0gICAgQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybQorICAgIFBhdGNoUGFuZWwuY3BwCiAKIExPQ0FMX1NSQ19GSUxFUyArPSBTdGF0ZVF1ZXVlLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9yZXNhbXBsZXIgXAogICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYmNvbW1vbl90aW1lX2NsaWVudCBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTQzLDE3ICs1MSwyMCBAQAogICAgIGxpYmhhcmR3YXJlIFwKICAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAogICAgIGxpYmVmZmVjdHMgXAotICAgIGxpYmRsIFwKICAgICBsaWJwb3dlcm1hbmFnZXIKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGlic2NoZWR1bGluZ19wb2xpY3kgXAogICAgIGxpYmNwdXN0YXRzIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CiAKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVMgKz0gRmFzdE1peGVyLmNwcCBGYXN0TWl4ZXJTdGF0ZS5jcHAgQXVkaW9XYXRjaGRvZy5jcHAKK0xPQ0FMX1NSQ19GSUxFUyArPSBGYXN0VGhyZWFkLmNwcCBGYXN0VGhyZWFkU3RhdGUuY3BwCitMT0NBTF9TUkNfRklMRVMgKz0gRmFzdENhcHR1cmUuY3BwIEZhc3RDYXB0dXJlU3RhdGUuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSAtRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCiAKQEAgLTc0LDEyICs4NSwxNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotCXRlc3QtcmVzYW1wbGUuY3BwIAkJCVwKLSAgICBBdWRpb1Jlc2FtcGxlci5jcHAuYXJtICAgICAgXAotCUF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJTaW5jLmNwcC5hcm0KKyAgICB0ZXN0LXJlc2FtcGxlLmNwcCAgICAgICAgICAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYnNuZGZpbGUKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9yZXNhbXBsZXIgXAorICAgIGxpYmF1ZGlvdXRpbHMgXAogICAgIGxpYmRsIFwKICAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKQEAgLTkxLDQgKzEwNywyNCBAQAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1Jlc2FtcGxlci5jcHAuYXJtIFwKKyAgICBBdWRpb1Jlc2FtcGxlckN1YmljLmNwcC5hcm0gXAorICAgIEF1ZGlvUmVzYW1wbGVyU2luYy5jcHAuYXJtIFwKKyAgICBBdWRpb1Jlc2FtcGxlckR5bi5jcHAuYXJtCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJkbCBcCisgICAgbGlibG9nCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3Jlc2FtcGxlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMGFlZjUzZi4uNDEzZWMzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTgyLDYgKzgyLDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb0ZsaW5nZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrSGFyZHdhcmVMb2NrZWRTdHJpbmdbXSA9ICJIYXJkd2FyZSBsb2NrIGlzIHRha2VuXG4iOworc3RhdGljIGNvbnN0IGNoYXIga0NsaWVudExvY2tlZFN0cmluZ1tdID0gIkNsaWVudCBsb2NrIGlzIHRha2VuXG4iOwogCiAKIG5zZWNzX3QgQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzID0ga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3M7CkBAIC0xMDQsNiArMTA1LDM2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorY29uc3QgY2hhciAqZm9ybWF0VG9TdHJpbmcoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNOgorICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOiByZXR1cm4gInBjbTE2IjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOiByZXR1cm4gInBjbTgiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOiByZXR1cm4gInBjbTMyIjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOiByZXR1cm4gInBjbTguMjQiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHJldHVybiAicGNtZmxvYXQiOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDogcmV0dXJuICJwY20yNCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9NUDM6IHJldHVybiAibXAzIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BTVJfTkI6IHJldHVybiAiYW1yLW5iIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BTVJfV0I6IHJldHVybiAiYW1yLXdiIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUM6IHJldHVybiAiYWFjIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9IRV9BQUNfVjE6IHJldHVybiAiaGUtYWFjLXYxIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9IRV9BQUNfVjI6IHJldHVybiAiaGUtYWFjLXYyIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9WT1JCSVM6IHJldHVybiAidm9yYmlzIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9PUFVTOiByZXR1cm4gIm9wdXMiOworICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzogcmV0dXJuICJhYy0zIjsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzogcmV0dXJuICJlLWFjLTMiOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCiBzdGF0aWMgaW50IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQogewogICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7CkBAIC0xMjEsNyArMTUyLDcgQEAKICAgICBpZiAocmMpIHsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uICE9IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7CisgICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7CiAgICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwogICAgICAgICByYyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBvdXQ7CkBAIC0xMzgsNiArMTY5LDcgQEAKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKICAgICA6IEJuQXVkaW9GbGluZ2VyKCksCiAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2KE5VTEwpLAorICAgICAgbUF1ZGlvSHdEZXZzKE5VTEwpLAogICAgICAgbUhhcmR3YXJlU3RhdHVzKEFVRElPX0hXX0lETEUpLAogICAgICAgbU1hc3RlclZvbHVtZSgxLjBmKSwKICAgICAgIG1NYXN0ZXJNdXRlKGZhbHNlKSwKQEAgLTE0NiwxNCArMTc4LDE2IEBACiAgICAgICBtQnROcmVjSXNPZmYoZmFsc2UpLAogICAgICAgbUlzTG93UmFtRGV2aWNlKHRydWUpLAogICAgICAgbUlzRGV2aWNlVHlwZUtub3duKGZhbHNlKSwKLSAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApCisgICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKSwKKyAgICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSgwKQogewogICAgIGdldHBpZF9jYWNoZWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgYm9vbCBkb0xvZyA9IChwcm9wZXJ0eV9nZXQoInJvLnRlc3RfaGFybmVzcyIsIHZhbHVlLCAiMCIpID4gMCkgJiYgKGF0b2kodmFsdWUpID09IDEpOwogICAgIGlmIChkb0xvZykgewotICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiKTsKKyAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSk7CiAgICAgfQorCiAjaWZkZWYgVEVFX1NJTksKICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIwIik7CiAgICAgaW50IGRlYnVnZ2FibGUgPSBhdG9pKHZhbHVlKTsKQEAgLTE2MiwxMiArMTk2LDE2IEBACiAgICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwogICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7CiAgICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkKKyAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQorICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewogICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKQorICAgIH0KKyAgICBpZiAodGVlRW5hYmxlZCAmIDIpIHsKICAgICAgICAgbVRlZVNpbmtPdXRwdXRFbmFibGVkID0gdHJ1ZTsKLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpCisgICAgfQorICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewogICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7CisgICAgfQogI2VuZGlmCiB9CiAKQEAgLTE5MSw2ICsyMjksOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgbVBhdGNoUGFuZWwgPSBuZXcgUGF0Y2hQYW5lbCh0aGlzKTsKKwogICAgIG1Nb2RlID0gQVVESU9fTU9ERV9OT1JNQUw7CiB9CiAKQEAgLTIxMCw2ICsyNTAsMTggQEAKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpLT5od0RldmljZSgpKTsKICAgICAgICAgZGVsZXRlIG1BdWRpb0h3RGV2cy52YWx1ZUF0KGkpOwogICAgIH0KKworICAgIC8vIFRlbGwgbWVkaWEubG9nIHNlcnZpY2UgYWJvdXQgYW55IG9sZCB3cml0ZXJzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSB1bnJlZ2lzdGVyZWQKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBzcDxJTWVkaWFMb2dTZXJ2aWNlPiBtZWRpYUxvZ1NlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gbVVucmVnaXN0ZXJlZFdyaXRlcnMuc2l6ZSgpOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGlNZW1vcnkobVVucmVnaXN0ZXJlZFdyaXRlcnMudG9wKCktPmdldElNZW1vcnkoKSk7CisgICAgICAgICAgICBtVW5yZWdpc3RlcmVkV3JpdGVycy5wb3AoKTsKKyAgICAgICAgICAgIG1lZGlhTG9nU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKKyAgICAgICAgfQorICAgIH0KKwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKQEAgLTI0OSw3ICszMDEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTI3MSwxNyArMzIzLDE3IEBACiAgICAgfQogCiAgICAgcmVzdWx0LmFwcGVuZCgiR2xvYmFsIHNlc3Npb24gcmVmczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiBzZXNzaW9uIHBpZCBjb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICBzZXNzaW9uICAgcGlkIGNvdW50XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqciA9IG1BdWRpb1Nlc3Npb25SZWZzW2ldOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTdkICUzZCAlM2RcbiIsIHItPm1TZXNzaW9uaWQsIHItPm1QaWQsIHItPm1DbnQpOworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICU3ZCAlNWQgJTVkXG4iLCByLT5tU2Vzc2lvbmlkLCByLT5tUGlkLCByLT5tQ250KTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0yOTYsNyArMzQ4LDcgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC0zNDQsNyArMzk2LDE2IEBACiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2wgY2xpZW50TG9ja2VkID0gZHVtcFRyeUxvY2sobUNsaWVudExvY2spOworICAgICAgICBpZiAoIWNsaWVudExvY2tlZCkgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0NsaWVudExvY2tlZFN0cmluZyk7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQogICAgICAgICBkdW1wQ2xpZW50cyhmZCwgYXJncyk7CisgICAgICAgIGlmIChjbGllbnRMb2NrZWQpIHsKKyAgICAgICAgICAgIG1DbGllbnRMb2NrLnVubG9jaygpOworICAgICAgICB9CisKICAgICAgICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAKICAgICAgICAgLy8gZHVtcCBwbGF5YmFjayB0aHJlYWRzCkBAIC0zNTcsNiArNDE4LDEzIEBACiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5kdW1wKGZkLCBhcmdzKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIGR1bXAgb3JwaGFuIGVmZmVjdCBjaGFpbnMKKyAgICAgICAgaWYgKG1PcnBoYW5FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHdyaXRlKGZkLCAiICBPcnBoYW4gRWZmZWN0IENoYWluc1xuIiwgc3RybGVuKCIgIE9ycGhhbiBFZmZlY3QgQ2hhaW5zXG4iKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcnBoYW5FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtT3JwaGFuRWZmZWN0Q2hhaW5zLnZhbHVlQXQoaSktPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIGR1bXAgYWxsIGhhcmR3YXJlIGRldnMKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Id0RldnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKQEAgLTM3OSw3ICs0NDcsNyBAQAogICAgICAgICBpZiAobUxvZ01lbW9yeURlYWxlciAhPSAwKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEubG9nIikpOwogICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICJcbm1lZGlhLmxvZzpcbiIpOworICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbm1lZGlhLmxvZzpcbiIpOwogICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKICAgICAgICAgICAgICAgICBiaW5kZXItPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICAgICAgfQpAQCAtMzg4LDggKzQ1Niw5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4gQXVkaW9GbGluZ2VyOjpyZWdpc3RlclBpZF9sKHBpZF90IHBpZCkKK3NwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyUGlkKHBpZF90IHBpZCkKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAvLyBJZiBwaWQgaXMgYWxyZWFkeSBpbiB0aGUgbUNsaWVudHMgd3A8PiBtYXAsIHRoZW4gdXNlIHRoYXQgZW50cnkKICAgICAvLyAoZm9yIHdoaWNoIHByb21vdGUoKSBpcyBhbHdheXMgIT0gMCksIG90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW50cnkgYW5kIENsaWVudC4KICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG1DbGllbnRzLnZhbHVlRm9yKHBpZCkucHJvbW90ZSgpOwpAQCAtNDAzLDE2ICs0NzIsNDQgQEAKIAogc3A8TkJMb2c6OldyaXRlcj4gQXVkaW9GbGluZ2VyOjpuZXdXcml0ZXJfbChzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2dzLCByZXR1cm4gYSBkdW1teSB3cml0ZXIgdGhhdCBkb2VzIG5vdGhpbmcKICAgICBpZiAobUxvZ01lbW9yeURlYWxlciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KLSAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOwotICAgIHNwPE5CTG9nOjpXcml0ZXI+IHdyaXRlciA9IG5ldyBOQkxvZzo6V3JpdGVyKHNpemUsIHNoYXJlZCk7CiAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKLSAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKS0+cmVnaXN0ZXJXcml0ZXIoc2hhcmVkLCBzaXplLCBuYW1lKTsKKyAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgaWYgKGJpbmRlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KLSAgICByZXR1cm4gd3JpdGVyOworICAgIHNwPElNZWRpYUxvZ1NlcnZpY2U+IG1lZGlhTG9nU2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFMb2dTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICBzcDxJTWVtb3J5PiBzaGFyZWQgPSBtTG9nTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkpOworICAgIC8vIElmIGFsbG9jYXRpb24gZmFpbHMsIGNvbnN1bHQgdGhlIHZlY3RvciBvZiBwcmV2aW91c2x5IHVucmVnaXN0ZXJlZCB3cml0ZXJzCisgICAgLy8gYW5kIGdhcmJhZ2UtY29sbGVjdCBvbmUgb3IgbW9yZSB0aGVtIHVudGlsIGFuIGFsbG9jYXRpb24gc3VjY2VlZHMKKyAgICBpZiAoc2hhcmVkID09IDApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGNvdW50ID0gbVVucmVnaXN0ZXJlZFdyaXRlcnMuc2l6ZSgpOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBQaWNrIHRoZSBvbGRlc3Qgc3RhbGUgd3JpdGVyIHRvIGdhcmJhZ2UtY29sbGVjdAorICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGlNZW1vcnkobVVucmVnaXN0ZXJlZFdyaXRlcnNbMF0tPmdldElNZW1vcnkoKSk7CisgICAgICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICAgICAgbWVkaWFMb2dTZXJ2aWNlLT51bnJlZ2lzdGVyV3JpdGVyKGlNZW1vcnkpOworICAgICAgICAgICAgICAgIC8vIE5vdyB0aGUgbWVkaWEubG9nIHJlbW90ZSByZWZlcmVuY2UgdG8gSU1lbW9yeSBpcyBnb25lLiAgV2hlbiBvdXIgbGFzdCBsb2NhbAorICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byBJTWVtb3J5IGFsc28gZHJvcHMgdG8gemVybyBhdCBlbmQgb2YgdGhpcyBibG9jaywKKyAgICAgICAgICAgICAgICAvLyB0aGUgSU1lbW9yeSBkZXN0cnVjdG9yIHdpbGwgZGVhbGxvY2F0ZSB0aGUgcmVnaW9uIGZyb20gbUxvZ01lbW9yeURlYWxlci4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJlLWF0dGVtcHQgdGhlIGFsbG9jYXRpb24KKyAgICAgICAgICAgIHNoYXJlZCA9IG1Mb2dNZW1vcnlEZWFsZXItPmFsbG9jYXRlKE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSk7CisgICAgICAgICAgICBpZiAoc2hhcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRXZlbiBhZnRlciBnYXJiYWdlLWNvbGxlY3RpbmcgYWxsIG9sZCB3cml0ZXJzLCB0aGVyZSBpcyBzdGlsbCBub3QgZW5vdWdoIG1lbW9yeSwKKyAgICAgICAgLy8gc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyCisgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOworICAgIH0KK3N1Y2Nlc3M6CisgICAgbWVkaWFMb2dTZXJ2aWNlLT5yZWdpc3RlcldyaXRlcihzaGFyZWQsIHNpemUsIG5hbWUpOworICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcihzaXplLCBzaGFyZWQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6dW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiYgd3JpdGVyKQpAQCAtNDI0LDEzICs1MjEsMTAgQEAKICAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmxvZyIpKTsKLSAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTG9nU2VydmljZT4oYmluZGVyKS0+dW5yZWdpc3RlcldyaXRlcihpTWVtb3J5KTsKLSAgICAgICAgLy8gTm93IHRoZSBtZWRpYS5sb2cgcmVtb3RlIHJlZmVyZW5jZSB0byBJTWVtb3J5IGlzIGdvbmUuCi0gICAgICAgIC8vIFdoZW4gb3VyIGxhc3QgbG9jYWwgcmVmZXJlbmNlIHRvIElNZW1vcnkgYWxzbyBkcm9wcyB0byB6ZXJvLAotICAgICAgICAvLyB0aGUgSU1lbW9yeSBkZXN0cnVjdG9yIHdpbGwgZGVhbGxvY2F0ZSB0aGUgcmVnaW9uIGZyb20gbU1lbW9yeURlYWxlci4KLSAgICB9CisgICAgLy8gUmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHdyaXRlciBpbW1lZGlhdGVseSwgYXBwZW5kIGl0IHRvIGEgcXVldWUgb2Ygb2xkIHdyaXRlcnMgdG8KKyAgICAvLyBiZSBnYXJiYWdlLWNvbGxlY3RlZCBsYXRlci4gIFRoaXMgYWxsb3dzIHVzIHRvIGNvbnRpbnVlIHRvIHZpZXcgb2xkIGxvZ3MgZm9yIGEgd2hpbGUuCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VbnJlZ2lzdGVyZWRXcml0ZXJzTG9jayk7CisgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnMucHVzaCh3cml0ZXIpOwogfQogCiAvLyBJQXVkaW9GbGluZ2VyIGludGVyZmFjZQpAQCAtNDQxLDEzICs1MzUsMTIgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqZnJhbWVDb3VudCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKQEAgLTQ2NSwxMCArNTU4LDI5IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnNpb24gb2YgOC1iaXQgUENNIHRvIDE2LWJpdCBQQ00sCi0gICAgLy8gYW5kIHdlIGRvbid0IHlldCBzdXBwb3J0IDguMjQgb3IgMzItYml0IFBDTQotICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAvLyBmdXJ0aGVyIHNhbXBsZSByYXRlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCisgICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIHNhbXBsZSByYXRlICV1Iiwgc2FtcGxlUmF0ZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGNoYW5uZWwgbWFzayBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjaygpIGludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8vIGZ1cnRoZXIgZm9ybWF0IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgc2hhcmVkQnVmZmVyIGlzIG5vbi0wIGJ1dCBoYXMgTlVMTCBwb2ludGVyKCkiKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTQ3Niw3ICs1ODgsNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwotICAgICAgICBQbGF5YmFja1RocmVhZCAqZWZmZWN0VGhyZWFkID0gTlVMTDsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBvdXRwdXQgaGFuZGxlICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CkBAIC00ODQsMjQgKzU5NSwyMyBAQAogICAgICAgICB9CiAKICAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOwogCi0gICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkX2wocGlkKTsKLQotICAgICAgICBBTE9HVigiY3JlYXRlVHJhY2soKSBzZXNzaW9uSWQ6ICVkIiwgKHNlc3Npb25JZCA9PSBOVUxMKSA/IC0yIDogKnNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBQbGF5YmFja1RocmVhZCAqZWZmZWN0VGhyZWFkID0gTlVMTDsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMICYmICpzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CiAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlZmZlY3QgY2hhaW4gd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIHByZXNlbnQgb24gYW5vdGhlcgogICAgICAgICAgICAgLy8gb3V0cHV0IHRocmVhZCBhbmQgbW92ZSBpdCBoZXJlLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKCpzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9ucyA9IHQtPmhhc0F1ZGlvU2Vzc2lvbihsU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25zICYgUGxheWJhY2tUaHJlYWQ6OkVGRkVDVF9TRVNTSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RUaHJlYWQgPSB0LmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGlmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQogICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOwpAQCAtNTE5LDEzICs2MjksMTQgQEAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZAogICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUiAmJiBlZmZlY3RUaHJlYWQgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gbm8gcmlzayBvZiBkZWFkbG9jayBiZWNhdXNlIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaXMgaGVsZAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfc2woZWZmZWN0VGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChsU2Vzc2lvbklkLCBlZmZlY3RUaHJlYWQsIHRocmVhZCwgdHJ1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBMb29rIGZvciBzeW5jIGV2ZW50cyBhd2FpdGluZyBmb3IgYSBzZXNzaW9uIHRvIGJlIHVzZWQuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCltUGVuZGluZ1N5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGVuZGluZ1N5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChtUGVuZGluZ1N5bmNFdmVudHNbaV0tPnRyaWdnZXJTZXNzaW9uKCkgPT0gbFNlc3Npb25JZCkgewogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQtPmlzVmFsaWRTeW5jRXZlbnQobVBlbmRpbmdTeW5jRXZlbnRzW2ldKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtNTM4LDIzICs2NDksMjcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gcyBmb3Igc2VydmVyJ3MgcGlkLCBuIGZvciBub3JtYWwgbWl4ZXIgbmFtZSwgZiBmb3IgZmFzdCBpbmRleAotICAgICAgICBuYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJzOiVkO246JWQ7ZjolZCIsIGdldHBpZF9jYWNoZWQsIHRyYWNrLT5uYW1lKCkgLSBBdWRpb01peGVyOjpUUkFDSzAsCi0gICAgICAgICAgICAgICAgdHJhY2stPmZhc3RJbmRleCgpKTsKLSAgICAgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCBiZWZvcmUgZGVsZXRpbmcgdGhlIFRyYWNrIHNvIHRoYXQgdGhlIENsaWVudAotICAgICAgICAvLyBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtTG9jayBoZWxkCi0gICAgICAgIGNsaWVudC5jbGVhcigpOwotICAgICAgICB0cmFjay5jbGVhcigpOworCiAgICAgfQogCi1FeGl0OgotICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBUcmFjayBzbyB0aGF0IHRoZQorICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgYnkgdGhlIFRyYWNrQmFzZSBkZXN0cnVjdG9yIHdpdGggbUNsaWVudExvY2sgaGVsZAorICAgICAgICAvLyBEb24ndCBob2xkIG1DbGllbnRMb2NrIHdoZW4gcmVsZWFzaW5nIHRoZSByZWZlcmVuY2Ugb24gdGhlIHRyYWNrIGFzIHRoZQorICAgICAgICAvLyBkZXN0cnVjdG9yIHdpbGwgYWNxdWlyZSBpdC4KKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgICAgICBjbGllbnQuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjay5jbGVhcigpOworICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQorCisgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKKyAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CisKK0V4aXQ6CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwogfQogCkBAIC01NjksMTcgKzY4NCw2IEBACiAgICAgcmV0dXJuIHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogfQogCi1pbnQgQXVkaW9GbGluZ2VyOjpjaGFubmVsQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOwotICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiY2hhbm5lbENvdW50KCkgdW5rbm93biB0aHJlYWQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7Ci19Ci0KIGF1ZGlvX2Zvcm1hdF90IEF1ZGlvRmxpbmdlcjo6Zm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNzAzLDkgKzgwNywxNCBAQAogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NSUNfTVVURTsKLSAgICByZXQgPSBkZXYtPnNldF9taWNfbXV0ZShkZXYsIHN0YXRlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGRldi0+c2V0X21pY19tdXRlKGRldiwgc3RhdGUpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXQgPSByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtODA0LDcgKzkxMyw3IEBACiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0gICAgaWYgKG91dHB1dCkgeworICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTgzOSw3ICs5NDgsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtdXRlZDsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspCiAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0U3RyZWFtTXV0ZShzdHJlYW0sIG11dGVkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTg1Myw3ICs5NjIsNyBAQAogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGZsb2F0IHZvbHVtZTsKLSAgICBpZiAob3V0cHV0KSB7CisgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIDAuMGY7CkBAIC04ODYsOCArOTk1LDggQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIC8vIGlvSGFuZGxlID09IDAgbWVhbnMgdGhlIHBhcmFtZXRlcnMgYXJlIGdsb2JhbCB0byB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlCi0gICAgaWYgKGlvSGFuZGxlID09IDApIHsKKyAgICAvLyBBVURJT19JT19IQU5ETEVfTk9ORSBtZWFucyB0aGUgcGFyYW1ldGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UKKyAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgc3RhdHVzX3QgZmluYWxfcmVzdWx0ID0gTk9fRVJST1I7CiAgICAgICAgIHsKQEAgLTk2OSw3ICsxMDc4LDcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICBpZiAoaW9IYW5kbGUgPT0gMCkgeworICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBTdHJpbmc4IG91dF9zODsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewpAQCAtMTAwOCw3ICsxMTE3LDcgQEAKIAogICAgIEF1dG9NdXRleCBsb2NrKG1IYXJkd2FyZUxvY2spOwogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0dFVF9JTlBVVF9CVUZGRVJfU0laRTsKLSAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGNvbmZpZzsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWc7CiAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOwogICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKQEAgLTEwMjAsNyArMTEyOSw3IEBACiAgICAgcmV0dXJuIHNpemU7CiB9CiAKLXVuc2lnbmVkIGludCBBdWRpb0ZsaW5nZXI6OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKQEAgLTEwNTIsNyArMTE2MSw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CkBAIC0xMDY5LDIxICsxMTc4LDMyIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQogewotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGNsaWVudEFkZGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKIAotICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleShwaWQpIDwgMCkgewotICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKLSAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCBwaWQgJWQiLCBub3RpZmljYXRpb25DbGllbnQuZ2V0KCksIHBpZCk7CisgICAgICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKSA8IDApIHsKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHBpZCAlZCIsIG5vdGlmaWNhdGlvbkNsaWVudC5nZXQoKSwgcGlkKTsKIAotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5hZGQocGlkLCBub3RpZmljYXRpb25DbGllbnQpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHBpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNsaWVudC0+YXNCaW5kZXIoKTsKKyAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudEFkZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIC8vIG1DbGllbnRMb2NrIHNob3VsZCBub3QgYmUgaGVsZCBoZXJlIGJlY2F1c2UgVGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnQoKSB3aWxsIGxvY2sgdGhlCisgICAgLy8gVGhyZWFkQmFzZSBtdXRleCBhbmQgdGhlIGxvY2tpbmcgb3JkZXIgaXMgVGhyZWFkQmFzZTo6bUxvY2sgdGhlbiBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrLgorICAgIGlmIChjbGllbnRBZGRlZCkgewogICAgICAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCiAgICAgICAgIC8vIHdpdGggQXVkaW9TeXN0ZW06OmdMb2NrCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewpAQCAtMTA5OSw4ICsxMjE5LDEwIEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKKyAgICB9CiAKICAgICBBTE9HVigiJWQgZGllZCwgcmVsZWFzaW5nIGl0cyBzZXNzaW9ucyIsIHBpZCk7CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTExMjMsMTcgKzEyNDUsMTggQEAKICAgICB9CiB9CiAKLS8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCB2b2lkICpwYXJhbTIpCit2b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMik7CiAgICAgfQogfQogCi0vLyByZW1vdmVDbGllbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCisvLyByZW1vdmVDbGllbnRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6cmVtb3ZlQ2xpZW50X2wocGlkX3QgcGlkKQogewogICAgIEFMT0dWKCJyZW1vdmVDbGllbnRfbCgpIHBpZCAlZCwgY2FsbGluZyBwaWQgJWQiLCBwaWQsCkBAIC0xMTcxLDcgKzEyOTQsNyBAQAogICAgIC8vIDEgTUIgb2YgYWRkcmVzcyBzcGFjZSBpcyBnb29kIGZvciAzMiB0cmFja3MsIDggYnVmZmVycyBlYWNoLCA0IEtCL2J1ZmZlcgogfQogCi0vLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1DbGllbnRMb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6Q2xpZW50Ojp+Q2xpZW50KCkKIHsKICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVDbGllbnRfbChtUGlkKTsKQEAgLTEyMjAsNyArMTM0Myw3IEBACiB7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CiAgICAgbUF1ZGlvRmxpbmdlci0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1QaWQpOwpAQCAtMTIzOCwyMCArMTM2MSwyNCBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKKyAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiByZWNvcmRUcmFjazsKICAgICBzcDxSZWNvcmRIYW5kbGU+IHJlY29yZEhhbmRsZTsKICAgICBzcDxDbGllbnQ+IGNsaWVudDsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwotICAgIFJlY29yZFRocmVhZCAqdGhyZWFkOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQ7CiAgICAgaW50IGxTZXNzaW9uSWQ7CiAKKyAgICBjYmxrLmNsZWFyKCk7CisgICAgYnVmZmVycy5jbGVhcigpOworCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwogICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCIpOwpAQCAtMTI1OSwxNiArMTM4NiwzMSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICVkIiwgZm9ybWF0KTsKKyAgICAvLyBmdXJ0aGVyIHNhbXBsZSByYXRlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVJlY29yZFRyYWNrX2woKQorICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBpbnZhbGlkIHNhbXBsZSByYXRlICV1Iiwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBhZGQgY2xpZW50IHRvIGxpc3QKLSAgICB7IC8vIHNjb3BlIGZvciBtTG9jaworICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gMTYtYml0IFBDTQorICAgIGlmICghKGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBmdXJ0aGVyIGNoYW5uZWwgbWFzayBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVSZWNvcmRUcmFja19sKCkKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKKyAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlucHV0KTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGNoZWNrUmVjb3JkVGhyZWFkX2wgZmFpbGVkIik7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTI4Myw0MiArMTQyNSw1OCBAQAogICAgICAgICB9CiAKICAgICAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZF9sKHBpZCk7CisgICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CiAKLSAgICAgICAgLy8gSWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQogICAgICAgICAgICAgbFNlc3Npb25JZCA9IG5leHRVbmlxdWVJZCgpOwogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKnNlc3Npb25JZCA9IGxTZXNzaW9uSWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gY3JlYXRlIG5ldyByZWNvcmQgdHJhY2suCi0gICAgICAgIC8vIFRoZSByZWNvcmQgdHJhY2sgdXNlcyBvbmUgdHJhY2sgaW4gbUhhcmR3YXJlTWl4ZXJUaHJlYWQgYnkgY29udmVudGlvbi4KKyAgICAgICAgQUxPR1YoIm9wZW5SZWNvcmQoKSBsU2Vzc2lvbklkOiAlZCBpbnB1dCAlZCIsIGxTZXNzaW9uSWQsIGlucHV0KTsKKwogICAgICAgICAvLyBUT0RPOiB0aGUgdWlkIHNob3VsZCBiZSBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgdG8gb3BlblJlY29yZAogICAgICAgICByZWNvcmRUcmFjayA9IHRocmVhZC0+Y3JlYXRlUmVjb3JkVHJhY2tfbChjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGxTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGxTZXNzaW9uSWQsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGlkLCAmbFN0YXR1cyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZWNvcmRUcmFjayA9PSAwKSk7CisKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSBlZmZlY3QgY2hhaW4gd2FzIGF3YWl0aW5nIGZvciBhbiBBdWRpb1JlY29yZCB0byBiZSBjcmVhdGVkIG9uIHRoaXMKKyAgICAgICAgICAgIC8vIHNlc3Npb24gYW5kIG1vdmUgaXQgdG8gdGhpcyB0aHJlYWQuCisgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKChhdWRpb19zZXNzaW9uX3QpbFNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUKLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1Mb2NrIGhlbGQKLSAgICAgICAgY2xpZW50LmNsZWFyKCk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIGlzIGNhbGxlZCBieSB0aGUgVHJhY2tCYXNlIGRlc3RydWN0b3Igd2l0aCBtQ2xpZW50TG9jayBoZWxkCisgICAgICAgIC8vIERvbid0IGhvbGQgbUNsaWVudExvY2sgd2hlbiByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSBvbiB0aGUgdHJhY2sgYXMgdGhlCisgICAgICAgIC8vIGRlc3RydWN0b3Igd2lsbCBhY3F1aXJlIGl0LgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyByZXR1cm4gdG8gaGFuZGxlIHRvIGNsaWVudAorICAgIGNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOworICAgIGJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOworCisgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKLSAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHJlY29yZEhhbmRsZTsKIH0KIApAQCAtMTMyOCw2ICsxNDg2LDkgQEAKIAogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvRmxpbmdlcjo6bG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNDA2LDcgKzE1NjcsNyBAQAogICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSBuZXh0VW5pcXVlSWQoKTsKLSAgICBtQXVkaW9Id0RldnMuYWRkKGhhbmRsZSwgbmV3IEF1ZGlvSHdEZXZpY2UobmFtZSwgZGV2LCBmbGFncykpOworICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKIAogICAgIEFMT0dJKCJsb2FkSHdNb2R1bGUoKSBMb2FkZWQgJXMgYXVkaW8gaW50ZXJmYWNlIGZyb20gJXMgKCVzKSBoYW5kbGUgJWQiLAogICAgICAgICAgIG5hbWUsIGRldi0+Y29tbW9uLm1vZHVsZS0+bmFtZSwgZGV2LT5jb21tb24ubW9kdWxlLT5pZCwgaGFuZGxlKTsKQEAgLTE0NDgsMTE3ICsxNjA5LDE1NSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCh0aHJlYWQtPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICYgVGhyZWFkQmFzZTo6VFJBQ0tfU0VTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgLy8gQSBzZXNzaW9uIGNhbiBvbmx5IGJlIG9uIG9uZSB0aHJlYWQsIHNvIGV4aXQgYWZ0ZXIgZmlyc3QgbWF0Y2gKKyAgICAgICAgICAgIFN0cmluZzggcmVwbHkgPSB0aHJlYWQtPmdldFBhcmFtZXRlcnMoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkMpKTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIocmVwbHkpOworICAgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKworc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZD4gQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IE5VTEw7Ci0gICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBjb25maWc7Ci0gICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgPyAqcFNhbXBsaW5nUmF0ZSA6IDA7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgPyAqcENoYW5uZWxNYXNrIDogMDsKLSAgICBjb25maWcuZm9ybWF0ID0gKHBGb3JtYXQgIT0gTlVMTCkgPyAqcEZvcm1hdCA6IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIGlmIChvZmZsb2FkSW5mbykgewotICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgIEF1ZGlvSHdEZXZpY2UgKm91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOworICAgIGlmIChvdXRId0RldiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtID0gTlVMTDsKLSAgICBBdWRpb0h3RGV2aWNlICpvdXRId0RldjsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZIYWwgPSBvdXRId0Rldi0+aHdEZXZpY2UoKTsKKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgfQogCisgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfT1VUUFVUX09QRU47CisKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm91dFN0cmVhbSA9IE5VTEw7CisKKyAgICAvLyBGT1IgVEVTVElORyBPTkxZOgorICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGFsbG93cyBvdmVycmlkaW5nIHRoZSBhdWRpbyBwb2xpY3kgc2V0dGluZ3MKKyAgICAvLyBhbmQgZm9yY2luZyBhIHNwZWNpZmljIGZvcm1hdCBvciBjaGFubmVsIG1hc2sgdG8gdGhlIEhBTC9TaW5rIGRldmljZSBmb3IgdGVzdGluZy4KKyAgICBpZiAoIShmbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkpIHsKKyAgICAgICAgLy8gQ2hlY2sgb25seSBmb3IgTm9ybWFsIE1peGluZyBtb2RlCisgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24pIHsKKyAgICAgICAgICAgIC8vIFNwZWNpZnkgZm9ybWF0ICh1bmNvbW1lbnQgb25lIGJlbG93IHRvIGNob29zZSkKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICAgICAgLy9jb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgICAgIC8vY29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfMjRfQklUOworICAgICAgICAgICAgLy8gQUxPR1YoIm9wZW5PdXRwdXRfbCgpIHVwZ3JhZGluZyBmb3JtYXQgdG8gJSMwOHgiLCBjb25maWctPmZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAvLyBTcGVjaWZ5IGNoYW5uZWwgbWFzayAodW5jb21tZW50IG9uZSBiZWxvdyB0byBjaG9vc2UpCisgICAgICAgICAgICAvL2NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KDQpOyAgLy8gZm9yIFVTQiA0Y2gKKyAgICAgICAgICAgIC8vY29uZmlnLT5jaGFubmVsX21hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfZnJvbV9yZXByZXNlbnRhdGlvbl9hbmRfYml0cygKKyAgICAgICAgICAgIC8vICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYLCAoMSA8PCA0KSAtIDEpOyAgLy8gYW5vdGhlciA0Y2ggZXhhbXBsZQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOworICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgIG91dFN0cmVhbSwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgc3RhdHVzKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgb3V0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dFN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbU91dChvdXRId0Rldiwgb3V0U3RyZWFtLCBmbGFncyk7CisKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZDsKKyAgICAgICAgaWYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgeworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG9mZmxvYWQgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkKKyAgICAgICAgICAgICAgICB8fCAhaXNWYWxpZFBjbVNpbmtGb3JtYXQoY29uZmlnLT5mb3JtYXQpCisgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spKSB7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgRGlyZWN0T3V0cHV0VGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBtaXhlciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsICpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CiAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgbW9kdWxlICVkIERldmljZSAleCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsIENoYW5uZWxzICV4LCBmbGFncyAleCIsCiAgICAgICAgICAgICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgKHBEZXZpY2VzICE9IE5VTEwpID8gKnBEZXZpY2VzIDogMCwKLSAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICBjb25maWcuZm9ybWF0LAotICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAoZGV2aWNlcyAhPSBOVUxMKSA/ICpkZXZpY2VzIDogMCwKKyAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgb2ZmbG9hZEluZm8gJXAgdmVyc2lvbiAweCUwNHgiLAotICAgICAgICAgIG9mZmxvYWRJbmZvLCBvZmZsb2FkSW5mbyA9PSBOVUxMID8gLTEgOiBvZmZsb2FkSW5mby0+dmVyc2lvbiApOwogCi0gICAgaWYgKHBEZXZpY2VzID09IE5VTEwgfHwgKnBEZXZpY2VzID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCpkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIG91dEh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsICpwRGV2aWNlcyk7Ci0gICAgaWYgKG91dEh3RGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2SGFsID0gb3V0SHdEZXYtPmh3RGV2aWNlKCk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKLQotICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX09VVFBVVF9PUEVOOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaHdEZXZIYWwtPm9wZW5fb3V0cHV0X3N0cmVhbShod0RldkhhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJlYW0pOwotCi0gICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLSAgICBBTE9HVigib3Blbk91dHB1dCgpIG9wZW5PdXRwdXRTdHJlYW0gcmV0dXJuZWQgb3V0cHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgIgotICAgICAgICAgICAgIkNoYW5uZWxzICV4LCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgb3V0U3RyZWFtLAotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBzdGF0dXMpOwotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBvdXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbmV3IEF1ZGlvU3RyZWFtT3V0KG91dEh3RGV2LCBvdXRTdHJlYW0sIGZsYWdzKTsKLQotICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIG9mZmxvYWQgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHx8Ci0gICAgICAgICAgICAoY29uZmlnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgfHwKLSAgICAgICAgICAgIChjb25maWcuY2hhbm5lbF9tYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBEaXJlY3RPdXRwdXRUaHJlYWQodGhpcywgb3V0cHV0LCBpZCwgKnBEZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBpZCwgdGhyZWFkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSBjcmVhdGVkIG1peGVyIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7Ci0KLSAgICAgICAgaWYgKHBTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBTYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ2hhbm5lbE1hc2sgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBDaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBMYXRlbmN5TXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKLSAgICAgICAgfQorICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQgPSBvcGVuT3V0cHV0X2wobW9kdWxlLCBvdXRwdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIGZsYWdzKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgKmxhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwogCiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX09QRU5FRCk7CiAKICAgICAgICAgLy8gdGhlIGZpcnN0IHByaW1hcnkgb3V0cHV0IG9wZW5lZCBkZXNpZ25hdGVzIHRoZSBwcmltYXJ5IGh3IGRldmljZQogICAgICAgICBpZiAoKG1QcmltYXJ5SGFyZHdhcmVEZXYgPT0gTlVMTCkgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkpIHsKICAgICAgICAgICAgIEFMT0dJKCJVc2luZyBtb2R1bGUgJWQgaGFzIHRoZSBwcmltYXJ5IGF1ZGlvIGludGVyZmFjZSIsIG1vZHVsZSk7Ci0gICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2ID0gb3V0SHdEZXY7CisgICAgICAgICAgICBtUHJpbWFyeUhhcmR3YXJlRGV2ID0gdGhyZWFkLT5nZXRPdXRwdXQoKS0+YXVkaW9Id0RldjsKIAogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgICAgICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTU9ERTsKLSAgICAgICAgICAgIGh3RGV2SGFsLT5zZXRfbW9kZShod0RldkhhbCwgbU1vZGUpOworICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKS0+c2V0X21vZGUobVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKSwgbU1vZGUpOwogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKKworICAgICAgICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC0xNTcxLDcgKzE3NzAsNyBAQAogICAgIGlmICh0aHJlYWQxID09IE5VTEwgfHwgdGhyZWFkMiA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJvcGVuRHVwbGljYXRlT3V0cHV0KCkgd3Jvbmcgb3V0cHV0IG1peGVyIHR5cGUgZm9yIG91dHB1dCAlZCBvciAlZCIsIG91dHB1dDEsCiAgICAgICAgICAgICAgICAgb3V0cHV0Mik7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQgPSBuZXh0VW5pcXVlSWQoKTsKQEAgLTE1NzksNyArMTc3OCw3IEBACiAgICAgdGhyZWFkLT5hZGRPdXRwdXRUcmFjayh0aHJlYWQyKTsKICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZChpZCwgdGhyZWFkKTsKICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgotICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKICAgICByZXR1cm4gaWQ7CiB9CiAKQEAgLTE2MjgsMjIgKzE4MjcsMzUgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQsIG91dHB1dCwgTlVMTCk7CisgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCwgb3V0cHV0LCBOVUxMKTsKICAgICB9CiAgICAgdGhyZWFkLT5leGl0KCk7CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KIAogICAgIGlmICghdGhyZWFkLT5pc0R1cGxpY2F0aW5nKCkpIHsKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dCA9IHRocmVhZC0+Y2xlYXJPdXRwdXQoKTsKLSAgICAgICAgQUxPR19BU1NFUlQob3V0ICE9IE5VTEwsICJvdXQgc2hvdWxkbid0IGJlIE5VTEwiKTsKLSAgICAgICAgLy8gZnJvbSBub3cgb24gdGhyZWFkLT5tT3V0cHV0IGlzIE5VTEwKLSAgICAgICAgb3V0LT5od0RldigpLT5jbG9zZV9vdXRwdXRfc3RyZWFtKG91dC0+aHdEZXYoKSwgb3V0LT5zdHJlYW0pOwotICAgICAgICBkZWxldGUgb3V0OworICAgICAgICBjbG9zZU91dHB1dEZpbmlzaCh0aHJlYWQpOwogICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0RmluaXNoKHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQpCit7CisgICAgQXVkaW9TdHJlYW1PdXQgKm91dCA9IHRocmVhZC0+Y2xlYXJPdXRwdXQoKTsKKyAgICBBTE9HX0FTU0VSVChvdXQgIT0gTlVMTCwgIm91dCBzaG91bGRuJ3QgYmUgTlVMTCIpOworICAgIC8vIGZyb20gbm93IG9uIHRocmVhZC0+bU91dHB1dCBpcyBOVUxMCisgICAgb3V0LT5od0RldigpLT5jbG9zZV9vdXRwdXRfc3RyZWFtKG91dC0+aHdEZXYoKSwgb3V0LT5zdHJlYW0pOworICAgIGRlbGV0ZSBvdXQ7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZU91dHB1dEludGVybmFsX2woc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCkKK3sKKyAgICBtUGxheWJhY2tUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOworICAgIHRocmVhZC0+ZXhpdCgpOworICAgIGNsb3NlT3V0cHV0RmluaXNoKHRocmVhZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE2NzUsNTggKzE4ODcsNzYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIFJlY29yZFRocmVhZCAqdGhyZWFkID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnIGNvbmZpZzsKLSAgICBjb25maWcuc2FtcGxlX3JhdGUgPSAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSA/ICpwU2FtcGxpbmdSYXRlIDogMDsKLSAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKHBDaGFubmVsTWFzayAhPSBOVUxMKSA/ICpwQ2hhbm5lbE1hc2sgOiAwOwotICAgIGNvbmZpZy5mb3JtYXQgPSAocEZvcm1hdCAhPSBOVUxMKSA/ICpwRm9ybWF0IDogQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHVpbnQzMl90IHJlcVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHJlcUNoYW5uZWxzID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaW5TdHJlYW0gPSBOVUxMOwotICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXY7CisgICAgaWYgKCpkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBpZiAocERldmljZXMgPT0gTlVMTCB8fCAqcERldmljZXMgPT0gMCkgeworICAgIHNwPFJlY29yZFRocmVhZD4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKKworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCisgICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZD4gQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZSk7CisgICAgaWYgKGluSHdEZXYgPT0gTlVMTCkgeworICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICppbnB1dCA9IG5leHRVbmlxdWVJZCgpOworICAgIH0KIAotICAgIGluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgKnBEZXZpY2VzKTsKLSAgICBpZiAoaW5Id0RldiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLQorICAgIGF1ZGlvX2NvbmZpZ190IGhhbGNvbmZpZyA9ICpjb25maWc7CiAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0KLSAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCBpZCwgKnBEZXZpY2VzLCAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSk7Ci0gICAgQUxPR1YoIm9wZW5JbnB1dCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJWQsIENoYW5uZWxzICV4LCAiCi0gICAgICAgICAgICAic3RhdHVzICVkIiwKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqaW5TdHJlYW0gPSBOVUxMOworICAgIHN0YXR1c190IHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSwgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSk7CisgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBTYW1wbGluZ1JhdGUgJWQiCisgICAgICAgICAgICIsIEZvcm1hdCAlI3gsIENoYW5uZWxzICV4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCIsCiAgICAgICAgICAgICBpblN0cmVhbSwKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCi0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgaGFsY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgaGFsY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgIGhhbGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgIHN0YXR1cyk7CiAKICAgICAvLyBJZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycyBhbmQgd2UgY2FuIGhhbmRsZSB0aGUKICAgICAvLyBjb252ZXJzaW9uIGludGVybmFsbHksIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuIFRoZSBBdWRpb0ZsaW5nZXIgY2FuCiAgICAgLy8gcmVzYW1wbGUgdGhlIGlucHV0IGFuZCBkbyBtb25vIHRvIHN0ZXJlbyBvciBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9ucyBvbiAxNiBiaXQgUENNIGlucHV0cy4KICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgotICAgICAgICByZXFGb3JtYXQgPT0gY29uZmlnLmZvcm1hdCAmJiBjb25maWcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCi0gICAgICAgIChjb25maWcuc2FtcGxlX3JhdGUgPD0gMiAqIHJlcVNhbXBsaW5nUmF0ZSkgJiYKLSAgICAgICAgKHBvcGNvdW50KGNvbmZpZy5jaGFubmVsX21hc2spIDw9IEZDQ18yKSAmJiAocG9wY291bnQocmVxQ2hhbm5lbHMpIDw9IEZDQ18yKSkgewotICAgICAgICBBTE9HVigib3BlbklucHV0KCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CisgICAgICAgICAgICBjb25maWctPmZvcm1hdCA9PSBoYWxjb25maWcuZm9ybWF0ICYmIGhhbGNvbmZpZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgJiYKKyAgICAgICAgKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSAyICogY29uZmlnLT5zYW1wbGVfcmF0ZSkgJiYKKyAgICAgICAgKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spIDw9IEZDQ18yKSAmJgorICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spIDw9IEZDQ18yKSkgeworICAgICAgICAvLyBGSVhNRSBkZXNjcmliZSB0aGUgY2hhbmdlIHByb3Bvc2VkIGJ5IEhBTCAoc2F2ZSBvbGQgdmFsdWVzIHNvIHdlIGNhbiBsb2cgdGhlbSBoZXJlKQorICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0gPSBOVUxMOwotICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCBpZCwgKnBEZXZpY2VzLCAmY29uZmlnLCAmaW5TdHJlYW0pOworICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZSwgJmhhbGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKKyAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBpblN0cmVhbSAhPSBOVUxMKSB7CkBAIC0xNzQwLDE3ICsxOTcwLDE3IEBACiAgICAgICAgICAgICBURUVfU0lOS19ORVcsICAgLy8gY29weSBpbnB1dCB1c2luZyBhIG5ldyBwaXBlCiAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCiAgICAgICAgIH0ga2luZDsKLSAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoaW5TdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJmluU3RyZWFtLT5jb21tb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KGluU3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZpblN0cmVhbS0+Y29tbW9uKSkpOworICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzayksIGhhbGNvbmZpZy5mb3JtYXQpOwogICAgICAgICBpZiAoIW1UZWVTaW5rSW5wdXRFbmFibGVkKSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEZvcm1hdF9JbnZhbGlkKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIUZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTkVXOwogICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rLT5nZXRTdHJvbmdDb3VudCgpICE9IDEpIHsKICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gbVJlY29yZFRlZVNpbmstPmZvcm1hdCgpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7CiAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfT0xEOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKQEAgLTE3ODAsMzkgKzIwMTAsMjYgQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQgPSBuZXcgQXVkaW9TdHJlYW1Jbihpbkh3RGV2LCBpblN0cmVhbSk7CisgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0U3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtSW4oaW5Id0RldiwgaW5TdHJlYW0pOwogCiAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgLy8gUmVjb3JkVGhyZWFkIHJlcXVpcmVzIGJvdGggaW5wdXQgYW5kIG91dHB1dCBkZXZpY2UgaW5kaWNhdGlvbiB0byBmb3J3YXJkIHRvIGF1ZGlvCiAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKLSAgICAgICAgdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXREZXZpY2VfbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZQogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0ZWVTaW5rCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7Ci0gICAgICAgIEFMT0dWKCJvcGVuSW5wdXQoKSBjcmVhdGVkIHJlY29yZCB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwotICAgICAgICBpZiAocFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IHJlcVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcEZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDaGFubmVsTWFzayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcENoYW5uZWxNYXNrID0gcmVxQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCi0gICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkX2woQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7Ci0gICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKCppbnB1dCwgdGhyZWFkKTsKKyAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgfQogCisgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4MzQsMjYgKzIwNTEsNzIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7Ci0gICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQsIGlucHV0LCBOVUxMKTsKKworICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGVmZmVjdCBjaGFpbnMsIGl0IG1lYW5zIHRoYXQgYSBjbGllbnQgc3RpbGwgaG9sZHMgYSBoYW5kbGUKKyAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCisgICAgICAgIC8vIHNhbWUgc2Vzc2lvbiBJRCBvciBwdXQgaXQgYXNpZGUgaW4gY2FzZSBhIG5ldyByZWNvcmQgdGhyZWFkIGlzIG9wZW5lZCBmb3IgYQorICAgICAgICAvLyBuZXcgY2FwdHVyZSBvbiB0aGUgc2FtZSBzZXNzaW9uCisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zID0gdGhyZWFkLT5nZXRFZmZlY3RDaGFpbnNfbCgpOworICAgICAgICAgICAgLy8gTm90ZTogbWF4aW11bSBvbmUgY2hhaW4gcGVyIHJlY29yZCB0aHJlYWQKKyAgICAgICAgICAgIGlmIChlZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGFpbiA9IGVmZmVjdENoYWluc1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgYSByZWNvcmQgdGhyZWFkIGlzIGFscmVhZHkgb3BlbmVkIHdpdGggYSBjbGllbnQgb24gdGhlIHNhbWUgc2Vzc2lvbi4KKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIGNhc2Ugb2Ygb3ZlcmxhcCBiZXR3ZWVuIG9uZSB0aHJlYWQgdGVhciBkb3duIGFuZCB0aGUKKyAgICAgICAgICAgIC8vIGNyZWF0aW9uIG9mIGl0cyByZXBsYWNlbWVudAorICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmICh0ID09IHRocmVhZCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHQtPmhhc0F1ZGlvU2Vzc2lvbihjaGFpbi0+c2Vzc2lvbklkKCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNsb3NlSW5wdXQoKSBmb3VuZCB0aHJlYWQgJWQgZm9yIGVmZmVjdCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+aWQoKSwgY2hhaW4tPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdC0+YWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHB1dCB0aGUgY2hhaW4gYXNpZGUgaWYgd2UgY291bGQgbm90IGZpbmQgYSByZWNvcmQgdGhyZWFkIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBpZC4KKyAgICAgICAgICAgIGlmIChpID09IG1SZWNvcmRUaHJlYWRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIHB1dE9ycGhhbkVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VELCBpbnB1dCwgTlVMTCk7CiAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgIH0KLSAgICB0aHJlYWQtPmV4aXQoKTsKLSAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAotICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgorICAgIC8vIEZJWE1FOiBjYWxsaW5nIHRocmVhZC0+ZXhpdCgpIHdpdGhvdXQgbUxvY2sgaGVsZCBzaG91bGQgbm90IGJlIG5lZWRlZCBhbnltb3JlIG5vdyB0aGF0CisgICAgLy8gd2UgaGF2ZSBhIGRpZmZlcmVudCBsb2NrIGZvciBub3RpZmljYXRpb24gY2xpZW50CisgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlSW5wdXRGaW5pc2goc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpCit7CisgICAgdGhyZWFkLT5leGl0KCk7CiAgICAgQXVkaW9TdHJlYW1JbiAqaW4gPSB0aHJlYWQtPmNsZWFySW5wdXQoKTsKICAgICBBTE9HX0FTU0VSVChpbiAhPSBOVUxMLCAiaW4gc2hvdWxkbid0IGJlIE5VTEwiKTsKICAgICAvLyBmcm9tIG5vdyBvbiB0aHJlYWQtPm1JbnB1dCBpcyBOVUxMCiAgICAgaW4tPmh3RGV2KCktPmNsb3NlX2lucHV0X3N0cmVhbShpbi0+aHdEZXYoKSwgaW4tPnN0cmVhbSk7CiAgICAgZGVsZXRlIGluOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlSW5wdXRJbnRlcm5hbF9sKHNwPFJlY29yZFRocmVhZD4gdGhyZWFkKQoreworICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOworICAgIGNsb3NlSW5wdXRGaW5pc2godGhyZWFkKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjppbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQUxPR1YoInNldFN0cmVhbU91dHB1dCgpIHN0cmVhbSAlZCB0byBvdXRwdXQgJWQiLCBzdHJlYW0sIG91dHB1dCk7CisgICAgQUxPR1YoImludmFsaWRhdGVTdHJlYW0oKSBzdHJlYW0gJWQiLCBzdHJlYW0pOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CkBAIC0xODY0LDI0ICsyMTI3LDMwIEBACiB9CiAKIAotaW50IEF1ZGlvRmxpbmdlcjo6bmV3QXVkaW9TZXNzaW9uSWQoKQorYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9GbGluZ2VyOjpuZXdBdWRpb1VuaXF1ZUlkKCkKIHsKICAgICByZXR1cm4gbmV4dFVuaXF1ZUlkKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKK3ZvaWQgQXVkaW9GbGluZ2VyOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIEFMT0dWKCJhY3F1aXJpbmcgJWQgZnJvbSAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOworICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgICAgICBjYWxsZXIgPSBwaWQ7CisgICAgfQogCi0gICAgLy8gSWdub3JlIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20gcHJvY2Vzc2VzIG5vdCBrbm93biBhcyBub3RpZmljYXRpb24gY2xpZW50LiBUaGUgcmVxdWVzdAotICAgIC8vIGlzIGxpa2VseSBwcm94aWVkIGJ5IG1lZGlhc2VydmVyIChlLmcgQ2FtZXJhU2VydmljZSkgYW5kIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpIGNhbiBiZQotICAgIC8vIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHBpZCBsZWF2aW5nIGEgc3RhbGUgc2Vzc2lvbiByZWZlcmVuY2UuICBBbHNvIHdlIGRvbid0IGtub3cgaG93Ci0gICAgLy8gdG8gY2xlYXIgdGhpcyByZWZlcmVuY2UgaWYgdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCi0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkoY2FsbGVyKSA8IDApIHsKLSAgICAgICAgQUxPR1YoImFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpIHVua25vd24gY2xpZW50ICVkIGZvciBzZXNzaW9uICVkIiwgY2FsbGVyLCBhdWRpb1Nlc3Npb24pOwotICAgICAgICByZXR1cm47CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgLy8gSWdub3JlIHJlcXVlc3RzIHJlY2VpdmVkIGZyb20gcHJvY2Vzc2VzIG5vdCBrbm93biBhcyBub3RpZmljYXRpb24gY2xpZW50LiBUaGUgcmVxdWVzdAorICAgICAgICAvLyBpcyBsaWtlbHkgcHJveGllZCBieSBtZWRpYXNlcnZlciAoZS5nIENhbWVyYVNlcnZpY2UpIGFuZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoKSBjYW4gYmUKKyAgICAgICAgLy8gY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcGlkIGxlYXZpbmcgYSBzdGFsZSBzZXNzaW9uIHJlZmVyZW5jZS4gIEFsc28gd2UgZG9uJ3Qga25vdyBob3cKKyAgICAgICAgLy8gdG8gY2xlYXIgdGhpcyByZWZlcmVuY2UgaWYgdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCisgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KGNhbGxlcikgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKCkgdW5rbm93biBjbGllbnQgJWQgZm9yIHNlc3Npb24gJWQiLCBjYWxsZXIsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICB9CiAKICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwpAQCAtMTg5NywxMSArMjE2NiwxNCBAQAogICAgIEFMT0dWKCIgYWRkZWQgbmV3IGVudHJ5IGZvciAlZCIsIGF1ZGlvU2Vzc2lvbik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiAoY2FsbGVyID09IGdldHBpZF9jYWNoZWQpKSB7CisgICAgICAgIGNhbGxlciA9IHBpZDsKKyAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgbnVtOyBpKyspIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7CkBAIC0xOTYzLDcgKzIyMzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCAodC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgZWZmZWN0cyBmcm9tIHRoZSBjaGFpbgogICAgICAgICAgICAgd2hpbGUgKGVjLT5tRWZmZWN0cy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IGVjLT5tRWZmZWN0c1swXTsKQEAgLTIwMDAsNyArMjI3Miw3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bmV4dFVuaXF1ZUlkKCkKIHsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKKyAgICByZXR1cm4gKHVpbnQzMl90KSBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpBdWRpb0ZsaW5nZXI6OnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkgY29uc3QKQEAgLTIwMzMsNyArMjMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKQEAgLTIxOTUsNyArMjQ2Nyw3IEBACiAKICAgICAgICAgLy8gcmV0dXJuIGVmZmVjdCBkZXNjcmlwdG9yCiAgICAgICAgICpwRGVzYyA9IGRlc2M7Ci0gICAgICAgIGlmIChpbyA9PSAwICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKICAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgcmV0dXJuZWQgYnkgZ2V0T3V0cHV0Rm9yRWZmZWN0KCkgaXMgcmVtb3ZlZCBiZWZvcmUgd2UgbG9jayB0aGUKICAgICAgICAgICAgIC8vIG11dGV4IGJlbG93LCB0aGUgY2FsbCB0byBjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pIGJlbG93IHdpbGwgZGV0ZWN0IGl0CiAgICAgICAgICAgICAvLyBhbmQgd2Ugd2lsbCBleGl0IHNhZmVseQpAQCAtMjIxMCw3ICsyNDgyLDcgQEAKICAgICAgICAgLy8gSWYgb3V0cHV0IGlzIDAgaGVyZSwgc2Vzc2lvbklkIGlzIG5laXRoZXIgU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm9yIFNFU1NJT05fT1VUUFVUX01JWAogICAgICAgICAvLyBiZWNhdXNlIG9mIGNvZGUgY2hlY2tpbmcgb3V0cHV0IHdoZW4gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uLgogICAgICAgICAvLyBOb3RlOiBpbyBpcyBuZXZlciAwIHdoZW4gY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGlucHV0Ci0gICAgICAgIGlmIChpbyA9PSAwKSB7CisgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewogICAgICAgICAgICAgICAgIC8vIG91dHB1dCBtdXN0IGJlIHNwZWNpZmllZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgd2hlbiB1c2luZyBzZXNzaW9uCiAgICAgICAgICAgICAgICAgLy8gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UKQEAgLTIyMzUsNyArMjUwNyw3IEBACiAgICAgICAgICAgICAvLyBJZiBubyBvdXRwdXQgdGhyZWFkIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCwgZGVmYXVsdCB0bwogICAgICAgICAgICAgLy8gZmlyc3Qgb3V0cHV0LiBUaGUgZWZmZWN0IGNoYWluIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0CiAgICAgICAgICAgICAvLyB0aHJlYWQgd2hlbiBhIHRyYWNrIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBpcyBjcmVhdGVkCi0gICAgICAgICAgICBpZiAoaW8gPT0gMCAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIGlvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjLm5hbWUpOwpAQCAtMjI0OCw5ICsyNTIwLDE3IEBACiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBvbmUgZWZmZWN0IGNoYWluIHdhcyBhd2FpdGluZyBmb3IgYW4gZWZmZWN0IHRvIGJlIGNyZWF0ZWQgb24gdGhpcworICAgICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgdXNlZCBpdCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2woKGF1ZGlvX3Nlc3Npb25fdClzZXNzaW9uSWQpOworICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICAgICAgdGhyZWFkLT5hZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gcmVnaXN0ZXJQaWRfbChwaWQpOworICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CiAKICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBvbiBzZWxlY3RlZCBvdXRwdXQgdGhyZWFkCiAgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCkBAIC0yMjU4LDEyICsyNTM4LDE1IEBACiAgICAgICAgIGlmIChoYW5kbGUgIT0gMCAmJiBpZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAqaWQgPSBoYW5kbGUtPmlkKCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgd2l0aCBtQ2xpZW50TG9jayBoZWxkCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKKyAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9CiAgICAgfQogCiBFeGl0OgotICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtMjMwOSw2ICsyNTkyLDE3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiB0aHJlYWQgaGFzIGEgY2hhbm5lbCBjb3VudCBvZiBGQ0NfMiwgd2hpY2ggaXMKKyAgICAvLyBjdXJyZW50bHkgcmVxdWlyZWQgZm9yIChtb3N0KSBlZmZlY3RzLiBQcmV2ZW50IG1vdmluZyB0aGUgZWZmZWN0IGNoYWluIGhlcmUgcmF0aGVyCisgICAgLy8gdGhhbiBkaXNhYmxpbmcgdGhlIGFkZEVmZmVjdF9sKCkgY2FsbCBpbiBkc3RUaHJlYWQgYmVsb3cuCisgICAgaWYgKChkc3RUaHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUiB8fCBkc3RUaHJlYWQtPmlzRHVwbGljYXRpbmcoKSkgJiYKKyAgICAgICAgICAgIGRzdFRocmVhZC0+bUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgeworICAgICAgICBBTE9HVygibW92ZUVmZmVjdENoYWluX2woKSBlZmZlY3QgY2hhaW4gZmFpbGVkIGJlY2F1c2UiCisgICAgICAgICAgICAgICAgIiBkZXN0aW5hdGlvbiB0aHJlYWQgJXAgY2hhbm5lbCBjb3VudCgldSkgIT0gJXUiLAorICAgICAgICAgICAgICAgIGRzdFRocmVhZCwgZHN0VGhyZWFkLT5tQ2hhbm5lbENvdW50LCBGQ0NfMik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICAvLyByZW1vdmUgY2hhaW4gZmlyc3QuIFRoaXMgaXMgdXNlZnVsIG9ubHkgaWYgcmVjb25maWd1cmluZyBlZmZlY3QgY2hhaW4gb24gc2FtZSBvdXRwdXQgdGhyZWFkLAogICAgIC8vIHNvIHRoYXQgYSBuZXcgY2hhaW4gaXMgY3JlYXRlZCB3aXRoIGNvcnJlY3QgcGFyYW1ldGVycyB3aGVuIGZpcnN0IGVmZmVjdCBpcyBhZGRlZC4gVGhpcyBpcwogICAgIC8vIG90aGVyd2lzZSB1bm5lY2Vzc2FyeSBhcyByZW1vdmVFZmZlY3RfbCgpIHdpbGwgcmVtb3ZlIHRoZSBjaGFpbiB3aGVuIGxhc3QgZWZmZWN0IGlzCkBAIC0yNDA3LDYgKzI3MDEsNDkgQEAKIAogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnB1dE9ycGhhbkVmZmVjdENoYWluX2woY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4mIGNoYWluKQoreworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCljaGFpbi0+c2Vzc2lvbklkKCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PcnBoYW5FZmZlY3RDaGFpbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICBBTE9HVigicHV0T3JwaGFuRWZmZWN0Q2hhaW5fbCBzZXNzaW9uICVkIGluZGV4ICVkIiwgc2Vzc2lvbiwgaW5kZXgpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJwdXRPcnBoYW5FZmZlY3RDaGFpbl9sIGNoYWluIGZvciBzZXNzaW9uICVkIGFscmVhZHkgcHJlc2VudCIsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIG1PcnBoYW5FZmZlY3RDaGFpbnMuYWRkKHNlc3Npb24sIGNoYWluKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+IEF1ZGlvRmxpbmdlcjo6Z2V0T3JwaGFuRWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CisgICAgc3NpemVfdCBpbmRleCA9IG1PcnBoYW5FZmZlY3RDaGFpbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICBBTE9HVigiZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbCBzZXNzaW9uICVkIGluZGV4ICVkIiwgc2Vzc2lvbiwgaW5kZXgpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGNoYWluID0gbU9ycGhhbkVmZmVjdENoYWlucy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgbU9ycGhhbkVmZmVjdENoYWlucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGNoYWluOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiYgZWZmZWN0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWVmZmVjdC0+c2Vzc2lvbklkKCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1PcnBoYW5FZmZlY3RDaGFpbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICBBTE9HVigidXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zIHNlc3Npb24gJWQgaW5kZXggJWQiLCBzZXNzaW9uLCBpbmRleCk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbU9ycGhhbkVmZmVjdENoYWlucy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKGNoYWluLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMgcmVtb3ZpbmcgZWZmZWN0IGNoYWluIGF0IGluZGV4ICVkIiwgaW5kZXgpOworICAgICAgICAgICAgbU9ycGhhbkVmZmVjdENoYWlucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKIHN0cnVjdCBFbnRyeSB7CiAjZGVmaW5lIE1BWF9OQU1FIDMyICAgICAvLyAlWSVtJWQlSCVNJVNfJWQud2F2CiAgICAgY2hhciBtTmFtZVtNQVhfTkFNRV07CkBAIC0yNDcwLDcgKzI4MDcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBmZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2hhciB0ZWVUaW1lWzE2XTsKQEAgLTI0ODMsMjQgKzI4MjAsMjYgQEAKICAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCiAgICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgICAgICBpZiAodGVlRmQgPj0gMCkgeworICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKICAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKICAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCiAgICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwogICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPD0gRkNDXzIpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOwogICAgICAgICAgICAgd2F2SGVhZGVyWzIyXSA9IGNoYW5uZWxDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzCiAgICAgICAgICAgICB3YXZIZWFkZXJbMjRdID0gc2FtcGxlUmF0ZTsgICAgICAgICAvLyBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgd2F2SGVhZGVyWzI1XSA9IHNhbXBsZVJhdGUgPj4gODsKLSAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBjaGFubmVsQ291bnQgKiAyOyAgIC8vIGJsb2NrIGFsaWdubWVudAorICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50CisgICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7CiAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7CiAgICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwogICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOworI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCisgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0jZGVmaW5lIFRFRV9TSU5LX1JFQUQgMTAyNAotICAgICAgICAgICAgICAgIHNob3J0IGJ1ZmZlcltURUVfU0lOS19SRUFEICogRkNDXzJdOwogICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IFRFRV9TSU5LX1JFQUQ7CiAgICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSB0ZWVTb3VyY2UtPnJlYWQoYnVmZmVyLCBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKQEAgLTI1MTMsMjIgKzI4NTIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGFjdHVhbCA8PSAoc3NpemVfdCljb3VudCk7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgICAgICAgICAgICAgd3JpdGUodGVlRmQsIGJ1ZmZlciwgYWN0dWFsICogZnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICB0b3RhbCArPSBhY3R1YWw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CiAgICAgICAgICAgICBsc2Vlayh0ZWVGZCwgKG9mZl90KSA0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gNDQgKyB0b3RhbCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkgLSA4OworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OworICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQogICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwogICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgICAgICAgICAgdGVtcCA9ICB0b3RhbCAqIGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKICAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidGVlIGNvcGllZCB0byAlc1xuIiwgdGVlUGF0aCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gY3JlYXRlIHRlZSAlczogJXNcbiIsIHRlZVBhdGgsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNTNlMjM4ZS4uMTAwMzAxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMTgsNiArMTgsNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZMSU5HRVJfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX0ZMSU5HRVJfSAogCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgpAQCAtNDksOSArNTAsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKworI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlICJBdWRpb1dhdGNoZG9nLmgiCisjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtNjAsOCArNjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKLWNsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CitzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190Oworc3RydWN0IGVmZmVjdF9wYXJhbV9jYmxrX3Q7CiBjbGFzcyBBdWRpb01peGVyOwogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKQEAgLTgxLDkgKzg1LDYgQEAKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3MgPSBzZWNvbmRzKDMpOwogCi0jZGVmaW5lIE1BWF9HQUlOIDQwOTYuMGYKLSNkZWZpbmUgTUFYX0dBSU5fSU5UIDB4MTAwMAotCiAjZGVmaW5lIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICiAKIGNsYXNzIEF1ZGlvRmxpbmdlciA6CkBAIC0xMDIsMjkgKzEwMywzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgIHZpcnR1YWwgc3A8SUF1ZGlvUmVjb3JkPiBvcGVuUmVjb3JkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8pOwogCiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CkBAIC0xNTYsMTQgKzE1OCwxMyBAQAogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKIAotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CiAKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CkBAIC0xNzQsMjggKzE3NSwzMCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzayk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbihzaXplX3QgKmhhbEZyYW1lcywgc2l6ZV90ICpkc3BGcmFtZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdDsKIAotICAgIHZpcnR1YWwgICAgIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIGludCBuZXdBdWRpb1Nlc3Npb25JZCgpOworICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOwogCi0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQgYXVkaW9TZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludCBhdWRpb1Nlc3Npb24pOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSBjb25zdDsKIApAQCAtMjEwLDcgKzIxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCk7CiAKQEAgLTIyNCw2ICsyMjcsMzAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpOwogCisgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKTsKKworICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAvKiBSZWxlYXNlIGFuIGF1ZGlvIHBhdGNoICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgLyogTGlzdCBleGlzdGluZyBhdWRpbyBwYXRjaGVzICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyk7CisKKyAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLyogR2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIHVzZWQgZm9yIGFuIGF1ZGlvIHNlc3Npb24gKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0yMzUsOCArMjYyLDEyIEBACiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICBuZXdXcml0ZXJfbChzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPE5CTG9nOjpXcml0ZXI+JiB3cml0ZXIpOwogcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gMTAgKiAxMDI0OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MCAqIDEwMjQ7CiAgICAgc3A8TWVtb3J5RGVhbGVyPiAgICBtTG9nTWVtb3J5RGVhbGVyOyAgIC8vID09IDAgd2hlbiBOQkxvZyBpcyBkaXNhYmxlZAorICAgIC8vIFdoZW4gYSBsb2cgd3JpdGVyIGlzIHVucmVnaXN0ZXJlZCwgaXQgaXMgZG9uZSBsYXppbHkgc28gdGhhdCBtZWRpYS5sb2cgY2FuIGNvbnRpbnVlIHRvIHNlZSBpdAorICAgIC8vIGZvciBhcyBsb25nIGFzIHBvc3NpYmxlLiAgVGhlIG1lbW9yeSBpcyBvbmx5IGZyZWVkIHdoZW4gaXQgaXMgbmVlZGVkIGZvciBhbm90aGVyIGxvZyB3cml0ZXIuCisgICAgVmVjdG9yPCBzcDxOQkxvZzo6V3JpdGVyPiA+IG1VbnJlZ2lzdGVyZWRXcml0ZXJzOworICAgIE11dGV4ICAgICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrOwogcHVibGljOgogCiAgICAgY2xhc3MgU3luY0V2ZW50OwpAQCAtMjQ5LDcgKzI4MCw3IEBACiAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgc3luY19ldmVudF9jYWxsYmFja190IGNhbGxCYWNrLAotICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQorICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKQogICAgICAgICA6IG1UeXBlKHR5cGUpLCBtVHJpZ2dlclNlc3Npb24odHJpZ2dlclNlc3Npb24pLCBtTGlzdGVuZXJTZXNzaW9uKGxpc3RlbmVyU2Vzc2lvbiksCiAgICAgICAgICAgbUNhbGxiYWNrKGNhbGxCYWNrKSwgbUNvb2tpZShjb29raWUpCiAgICAgICAgIHt9CkBAIC0yNjIsMTQgKzI5MywxNCBAQAogICAgICAgICBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24oKSBjb25zdCB7IHJldHVybiBtVHJpZ2dlclNlc3Npb247IH0KICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1MaXN0ZW5lclNlc3Npb247IH0KLSAgICAgICAgdm9pZCAqY29va2llKCkgY29uc3QgeyByZXR1cm4gbUNvb2tpZTsgfQorICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUoKSBjb25zdCB7IHJldHVybiBtQ29va2llOyB9CiAKICAgICBwcml2YXRlOgogICAgICAgICAgIGNvbnN0IEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgbVR5cGU7CiAgICAgICAgICAgY29uc3QgaW50IG1UcmlnZ2VyU2Vzc2lvbjsKICAgICAgICAgICBjb25zdCBpbnQgbUxpc3RlbmVyU2Vzc2lvbjsKICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgbUNhbGxiYWNrOwotICAgICAgICAgIHZvaWQgKiBjb25zdCBtQ29va2llOworICAgICAgICAgIGNvbnN0IHdwPFJlZkJhc2U+IG1Db29raWU7CiAgICAgICAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICB9OwogCkBAIC0yNzcsNyArMzA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3RlbmVyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V2ZW50X2NhbGxiYWNrX3QgY2FsbEJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxSZWZCYXNlPiBjb29raWUpOwogCiBwcml2YXRlOgogICAgIGNsYXNzIEF1ZGlvSHdEZXZpY2U7ICAgIC8vIGZ3ZCBkZWNsYXJhdGlvbiBmb3IgZmluZFN1aXRhYmxlSHdEZXZfbApAQCAtMzAwLDYgKzMzMSw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKIAorICAgIC8vIFNldCBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscyB0byB0cnVlIHRvIGVuYWJsZSBncmVhdGVyIHRoYW4gc3RlcmVvIG91dHB1dAorICAgIC8vIGZvciB0aGUgTWl4ZXJUaHJlYWQgYW5kIGRldmljZSBzaW5rLiAgTnVtYmVyIG9mIGNoYW5uZWxzIGFsbG93ZWQgaXMKKyAgICAvLyBGQ0NfMiA8PSBjaGFubmVscyA8PSBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTLgorICAgIHN0YXRpYyBjb25zdCBib29sIGtFbmFibGVFeHRlbmRlZENoYW5uZWxzID0gdHJ1ZTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjaGFubmVsIG1hc2sgaXMgcGVybWl0dGVkIGZvciB0aGUgUENNIHNpbmsgaW4gdGhlIE1peGVyVGhyZWFkCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIHsKKyAgICAgICAgc3dpdGNoIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IEZDQ18yOyAvLyBzdGVyZW8gaXMgZGVmYXVsdAorICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2hhbm5lbENvdW50ID4gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBjaGFubmVsTWFzayBpcyB0aGUgImNhbm9uaWNhbCIgb25lIHdlIGV4cGVjdCBmb3IgdGhlIGNoYW5uZWxDb3VudC4KKyAgICAgICAgICAgIHJldHVybiBjaGFubmVsTWFzayA9PSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24gdG8gdHJ1ZSB0byB1c2UgZXh0ZW5kZWQgcHJlY2lzaW9uIGluIE1peGVyVGhyZWFkCisgICAgc3RhdGljIGNvbnN0IGJvb2wga0VuYWJsZUV4dGVuZGVkUHJlY2lzaW9uID0gdHJ1ZTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBmb3JtYXQgaXMgcGVybWl0dGVkIGZvciB0aGUgUENNIHNpbmsgaW4gdGhlIE1peGVyVGhyZWFkCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQY21TaW5rRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDoKKyAgICAgICAgICAgIHJldHVybiBrRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb247CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBzdGFuZGJ5IGRlbGF5IGZvciBNSVhFUiBhbmQgRFVQTElDQVRJTkcgcGxheWJhY2sgdGhyZWFkcyBpcyByZWFkIGZyb20gcHJvcGVydHkKICAgICAvLyByby5hdWRpby5mbGluZ2VyX3N0YW5kYnl0aW1lX21zIG9yIGRlZmF1bHRzIHRvIGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzCiAgICAgc3RhdGljIG5zZWNzX3QgICAgICAgICAgbVN0YW5kYnlUaW1lSW5Oc2VjczsKQEAgLTM5NCw2ICs0NjgsOCBAQAogCiAjaW5jbHVkZSAiRWZmZWN0cy5oIgogCisjaW5jbHVkZSAiUGF0Y2hQYW5lbC5oIgorCiAgICAgLy8gc2VydmVyIHNpZGUgb2YgdGhlIGNsaWVudCdzIElBdWRpb1RyYWNrCiAgICAgY2xhc3MgVHJhY2tIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6Qm5BdWRpb1RyYWNrIHsKICAgICBwdWJsaWM6CkBAIC00MjcsNyArNTAzLDYgQEAKICAgICBwdWJsaWM6CiAgICAgICAgIFJlY29yZEhhbmRsZShjb25zdCBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SZWNvcmRIYW5kbGUoKTsKLSAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3Q7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LCBpbnQgdHJpZ2dlclNlc3Npb24pOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KApAQCAtNDQzLDE1ICs1MTgsMzkgQEAKICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmNoZWNrUGxheWJhY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwogICAgICAgICAgICAgICBNaXhlclRocmVhZCAqY2hlY2tNaXhlclRocmVhZF9sKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Q7CiAgICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqY2hlY2tSZWNvcmRUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkgY29uc3Q7CisgICAgICAgICAgICAgIHNwPFJlY29yZFRocmVhZD4gb3BlbklucHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gb3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgICAgICAgIHZvaWQgY2xvc2VPdXRwdXRGaW5pc2goc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCk7CisgICAgICAgICAgICAgIHZvaWQgY2xvc2VJbnB1dEZpbmlzaChzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCk7CisKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBib29sIHN0cmVhbU11dGVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZTsgfQogICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgZG9lc24ndCBjaGVjayBwZXItdGhyZWFkIHN0cmVhbSB2b2x1bWUsIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9Ci0gICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKKyAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKIAotICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgb3IgZWZmZWN0IElECisgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBlZmZlY3QgSUQsIG9yIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KKyAgICAgICAgICAgICAgLy8gVGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgSUQgc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlcyBhcmUgYWN0dWFsbHkgaW5kZXBlbmRlbnQKKyAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgc2VwYXJhdGUgS2V5ZWRWZWN0b3JzIGZvciBlYWNoIGtpbmQgb2YgSUQuCisgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgdWludDMyX3QsIGJ1dCBpcyBjYXN0IHRvIHNpZ25lZCBmb3Igc29tZSBJRHMuCisgICAgICAgICAgICAgIC8vIEZJWE1FIFRoaXMgQVBJIGRvZXMgbm90IGhhbmRsZSByb2xsb3ZlciB0byB6ZXJvIChmb3IgdW5zaWduZWQgSURzKSwKKyAgICAgICAgICAgICAgLy8gICAgICAgb3IgZnJvbSBwb3NpdGl2ZSB0byBuZWdhdGl2ZSAoZm9yIHNpZ25lZCBJRHMpLgorICAgICAgICAgICAgICAvLyAgICAgICBUaHVzIGl0IG1heSBmYWlsIGJ5IHJldHVybmluZyBhbiBJRCBvZiB0aGUgd3Jvbmcgc2lnbiwKKyAgICAgICAgICAgICAgLy8gICAgICAgb3IgYnkgcmV0dXJuaW5nIGEgbm9uLXVuaXF1ZSBJRC4KICAgICAgICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAKICAgICAgICAgICAgICAgc3RhdHVzX3QgbW92ZUVmZmVjdENoYWluX2woaW50IHNlc3Npb25JZCwKQEAgLTQ2NywxMCArNTY2LDI2IEBACiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpOwotCiAgICAgICAgICAgICAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlR2xvYmFsRWZmZWN0RW5hYmxlZF9sKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBvbk5vbk9mZmxvYWRhYmxlR2xvYmFsRWZmZWN0RW5hYmxlKCk7CiAKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSBhbiBlZmZlY3QgY2hhaW4gdG8gbU9ycGhhbkVmZmVjdENoYWlucyBrZXllZCB2ZWN0b3IuCisgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSB0aHJlYWQgZXhpdHMgYW5kIGVmZmVjdHMgYXJlIHN0aWxsIGF0dGFjaGVkIHRvIGl0LgorICAgICAgICAgICAgICAgIC8vIElmIGVmZmVjdHMgYXJlIGxhdGVyIGNyZWF0ZWQgb24gdGhlIHNhbWUgc2Vzc2lvbiwgdGhleSB3aWxsIHJldXNlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IGNoYWluIGFuZCBzYW1lIGluc3RhbmNlcyBpbiB0aGUgZWZmZWN0IGxpYnJhcnkuCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIEFMUkVBRFlfRVhJU1RTIGlmIGEgY2hhaW4gd2l0aCB0aGUgc2FtZSBzZXNzaW9uIGFscmVhZHkgZXhpc3RzIGluCisgICAgICAgICAgICAgICAgLy8gbU9ycGhhbkVmZmVjdENoYWlucy4gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhcyB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAgICAgICAgICAgIC8vIGNoYWluIGZvciBhIGdpdmVuIHNlc3Npb24gYW5kIGl0IGlzIGF0dGFjaGVkIHRvIG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHB1dE9ycGhhbkVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CisgICAgICAgICAgICAgICAgLy8gR2V0IGFuIGVmZmVjdCBjaGFpbiBmb3IgdGhlIHNwZWNpZmllZCBzZXNzaW9uIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMgYW5kIHJlbW92ZQorICAgICAgICAgICAgICAgIC8vIGl0IGlmIGZvdW5kLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kICh0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlKS4KKyAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGxhc3QgZWZmZWN0IGhhbmRsZSBvbiBhbiBlZmZlY3QgaW5zdGFuY2UgaXMgcmVtb3ZlZC4gSWYgdGhpcworICAgICAgICAgICAgICAgIC8vIGVmZmVjdCBiZWxvbmdzIHRvIGFuIGVmZmVjdCBjaGFpbiBpbiBtT3JwaGFuRWZmZWN0Q2hhaW5zLCB0aGUgY2hhaW4gaXMgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIGFuZCByZW1vdmVkIGZyb20gbU9ycGhhbkVmZmVjdENoYWlucyBpZiBpdCBkb2VzIG5vdCBjb250YWluIGFueSBlZmZlY3QuCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVmZmVjdCB3YXMgZm91bmQgaW4gbU9ycGhhbkVmZmVjdENoYWlucywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKKwogICAgIGNsYXNzIEF1ZGlvSHdEZXZpY2UgewogICAgIHB1YmxpYzoKICAgICAgICAgZW51bSBGbGFncyB7CkBAIC00NzgsMTAgKzU5MywxMSBAQAogICAgICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFICAgID0gMHgyLAogICAgICAgICB9OwogCi0gICAgICAgIEF1ZGlvSHdEZXZpY2UoY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKKyAgICAgICAgQXVkaW9Id0RldmljZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIEZsYWdzIGZsYWdzKQotICAgICAgICAgICAgOiBtTW9kdWxlTmFtZShzdHJkdXAobW9kdWxlTmFtZSkpCisgICAgICAgICAgICA6IG1IYW5kbGUoaGFuZGxlKSwgbU1vZHVsZU5hbWUoc3RyZHVwKG1vZHVsZU5hbWUpKQogICAgICAgICAgICAgLCBtSHdEZXZpY2UoaHdEZXZpY2UpCiAgICAgICAgICAgICAsIG1GbGFncyhmbGFncykgeyB9CiAgICAgICAgIC8qdmlydHVhbCovIH5BdWRpb0h3RGV2aWNlKCkgeyBmcmVlKCh2b2lkICopbU1vZHVsZU5hbWUpOyB9CkBAIC00OTQsMTIgKzYxMCwxNiBAQAogICAgICAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUpKTsKICAgICAgICAgfQogCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KKyAgICAgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb247IH0KKwogICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOwogICAgICAgICBjb25zdCBjaGFyICogY29uc3QgbU1vZHVsZU5hbWU7CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICogY29uc3QgbUh3RGV2aWNlOwotICAgICAgICBGbGFncyBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEZsYWdzIG1GbGFnczsKICAgICB9OwogCiAgICAgLy8gQXVkaW9TdHJlYW1PdXQgYW5kIEF1ZGlvU3RyZWFtSW4gYXJlIGltbXV0YWJsZSwgc28gdGhlaXIgZmllbGRzIGFyZSBjb25zdC4KQEAgLTUwOSw3ICs2MjksNyBAQAogICAgIHN0cnVjdCBBdWRpb1N0cmVhbU91dCB7CiAgICAgICAgIEF1ZGlvSHdEZXZpY2UqIGNvbnN0IGF1ZGlvSHdEZXY7CiAgICAgICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCogY29uc3Qgc3RyZWFtOwotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QqIGh3RGV2KCkgY29uc3QgeyByZXR1cm4gYXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsgfQogCkBAIC01MzcsNyArNjU3LDExIEBACiAgICAgfTsKIAogICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotCisgICAgICAgICAgICAgICAgLy8gcHJvdGVjdHMgbUNsaWVudHMgYW5kIG1Ob3RpZmljYXRpb25DbGllbnRzLgorICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgbG9ja2VkIGFmdGVyIG1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBpZiBib3RoIG11c3QgYmUgbG9ja2VkCisgICAgICAgICAgICAgICAgLy8gYXZvaWRzIGFjcXVpcmluZyBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGZyb20gaW5zaWRlIHRocmVhZCBsb29wLgorICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRMb2NrOworICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtQ2xpZW50TG9jawogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcGlkX3QsIHdwPENsaWVudD4gPiAgICAgbUNsaWVudHM7ICAgLy8gc2VlIH5DbGllbnQoKQogCiAgICAgICAgICAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlTG9jazsKQEAgLTU4Niw4ICs3MTAsMTMgQEAKIAogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPFJlY29yZFRocmVhZD4gPiAgICBtUmVjb3JkVGhyZWFkczsKIAorICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtQ2xpZW50TG9jawogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcGlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKwogICAgICAgICAgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1OZXh0VW5pcXVlSWQ7ICAvLyB1cGRhdGVkIGJ5IGFuZHJvaWRfYXRvbWljX2luYworICAgICAgICAgICAgICAgIC8vIG5leHRVbmlxdWVJZCgpIHJldHVybnMgdWludDMyX3QsIGJ1dCB0aGlzIGlzIGRlY2xhcmVkIGludDMyX3QKKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBhdG9taWMgb3BlcmF0aW9ucyByZXF1aXJlIGFuIGludDMyX3QKKwogICAgICAgICAgICAgICAgIGF1ZGlvX21vZGVfdCAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2RlOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdE5yZWNJc09mZjsKIApAQCAtNjAxLDEyICs3MzAsMTcgQEAKICAgICAgICAgICAgICAgICBWZWN0b3IgPCBzcDxTeW5jRXZlbnQ+ID4gbVBlbmRpbmdTeW5jRXZlbnRzOyAvLyBzeW5jIGV2ZW50cyBhd2FpdGluZyBmb3IgYSBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgY3JlYXRlZAogCisgICAgICAgICAgICAgICAgLy8gRWZmZWN0IGNoYWlucyB3aXRob3V0IGEgdmFsaWQgdGhyZWFkCisgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19zZXNzaW9uX3QgLCBzcDxFZmZlY3RDaGFpbj4gPiBtT3JwaGFuRWZmZWN0Q2hhaW5zOworCiBwcml2YXRlOgotICAgIHNwPENsaWVudD4gIHJlZ2lzdGVyUGlkX2wocGlkX3QgcGlkKTsgICAgLy8gYWx3YXlzIHJldHVybnMgbm9uLTAKKyAgICBzcDxDbGllbnQ+ICByZWdpc3RlclBpZChwaWRfdCBwaWQpOyAgICAvLyBhbHdheXMgcmV0dXJucyBub24tMAogCiAgICAgLy8gZm9yIHVzZSBmcm9tIGRlc3RydWN0b3IKICAgICBzdGF0dXNfdCAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VPdXRwdXRJbnRlcm5hbF9sKHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQpOwogICAgIHN0YXR1c190ICAgIGNsb3NlSW5wdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisgICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dEludGVybmFsX2woc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQpOwogCiAjaWZkZWYgVEVFX1NJTksKICAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQpAQCAtNjM0LDcgKzc2OCw3IEBACiAgICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDEwMDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwogI2VuZGlmCiAKICAgICAvLyBUaGlzIG1ldGhvZCByZWFkcyBmcm9tIGEgdmFyaWFibGUgd2l0aG91dCBtTG9jaywgYnV0IHRoZSB2YXJpYWJsZSBpcyB1cGRhdGVkIHVuZGVyIG1Mb2NrLiAgU28KQEAgLTY0NywxMCArNzgxLDE3IEBACiAgICAgYm9vbCAgICBtSXNMb3dSYW1EZXZpY2U7CiAgICAgYm9vbCAgICBtSXNEZXZpY2VUeXBlS25vd247CiAgICAgbnNlY3NfdCBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZTsgIC8vIHdoZW4gYSBnbG9iYWwgZWZmZWN0IHdhcyBsYXN0IGVuYWJsZWQKKworICAgIHNwPFBhdGNoUGFuZWw+IG1QYXRjaFBhbmVsOworCisgICAgdWludDMyX3QgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlOyAgIC8vIHNhbXBsZSByYXRlIG9mIHRoZSBwcmltYXJ5IG91dHB1dCwgb3IgemVybyBpZiBub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBtSGFyZHdhcmVMb2NrCiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAorY29uc3QgY2hhciAqZm9ybWF0VG9TdHJpbmcoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IDA3ZGM2ZGQuLmZkMjhlYTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTM0LDY1ICszNSwzNDUgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxjb21tb25fdGltZS9sb2NhbF9jbG9jay5oPgogI2luY2x1ZGUgPGNvbW1vbl90aW1lL2NjX2hlbHBlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CiAKKyNpbmNsdWRlICJBdWRpb01peGVyT3BzLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCisvLyBUaGUgRkNDXzIgbWFjcm8gcmVmZXJzIHRvIHRoZSBGaXhlZCBDaGFubmVsIENvdW50IG9mIDIgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KKyNpZm5kZWYgRkNDXzIKKyNkZWZpbmUgRkNDXzIgMgorI2VuZGlmCisKKy8vIExvb2sgZm9yIE1PTk9fSEFDSyBmb3IgYW55IE1vbm8gaGFjayBpbnZvbHZpbmcgbGVnYWN5IG1vbm8gY2hhbm5lbCB0bworLy8gc3RlcmVvIGNoYW5uZWwgY29udmVyc2lvbi4KKworLyogVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORyB3aWxsIHNob3cgZXhhY3RseSB3aGljaCBwcm9jZXNzIGhvb2sgYW5kIHRyYWNrIGhvb2sgaXMKKyAqIGJlaW5nIHVzZWQuIFRoaXMgaXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGxvZyBzcGFtLCBzbyBkb24ndCBlbmFibGUgdW5sZXNzIHlvdQorICogYXJlIHZlcmlmeWluZyB0aGUgaG9vayBiYXNlZCBjb2RlLgorICovCisvLyNkZWZpbmUgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisvL2RlZmluZSBBTE9HVlYgcHJpbnRmICAvLyBmb3IgdGVzdC1taXhlci5jcHAKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKKyNlbmRpZgorCisvLyBTZXQga1VzZU5ld01peGVyIHRvIHRydWUgdG8gdXNlIHRoZSBuZXcgbWl4ZXIgZW5naW5lLiBPdGhlcndpc2UgdGhlCisvLyBvcmlnaW5hbCBjb2RlIHdpbGwgYmUgdXNlZC4gIFRoaXMgaXMgZmFsc2UgZm9yIG5vdy4KK3N0YXRpYyBjb25zdCBib29sIGtVc2VOZXdNaXhlciA9IGZhbHNlOworCisvLyBTZXQga1VzZUZsb2F0IHRvIHRydWUgdG8gYWxsb3cgZmxvYXRpbmcgaW5wdXQgaW50byB0aGUgbWl4ZXIgZW5naW5lLgorLy8gSWYga1VzZU5ld01peGVyIGlzIGZhbHNlLCB0aGlzIGlzIGlnbm9yZWQgb3IgbWF5IGJlIG92ZXJyaWRkZW4gaW50ZXJuYWxseQorLy8gYmVjYXVzZSBvZiBkb3dubWl4L3VwbWl4IHN1cHBvcnQuCitzdGF0aWMgY29uc3QgYm9vbCBrVXNlRmxvYXQgPSB0cnVlOworCisvLyBTZXQgdG8gZGVmYXVsdCBjb3B5IGJ1ZmZlciBzaXplIGluIGZyYW1lcyBmb3IgaW5wdXQgcHJvY2Vzc2luZy4KK3N0YXRpYyBjb25zdCBzaXplX3Qga0NvcHlCdWZmZXJGcmFtZUNvdW50ID0gMjU2OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIDogQXVkaW9CdWZmZXJQcm92aWRlcigpLAotICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlcihOVUxMKSwgbURvd25taXhIYW5kbGUoTlVMTCkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKQogeworICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCitBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OkNvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsCisgICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIG1JbnB1dEZyYW1lU2l6ZShpbnB1dEZyYW1lU2l6ZSksCisgICAgICAgIG1PdXRwdXRGcmFtZVNpemUob3V0cHV0RnJhbWVTaXplKSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudChidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRGF0YShOVUxMKSwKKyAgICAgICAgbUNvbnN1bWVkKDApCit7CisgICAgQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCkoJXp1LCAlenUsICV6dSkiLCB0aGlzLAorICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSwgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbnB1dEZyYW1lU2l6ZSA8IG91dHB1dEZyYW1lU2l6ZSAmJiBidWZmZXJGcmFtZUNvdW50ID09IDAsCisgICAgICAgICAgICAiUmVxdWlyZXMgbG9jYWwgYnVmZmVyIGlmIGlucHV0RnJhbWVTaXplKCV6dSkgPCBvdXRwdXRGcmFtZVNpemUoJXp1KSIsCisgICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplKTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCkgeworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUxvY2FsQnVmZmVyRGF0YSwgMzIsIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgKiBtT3V0cHV0RnJhbWVTaXplKTsKKyAgICB9CisgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKK3sKKyAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBmcmVlKG1Mb2NhbEJ1ZmZlckRhdGEpOworfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLAorICAgICAgICBpbnQ2NF90IHB0cykKK3sKKyAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpnZXROZXh0QnVmZmVyKCVwICglenUpLCAlbGxkKSIsCisgICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQsIHB0cyk7CisgICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOworICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIHB0cyk7CisgICAgICAgIC8vIEF0IG9uZSB0aW1lIGFuIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlciBoYWQKKyAgICAgICAgLy8gcmVzID09IE9LIGFuZCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCwgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiBub3cgNy8xOC8yMDE0LgorICAgICAgICAvLworICAgICAgICAvLyBCeSBBUEkgc3BlYywgaWYgcmVzICE9IE9LLCB0aGVuIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLgorICAgICAgICAvLyBidXQgdGhlcmUgbWF5IGJlIGltcHJvcGVyIGltcGxlbWVudGF0aW9ucy4KKyAgICAgICAgQUxPR19BU1NFUlQocmVzID09IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeyAvLyBub3QgbmVlZGVkIGJ5IEFQSSBzcGVjLCBidXQgdG8gYmUgc2FmZS4KKyAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgbUNvbnN1bWVkID0gMDsKKyAgICB9CisgICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKKyAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gY291bnQ7CisgICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsICh1aW50OF90KiltQnVmZmVyLnJhdyArIG1Db25zdW1lZCAqIG1JbnB1dEZyYW1lU2l6ZSwKKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKQoreworICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OnJlbGVhc2VCdWZmZXIoJXAoJXp1KSkiLAorICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIExPR19BTFdBWVNfRkFUQUxfSUYocEJ1ZmZlci0+ZnJhbWVDb3VudCA9PSAwLCAiSW52YWxpZCBmcmFtZWNvdW50Iik7CisgICAgbUNvbnN1bWVkICs9IHBCdWZmZXItPmZyYW1lQ291bnQ7IC8vIFRPRE86IHVwZGF0ZSBmb3IgZWZmaWNpZW5jeSB0byByZXVzZSBleGlzdGluZyBjb250ZW50CisgICAgaWYgKG1Db25zdW1lZCAhPSAwICYmIG1Db25zdW1lZCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgICAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgfQorICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpCit7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgbUNvbnN1bWVkID0gMDsKK30KKworQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpICAvLyBzZXQgYnVmZmVyRnJhbWVDb3VudCB0byAwIHRvIGRvIGluLXBsYWNlCit7CisgICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4ICV1ICVkKSIsCisgICAgICAgICAgICB0aGlzLCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywgZm9ybWF0LAorICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkKTsKKyAgICBpZiAoIXNJc011bHRpY2hhbm5lbENhcGFibGUKKyAgICAgICAgICAgIHx8IEVmZmVjdENyZWF0ZSgmc0R3bm1GeERlc2MudXVpZCwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQsCisgICAgICAgICAgICAgICAgICAgICZtRG93bm1peEhhbmRsZSkgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyIGVmZmVjdCIpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIC8vIGNoYW5uZWwgaW5wdXQgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gcGVyLXRyYWNrCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFzazsgICAvLyBGSVhNRTogU2hvdWxkIGJlIGJpdHMKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gb3V0cHV0Q2hhbm5lbE1hc2s7IC8vIEZJWE1FOiBzaG91bGQgYmUgYml0cworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKKyAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgcHJvdmlkZXIsIGFuZCBmcmFtZSBjb3VudCB3aWxsIG5vdCBiZSB1c2VkIGFzIHRoZSBkb3dubWl4IGVmZmVjdAorICAgICAvLyBwcm9jZXNzKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IChzZWUgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSkKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwKKyAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IEVGRkVDVF9DT05GSUdfQUNDX01PREU7CisgICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5tYXNrID0gbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzazsKKworICAgICBpbnQgY21kU3RhdHVzOworICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKworICAgICAvLyBDb25maWd1cmUgZG93bm1peGVyCisgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyAvKmNtZENvZGUqLywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgLypjbWRTaXplKi8sCisgICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnIC8qcENtZERhdGEqLywKKyAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgY29uZmlndXJpbmcgZG93bm1peGVyIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvLyBFbmFibGUgZG93bm1peGVyCisgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSAvKmNtZENvZGUqLywgMCAvKmNtZFNpemUqLywgTlVMTCAvKnBDbWREYXRhKi8sCisgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgeworICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGVuYWJsaW5nIGRvd25taXhlciIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICAgLy8gU2V0IGRvd25taXggdHlwZQorICAgICAvLyBwYXJhbWV0ZXIgc2l6ZSByb3VuZGVkIGZvciBwYWRkaW5nIG9uIDMyYml0IGJvdW5kYXJ5CisgICAgIGNvbnN0IGludCBwc2l6ZVBhZGRlZCA9ICgoc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpIC0gMSkvc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOworICAgICBjb25zdCBpbnQgZG93bm1peFBhcmFtU2l6ZSA9CisgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplUGFkZGVkICsgc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKKyAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2MoZG93bm1peFBhcmFtU2l6ZSk7CisgICAgIHBhcmFtLT5wc2l6ZSA9IHNpemVvZihkb3dubWl4X3BhcmFtc190KTsKKyAgICAgY29uc3QgZG93bm1peF9wYXJhbXNfdCBkb3dubWl4UGFyYW0gPSBET1dOTUlYX1BBUkFNX1RZUEU7CisgICAgIG1lbWNweShwYXJhbS0+ZGF0YSwgJmRvd25taXhQYXJhbSwgcGFyYW0tPnBzaXplKTsKKyAgICAgY29uc3QgZG93bm1peF90eXBlX3QgZG93bm1peFR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKKyAgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKKyAgICAgbWVtY3B5KHBhcmFtLT5kYXRhICsgcHNpemVQYWRkZWQsICZkb3dubWl4VHlwZSwgcGFyYW0tPnZzaXplKTsKKyAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisgICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX1BBUkFNIC8qIGNtZENvZGUgKi8sIGRvd25taXhQYXJhbVNpemUgLyogY21kU2l6ZSAqLywKKyAgICAgICAgICAgICBwYXJhbSAvKnBDbWREYXRhKi8sICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBmcmVlKHBhcmFtKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgc2V0dGluZyBkb3dubWl4IHR5cGUiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBkb3dubWl4IHR5cGUgc2V0IHRvICVkIiwgKGludCkgZG93bm1peFR5cGUpOwogfQogCiBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6fkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkKIHsKLSAgICBBTE9HVigiQXVkaW9NaXhlciBkZWxldGluZyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciAoJXApIiwgdGhpcyk7CisgICAgQUxPR1YoIn5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAoJXApIiwgdGhpcyk7CiAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCi0gICAgICAgIGludDY0X3QgcHRzKSB7Ci0gICAgLy9BTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSIpOwotICAgIGlmICh0aGlzLT5tVHJhY2tCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPSBwQnVmZmVyLT5yYXc7Ci0gICAgICAgICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcgPSBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3OwotICAgICAgICAgICAgLy8gaW4tcGxhY2Ugc28gb3ZlcndyaXRlIHRoZSBidWZmZXIgY29udGVudHMsIGhhcyBiZWVuIHNldCBpbiBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCkKLSAgICAgICAgICAgIC8vbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKK3ZvaWQgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CisgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmMpOworICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKKyAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IGRzdDsKKyAgICAvLyBtYXkgYmUgaW4tcGxhY2UgaWYgc3JjID09IGRzdC4KKyAgICBzdGF0dXNfdCByZXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+cHJvY2VzcyhtRG93bm1peEhhbmRsZSwKKyAgICAgICAgICAgICZtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIsICZtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyKTsKKyAgICBBTE9HRV9JRihyZXMgIT0gT0ssICJEb3dubWl4QnVmZmVyUHJvdmlkZXIgZXJyb3IgJWQiLCByZXMpOworfQogCi0gICAgICAgICAgICByZXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+cHJvY2VzcyhtRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIpOwotICAgICAgICAgICAgLy9BTE9HVigiZ2V0TmV4dEJ1ZmZlciBpcyBkb3dubWl4aW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSBlcnJvcjogTlVMTCB0cmFjayBidWZmZXIgcHJvdmlkZXIiKTsKKy8qIGNhbGwgb25jZSBpbiBhIHB0aHJlYWRfb25jZSBoYW5kbGVyLiAqLworLypzdGF0aWMqLyBzdGF0dXNfdCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aW5pdCgpCit7CisgICAgLy8gZmluZCBtdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgaWYgd2UgaGF2ZSB0byBwbGF5IG11bHRpY2hhbm5lbCBjb250ZW50CisgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7CisgICAgaW50IHJldCA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb01peGVyKCkgZXJyb3IgJWQgcXVlcnlpbmcgbnVtYmVyIG9mIGVmZmVjdHMiLCByZXQpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci19CisgICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKIAotdm9pZCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLSAgICAvL0FMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigpIik7Ci0gICAgaWYgKHRoaXMtPm1UcmFja0J1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKCkgZXJyb3I6IE5VTEwgdHJhY2sgYnVmZmVyIHByb3ZpZGVyIik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBudW1FZmZlY3RzIDsgaSsrKSB7CisgICAgICAgIGlmIChFZmZlY3RRdWVyeUVmZmVjdChpLCAmc0R3bm1GeERlc2MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJlZmZlY3QgJWQgaXMgY2FsbGVkICVzIiwgaSwgc0R3bm1GeERlc2MubmFtZSk7CisgICAgICAgICAgICBpZiAobWVtY21wKCZzRHdubUZ4RGVzYy50eXBlLCBFRkZFQ1RfVUlJRF9ET1dOTUlYLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgZWZmZWN0IFwiJXNcIiBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNEd25tRnhEZXNjLm5hbWUsIHNEd25tRnhEZXNjLmltcGxlbWVudG9yKTsKKyAgICAgICAgICAgICAgICBzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKyAgICBBTE9HV19JRighc0lzTXVsdGljaGFubmVsQ2FwYWJsZSwgInVuYWJsZSB0byBmaW5kIGRvd25taXggZWZmZWN0Iik7CisgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKKy8qc3RhdGljKi8gYm9vbCBBdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IGZhbHNlOworLypzdGF0aWMqLyBlZmZlY3RfZGVzY3JpcHRvcl90IEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzRHdubUZ4RGVzYzsKKworQXVkaW9NaXhlcjo6UmVtaXhCdWZmZXJQcm92aWRlcjo6UmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbVNhbXBsZVNpemUoYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKKyAgICAgICAgbUlucHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spKSwKKyAgICAgICAgbU91dHB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXRDaGFubmVsTWFzaykpCit7CisgICAgQUxPR1YoIlJlbWl4QnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3gpICV6dSAlenUiLAorICAgICAgICAgICAgdGhpcywgZm9ybWF0LCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgIG1JbnB1dENoYW5uZWxzLCBtT3V0cHV0Q2hhbm5lbHMpOworICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoYW5uZWwgcmVwcmVzZW50YXRpb24gaW4gaW5kZXggYXJyYXkgZm9ybXVsYXRpb24KKyAgICAvLyBXZSBpZ25vcmUgY2hhbm5lbCByZXByZXNlbnRhdGlvbiwgYW5kIGp1c3QgdXNlIHRoZSBiaXRzLgorICAgIG1lbWNweV9ieV9pbmRleF9hcnJheV9pbml0aWFsaXphdGlvbihtSWR4QXJ5LCBBUlJBWV9TSVpFKG1JZHhBcnkpLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKG91dHB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhpbnB1dENoYW5uZWxNYXNrKSk7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6UmVtaXhCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXkoZHN0LCBtT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBzcmMsIG1JbnB1dENoYW5uZWxzLCBtSWR4QXJ5LCBtU2FtcGxlU2l6ZSwgZnJhbWVzKTsKK30KKworQXVkaW9NaXhlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAorICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoaW5wdXRGb3JtYXQpLAorICAgICAgICAgICAgY2hhbm5lbHMgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG91dHB1dEZvcm1hdCksCisgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKKyAgICAgICAgbUNoYW5uZWxzKGNoYW5uZWxzKSwKKyAgICAgICAgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpCit7CisgICAgQUxPR1YoIlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoJXApKCVkLCAlI3gsICUjeCkiLCB0aGlzLCBjaGFubmVscywgaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6UmVmb3JtYXRCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbU91dHB1dEZvcm1hdCwgc3JjLCBtSW5wdXRGb3JtYXQsIGZyYW1lcyAqIG1DaGFubmVscyk7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJvb2wgQXVkaW9NaXhlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7Ci0KLWVmZmVjdF9kZXNjcmlwdG9yX3QgQXVkaW9NaXhlcjo6ZHdubUZ4RGVzYzsKIAogLy8gRW5zdXJlIG1Db25maWd1cmVkTmFtZXMgYml0bWFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KIC8vIFRoZSB2YWx1ZSBvZiAxIDw8IHggaXMgdW5kZWZpbmVkIGluIEMgd2hlbiB4ID49IDMyLgpAQCAtMTAxLDIwICszODIsMTIgQEAKICAgICA6ICAgbVRyYWNrTmFtZXMoMCksIG1Db25maWd1cmVkTmFtZXMoKG1heE51bVRyYWNrcyA+PSAzMiA/IDAgOiAxIDw8IG1heE51bVRyYWNrcykgLSAxKSwKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKIHsKLSAgICAvLyBBdWRpb01peGVyIGlzIG5vdCB5ZXQgY2FwYWJsZSBvZiBtdWx0aS1jaGFubmVsIGJleW9uZCBzdGVyZW8KLSAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKDIgPT0gTUFYX05VTV9DSEFOTkVMUyk7Ci0KICAgICBBTE9HX0FTU0VSVChtYXhOdW1UcmFja3MgPD0gTUFYX05VTV9UUkFDS1MsICJtYXhOdW1UcmFja3MgJXUgPiBNQVhfTlVNX1RSQUNLUyAldSIsCiAgICAgICAgICAgICBtYXhOdW1UcmFja3MsIE1BWF9OVU1fVFJBQ0tTKTsKIAogICAgIC8vIEF1ZGlvTWl4ZXIgaXMgbm90IHlldCBjYXBhYmxlIG9mIG1vcmUgdGhhbiAzMiBhY3RpdmUgdHJhY2sgaW5wdXRzCiAgICAgQUxPR19BU1NFUlQoMzIgPj0gTUFYX05VTV9UUkFDS1MsICJiYWQgTUFYX05VTV9UUkFDS1MgJWQiLCBNQVhfTlVNX1RSQUNLUyk7CiAKLSAgICAvLyBBdWRpb01peGVyIGlzIG5vdCB5ZXQgY2FwYWJsZSBvZiBtdWx0aS1jaGFubmVsIG91dHB1dCBiZXlvbmQgc3RlcmVvCi0gICAgQUxPR19BU1NFUlQoMiA9PSBNQVhfTlVNX0NIQU5ORUxTLCAiYmFkIE1BWF9OVU1fQ0hBTk5FTFMgJWQiLCBNQVhfTlVNX0NIQU5ORUxTKTsKLQotICAgIExvY2FsQ2xvY2sgbGM7Ci0KICAgICBwdGhyZWFkX29uY2UoJnNPbmNlQ29udHJvbCwgJnNJbml0Um91dGluZSk7CiAKICAgICBtU3RhdGUuZW5hYmxlZFRyYWNrcz0gMDsKQEAgLTEzMywzMCArNDA2LDEwIEBACiAgICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgTUFYX05VTV9UUkFDS1MgOyBpKyspIHsKICAgICAgICAgdC0+cmVzYW1wbGVyID0gTlVMTDsKICAgICAgICAgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQrKzsKICAgICB9CiAKLSAgICAvLyBmaW5kIG11bHRpY2hhbm5lbCBkb3dubWl4IGVmZmVjdCBpZiB3ZSBoYXZlIHRvIHBsYXkgbXVsdGljaGFubmVsIGNvbnRlbnQKLSAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICBpbnQgcmV0ID0gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXIoKSBlcnJvciAlZCBxdWVyeWluZyBudW1iZXIgb2YgZWZmZWN0cyIsIHJldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgewotICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJmR3bm1GeERlc2MpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJlZmZlY3QgJWQgaXMgY2FsbGVkICVzIiwgaSwgZHdubUZ4RGVzYy5uYW1lKTsKLSAgICAgICAgICAgIGlmIChtZW1jbXAoJmR3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkd25tRnhEZXNjLm5hbWUsIGR3bm1GeERlc2MuaW1wbGVtZW50b3IpOwotICAgICAgICAgICAgICAgIGlzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR0VfSUYoIWlzTXVsdGljaGFubmVsQ2FwYWJsZSwgInVuYWJsZSB0byBmaW5kIGRvd25taXggZWZmZWN0Iik7CiB9CiAKIEF1ZGlvTWl4ZXI6On5BdWRpb01peGVyKCkKQEAgLTE2NSw2ICs0MTgsNyBAQAogICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IE1BWF9OVU1fVFJBQ0tTIDsgaSsrKSB7CiAgICAgICAgIGRlbGV0ZSB0LT5yZXNhbXBsZXI7CiAgICAgICAgIGRlbGV0ZSB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgZGVsZXRlIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICB0Kys7CiAgICAgfQogICAgIGRlbGV0ZSBbXSBtU3RhdGUub3V0cHV0VGVtcDsKQEAgLTE3NiwzMiArNDMwLDUyIEBACiAgICAgbVN0YXRlLm1Mb2cgPSBsb2c7CiB9CiAKLWludCBBdWRpb01peGVyOjpnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCiB7CisgICAgaWYgKCFpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgZm9ybWF0ICglI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICB1aW50MzJfdCBuYW1lcyA9ICh+bVRyYWNrTmFtZXMpICYgbUNvbmZpZ3VyZWROYW1lczsKICAgICBpZiAobmFtZXMgIT0gMCkgewogICAgICAgICBpbnQgbiA9IF9fYnVpbHRpbl9jdHoobmFtZXMpOwogICAgICAgICBBTE9HVigiYWRkIHRyYWNrICglZCkiLCBuKTsKLSAgICAgICAgbVRyYWNrTmFtZXMgfD0gMSA8PCBuOwogICAgICAgICAvLyBhc3N1bWUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciB0aGUgdHJhY2ssIGV4Y2VwdCB3aGVyZSBub3RlZCBiZWxvdwogICAgICAgICB0cmFja190KiB0ID0gJm1TdGF0ZS50cmFja3Nbbl07CiAgICAgICAgIHQtPm5lZWRzID0gMDsKLSAgICAgICAgdC0+dm9sdW1lWzBdID0gVU5JVFlfR0FJTjsKLSAgICAgICAgdC0+dm9sdW1lWzFdID0gVU5JVFlfR0FJTjsKLSAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCi0gICAgICAgIC8vIHQtPnByZXZWb2x1bWVbMF0KLSAgICAgICAgLy8gdC0+cHJldlZvbHVtZVsxXQorCisgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgorICAgICAgICAvLyBDdXJyZW50bHkgaW50ZWdlciB2b2x1bWUgaXMga2VwdCBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgorICAgICAgICAvLyBXaWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyIHBhdGggaXMgcmVtb3ZlZC4KKyAgICAgICAgdC0+dm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQ7CisgICAgICAgIHQtPnZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fSU5UOworICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVCA8PCAxNjsKICAgICAgICAgdC0+dm9sdW1lSW5jWzBdID0gMDsKICAgICAgICAgdC0+dm9sdW1lSW5jWzFdID0gMDsKICAgICAgICAgdC0+YXV4TGV2ZWwgPSAwOwogICAgICAgICB0LT5hdXhJbmMgPSAwOworICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSAwOworCisgICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IHZvbHVtZS4KKyAgICAgICAgdC0+bVZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1Wb2x1bWVbMV0gPSBVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICB0LT5tUHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgdC0+bVZvbHVtZUluY1swXSA9IDAuOworICAgICAgICB0LT5tVm9sdW1lSW5jWzFdID0gMC47CisgICAgICAgIHQtPm1BdXhMZXZlbCA9IDAuOworICAgICAgICB0LT5tQXV4SW5jID0gMC47CisgICAgICAgIHQtPm1QcmV2QXV4TGV2ZWwgPSAwLjsKKwogICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKLSAgICAgICAgLy8gdC0+cHJldkF1eExldmVsCiAgICAgICAgIC8vIHQtPmZyYW1lQ291bnQKLSAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gMjsKKyAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgdC0+ZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICB0LT5mb3JtYXQgPSAxNjsKLSAgICAgICAgdC0+Y2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgICAgICJOb24tc3RlcmVvIGNoYW5uZWwgbWFzazogJWRcbiIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgdC0+Y2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKICAgICAgICAgdC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgICAgICAvLyBzZXRCdWZmZXJQcm92aWRlcihuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyICopIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXIgPSBOVUxMOwpAQCAtMjE1LDUyICs0ODksMTE2IEBACiAgICAgICAgIC8vIHNldFBhcmFtZXRlcihuYW1lLCBUUkFDSywgTUFJTl9CVUZGRVIsIG1peEJ1ZmZlcikgaXMgcmVxdWlyZWQgYmVmb3JlIGVuYWJsZShuYW1lKQogICAgICAgICB0LT5tYWluQnVmZmVyID0gTlVMTDsKICAgICAgICAgdC0+YXV4QnVmZmVyID0gTlVMTDsKKyAgICAgICAgdC0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0VHJhY2tEb3dubWl4KCZtU3RhdGUudHJhY2tzW25dLCBuLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBUUkFDSzAgKyBuOworICAgICAgICB0LT5tTWl4ZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgdC0+bUZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQgPSBrVXNlRmxvYXQgJiYga1VzZU5ld01peGVyCisgICAgICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHQtPm1NaXhlckNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCisgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTiwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1NaXhlckNoYW5uZWxNYXNrKTsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIGRvd25taXhpbmcgKG9yIHVwbWl4aW5nKSByZXF1aXJlbWVudHMuCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgodCwgbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgaW52YWxpZCBjaGFubmVsTWFzayAoJSN4KSIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lKDB4JXgpIGZhaWxlZCwgZXJyb3IgcHJlcGFyaW5nIHRyYWNrIGZvciBkb3dubWl4IiwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzayk7CisgICAgICAgIC8vIGluaXRUcmFja0Rvd25taXgoKSBtYXkgY2hhbmdlIHRoZSBpbnB1dCBmb3JtYXQgcmVxdWlyZW1lbnQuCisgICAgICAgIC8vIElmIHlvdSBkZXNpcmUgZmxvYXRpbmcgcG9pbnQgaW5wdXQgdG8gdGhlIG1peGVyLCBpdCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRvIGludGVnZXIgYmVjYXVzZSB0aGUgZG93bm1peGVyIHJlcXVpcmVzIGludGVnZXIgdG8gcHJvY2Vzcy4KKyAgICAgICAgQUxPR1ZWKCJtTWl4ZXJGb3JtYXQ6JSN4ICBtTWl4ZXJJbkZvcm1hdDolI3hcbiIsIHQtPm1NaXhlckZvcm1hdCwgdC0+bU1peGVySW5Gb3JtYXQpOworICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0LCBuKTsKKyAgICAgICAgbVRyYWNrTmFtZXMgfD0gMSA8PCBuOworICAgICAgICByZXR1cm4gVFJBQ0swICsgbjsKICAgICB9CisgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBvdXQgb2YgYXZhaWxhYmxlIHRyYWNrcyIpOwogICAgIHJldHVybiAtMTsKIH0KIAogdm9pZCBBdWRpb01peGVyOjppbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzaykKIHsKLSAgICBpZiAobWFzaykgeworICAgIGlmIChtYXNrICE9IDApIHsKICAgICAgICAgbVN0YXRlLm5lZWRzQ2hhbmdlZCB8PSBtYXNrOwogICAgICAgICBtU3RhdGUuaG9vayA9IHByb2Nlc3NfX3ZhbGlkYXRlOwogICAgIH0KICB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OmluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0sIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2spCi17Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7Ci0gICAgQUxPR19BU1NFUlQoKGNoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpICYmIGNoYW5uZWxDb3VudCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgaWYgKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpIHsKLSAgICAgICAgcFRyYWNrLT5jaGFubmVsTWFzayA9IG1hc2s7Ci0gICAgICAgIHBUcmFjay0+Y2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwotICAgICAgICBBTE9HVigiaW5pdFRyYWNrRG93bm1peCh0cmFjaz0lZCwgbWFzaz0weCV4KSBjYWxscyBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KCkiLAotICAgICAgICAgICAgICAgIHRyYWNrTnVtLCBtYXNrKTsKLSAgICAgICAgc3RhdHVzID0gcHJlcGFyZVRyYWNrRm9yRG93bm1peChwVHJhY2ssIHRyYWNrTnVtKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja051bSk7CisvLyBDYWxsZWQgd2hlbiBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCBmb3IgYSB0cmFjayBuYW1lCisvLyBUT0RPOiBGaXggRG93bm1peGJ1ZmZlcnByb2ZpZGVyIG5vdCB0byAocG9zc2libHkpIGNoYW5nZSBtaXhlciBpbnB1dCBmb3JtYXQsCisvLyB3aGljaCB3aWxsIHNpbXBsaWZ5IHRoaXMgbG9naWMuCitib29sIEF1ZGlvTWl4ZXI6OnNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzaykgeworICAgIHRyYWNrX3QgJnRyYWNrID0gbVN0YXRlLnRyYWNrc1tuYW1lXTsKKworICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLmNoYW5uZWxNYXNrCisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09IHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCisgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7CisgICAgY29uc3QgYm9vbCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQgPSB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgIT0gbWl4ZXJDaGFubmVsQ291bnQ7CisKKyAgICBBTE9HX0FTU0VSVCgodHJhY2tDaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYKQorICAgICAgICAgICAgJiYgdHJhY2tDaGFubmVsQ291bnQKKyAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbENvdW50KTsKKyAgICB0cmFjay5jaGFubmVsTWFzayA9IHRyYWNrQ2hhbm5lbE1hc2s7CisgICAgdHJhY2suY2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CisgICAgdHJhY2subU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrOworICAgIHRyYWNrLm1NaXhlckNoYW5uZWxDb3VudCA9IG1peGVyQ2hhbm5lbENvdW50OworCisgICAgLy8gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQsIGRvZXMgdGhpcyB0cmFjayBuZWVkIGEgZG93bm1peGVyPworICAgIC8vIHVwZGF0ZSB0byB0cnkgdXNpbmcgb3VyIGRlc2lyZWQgZm9ybWF0IChpZiB3ZSBhcmVuJ3QgYWxyZWFkeSB1c2luZyBpdCkKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBwcmV2TWl4ZXJJbkZvcm1hdCA9IHRyYWNrLm1NaXhlckluRm9ybWF0OworICAgIHRyYWNrLm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlcgorICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLAorICAgICAgICAgICAgImluaXRUcmFja0Rvd25taXggZXJyb3IgJWQsIHRyYWNrIGNoYW5uZWwgbWFzayAlI3gsIG1peGVyIGNoYW5uZWwgbWFzayAlI3giLAorICAgICAgICAgICAgc3RhdHVzLCB0cmFjay5jaGFubmVsTWFzaywgdHJhY2subU1peGVyQ2hhbm5lbE1hc2spOworCisgICAgY29uc3QgYm9vbCBtaXhlckluRm9ybWF0Q2hhbmdlZCA9IHByZXZNaXhlckluRm9ybWF0ICE9IHRyYWNrLm1NaXhlckluRm9ybWF0OworICAgIGlmIChtaXhlckluRm9ybWF0Q2hhbmdlZCkgeworICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmdHJhY2ssIG5hbWUpOyAvLyBiZWNhdXNlIG9mIGRvd25taXhlciwgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCisgICAgfQorCisgICAgaWYgKHRyYWNrLnJlc2FtcGxlciAmJiAobWl4ZXJJbkZvcm1hdENoYW5nZWQgfHwgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkKSkgeworICAgICAgICAvLyByZXNhbXBsZXIgaW5wdXQgZm9ybWF0IG9yIGNoYW5uZWxzIG1heSBoYXZlIGNoYW5nZWQuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlc2V0VG9TYW1wbGVSYXRlID0gdHJhY2suc2FtcGxlUmF0ZTsKKyAgICAgICAgZGVsZXRlIHRyYWNrLnJlc2FtcGxlcjsKKyAgICAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKKyAgICAgICAgdHJhY2suc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOyAvLyB3aXRob3V0IHJlc2FtcGxlciwgdHJhY2sgcmF0ZSBpcyBkZXZpY2Ugc2FtcGxlIHJhdGUuCisgICAgICAgIC8vIHJlY3JlYXRlIHRoZSByZXNhbXBsZXIgd2l0aCB1cGRhdGVkIGZvcm1hdCwgY2hhbm5lbHMsIHNhdmVkIHNhbXBsZVJhdGUuCisgICAgICAgIHRyYWNrLnNldFJlc2FtcGxlcihyZXNldFRvU2FtcGxlUmF0ZSAvKnRyYWNrU2FtcGxlUmF0ZSovLCBtU2FtcGxlUmF0ZSAvKmRldlNhbXBsZVJhdGUqLyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpIHsKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OmluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKQoreworICAgIC8vIE9ubHkgcmVtaXggKHVwbWl4IG9yIGRvd25taXgpIGlmIHRoZSB0cmFjayBhbmQgbWl4ZXIvZGV2aWNlIGNoYW5uZWwgbWFza3MKKyAgICAvLyBhcmUgbm90IHRoZSBzYW1lIGFuZCBub3QgaGFuZGxlZCBpbnRlcm5hbGx5LCBhcyBtb25vIC0+IHN0ZXJlbyBjdXJyZW50bHkgaXMuCisgICAgaWYgKHBUcmFjay0+Y2hhbm5lbE1hc2sgIT0gcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaworICAgICAgICAgICAgJiYgIShwVHJhY2stPmNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8KKyAgICAgICAgICAgICAgICAgICAgJiYgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSB7CisgICAgICAgIHJldHVybiBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKKyAgICB9CisgICAgLy8gbm8gcmVtaXggbmVjZXNzYXJ5CisgICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSBfX3VudXNlZCkgewogICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgoJWQpIiwgdHJhY2tOYW1lKTsKIAogICAgIGlmIChwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgLy8gdGhpcyB0cmFjayBoYWQgcHJldmlvdXNseSBiZWVuIGNvbmZpZ3VyZWQgd2l0aCBhIGRvd25taXhlciwgZGVsZXRlIGl0CiAgICAgICAgIEFMT0dWKCIgZGVsZXRpbmcgb2xkIGRvd25taXhlciIpOwotICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+bVRyYWNrQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIGRlbGV0ZSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiIG5vdGhpbmcgdG8gZG8sIG5vIGRvd25taXhlciB0byBkZWxldGUiKTsKICAgICB9CkBAIC0yNzIsMTAxICs2MTAsNjYgQEAKIAogICAgIC8vIGRpc2NhcmQgdGhlIHByZXZpb3VzIGRvd25taXhlciBpZiB0aGVyZSB3YXMgb25lCiAgICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KHBUcmFjaywgdHJhY2tOYW1lKTsKKyAgICBpZiAoRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSgpKSB7CisgICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBwRGJwID0gbmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+Y2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAvKiBUT0RPOiB1c2UgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwgbm93IG9ubHkgUENNIDE2ICovLAorICAgICAgICAgICAgICAgIHBUcmFjay0+c2FtcGxlUmF0ZSwgcFRyYWNrLT5zZXNzaW9uSWQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CiAKLSAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciogcERicCA9IG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwotICAgIGludDMyX3Qgc3RhdHVzOwotCi0gICAgaWYgKCFpc011bHRpY2hhbm5lbENhcGFibGUpIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVUcmFja0ZvckRvd25taXgoJWQpIGZhaWxzOiBtaXhlciBkb2Vzbid0IHN1cHBvcnQgbXVsdGljaGFubmVsIGNvbnRlbnQiLAotICAgICAgICAgICAgICAgIHRyYWNrTmFtZSk7Ci0gICAgICAgIGdvdG8gbm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2s7CisgICAgICAgIGlmIChwRGJwLT5pc1ZhbGlkKCkpIHsgLy8gaWYgY29uc3RydWN0b3IgY29tcGxldGVkIHByb3Blcmx5CisgICAgICAgICAgICBwVHJhY2stPm1NaXhlckluRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKKyAgICAgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwRGJwOworICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgcERicDsKICAgICB9CiAKLSAgICBpZiAoRWZmZWN0Q3JlYXRlKCZkd25tRnhEZXNjLnV1aWQsCi0gICAgICAgICAgICBwVHJhY2stPnNlc3Npb25JZCAvKnNlc3Npb25JZCovLCAtMiAvKmlvSWQgbm90IHJlbGV2YW50IGhlcmUsIHVzaW5nIHJhbmRvbSB2YWx1ZSovLAotICAgICAgICAgICAgJnBEYnAtPm1Eb3dubWl4SGFuZGxlLypwSGFuZGxlKi8pICE9IDApIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVUcmFja0ZvckRvd25taXgoJWQpIGZhaWxzOiBlcnJvciBjcmVhdGluZyBkb3dubWl4ZXIgZWZmZWN0IiwgdHJhY2tOYW1lKTsKLSAgICAgICAgZ290byBub0Rvd25taXhGb3JBY3RpdmVUcmFjazsKLSAgICB9Ci0KLSAgICAvLyBjaGFubmVsIGlucHV0IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBvdmVycmlkZGVuIHBlci10cmFjawotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gcFRyYWNrLT5jaGFubmVsTWFzazsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcERicC0+bURvd25taXhDb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBUcmFjay0+c2FtcGxlUmF0ZTsKLSAgICBwRGJwLT5tRG93bm1peENvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gcFRyYWNrLT5zYW1wbGVSYXRlOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7Ci0gICAgLy8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgcHJvdmlkZXIsIGFuZCBmcmFtZSBjb3VudCB3aWxsIG5vdCBiZSB1c2VkIGFzIHRoZSBkb3dubWl4IGVmZmVjdAotICAgIC8vIHByb2Nlc3MoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgKHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpKQotICAgIHBEYnAtPm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX1NNUF9SQVRFIHwgRUZGRUNUX0NPTkZJR19DSEFOTkVMUyB8Ci0gICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IEVGRkVDVF9DT05GSUdfQUNDX01PREU7Ci0gICAgcERicC0+bURvd25taXhDb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBwRGJwLT5tRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrOwotCi0gICAgey8vIHNjb3BlIGZvciBsb2NhbCB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHVzZWQgaW4gZ290byBsYWJlbCAibm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2siCi0gICAgICAgIGludCBjbWRTdGF0dXM7Ci0gICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotCi0gICAgICAgIC8vIENvbmZpZ3VyZSBhbmQgZW5hYmxlIGRvd25taXhlcgotICAgICAgICBzdGF0dXMgPSAoKnBEYnAtPm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChwRGJwLT5tRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgLypjbWRDb2RlKi8sIHNpemVvZihlZmZlY3RfY29uZmlnX3QpIC8qY21kU2l6ZSovLAotICAgICAgICAgICAgICAgICZwRGJwLT5tRG93bm1peENvbmZpZyAvKnBDbWREYXRhKi8sCi0gICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSAvKnJlcGx5U2l6ZSovLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLSAgICAgICAgaWYgKChzdGF0dXMgIT0gMCkgfHwgKGNtZFN0YXR1cyAhPSAwKSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yICVkIHdoaWxlIGNvbmZpZ3VyaW5nIGRvd25taXhlciBmb3IgdHJhY2sgJWQiLCBzdGF0dXMsIHRyYWNrTmFtZSk7Ci0gICAgICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOwotICAgICAgICB9Ci0gICAgICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICBzdGF0dXMgPSAoKnBEYnAtPm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChwRGJwLT5tRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSAvKmNtZENvZGUqLywgMCAvKmNtZFNpemUqLywgTlVMTCAvKnBDbWREYXRhKi8sCi0gICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSAvKnJlcGx5U2l6ZSovLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLSAgICAgICAgaWYgKChzdGF0dXMgIT0gMCkgfHwgKGNtZFN0YXR1cyAhPSAwKSkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yICVkIHdoaWxlIGVuYWJsaW5nIGRvd25taXhlciBmb3IgdHJhY2sgJWQiLCBzdGF0dXMsIHRyYWNrTmFtZSk7Ci0gICAgICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IGRvd25taXggdHlwZQotICAgICAgICAvLyBwYXJhbWV0ZXIgc2l6ZSByb3VuZGVkIGZvciBwYWRkaW5nIG9uIDMyYml0IGJvdW5kYXJ5Ci0gICAgICAgIGNvbnN0IGludCBwc2l6ZVBhZGRlZCA9ICgoc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpIC0gMSkvc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwotICAgICAgICBjb25zdCBpbnQgZG93bm1peFBhcmFtU2l6ZSA9Ci0gICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplUGFkZGVkICsgc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKLSAgICAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2MoZG93bm1peFBhcmFtU2l6ZSk7Ci0gICAgICAgIHBhcmFtLT5wc2l6ZSA9IHNpemVvZihkb3dubWl4X3BhcmFtc190KTsKLSAgICAgICAgY29uc3QgZG93bm1peF9wYXJhbXNfdCBkb3dubWl4UGFyYW0gPSBET1dOTUlYX1BBUkFNX1RZUEU7Ci0gICAgICAgIG1lbWNweShwYXJhbS0+ZGF0YSwgJmRvd25taXhQYXJhbSwgcGFyYW0tPnBzaXplKTsKLSAgICAgICAgY29uc3QgZG93bm1peF90eXBlX3QgZG93bm1peFR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKLSAgICAgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKLSAgICAgICAgbWVtY3B5KHBhcmFtLT5kYXRhICsgcHNpemVQYWRkZWQsICZkb3dubWl4VHlwZSwgcGFyYW0tPnZzaXplKTsKLQotICAgICAgICBzdGF0dXMgPSAoKnBEYnAtPm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChwRGJwLT5tRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9QQVJBTSAvKiBjbWRDb2RlICovLCBkb3dubWl4UGFyYW1TaXplLyogY21kU2l6ZSAqLywKLSAgICAgICAgICAgICAgICBwYXJhbSAvKnBDbW5kRGF0YSovLCAmcmVwbHlTaXplIC8qcmVwbHlTaXplKi8sICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotCi0gICAgICAgIGZyZWUocGFyYW0pOwotCi0gICAgICAgIGlmICgoc3RhdHVzICE9IDApIHx8IChjbWRTdGF0dXMgIT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciAlZCB3aGlsZSBzZXR0aW5nIGRvd25taXggdHlwZSBmb3IgdHJhY2sgJWQiLCBzdGF0dXMsIHRyYWNrTmFtZSk7Ci0gICAgICAgICAgICBnb3RvIG5vRG93bm1peEZvckFjdGl2ZVRyYWNrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImRvd25taXggdHlwZSBzZXQgdG8gJWQgZm9yIHRyYWNrICVkIiwgKGludCkgZG93bm1peFR5cGUsIHRyYWNrTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ly8gZW5kIG9mIHNjb3BlIGZvciBsb2NhbCB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IHVzZWQgaW4gZ290byBsYWJlbCAibm9Eb3dubWl4Rm9yQWN0aXZlVHJhY2siCi0KLSAgICAvLyBpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsOgotICAgIC8vIC0ga2VlcCB0cmFjayBvZiB0aGUgcmVhbCBidWZmZXIgcHJvdmlkZXIgaW4gY2FzZSBpdCB3YXMgc2V0IGJlZm9yZQotICAgIHBEYnAtPm1UcmFja0J1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5idWZmZXJQcm92aWRlcjsKLSAgICAvLyAtIHdlJ2xsIHVzZSB0aGUgZG93bm1peCBlZmZlY3QgaW50ZWdyYXRlZCBpbnNpZGUgdGhpcwotICAgIC8vICAgIHRyYWNrJ3MgYnVmZmVyIHByb3ZpZGVyLCBhbmQgd2UnbGwgdXNlIGl0IGFzIHRoZSB0cmFjaydzIGJ1ZmZlciBwcm92aWRlcgotICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwRGJwOwotICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwRGJwOwotCisgICAgLy8gRWZmZWN0IGRvd25taXhlciBkb2VzIG5vdCBhY2NlcHQgdGhlIGNoYW5uZWwgY29udmVyc2lvbi4gIExldCdzIHVzZSBvdXIgcmVtaXhlci4KKyAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKiBwUmJwID0gbmV3IFJlbWl4QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5jaGFubmVsTWFzaywKKyAgICAgICAgICAgIHBUcmFjay0+bU1peGVyQ2hhbm5lbE1hc2ssIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgLy8gUmVtaXggYWx3YXlzIGZpbmRzIGEgY29udmVyc2lvbiB3aGVyZWFzIERvd25taXhlciBlZmZlY3QgYWJvdmUgbWF5IGZhaWwuCisgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBSYnA7CisgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKICAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKLW5vRG93bm1peEZvckFjdGl2ZVRyYWNrOgotICAgIGRlbGV0ZSBwRGJwOwotICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgIHJldHVybiBOT19JTklUOwordm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSBfX3VudXNlZCkgeworICAgIEFMT0dWKCJBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCVkKSIsIHRyYWNrTmFtZSk7CisgICAgaWYgKHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCVkKSB3aXRoIGZvcm1hdCAlI3giLCB0cmFja05hbWUsIHBUcmFjay0+bUZvcm1hdCk7CisgICAgLy8gZGlzY2FyZCB0aGUgcHJldmlvdXMgcmVmb3JtYXR0ZXIgaWYgdGhlcmUgd2FzIG9uZQorICAgIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQocFRyYWNrLCB0cmFja05hbWUpOworICAgIC8vIG9ubHkgY29uZmlndXJlIHJlZm9ybWF0dGVyIGlmIG5lZWRlZAorICAgIGlmIChwVHJhY2stPm1Gb3JtYXQgIT0gcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBUcmFjay0+Y2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIHBUcmFjay0+bUZvcm1hdCwgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnModHJhY2tfdCogcFRyYWNrKQoreworICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+YnVmZmVyUHJvdmlkZXIpOworICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICB9CisgICAgaWYgKHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocFRyYWNrLT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgIH0KIH0KIAogdm9pZCBBdWRpb01peGVyOjpkZWxldGVUcmFja05hbWUoaW50IG5hbWUpCkBAIC0zODUsNiArNjg4LDggQEAKICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwogICAgIC8vIGRlbGV0ZSB0aGUgZG93bm1peGVyCiAgICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKKyAgICAvLyBkZWxldGUgdGhlIHJlZm9ybWF0dGVyCisgICAgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7CiAKICAgICBtVHJhY2tOYW1lcyAmPSB+KDE8PG5hbWUpOwogfQpAQCAtNDE1LDI5ICs3MjAsOTEgQEAKICAgICB9CiB9CiAKKy8qIFNldHMgdGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBmb3IgdGhlIEF1ZGlvTWl4ZXIuCisgKgorICogVGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBhcmUgdXNlZCB0byB0cmFuc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzCisgKiB2b2x1bWUgdG8gdGhlIHNldCB2b2x1bWUuICByYW1wIGNvbnRyb2xzIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4KKyAqIEl0cyB2YWx1ZSBpcyB0eXBpY2FsbHkgb25lIHN0YXRlIGZyYW1lY291bnQgcGVyaW9kLCBidXQgbWF5IGFsc28gYmUgMCwKKyAqIG1lYW5pbmcgImltbWVkaWF0ZS4iCisgKgorICogRklYTUU6IDEpIFZvbHVtZSByYW1wIGlzIGVuYWJsZWQgb25seSBpZiB0aGVyZSBpcyBhIG5vbnplcm8gaW50ZWdlciBpbmNyZW1lbnQKKyAqIGV2ZW4gaWYgdGhlcmUgaXMgYSBub256ZXJvIGZsb2F0aW5nIHBvaW50IGluY3JlbWVudCAoaW4gdGhhdCBjYXNlLCB0aGUgdm9sdW1lCisgKiBjaGFuZ2UgaXMgaW1tZWRpYXRlKS4gIFRoaXMgcmVzdHJpY3Rpb24gc2hvdWxkIGJlIGNoYW5nZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyCisgKiBpcyByZW1vdmVkIChzZWUgIzIpLgorICogRklYTUU6IDIpIEludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyBhcmUgdXNlZCBmb3IgTGVnYWN5IG1peGluZyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQKKyAqIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gbmV3Vm9sdW1lIHNldCB2b2x1bWUgdGFyZ2V0IGluIGZsb2F0aW5nIHBvaW50IFswLjAsIDEuMF0uCisgKiBAcGFyYW0gcmFtcCBudW1iZXIgb2YgZnJhbWVzIHRvIGluY3JlbWVudCBvdmVyLiBpZiByYW1wIGlzIDAsIHRoZSB2b2x1bWUKKyAqIHNob3VsZCBiZSBzZXQgaW1tZWRpYXRlbHkuICBDdXJyZW50bHkgcmFtcCBzaG91bGQgbm90IGV4Y2VlZCA2NTUzNSAoZnJhbWVzKS4KKyAqIEBwYXJhbSBwSW50U2V0Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIFU0LjEyIGludGVnZXIgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50UHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBVNC4yOCBpbnRlZ2VyIHByZXZpb3VzIHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50Vm9sdW1lSW5jIHBvaW50ZXIgdG8gdGhlIFU0LjI4IGluY3JlbWVudCBwZXIgb3V0cHV0IGF1ZGlvIGZyYW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBTZXRWb2x1bWUgcG9pbnRlciB0byB0aGUgZmxvYXQgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwUHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBmbG9hdCBwcmV2aW91cyB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFZvbHVtZUluYyBwb2ludGVyIHRvIHRoZSBmbG9hdCBpbmNyZW1lbnQgcGVyIG91dHB1dCBhdWRpbyBmcmFtZSwgc2V0IG9uIHJldHVybi4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdm9sdW1lIGhhcyBjaGFuZ2VkLCBmYWxzZSBpZiB2b2x1bWUgaXMgc2FtZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoZmxvYXQgbmV3Vm9sdW1lLCBpbnQzMl90IHJhbXAsCisgICAgICAgIGludDE2X3QgKnBJbnRTZXRWb2x1bWUsIGludDMyX3QgKnBJbnRQcmV2Vm9sdW1lLCBpbnQzMl90ICpwSW50Vm9sdW1lSW5jLAorICAgICAgICBmbG9hdCAqcFNldFZvbHVtZSwgZmxvYXQgKnBQcmV2Vm9sdW1lLCBmbG9hdCAqcFZvbHVtZUluYykgeworICAgIGlmIChuZXdWb2x1bWUgPT0gKnBTZXRWb2x1bWUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKiBzZXQgdGhlIGZsb2F0aW5nIHBvaW50IHZvbHVtZSB2YXJpYWJsZXMgKi8KKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgICpwVm9sdW1lSW5jID0gKG5ld1ZvbHVtZSAtICpwU2V0Vm9sdW1lKSAvIHJhbXA7CisgICAgICAgICpwUHJldlZvbHVtZSA9ICpwU2V0Vm9sdW1lOworICAgIH0gZWxzZSB7CisgICAgICAgICpwVm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOworICAgIH0KKyAgICAqcFNldFZvbHVtZSA9IG5ld1ZvbHVtZTsKKworICAgIC8qIHNldCB0aGUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyAqLworICAgIGludDMyX3QgaW50Vm9sdW1lID0gbmV3Vm9sdW1lICogQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7CisgICAgaWYgKGludFZvbHVtZSA+IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UKSB7CisgICAgICAgIGludFZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOworICAgIH0gZWxzZSBpZiAoaW50Vm9sdW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdm9sdW1lICUuN2ciLCBuZXdWb2x1bWUpOworICAgICAgICBpbnRWb2x1bWUgPSAwOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZm9yIHNhZmV0eSBjaGVjay4KKyAgICB9CisgICAgaWYgKGludFZvbHVtZSA9PSAqcEludFNldFZvbHVtZSkgeworICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7CisgICAgICAgIC8qIFRPRE86IGludGVnZXIvZmxvYXQgd29ya2Fyb3VuZDogaWdub3JlIGZsb2F0aW5nIHZvbHVtZSByYW1wICovCisgICAgICAgICpwVm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAqcEludFZvbHVtZUluYyA9ICgoaW50Vm9sdW1lIC0gKnBJbnRTZXRWb2x1bWUpIDw8IDE2KSAvIHJhbXA7CisgICAgICAgICpwSW50UHJldlZvbHVtZSA9ICgqcEludFZvbHVtZUluYyA9PSAwID8gaW50Vm9sdW1lIDogKnBJbnRTZXRWb2x1bWUpIDw8IDE2OworICAgIH0gZWxzZSB7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gaW50Vm9sdW1lIDw8IDE2OworICAgIH0KKyAgICAqcEludFNldFZvbHVtZSA9IGludFZvbHVtZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBBdWRpb01peGVyOjpzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB0YXJnZXQsIGludCBwYXJhbSwgdm9pZCAqdmFsdWUpCiB7CiAgICAgbmFtZSAtPSBUUkFDSzA7CiAgICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CiAgICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOwogCi0gICAgaW50IHZhbHVlSW50ID0gKGludCl2YWx1ZTsKLSAgICBpbnQzMl90ICp2YWx1ZUJ1ZiA9IChpbnQzMl90ICopdmFsdWU7CisgICAgaW50IHZhbHVlSW50ID0gc3RhdGljX2Nhc3Q8aW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odmFsdWUpKTsKKyAgICBpbnQzMl90ICp2YWx1ZUJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KHZhbHVlKTsKIAogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAKICAgICBjYXNlIFRSQUNLOgogICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKLSAgICAgICAgICAgIGlmICh0cmFjay5jaGFubmVsTWFzayAhPSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKGNoYW5uZWxDb3VudCA8PSBNQVhfTlVNX0NIQU5ORUxTX1RPX0RPV05NSVgpICYmIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICAgICAgdHJhY2suY2hhbm5lbE1hc2sgPSBtYXNrOwotICAgICAgICAgICAgICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICAvLyB0aGUgbWFzayBoYXMgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/Ci0gICAgICAgICAgICAgICAgaW5pdFRyYWNrRG93bm1peCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSwgbWFzayk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCBtYXNrKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIENIQU5ORUxfTUFTSywgJXgpIiwgdHJhY2tDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwpAQCAtNDU1LDE1ICs4MjIsMzcgQEAKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPUk1BVDoKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZPUk1BVDogeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay5tRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdHJhY2subUZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBGT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHByZXBhcmVUcmFja0ZvclJlZm9ybWF0KCZ0cmFjaywgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAvLyBGSVhNRSBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgc2V0dGluZyB0aGUgZG93bm1peCB0eXBlIGZyb20gQXVkaW9GbGluZ2VyPwogICAgICAgICAvLyAgICAgICAgIGZvciBhIHNwZWNpZmljIHRyYWNrPyBvciBwZXIgbWl4ZXI/CiAgICAgICAgIC8qIGNhc2UgRE9XTk1JWF9UWVBFOgogICAgICAgICAgICAgYnJlYWsgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBNSVhFUl9GT1JNQVQ6IHsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pih2YWx1ZUludCk7CisgICAgICAgICAgICBpZiAodHJhY2subU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIHRyYWNrLm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBNSVhFUl9DSEFOTkVMX01BU0s6IHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBwYXJhbSIpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRyYWNrOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTQ4OCw4NSArODc3LDc3IEBACiAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0ZBVEFMKCJiYWQgcGFyYW0iKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBSQU1QX1ZPTFVNRToKICAgICBjYXNlIFZPTFVNRToKICAgICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICBjYXNlIFZPTFVNRTA6Ci0gICAgICAgIGNhc2UgVk9MVU1FMToKLSAgICAgICAgICAgIGlmICh0cmFjay52b2x1bWVbcGFyYW0tVk9MVU1FMF0gIT0gdmFsdWVJbnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFZPTFVNRSwgVk9MVU1FMC8xOiAlMDR4KSIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW3BhcmFtLVZPTFVNRTBdID0gdHJhY2sudm9sdW1lW3BhcmFtLVZPTFVNRTBdIDw8IDE2OwotICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF0gPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lSW5jW3BhcmFtLVZPTFVNRTBdID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZWb2x1bWVbcGFyYW0tVk9MVU1FMF07Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgdm9sSW5jID0gZCAvIGludDMyX3QobVN0YXRlLmZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVJbmNbcGFyYW0tVk9MVU1FMF0gPSB2b2xJbmM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2xJbmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtwYXJhbS1WT0xVTUUwXSA9IHZhbHVlSW50IDw8IDE2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVYTEVWRUw6Ci0gICAgICAgICAgICAvL0FMT0dfQVNTRVJUKDAgPD0gdmFsdWVJbnQgJiYgdmFsdWVJbnQgPD0gTUFYX0dBSU5fSU5ULCAiYmFkIGF1eCBsZXZlbCAlZCIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmICh0cmFjay5hdXhMZXZlbCAhPSB2YWx1ZUludCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVk9MVU1FLCBBVVhMRVZFTDogJTA0eCkiLCB2YWx1ZUludCk7Ci0gICAgICAgICAgICAgICAgdHJhY2sucHJldkF1eExldmVsID0gdHJhY2suYXV4TGV2ZWwgPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2suYXV4TGV2ZWwgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09IFZPTFVNRSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZBdXhMZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLmF1eEluYyA9IHZvbEluYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbEluYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB2YWx1ZUludCA8PCAxNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtU3RhdGUuZnJhbWVDb3VudCA6IDAsCisgICAgICAgICAgICAgICAgICAgICZ0cmFjay5hdXhMZXZlbCwgJnRyYWNrLnByZXZBdXhMZXZlbCwgJnRyYWNrLmF1eEluYywKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1BdXhMZXZlbCwgJnRyYWNrLm1QcmV2QXV4TGV2ZWwsICZ0cmFjay5tQXV4SW5jKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIEFVWExFVkVMOiAlMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCB0cmFjay5hdXhMZXZlbCk7CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19GQVRBTCgiYmFkIHBhcmFtIik7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXBhcmFtID49IFZPTFVNRTAgJiYgKHVuc2lnbmVkKXBhcmFtIDwgVk9MVU1FMCArIE1BWF9OVU1fVk9MVU1FUykgeworICAgICAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbVN0YXRlLmZyYW1lQ291bnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLCAmdHJhY2sucHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLnZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1Wb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwgJnRyYWNrLm1QcmV2Vm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2subVZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKCVzLCBWT0xVTUUlZDogJTA0eCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHBhcmFtIC0gVk9MVU1FMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdm9sdW1lOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfRkFUQUwoImJhZCB0YXJnZXQiKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyOiBiYWQgdGFyZ2V0ICVkIiwgdGFyZ2V0KTsKICAgICB9CiB9CiAKLWJvb2wgQXVkaW9NaXhlcjo6dHJhY2tfdDo6c2V0UmVzYW1wbGVyKHVpbnQzMl90IHZhbHVlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQorYm9vbCBBdWRpb01peGVyOjp0cmFja190OjpzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQogewotICAgIGlmICh2YWx1ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IHJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gdmFsdWU7CisgICAgaWYgKHRyYWNrU2FtcGxlUmF0ZSAhPSBkZXZTYW1wbGVSYXRlIHx8IHJlc2FtcGxlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IHRyYWNrU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHRyYWNrU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGlmIChyZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGluZyByZXNhbXBsZXIgZnJvbSB0cmFjayAlZCBIeiB0byBkZXZpY2UgJWQgSHoiLCB2YWx1ZSwgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNyZWF0aW5nIHJlc2FtcGxlciBmcm9tIHRyYWNrICVkIEh6IHRvIGRldmljZSAlZCBIeiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1NhbXBsZVJhdGUsIGRldlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5OwogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGxvd2VzdCBxdWFsaXR5IGxldmVsIHJlc2FtcGxlciBpZiB1c2UgY2FzZSBpc24ndCBtdXNpYyBvciB2aWRlbwogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgZmxhd2VkIGZvciBkeW5hbWljIHNhbXBsZSByYXRlcywgYXMgd2UgY2hvb3NlIHRoZSByZXNhbXBsZXIKICAgICAgICAgICAgICAgICAvLyBxdWFsaXR5IGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHJhdGlvLCBidXQgdGhhdCBjb3VsZCBjaGFuZ2UgbGF0ZXIuCiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggdHJhY2tzIHdpdGggc3RhdGljIHJhdGlvcyB2cy4gZHluYW1pYyByYXRpb3MuCi0gICAgICAgICAgICAgICAgaWYgKCEoKHZhbHVlID09IDQ0MTAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDgwMDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09IDQ4MDAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDQxMDApKSkgewotICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZOworICAgICAgICAgICAgICAgIGlmICghKCh0cmFja1NhbXBsZVJhdGUgPT0gNDQxMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0ODAwMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAodHJhY2tTYW1wbGVSYXRlID09IDQ4MDAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDQxMDApKSkgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgTU9OT19IQUNLLiBSZXNhbXBsZXIgc2VlcyAjY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlcgorICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgorICAgICAgICAgICAgICAgIGNvbnN0IGludCByZXNhbXBsZXJDaGFubmVsQ291bnQgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICA/IG1NaXhlckNoYW5uZWxDb3VudCA6IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBBTE9HVlYoIkNyZWF0aW5nIHJlc2FtcGxlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdCglI3gpIGNoYW5uZWxzKCVkKSBkZXZTYW1wbGVSYXRlKCV1KSBxdWFsaXR5KCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCByZXNhbXBsZXJDaGFubmVsQ291bnQsIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwogICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIHNlZXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyLCBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwgPyBNQVhfTlVNX0NIQU5ORUxTIDogY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICByZXNhbXBsZXJDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZTYW1wbGVSYXRlLCBxdWFsaXR5KTsKICAgICAgICAgICAgICAgICByZXNhbXBsZXItPnNldExvY2FsVGltZUZyZXEoc0xvY2FsVGltZUZyZXEpOwogICAgICAgICAgICAgfQpAQCAtNTc2LDIxICs5NTcsNTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWlubGluZQotdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4KQorLyogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdm9sdW1lIHJhbXAgaGFzIGNvbXBsZXRlZCBhbmQgY2xlYXJzIHRoZSBpbmNyZW1lbnQKKyAqIHZhcmlhYmxlcyBhcHByb3ByaWF0ZWx5LgorICoKKyAqIEZJWE1FOiBUaGVyZSBpcyBjb2RlIHRvIGhhbmRsZSBpbnQvZmxvYXQgcmFtcCB2YXJpYWJsZSBzd2l0Y2hvdmVyIHNob3VsZCBpdCBub3QKKyAqIGNvbXBsZXRlIHdpdGhpbiBhIG1peGVyIGJ1ZmZlciBwcm9jZXNzaW5nIGNhbGwsIGJ1dCBpdCBpcyBwcmVmZXJyZWQgdG8gYXZvaWQgc3dpdGNob3ZlcgorICogZHVlIHRvIHByZWNpc2lvbiBpc3N1ZXMuICBUaGUgc3dpdGNob3ZlciBjb2RlIGlzIGluY2x1ZGVkIGZvciBsZWdhY3kgY29kZSBwdXJwb3NlcworICogYW5kIGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGludGVnZXIgdm9sdW1lIGlzIHJlbW92ZWQuCisgKgorICogSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gY2xlYXIgb25seSB0aGUgdm9sdW1lSW5jIGludGVnZXIgdmFyaWFibGUgYmVjYXVzZQorICogaWYgb25lIGNoYW5uZWwgcmVxdWlyZXMgcmFtcGluZywgYWxsIGNoYW5uZWxzIGFyZSByYW1wZWQuCisgKgorICogVGhlcmUgaXMgYSBiaXQgb2YgZHVwbGljYXRlZCBjb2RlIGhlcmUsIGJ1dCBpdCBrZWVwcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICovCitpbmxpbmUgdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0KQogewotICAgIGZvciAodWludDMyX3QgaT0wIDsgaTxNQVhfTlVNX0NIQU5ORUxTIDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKHZvbHVtZUluY1tpXT4wKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA+PSB2b2x1bWVbaV0pKSB8fAotICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKLSAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7Ci0gICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldPDwxNjsKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVZvbHVtZUluY1tpXSAhPSAwICYmIGZhYnMobVZvbHVtZVtpXSAtIG1QcmV2Vm9sdW1lW2ldKSA8PSBmYWJzKG1Wb2x1bWVJbmNbaV0pKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldIDw8IDE2OworICAgICAgICAgICAgICAgIG1Wb2x1bWVJbmNbaV0gPSAwLjsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSA9IG1Wb2x1bWVbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoInJhbXA6ICVmICVmICVmIiwgbVZvbHVtZVtpXSwgbVByZXZWb2x1bWVbaV0sIG1Wb2x1bWVJbmNbaV0pOworICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB1NF8yOF9mcm9tX2Zsb2F0KG1QcmV2Vm9sdW1lW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodm9sdW1lSW5jW2ldPDApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpIDw9IHZvbHVtZVtpXSkpKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldIDw8IDE2OworICAgICAgICAgICAgICAgIG1Wb2x1bWVJbmNbaV0gPSAwLjsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSA9IG1Wb2x1bWVbaV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoInJhbXA6ICVkICVkICVkIiwgdm9sdW1lW2ldIDw8IDE2LCBwcmV2Vm9sdW1lW2ldLCB2b2x1bWVJbmNbaV0pOworICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldICA9IGZsb2F0X2Zyb21fdTRfMjgocHJldlZvbHVtZVtpXSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgLyogVE9ETzogYXV4IGlzIGFsd2F5cyBpbnRlZ2VyIHJlZ2FyZGxlc3Mgb2Ygb3V0cHV0IGJ1ZmZlciB0eXBlICovCiAgICAgaWYgKGF1eCkgewogICAgICAgICBpZiAoKChhdXhJbmM+MCkgJiYgKCgocHJldkF1eExldmVsK2F1eEluYyk+PjE2KSA+PSBhdXhMZXZlbCkpIHx8Ci0gICAgICAgICAgICAoKGF1eEluYzwwKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpIDw9IGF1eExldmVsKSkpIHsKKyAgICAgICAgICAgICAgICAoKGF1eEluYzwwKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpIDw9IGF1eExldmVsKSkpIHsKICAgICAgICAgICAgIGF1eEluYyA9IDA7Ci0gICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbDw8MTY7CisgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgIG1BdXhJbmMgPSAwLjsKKyAgICAgICAgICAgIG1QcmV2QXV4TGV2ZWwgPSBtQXV4TGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL0FMT0dWKCJhdXggcmFtcDogJWQgJWQgJWQiLCBhdXhMZXZlbCA8PCAxNiwgcHJldkF1eExldmVsLCBhdXhJbmMpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjA5LDIxICsxMDI2LDE2IEBACiAgICAgbmFtZSAtPSBUUkFDSzA7CiAgICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7CiAKLSAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIHVwZGF0ZSByZXF1aXJlZD8KLSAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyICE9IGJ1ZmZlclByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBBTE9HVigiQXVkaW9NaXhlcjo6c2V0QnVmZmVyUHJvdmlkZXIoJXApIGZvciBkb3dubWl4IiwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIGZvciBhIHRyYWNrIHRoYXQgZ2V0cyBkb3dubWl4ZWQgY29uc2lzdHMgaW46Ci0gICAgICAgICAgICAvLyAgMS8gc2V0dGluZyB0aGUgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSAiZG93bm1peCAvIGJ1ZmZlciBwcm92aWRlciIgd3JhcHBlcgotICAgICAgICAgICAgLy8gICAgIHNvIGl0J3MgdGhlIG9uZSB0aGF0IGdldHMgY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBwcm92aWRlciBpcyBuZWVkZWQsCi0gICAgICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmJ1ZmZlclByb3ZpZGVyID0gbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgIC8vICAyLyBzYXZpbmcgdGhlIGJ1ZmZlciBwcm92aWRlciBmb3IgdGhlIHRyYWNrIHNvIHRoZSB3cmFwcGVyIGNhbiB1c2UgaXQKLSAgICAgICAgICAgIC8vICAgICB3aGVuIGl0IGRvd25taXhlcy4KLSAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPm1UcmFja0J1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBkb24ndCByZXNldCBhbnkgYnVmZmVyIHByb3ZpZGVycyBpZiBpZGVudGljYWwuCiAgICAgfQorICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgIH0KKworICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKKyAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygmbVN0YXRlLnRyYWNrc1tuYW1lXSk7CiB9CiAKIApAQCAtNjU2LDYgKzEwNjgsOSBAQAogCiAgICAgLy8gY29tcHV0ZSBldmVyeXRoaW5nIHdlIG5lZWQuLi4KICAgICBpbnQgY291bnRBY3RpdmVUcmFja3MgPSAwOworICAgIC8vIFRPRE86IGZpeCBhbGwxNkJpdHNTdGVyZU5vUmVzYW1wbGUgbG9naWMgdG8KKyAgICAvLyBlaXRoZXIgcHJvcGVybHkgaGFuZGxlIG11dGVkIHRyYWNrcyAoaXQgc2hvdWxkIGlnbm9yZSB0aGVtKQorICAgIC8vIG9yIHJlbW92ZSBhbHRvZ2V0aGVyIGFzIGFuIG9ic29sZXRlIG9wdGltaXphdGlvbi4KICAgICBib29sIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSB0cnVlOwogICAgIGJvb2wgcmVzYW1wbGluZyA9IGZhbHNlOwogICAgIGJvb2wgdm9sdW1lUmFtcCA9IGZhbHNlOwpAQCAtNjY3LDM5ICsxMDgyLDQ3IEBACiAgICAgICAgIGNvdW50QWN0aXZlVHJhY2tzKys7CiAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgICAgICB1aW50MzJfdCBuID0gMDsKKyAgICAgICAgLy8gRklYTUUgY2FuIG92ZXJmbG93IChtYXNrIGlzIG9ubHkgMyBiaXRzKQogICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQuY2hhbm5lbENvdW50IC0gMTsKLSAgICAgICAgbiB8PSBORUVEU19GT1JNQVRfMTY7Ci0gICAgICAgIG4gfD0gdC5kb2VzUmVzYW1wbGUoKSA/IE5FRURTX1JFU0FNUExFX0VOQUJMRUQgOiBORUVEU19SRVNBTVBMRV9ESVNBQkxFRDsKKyAgICAgICAgaWYgKHQuZG9lc1Jlc2FtcGxlKCkpIHsKKyAgICAgICAgICAgIG4gfD0gTkVFRFNfUkVTQU1QTEU7CisgICAgICAgIH0KICAgICAgICAgaWYgKHQuYXV4TGV2ZWwgIT0gMCAmJiB0LmF1eEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuIHw9IE5FRURTX0FVWF9FTkFCTEVEOworICAgICAgICAgICAgbiB8PSBORUVEU19BVVg7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAodC52b2x1bWVJbmNbMF18dC52b2x1bWVJbmNbMV0pIHsKICAgICAgICAgICAgIHZvbHVtZVJhbXAgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkgewotICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFX0VOQUJMRUQ7CisgICAgICAgICAgICBuIHw9IE5FRURTX01VVEU7CiAgICAgICAgIH0KICAgICAgICAgdC5uZWVkcyA9IG47CiAKLSAgICAgICAgaWYgKChuICYgTkVFRFNfTVVURV9fTUFTSykgPT0gTkVFRFNfTVVURV9FTkFCTEVEKSB7CisgICAgICAgIGlmIChuICYgTkVFRFNfTVVURSkgewogICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX25vcDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0FVWF9fTUFTSykgPT0gTkVFRFNfQVVYX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGlmIChuICYgTkVFRFNfQVVYKSB7CiAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfUkVTQU1QTEVfX01BU0spID09IE5FRURTX1JFU0FNUExFX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIGlmIChuICYgTkVFRFNfUkVTQU1QTEUpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKKyAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX1JFU0FNUExFLCB0Lm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXggKyByZXNhbXBsZSIsIGkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA9PSBORUVEU19DSEFOTkVMXzEpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fMTZCaXRzTW9ubzsKKyAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50ID09IDIgLy8gVE9ETzogTU9OT19IQUNLLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTyA6IFRSQUNLVFlQRV9OT1JFU0FNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+PSBORUVEU19DSEFOTkVMXzIpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fMTZCaXRzU3RlcmVvOworICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIGkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTcwOSw3ICsxMTMyLDcgQEAKIAogICAgIC8vIHNlbGVjdCB0aGUgcHJvY2Vzc2luZyBob29rcwogICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcykgeworICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKICAgICAgICAgaWYgKHJlc2FtcGxpbmcpIHsKICAgICAgICAgICAgIGlmICghc3RhdGUtPm91dHB1dFRlbXApIHsKICAgICAgICAgICAgICAgICBzdGF0ZS0+b3V0cHV0VGVtcCA9IG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07CkBAIC03MzAsNyArMTE1MywxNyBAQAogICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nOwogICAgICAgICAgICAgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgJiYgIXZvbHVtZVJhbXApIHsKICAgICAgICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19NVVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgcHJldmVudHMgYSBtdXRlZCB0cmFjayBmcm9tIGFjcXVpcmluZyBhIHByb2Nlc3MgaG9vay4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyBpZiB0aGUgdHJhY2sgaXMgTU9OTyBhcyB0aGF0IHJlcXVpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgZHVlIHRvIGltcGxpY2l0IGNoYW5uZWwgZHVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVyZW8gb3IgTXVsdGljaGFubmVsIHNob3VsZCBhY3R1YWxseSBiZSBmaW5lIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzQ1LDE2ICsxMTc4LDE1IEBACiAKICAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAgLy8gdHJhY2sgaG9va3MgZm9yIHN1YnNlcXVlbnQgbWl4ZXIgcHJvY2VzcwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcykgeworICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKICAgICAgICAgYm9vbCBhbGxNdXRlZCA9IHRydWU7CiAgICAgICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CiAgICAgICAgIHdoaWxlIChlbikgewogICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwogICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKCF0LmRvZXNSZXNhbXBsZSgpICYmIHQudm9sdW1lUkwgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0Lm5lZWRzIHw9IE5FRURTX01VVEVfRU5BQkxFRDsKKyAgICAgICAgICAgIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKKyAgICAgICAgICAgICAgICB0Lm5lZWRzIHw9IE5FRURTX01VVEU7CiAgICAgICAgICAgICAgICAgdC5ob29rID0gdHJhY2tfX25vcDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYWxsTXV0ZWQgPSBmYWxzZTsKQEAgLTc2NCw3ICsxMTk2LDExIEBACiAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX25vcDsKICAgICAgICAgfSBlbHNlIGlmIChhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlKSB7CiAgICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewotICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOworICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgICAgIC8vIE11dGVkIHNpbmdsZSB0cmFja3MgaGFuZGxlZCBieSBhbGxNdXRlZCBhYm92ZS4KKyAgICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LCB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03NzQsMTUgKzEyMTAsMTUgQEAKIHZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fZ2VuZXJpY1Jlc2FtcGxlXG4iKTsKICAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CiAKICAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCiAgICAgaWYgKGF1eCAhPSBOVUxMKSB7CiAgICAgICAgIC8vIGFsd2F5cyByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gd2hlbiBzZW5kaW5nIHRvIGF1eGlsaWFyeSBidWZmZXIgdG8gYmUgYWJsZQogICAgICAgICAvLyB0byBhcHBseSBzZW5kIGxldmVsIGFmdGVyIHJlc2FtcGxpbmcKLSAgICAgICAgLy8gVE9ETzogbW9kaWZ5IGVhY2ggcmVzYW1wbGVyIHRvIHN1cHBvcnQgYXV4IGNoYW5uZWw/Ci0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU4sIFVOSVRZX0dBSU4pOwotICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MzJfdCkpOwogICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSkgewogICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CkBAIC03OTEsNyArMTIyNyw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU4sIFVOSVRZX0dBSU4pOworICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CiAgICAgICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOwogICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CiAgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKQEAgLTc5OSwxNCArMTIzNSwxNCBAQAogCiAgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT52b2x1bWVbMF0sIHQtPnZvbHVtZVsxXSk7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKICAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19ub3AodHJhY2tfdCogdCBfX3VudXNlZCwgaW50MzJfdCogb3V0IF9fdW51c2VkLAorICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCBfX3VudXNlZCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4IF9fdW51c2VkKQogewogfQogCkBAIC04ODIsOSArMTMxOCwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CisgICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzU3RlcmVvXG4iKTsKICAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4odC0+aW4pOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewpAQCAtOTczLDkgKzE0MTAsMTAgQEAKICAgICB0LT5pbiA9IGluOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsCi0gICAgICAgIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQogeworICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c01vbm9cbiIpOwogICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPih0LT5pbik7CiAKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CkBAIC0xMDYzLDggKzE1MDEsOCBAQAogLy8gbm8tb3AgY2FzZQogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fbm9wXG4iKTsKICAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgIHNpemVfdCBidWZTaXplID0gc3RhdGUtPmZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCkgKiBNQVhfTlVNX0NIQU5ORUxTOwogICAgIHdoaWxlIChlMCkgewogICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IGJ1ZmZlciB0bwogICAgICAgICAvLyBhdm9pZCBtdWx0aXBsZSBtZW1zZXQoKSBvbiBzYW1lIGJ1ZmZlcgpAQCAtMTA4Myw3ICsxNTIxLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGUwICY9IH4oZTEpOwogCi0gICAgICAgICAgICBtZW1zZXQodDEubWFpbkJ1ZmZlciwgMCwgYnVmU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQodDEubWFpbkJ1ZmZlciwgMCwgc3RhdGUtPmZyYW1lQ291bnQgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQxLm1NaXhlckZvcm1hdCkpOwogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKGUxKSB7CkBAIC0xMTA5LDYgKzE1NDgsNyBAQAogLy8gZ2VuZXJpYyBjb2RlIHdpdGhvdXQgcmVzYW1wbGluZwogdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmdcbiIpOwogICAgIGludDMyX3Qgb3V0VGVtcFtCTE9DS1NJWkUgKiBNQVhfTlVNX0NIQU5ORUxTXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwogCiAgICAgLy8gYWNxdWlyZSBlYWNoIHRyYWNrJ3MgYnVmZmVyCkBAIC0xMTUzLDcgKzE1OTMsNyBAQAogICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBCTE9DS1NJWkU7CiAgICAgICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSkgeworICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewogICAgICAgICAgICAgICAgICAgICBhdXggPSB0LmF1eEJ1ZmZlciArIG51bUZyYW1lczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgewpAQCAtMTE2NSw5ICsxNjA1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LmZyYW1lQ291bnQgPiBvdXRGcmFtZXMpP291dEZyYW1lczp0LmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgKEJMT0NLU0laRS1vdXRGcmFtZXMpKk1BWF9OVU1fQ0hBTk5FTFMsIGluRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKSAqIHQubU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKQEAgLTExOTEsOCArMTYzMSwxMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAob3V0LCBvdXRUZW1wLCBCTE9DS1NJWkUpOwotICAgICAgICAgICAgb3V0ICs9IEJMT0NLU0laRTsKKworICAgICAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LCBvdXRUZW1wLCB0MS5tTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIC8vIFRPRE86IGZpeCB1Z2x5IGNhc3RpbmcgZHVlIHRvIGNob2ljZSBvZiBvdXQgcG9pbnRlciB0eXBlCisgICAgICAgICAgICBvdXQgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPigodWludDhfdCopb3V0CisgICAgICAgICAgICAgICAgICAgICsgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7CiAgICAgICAgICAgICBudW1GcmFtZXMgKz0gQkxPQ0tTSVpFOwogICAgICAgICB9IHdoaWxlIChudW1GcmFtZXMgPCBzdGF0ZS0+ZnJhbWVDb3VudCk7CiAgICAgfQpAQCAtMTIxMSwxMCArMTY1Niw5IEBACiAvLyBnZW5lcmljIGNvZGUgd2l0aCByZXNhbXBsaW5nCiB2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cykKIHsKKyAgICBBTE9HVlYoInByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nXG4iKTsKICAgICAvLyB0aGlzIGNvbnN0IGp1c3QgbWVhbnMgdGhhdCBsb2NhbCB2YXJpYWJsZSBvdXRUZW1wIGRvZXNuJ3QgY2hhbmdlCiAgICAgaW50MzJfdCogY29uc3Qgb3V0VGVtcCA9IHN0YXRlLT5vdXRwdXRUZW1wOwotICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGludDMyX3QpICogTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50OwotCiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogCiAgICAgdWludDMyX3QgZTAgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKQEAgLTEyMzUsMjAgKzE2NzksMjAgQEAKICAgICAgICAgfQogICAgICAgICBlMCAmPSB+KGUxKTsKICAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKLSAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemUpOworICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKCpvdXRUZW1wKSAqIHQxLm1NaXhlckNoYW5uZWxDb3VudCAqIHN0YXRlLT5mcmFtZUNvdW50KTsKICAgICAgICAgd2hpbGUgKGUxKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CiAgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOwogICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKCh0Lm5lZWRzICYgTkVFRFNfQVVYX19NQVNLKSA9PSBORUVEU19BVVhfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewogICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIGdvb2Z5LCBvbiB0aGUgcmVzYW1wbGluZyBjYXNlIHdlIGRvbid0CiAgICAgICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKICAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIuCi0gICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgaWYgKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRSkgewogICAgICAgICAgICAgICAgIHQucmVzYW1wbGVyLT5zZXRQVFMocHRzKTsKICAgICAgICAgICAgICAgICB0Lmhvb2soJnQsIG91dFRlbXAsIG51bUZyYW1lcywgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjY3LDE0ICsxNzExLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBvdXRGcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgb3V0RnJhbWVzKk1BWF9OVU1fQ0hBTk5FTFMsIHQuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIG91dEZyYW1lcyAqIHQubU1peGVyQ2hhbm5lbENvdW50LCB0LmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CiAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyArPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgbnVtRnJhbWVzKTsKKyAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LAorICAgICAgICAgICAgICAgIG91dFRlbXAsIHQxLm1NaXhlckluRm9ybWF0LCBudW1GcmFtZXMgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQpOwogICAgIH0KIH0KIApAQCAtMTI4Miw2ICsxNzI3LDcgQEAKIHZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKQogeworICAgIEFMT0dWVigicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmdcbiIpOwogICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gc3RhdGUtPmVuYWJsZWRUcmFja3MgaGFzIGV4YWN0bHkKICAgICAvLyBvbmUgYml0IHNldC4gIFRoZSBhc3NlcnRzIGJlbG93IHdvdWxkIHZlcmlmeSB0aGlzLCBidXQgYXJlIGNvbW1lbnRlZCBvdXQKICAgICAvLyBzaW5jZSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QgaXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuCkBAIC0xMjkzLDYgKzE3MzksNyBAQAogICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LmJ1ZmZlcik7CiAKICAgICBpbnQzMl90KiBvdXQgPSB0Lm1haW5CdWZmZXI7CisgICAgZmxvYXQgKmZvdXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0KTsKICAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7CiAKICAgICBjb25zdCBpbnQxNl90IHZsID0gdC52b2x1bWVbMF07CkBAIC0xMzA2LDE1MCArMTc1Myw2OCBAQAogCiAgICAgICAgIC8vIGluID09IE5VTEwgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgICAgIGlmIChpbiA9PSBOVUxMIHx8ICgodW5zaWduZWQgbG9uZylpbiAmIDMpKSB7Ci0gICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBudW1GcmFtZXMqTUFYX05VTV9DSEFOTkVMUypzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoKCh1bnNpZ25lZCBsb25nKWluICYgMyksICJwcm9jZXNzIHN0ZXJlbyB0cmFjazogaW5wdXQgYnVmZmVyIGFsaWdubWVudCBwYjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJWQsIGNoYW5uZWxzICVkLCBuZWVkcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgaW4sIGksIHQuY2hhbm5lbENvdW50LCB0Lm5lZWRzKTsKKyAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCgodWludHB0cl90KWluKSAmIDMpKSB7CisgICAgICAgICAgICBtZW1zZXQob3V0LCAwLCBudW1GcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgKiB0Lm1NaXhlckNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwKKyAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOiBtaXNhbGlnbmVkIGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgIiAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgsIHZvbHVtZSAlMDh4IHZmbCAlZiB2ZnIgJWYiLAorICAgICAgICAgICAgICAgICAgICBpbiwgaSwgdC5jaGFubmVsQ291bnQsIHQubmVlZHMsIHZybCwgdC5tVm9sdW1lWzBdLCB0Lm1Wb2x1bWVbMV0pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7CiAKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHVpbnQzMl90KHZsKSA+IFVOSVRZX0dBSU4gfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTikpIHsKLSAgICAgICAgICAgIC8vIHZvbHVtZSBpcyBib29zdGVkLCBzbyB3ZSBtaWdodCBuZWVkIHRvIGNsYW1wIGV2ZW4gdGhvdWdoCi0gICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgorICAgICAgICBzd2l0Y2ggKHQubU1peGVyRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKICAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIC8vIGNsYW1waW5nLi4uCi0gICAgICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICAgICAgciA9IGNsYW1wMTYocik7Ci0gICAgICAgICAgICAgICAgKm91dCsrID0gKHI8PDE2KSB8IChsICYgMHhGRkZGKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKTsKKyAgICAgICAgICAgICAgICAqZm91dCsrID0gZmxvYXRfZnJvbV9xNF8yNyhsKTsKKyAgICAgICAgICAgICAgICAqZm91dCsrID0gZmxvYXRfZnJvbV9xNF8yNyhyKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBJbiBjYXNlIG9mIGxhdGVyIGludDE2X3Qgc2luayBvdXRwdXQsCisgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBhbmQgY2xhbXBpbmcgaXMgZG9uZSBieSBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKS4KICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKLSAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOX0lOVCB8fCB1aW50MzJfdCh2cikgPiBVTklUWV9HQUlOX0lOVCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2b2x1bWUgaXMgYm9vc3RlZCwgc28gd2UgbWlnaHQgbmVlZCB0byBjbGFtcCBldmVuIHRob3VnaAorICAgICAgICAgICAgICAgIC8vIHdlIHByb2Nlc3Mgb25seSBvbmUgdHJhY2suCisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAvLyBjbGFtcGluZy4uLgorICAgICAgICAgICAgICAgICAgICBsID0gY2xhbXAxNihsKTsKKyAgICAgICAgICAgICAgICAgICAgciA9IGNsYW1wMTYocik7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSBtdWxSTCgxLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByID0gbXVsUkwoMCwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IChyPDwxNikgfCAobCAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXIgZm9ybWF0OiAlZCIsIHQubU1peGVyRm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OwogICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKICAgICB9CiB9CiAKLSNpZiAwCi0vLyAyIHRyYWNrcyBpcyBhbHNvIGEgY29tbW9uIGNhc2UKLS8vIE5FVkVSIHVzZWQgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzX192YWxpZGF0ZSgpCi0vLyBvbmx5IHVzZSBpZiB0aGUgMiB0cmFja3MgaGF2ZSB0aGUgc2FtZSBvdXRwdXQgYnVmZmVyCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKQotewotICAgIGludCBpOwotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0KLSAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICBjb25zdCB0cmFja190JiB0MCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMCh0MC5idWZmZXIpOwotCi0gICAgZW4gJj0gfigxPDxpKTsKLSAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICBjb25zdCB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMSh0MS5idWZmZXIpOwotCi0gICAgY29uc3QgaW50MTZfdCAqaW4wOwotICAgIGNvbnN0IGludDE2X3QgdmwwID0gdDAudm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIwID0gdDAudm9sdW1lWzFdOwotICAgIHNpemVfdCBmcmFtZUNvdW50MCA9IDA7Ci0KLSAgICBjb25zdCBpbnQxNl90ICppbjE7Ci0gICAgY29uc3QgaW50MTZfdCB2bDEgPSB0MS52b2x1bWVbMF07Ci0gICAgY29uc3QgaW50MTZfdCB2cjEgPSB0MS52b2x1bWVbMV07Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQxID0gMDsKLQotICAgIC8vRklYTUU6IG9ubHkgd29ya3MgaWYgdHdvIHRyYWNrcyB1c2Ugc2FtZSBidWZmZXIKLSAgICBpbnQzMl90KiBvdXQgPSB0MC5tYWluQnVmZmVyOwotICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICBjb25zdCBpbnQxNl90ICpidWZmID0gTlVMTDsKLQotCi0gICAgd2hpbGUgKG51bUZyYW1lcykgewotCi0gICAgICAgIGlmIChmcmFtZUNvdW50MCA9PSAwKSB7Ci0gICAgICAgICAgICBiMC5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRQVFMgPSBjYWxjdWxhdGVPdXRwdXRQVFModDAsIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCAtIHQwLm1haW5CdWZmZXIpOwotICAgICAgICAgICAgdDAuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIwLCBvdXRwdXRQVFMpOwotICAgICAgICAgICAgaWYgKGIwLmkxNiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBidWZmID0gbmV3IGludDE2X3RbTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW4wID0gYnVmZjsKLSAgICAgICAgICAgICAgICBiMC5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbjAgPSBiMC5pMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZUNvdW50MCA9IGIwLmZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKLSAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICBpbnQ2NF90IG91dHB1dFBUUyA9IGNhbGN1bGF0ZU91dHB1dFBUUyh0MSwgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IC0gdDAubWFpbkJ1ZmZlcik7Ci0gICAgICAgICAgICB0MS5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjEsIG91dHB1dFBUUyk7Ci0gICAgICAgICAgICBpZiAoYjEuaTE2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBuZXcgaW50MTZfdFtNQVhfTlVNX0NIQU5ORUxTICogc3RhdGUtPmZyYW1lQ291bnRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbjEgPSBidWZmOwotICAgICAgICAgICAgICAgIGIxLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluMSA9IGIxLmkxNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lQ291bnQxID0gYjEuZnJhbWVDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBmcmFtZUNvdW50MCA8IGZyYW1lQ291bnQxP2ZyYW1lQ291bnQwOmZyYW1lQ291bnQxOwotCi0gICAgICAgIG51bUZyYW1lcyAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIGZyYW1lQ291bnQwIC09IG91dEZyYW1lczsKLSAgICAgICAgZnJhbWVDb3VudDEgLT0gb3V0RnJhbWVzOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGludDMyX3QgbDAgPSAqaW4wKys7Ci0gICAgICAgICAgICBpbnQzMl90IHIwID0gKmluMCsrOwotICAgICAgICAgICAgbDAgPSBtdWwobDAsIHZsMCk7Ci0gICAgICAgICAgICByMCA9IG11bChyMCwgdnIwKTsKLSAgICAgICAgICAgIGludDMyX3QgbCA9ICppbjErKzsKLSAgICAgICAgICAgIGludDMyX3QgciA9ICppbjErKzsKLSAgICAgICAgICAgIGwgPSBtdWxBZGQobCwgdmwxLCBsMCkgPj4gMTI7Ci0gICAgICAgICAgICByID0gbXVsQWRkKHIsIHZyMSwgcjApID4+IDEyOwotICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgIGwgPSBjbGFtcDE2KGwpOwotICAgICAgICAgICAgciA9IGNsYW1wMTYocik7Ci0gICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7Ci0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKLSAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKLSAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGUgW10gYnVmZjsKLX0KLSNlbmRpZgotCiBpbnQ2NF90IEF1ZGlvTWl4ZXI6OmNhbGN1bGF0ZU91dHB1dFBUUyhjb25zdCB0cmFja190JiB0LCBpbnQ2NF90IGJhc2VQVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RnJhbWVJbmRleCkKIHsKLSAgICBpZiAoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMgPT0gYmFzZVBUUykKKyAgICBpZiAoQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMgPT0gYmFzZVBUUykgewogICAgICAgICByZXR1cm4gQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFM7CisgICAgfQogCiAgICAgcmV0dXJuIGJhc2VQVFMgKyAoKG91dHB1dEZyYW1lSW5kZXggKiBzTG9jYWxUaW1lRnJlcSkgLyB0LnNhbXBsZVJhdGUpOwogfQpAQCAtMTQ2MCw3ICsxODI1LDQxNCBAQAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvTWl4ZXI6OnNJbml0Um91dGluZSgpCiB7CiAgICAgTG9jYWxDbG9jayBsYzsKLSAgICBzTG9jYWxUaW1lRnJlcSA9IGxjLmdldExvY2FsRnJlcSgpOworICAgIHNMb2NhbFRpbWVGcmVxID0gbGMuZ2V0TG9jYWxGcmVxKCk7IC8vIGZvciB0aGUgcmVzYW1wbGVyCisKKyAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aW5pdCgpOyAvLyBmb3IgdGhlIGRvd25taXhlcgorfQorCisvKiBUT0RPOiBjb25zaWRlciB3aGV0aGVyIHRoaXMgbGV2ZWwgb2Ygb3B0aW1pemF0aW9uIGlzIG5lY2Vzc2FyeS4KKyAqIFBlcmhhcHMganVzdCBzdGljayB3aXRoIGEgc2luZ2xlIGZvciBsb29wLgorICovCisKKy8vIE5lZWRzIHRvIGRlcml2ZSBhIGNvbXBpbGUgdGltZSBjb25zdGFudCAoY29uc3RleHByKS4gIENvdWxkIGJlIHRhcmdldGVkIHRvIGdvCisvLyB0byBhIE1PTk9WT0wgbWl4dHlwZSBiYXNlZCBvbiBNQVhfTlVNX1ZPTFVNRVMsIGJ1dCB0aGF0J3MgYW4gdW5uZWNlc3NhcnkgY29tcGxpY2F0aW9uLgorI2RlZmluZSBNSVhUWVBFX01PTk9WT0wobWl4dHlwZSkgKG1peHR5cGUgPT0gTUlYVFlQRV9NVUxUSSA/IE1JWFRZUEVfTVVMVElfTU9OT1ZPTCA6IFwKKyAgICAgICAgbWl4dHlwZSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZID8gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MIDogbWl4dHlwZSkKKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgorc3RhdGljIHZvaWQgdm9sdW1lUmFtcE11bHRpKHVpbnQzMl90IGNoYW5uZWxzLCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBUViAqdm9sLCBjb25zdCBUViAqdm9saW5jLCBUQVYgKnZvbGEsIFRBViB2b2xhaW5jKQoreworICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAxPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRSwgMj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgMz4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNj4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLAorICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgorc3RhdGljIHZvaWQgdm9sdW1lTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIGNvbnN0IFRWICp2b2wsIFRBViB2b2xhKQoreworICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA1PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA4PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQorICogQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKKyAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjp2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKKyAgICAgICAgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXAsIEF1ZGlvTWl4ZXI6OnRyYWNrX3QgKnQpCit7CisgICAgaWYgKFVTRUZMT0FUVk9MKSB7CisgICAgICAgIGlmIChyYW1wKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdC0+bVByZXZWb2x1bWUsIHQtPm1Wb2x1bWVJbmMsICZ0LT5wcmV2QXV4TGV2ZWwsIHQtPmF1eEluYyk7CisgICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7CisgICAgICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB0LT5tVm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmFtcCkgeworICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPnByZXZWb2x1bWUsIHQtPnZvbHVtZUluYywgJnQtPnByZXZBdXhMZXZlbCwgdC0+YXV4SW5jKTsKKyAgICAgICAgICAgIGlmIChBREpVU1RWT0wpIHsKKyAgICAgICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIHQtPnZvbHVtZSwgdC0+YXV4TGV2ZWwpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBUaGlzIHByb2Nlc3MgaG9vayBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB0cmFjayB3aXRob3V0CisgKiBhdXggYnVmZmVyLCB2b2x1bWUgcmFtcCwgb3IgcmVzYW1wbGluZy4KKyAqIFRPRE86IFVwZGF0ZSB0aGUgaG9vayBzZWxlY3Rpb246IHRoaXMgY2FuIHByb3Blcmx5IGhhbmRsZSBhdXggYW5kIHJhbXAuCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjayhzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpCit7CisgICAgQUxPR1ZWKCJwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFja1xuIik7CisgICAgLy8gQ0xaIGlzIGZhc3RlciB0aGFuIENUWiBvbiBBUk0sIHRob3VnaCByZWFsbHkgbm90IHN1cmUgaWYgdHJ1ZSBhZnRlciAzMSAtIGNsei4KKyAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CisgICAgQUxPR19BU1NFUlQoKDEgPDwgaSkgPT0gc3RhdGUtPmVuYWJsZWRUcmFja3MsICJtb3JlIHRoYW4gMSB0cmFjayBlbmFibGVkIik7CisgICAgdHJhY2tfdCAqdCA9ICZzdGF0ZS0+dHJhY2tzW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxzID0gdC0+bU1peGVyQ2hhbm5lbENvdW50OworICAgIFRPKiBvdXQgPSByZWludGVycHJldF9jYXN0PFRPKj4odC0+bWFpbkJ1ZmZlcik7CisgICAgVEEqIGF1eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEEqPih0LT5hdXhCdWZmZXIpOworICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworCisgICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7IG51bUZyYW1lczsgKSB7CisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgYih0LT5idWZmZXIpOworICAgICAgICAvLyBnZXQgaW5wdXQgYnVmZmVyCisgICAgICAgIGIuZnJhbWVDb3VudCA9IG51bUZyYW1lczsKKyAgICAgICAgY29uc3QgaW50NjRfdCBvdXRwdXRQVFMgPSBjYWxjdWxhdGVPdXRwdXRQVFMoKnQsIHB0cywgc3RhdGUtPmZyYW1lQ291bnQgLSBudW1GcmFtZXMpOworICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYiwgb3V0cHV0UFRTKTsKKyAgICAgICAgY29uc3QgVEkgKmluID0gcmVpbnRlcnByZXRfY2FzdDxUSSo+KGIucmF3KTsKKworICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrOiBidXMgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciAlcCB0cmFjayAlcCwgY2hhbm5lbHMgJWQsIG5lZWRzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGluLCB0LCB0LT5jaGFubmVsQ291bnQsIHQtPm5lZWRzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7CisgICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlLCBmYWxzZT4gKAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wLCB0KTsKKworICAgICAgICBvdXQgKz0gb3V0RnJhbWVzICogY2hhbm5lbHM7CisgICAgICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgYXV4ICs9IGNoYW5uZWxzOworICAgICAgICB9CisgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CisKKyAgICAgICAgLy8gcmVsZWFzZSBidWZmZXIKKyAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOworICAgIH0KKyAgICBpZiAocmFtcCkgeworICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gZG8gcmVzYW1wbGluZyB0aGVuIG1peGluZywKKyAqIHB1bGxpbmcgZnJvbSB0aGUgdHJhY2sncyB1cHN0cmVhbSBBdWRpb0J1ZmZlclByb3ZpZGVyLgorICoKKyAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKi8KK3RlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBUTyogdGVtcCwgVEEqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX19SZXNhbXBsZVxuIik7CisgICAgdC0+cmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHQtPnNhbXBsZVJhdGUpOworICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworICAgIGlmIChyYW1wIHx8IGF1eCAhPSBOVUxMKSB7CisgICAgICAgIC8vIGlmIHJhbXA6ICAgICAgICByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gdG8gdGVtcCBidWZmZXIgYW5kIHNjYWxlL21peCBpbiAybmQgc3RlcC4KKyAgICAgICAgLy8gaWYgYXV4ICE9IE5VTEw6IHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciB0aGVuIGFwcGx5IHNlbmQgbGV2ZWwuCisKKyAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKFRPKSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKXRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKworICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCisgICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgsIHJhbXAsIHQpOworCisgICAgfSBlbHNlIHsgLy8gY29uc3RhbnQgdm9sdW1lIGdhaW4KKyAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUodC0+bVZvbHVtZVswXSwgdC0+bVZvbHVtZVsxXSk7CisgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKW91dCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOworICAgIH0KK30KKworLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBtaXggYSB0cmFjaywgd2hlbiBubyByZXNhbXBsaW5nIGlzIHJlcXVpcmVkLgorICogVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgcHJlc2VudCBpbiB0LT5pbi4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX19Ob1Jlc2FtcGxlXG4iKTsKKyAgICBjb25zdCBUSSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBUSSAqPih0LT5pbik7CisKKyAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCisgICAgICAgICAgICBvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHQtPm5lZWRzUmFtcCgpLCB0KTsKKworICAgIC8vIE1JWFRZUEVfTU9OT0VYUEFORCByZWFkcyBhIHNpbmdsZSBpbnB1dCBjaGFubmVsIGFuZCBleHBhbmRzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KKyAgICAvLyBNSVhUWVBFX01VTFRJIHJlYWRzIE5DSEFOIGlucHV0IGNoYW5uZWxzIGFuZCBwbGFjZXMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgorICAgIGluICs9IChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgPyBmcmFtZUNvdW50IDogZnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudDsKKyAgICB0LT5pbiA9IGluOworfQorCisvKiBUaGUgTWl4ZXIgZW5naW5lIGdlbmVyYXRlcyBlaXRoZXIgaW50MzJfdCAoUTRfMjcpIG9yIGZsb2F0IGRhdGEuCisgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBlbmdpbmUgYnVmZmVycworICogdG8gdGhlIGRlc2lyZWQgbWl4ZXIgb3V0cHV0IGZvcm1hdCwgZWl0aGVyIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0LgorICovCit2b2lkIEF1ZGlvTWl4ZXI6OmNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAorICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KQoreworICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtZW1jcHkob3V0LCBpbiwgc2FtcGxlQ291bnQgKiBzaXplb2YoZmxvYXQpKTsgLy8gTUVNQ1BZLiBUT0RPIG9wdGltaXplIG91dAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKGludDE2X3QqKW91dCwgKGZsb2F0Kilpbiwgc2FtcGxlQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcTRfMjcoKGZsb2F0KilvdXQsIChpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICAvLyB0d28gaW50MTZfdCBhcmUgcHJvZHVjZWQgcGVyIGl0ZXJhdGlvbgorICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QqKW91dCwgKGludDMyX3QqKWluLCBzYW1wbGVDb3VudCA+PiAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUmV0dXJucyB0aGUgcHJvcGVyIHRyYWNrIGhvb2sgdG8gdXNlIGZvciBtaXhpbmcgdGhlIHRyYWNrIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisgKi8KK0F1ZGlvTWl4ZXI6Omhvb2tfdCBBdWRpb01peGVyOjpnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCBfX3VudXNlZCkKK3sKKyAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfX25vcDsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfXzE2Qml0c01vbm87CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2tfXzE2Qml0c1N0ZXJlbzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgIHJldHVybiB0cmFja19fbm9wOworICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgaW50MzJfdCAvKlRBKi8+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpXAorICAgICAgICAgICAgICAgICAgICB0cmFja19fUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01PTk9FWFBBTkQsIGZsb2F0LCBmbG9hdCwgaW50MzJfdD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NT05PRVhQQU5ELCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6CisgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgZmxvYXQsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQorICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm5zIHRoZSBwcm9wZXIgcHJvY2VzcyBob29rIGZvciBtaXhpbmcgdHJhY2tzLiBDdXJyZW50bHkgd29ya3Mgb25seSBmb3IKKyAqIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywgYSBtaXggaW52b2x2aW5nIG9uZSB0cmFjaywgbm8gcmVzYW1wbGluZy4KKyAqCisgKiBUT0RPOiBEdWUgdG8gdGhlIHNwZWNpYWwgbWl4aW5nIGNvbnNpZGVyYXRpb25zIG9mIGR1cGxpY2F0aW5nIHRvCisgKiBhIHN0ZXJlbyBvdXRwdXQgdHJhY2ssIHRoZSBpbnB1dCB0cmFjayBjYW5ub3QgYmUgTU9OTy4gIFRoaXMgc2hvdWxkIGJlCisgKiBwcmV2ZW50ZWQgYnkgdGhlIGNhbGxlci4KKyAqLworQXVkaW9NaXhlcjo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlcjo6Z2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KQoreworICAgIGlmIChwcm9jZXNzVHlwZSAhPSBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0spIHsgLy8gT25seSBOT1JFU0FNUExFT05FVFJBQ0sKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHByb2Nlc3NUeXBlOiAlZCIsIHByb2Nlc3NUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgha1VzZU5ld01peGVyICYmIGNoYW5uZWxDb3VudCA9PSBGQ0NfMiAmJiBtaXhlckluRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZzsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBpbnQzMl90IC8qVEEqLz47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjazxNSVhUWVBFX01VTFRJX1NBVkVPTkxZLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAppbmRleCA0M2FlYjg2Li4zYjk3MmJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKQEAgLTI2LDEwICsyNiwxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgogCi0jaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CiAKKy8vIEZJWE1FIFRoaXMgaXMgYWN0dWFsbHkgdW5pdHkgZ2Fpbiwgd2hpY2ggbWlnaHQgbm90IGJlIG1heCBpbiBmdXR1cmUsIGV4cHJlc3NlZCBpbiBVLjEyCisjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVAorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ4LDE0ICs1MSwxNCBAQAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX1RSQUNLUyA9IDMyOwogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgbWl4ZXIKIAotICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiAyIGNoYW5uZWxzIGZvciBvdXRwdXQuCi0gICAgLy8gVGhlcmUgaXMgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgdHJhY2tzIGRvd24tbWl4ZWQgdG8gMiBjaGFubmVsIG91dHB1dCB2aWEgYSBkb3duLW1peCBlZmZlY3QuCi0gICAgLy8gQWRkaW5nIHN1cHBvcnQgZm9yID4gMiBjaGFubmVsIG91dHB1dCB3b3VsZCByZXF1aXJlIG1vcmUgdGhhbiBzaW1wbHkgY2hhbmdpbmcgdGhpcyB2YWx1ZS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IDI7CisgICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDggY2hhbm5lbHMgZm9yIG91dHB1dC4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IDg7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fVk9MVU1FUyA9IDI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gODsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7CiAKLSAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTiA9IDB4MTAwMDsKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTl9JTlQgPSAweDEwMDA7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0ICAgIFVOSVRZX0dBSU5fRkxPQVQgPSAxLjBmOwogCiAgICAgZW51bSB7IC8vIG5hbWVzCiAKQEAgLTc3LDYgKzgwLDggQEAKICAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAogICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCiAgICAgICAgIERPV05NSVhfVFlQRSAgICA9IDBYNDAwNCwKKyAgICAgICAgTUlYRVJfRk9STUFUICAgID0gMHg0MDA1LCAvLyBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgIE1JWEVSX0NIQU5ORUxfTUFTSyA9IDB4NDAwNiwgLy8gQ2hhbm5lbCBtYXNrIGZvciBtaXhlciBvdXRwdXQKICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtOTAsNiArOTUsNyBAQAogICAgICAgICBSRU1PVkUgICAgICAgICAgPSAweDQxMDIsIC8vIFJlbW92ZSB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgaXMgcmVzdG9yZWQgdG8gdGhlIG1peCBzYW1wbGUgcmF0ZS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSQU1QX1ZPTFVNRSBhbmQgVk9MVU1FICg4IGNoYW5uZWxzIG1heCkKKyAgICAgICAgLy8gRklYTUUgdXNlIGZsb2F0IGZvciB0aGVzZSAzIHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKICAgICAgICAgVk9MVU1FMCAgICAgICAgID0gMHg0MjAwLAogICAgICAgICBWT0xVTUUxICAgICAgICAgPSAweDQyMDEsCiAgICAgICAgIEFVWExFVkVMICAgICAgICA9IDB4NDIxMCwKQEAgLTk5LDcgKzEwNSwxMCBAQAogICAgIC8vIEZvciBhbGwgQVBJcyB3aXRoICJuYW1lIjogVFJBQ0swIDw9IG5hbWUgPCBUUkFDSzAgKyBNQVhfTlVNX1RSQUNLUwogCiAgICAgLy8gQWxsb2NhdGUgYSB0cmFjayBuYW1lLiAgUmV0dXJucyBuZXcgdHJhY2sgbmFtZSBpZiBzdWNjZXNzZnVsLCAtMSBvbiBmYWlsdXJlLgotICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNlc3Npb25JZCk7CisgICAgLy8gVGhlIGZhaWx1cmUgY291bGQgYmUgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGNoYW5uZWxNYXNrIG9yIGZvcm1hdCwgb3IgdGhhdAorICAgIC8vIHRoZSB0cmFjayBjYXBhY2l0eSBvZiB0aGUgbWl4ZXIgaXMgZXhjZWVkZWQuCisgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOwogCiAgICAgLy8gRnJlZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZQogICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZShpbnQgbmFtZSk7CkBAIC0xMTcsMzUgKzEyNiwzNCBAQAogCiAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CiAKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICByZXR1cm4gZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIHx8CisgICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCB8fAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzMyX0JJVCB8fAorICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIH0KKwogcHJpdmF0ZToKIAogICAgIGVudW0geworICAgICAgICAvLyBGSVhNRSB0aGlzIHJlcHJlc2VudGF0aW9uIHBlcm1pdHMgdXAgdG8gOCBjaGFubmVscwogICAgICAgICBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLICAgPSAweDAwMDAwMDA3LAotICAgICAgICBORUVEU19GT1JNQVRfX01BU0sgICAgICAgICAgPSAweDAwMDAwMEYwLAotICAgICAgICBORUVEU19NVVRFX19NQVNLICAgICAgICAgICAgPSAweDAwMDAwMTAwLAotICAgICAgICBORUVEU19SRVNBTVBMRV9fTUFTSyAgICAgICAgPSAweDAwMDAxMDAwLAotICAgICAgICBORUVEU19BVVhfX01BU0sgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBlbnVtIHsKLSAgICAgICAgTkVFRFNfQ0hBTk5FTF8xICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8xICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwgICAvLyBtb25vCisgICAgICAgIE5FRURTX0NIQU5ORUxfMiAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsICAgLy8gc3RlcmVvCiAKLSAgICAgICAgTkVFRFNfRk9STUFUXzE2ICAgICAgICAgICAgID0gMHgwMDAwMDAxMCwKKyAgICAgICAgLy8gc2FtcGxlIGZvcm1hdCBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGFuZCBpcyBhc3N1bWVkIHRvIGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCiAKLSAgICAgICAgTkVFRFNfTVVURV9ESVNBQkxFRCAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgTkVFRFNfTVVURV9FTkFCTEVEICAgICAgICAgID0gMHgwMDAwMDEwMCwKLQotICAgICAgICBORUVEU19SRVNBTVBMRV9ESVNBQkxFRCAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19SRVNBTVBMRV9FTkFCTEVEICAgICAgPSAweDAwMDAxMDAwLAotCi0gICAgICAgIE5FRURTX0FVWF9ESVNBQkxFRCAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICBORUVEU19BVVhfRU5BQkxFRCAgICAgID0gMHgwMDAxMDAwMCwKKyAgICAgICAgTkVFRFNfTVVURSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgICAgICAgTkVFRFNfUkVTQU1QTEUgICAgICAgICAgICAgID0gMHgwMDAwMTAwMCwKKyAgICAgICAgTkVFRFNfQVVYICAgICAgICAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKICAgICB9OwogCiAgICAgc3RydWN0IHN0YXRlX3Q7CiAgICAgc3RydWN0IHRyYWNrX3Q7Ci0gICAgY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyOwogCiAgICAgdHlwZWRlZiB2b2lkICgqaG9va190KSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwpAQCAtMTU0LDE2ICsxNjIsMTcgQEAKICAgICBzdHJ1Y3QgdHJhY2tfdCB7CiAgICAgICAgIHVpbnQzMl90ICAgIG5lZWRzOwogCisgICAgICAgIC8vIFRPRE86IEV2ZW50dWFsbHkgcmVtb3ZlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSBzZXR0aW5ncwogICAgICAgICB1bmlvbiB7Ci0gICAgICAgIGludDE2X3QgICAgIHZvbHVtZVtNQVhfTlVNX0NIQU5ORUxTXTsgLy8gWzBdMy4xMiBmaXhlZCBwb2ludAorICAgICAgICBpbnQxNl90ICAgICB2b2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gVTQuMTIgZml4ZWQgcG9pbnQgKHRvcCBiaXQgc2hvdWxkIGJlIHplcm8pCiAgICAgICAgIGludDMyX3QgICAgIHZvbHVtZVJMOwogICAgICAgICB9OwogCi0gICAgICAgIGludDMyX3QgICAgIHByZXZWb2x1bWVbTUFYX05VTV9DSEFOTkVMU107CisgICAgICAgIGludDMyX3QgICAgIHByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CiAKLSAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lSW5jW01BWF9OVU1fQ0hBTk5FTFNdOworICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsKICAgICAgICAgaW50MzJfdCAgICAgYXV4SW5jOwogICAgICAgICBpbnQzMl90ICAgICBwcmV2QXV4TGV2ZWw7CiAKQEAgLTE3Myw3ICsxODIsNyBAQAogICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OwogCiAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsgICAvLyAxIG9yIDIsIHJlZHVuZGFudCB3aXRoIChuZWVkcyAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spCi0gICAgICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsgICAgICAgICAvLyBhbHdheXMgMTYKKyAgICAgICAgdWludDhfdCAgICAgdW51c2VkX3BhZGRpbmc7IC8vIGZvcm1lcmx5IGZvcm1hdCwgd2FzIGFsd2F5cyAxNgogICAgICAgICB1aW50MTZfdCAgICBlbmFibGVkOyAgICAgICAgLy8gYWN0dWFsbHkgYm9vbAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKIApAQCAtMTk2LDQ4ICsyMDUsMTU5IEBACiAgICAgICAgIGludDMyX3QqICAgICAgICAgICBhdXhCdWZmZXI7CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCi0gICAgICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyKiBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gNCBieXRlcworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7IC8vIHByb3ZpZGVyIHdyYXBwZXIgZm9yIHJlZm9ybWF0dGluZy4KKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKiAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOyAvLyB3cmFwcGVyIGZvciBjaGFubmVsIGNvbnZlcnNpb24uCiAKICAgICAgICAgaW50MzJfdCAgICAgc2Vzc2lvbklkOwogCi0gICAgICAgIGludDMyX3QgICAgIHBhZGRpbmdbMl07CisgICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyRm9ybWF0OyAgICAgLy8gb3V0cHV0IG1peCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsgICAgICAgICAgLy8gaW5wdXQgdHJhY2sgZm9ybWF0CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckluRm9ybWF0OyAgIC8vIG1peCBpbnRlcm5hbCBmb3JtYXQgQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHRyYWNrIG11c3QgYmUgY29udmVydGVkIHRvIHRoaXMgZm9ybWF0LgorCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgICAgIC8vIGZsb2F0aW5nIHBvaW50IHNldCB2b2x1bWUKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gZmxvYXRpbmcgcG9pbnQgcHJldmlvdXMgdm9sdW1lCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsgIC8vIGZsb2F0aW5nIHBvaW50IHZvbHVtZSBpbmNyZW1lbnQKKworICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IGF1eCBsZXZlbAorICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldkF1eExldmVsOyAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgcHJldiBhdXggbGV2ZWwKKyAgICAgICAgZmxvYXQgICAgICAgICAgbUF1eEluYzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IGF1eCBpbmNyZW1lbnQKIAogICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckNoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQ7CiAKLSAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOworICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CisgICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOwogICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTDsgfQogICAgICAgICB2b2lkICAgICAgICByZXNldFJlc2FtcGxlcigpIHsgaWYgKHJlc2FtcGxlciAhPSBOVUxMKSByZXNhbXBsZXItPnJlc2V0KCk7IH0KLSAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCk7CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7CiAgICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCkgOiAwOyB9OwogICAgIH07CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpwcm9jZXNzX2hvb2tfdCkoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsKKwogICAgIC8vIHBhZCB0byAzMi1ieXRlcyB0byBmaWxsIGNhY2hlIGxpbmUKICAgICBzdHJ1Y3Qgc3RhdGVfdCB7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICBlbmFibGVkVHJhY2tzOwogICAgICAgICB1aW50MzJfdCAgICAgICAgbmVlZHNDaGFuZ2VkOwogICAgICAgICBzaXplX3QgICAgICAgICAgZnJhbWVDb3VudDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICgqaG9vaykoc3RhdGVfdCogc3RhdGUsIGludDY0X3QgcHRzKTsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgTlVMTAorICAgICAgICBwcm9jZXNzX2hvb2tfdCAgaG9vazsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgTlVMTAogICAgICAgICBpbnQzMl90ICAgICAgICAgKm91dHB1dFRlbXA7CiAgICAgICAgIGludDMyX3QgICAgICAgICAqcmVzYW1wbGVUZW1wOwogICAgICAgICBOQkxvZzo6V3JpdGVyKiAgbUxvZzsKICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc2VydmVkWzFdOwogICAgICAgICAvLyBGSVhNRSBhbGxvY2F0ZSBkeW5hbWljYWxseSB0byBzYXZlIHNvbWUgbWVtb3J5IHdoZW4gbWF4TnVtVHJhY2tzIDwgTUFYX05VTV9UUkFDS1MKLSAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU107IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisgICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAgICAgfTsKIAotICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdGhhdCB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgYnkgYSBjYWxsIHRvIGEgZG93bm1peCBlZmZlY3QKLSAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKKyAgICAvLyBCYXNlIEF1ZGlvQnVmZmVyUHJvdmlkZXIgY2xhc3MgdXNlZCBmb3IgRG93bk1peGVyQnVmZmVyUHJvdmlkZXIsIFJlbWl4QnVmZmVyUHJvdmlkZXIsCisgICAgLy8gYW5kIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuCisgICAgLy8gSXQgaGFuZGxlcyBhIHByaXZhdGUgYnVmZmVyIGZvciB1c2UgaW4gY29udmVydGluZyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrcyBmcm9tIHRoZQorICAgIC8vIGlucHV0IGRhdGEgdG8gYSBmb3JtIGFjY2VwdGFibGUgYnkgdGhlIG1peGVyLgorICAgIC8vIFRPRE86IE1ha2UgYSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciB3aGVuIGludGVnZXJzIGFyZSBlbnRpcmVseSByZW1vdmVkIGZyb20gdGhlCisgICAgLy8gcHJvY2Vzc2luZyBwaXBlbGluZS4KKyAgICBjbGFzcyBDb3B5QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CiAgICAgcHVibGljOgorICAgICAgICAvLyBVc2UgYSBwcml2YXRlIGJ1ZmZlciBvZiBidWZmZXJGcmFtZUNvdW50IGZyYW1lcyAoZWFjaCBmcmFtZSBpcyBvdXRwdXRGcmFtZVNpemUgYnl0ZXMpLgorICAgICAgICAvLyBJZiBidWZmZXJGcmFtZUNvdW50IGlzIDAsIG5vIHByaXZhdGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZgorICAgICAgICAvLyB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyJ3MgYnVmZmVycyBpcyBwZXJmb3JtZWQgYnkgY29weUZyYW1lcygpLgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLCBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB+Q29weUJ1ZmZlclByb3ZpZGVyKCk7CisKKyAgICAgICAgLy8gT3ZlcnJpZGVzIEF1ZGlvQnVmZmVyUHJvdmlkZXIgbWV0aG9kcwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwotICAgICAgICB2aXJ0dWFsIH5Eb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpOwogCisgICAgICAgIC8vIE90aGVyIHB1YmxpYyBtZXRob2RzCisKKyAgICAgICAgLy8gY2FsbCB0aGlzIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlciB0byB0aGUgdXBzdHJlYW0gcHJvdmlkZXIuCisgICAgICAgIC8vIHRyZWF0IGl0IGFzIGFuIGF1ZGlvIGRpc2NvbnRpbnVpdHkgZm9yIGZ1dHVyZSBzYW1wbGVzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCisgICAgICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKKyAgICAgICAgLy8gc29tZSBwcm92aWRlcnMgd2lsbCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYXJiaXRyYXJ5IGJ1ZmZlcnMgb3V0c2lkZQorICAgICAgICAvLyBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy4KKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpID0gMDsKKworICAgICAgICAvLyBzZXQgdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlci4gQ29uc2lkZXIgY2FsbGluZyAicmVzZXQiIGJlZm9yZSB0aGlzIGZ1bmN0aW9uLgorICAgICAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICAgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyID0gcDsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBtVHJhY2tCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0RnJhbWVTaXplOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0RnJhbWVTaXplOworICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtQnVmZmVyOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50OworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICBtTG9jYWxCdWZmZXJEYXRhOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29uc3VtZWQ7CisgICAgfTsKKworICAgIC8vIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBwcm92aWRlCisgICAgLy8gcG9zaXRpb24gZGVwZW5kZW50IGRvd25taXhpbmcgYnkgYW4gQXVkaW8gRWZmZWN0LgorICAgIGNsYXNzIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBzZXNzaW9uSWQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgdmlydHVhbCB+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworICAgICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtRG93bm1peEhhbmRsZSAhPSBOVUxMOyB9CisKKyAgICAgICAgc3RhdGljIHN0YXR1c190IGluaXQoKTsKKyAgICAgICAgc3RhdGljIGJvb2wgaXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkgeyByZXR1cm4gc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsgfQorCisgICAgcHJvdGVjdGVkOgogICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICAgbURvd25taXhIYW5kbGU7CiAgICAgICAgIGVmZmVjdF9jb25maWdfdCAgICBtRG93bm1peENvbmZpZzsKKworICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgorICAgICAgICBzdGF0aWMgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzRHdubUZ4RGVzYzsKKyAgICAgICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgYSBkb3dubWl4IGVmZmVjdCBoYXMgYmVlbiBmb3VuZCBhbmQgaXMgdXNhYmxlIGJ5IHRoaXMgbWl4ZXIKKyAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsKKyAgICAgICAgLy8gRklYTUU6IHNob3VsZCB3ZSBhbGxvdyBlZmZlY3RzIG91dHNpZGUgb2YgdGhlIGZyYW1ld29yaz8KKyAgICAgICAgLy8gV2UgbmVlZCB0byBoZXJlLiBBIHNwZWNpYWwgaW9JZCB0aGF0IG11c3QgYmUgPD0gLTIgc28gaXQgZG9lcyBub3QgbWFwIHRvIGEgc2Vzc2lvbi4KKyAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVEID0gLTI7CisgICAgfTsKKworICAgIC8vIFJlbWl4QnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIHBlcmZvcm0gYW4KKyAgICAvLyB1cG1peCBvciBkb3dubWl4IHRvIHRoZSBwcm9wZXIgY2hhbm5lbCBjb3VudCBhbmQgbWFzay4KKyAgICBjbGFzcyBSZW1peEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CisgICAgcHVibGljOgorICAgICAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemU7CisgICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dENoYW5uZWxzOworICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtT3V0cHV0Q2hhbm5lbHM7CisgICAgICAgIGludDhfdCAgICAgICAgICAgICAgIG1JZHhBcnlbc2l6ZW9mKHVpbnQzMl90KSo4XTsgLy8gMzIgYml0cyA9PiBjaGFubmVsIGluZGljZXMKKyAgICB9OworCisgICAgLy8gUmVmb3JtYXRCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gY29udmVydCB0aGUgaW5wdXQgZGF0YQorICAgIC8vIHRvIGFuIGFjY2VwdGFibGUgbWl4ZXIgaW5wdXQgZm9ybWF0IHR5cGUuCisgICAgY2xhc3MgUmVmb3JtYXRCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGNvbnN0IGludDMyX3QgICAgICAgIG1DaGFubmVsczsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUlucHV0Rm9ybWF0OworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtT3V0cHV0Rm9ybWF0OwogICAgIH07CiAKICAgICAvLyBiaXRtYXNrIG9mIGFsbG9jYXRlZCB0cmFjayBuYW1lcywgd2hlcmUgYml0IDAgY29ycmVzcG9uZHMgdG8gVFJBQ0swIGV0Yy4KQEAgLTI1NSwxOCArMzc1LDIwIEBACiBwcml2YXRlOgogICAgIHN0YXRlX3QgICAgICAgICBtU3RhdGUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAotICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZG93bm1peGVyIHVzZWQgYnkgdGhlIG1peGVyCi0gICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3QgZHdubUZ4RGVzYzsKLSAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciBhIGRvd25taXggZWZmZWN0IGhhcyBiZWVuIGZvdW5kIGFuZCBpcyB1c2FibGUgYnkgdGhpcyBtaXhlcgotICAgIHN0YXRpYyBib29sICAgICAgICAgICAgICAgIGlzTXVsdGljaGFubmVsQ2FwYWJsZTsKLQogICAgIC8vIENhbGwgYWZ0ZXIgY2hhbmdpbmcgZWl0aGVyIHRoZSBlbmFibGVkIHN0YXR1cyBvZiBhIHRyYWNrLCBvciBwYXJhbWV0ZXJzIG9mIGFuIGVuYWJsZWQgdHJhY2suCiAgICAgLy8gT0sgdG8gY2FsbCBtb3JlIG9mdGVuIHRoYW4gdGhhdCwgYnV0IHVubmVjZXNzYXJ5LgogICAgIHZvaWQgaW52YWxpZGF0ZVN0YXRlKHVpbnQzMl90IG1hc2spOwogCi0gICAgc3RhdGljIHN0YXR1c190IGluaXRUcmFja0Rvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0sIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2spOworICAgIGJvb2wgc2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayk7CisKKyAgICAvLyBUT0RPOiByZW1vdmUgdW51c2VkIHRyYWNrTmFtZS90cmFja051bSBmcm9tIGZ1bmN0aW9ucyBiZWxvdy4KKyAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTnVtKTsKICAgICBzdGF0aWMgdm9pZCB1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOworICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lKTsKKyAgICBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyh0cmFja190KiBwVHJhY2spOwogCiAgICAgc3RhdGljIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsCiAgICAgICAgICAgICBpbnQzMl90KiBhdXgpOwpAQCAtMjg2LDEwICs0MDgsNiBAQAogICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CiAgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOwotI2lmIDAKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19Ud29UcmFja3MxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKLSNlbmRpZgogCiAgICAgc3RhdGljIGludDY0X3QgY2FsY3VsYXRlT3V0cHV0UFRTKGNvbnN0IHRyYWNrX3QmIHQsIGludDY0X3QgYmFzZVBUUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEZyYW1lSW5kZXgpOwpAQCAtMjk3LDYgKzQxNSw1MyBAQAogICAgIHN0YXRpYyB1aW50NjRfdCAgICAgICAgIHNMb2NhbFRpbWVGcmVxOwogICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCAgIHNPbmNlQ29udHJvbDsKICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBzSW5pdFJvdXRpbmUoKTsKKworICAgIC8qIG11bHRpLWZvcm1hdCB2b2x1bWUgbWl4aW5nIGZ1bmN0aW9uIChjYWxscyB0ZW1wbGF0ZSBmdW5jdGlvbnMKKyAgICAgKiBpbiBBdWRpb01peGVyT3BzLmgpLiAgVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6CisgICAgICoKKyAgICAgKiAgIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKKyAgICAgKiAgIFVTRUZMT0FUVk9MIChzZXQgdG8gdHJ1ZSBpZiBmbG9hdCB2b2x1bWUgaXMgdXNlZCkKKyAgICAgKiAgIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKKyAgICAgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAgICAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0CisgICAgICogICBUQTogaW50MzJfdCAoUTQuMjcpCisgICAgICovCisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKKyAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywKKyAgICAgICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wLCBBdWRpb01peGVyOjp0cmFja190ICp0KTsKKworICAgIC8vIG11bHRpLWZvcm1hdCBwcm9jZXNzIGhvb2tzCisgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrKHN0YXRlX3QqIHN0YXRlLCBpbnQ2NF90IHB0cyk7CisKKyAgICAvLyBtdWx0aS1mb3JtYXQgdHJhY2sgaG9va3MKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICBzdGF0aWMgdm9pZCB0cmFja19fTm9SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAorICAgICAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCk7CisKKyAgICAvLyBob29rIHR5cGVzCisgICAgZW51bSB7CisgICAgICAgIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICB9OworICAgIGVudW0geworICAgICAgICBUUkFDS1RZUEVfTk9QLAorICAgICAgICBUUkFDS1RZUEVfUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFLAorICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8sCisgICAgfTsKKworICAgIC8vIGZ1bmN0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgdGhlIHByb3BlciBwcm9jZXNzIGFuZCB0cmFjayBob29rcy4KKyAgICBzdGF0aWMgcHJvY2Vzc19ob29rX3QgZ2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CisgICAgc3RhdGljIGhvb2tfdCBnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNzZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIEJlaGF2aW9yIG9mIGlzX3NhbWU8Pjo6dmFsdWUgaXMgdHJ1ZSBpZiB0aGUgdHlwZXMgYXJlIGlkZW50aWNhbCwKKyAqIGZhbHNlIG90aGVyd2lzZS4gSWRlbnRpY2FsIHRvIHRoZSBTVEwgc3RkOjppc19zYW1lLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzX3NhbWUKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19zYW1lPFQsIFQ+ICAvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworCisvKiBNaXhNdWwgaXMgYSBtdWx0aXBsaWNhdGlvbiBvcGVyYXRvciB0byBzY2FsZSBhbiBhdWRpbyBpbnB1dCBzaWduYWwKKyAqIGJ5IGEgdm9sdW1lIGdhaW4sIHdpdGggdGhlIGZvcm11bGE6CisgKgorICogTyh1dHB1dCkgPSBJKG5wdXQpICogVihvbHVtZSkKKyAqCisgKiBUaGUgb3V0cHV0LCBpbnB1dCwgYW5kIHZvbHVtZSBtYXkgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuCisgKiBUaGVyZSBhcmUgMjcgdmFyaWFudHMsIG9mIHdoaWNoIDE0IGFyZSBhY3R1YWxseSBkZWZpbmVkIGluIGFuCisgKiBleHBsaWNpdGx5IHRlbXBsYXRlZCBjbGFzcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHR5cGUgdmFyaWFibGVzIGFuZCB0aGUgdW5kZXJseWluZyBtZWFuaW5nOgorICoKKyAqIE91dHB1dCB0eXBlICAgICAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQgWy0xLDFdCisgKiBJbnB1dCBzaWduYWwgdHlwZSBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0IFstMSwxXQorICogVm9sdW1lIHR5cGUgICAgICAgVFY6IGludDMyX3QgKFU0LjI4KSBvciBpbnQxNl90IChVNC4xMikgb3IgZmxvYXQgWy0xLDFdCisgKgorICogRm9yIGhpZ2ggcHJlY2lzaW9uIGF1ZGlvLCBvbmx5IHRoZSA8VE8sIFRJLCBUVj4gPSA8ZmxvYXQsIGZsb2F0LCBmbG9hdD4KKyAqIG5lZWRzIHRvIGJlIGFjY2VsZXJhdGVkLiBUaGlzIGlzIHBlcmhhcHMgdGhlIGVhc2llc3QgZm9ybSB0byBkbyBxdWlja2x5IGFzIHdlbGwuCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFY+CitpbmxpbmUgVE8gTWl4TXVsKFRJIHZhbHVlLCBUViB2b2x1bWUpIHsKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKGZhbHNlKTsKKyAgICAvLyBzaG91bGQgbm90IGJlIGhlcmUgOi0pLgorICAgIC8vIFRvIGF2b2lkIG1pc3Rha2VzLCB0aGlzIHRlbXBsYXRlIGlzIGFsd2F5cyBzcGVjaWFsaXplZC4KKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgaW50MTZfdD4oaW50MTZfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MzJfdCBNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MTZfdD4oaW50MzJfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gKHZhbHVlID4+IDEyKSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQzMl90IE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PihpbnQxNl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqICh2b2x1bWUgPj4gMTYpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGludDMyX3Q+KGludDMyX3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuICh2YWx1ZSA+PiAxMikgKiAodm9sdW1lID4+IDE2KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQxNl90PihmbG9hdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDEgPDwgMTIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIG5vcm07Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBmbG9hdCwgaW50MzJfdD4oZmxvYXQgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI4KTsKKyAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGZsb2F0LCBpbnQxNl90PihmbG9hdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNl9mcm9tX2Zsb2F0KE1peE11bDxmbG9hdCwgZmxvYXQsIGludDE2X3Q+KHZhbHVlLCB2b2x1bWUpKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgaW50MzJfdD4oZmxvYXQgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChNaXhNdWw8ZmxvYXQsIGZsb2F0LCBpbnQzMl90Pih2YWx1ZSwgdm9sdW1lKSk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgZmxvYXQgTWl4TXVsPGZsb2F0LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBub3JtID0gMS4gLyAoMSA8PCAoMTUgKyAxMikpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZvbHVtZSkgKiBub3JtOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGZsb2F0IE1peE11bDxmbG9hdCwgaW50MTZfdCwgaW50MzJfdD4oaW50MTZfdCB2YWx1ZSwgaW50MzJfdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbm9ybSA9IDEuIC8gKDFVTEwgPDwgKDE1ICsgMjgpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSAqIHN0YXRpY19jYXN0PGZsb2F0Pih2b2x1bWUpICogbm9ybTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBpbnQxNl90PihpbnQxNl90IHZhbHVlLCBpbnQxNl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQxNl90LCBpbnQxNl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MzJfdCwgaW50MTZfdD4oaW50MzJfdCB2YWx1ZSwgaW50MTZfdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gY2xhbXAxNihNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgaW50MTZfdD4odmFsdWUsIHZvbHVtZSkgPj4gMTIpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDE2X3QgTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+KGludDE2X3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKSB7CisgICAgcmV0dXJuIGNsYW1wMTYoTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGludDMyX3Q+KHZhbHVlLCB2b2x1bWUpID4+IDEyKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQzMl90LCBpbnQzMl90PihpbnQzMl90IHZhbHVlLCBpbnQzMl90IHZvbHVtZSkgeworICAgIHJldHVybiBjbGFtcDE2KE1peE11bDxpbnQzMl90LCBpbnQzMl90LCBpbnQzMl90Pih2YWx1ZSwgdm9sdW1lKSA+PiAxMik7Cit9CisKKy8qIFJlcXVpcmVkIGZvciBmbG9hdGluZyBwb2ludCB2b2x1bWUuICBTb21lIGFyZSBuZWVkZWQgZm9yIGNvbXBpbGF0aW9uIGJ1dAorICogYXJlIG5vdCBuZWVkZWQgaW4gZXhlY3V0aW9uIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBmaW5hbCBidWlsZCBieQorICogYW4gb3B0aW1pemluZyBjb21waWxlci4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGZsb2F0LCBmbG9hdD4oZmxvYXQgdmFsdWUsIGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBmbG9hdCBNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZmxvYXRfZnJvbV9xXzE1ID0gMS4gLyAoMSA8PCAxNSk7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogZmxvYXRfZnJvbV9xXzE1OworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDMyX3QsIGZsb2F0PihpbnQzMl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MzJfdCwgaW50MzJfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGludDMyX3QgTWl4TXVsPGludDMyX3QsIGludDE2X3QsIGZsb2F0PihpbnQxNl90IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhNdWw8aW50MzJfdCwgaW50MTZfdCwgZmxvYXQ+IFJ1bnRpbWUgU2hvdWxkIG5vdCBiZSBoZXJlIik7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHU0XzEyX2Zyb21fZmxvYXQgPSAoMSA8PCAxMik7CisgICAgcmV0dXJuIHZhbHVlICogdm9sdW1lICogdTRfMTJfZnJvbV9mbG9hdDsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBpbnQxNl90LCBmbG9hdD4oaW50MTZfdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTWl4TXVsPGludDE2X3QsIGludDE2X3QsIGZsb2F0PiBSdW50aW1lIFNob3VsZCBub3QgYmUgaGVyZSIpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBpbnQxNl90IE1peE11bDxpbnQxNl90LCBmbG9hdCwgZmxvYXQ+KGZsb2F0IHZhbHVlLCBmbG9hdCB2b2x1bWUpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcV8xNV9mcm9tX2Zsb2F0ID0gKDEgPDwgMTUpOworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZSAqIHFfMTVfZnJvbV9mbG9hdDsKK30KKworLyoKKyAqIE1peEFjY3VtIGlzIHVzZWQgdG8gYWRkIGludG8gYW4gYWNjdW11bGF0b3IgcmVnaXN0ZXIgb2YgYSBwb3NzaWJseSBkaWZmZXJlbnQKKyAqIHR5cGUuIFRoZSBUTyBhbmQgVEkgdHlwZXMgYXJlIHRoZSBzYW1lIGFzIE1peE11bC4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJPgoraW5saW5lIHZvaWQgTWl4QWNjdW0oVE8gKmF1eGFjY3VtLCBUSSB2YWx1ZSkgeworICAgIGlmICghaXNfc2FtZTxUTywgVEk+Ojp2YWx1ZSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJNaXhBY2N1bSB0eXBlIG5vdCBwcm9wZXJseSBzcGVjaWFsaXplZDogJXp1ICV6dVxuIiwKKyAgICAgICAgICAgICAgICBzaXplb2YoVE8pLCBzaXplb2YoVEkpKTsKKyAgICB9CisgICAgKmF1eGFjY3VtICs9IHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MTZfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQxNl90IHZhbHVlKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDE1KTsKKyAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MzJfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQzMl90IHZhbHVlKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI3KTsKKyAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOworfQorCit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCBNaXhBY2N1bTxpbnQzMl90LCBpbnQxNl90PihpbnQzMl90ICphdXhhY2N1bSwgaW50MTZfdCB2YWx1ZSkgeworICAgICphdXhhY2N1bSArPSB2YWx1ZSA8PCAxMjsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgTWl4QWNjdW08aW50MzJfdCwgZmxvYXQ+KGludDMyX3QgKmF1eGFjY3VtLCBmbG9hdCB2YWx1ZSkgeworICAgICphdXhhY2N1bSArPSBjbGFtcHE0XzI3X2Zyb21fZmxvYXQodmFsdWUpOworfQorCisvKiBNaXhNdWxBdXggaXMganVzdCBsaWtlIE1peE11bCBleGNlcHQgaXQgY29tYmluZXMgd2l0aAorICogYW4gYWNjdW11bGF0b3Igb3BlcmF0aW9uIE1peEFjY3VtLgorICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQT4KK2lubGluZSBUTyBNaXhNdWxBdXgoVEkgdmFsdWUsIFRWIHZvbHVtZSwgVEEgKmF1eGFjY3VtKSB7CisgICAgTWl4QWNjdW08VEEsIFRJPihhdXhhY2N1bSwgdmFsdWUpOworICAgIHJldHVybiBNaXhNdWw8VE8sIFRJLCBUVj4odmFsdWUsIHZvbHVtZSk7Cit9CisKKy8qIE1JWFRZUEUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRoZSBzYW1wbGVzIGluIHRoZSBpbnB1dCBmcmFtZQorICogYXJlIG1peGVkIHdpdGggdm9sdW1lIGdhaW4gaW50byB0aGUgb3V0cHV0IGZyYW1lLgorICogU2VlIHRoZSB2b2x1bWVSYW1wTXVsdGkgZnVuY3Rpb25zIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgKi8KK2VudW0geworICAgIE1JWFRZUEVfTVVMVEksCisgICAgTUlYVFlQRV9NT05PRVhQQU5ELAorICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCisgICAgTUlYVFlQRV9NVUxUSV9NT05PVk9MLAorICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCwKK307CisKKy8qCisgKiBUaGUgdm9sdW1lUmFtcE11bHRpIGFuZCB2b2x1bWVSYW1wIGZ1bmN0aW9ucyB0YWtlIGEgTUlYVFlQRQorICogd2hpY2ggaW5kaWNhdGVzIHRoZSBwZXItZnJhbWUgbWl4aW5nIGFuZCBhY2N1bXVsYXRpb24gc3RyYXRlZ3kuCisgKgorICogTUlYVFlQRV9NVUxUSToKKyAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICB2b2w6IHJlcHJlc2VudHMgYSB2b2x1bWUgYXJyYXkuCisgKgorICogICBUaGlzIGFjY3VtdWxhdGVzIGludG8gdGhlIG91dCBwb2ludGVyLgorICoKKyAqIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAqICAgU2luZ2xlIGlucHV0IGNoYW5uZWwuIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KKyAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICBJbnB1dCBjaGFubmVsIGNvdW50IGlzIDEuCisgKiAgIHZvbDogcmVwcmVzZW50cyB2b2x1bWUgYXJyYXkuCisgKgorICogICBUaGlzIGFjY3VtdWxhdGVzIGludG8gdGhlIG91dCBwb2ludGVyLgorICoKKyAqIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgKiAgIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuCisgKiAgIFRPOiBpbnQxNl90IChRLjE1KSBvciBmbG9hdAorICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICB2b2w6IHJlcHJlc2VudHMgYSB2b2x1bWUgYXJyYXkuCisgKgorICogICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZIGRvZXMgbm90IGFjY3VtdWxhdGUgaW50byB0aGUgb3V0IHBvaW50ZXIuCisgKgorICogTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICogICBTYW1lIGFzIE1JWFRZUEVfTVVMVEksIGJ1dCB1c2VzIG9ubHkgdm9sdW1lWzBdLgorICoKKyAqIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAqICAgU2FtZSBhcyBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBidXQgdXNlcyBvbmx5IHZvbHVtZVswXS4KKyAqCisgKi8KKwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitpbmxpbmUgdm9pZCB2b2x1bWVSYW1wTXVsdGkoVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgVFYgKnZvbCwgY29uc3QgVFYgKnZvbGluYywgVEFWICp2b2xhLCBUQVYgdm9sYWluYykKK3sKKyNpZmRlZiBBTE9HVlYKKyAgICBBTE9HVlYoInZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRTolZFxuIiwgTUlYVFlQRSk7CisjZW5kaWYKKyAgICBpZiAoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgVEEgYXV4YWNjdW0gPSAwOworICAgICAgICAgICAgc3dpdGNoIChNSVhUWVBFKSB7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVEk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01PTk9FWFBBTkQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbiwgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgICAgICB2b2xbaV0gKz0gdm9saW5jW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJX01PTk9WT0w6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2xbMF0gKz0gdm9saW5jWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1eGFjY3VtIC89IE5DSEFOOworICAgICAgICAgICAgKmF1eCsrICs9IE1peE11bDxUQSwgVEEsIFRBVj4oYXV4YWNjdW0sICp2b2xhKTsKKyAgICAgICAgICAgIHZvbGFbMF0gKz0gdm9sYWluYzsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBzd2l0Y2ggKE1JWFRZUEUpIHsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTU9OT0VYUEFORDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4sIHZvbFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfU0FWRU9OTFk6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sW2ldICs9IHZvbGluY1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4rKywgdm9sWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgbWl4dHlwZSAlZCIsIE1JWFRZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0KK30KKwordGVtcGxhdGUgPGludCBNSVhUWVBFLCBpbnQgTkNIQU4sCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitpbmxpbmUgdm9pZCB2b2x1bWVNdWx0aShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBjb25zdCBUViAqdm9sLCBUQVYgdm9sYSkKK3sKKyNpZmRlZiBBTE9HVlYKKyAgICBBTE9HVlYoInZvbHVtZU11bHRpIE1JWFRZUEU6JWRcbiIsIE1JWFRZUEUpOworI2VuZGlmCisgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIFRBIGF1eGFjY3VtID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4sIHZvbFtpXSwgJmF1eGFjY3VtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sW2ldLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4rKywgdm9sWzBdLCAmYXV4YWNjdW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbMF0sICZhdXhhY2N1bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1eGFjY3VtIC89IE5DSEFOOworICAgICAgICAgICAgKmF1eCsrICs9IE1peE11bDxUQSwgVEEsIFRBVj4oYXV4YWNjdW0sIHZvbGEpOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN3aXRjaCAoTUlYVFlQRSkgeworICAgICAgICAgICAgY2FzZSBNSVhUWVBFX01VTFRJOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NT05PRVhQQU5EOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbiwgdm9sW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWToKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgeworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIG1peHR5cGUgJWQiLCBNSVhUWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9Cit9CisKK307CisKKyNlbmRpZiAvKiBBTkRST0lEX0FVRElPX01JWEVSX09QU19IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ1MmM4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCi0jdW5kZWYgX19TVFJJQ1RfQU5TSV9fCi0jZGVmaW5lIF9fU1RESU5UX0xJTUlUUwotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2F1ZGlvX2VmZmVjdHNfY29uZi5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciBrQ21kRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kIHRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKLQotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKLQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga0F1ZGlvQ29tbWFuZFRpbWVvdXQgPSAzMDAwMDAwMDAwTEw7IC8vIDMgc2Vjb25kcwotCi1uYW1lc3BhY2UgewotICAgIGV4dGVybiBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGFwc19vcHM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKLSAgICA6IEJuQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgLCBtcEF1ZGlvUG9saWN5RGV2KE5VTEwpICwgbXBBdWRpb1BvbGljeShOVUxMKQotewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZTsKLSAgICBpbnQgZm9yY2VkX3ZhbDsKLSAgICBpbnQgcmM7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOwotICAgIC8vIHN0YXJ0IGF1ZGlvIGNvbW1hbmRzIHRocmVhZAotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwotICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZAotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1PdXRwdXQiKSwgdGhpcyk7Ci0gICAgLyogaW5zdGFudGlhdGUgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyICovCi0gICAgcmMgPSBod19nZXRfbW9kdWxlKEFVRElPX1BPTElDWV9IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBhdWRpb19wb2xpY3lfZGV2X29wZW4obW9kdWxlLCAmbXBBdWRpb1BvbGljeURldik7Ci0gICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBvcGVuIGF1ZGlvIHBvbGljeSBkZXZpY2UgKCVzKSIsIHN0cmVycm9yKC1yYykpOwotICAgIGlmIChyYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmMgPSBtcEF1ZGlvUG9saWN5RGV2LT5jcmVhdGVfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsICZhcHNfb3BzLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXBBdWRpb1BvbGljeSk7Ci0gICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBjcmVhdGUgYXVkaW8gcG9saWN5ICglcykiLCBzdHJlcnJvcigtcmMpKTsKLSAgICBpZiAocmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJjID0gbXBBdWRpb1BvbGljeS0+aW5pdF9jaGVjayhtcEF1ZGlvUG9saWN5KTsKLSAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGluaXRfY2hlY2sgdGhlIGF1ZGlvIHBvbGljeSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgaWYgKHJjKQotICAgICAgICByZXR1cm47Ci0KLSAgICBBTE9HSSgiTG9hZGVkIGF1ZGlvIHBvbGljeSBmcm9tICVzICglcykiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+aWQpOwotCi0gICAgLy8gbG9hZCBhdWRpbyBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCi0gICAgaWYgKGFjY2VzcyhBVURJT19FRkZFQ1RfVkVORE9SX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIGxvYWRQcmVQcm9jZXNzb3JDb25maWcoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZFByZVByb2Nlc3NvckNvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7Ci0gICAgfQotfQotCi1BdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLmNsZWFyKCk7Ci0gICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQuY2xlYXIoKTsKLQotCi0gICAgLy8gcmVsZWFzZSBhdWRpbyBwcmUgcHJvY2Vzc2luZyByZXNvdXJjZXMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1JbnB1dFNvdXJjZXMudmFsdWVBdChpKTsKLSAgICB9Ci0gICAgbUlucHV0U291cmNlcy5jbGVhcigpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+bUVmZmVjdHMuY2xlYXIoKTsKLSAgICAgICAgZGVsZXRlIG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICB9Ci0gICAgbUlucHV0cy5jbGVhcigpOwotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgIT0gTlVMTCAmJiBtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpCi0gICAgICAgIG1wQXVkaW9Qb2xpY3lEZXYtPmRlc3Ryb3lfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsIG1wQXVkaW9Qb2xpY3kpOwotICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpCi0gICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfY2xvc2UobXBBdWRpb1BvbGljeURldik7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYKLSAgICAgICAgICAgIHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKLX0KLQotYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X2RldmljZV9jb25uZWN0aW9uX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKLQotICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKLSAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9waG9uZV9zdGF0ZShtcEF1ZGlvUG9saWN5LCBzdGF0ZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtcEF1ZGlvUG9saWN5LT5zZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlLCBjb25maWcpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZm9yY2VfdXNlKG1wQXVkaW9Qb2xpY3ksIHVzYWdlKTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9vdXRwdXQobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0KTsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCi0gICAgaWYgKGlucHV0U291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCi0gICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBtcEF1ZGlvUG9saWN5LT5nZXRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXRTb3VyY2UsIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIChhdWRpb19pbl9hY291c3RpY3NfdCkgMCk7Ci0KLSAgICBpZiAoaW5wdXQgPT0gMCkgewotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCi0gICAgYXVkaW9fc291cmNlX3QgYWxpYXNTb3VyY2UgPSAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiA6IGlucHV0U291cmNlOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShhbGlhc1NvdXJjZSk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQotICAgIHNzaXplX3QgaWR4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBJbnB1dERlc2MgKmlucHV0RGVzYzsKLSAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICBpbnB1dERlc2MgPSBuZXcgSW5wdXREZXNjKGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpZHgpOwotICAgIH0KLQotICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBpbnB1dCAlZCIsIGVmZmVjdC0+bU5hbWUsIGlucHV0KTsKLSAgICAgICAgICAgIC8vIGZ4IGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBzdHJvbmcgcmVmIG9uIEF1ZGlvRWZmZWN0IGlzIHJlbGVhc2VkCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGVmZmVjdC0+bVBhcmFtcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgZngtPnNldFBhcmFtZXRlcihlZmZlY3QtPm1QYXJhbXNbal0pOwotICAgICAgICB9Ci0gICAgICAgIGlucHV0RGVzYy0+bUVmZmVjdHMuYWRkKGZ4KTsKLSAgICB9Ci0gICAgc2V0UHJlUHJvY2Vzc29yRW5hYmxlZChpbnB1dERlc2MsIHRydWUpOwotICAgIHJldHVybiBpbnB1dDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c3RhcnRfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0b3BfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2VfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIElucHV0RGVzYyAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGlucHV0RGVzYywgZmFsc2UpOwotICAgIGRlbGV0ZSBpbnB1dERlc2M7Ci0gICAgbUlucHV0cy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1wQXVkaW9Qb2xpY3ktPmluaXRfc3RyZWFtX3ZvbHVtZShtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgewotICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleF9mb3JfZGV2aWNlKG1wQXVkaW9Qb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJlYW1fdm9sdW1lX2luZGV4KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5kZXgpOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmF0ZWd5X2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKLX0KLQotLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkwOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KTA7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlc19mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCi17Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dF9mb3JfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+cmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT51bnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBpZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2VmZmVjdF9lbmFibGVkKG1wQXVkaW9Qb2xpY3ksIGlkLCBlbmFibGVkKTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zdHJlYW1fYWN0aXZlX3JlbW90ZWx5KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgaW5QYXN0TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+aXNfc291cmNlX2FjdGl2ZShtcEF1ZGlvUG9saWN5LCBzb3VyY2UpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCi17Ci0KLSAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7Ci0gICAgICAgICpjb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgc2l6ZV90IGluZGV4OwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChtSW5wdXRzLnZhbHVlQXQoaW5kZXgpLT5tU2Vzc2lvbklkID09IGF1ZGlvU2Vzc2lvbikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IG1JbnB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICpjb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID4gZWZmZWN0cyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IGVmZmVjdHNbaV0tPmRlc2NyaXB0b3IoKTsKLSAgICAgICAgaWYgKGkgPCAqY291bnQpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JzW2ldID0gZGVzYzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZWZmZWN0cy5zaXplKCkgPiAqY291bnQpIHsKLSAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwotICAgIH0KLSAgICAqY291bnQgPSBlZmZlY3RzLnNpemUoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7Ci0gICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKLX0KLQotc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCi17Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBJbnRlcm5hbHMoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUG9saWN5TWFuYWdlciBJbnRlcmZhY2U6ICVwXG4iLCBtcEF1ZGlvUG9saWN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ29tbWFuZCBUaHJlYWQ6ICVwXG4iLCBtQXVkaW9Db21tYW5kVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG9uZXMgVGhyZWFkOiAlcFxuIiwgbVRvbmVQbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGlmICghZHVtcEFsbG93ZWQoKSkgewotICAgICAgICBkdW1wUGVybWlzc2lvbkRlbmlhbChmZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIFN0cmluZzggcmVzdWx0KGtEZWFkbG9ja2VkU3RyaW5nKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZHVtcEludGVybmFscyhmZCk7Ci0gICAgICAgIGlmIChtQXVkaW9Db21tYW5kVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPmR1bXAoZmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVG9uZVBsYXliYWNrVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmR1bXAoZmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1wQXVkaW9Qb2xpY3kpIHsKLSAgICAgICAgICAgIG1wQXVkaW9Qb2xpY3ktPmR1bXAobXBBdWRpb1BvbGljeSwgZmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICJjYW4ndCBkdW1wIEF1ZGlvUG9saWN5U2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UHJlUHJvY2Vzc29yRW5hYmxlZChjb25zdCBJbnB1dERlc2MgKmlucHV0RGVzYywgYm9vbCBlbmFibGVkKQotewotICAgIGNvbnN0IFZlY3RvcjxzcDxBdWRpb0VmZmVjdD4gPiAmZnhWZWN0b3IgPSBpbnB1dERlc2MtPm1FZmZlY3RzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnhWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZnhWZWN0b3IuaXRlbUF0KGkpLT5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCi0KLUF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQotICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCi17Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKLX0KLQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6fkF1ZGlvQ29tbWFuZFRocmVhZCgpCi17Ci0gICAgaWYgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwotICAgIH0KLSAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOwotICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQotewotICAgIHJ1bihtTmFtZS5zdHJpbmcoKSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIG5zZWNzX3Qgd2FpdFRpbWUgPSBJTlQ2NF9NQVg7Ci0KLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQotICAgIHsKLSAgICAgICAgd2hpbGUgKCFtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG5zZWNzX3QgY3VyVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBleGVjdXRlIHRoZW0gZnJvbSBpbmRleCAwIGFuZCB1cAotICAgICAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRzWzBdLT5tVGltZSA8PSBjdXJUaW1lKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbUF1ZGlvQ29tbWFuZHNbMF07Ci0gICAgICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZHMucmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gKmNvbW1hbmQ7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQXVkaW9Db21tYW5kVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQXVkaW9Db21tYW5kVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgVm9pY2VWb2x1bWVEYXRhICpkYXRhID0gKFZvaWNlVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUpOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrQXVkaW9Db21tYW5kVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7Ci0gICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewotICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBJTlQ2NF9NQVg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gbUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIC0gY3VyVGltZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrCi0gICAgICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgZ29pbmcgdG8gc2xlZXAiKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCB3YWl0VGltZSk7Ci0gICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB3YWtpbmcgdXAiKTsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0NvbW1hbmRUaHJlYWQgJXAgRHVtcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKLSAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICBTdHJpbmc4IHJlc3VsdDIoa0NtZERlYWRsb2NrZWRTdHJpbmcpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0Mi5zdHJpbmcoKSwgcmVzdWx0Mi5zaXplKCkpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gQ29tbWFuZHM6XG4iKTsKLSAgICByZXN1bHQgPSBTdHJpbmc4KGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICAgQ29tbWFuZCBUaW1lICAgICAgICBXYWl0IHBQYXJhbVxuIik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGkrKykgewotICAgICAgICBtQXVkaW9Db21tYW5kc1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIiAgTGFzdCBDb21tYW5kXG4iKTsKLSAgICBtTGFzdENvbW1hbmQuZHVtcChidWZmZXIsIFNJWkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7Ci0gICAgVG9uZURhdGEgKmRhdGEgPSBuZXcgVG9uZURhdGEoKTsKLSAgICBkYXRhLT5tVHlwZSA9IHR5cGU7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSAodm9pZCAqKWRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7Ci0gICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCi17Ci0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IE5VTEw7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9WT0xVTUU7Ci0gICAgVm9sdW1lRGF0YSAqZGF0YSA9IG5ldyBWb2x1bWVEYXRhKCk7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQsIGRlbGF5TXMpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwKLSAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgc3RhdHVzID0gIGNvbW1hbmQtPm1TdGF0dXM7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9QQVJBTUVURVJTOwotICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gbmV3IFBhcmFtZXRlcnNEYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gaW9IYW5kbGU7Ci0gICAgZGF0YS0+bUtleVZhbHVlUGFpcnMgPSBTdHJpbmc4KGtleVZhbHVlUGFpcnMpOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgcGFyYW1ldGVyIHN0cmluZyAlcywgaW8gJWQgLGRlbGF5ICVkIiwKLSAgICAgICAgICAgIGtleVZhbHVlUGFpcnMsIGlvSGFuZGxlLCBkZWxheU1zKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKLSAgICAgICAgY29tbWFuZC0+bUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgIHN0YXR1cyA9ICBjb21tYW5kLT5tU3RhdHVzOwotICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgQXVkaW9Db21tYW5kICpjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPSUNFX1ZPTFVNRTsKLSAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSBuZXcgVm9pY2VWb2x1bWVEYXRhKCk7Ci0gICAgZGF0YS0+bVZvbHVtZSA9IHZvbHVtZTsKLSAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaW5zZXJ0Q29tbWFuZF9sKGNvbW1hbmQsIGRlbGF5TXMpOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLCB2b2x1bWUpOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewotICAgICAgICBjb21tYW5kLT5tQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgc3RhdHVzID0gIGNvbW1hbmQtPm1TdGF0dXM7Ci0gICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQotewotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwotICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9ICh2b2lkICopZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIEF1ZGlvQ29tbWFuZCAqY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKLSAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfT1VUUFVUOwotICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gbmV3IFJlbGVhc2VPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGNvbW1hbmQtPm1QYXJhbSA9ICh2b2lkICopZGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kKTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLX0KLQotLy8gaW5zZXJ0Q29tbWFuZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjppbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcykKLXsKLSAgICBzc2l6ZV90IGk7ICAvLyBub3Qgc2l6ZV90IGJlY2F1c2UgaSB3aWxsIGNvdW50IGRvd24gdG8gLTEKLSAgICBWZWN0b3IgPEF1ZGlvQ29tbWFuZCAqPiByZW1vdmVkQ29tbWFuZHM7Ci0gICAgY29tbWFuZC0+bVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHMoZGVsYXlNcyk7Ci0KLSAgICAvLyBhY3F1aXJlIHdha2UgbG9jayB0byBtYWtlIHN1cmUgZGVsYXllZCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkCi0gICAgaWYgKG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgewotICAgICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgbU5hbWUuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIHNhbWUgcGVuZGluZyBjb21tYW5kcyB3aXRoIGxhdGVyIHRpbWUgc3RhbXBzIGFuZCBlbGltaW5hdGUgdGhlbQotICAgIGZvciAoaSA9IG1BdWRpb0NvbW1hbmRzLnNpemUoKS0xOyBpID49IDA7IGktLSkgewotICAgICAgICBBdWRpb0NvbW1hbmQgKmNvbW1hbmQyID0gbUF1ZGlvQ29tbWFuZHNbaV07Ci0gICAgICAgIC8vIGNvbW1hbmRzIGFyZSBzb3J0ZWQgYnkgaW5jcmVhc2luZyB0aW1lIHN0YW1wOiBubyBuZWVkIHRvIHNjYW4gdGhlIHJlc3Qgb2YgbUF1ZGlvQ29tbWFuZHMKLSAgICAgICAgaWYgKGNvbW1hbmQyLT5tVGltZSA8PSBjb21tYW5kLT5tVGltZSkgYnJlYWs7Ci0gICAgICAgIGlmIChjb21tYW5kMi0+bUNvbW1hbmQgIT0gY29tbWFuZC0+bUNvbW1hbmQpIGNvbnRpbnVlOwotCi0gICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKLSAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewotICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YTIgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kMi0+bVBhcmFtOwotICAgICAgICAgICAgaWYgKGRhdGEtPm1JTyAhPSBkYXRhMi0+bUlPKSBicmVhazsKLSAgICAgICAgICAgIEFMT0dWKCJDb21wYXJpbmcgcGFyYW1ldGVyIGNvbW1hbmQgJXMgdG8gbmV3IGNvbW1hbmQgJXMiLAotICAgICAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGF0YS0+bUtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0yID0gQXVkaW9QYXJhbWV0ZXIoZGF0YTItPm1LZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGFyYW0uc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlOwotICAgICAgICAgICAgICAgIHBhcmFtLmdldEF0KGosIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcGFyYW0yLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgga2V5MjsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZTI7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtMi5nZXRBdChrLCBrZXkyLCB2YWx1ZTIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5MiA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtMi5yZW1vdmUoa2V5Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCBwYXJhbWV0ZXIgJXMiLCBrZXkyLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYWxsIGtleXMgaGF2ZSBiZWVuIGZpbHRlcmVkIG91dCwgcmVtb3ZlIHRoZSBjb21tYW5kLgotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB1cGRhdGUgdGhlIGtleSB2YWx1ZSBwYWlycwotICAgICAgICAgICAgaWYgKHBhcmFtMi5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMgPSBwYXJhbTIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOwotICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgotICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKLSAgICAgICAgICAgIGRlbGF5TXMgPSAxOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewotICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YTIgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07Ci0gICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwotICAgICAgICAgICAgaWYgKGRhdGEtPm1TdHJlYW0gIT0gZGF0YTItPm1TdHJlYW0pIGJyZWFrOwotICAgICAgICAgICAgQUxPR1YoIkZpbHRlcmluZyBvdXQgdm9sdW1lIGNvbW1hbmQgb24gb3V0cHV0ICVkIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0pOwotICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7Ci0gICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKLSAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKLSAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCi0gICAgICAgICAgICBkZWxheU1zID0gMTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmVtb3ZlIGZpbHRlcmVkIGNvbW1hbmRzCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZW1vdmVkQ29tbWFuZHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgLy8gcmVtb3ZlZCBjb21tYW5kcyBhbHdheXMgaGF2ZSB0aW1lIHN0YW1wcyBncmVhdGVyIHRoYW4gY3VycmVudCBjb21tYW5kCi0gICAgICAgIGZvciAoc2l6ZV90IGsgPSBpICsgMTsgayA8IG1BdWRpb0NvbW1hbmRzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNba10gPT0gcmVtb3ZlZENvbW1hbmRzW2pdKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN1cHByZXNzaW5nIGNvbW1hbmQ6ICVkIiwgbUF1ZGlvQ29tbWFuZHNba10tPm1Db21tYW5kKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdChrKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZW1vdmVkQ29tbWFuZHMuY2xlYXIoKTsKLQotICAgIC8vIHdhaXQgZm9yIHN0YXR1cyBvbmx5IGlmIGRlbGF5IGlzIDAKLSAgICBpZiAoZGVsYXlNcyA9PSAwKSB7Ci0gICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIGluc2VydCBjb21tYW5kIGF0IHRoZSByaWdodCBwbGFjZSBhY2NvcmRpbmcgdG8gaXRzIHRpbWUgc3RhbXAKLSAgICBBTE9HVigiaW5zZXJ0aW5nIGNvbW1hbmQ6ICVkIGF0IGluZGV4ICVkLCBudW0gY29tbWFuZHMgJWQiLAotICAgICAgICAgICAgY29tbWFuZC0+bUNvbW1hbmQsIChpbnQpaSsxLCBtQXVkaW9Db21tYW5kcy5zaXplKCkpOwotICAgIG1BdWRpb0NvbW1hbmRzLmluc2VydEF0KGNvbW1hbmQsIGkgKyAxKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpCi17Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCIpOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICAgICAgcmVxdWVzdEV4aXQoKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmQ6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDJkICAgICAgJTA2ZC4lMDNkICAlMDF1ICAgICVwXG4iLAotICAgICAgICAgICAgbUNvbW1hbmQsCi0gICAgICAgICAgICAoaW50KW5zMnMobVRpbWUpLAotICAgICAgICAgICAgKGludCluczJtcyhtVGltZSklMTAwMCwKLSAgICAgICAgICAgIG1XYWl0U3RhdHVzLAotICAgICAgICAgICAgbVBhcmFtKTsKLX0KLQotLyoqKioqKiogaGVscGVycyBmb3IgdGhlIHNlcnZpY2Vfb3BzIGNhbGxiYWNrcyBkZWZpbmVkIGJlbG93ICoqKioqKioqKi8KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQotewotICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnBhcmFtZXRlcnNDb21tYW5kKGlvSGFuZGxlLCBrZXlWYWx1ZVBhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKLXsKLSAgICByZXR1cm4gKGludCltQXVkaW9Db21tYW5kVGhyZWFkLT52b2x1bWVDb21tYW5kKHN0cmVhbSwgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBkZWxheU1zKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCB0b25lIHJlcXVlc3RlZCAoJWQpIiwgdG9uZSk7Ci0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkKLSAgICAgICAgQUxPR0UoInN0YXJ0VG9uZTogaWxsZWdhbCBzdHJlYW0gKCVkKSByZXF1ZXN0ZWQgZm9yIHRvbmUgJWQiLCBzdHJlYW0sCi0gICAgICAgICAgICB0b25lKTsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQotewotICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQotewotICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIm1wQXVkaW9Qb2xpY3kgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIkhBTCBkb2VzIG5vdCBpbXBsZW1lbnQgaXNfb2ZmbG9hZF9zdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZChtcEF1ZGlvUG9saWN5LCAmaW5mbyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF1ZGlvIHByZS1wcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLypzdGF0aWMqLyBjb25zdCBjaGFyICogY29uc3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjprSW5wdXRTb3VyY2VOYW1lc1tBVURJT19TT1VSQ0VfQ05UIC0xXSA9IHsKLSAgICBNSUNfU1JDX1RBRywKLSAgICBWT0lDRV9VTF9TUkNfVEFHLAotICAgIFZPSUNFX0RMX1NSQ19UQUcsCi0gICAgVk9JQ0VfQ0FMTF9TUkNfVEFHLAotICAgIENBTUNPUkRFUl9TUkNfVEFHLAotICAgIFZPSUNFX1JFQ19TUkNfVEFHLAotICAgIFZPSUNFX0NPTU1fU1JDX1RBRwotfTsKLQotLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgotLy8gQVVESU9fU09VUkNFX0NOVCBpcyBubyBtYXRjaCBmb3VuZAotYXVkaW9fc291cmNlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSBBVURJT19TT1VSQ0VfTUlDOyBpIDwgQVVESU9fU09VUkNFX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobmFtZSwga0lucHV0U291cmNlTmFtZXNbaSAtIEFVRElPX1NPVVJDRV9NSUNdKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiaW5wdXRTb3VyY2VOYW1lVG9FbnVtIGZvdW5kIHNvdXJjZSAlcyAlZCIsIG5hbWUsIGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChhdWRpb19zb3VyY2VfdClpOwotfQotCi1zaXplX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpncm93UGFyYW1TaXplKGNoYXIgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCi17Ci0gICAgLy8gKmN1clNpemUgaXMgYXQgbGVhc3Qgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDIgKiBzaXplb2YoaW50KQotICAgIHNpemVfdCBwb3MgPSAoKCpjdXJTaXplIC0gMSApIC8gc2l6ZSArIDEpICogc2l6ZTsKLQotICAgIGlmIChwb3MgKyBzaXplID4gKnRvdFNpemUpIHsKLSAgICAgICAgd2hpbGUgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgewotICAgICAgICAgICAgKnRvdFNpemUgKz0gKCgqdG90U2l6ZSArIDcpIC8gOCkgKiA0OwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7Ci0gICAgfQotICAgICpjdXJTaXplID0gcG9zICsgc2l6ZTsKLSAgICByZXR1cm4gcG9zOwotfQotCi1zaXplX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWFkUGFyYW1WYWx1ZShjbm9kZSAqbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKQotewotICAgIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNIT1JUX1RBRywgc2l6ZW9mKFNIT1JUX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2Yoc2hvcnQpLCBjdXJTaXplLCB0b3RTaXplKTsKLSAgICAgICAgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChzaG9ydClhdG9pKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzaG9ydCAlZCIsICooc2hvcnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKHNob3J0KTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgSU5UX1RBRywgc2l6ZW9mKElOVF9UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGludCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICAqKGludCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IGF0b2kobm9kZS0+dmFsdWUpOwotICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIGludCAlZCIsICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpKTsKLSAgICAgICAgcmV0dXJuIHNpemVvZihpbnQpOwotICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBGTE9BVF9UQUcsIHNpemVvZihGTE9BVF9UQUcpICsgMSkgPT0gMCkgewotICAgICAgICBzaXplX3QgcG9zID0gZ3Jvd1BhcmFtU2l6ZShwYXJhbSwgc2l6ZW9mKGZsb2F0KSwgY3VyU2l6ZSwgdG90U2l6ZSk7Ci0gICAgICAgICooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSAoZmxvYXQpYXRvZihub2RlLT52YWx1ZSk7Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgZmxvYXQgJWYiLCooZmxvYXQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOwotICAgICAgICByZXR1cm4gc2l6ZW9mKGZsb2F0KTsKLSAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgQk9PTF9UQUcsIHNpemVvZihCT09MX1RBRykgKyAxKSA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoYm9vbCksIGN1clNpemUsIHRvdFNpemUpOwotICAgICAgICBpZiAoc3RybmNtcChub2RlLT52YWx1ZSwgImZhbHNlIiwgc3RybGVuKCJmYWxzZSIpICsgMSkgPT0gMCkgewotICAgICAgICAgICAgKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgYm9vbCAlcyIsKihib29sICopKChjaGFyICopcGFyYW0gKyBwb3MpID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIHJldHVybiBzaXplb2YoYm9vbCk7Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIFNUUklOR19UQUcsIHNpemVvZihTVFJJTkdfVEFHKSArIDEpID09IDApIHsKLSAgICAgICAgc2l6ZV90IGxlbiA9IHN0cm5sZW4obm9kZS0+dmFsdWUsIEVGRkVDVF9TVFJJTkdfTEVOX01BWCk7Ci0gICAgICAgIGlmICgqY3VyU2l6ZSArIGxlbiArIDEgPiAqdG90U2l6ZSkgewotICAgICAgICAgICAgKnRvdFNpemUgPSAqY3VyU2l6ZSArIGxlbiArIDE7Ci0gICAgICAgICAgICBwYXJhbSA9IChjaGFyICopcmVhbGxvYyhwYXJhbSwgKnRvdFNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHN0cm5jcHkocGFyYW0gKyAqY3VyU2l6ZSwgbm9kZS0+dmFsdWUsIGxlbik7Ci0gICAgICAgICpjdXJTaXplICs9IGxlbjsKLSAgICAgICAgcGFyYW1bKmN1clNpemVdID0gJ1wwJzsKLSAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBzdHJpbmcgJXMiLCBwYXJhbSArICpjdXJTaXplIC0gbGVuKTsKLSAgICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gICAgQUxPR1coInJlYWRQYXJhbVZhbHVlKCkgdW5rbm93biBwYXJhbSB0eXBlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWVmZmVjdF9wYXJhbV90ICpBdWRpb1BvbGljeVNlcnZpY2U6OmxvYWRFZmZlY3RQYXJhbWV0ZXIoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKnBhcmFtOwotICAgIGNub2RlICp2YWx1ZTsKLSAgICBzaXplX3QgY3VyU2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCk7Ci0gICAgc2l6ZV90IHRvdFNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpOwotICAgIGVmZmVjdF9wYXJhbV90ICpmeF9wYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyh0b3RTaXplKTsKLQotICAgIHBhcmFtID0gY29uZmlnX2ZpbmQocm9vdCwgUEFSQU1fVEFHKTsKLSAgICB2YWx1ZSA9IGNvbmZpZ19maW5kKHJvb3QsIFZBTFVFX1RBRyk7Ci0gICAgaWYgKHBhcmFtID09IE5VTEwgJiYgdmFsdWUgPT0gTlVMTCkgewotICAgICAgICAvLyB0cnkgdG8gcGFyc2Ugc2ltcGxlIHBhcmFtZXRlciBmb3JtIHtpbnQgaW50fQotICAgICAgICBwYXJhbSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgICAgICBpZiAocGFyYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gTm90ZTogdGhhdCBhIHBhaXIgb2YgcmFuZG9tIHN0cmluZ3MgaXMgcmVhZCBhcyAwIDAKLSAgICAgICAgICAgIGludCAqcHRyID0gKGludCAqKWZ4X3BhcmFtLT5kYXRhOwotICAgICAgICAgICAgaW50ICpwdHIyID0gKGludCAqKSgoY2hhciAqKXBhcmFtICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSk7Ci0gICAgICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIHB0ciAlcCBwdHIyICVwIiwgcHRyLCBwdHIyKTsKLSAgICAgICAgICAgICpwdHIrKyA9IGF0b2kocGFyYW0tPm5hbWUpOwotICAgICAgICAgICAgKnB0ciA9IGF0b2kocGFyYW0tPnZhbHVlKTsKLSAgICAgICAgICAgIGZ4X3BhcmFtLT5wc2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgZnhfcGFyYW0tPnZzaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgICAgICByZXR1cm4gZnhfcGFyYW07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBhcmFtID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygibG9hZEVmZmVjdFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW1ldGVyIGRlc2NyaXB0aW9uICVzIiwgcm9vdC0+bmFtZSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZnhfcGFyYW0tPnBzaXplID0gMDsKLSAgICBwYXJhbSA9IHBhcmFtLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAocGFyYW0pIHsKLSAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHBhcmFtIG9mIHR5cGUgJXMiLCBwYXJhbS0+bmFtZSk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUocGFyYW0sIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZnhfcGFyYW0tPnBzaXplICs9IHNpemU7Ci0gICAgICAgIHBhcmFtID0gcGFyYW0tPm5leHQ7Ci0gICAgfQotCi0gICAgLy8gYWxpZ24gc3RhcnQgb2YgdmFsdWUgZmllbGQgb24gMzIgYml0IGJvdW5kYXJ5Ci0gICAgY3VyU2l6ZSA9ICgoY3VyU2l6ZSAtIDEgKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKLQotICAgIGZ4X3BhcmFtLT52c2l6ZSA9IDA7Ci0gICAgdmFsdWUgPSB2YWx1ZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKHZhbHVlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcmVhZGluZyB2YWx1ZSBvZiB0eXBlICVzIiwgdmFsdWUtPm5hbWUpOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IHJlYWRQYXJhbVZhbHVlKHZhbHVlLCAoY2hhciAqKWZ4X3BhcmFtLCAmY3VyU2l6ZSwgJnRvdFNpemUpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGZ4X3BhcmFtLT52c2l6ZSArPSBzaXplOwotICAgICAgICB2YWx1ZSA9IHZhbHVlLT5uZXh0OwotICAgIH0KLQotICAgIHJldHVybiBmeF9wYXJhbTsKLQotZXJyb3I6Ci0gICAgZGVsZXRlIGZ4X3BhcmFtOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdFBhcmFtZXRlcnMoY25vZGUgKnJvb3QsIFZlY3RvciA8ZWZmZWN0X3BhcmFtX3QgKj4mIHBhcmFtcykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0UGFyYW1ldGVycygpIGxvYWRpbmcgcGFyYW0gJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gbG9hZEVmZmVjdFBhcmFtZXRlcihub2RlKTsKLSAgICAgICAgaWYgKHBhcmFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1zLmFkZChwYXJhbSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpJbnB1dFNvdXJjZURlc2MgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZElucHV0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25vZGUgKnJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBlbXB0eSBlbGVtZW50ICVzIiwgcm9vdC0+bmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBJbnB1dFNvdXJjZURlc2MgKnNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZURlc2MoKTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKGVmZmVjdHNbaV0tPm1OYW1lLCBub2RlLT5uYW1lLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlKCkgZm91bmQgZWZmZWN0ICVzIGluIGxpc3QiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBlZmZlY3RzLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRJbnB1dFNvdXJjZSgpIGVmZmVjdCAlcyBub3QgaW4gbGlzdCIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygqZWZmZWN0c1tpXSk7ICAgLy8gZGVlcCBjb3B5Ci0gICAgICAgIGxvYWRFZmZlY3RQYXJhbWV0ZXJzKG5vZGUsIGVmZmVjdC0+bVBhcmFtcyk7Ci0gICAgICAgIEFMT0dWKCJsb2FkSW5wdXRTb3VyY2UoKSBhZGRpbmcgZWZmZWN0ICVzIHV1aWQgJTA4eCIsIGVmZmVjdC0+bU5hbWUsIGVmZmVjdC0+bVV1aWQudGltZUxvdyk7Ci0gICAgICAgIHNvdXJjZS0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoc291cmNlLT5tRWZmZWN0cy5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HVygibG9hZElucHV0U291cmNlKCkgbm8gdmFsaWQgZWZmZWN0cyBmb3VuZCBpbiBzb3VyY2UgJXMiLCByb290LT5uYW1lKTsKLSAgICAgICAgZGVsZXRlIHNvdXJjZTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZElucHV0U291cmNlcyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUFJFUFJPQ0VTU0lOR19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dFNvdXJjZU5hbWVUb0VudW0obm9kZS0+bmFtZSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0NOVCkgewotICAgICAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZXMoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlcygpIGxvYWRpbmcgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIElucHV0U291cmNlRGVzYyAqZGVzYyA9IGxvYWRJbnB1dFNvdXJjZShub2RlLCBlZmZlY3RzKTsKLSAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1BdWRpb1BvbGljeVNlcnZpY2U6OkVmZmVjdERlc2MgKkF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgaWYgKEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRWZmZWN0RGVzYyhyb290LT5uYW1lLCB1dWlkKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEVmZmVjdHMoKSBsb2FkaW5nIGVmZmVjdCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBsb2FkRWZmZWN0KG5vZGUpOwotICAgICAgICBpZiAoZWZmZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWZmZWN0cy5hZGQoZWZmZWN0KTsKLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsb2FkUHJlUHJvY2Vzc29yQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY25vZGUgKnJvb3Q7Ci0gICAgY2hhciAqZGF0YTsKLQotICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKLSAgICBpZiAoZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKLQotICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzOwotICAgIGxvYWRFZmZlY3RzKHJvb3QsIGVmZmVjdHMpOwotICAgIGxvYWRJbnB1dFNvdXJjZXMocm9vdCwgZWZmZWN0cyk7Ci0KLSAgICAvLyBkZWxldGUgZWZmZWN0cyB0byBmaXggbWVtb3J5IGxlYWsuCi0gICAgLy8gYXMgZWZmZWN0cyBpcyBsb2NhbCB2YXIgYW5kIHZhbGdyaW5kIHdvdWxkIHRyZWF0IHRoaXMgYXMgbWVtb3J5IGxlYWsKLSAgICAvLyBhbmQgYWx0aG91Z2ggaXQgb25seSBkaWQgaW4gbWVkaWFzZXJ2ZXIgaW5pdCwgYnV0IGZyZWUgaXQgaW4gY2FzZSBtZWRpYXNlcnZlciByZWJvb3QKLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewotICAgICAgZGVsZXRlIGVmZmVjdHNbaV07Ci0gICAgfQotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIHRvIHRoZSBwb2xpY3kgbWFuYWdlciAqLwotZXh0ZXJuICJDIiB7Ci0KLQotc3RhdGljIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPmxvYWRId01vZHVsZShuYW1lKTsKLX0KLQotLy8gZGVwcmVjYXRlZDogcmVwbGFjZWQgYnkgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSgpCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0KHZvaWQgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywgZmxhZ3MpOwotfQotCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5fb3V0cHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKLX0KLQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2R1cF9vdXRwdXQodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOwotfQotCi1zdGF0aWMgaW50IGFwc19jbG9zZV9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIHJldHVybiBhZi0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLX0KLQotc3RhdGljIGludCBhcHNfc3VzcGVuZF9vdXRwdXQodm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIHJldHVybiBhZi0+c3VzcGVuZE91dHB1dChvdXRwdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19yZXN0b3JlX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5yZXN0b3JlT3V0cHV0KG91dHB1dCk7Ci19Ci0KLS8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSgpLCBhbmQgYWNvdXN0aWNzIHBhcmFtZXRlciBpcyBpZ25vcmVkCi1zdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXQodm9pZCAqc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5fYWNvdXN0aWNzX3QgYWNvdXN0aWNzKQotewotICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7Ci0gICAgaWYgKGFmID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrKTsKLX0KLQotc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkgewotICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gYWYtPm9wZW5JbnB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2spOwotfQotCi1zdGF0aWMgaW50IGFwc19jbG9zZV9pbnB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKLXsKLSAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKQotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19zZXRfc3RyZWFtX291dHB1dCh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5zZXRTdHJlYW1PdXRwdXQoc3RyZWFtLCBvdXRwdXQpOwotfQotCi1zdGF0aWMgaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSwgaW50IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCi17Ci0gICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKLSAgICBpZiAoYWYgPT0gMCkKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKLX0KLQotc3RhdGljIGNoYXIgKiBhcHNfZ2V0X3BhcmFtZXRlcnModm9pZCAqc2VydmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleXMpCi17Ci0gICAgU3RyaW5nOCByZXN1bHQgPSBBdWRpb1N5c3RlbTo6Z2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIFN0cmluZzgoa2V5cykpOwotICAgIHJldHVybiBzdHJkdXAocmVzdWx0LnN0cmluZygpKTsKLX0KLQotc3RhdGljIHZvaWQgYXBzX3NldF9wYXJhbWV0ZXJzKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlvX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3ZfcGFpcnMsIGludCBkZWxheV9tcykKLXsKLSAgICBBdWRpb1BvbGljeVNlcnZpY2UgKmF1ZGlvUG9saWN5U2VydmljZSA9IChBdWRpb1BvbGljeVNlcnZpY2UgKilzZXJ2aWNlOwotCi0gICAgYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga3ZfcGFpcnMsIGRlbGF5X21zKTsKLX0KLQotc3RhdGljIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfbXMpOwotfQotCi1zdGF0aWMgaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7Ci0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdGljIGludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Ci19Ci0KLXN0YXRpYyBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpCi17Ci0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKLQotICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSwgZGVsYXlfbXMpOwotfQotCi19OyAvLyBleHRlcm4gIkMiCi0KLW5hbWVzcGFjZSB7Ci0gICAgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzID0gewotICAgICAgICBvcGVuX291dHB1dCAgICAgICAgICAgOiBhcHNfb3Blbl9vdXRwdXQsCi0gICAgICAgIG9wZW5fZHVwbGljYXRlX291dHB1dCA6IGFwc19vcGVuX2R1cF9vdXRwdXQsCi0gICAgICAgIGNsb3NlX291dHB1dCAgICAgICAgICA6IGFwc19jbG9zZV9vdXRwdXQsCi0gICAgICAgIHN1c3BlbmRfb3V0cHV0ICAgICAgICA6IGFwc19zdXNwZW5kX291dHB1dCwKLSAgICAgICAgcmVzdG9yZV9vdXRwdXQgICAgICAgIDogYXBzX3Jlc3RvcmVfb3V0cHV0LAotICAgICAgICBvcGVuX2lucHV0ICAgICAgICAgICAgOiBhcHNfb3Blbl9pbnB1dCwKLSAgICAgICAgY2xvc2VfaW5wdXQgICAgICAgICAgIDogYXBzX2Nsb3NlX2lucHV0LAotICAgICAgICBzZXRfc3RyZWFtX3ZvbHVtZSAgICAgOiBhcHNfc2V0X3N0cmVhbV92b2x1bWUsCi0gICAgICAgIHNldF9zdHJlYW1fb3V0cHV0ICAgICA6IGFwc19zZXRfc3RyZWFtX291dHB1dCwKLSAgICAgICAgc2V0X3BhcmFtZXRlcnMgICAgICAgIDogYXBzX3NldF9wYXJhbWV0ZXJzLAotICAgICAgICBnZXRfcGFyYW1ldGVycyAgICAgICAgOiBhcHNfZ2V0X3BhcmFtZXRlcnMsCi0gICAgICAgIHN0YXJ0X3RvbmUgICAgICAgICAgICA6IGFwc19zdGFydF90b25lLAotICAgICAgICBzdG9wX3RvbmUgICAgICAgICAgICAgOiBhcHNfc3RvcF90b25lLAotICAgICAgICBzZXRfdm9pY2Vfdm9sdW1lICAgICAgOiBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSwKLSAgICAgICAgbW92ZV9lZmZlY3RzICAgICAgICAgIDogYXBzX21vdmVfZWZmZWN0cywKLSAgICAgICAgbG9hZF9od19tb2R1bGUgICAgICAgIDogYXBzX2xvYWRfaHdfbW9kdWxlLAotICAgICAgICBvcGVuX291dHB1dF9vbl9tb2R1bGUgOiBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlLAotICAgICAgICBvcGVuX2lucHV0X29uX21vZHVsZSAgOiBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUsCi0gICAgfTsKLX07IC8vIG5hbWVzcGFjZSA8dW5uYW1lZD4KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwNTNhOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL1RvbmVHZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKLSAgICBwdWJsaWMgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+LAotICAgIHB1YmxpYyBCbkF1ZGlvUG9saWN5U2VydmljZSwKLS8vICAgIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKLSAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb1BvbGljeVNlcnZpY2U+OwotCi1wdWJsaWM6Ci0gICAgLy8gZm9yIEJpbmRlclNlcnZpY2UKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0U2VydmljZU5hbWUoKSBBTkRST0lEX0FQSSB7IHJldHVybiAibWVkaWEuYXVkaW9fcG9saWN5IjsgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAvLwotICAgIC8vIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCi0gICAgLy8KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24gPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWF4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOwotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7Ci0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7Ci0KLSAgICAvLwotICAgIC8vIEhlbHBlcnMgZm9yIHRoZSBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGltcGxlbWVudGF0aW9uLgotICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0Ci0gICAgLy8gYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBwb2xpY3kgc2VydmljZS4KLSAgICAvLwotICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7Ci0gICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotCi1wcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Qb2xpY3lTZXJ2aWNlKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGR1bXBJbnRlcm5hbHMoaW50IGZkKTsKLQotICAgIC8vIFRocmVhZCB1c2VkIGZvciB0b25lIHBsYXliYWNrIGFuZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCi0gICAgLy8gRm9yIHRvbmUgcGxheWJhY2ssIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jayB3aXRoIG1Mb2NrIGJlY2F1c2UKLSAgICAvLyBzdGFydFRvbmUoKSBhbmQgc3RvcFRvbmUoKSBhcmUgbm9ybWFsbHkgY2FsbGVkIHdpdGggbUxvY2sgbG9ja2VkIGFuZCByZXF1ZXN0aW5nIGEgdG9uZSBzdGFydAotICAgIC8vIG9yIHN0b3Agd2lsbCBjYXVzZSBjYWxscyB0byBBdWRpb1BvbGljeVNlcnZpY2UgYW5kIGFuIGF0dGVtcHQgdG8gbG9jayBtTG9jay4KLSAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKLSAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCi0gICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZDsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgLy8gY29tbWFuZHMgZm9yIHRvbmUgQXVkaW9Db21tYW5kCi0gICAgICAgIGVudW0gewotICAgICAgICAgICAgU1RBUlRfVE9ORSwKLSAgICAgICAgICAgIFNUT1BfVE9ORSwKLSAgICAgICAgICAgIFNFVF9WT0xVTUUsCi0gICAgICAgICAgICBTRVRfUEFSQU1FVEVSUywKLSAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUsCi0gICAgICAgICAgICBTVE9QX09VVFBVVCwKLSAgICAgICAgICAgIFJFTEVBU0VfT1VUUFVUCi0gICAgICAgIH07Ci0KLSAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb0NvbW1hbmRUaHJlYWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLSAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLQotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgcmVxdWVzdGVkIHRvbmUgcGxheWJhY2sgZXZlbnQKLSAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kIHsKLQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb0NvbW1hbmQoKQotICAgICAgICAgICAgOiBtQ29tbWFuZCgtMSkge30KLQotICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgotICAgICAgICAgICAgbnNlY3NfdCBtVGltZTsgIC8vIHRpbWUgc3RhbXAKLSAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCi0gICAgICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBjb21tYW5kIHN0YXR1cwotICAgICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBjYWxsZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCi0gICAgICAgICAgICB2b2lkICptUGFyYW07ICAgICAvLyBjb21tYW5kIHBhcmFtZXRlciAoVG9uZURhdGEsIFZvbHVtZURhdGEsIFBhcmFtZXRlcnNEYXRhKQotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIFRvbmVEYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBQYXJhbWV0ZXJzRGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIFN0cmluZzggbUtleVZhbHVlUGFpcnM7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgVm9pY2VWb2x1bWVEYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBTdG9wT3V0cHV0RGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGludCBtU2Vzc2lvbjsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgfTsKLQotICAgICAgICBNdXRleCAgIG1Mb2NrOwotICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7Ci0gICAgICAgIFZlY3RvciA8QXVkaW9Db21tYW5kICo+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKLSAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCi0gICAgICAgIEF1ZGlvQ29tbWFuZCBtTGFzdENvbW1hbmQ7ICAgICAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKLSAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKLSAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKLSAgICB9OwotCi0gICAgY2xhc3MgRWZmZWN0RGVzYyB7Ci0gICAgcHVibGljOgotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChuYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSB7IH0KLSAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBFZmZlY3REZXNjJiBvcmlnKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAob3JpZy5tTmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQob3JpZy5tVXVpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHNpemUgYW5kIHZzaXplIGFyZSByb3VuZGVkIHVwIHRvIGFuIGludCBib3VuZGFyeSBmb3IgYWxsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3JpZ1NpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmlnUGFyYW0tPnBzaXplICsgMykgJiB+MykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yaWdQYXJhbS0+dnNpemUgKyAzKSAmIH4zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmR1cFBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhvcmlnU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkdXBQYXJhbSwgb3JpZ1BhcmFtLCBvcmlnU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgcGFyYW0gYnVmZmVyIGFsbG9jYXRpb24gaXMgYWxzbyBkb25lIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlcyBvZiA0IGJ5dGVzIG9yaWdpbmFsbHkuIEluIHRoZW9yeSB3ZSBzaG91bGQgbWVtY3B5IG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBwYXJhbSBzaXplLCB0aGF0IGlzIHdpdGhvdXQgcm91bmRpbmcgdnNpemUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbXMuYWRkKGR1cFBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5FZmZlY3REZXNjKCkgewotICAgICAgICAgICAgZnJlZShtTmFtZSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1QYXJhbXNba10pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNoYXIgKm1OYW1lOwotICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOwotICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7Ci0gICAgfTsKLQotICAgIGNsYXNzIElucHV0U291cmNlRGVzYyB7Ci0gICAgcHVibGljOgotICAgICAgICBJbnB1dFNvdXJjZURlc2MoKSB7fQotICAgICAgICAvKnZpcnR1YWwqLyB+SW5wdXRTb3VyY2VEZXNjKCkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtRWZmZWN0cy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtRWZmZWN0c1tqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gbUVmZmVjdHM7Ci0gICAgfTsKLQotCi0gICAgY2xhc3MgSW5wdXREZXNjIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIElucHV0RGVzYyhpbnQgc2Vzc2lvbikgOiBtU2Vzc2lvbklkKHNlc3Npb24pIHt9Ci0gICAgICAgIC8qdmlydHVhbCovIH5JbnB1dERlc2MoKSB7fQotICAgICAgICBjb25zdCBpbnQgbVNlc3Npb25JZDsKLSAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPm1FZmZlY3RzOwotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdOwotCi0gICAgdm9pZCBzZXRQcmVQcm9jZXNzb3JFbmFibGVkKGNvbnN0IElucHV0RGVzYyAqaW5wdXREZXNjLCBib29sIGVuYWJsZWQpOwotICAgIHN0YXR1c190IGxvYWRQcmVQcm9jZXNzb3JDb25maWcoY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgc3RhdHVzX3QgbG9hZEVmZmVjdHMoY25vZGUgKnJvb3QsIFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7Ci0gICAgRWZmZWN0RGVzYyAqbG9hZEVmZmVjdChjbm9kZSAqcm9vdCk7Ci0gICAgc3RhdHVzX3QgbG9hZElucHV0U291cmNlcyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSk7Ci0gICAgSW5wdXRTb3VyY2VEZXNjICpsb2FkSW5wdXRTb3VyY2UoY25vZGUgKnJvb3QsIGNvbnN0IFZlY3RvciA8RWZmZWN0RGVzYyAqPiYgZWZmZWN0cyk7Ci0gICAgdm9pZCBsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKTsKLSAgICBlZmZlY3RfcGFyYW1fdCAqbG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCk7Ci0gICAgc2l6ZV90IHJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpOwotICAgIHNpemVfdCBncm93UGFyYW1TaXplKGNoYXIgKnBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpOwotCi0gICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCi0gICAgc3RhdHVzX3QgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKTsKLQotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsgICAgLy8gcHJldmVudHMgY29uY3VycmVudCBhY2Nlc3MgdG8gQXVkaW9Qb2xpY3kgbWFuYWdlciBmdW5jdGlvbnMgY2hhbmdpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSAgb3Igcm91dGluZwotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgIC8vIGF1ZGlvIGNvbW1hbmRzIHRocmVhZAotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCi0gICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtT3V0cHV0Q29tbWFuZFRocmVhZDsgICAgLy8gcHJvY2VzcyBzdG9wIGFuZCByZWxlYXNlIG91dHB1dAotICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfZGV2aWNlICptcEF1ZGlvUG9saWN5RGV2OwotICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKm1wQXVkaW9Qb2xpY3k7Ci0gICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3NvdXJjZV90LCBJbnB1dFNvdXJjZURlc2MqID4gbUlucHV0U291cmNlczsKLSAgICBLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIElucHV0RGVzYyogPiBtSW5wdXRzOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCmluZGV4IDJjM2M3MTkuLjFmN2E2MTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcApAQCAtMjIsOSArMjIsMTEgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmMuaCIKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckN1YmljLmgiCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJEeW4uaCIKIAogI2lmZGVmIF9fYXJtX18KICNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgpAQCAtMzksOCArNDEsOCBAQAogCiBjbGFzcyBBdWRpb1Jlc2FtcGxlck9yZGVyMSA6IHB1YmxpYyBBdWRpb1Jlc2FtcGxlciB7CiBwdWJsaWM6Ci0gICAgQXVkaW9SZXNhbXBsZXJPcmRlcjEoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgotICAgICAgICBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIExPV19RVUFMSVRZKSwgbVgwTCgwKSwgbVgwUigwKSB7CisgICAgQXVkaW9SZXNhbXBsZXJPcmRlcjEoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKKyAgICAgICAgQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIExPV19RVUFMSVRZKSwgbVgwTCgwKSwgbVgwUigwKSB7CiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwpAQCAtNzcsNiArNzksOSBAQAogICAgIGludCBtWDBSOwogfTsKIAorLypzdGF0aWMqLworY29uc3QgZG91YmxlIEF1ZGlvUmVzYW1wbGVyOjprUGhhc2VNdWx0aXBsaWVyID0gMUwgPDwgQXVkaW9SZXNhbXBsZXI6OmtOdW1QaGFzZUJpdHM7CisKIGJvb2wgQXVkaW9SZXNhbXBsZXI6OnF1YWxpdHlJc1N1cHBvcnRlZChzcmNfcXVhbGl0eSBxdWFsaXR5KQogewogICAgIHN3aXRjaCAocXVhbGl0eSkgewpAQCAtODUsNiArOTAsOSBAQAogICAgIGNhc2UgTUVEX1FVQUxJVFk6CiAgICAgY2FzZSBISUdIX1FVQUxJVFk6CiAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKKyAgICBjYXNlIERZTl9MT1dfUVVBTElUWToKKyAgICBjYXNlIERZTl9NRURfUVVBTElUWToKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEwNSw3ICsxMTMsNyBAQAogICAgICAgICBpZiAoKmVuZHB0ciA9PSAnXDAnKSB7CiAgICAgICAgICAgICBkZWZhdWx0UXVhbGl0eSA9IChzcmNfcXVhbGl0eSkgbDsKICAgICAgICAgICAgIEFMT0dEKCJmb3JjaW5nIEF1ZGlvUmVzYW1wbGVyIHF1YWxpdHkgdG8gJWQiLCBkZWZhdWx0UXVhbGl0eSk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFF1YWxpdHkgPCBERUZBVUxUX1FVQUxJVFkgfHwgZGVmYXVsdFF1YWxpdHkgPiBWRVJZX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgaWYgKGRlZmF1bHRRdWFsaXR5IDwgREVGQVVMVF9RVUFMSVRZIHx8IGRlZmF1bHRRdWFsaXR5ID4gRFlOX0hJR0hfUVVBTElUWSkgewogICAgICAgICAgICAgICAgIGRlZmF1bHRRdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjUsNiArMTMzLDEyIEBACiAgICAgICAgIHJldHVybiAyMDsKICAgICBjYXNlIFZFUllfSElHSF9RVUFMSVRZOgogICAgICAgICByZXR1cm4gMzQ7CisgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgICAgIHJldHVybiA0OworICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgICAgICByZXR1cm4gNjsKKyAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgIHJldHVybiAxMjsKICAgICB9CiB9CiAKQEAgLTEzMiw3ICsxNDYsNyBAQAogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBtdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiBzdGF0aWMgdWludDMyX3QgY3VycmVudE1IeiA9IDA7CiAKLUF1ZGlvUmVzYW1wbGVyKiBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LAorQXVkaW9SZXNhbXBsZXIqIEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgaW5DaGFubmVsQ291bnQsCiAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSkgewogCiAgICAgYm9vbCBhdEZpbmFsUXVhbGl0eTsKQEAgLTE0OCw2ICsxNjIsMTYgQEAKICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOwogICAgIH0KIAorICAgIC8qIGlmIHRoZSBjYWxsZXIgcmVxdWVzdHMgREVGQVVMVF9RVUFMSVRZIGFuZCBhZi5yZXNhbXBsZXIucHJvcGVydHkKKyAgICAgKiBoYXMgbm90IGJlZW4gc2V0LCB0aGUgdGFyZ2V0IHJlc2FtcGxlciBxdWFsaXR5IGlzIHNldCB0byBEWU5fTUVEX1FVQUxJVFksCisgICAgICogYW5kIGFsbG93ZWQgdG8gInRocm90dGxlIiBkb3duIHRvIERZTl9MT1dfUVVBTElUWSBpZiBuZWNlc3NhcnkKKyAgICAgKiBkdWUgdG8gZXN0aW1hdGVkIENQVSBsb2FkIG9mIGhhdmluZyB0b28gbWFueSBhY3RpdmUgcmVzYW1wbGVycworICAgICAqICh0aGUgY29kZSBiZWxvdyB0aGUgaWYpLgorICAgICAqLworICAgIGlmIChxdWFsaXR5ID09IERFRkFVTFRfUVVBTElUWSkgeworICAgICAgICBxdWFsaXR5ID0gRFlOX01FRF9RVUFMSVRZOworICAgIH0KKwogICAgIC8vIG5haXZlIGltcGxlbWVudGF0aW9uIG9mIENQVSBsb2FkIHRocm90dGxpbmcgZG9lc24ndCBhY2NvdW50IGZvciB3aGV0aGVyIHJlc2FtcGxlciBpcyBhY3RpdmUKICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgICBmb3IgKDs7KSB7CkBAIC0xNjIsNyArMTg2LDYgQEAKICAgICAgICAgLy8gbm90IGVub3VnaCBDUFUgYXZhaWxhYmxlIGZvciBwcm9wb3NlZCBxdWFsaXR5IGxldmVsLCBzbyB0cnkgbmV4dCBsb3dlc3QgbGV2ZWwKICAgICAgICAgc3dpdGNoIChxdWFsaXR5KSB7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgREVGQVVMVF9RVUFMSVRZOgogICAgICAgICBjYXNlIExPV19RVUFMSVRZOgogICAgICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzUsNiArMTk4LDE1IEBACiAgICAgICAgIGNhc2UgVkVSWV9ISUdIX1FVQUxJVFk6CiAgICAgICAgICAgICBxdWFsaXR5ID0gSElHSF9RVUFMSVRZOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX0xPV19RVUFMSVRZOgorICAgICAgICAgICAgYXRGaW5hbFF1YWxpdHkgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFlOX01FRF9RVUFMSVRZOgorICAgICAgICAgICAgcXVhbGl0eSA9IERZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERZTl9ISUdIX1FVQUxJVFk6CisgICAgICAgICAgICBxdWFsaXR5ID0gRFlOX01FRF9RVUFMSVRZOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKQEAgLTE4MywyMiArMjE1LDQzIEBACiAKICAgICBzd2l0Y2ggKHF1YWxpdHkpIHsKICAgICBkZWZhdWx0OgotICAgIGNhc2UgREVGQVVMVF9RVUFMSVRZOgogICAgIGNhc2UgTE9XX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgbGluZWFyIFJlc2FtcGxlciIpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJPcmRlcjEoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJPcmRlcjEoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FRF9RVUFMSVRZOgogICAgICAgICBBTE9HVigiQ3JlYXRlIGN1YmljIFJlc2FtcGxlciIpOwotICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJDdWJpYyhiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7CisgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckN1YmljKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBISUdIX1FVQUxJVFk6CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgSElHSF9RVUFMSVRZIHNpbmMgUmVzYW1wbGVyIik7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBWRVJZX0hJR0hfUVVBTElUWToKICAgICAgICAgQUxPR1YoIkNyZWF0ZSBWRVJZX0hJR0hfUVVBTElUWSBzaW5jIFJlc2FtcGxlciA9ICVkIiwgcXVhbGl0eSk7Ci0gICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlclNpbmMoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJTaW5jKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEWU5fTE9XX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fTUVEX1FVQUxJVFk6CisgICAgY2FzZSBEWU5fSElHSF9RVUFMSVRZOgorICAgICAgICBBTE9HVigiQ3JlYXRlIGR5bmFtaWMgUmVzYW1wbGVyID0gJWQiLCBxdWFsaXR5KTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJEeW48ZmxvYXQsIGZsb2F0LCBmbG9hdD4oaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICAgICAgaWYgKHF1YWxpdHkgPT0gRFlOX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgICAgIHJlc2FtcGxlciA9IG5ldyBBdWRpb1Jlc2FtcGxlckR5bjxpbnQzMl90LCBpbnQxNl90LCBpbnQzMl90PihpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNhbXBsZXIgPSBuZXcgQXVkaW9SZXNhbXBsZXJEeW48aW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD4oaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBxdWFsaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTIwNywyNiArMjYwLDI2IEBACiAgICAgcmV0dXJuIHJlc2FtcGxlcjsKIH0KIAotQXVkaW9SZXNhbXBsZXI6OkF1ZGlvUmVzYW1wbGVyKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LAorQXVkaW9SZXNhbXBsZXI6OkF1ZGlvUmVzYW1wbGVyKGludCBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KSA6Ci0gICAgbUJpdERlcHRoKGJpdERlcHRoKSwgbUNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUluU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUlucHV0SW5kZXgoMCksCi0gICAgICAgICAgICBtUGhhc2VGcmFjdGlvbigwKSwgbUxvY2FsVGltZUZyZXEoMCksCi0gICAgICAgICAgICBtUFRTKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKSwgbVF1YWxpdHkocXVhbGl0eSkgewotICAgIC8vIHNhbml0eSBjaGVjayBvbiBmb3JtYXQKLSAgICBpZiAoKGJpdERlcHRoICE9IDE2KSB8fChpbkNoYW5uZWxDb3VudCA8IDEpIHx8IChpbkNoYW5uZWxDb3VudCA+IDIpKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0LCAlZCBiaXRzLCAlZCBjaGFubmVscyIsIGJpdERlcHRoLAotICAgICAgICAgICAgICAgIGluQ2hhbm5lbENvdW50KTsKLSAgICAgICAgLy8gQUxPR19BU1NFUlQoMCk7CisgICAgICAgIG1DaGFubmVsQ291bnQoaW5DaGFubmVsQ291bnQpLAorICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUluU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwgbUlucHV0SW5kZXgoMCksCisgICAgICAgIG1QaGFzZUZyYWN0aW9uKDApLCBtTG9jYWxUaW1lRnJlcSgwKSwKKyAgICAgICAgbVBUUyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyksIG1RdWFsaXR5KHF1YWxpdHkpIHsKKworICAgIGNvbnN0IGludCBtYXhDaGFubmVscyA9IHF1YWxpdHkgPCBEWU5fTE9XX1FVQUxJVFkgPyAyIDogODsKKyAgICBpZiAoaW5DaGFubmVsQ291bnQgPCAxCisgICAgICAgICAgICB8fCBpbkNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQgJWQgcXVhbGl0eSAlZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgcXVhbGl0eSwgaW5DaGFubmVsQ291bnQpOwogICAgIH0KICAgICBpZiAoc2FtcGxlUmF0ZSA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZCBIeiIsIHNhbXBsZVJhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZCBIeiIsIHNhbXBsZVJhdGUpOwogICAgIH0KIAogICAgIC8vIGluaXRpYWxpemUgY29tbW9uIG1lbWJlcnMKICAgICBtVm9sdW1lWzBdID0gbVZvbHVtZVsxXSA9IDA7CiAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLQogfQogCiBBdWRpb1Jlc2FtcGxlcjo6fkF1ZGlvUmVzYW1wbGVyKCkgewpAQCAtMjQ2LDEwICsyOTksMTIgQEAKICAgICBtUGhhc2VJbmNyZW1lbnQgPSAodWludDMyX3QpKChrUGhhc2VNdWx0aXBsaWVyICogaW5TYW1wbGVSYXRlKSAvIG1TYW1wbGVSYXRlKTsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGludDE2X3QgbGVmdCwgaW50MTZfdCByaWdodCkgewordm9pZCBBdWRpb1Jlc2FtcGxlcjo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CiAgICAgLy8gVE9ETzogSW1wbGVtZW50IGFudGktemlwcGVyIGZpbHRlcgotICAgIG1Wb2x1bWVbMF0gPSBsZWZ0OwotICAgIG1Wb2x1bWVbMV0gPSByaWdodDsKKyAgICAvLyBjb252ZXJ0IHRvIFU0LjEyIGZvciBpbnRlcm5hbCBpbnRlZ2VyIHVzZSAocm91bmQgZG93bikKKyAgICAvLyBpbnRlZ2VyIHZvbHVtZSB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gMCB0byBVTklUWV9HQUlOLgorICAgIG1Wb2x1bWVbMF0gPSB1NF8xMl9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wobGVmdCkpOworICAgIG1Wb2x1bWVbMV0gPSB1NF8xMl9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wocmlnaHQpKTsKIH0KIAogdm9pZCBBdWRpb1Jlc2FtcGxlcjo6c2V0TG9jYWxUaW1lRnJlcSh1aW50NjRfdCBmcmVxKSB7CkBAIC0zMDUsNyArMzYwLDcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBBTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZCIsCiAgICAgLy8gICAgICBvdXRGcmFtZUNvdW50LCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CkBAIC0zMzksOCArMzk0LDkgQEAKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIEludGVycChtWDBMLCBpblswXSwgcGhhc2VGcmFjdGlvbik7CiAgICAgICAgICAgICBvdXRbb3V0cHV0SW5kZXgrK10gKz0gdnIgKiBJbnRlcnAobVgwUiwgaW5bMV0sIHBoYXNlRnJhY3Rpb24pOwogICAgICAgICAgICAgQWR2YW5jZSgmaW5wdXRJbmRleCwgJnBoYXNlRnJhY3Rpb24sIHBoYXNlSW5jcmVtZW50KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PSBvdXRwdXRTYW1wbGVDb3VudCkgewogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gcHJvY2VzcyBpbnB1dCBzYW1wbGVzCkBAIC00MDIsNyArNDU4LDcgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBBTE9HRSgic3RhcnRpbmcgcmVzYW1wbGUgJWQgZnJhbWVzLCBpbnB1dEluZGV4PSVkLCBwaGFzZUZyYWN0aW9uPSVkLCBwaGFzZUluY3JlbWVudD0lZCIsCiAgICAgLy8gICAgICBvdXRGcmFtZUNvdW50LCBpbnB1dEluZGV4LCBwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7CkBAIC00MzQsOCArNDkwLDkgQEAKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2bCAqIHNhbXBsZTsKICAgICAgICAgICAgIG91dFtvdXRwdXRJbmRleCsrXSArPSB2ciAqIHNhbXBsZTsKICAgICAgICAgICAgIEFkdmFuY2UoJmlucHV0SW5kZXgsICZwaGFzZUZyYWN0aW9uLCBwaGFzZUluY3JlbWVudCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpCisgICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gb3V0cHV0U2FtcGxlQ291bnQpIHsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIHByb2Nlc3MgaW5wdXQgc2FtcGxlcwpAQCAtNTE0LDYgKzU3MSwxNiBAQAogICAgICAgICAgICAgc2l6ZV90ICZvdXRwdXRJbmRleCwgaW50MzJfdCogb3V0LCBzaXplX3QgJmlucHV0SW5kZXgsIGludDMyX3QgdmwsIGludDMyX3QgdnIsCiAgICAgICAgICAgICB1aW50MzJfdCAmcGhhc2VGcmFjdGlvbiwgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQpCiB7CisgICAgKHZvaWQpbWF4T3V0UHQ7IC8vIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyIHdhcm5pbmdzCisgICAgKHZvaWQpbWF4SW5JZHg7CisgICAgKHZvaWQpb3V0cHV0SW5kZXg7CisgICAgKHZvaWQpb3V0OworICAgICh2b2lkKWlucHV0SW5kZXg7CisgICAgKHZvaWQpdmw7CisgICAgKHZvaWQpdnI7CisgICAgKHZvaWQpcGhhc2VGcmFjdGlvbjsKKyAgICAodm9pZClwaGFzZUluY3JlbWVudDsKKyAgICAodm9pZClpbjsKICNkZWZpbmUgTU9fUEFSQU01ICAgIjM2IiAgICAgICAgLy8gb2Zmc2V0IG9mIHBhcmFtZXRlciA1IChvdXRwdXRJbmRleCkKIAogICAgIGFzbSgKQEAgLTUyNiw3ICs1OTMsNyBAQAogICAgICAgICAiICAgbGRyIHI4LCBbc3AsICMiIE1PX1BBUkFNNSAiICsgNF1cbiIgICAgIC8vIG91dAogICAgICAgICAiICAgbGRyIHIwLCBbc3AsICMiIE1PX1BBUkFNNSAiICsgMF1cbiIgICAgIC8vICZvdXRwdXRJbmRleAogICAgICAgICAiICAgbGRyIHIwLCBbcjBdXG4iICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dEluZGV4Ci0gICAgICAgICIgICBhZGQgcjgsIHIwLCBhc2wgIzJcbiIgICAgICAgICAgICAgICAgICAgLy8gY3VyT3V0CisgICAgICAgICIgICBhZGQgcjgsIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgLy8gY3VyT3V0CiAgICAgICAgICIgICBsZHIgcjksIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAyNF1cbiIgICAgLy8gcGhhc2VJbmNyZW1lbnQKICAgICAgICAgIiAgIGxkciByMTAsIFtzcCwgIyIgTU9fUEFSQU01ICIgKyAxMl1cbiIgICAvLyB2bAogICAgICAgICAiICAgbGRyIHIxMSwgW3NwLCAjIiBNT19QQVJBTTUgIiArIDE2XVxuIiAgIC8vIHZyCkBAIC02MjUsNiArNjkyLDE2IEBACiAgICAgICAgICAgICBzaXplX3QgJm91dHB1dEluZGV4LCBpbnQzMl90KiBvdXQsIHNpemVfdCAmaW5wdXRJbmRleCwgaW50MzJfdCB2bCwgaW50MzJfdCB2ciwKICAgICAgICAgICAgIHVpbnQzMl90ICZwaGFzZUZyYWN0aW9uLCB1aW50MzJfdCBwaGFzZUluY3JlbWVudCkKIHsKKyAgICAodm9pZCltYXhPdXRQdDsgLy8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZ3MKKyAgICAodm9pZCltYXhJbklkeDsKKyAgICAodm9pZClvdXRwdXRJbmRleDsKKyAgICAodm9pZClvdXQ7CisgICAgKHZvaWQpaW5wdXRJbmRleDsKKyAgICAodm9pZCl2bDsKKyAgICAodm9pZCl2cjsKKyAgICAodm9pZClwaGFzZUZyYWN0aW9uOworICAgICh2b2lkKXBoYXNlSW5jcmVtZW50OworICAgICh2b2lkKWluOwogI2RlZmluZSBTVF9QQVJBTTUgICAgIjQwIiAgICAgLy8gb2Zmc2V0IG9mIHBhcmFtZXRlciA1IChvdXRwdXRJbmRleCkKICAgICBhc20oCiAgICAgICAgICJzdG1mZCAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgbHJ9XG4iCkBAIC02MzYsNyArNzEzLDcgQEAKICAgICAgICAgIiAgIGxkciByOCwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDRdXG4iICAgICAvLyBvdXQKICAgICAgICAgIiAgIGxkciByMCwgW3NwLCAjIiBTVF9QQVJBTTUgIiArIDBdXG4iICAgICAvLyAmb3V0cHV0SW5kZXgKICAgICAgICAgIiAgIGxkciByMCwgW3IwXVxuIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRJbmRleAotICAgICAgICAiICAgYWRkIHI4LCByMCwgYXNsICMyXG4iICAgICAgICAgICAgICAgICAgIC8vIGN1ck91dAorICAgICAgICAiICAgYWRkIHI4LCByOCwgcjAsIGFzbCAjMlxuIiAgICAgICAgICAgICAgIC8vIGN1ck91dAogICAgICAgICAiICAgbGRyIHI5LCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMjRdXG4iICAgIC8vIHBoYXNlSW5jcmVtZW50CiAgICAgICAgICIgICBsZHIgcjEwLCBbc3AsICMiIFNUX1BBUkFNNSAiICsgMTJdXG4iICAgLy8gdmwKICAgICAgICAgIiAgIGxkciByMTEsIFtzcCwgIyIgU1RfUEFSQU01ICIgKyAxNl1cbiIgICAvLyB2cgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAppbmRleCAzM2U2NGNlLi5jZGM2ZDkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MSwxNiArNDIsMjEgQEAKICAgICAgICAgTUVEX1FVQUxJVFk9MiwKICAgICAgICAgSElHSF9RVUFMSVRZPTMsCiAgICAgICAgIFZFUllfSElHSF9RVUFMSVRZPTQsCisgICAgICAgIERZTl9MT1dfUVVBTElUWT01LAorICAgICAgICBEWU5fTUVEX1FVQUxJVFk9NiwKKyAgICAgICAgRFlOX0hJR0hfUVVBTElUWT03LAogICAgIH07CiAKLSAgICBzdGF0aWMgQXVkaW9SZXNhbXBsZXIqIGNyZWF0ZShpbnQgYml0RGVwdGgsIGludCBpbkNoYW5uZWxDb3VudCwKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CisKKyAgICBzdGF0aWMgQXVkaW9SZXNhbXBsZXIqIGNyZWF0ZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBpbkNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eT1ERUZBVUxUX1FVQUxJVFkpOwogCiAgICAgdmlydHVhbCB+QXVkaW9SZXNhbXBsZXIoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBpbml0KCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3QgaW5TYW1wbGVSYXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGludDE2X3QgbGVmdCwgaW50MTZfdCByaWdodCk7CisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgdmlydHVhbCB2b2lkIHNldExvY2FsVGltZUZyZXEodWludDY0X3QgZnJlcSk7CiAKICAgICAvLyBzZXQgdGhlIFBUUyBvZiB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGJ5IHRoZSByZXNhbXBsZXIKQEAgLTYwLDcgKzY2LDcgQEAKICAgICAvLyBBIG1vbm8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBzYW1wbGVzLgogICAgIC8vIEEgc3RlcmVvIHByb3ZpZGVyIGRlbGl2ZXJzIGEgc2VxdWVuY2Ugb2YgaW50ZXJsZWF2ZWQgcGFpcnMgb2Ygc2FtcGxlcy4KICAgICAvLyBNdWx0aS1jaGFubmVsIHByb3ZpZGVycyBhcmUgbm90IHN1cHBvcnRlZC4KLSAgICAvLyBJbiBlaXRoZXIgY2FzZSwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZml4ZWQtcG9pbnQgc2lnbmVkIFExOS4xMi4KKyAgICAvLyBJbiBlaXRoZXIgY2FzZSwgJ291dCcgaG9sZHMgaW50ZXJsZWF2ZWQgcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcuCiAgICAgLy8gVGhhdCBpcywgZm9yIGEgbW9ubyBwcm92aWRlciwgdGhlcmUgaXMgYW4gaW1wbGljaXQgdXAtY2hhbm5lbGluZy4KICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBhY2N1bXVsYXRlcywgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xlYXJpbmcgJ291dCcgaW5pdGlhbGx5LgogICAgIC8vIEZJWE1FIGFzc3VtZXMgcHJvdmlkZXIgaXMgYWx3YXlzIHN1Y2Nlc3NmdWw7IGl0IHNob3VsZCByZXR1cm4gdGhlIGFjdHVhbCBmcmFtZSBjb3VudC4KQEAgLTgxLDkgKzg3LDkgQEAKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1BoYXNlTWFzayA9ICgxTFU8PGtOdW1QaGFzZUJpdHMpLTE7CiAKICAgICAvLyBtdWx0aXBsaWVyIHRvIGNhbGN1bGF0ZSBmaXhlZCBwb2ludCBwaGFzZSBpbmNyZW1lbnQKLSAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtQaGFzZU11bHRpcGxpZXIgPSAxTCA8PCBrTnVtUGhhc2VCaXRzOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUga1BoYXNlTXVsdGlwbGllcjsKIAotICAgIEF1ZGlvUmVzYW1wbGVyKGludCBiaXREZXB0aCwgaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsIHNyY19xdWFsaXR5IHF1YWxpdHkpOworICAgIEF1ZGlvUmVzYW1wbGVyKGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KTsKIAogICAgIC8vIHByZXZlbnQgY29weWluZwogICAgIEF1ZGlvUmVzYW1wbGVyKGNvbnN0IEF1ZGlvUmVzYW1wbGVyJik7CkBAIC05MSw3ICs5Nyw2IEBACiAKICAgICBpbnQ2NF90IGNhbGN1bGF0ZU91dHB1dFBUUyhpbnQgb3V0cHV0RnJhbWVJbmRleCk7CiAKLSAgICBjb25zdCBpbnQzMl90IG1CaXREZXB0aDsKICAgICBjb25zdCBpbnQzMl90IG1DaGFubmVsQ291bnQ7CiAgICAgY29uc3QgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1JblNhbXBsZVJhdGU7CkBAIC0xMDcsNiArMTEyLDQ3IEBACiAgICAgdWludDY0X3QgbUxvY2FsVGltZUZyZXE7CiAgICAgaW50NjRfdCBtUFRTOwogCisgICAgLy8gcmV0dXJucyB0aGUgaW5GcmFtZUNvdW50IHJlcXVpcmVkIHRvIGdlbmVyYXRlIG91dEZyYW1lQ291bnQgZnJhbWVzLgorICAgIC8vCisgICAgLy8gUGxhY2VkIGhlcmUgdG8gYmUgYSBjb25zaXN0ZW50IGZvciBhbGwgcmVzYW1wbGVycy4KKyAgICAvLworICAgIC8vIFJpZ2h0IG5vdywgd2UgdXNlIHRoZSB1cHBlciBib3VuZCB3aXRob3V0IHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgICAgLy8gaW5wdXQgYnVmZmVyIHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYywgYXMgZm9sbG93czoKKyAgICAvLworICAgIC8vIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ob3V0RnJhbWVDb3VudCkqbUluU2FtcGxlUmF0ZSArIChtU2FtcGxlUmF0ZSAtIDEpKS9tU2FtcGxlUmF0ZTsKKyAgICAvLworICAgIC8vIFRoZSBkb3VibGUgcHJlY2lzaW9uIGVxdWl2YWxlbnQgKGZsb2F0IG1heSBub3QgYmUgcHJlY2lzZSBlbm91Z2gpOgorICAgIC8vIGNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihvdXRGcmFtZUNvdW50KSAqIG1JblNhbXBsZVJhdGUgLyBtU2FtcGxlUmF0ZSk7CisgICAgLy8KKyAgICAvLyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBtUGhhc2VJbmNyZW1lbnQgaXMgcm91bmRlZCBkb3duIGZyb20KKyAgICAvLyAjcGhhc2VzICogbUluU2FtcGxlUmF0ZS9tU2FtcGxlUmF0ZSBhbmQgdGhlIGZhY3QgdGhhdCBTdW0oRmxvb3IoeCkpIDw9IEZsb29yKFN1bSh4KSkuCisgICAgLy8gaHR0cDovL3d3dy5wcm9vZndpa2kub3JnL3dpa2kvU3VtX29mX0Zsb29yc19Ob3RfR3JlYXRlcl9UaGFuX0Zsb29yX29mX1N1bXMKKyAgICAvLworICAgIC8vIChzbyBsb25nIGFzIGRvdWJsZSBwcmVjaXNpb24gaXMgY29tcHV0ZWQgYWNjdXJhdGVseSBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZAorICAgIC8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgRmxvb3IoeCkgdmFsdWUgaW4gaW50MzJfdCBhcml0aG1ldGljOyB0aHVzIHRoaXMKKyAgICAvLyB3aWxsIG5vdCBuZWNlc3NhcmlseSBob2xkIGZvciBmbG9hdHMpLgorICAgIC8vCisgICAgLy8gVE9ETzoKKyAgICAvLyBHcmVhdGVyIGFjY3VyYWN5IGFuZCBhIHRpZ2h0IGJvdW5kIGlzIG9idGFpbmVkIGJ5OgorICAgIC8vIDEpIHN1YnRyYWN0IGFuZCBhZGp1c3QgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyIGJ1ZmZlci4KKyAgICAvLyAyKSB1c2luZyB0aGUgZXhhY3QgaW50ZWdlciBmb3JtdWxhIHdoZXJlIChpZ25vcmluZyA2NGIgY2FzdGluZykKKyAgICAvLyAgaW5GcmFtZUNvdW50ID0gKG1QaGFzZUluY3JlbWVudCAqIChvdXRGcmFtZUNvdW50IC0gMSkgKyBtUGhhc2VGcmFjdGlvbikgLyBwaGFzZVdyYXBMaW1pdDsKKyAgICAvLyAgcGhhc2VXcmFwTGltaXQgaXMgdGhlIHdyYXBhcm91bmQgKDEgPDwga051bVBoYXNlQml0cyksIGlmIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseS4KKyAgICAvLworICAgIGlubGluZSBzaXplX3QgZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQoc2l6ZV90IG91dEZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4ob3V0RnJhbWVDb3VudCkqbUluU2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICsgKG1TYW1wbGVSYXRlIC0gMSkpL21TYW1wbGVSYXRlOworICAgIH0KKworICAgIGlubGluZSBmbG9hdCBjbGFtcEZsb2F0Vm9sKGZsb2F0IHZvbHVtZSkgeworICAgICAgICBpZiAodm9sdW1lID4gVU5JVFlfR0FJTl9GTE9BVCkgeworICAgICAgICAgICAgcmV0dXJuIFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIH0gZWxzZSBpZiAodm9sdW1lID49IDAuKSB7CisgICAgICAgICAgICByZXR1cm4gdm9sdW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwLjsgIC8vIE5hTiBvciBuZWdhdGl2ZSB2b2x1bWUgbWFwcyB0byAwLgorICAgIH0KKwogcHJpdmF0ZToKICAgICBjb25zdCBzcmNfcXVhbGl0eSBtUXVhbGl0eTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCmluZGV4IDE4ZTU5ZTkuLjhmMTRmZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKQEAgLTYwLDE0ICs2MCwxNSBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIC8vIGZldGNoIGZpcnN0IGJ1ZmZlcgogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CiAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBtUFRTKTsKLSAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkbiIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KICAgICBpbnQxNl90ICppbiA9IG1CdWZmZXIuaTE2OwpAQCAtOTcsOCArOTgsOSBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVPdXRwdXRQVFMob3V0cHV0SW5kZXggLyAyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKG1CdWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBzYXZlX3N0YXRlOyAgLy8gdWdseSwgYnV0IGVmZmljaWVudAorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbiA9IG1CdWZmZXIuaTE2OwogICAgICAgICAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZCIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICAgICAgfQpAQCAtMTI2LDE0ICsxMjgsMTUgQEAKICAgICB1aW50MzJfdCBwaGFzZUluY3JlbWVudCA9IG1QaGFzZUluY3JlbWVudDsKICAgICBzaXplX3Qgb3V0cHV0SW5kZXggPSAwOwogICAgIHNpemVfdCBvdXRwdXRTYW1wbGVDb3VudCA9IG91dEZyYW1lQ291bnQgKiAyOwotICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSAob3V0RnJhbWVDb3VudCptSW5TYW1wbGVSYXRlKS9tU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gZ2V0SW5GcmFtZUNvdW50UmVxdWlyZWQob3V0RnJhbWVDb3VudCk7CiAKICAgICAvLyBmZXRjaCBmaXJzdCBidWZmZXIKICAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgbVBUUyk7Ci0gICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKQorICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZCIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KICAgICBpbnQxNl90ICppbiA9IG1CdWZmZXIuaTE2OwpAQCAtMTYzLDggKzE2Niw5IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU91dHB1dFBUUyhvdXRwdXRJbmRleCAvIDIpKTsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBnb3RvIHNhdmVfc3RhdGU7ICAvLyB1Z2x5LCBidXQgZWZmaWNpZW50CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEFMT0dXKCJOZXcgYnVmZmVyOiBvZmZzZXQ9JXAsIGZyYW1lcz0lZG4iLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBpbiA9IG1CdWZmZXIuaTE2OwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKaW5kZXggMjAzYjkzMy4uYjMxNWRhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCkBAIC0yOCw4ICsyOCw4IEBACiAKIGNsYXNzIEF1ZGlvUmVzYW1wbGVyQ3ViaWMgOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgewogcHVibGljOgotICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgotICAgICAgICBBdWRpb1Jlc2FtcGxlcihiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIE1FRF9RVUFMSVRZKSB7CisgICAgQXVkaW9SZXNhbXBsZXJDdWJpYyhpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgorICAgICAgICBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTUVEX1FVQUxJVFkpIHsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWViMjAxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcApAQCAtMCwwICsxLDYyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9SZXNhbXBsZXJEeW4iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpck9wcy5oIiAvLyBVU0VfTkVPTiBhbmQgVVNFX0lOTElORV9BU1NFTUJMWSBkZWZpbmVkIGhlcmUKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCIKKyNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgiCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCIgLy8gcmVxdWlyZXMgbWF0aC5oCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJEeW4uaCIKKworLy8jZGVmaW5lIERFQlVHX1JFU0FNUExFUgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBJbkJ1ZmZlciBpcyBhIHR5cGUgYWdub3N0aWMgaW5wdXQgYnVmZmVyLgorICoKKyAqIExheW91dCBvZiB0aGUgc3RhdGUgYnVmZmVyIGZvciBoYWxmTnVtQ29lZnM9OC4KKyAqCisgKiBbcnJycnJycHBwcHBwcHBubm5ubm5ubnJycnJycnJycnJycnJycnJycnIuLi4uIHJycnJycnJdCisgKiAgUyAgICAgICAgICAgIEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIKKyAqCisgKiBTID0gbVN0YXRlCisgKiBJID0gbUltcHVsc2UKKyAqIFIgPSBtUmluZ0Z1bGwKKyAqIHAgPSBwYXN0IHNhbXBsZXMsIGNvbnZvbHV0ZWQgd2l0aCB0aGUgKHApb3NpdGl2ZSBzaWRlIG9mIHNpbmMoKQorICogbiA9IGZ1dHVyZSBzYW1wbGVzLCBjb252b2x1dGVkIHdpdGggdGhlIChuKWVnYXRpdmUgc2lkZSBvZiBzaW5jKCkKKyAqIHIgPSBleHRyYSBzcGFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSByaW5nIGJ1ZmZlcgorICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OkluQnVmZmVyKCkKKyAgICA6IG1TdGF0ZShOVUxMKSwgbUltcHVsc2UoTlVMTCksIG1SaW5nRnVsbChOVUxMKSwgbVN0YXRlQ291bnQoMCkKK3sKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK0F1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6fkluQnVmZmVyKCkKK3sKKyAgICBpbml0KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6aW5pdCgpCit7CisgICAgZnJlZShtU3RhdGUpOworICAgIG1TdGF0ZSA9IE5VTEw7CisgICAgbUltcHVsc2UgPSBOVUxMOworICAgIG1SaW5nRnVsbCA9IE5VTEw7CisgICAgbVN0YXRlQ291bnQgPSAwOworfQorCisvLyByZXNpemVzIHRoZSBzdGF0ZSBidWZmZXIgdG8gYWNjb21tb2RhdGUgdGhlIGFwcHJvcHJpYXRlIGZpbHRlciBsZW5ndGgKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpJbkJ1ZmZlcjo6cmVzaXplKGludCBDSEFOTkVMUywgaW50IGhhbGZOdW1Db2VmcykKK3sKKyAgICAvLyBjYWxjdWxhdGUgZGVzaXJlZCBzdGF0ZSBzaXplCisgICAgc2l6ZV90IHN0YXRlQ291bnQgPSBoYWxmTnVtQ29lZnMgKiBDSEFOTkVMUyAqIDIgKiBrU3RhdGVTaXplTXVsdGlwbGVPZkZpbHRlckxlbmd0aDsKKworICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciBuZWVkcyByZXNpemluZworICAgIGlmIChtU3RhdGUKKyAgICAgICAgICAgICYmIHN0YXRlQ291bnQgPT0gbVN0YXRlQ291bnQKKyAgICAgICAgICAgICYmIG1SaW5nRnVsbC1tU3RhdGUgPT0gKHNzaXplX3QpIChtU3RhdGVDb3VudC1oYWxmTnVtQ29lZnMqQ0hBTk5FTFMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgbmV3IGJ1ZmZlcgorICAgIFRJKiBzdGF0ZSA9IE5VTEw7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24ocmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZzdGF0ZSksIDMyLCBzdGF0ZUNvdW50KnNpemVvZigqc3RhdGUpKTsKKyAgICBtZW1zZXQoc3RhdGUsIDAsIHN0YXRlQ291bnQqc2l6ZW9mKCpzdGF0ZSkpOworCisgICAgLy8gYXR0ZW1wdCB0byBwcmVzZXJ2ZSBzdGF0ZQorICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgVEkqIHNyY0xvID0gbUltcHVsc2UgLSBoYWxmTnVtQ29lZnMqQ0hBTk5FTFM7CisgICAgICAgIFRJKiBzcmNIaSA9IG1JbXB1bHNlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBUSSogZHN0ID0gc3RhdGU7CisKKyAgICAgICAgaWYgKHNyY0xvIDwgbVN0YXRlKSB7CisgICAgICAgICAgICBkc3QgKz0gbVN0YXRlLXNyY0xvOworICAgICAgICAgICAgc3JjTG8gPSBtU3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY0hpID4gbVN0YXRlICsgbVN0YXRlQ291bnQpIHsKKyAgICAgICAgICAgIHNyY0hpID0gbVN0YXRlICsgbVN0YXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTG8sIChzcmNIaSAtIHNyY0xvKSAqIHNpemVvZigqc3JjTG8pKTsKKyAgICAgICAgZnJlZShtU3RhdGUpOworICAgIH0KKworICAgIC8vIHNldCBjbGFzcyBtZW1iZXIgdmFycworICAgIG1TdGF0ZSA9IHN0YXRlOworICAgIG1TdGF0ZUNvdW50ID0gc3RhdGVDb3VudDsKKyAgICBtSW1wdWxzZSA9IHN0YXRlICsgaGFsZk51bUNvZWZzKkNIQU5ORUxTOyAvLyBhY3R1YWxseSBvbmUgc2FtcGxlIGdyZWF0ZXIgdGhhbiBuZWVkZWQKKyAgICBtUmluZ0Z1bGwgPSBzdGF0ZSArIG1TdGF0ZUNvdW50IC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTOworfQorCisvLyBjb3B5IGluIHRoZSBpbnB1dCBkYXRhIGludG8gdGhlIGhlYWQgKGltcHVsc2UraGFsZk51bUNvZWZzKSBvZiB0aGUgYnVmZmVyLgordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3RlbXBsYXRlPGludCBDSEFOTkVMUz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OkluQnVmZmVyOjpyZWFkQWdhaW4oVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICBjb25zdCBUSSogY29uc3QgaW4sIGNvbnN0IHNpemVfdCBpbnB1dEluZGV4KQoreworICAgIFRJKiBoZWFkID0gaW1wdWxzZSArIGhhbGZOdW1Db2VmcypDSEFOTkVMUzsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpPENIQU5ORUxTIDsgaSsrKSB7CisgICAgICAgIGhlYWRbaV0gPSBpbltpbnB1dEluZGV4KkNIQU5ORUxTICsgaV07CisgICAgfQorfQorCisvLyBhZHZhbmNlIHRoZSBpbXB1bHNlIHBvaW50ZXIsIGFuZCBsb2FkIGluIGRhdGEgaW50byB0aGUgaGVhZCAoaW1wdWxzZStoYWxmTnVtQ29lZnMpCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordGVtcGxhdGU8aW50IENIQU5ORUxTPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6SW5CdWZmZXI6OnJlYWRBZHZhbmNlKFRJKiYgaW1wdWxzZSwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywKKyAgICAgICAgY29uc3QgVEkqIGNvbnN0IGluLCBjb25zdCBzaXplX3QgaW5wdXRJbmRleCkKK3sKKyAgICBpbXB1bHNlICs9IENIQU5ORUxTOworCisgICAgaWYgKENDX1VOTElLRUxZKGltcHVsc2UgPj0gbVJpbmdGdWxsKSkgeworICAgICAgICBjb25zdCBzaXplX3Qgc2hpZnREb3duID0gbVJpbmdGdWxsIC0gbVN0YXRlIC0gaGFsZk51bUNvZWZzKkNIQU5ORUxTOworICAgICAgICBtZW1jcHkobVN0YXRlLCBtU3RhdGUrc2hpZnREb3duLCBoYWxmTnVtQ29lZnMqQ0hBTk5FTFMqMipzaXplb2YoVEkpKTsKKyAgICAgICAgaW1wdWxzZSAtPSBzaGlmdERvd247CisgICAgfQorICAgIHJlYWRBZ2FpbjxDSEFOTkVMUz4oaW1wdWxzZSwgaGFsZk51bUNvZWZzLCBpbiwgaW5wdXRJbmRleCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpDb25zdGFudHM6OnNldCgKKyAgICAgICAgaW50IEwsIGludCBoYWxmTnVtQ29lZnMsIGludCBpblNhbXBsZVJhdGUsIGludCBvdXRTYW1wbGVSYXRlKQoreworICAgIGludCBiaXRzID0gMDsKKyAgICBpbnQgbHNjYWxlID0gaW5TYW1wbGVSYXRlL291dFNhbXBsZVJhdGUgPCAyID8gTCAtIDEgOgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTCkqaW5TYW1wbGVSYXRlL291dFNhbXBsZVJhdGUpOworICAgIGZvciAoaW50IGk9bHNjYWxlOyBpOyArK2JpdHMsIGk+Pj0xKQorICAgICAgICA7CisgICAgbUwgPSBMOworICAgIG1TaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBiaXRzOworICAgIG1IYWxmTnVtQ29lZnMgPSBoYWxmTnVtQ29lZnM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CitBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6QXVkaW9SZXNhbXBsZXJEeW4oCisgICAgICAgIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KQorICAgIDogQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIHF1YWxpdHkpLAorICAgICAgbVJlc2FtcGxlRnVuYygwKSwgbUZpbHRlclNhbXBsZVJhdGUoMCksIG1GaWx0ZXJRdWFsaXR5KERFRkFVTFRfUVVBTElUWSksCisgICAgbUNvZWZCdWZmZXIoTlVMTCkKK3sKKyAgICBtVm9sdW1lU2ltZFswXSA9IG1Wb2x1bWVTaW1kWzFdID0gMDsKKyAgICAvLyBUaGUgQXVkaW9SZXNhbXBsZXIgYmFzZSBjbGFzcyBhc3N1bWVzIHdlIGFyZSBhbHdheXMgcmVhZHkgZm9yIDE6MSByZXNhbXBsaW5nLgorICAgIC8vIFdlIHJlc2V0IG1JblNhbXBsZVJhdGUgdG8gMCwgc28gc2V0U2FtcGxlUmF0ZSgpIHdpbGwgY2FsY3VsYXRlIGZpbHRlcnMgZm9yCisgICAgLy8gc2V0U2FtcGxlUmF0ZSgpIGZvciAxOjEuIChNYXkgYmUgcmVtb3ZlZCBpZiBwcmVjYWxjdWxhdGVkIGZpbHRlcnMgYXJlIHVzZWQuKQorICAgIG1JblNhbXBsZVJhdGUgPSAwOworICAgIG1Db25zdGFudHMuc2V0KDEyOCwgOCwgbVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsgLy8gVE9ETzogc2V0IGJldHRlcgorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46On5BdWRpb1Jlc2FtcGxlckR5bigpCit7CisgICAgZnJlZShtQ29lZkJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+Ojppbml0KCkKK3sKKyAgICBtRmlsdGVyU2FtcGxlUmF0ZSA9IDA7IC8vIGFsd2F5cyB0cmlnZ2VyIG5ldyBmaWx0ZXIgZ2VuZXJhdGlvbgorICAgIG1JbkJ1ZmZlci5pbml0KCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCit7CisgICAgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShsZWZ0LCByaWdodCk7CisgICAgaWYgKGlzX3NhbWU8VE8sIGZsb2F0Pjo6dmFsdWUgfHwgaXNfc2FtZTxUTywgZG91YmxlPjo6dmFsdWUpIHsKKyAgICAgICAgbVZvbHVtZVNpbWRbMF0gPSBzdGF0aWNfY2FzdDxUTz4obGVmdCk7CisgICAgICAgIG1Wb2x1bWVTaW1kWzFdID0gc3RhdGljX2Nhc3Q8VE8+KHJpZ2h0KTsKKyAgICB9IGVsc2UgeyAgLy8gaW50ZWdlciByZXF1aXJlcyBzY2FsaW5nIHRvIFU0XzI4IChyb3VuZGluZyBkb3duKQorICAgICAgICAvLyBpbnRlZ2VyIHZvbHVtZXMgYXJlIGNsYW1wZWQgdG8gMCB0byBVTklUWV9HQUlOIHNvIHRoZXJlCisgICAgICAgIC8vIGFyZSBubyBpc3N1ZXMgd2l0aCBzaWduZWQgb3ZlcmZsb3cuCisgICAgICAgIG1Wb2x1bWVTaW1kWzBdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKGxlZnQpKTsKKyAgICAgICAgbVZvbHVtZVNpbWRbMV0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wocmlnaHQpKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgbWF4KFQgYSwgVCBiKSB7cmV0dXJuIGEgPiBiID8gYSA6IGI7fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIGFic2RpZmYoVCBhLCBUIGIpIHtyZXR1cm4gYSA+IGIgPyBhIC0gYiA6IGIgLSBhO30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OmNyZWF0ZUthaXNlckZpcihDb25zdGFudHMgJmMsCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuLCBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSwgZG91YmxlIHRid0NoZWF0KQoreworICAgIFRDKiBidWYgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgYXR0ZW4gPSAwLjk5OTg7ICAgLy8gdG8gYXZvaWQgcmlwcGxlIG92ZXJmbG93CisgICAgZG91YmxlIGZjcjsKKyAgICBkb3VibGUgdGJ3ID0gZmlyS2Fpc2VyVGJ3KGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbik7CisKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmJ1ZiksIDMyLCAoYy5tTCsxKSpjLm1IYWxmTnVtQ29lZnMqc2l6ZW9mKFRDKSk7CisgICAgaWYgKGluU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpIHsgLy8gdXBzYW1wbGUKKyAgICAgICAgZmNyID0gbWF4KDAuNSp0YndDaGVhdCAtIHRidy8yLCB0YncvMik7CisgICAgfSBlbHNlIHsgLy8gZG93bnNhbXBsZQorICAgICAgICBmY3IgPSBtYXgoMC41KnRid0NoZWF0Km91dFNhbXBsZVJhdGUvaW5TYW1wbGVSYXRlIC0gdGJ3LzIsIHRidy8yKTsKKyAgICB9CisgICAgLy8gY3JlYXRlIGFuZCBzZXQgZmlsdGVyCisgICAgZmlyS2Fpc2VyR2VuKGJ1ZiwgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuKTsKKyAgICBjLm1GaXJDb2VmcyA9IGJ1ZjsKKyAgICBpZiAobUNvZWZCdWZmZXIpIHsKKyAgICAgICAgZnJlZShtQ29lZkJ1ZmZlcik7CisgICAgfQorICAgIG1Db2VmQnVmZmVyID0gYnVmOworI2lmZGVmIERFQlVHX1JFU0FNUExFUgorICAgIC8vIHByaW50IGJhc2ljIGZpbHRlciBzdGF0cworICAgIHByaW50ZigiTDolZCAgaG5jOiVkICBzdG9wQmFuZEF0dGVuOiVsZiAgZmNyOiVsZiAgYXR0ZW46JWxmICB0Ync6JWxmXG4iLAorICAgICAgICAgICAgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuLCB0YncpOworICAgIC8vIHRlc3QgdGhlIGZpbHRlciBhbmQgcmVwb3J0IHJlc3VsdHMKKyAgICBkb3VibGUgZnAgPSAoZmNyIC0gdGJ3LzIpL2MubUw7CisgICAgZG91YmxlIGZzID0gKGZjciArIHRidy8yKS9jLm1MOworICAgIGRvdWJsZSBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlOworICAgIGRvdWJsZSBzdG9wTWF4LCBzdG9wUmlwcGxlOworICAgIHRlc3RGaXIoYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIGZwLCBmcywgLypwYXNzU3RlcHMqLyAxMDAwLCAvKnN0b3BTdGVwcyovIDEwMDAwMCwKKyAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworICAgIHByaW50ZigicGFzc2JhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjhsZiAlLjhsZlxuIiwgMC4sIGZwLCBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlKTsKKyAgICBwcmludGYoInN0b3BiYW5kKCVsZiwgJWxmKTogJS44bGYgJS4zbGZcbiIsIGZzLCAwLjUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworI2VuZGlmCit9CisKKy8vIHJlY3Vyc2l2ZSBnY2QuIFVzaW5nIG9iamR1bXAsIGl0IGFwcGVhcnMgdGhlIHRhaWwgcmVjdXJzaW9uIGlzIGNvbnZlcnRlZCB0byBhIHdoaWxlIGxvb3AuCitzdGF0aWMgaW50IGdjZChpbnQgbiwgaW50IG0pCit7CisgICAgaWYgKG0gPT0gMCkgeworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisgICAgcmV0dXJuIGdjZChtLCBuICUgbSk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2xvc2UoaW50MzJfdCBuZXdTYW1wbGVSYXRlLCBpbnQzMl90IHByZXZTYW1wbGVSYXRlLAorICAgICAgICBpbnQzMl90IGZpbHRlclNhbXBsZVJhdGUsIGludDMyX3Qgb3V0U2FtcGxlUmF0ZSkKK3sKKworICAgIC8vIGRpZmZlcmVudCB1cHNhbXBsaW5nIHJhdGlvcyBkbyBub3QgbmVlZCBhIGZpbHRlciBjaGFuZ2UuCisgICAgaWYgKGZpbHRlclNhbXBsZVJhdGUgIT0gMAorICAgICAgICAgICAgJiYgZmlsdGVyU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUKKyAgICAgICAgICAgICYmIG5ld1NhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIGNoZWNrIGRlc2lnbiBjcml0ZXJpYSBhZ2FpbiBpZiBkb3duc2FtcGxpbmcgaXMgZGV0ZWN0ZWQuCisgICAgaW50IHBkaWZmID0gYWJzZGlmZihuZXdTYW1wbGVSYXRlLCBwcmV2U2FtcGxlUmF0ZSk7CisgICAgaW50IGFkaWZmID0gYWJzZGlmZihuZXdTYW1wbGVSYXRlLCBmaWx0ZXJTYW1wbGVSYXRlKTsKKworICAgIC8vIGFsbG93IHVwIHRvIDYlIHJlbGF0aXZlIGNoYW5nZSBpbmNyZW1lbnRzLgorICAgIC8vIGFsbG93IHVwIHRvIDEyJSBhYnNvbHV0ZSBjaGFuZ2UgaW5jcmVtZW50cyAoZnJvbSBmaWx0ZXIgZGVzaWduKQorICAgIHJldHVybiBwZGlmZiA8IHByZXZTYW1wbGVSYXRlPj40ICYmIGFkaWZmIDwgZmlsdGVyU2FtcGxlUmF0ZT4+MzsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnNldFNhbXBsZVJhdGUoaW50MzJfdCBpblNhbXBsZVJhdGUpCit7CisgICAgaWYgKG1JblNhbXBsZVJhdGUgPT0gaW5TYW1wbGVSYXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBvbGRTYW1wbGVSYXRlID0gbUluU2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IG9sZEhhbGZOdW1Db2VmcyA9IG1Db25zdGFudHMubUhhbGZOdW1Db2VmczsKKyAgICB1aW50MzJfdCBvbGRQaGFzZVdyYXBMaW1pdCA9IG1Db25zdGFudHMubUwgPDwgbUNvbnN0YW50cy5tU2hpZnQ7CisgICAgYm9vbCB1c2VTMzIgPSBmYWxzZTsKKworICAgIG1JblNhbXBsZVJhdGUgPSBpblNhbXBsZVJhdGU7CisKKyAgICAvLyBUT0RPOiBBZGQgcHJlY2FsY3VsYXRlZCBFcXVpcmlwcGxlIGZpbHRlcnMKKworICAgIGlmIChtRmlsdGVyUXVhbGl0eSAhPSBnZXRRdWFsaXR5KCkgfHwKKyAgICAgICAgICAgICFpc0Nsb3NlKGluU2FtcGxlUmF0ZSwgb2xkU2FtcGxlUmF0ZSwgbUZpbHRlclNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKSkgeworICAgICAgICBtRmlsdGVyU2FtcGxlUmF0ZSA9IGluU2FtcGxlUmF0ZTsKKyAgICAgICAgbUZpbHRlclF1YWxpdHkgPSBnZXRRdWFsaXR5KCk7CisKKyAgICAgICAgLy8gQmVnaW4gS2Fpc2VyIEZpbHRlciBjb21wdXRhdGlvbgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgcXVhbnRpemF0aW9uIGZsb29yIGZvciBTMTYgaXMgYWJvdXQgOTZkYiAtIDEwKmxvZ18xMCgjbGVuZ3RoKSArIDNkQi4KKyAgICAgICAgLy8gS2VlcCB0aGUgc3RvcCBiYW5kIGF0dGVudWF0aW9uIG5vIGdyZWF0ZXIgdGhhbiA4NC04NWRCIGZvciAzMiBsZW5ndGggUzE2IGZpbHRlcnMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIHMzMiB3ZSBrZWVwIHRoZSBzdG9wIGJhbmQgYXR0ZW51YXRpb24gYXQgdGhlIHNhbWUgYXMgMTZiIHJlc29sdXRpb24sIGFib3V0CisgICAgICAgIC8vIDk2LTk4ZEIKKyAgICAgICAgLy8KKworICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbjsKKyAgICAgICAgZG91YmxlIHRid0NoZWF0ID0gMS47IC8vIGhvdyBtdWNoIHdlICJjaGVhdCIgaW50byBhbGlhc2luZworICAgICAgICBpbnQgaGFsZkxlbmd0aDsKKyAgICAgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgIC8vIDMyYiBjb2VmZmljaWVudHMsIDY0IGxlbmd0aAorICAgICAgICAgICAgdXNlUzMyID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA5OC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA0MDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9MT1dfUVVBTElUWSkgeworICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMTYtMzIgbGVuZ3RoCisgICAgICAgICAgICB1c2VTMzIgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4MC47CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7IC8vIERZTl9NRURfUVVBTElUWQorICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMzItNjQgbGVuZ3RoCisgICAgICAgICAgICAvLyBub3RlOiA+IDY0IGxlbmd0aCBmaWx0ZXJzIHdpdGggMTZiIGNvZWZzIGNhbiBoYXZlIHF1YW50aXphdGlvbiBub2lzZSBwcm9ibGVtcworICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CisgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOworICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHBvbHlwaGFzZXMgaW4gdGhlIGZpbHRlcmJhbmsuCisgICAgICAgIC8vIGZvciAxNmIsIGl0IGlzIGRlc2lyYWJsZSB0byBoYXZlIDJeKDE2LzIpID0gMjU2IHBoYXNlcy4KKyAgICAgICAgLy8gaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9yZXNhbXBsZS9SZWxhdGlvbl9JbnRlcnBvbGF0aW9uX0Vycm9yX1F1YW50aXphdGlvbi5odG1sCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGFyZSBhIGJpdCBtb3JlIGxheCBvbiB0aGlzLgorCisgICAgICAgIGludCBwaGFzZXMgPSBtU2FtcGxlUmF0ZSAvIGdjZChtU2FtcGxlUmF0ZSwgaW5TYW1wbGVSYXRlKTsKKworICAgICAgICAvLyBUT0RPOiBPbmNlIGR5bmFtaWMgc2FtcGxlIHJhdGUgY2hhbmdlIGlzIGFuIG9wdGlvbiwgdGhlIGNvZGUgYmVsb3cKKyAgICAgICAgLy8gc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGV4ZWN1dGUgb25seSB3aGVuIGR5bmFtaWMgc2FtcGxlIHJhdGUgY2hhbmdlIGlzIGVuYWJsZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIGFzIGFib3ZlLCAjcGhhc2VzIGxlc3MgdGhhbiA2MyBpcyB0b28gZmV3IHBoYXNlcyBmb3IgYWNjdXJhdGUgbGluZWFyIGludGVycG9sYXRpb24uCisgICAgICAgIC8vIHdlIGluY3JlYXNlIHRoZSBwaGFzZXMgdG8gY29tcGVuc2F0ZSwgYnV0IG1vcmUgcGhhc2VzIG1lYW5zIG1vcmUgbWVtb3J5IHBlcgorICAgICAgICAvLyBmaWx0ZXIgYW5kIG1vcmUgdGltZSB0byBjb21wdXRlIHRoZSBmaWx0ZXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIGlmIHdlIGtub3cgdGhhdCB0aGUgZmlsdGVyIHdpbGwgYmUgdXNlZCBmb3IgZHluYW1pYyBzYW1wbGUgcmF0ZSBjaGFuZ2VzLAorICAgICAgICAvLyB0aGF0IHdvdWxkIGFsbG93IHVzIHNraXAgdGhpcyBwYXJ0IGZvciBmaXhlZCBzYW1wbGUgcmF0ZSByZXNhbXBsZXJzLgorICAgICAgICAvLworICAgICAgICB3aGlsZSAocGhhc2VzPDYzKSB7CisgICAgICAgICAgICBwaGFzZXMgKj0gMjsgLy8gdGhpcyBjb2RlIG9ubHkgbmVlZGVkIHRvIHN1cHBvcnQgZHluYW1pYyByYXRlIGNoYW5nZXMKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwaGFzZXM+PTI1NikgeyAgLy8gdG9vIG1hbnkgcGhhc2VzLCBhbHdheXMgaW50ZXJwb2xhdGUKKyAgICAgICAgICAgIHBoYXNlcyA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyCisgICAgICAgIG1Db25zdGFudHMuc2V0KHBoYXNlcywgaGFsZkxlbmd0aCwgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgIGNyZWF0ZUthaXNlckZpcihtQ29uc3RhbnRzLCBzdG9wQmFuZEF0dGVuLAorICAgICAgICAgICAgICAgIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIHRid0NoZWF0KTsKKyAgICB9IC8vIEVuZCBLYWlzZXIgZmlsdGVyCisKKyAgICAvLyB1cGRhdGUgcGhhc2UgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBuZXcgZmlsdGVyLgorICAgIGNvbnN0IENvbnN0YW50cyYgYyhtQ29uc3RhbnRzKTsKKyAgICBtSW5CdWZmZXIucmVzaXplKG1DaGFubmVsQ291bnQsIGMubUhhbGZOdW1Db2Vmcyk7CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VXcmFwTGltaXQgPSBjLm1MIDw8IGMubVNoaWZ0OworICAgIC8vIHRyeSB0byBwcmVzZXJ2ZSBhcyBtdWNoIG9mIHRoZSBwaGFzZSBmcmFjdGlvbiBhcyBwb3NzaWJsZSBmb3Igb24tdGhlLWZseSBjaGFuZ2VzCisgICAgbVBoYXNlRnJhY3Rpb24gPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KG1QaGFzZUZyYWN0aW9uKQorICAgICAgICAgICAgKiBwaGFzZVdyYXBMaW1pdCAvIG9sZFBoYXNlV3JhcExpbWl0OworICAgIG1QaGFzZUZyYWN0aW9uICU9IHBoYXNlV3JhcExpbWl0OyAvLyBzaG91bGQgbm90IGRvIGFueXRoaW5nLCBidXQganVzdCBpbiBjYXNlLgorICAgIG1QaGFzZUluY3JlbWVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGhhc2VXcmFwTGltaXQpCisgICAgICAgICAgICAqIGluU2FtcGxlUmF0ZSAvIG1TYW1wbGVSYXRlKTsKKworICAgIC8vIGRldGVybWluZSB3aGljaCByZXNhbXBsZXIgdG8gdXNlCisgICAgLy8gY2hlY2sgaWYgbG9ja2VkIHBoYXNlICh3b3JrcyBvbmx5IGlmIG1QaGFzZUluY3JlbWVudCBoYXMgbm8gImZyYWN0aW9uYWwgcGhhc2UgYml0cyIpCisgICAgaW50IGxvY2tlZCA9IChtUGhhc2VJbmNyZW1lbnQgPDwgKHNpemVvZihtUGhhc2VJbmNyZW1lbnQpKjggLSBjLm1TaGlmdCkpID09IDA7CisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtUGhhc2VGcmFjdGlvbiA9IG1QaGFzZUZyYWN0aW9uID4+IGMubVNoaWZ0IDw8IGMubVNoaWZ0OyAvLyByZW1vdmUgZnJhY3Rpb25hbCBwaGFzZQorICAgIH0KKworICAgIC8vIHN0cmlkZSBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgZmlsdGVyIGNvZWZmaWNpZW50cyBwcm9jZXNzZWQgcGVyIGxvb3AgaXRlcmF0aW9uLgorICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IGFsbG93IGEgc3RyaWRlIG9mIDE2IHRvIG1hdGNoIHdpdGggU0lNRCBwcm9jZXNzaW5nLgorICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlsdGVyIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYsCisgICAgLy8gb3IgaGFsZiB0aGUgZmlsdGVyIGxlbmd0aCAobUhhbGZOdW1Db2VmcykgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguCisgICAgLy8KKyAgICAvLyBOb3RlOiBBIHN0cmlkZSBvZiAyIGlzIGFjaGlldmVkIHdpdGggbm9uLVNJTUQgcHJvY2Vzc2luZy4KKyAgICBpbnQgc3RyaWRlID0gKChjLm1IYWxmTnVtQ29lZnMgJiA3KSA9PSAwKSA/IDE2IDogMjsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmlkZSA8IDE2LCAiUmVzYW1wbGVyIHN0cmlkZSBtdXN0IGJlIDE2IG9yIG1vcmUiKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPCAxIHx8IG1DaGFubmVsQ291bnQgPiA4LAorICAgICAgICAgICAgIlJlc2FtcGxlciBjaGFubmVscyglZCkgbXVzdCBiZSBiZXR3ZWVuIDEgdG8gOCIsIG1DaGFubmVsQ291bnQpOworICAgIC8vIHN0cmlkZSAxNiAoZmFsbHMgYmFjayB0byBzdHJpZGUgMiBmb3IgbWFjaGluZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBORU9OKQorICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDEsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwyLCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MywgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDQsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw1LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NiwgdHJ1ZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDcsIHRydWUsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw4LCB0cnVlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwxLCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDIsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MywgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw0LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDUsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NiwgZmFsc2UsIDE2PjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw3LCBmYWxzZSwgMTY+OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDgsIGZhbHNlLCAxNj47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNpZmRlZiBERUJVR19SRVNBTVBMRVIKKyAgICBwcmludGYoImNoYW5uZWxzOiVkICAlcyAgc3RyaWRlOiVkICAlcyAgY29lZjolZCAgc2hpZnQ6JWRcbiIsCisgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBsb2NrZWQgPyAibG9ja2VkIiA6ICJpbnRlcnBvbGF0ZWQiLAorICAgICAgICAgICAgc3RyaWRlLCB1c2VTMzIgPyAiUzMyIiA6ICJTMTYiLCAyKmMubUhhbGZOdW1Db2VmcywgYy5tU2hpZnQpOworI2VuZGlmCit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCit7CisgICAgKHRoaXMtPiptUmVzYW1wbGVGdW5jKShyZWludGVycHJldF9jYXN0PFRPKj4ob3V0KSwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KK3ZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikKK3sKKyAgICAvLyBUT0RPIE1vbm8gLT4gTW9ubyBpcyBub3Qgc3VwcG9ydGVkLiBPVVRQVVRfQ0hBTk5FTFMgcmVmbGVjdHMgbWluaW11bSBvZiBzdGVyZW8gb3V0LgorICAgIGNvbnN0IGludCBPVVRQVVRfQ0hBTk5FTFMgPSAoQ0hBTk5FTFMgPCAyKSA/IDIgOiBDSEFOTkVMUzsKKyAgICBjb25zdCBDb25zdGFudHMmIGMobUNvbnN0YW50cyk7CisgICAgY29uc3QgVEMqIGNvbnN0IGNvZWZzID0gbUNvbnN0YW50cy5tRmlyQ29lZnM7CisgICAgVEkqIGltcHVsc2UgPSBtSW5CdWZmZXIuZ2V0SW1wdWxzZSgpOworICAgIHNpemVfdCBpbnB1dEluZGV4ID0gMDsKKyAgICB1aW50MzJfdCBwaGFzZUZyYWN0aW9uID0gbVBoYXNlRnJhY3Rpb247CisgICAgY29uc3QgdWludDMyX3QgcGhhc2VJbmNyZW1lbnQgPSBtUGhhc2VJbmNyZW1lbnQ7CisgICAgc2l6ZV90IG91dHB1dEluZGV4ID0gMDsKKyAgICBzaXplX3Qgb3V0cHV0U2FtcGxlQ291bnQgPSBvdXRGcmFtZUNvdW50ICogT1VUUFVUX0NIQU5ORUxTOworICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKKyAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKHBoYXNlSW5jcmVtZW50ICogKHVpbnQ2NF90KW91dEZyYW1lQ291bnQgKyBwaGFzZUZyYWN0aW9uKQorICAgICAgICAgICAgLyBwaGFzZVdyYXBMaW1pdDsKKyAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBpbkZyYW1lQ291bnQgaXMgaW4gc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIHJhbmdlLgorICAgIEFMT0dfQVNTRVJUKDAgPD0gaW5GcmFtZUNvdW50ICYmIGluRnJhbWVDb3VudCA8ICgxVSA8PCAzMSkpOworCisgICAgLy9BTE9HVigiaW5GcmFtZUNvdW50OiVkICBvdXRGcmFtZUNvdW50OiVkIgorICAgIC8vICAgICAgICAiICBwaGFzZUluY3JlbWVudDoldSAgcGhhc2VGcmFjdGlvbjoldSAgcGhhc2VXcmFwTGltaXQ6JXUiLAorICAgIC8vICAgICAgICBpbkZyYW1lQ291bnQsIG91dEZyYW1lQ291bnQsIHBoYXNlSW5jcmVtZW50LCBwaGFzZUZyYWN0aW9uLCBwaGFzZVdyYXBMaW1pdCk7CisKKyAgICAvLyBOT1RFOiBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIGNvZGUgaGVyZS4gcmVnaXN0ZXIKKyAgICAvLyBwcmVzc3VyZSBpcyB2ZXJ5IGhpZ2ggYW5kIGEgc21hbGwgY2hhbmdlIG1pZ2h0IGNhdXNlIHRoZSBjb21waWxlcgorICAgIC8vIHRvIGdlbmVyYXRlIGZhciBsZXNzIGVmZmljaWVudCBjb2RlLgorICAgIC8vIEFsd2F5cyBzYW5pdHkgY2hlY2sgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KKworICAgIC8vIHRoZSBmb2xsb3dpbmcgbG9naWMgaXMgYSBiaXQgY29udm9sdXRlZCB0byBrZWVwIHRoZSBtYWluIHByb2Nlc3NpbmcgbG9vcAorICAgIC8vIGFzIHRpZ2h0IGFzIHBvc3NpYmxlIHdpdGggcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgICB3aGlsZSAob3V0cHV0SW5kZXggPCBvdXRwdXRTYW1wbGVDb3VudCkgeworICAgICAgICAvL0FMT0dWKCJMT09QOiBpbkZyYW1lQ291bnQ6JWQgIG91dHB1dEluZGV4OiVkICBvdXRGcmFtZUNvdW50OiVkIgorICAgICAgICAvLyAgICAgICAgIiAgcGhhc2VGcmFjdGlvbjoldSAgcGhhc2VXcmFwTGltaXQ6JXUiLAorICAgICAgICAvLyAgICAgICAgaW5GcmFtZUNvdW50LCBvdXRwdXRJbmRleCwgb3V0RnJhbWVDb3VudCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VXcmFwTGltaXQpOworCisgICAgICAgIC8vIGNoZWNrIGlucHV0SW5kZXggb3ZlcmZsb3cKKyAgICAgICAgQUxPR19BU1NFUlQoaW5wdXRJbmRleCA8PSBtQnVmZmVyLmZyYW1lQ291bnQsICJpbnB1dEluZGV4JWQgPiBmcmFtZUNvdW50JWQiLAorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgIC8vIEJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lIGlmIG5lY2Vzc2FyeSAoaW5GcmFtZUNvdW50ID4gMCkuCisgICAgICAgIC8vIFdlIG1heSBub3QgZmV0Y2ggYSBuZXcgYnVmZmVyIGlmIHRoZSBleGlzdGluZyBkYXRhIGlzIHN1ZmZpY2llbnQuCisgICAgICAgIHdoaWxlIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCAmJiBpbkZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBpbkZyYW1lQ291bnQ7CisgICAgICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlT3V0cHV0UFRTKG91dHB1dEluZGV4IC8gT1VUUFVUX0NIQU5ORUxTKSk7CisgICAgICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gcmVzYW1wbGVfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluRnJhbWVDb3VudCAtPSBtQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAocGhhc2VGcmFjdGlvbiA+PSBwaGFzZVdyYXBMaW1pdCkgeyAvLyByZWFkIGluIGRhdGEKKyAgICAgICAgICAgICAgICBtSW5CdWZmZXIudGVtcGxhdGUgcmVhZEFkdmFuY2U8Q0hBTk5FTFM+KAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wdWxzZSwgYy5tSGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUSSo+KG1CdWZmZXIucmF3KSwgaW5wdXRJbmRleCk7CisgICAgICAgICAgICAgICAgaW5wdXRJbmRleCsrOworICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBoYXNlRnJhY3Rpb24gPj0gcGhhc2VXcmFwTGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gbUJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZlci50ZW1wbGF0ZSByZWFkQWR2YW5jZTxDSEFOTkVMUz4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wdWxzZSwgYy5tSGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VEkqPihtQnVmZmVyLnJhdyksIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4Kys7CisgICAgICAgICAgICAgICAgICAgIHBoYXNlRnJhY3Rpb24gLT0gcGhhc2VXcmFwTGltaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVEkqPihtQnVmZmVyLnJhdyk7CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gbUJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICBjb25zdCBpbnQgY29lZlNoaWZ0ID0gYy5tU2hpZnQ7CisgICAgICAgIGNvbnN0IGludCBoYWxmTnVtQ29lZnMgPSBjLm1IYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVTaW1kID0gbVZvbHVtZVNpbWQ7CisKKyAgICAgICAgLy8gbWFpbiBwcm9jZXNzaW5nIGxvb3AKKyAgICAgICAgd2hpbGUgKENDX0xJS0VMWShvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSkgeworICAgICAgICAgICAgLy8gY2F1dGlvbjogZmlyKCkgaXMgaW5saW5lZCBhbmQgbWF5IGJlIGxhcmdlLgorICAgICAgICAgICAgLy8gb3V0cHV0IHdpbGwgYmUgbG9hZGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGZyb20gdGhlIGlucHV0IHNhbXBsZXMgaW4gaW1wdWxzZVstaGFsZk51bUNvZWZzKzFdLi4uIGltcHVsc2VbaGFsZk51bUNvZWZzXQorICAgICAgICAgICAgLy8gZnJvbSB0aGUgcG9seXBoYXNlIGZpbHRlciBvZiAocGhhc2VGcmFjdGlvbiAvIHBoYXNlV3JhcExpbWl0KSBpbiBjb2Vmcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvL0FMT0dWKCJMT09QMjogaW5GcmFtZUNvdW50OiVkICBvdXRwdXRJbmRleDolZCAgb3V0RnJhbWVDb3VudDolZCIKKyAgICAgICAgICAgIC8vICAgICAgICAiICBwaGFzZUZyYWN0aW9uOiV1ICBwaGFzZVdyYXBMaW1pdDoldSIsCisgICAgICAgICAgICAvLyAgICAgICAgaW5GcmFtZUNvdW50LCBvdXRwdXRJbmRleCwgb3V0RnJhbWVDb3VudCwgcGhhc2VGcmFjdGlvbiwgcGhhc2VXcmFwTGltaXQpOworICAgICAgICAgICAgQUxPR19BU1NFUlQocGhhc2VGcmFjdGlvbiA8IHBoYXNlV3JhcExpbWl0KTsKKyAgICAgICAgICAgIGZpcjxDSEFOTkVMUywgTE9DS0VELCBTVFJJREU+KAorICAgICAgICAgICAgICAgICAgICAmb3V0W291dHB1dEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiwgcGhhc2VXcmFwTGltaXQsCisgICAgICAgICAgICAgICAgICAgIGNvZWZTaGlmdCwgaGFsZk51bUNvZWZzLCBjb2VmcywKKyAgICAgICAgICAgICAgICAgICAgaW1wdWxzZSwgdm9sdW1lU2ltZCk7CisKKyAgICAgICAgICAgIG91dHB1dEluZGV4ICs9IE9VVFBVVF9DSEFOTkVMUzsKKworICAgICAgICAgICAgcGhhc2VGcmFjdGlvbiArPSBwaGFzZUluY3JlbWVudDsKKyAgICAgICAgICAgIHdoaWxlIChwaGFzZUZyYWN0aW9uID49IHBoYXNlV3JhcExpbWl0KSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kZXggPj0gZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7ICAvLyBuZWVkIGEgbmV3IGJ1ZmZlcgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSW5CdWZmZXIudGVtcGxhdGUgcmVhZEFkdmFuY2U8Q0hBTk5FTFM+KGltcHVsc2UsIGhhbGZOdW1Db2VmcywgaW4sIGlucHV0SW5kZXgpOworICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBwaGFzZUZyYWN0aW9uIC09IHBoYXNlV3JhcExpbWl0OworICAgICAgICAgICAgfQorICAgICAgICB9Citkb25lOgorICAgICAgICAvLyBXZSBhcnJpdmUgaGVyZSB3aGVuIHdlJ3JlIGZpbmlzaGVkIG9yIHdoZW4gdGhlIGlucHV0IGJ1ZmZlciBydW5zIG91dC4KKyAgICAgICAgLy8gUmVnYXJkbGVzcyB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhlIGlucHV0IGJ1ZmZlciBpZiB3ZSd2ZSBhY3F1aXJlZCBpdC4KKyAgICAgICAgaWYgKGlucHV0SW5kZXggPiAwKSB7ICAvLyB3ZSd2ZSBhY3F1aXJlZCBhIGJ1ZmZlciAoYWx0ZXJuYXRpdmVseSBjb3VsZCBjaGVjayBmcmFtZUNvdW50KQorICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5wdXRJbmRleCA9PSBmcmFtZUNvdW50LCAiaW5wdXRJbmRleCglZCkgIT0gZnJhbWVDb3VudCglZCkiLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCBmcmFtZUNvdW50KTsgIC8vIG11c3QgaGF2ZSBiZWVuIGZ1bGx5IHJlYWQuCisgICAgICAgICAgICBpbnB1dEluZGV4ID0gMDsKKyAgICAgICAgICAgIHByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICAgICAgfQorICAgIH0KKworcmVzYW1wbGVfZXhpdDoKKyAgICAvLyBpbnB1dEluZGV4IG11c3QgYmUgemVybyBpbiBhbGwgdGhyZWUgY2FzZXM6CisgICAgLy8gKDEpIHRoZSBidWZmZXIgbmV2ZXIgd2FzIGJlZW4gYWNxdWlyZWQ7ICgyKSB0aGUgYnVmZmVyIHdhcworICAgIC8vIHJlbGVhc2VkIGF0ICJkb25lOiI7IG9yICgzKSBnZXROZXh0QnVmZmVyKCkgZmFpbGVkLgorICAgIEFMT0dfQVNTRVJUKGlucHV0SW5kZXggPT0gMCwgIlJlbGVhc2luZzogaW5wdXRpbmRleDolZCBmcmFtZUNvdW50OiVkICBwaGFzZUZyYWN0aW9uOiV1IiwKKyAgICAgICAgICAgIGlucHV0SW5kZXgsIG1CdWZmZXIuZnJhbWVDb3VudCwgcGhhc2VGcmFjdGlvbik7CisgICAgQUxPR19BU1NFUlQobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOyAvLyB0aGVyZSBtdXN0IGJlIG5vIGZyYW1lcyBpbiB0aGUgYnVmZmVyCisgICAgbUluQnVmZmVyLnNldEltcHVsc2UoaW1wdWxzZSk7CisgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworfQorCisvKiBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgdXNlZCBieSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlICovCit0ZW1wbGF0ZSBjbGFzcyBBdWRpb1Jlc2FtcGxlckR5bjxmbG9hdCwgZmxvYXQsIGZsb2F0PjsKK3RlbXBsYXRlIGNsYXNzIEF1ZGlvUmVzYW1wbGVyRHluPGludDE2X3QsIGludDE2X3QsIGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODZhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRFlOX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRFlOX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQXVkaW9SZXNhbXBsZXJEeW4KKyAqCisgKiBUaGlzIGNsYXNzIHRlbXBsYXRlIGlzIHVzZWQgZm9yIGZsb2F0aW5nIHBvaW50IGFuZCBpbnRlZ2VyIHJlc2FtcGxlcnMuCisgKgorICogVHlwZSB2YXJpYWJsZXM6CisgKiBUQyA9IGZpbHRlciBjb2VmZmljaWVudCB0eXBlIChvbmUgb2YgaW50MTZfdCwgaW50MzJfdCwgb3IgZmxvYXQpCisgKiBUSSA9IGlucHV0IGRhdGEgdHlwZSAob25lIG9mIGludDE2X3Qgb3IgZmxvYXQpCisgKiBUTyA9IG91dHB1dCBkYXRhIHR5cGUgKG9uZSBvZiBpbnQzMl90IG9yIGZsb2F0KQorICoKKyAqIEZvciBpbnRlZ2VyIGlucHV0IGRhdGEgdHlwZXMgVEksIHRoZSBjb2VmZmljaWVudCB0eXBlIFRDIGlzIGVpdGhlciBpbnQxNl90IG9yIGludDMyX3QuCisgKiBGb3IgZmxvYXQgaW5wdXQgZGF0YSB0eXBlcyBUSSwgdGhlIGNvZWZmaWNpZW50IHR5cGUgVEMgaXMgZmxvYXQuCisgKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK2NsYXNzIEF1ZGlvUmVzYW1wbGVyRHluOiBwdWJsaWMgQXVkaW9SZXNhbXBsZXIgeworcHVibGljOgorICAgIEF1ZGlvUmVzYW1wbGVyRHluKGludCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgc3JjX3F1YWxpdHkgcXVhbGl0eSk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb1Jlc2FtcGxlckR5bigpOworCisgICAgdmlydHVhbCB2b2lkIGluaXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3QgaW5TYW1wbGVSYXRlKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBDb25zdGFudHMgeyAvLyBzdG9yZXMgdGhlIGZpbHRlciBjb25zdGFudHMuCisgICAgcHVibGljOgorICAgICAgICBDb25zdGFudHMoKSA6CisgICAgICAgICAgICBtTCgwKSwgbVNoaWZ0KDApLCBtSGFsZk51bUNvZWZzKDApLCBtRmlyQ29lZnMoTlVMTCkKKyAgICAgICAge30KKyAgICAgICAgdm9pZCBzZXQoaW50IEwsIGludCBoYWxmTnVtQ29lZnMsCisgICAgICAgICAgICAgICAgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgIGludCBtTDsgICAgICAgICAgICAvLyBpbnRlcnBvbGF0aW9uIHBoYXNlcyBpbiB0aGUgZmlsdGVyLgorICAgICAgICAgICAgICAgICBpbnQgbVNoaWZ0OyAgICAgICAgLy8gcmlnaHQgc2hpZnQgdG8gZ2V0IHBvbHlwaGFzZSBpbmRleAorICAgICAgICB1bnNpZ25lZCBpbnQgbUhhbGZOdW1Db2VmczsgLy8gZmlsdGVyIGhhbGYgI2NvZWZzCisgICAgICAgICAgIGNvbnN0IFRDKiBtRmlyQ29lZnM7ICAgICAvLyBwb2x5cGhhc2UgZmlsdGVyIGJhbmsKKyAgICB9OworCisgICAgY2xhc3MgSW5CdWZmZXIgeyAvLyBidWZmZXIgbWFuYWdlbWVudCBmb3IgaW5wdXQgdHlwZSBUSQorICAgIHB1YmxpYzoKKyAgICAgICAgSW5CdWZmZXIoKTsKKyAgICAgICAgfkluQnVmZmVyKCk7CisgICAgICAgIHZvaWQgaW5pdCgpOworCisgICAgICAgIHZvaWQgcmVzaXplKGludCBDSEFOTkVMUywgaW50IGhhbGZOdW1Db2Vmcyk7CisKKyAgICAgICAgLy8gdXNlZCBmb3IgZGlyZWN0IG1hbmFnZW1lbnQgb2YgdGhlIG1JbXB1bHNlIHBvaW50ZXIKKyAgICAgICAgaW5saW5lIFRJKiBnZXRJbXB1bHNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbXB1bHNlOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0SW1wdWxzZShUSSAqaW1wdWxzZSkgeworICAgICAgICAgICAgbUltcHVsc2UgPSBpbXB1bHNlOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgorICAgICAgICBpbmxpbmUgdm9pZCByZWFkQWdhaW4oVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiwgY29uc3Qgc2l6ZV90IGlucHV0SW5kZXgpOworCisgICAgICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KKyAgICAgICAgaW5saW5lIHZvaWQgcmVhZEFkdmFuY2UoVEkqJiBpbXB1bHNlLCBjb25zdCBpbnQgaGFsZk51bUNvZWZzLAorICAgICAgICAgICAgICAgIGNvbnN0IFRJKiBjb25zdCBpbiwgY29uc3Qgc2l6ZV90IGlucHV0SW5kZXgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gdHVuaW5nIHBhcmFtZXRlciBndWlkZWxpbmVzOiAyIDw9IG11bHRpcGxlIDw9IDgKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrU3RhdGVTaXplTXVsdGlwbGVPZkZpbHRlckxlbmd0aCA9IDQ7CisKKyAgICAgICAgLy8gaW4gZ2VuZXJhbCwgbVJpbmdGdWxsID0gbVN0YXRlICsgbVN0YXRlU2l6ZSAtIGhhbGZOdW1Db2VmcypDSEFOTkVMUy4KKyAgICAgICAgICAgVEkqIG1TdGF0ZTsgICAgICAvLyBiYXNlIHBvaW50ZXIgZm9yIHRoZSBpbnB1dCBidWZmZXIgc3RvcmFnZQorICAgICAgICAgICBUSSogbUltcHVsc2U7ICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIGltcHVsc2UgcmVzcG9uc2UgKGNlbnRlcmVkKQorICAgICAgICAgICBUSSogbVJpbmdGdWxsOyAgIC8vIG1TdGF0ZSA8PSBtSW1wdWxzZSA8IG1SaW5nRnVsbAorICAgICAgICBzaXplX3QgbVN0YXRlQ291bnQ7IC8vIHNpemUgb2Ygc3RhdGUgaW4gdW5pdHMgb2YgVEkuCisgICAgfTsKKworICAgIHZvaWQgY3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywgZG91YmxlIHN0b3BCYW5kQXR0ZW4sCisgICAgICAgICAgICBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSwgZG91YmxlIHRid0NoZWF0KTsKKworICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUywgYm9vbCBMT0NLRUQsIGludCBTVFJJREU+CisgICAgdm9pZCByZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworCisgICAgLy8gZGVmaW5lIGEgcG9pbnRlciB0byBtZW1iZXIgZnVuY3Rpb24gdHlwZSBmb3IgcmVzYW1wbGUKKyAgICB0eXBlZGVmIHZvaWQgKEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjoqcmVzYW1wbGVfQUJQX3QpKFRPKiBvdXQsCisgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCwgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOworCisgICAgLy8gZGF0YSAtIHRoZSBjb250aWd1b3VzIHN0b3JhZ2UgYW5kIGxheW91dCBvZiB0aGVzZSBpcyBpbXBvcnRhbnQuCisgICAgICAgICAgIEluQnVmZmVyIG1JbkJ1ZmZlcjsKKyAgICAgICAgICBDb25zdGFudHMgbUNvbnN0YW50czsgICAgICAgIC8vIGN1cnJlbnQgc2V0IG9mIGNvZWZmaWNpZW50IHBhcmFtZXRlcnMKKyAgICBUTyBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoOCkpKSBtVm9sdW1lU2ltZFsyXTsgLy8gbXVzdCBiZSBhbGlnbmVkIG9yIE5FT04gbWF5IGNyYXNoCisgICAgIHJlc2FtcGxlX0FCUF90IG1SZXNhbXBsZUZ1bmM7ICAgICAvLyBjYWxsZWQgZnVuY3Rpb24gZm9yIHJlc2FtcGxpbmcKKyAgICAgICAgICAgIGludDMyX3QgbUZpbHRlclNhbXBsZVJhdGU7IC8vIGRlc2lnbmVkIGZpbHRlciBzYW1wbGUgcmF0ZS4KKyAgICAgICAgc3JjX3F1YWxpdHkgbUZpbHRlclF1YWxpdHk7ICAgIC8vIGRlc2lnbmVkIGZpbHRlciBxdWFsaXR5LgorICAgICAgICAgICAgICB2b2lkKiBtQ29lZkJ1ZmZlcjsgICAgICAgLy8gaWYgYSBmaWx0ZXIgaXMgY3JlYXRlZCwgdGhpcyBpcyBub3QgbnVsbAorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRFlOX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDI0YjJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKQEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogZ2VuZXJhdGVzIGEgc2luZSB3YXZlIGF0IGVxdWFsIHN0ZXBzLgorICoKKyAqIEFzIG1vc3Qgb2Ygb3VyIGZ1bmN0aW9ucyB1c2Ugc2luZSBvciBjb3NpbmUgYXQgZXF1YWwgc3RlcHMsCisgKiBpdCBpcyB2ZXJ5IGVmZmljaWVudCB0byBjb21wdXRlIHRoZW0gdGhhdCB3YXkgKHNpbmdsZSBtdWx0aXBseSBhbmQgc3VidHJhY3QpLAorICogcmF0aGVyIHRoYW4gaW52b2tpbmcgdGhlIG1hdGggbGlicmFyeSBzaW4oKSBvciBjb3MoKSBlYWNoIHRpbWUuCisgKgorICogU2luZUdlbiB1c2VzIEdvZXJ0emVsJ3MgQWxnb3JpdGhtIChhcyBhIGdlbmVyYXRvciBub3QgYSBmaWx0ZXIpCisgKiB0byBjYWxjdWxhdGUgc2luZSh3c3RhcnQgKyBuICogd3N0ZXApIG9yIGNvc2luZSh3c3RhcnQgKyBuICogd3N0ZXApCisgKiBieSBzdGVwcGluZyB0aHJvdWdoIDAsIDEsIC4uLiBuLgorICoKKyAqIGVeaSh3c3RhcnQrd3N0ZXApID0gMmNvcyh3c3RlcCkgKiBlXmkod3N0YXJ0KSAtIGVeaSh3c3RhcnQtd3N0ZXApCisgKgorICogb3IgbG9va2luZyBhdCBqdXN0IHRoZSBpbWFnaW5hcnkgc2luZSB0ZXJtLCBhcyB0aGUgY29zaW5lIGZvbGxvd3MgaWRlbnRpY2FsbHk6CisgKgorICogc2luKHdzdGFydCt3c3RlcCkgPSAyY29zKHdzdGVwKSAqIHNpbih3c3RhcnQpIC0gc2luKHdzdGFydC13c3RlcCkKKyAqCisgKiBHb2VydHplbCdzIGFsZ29yaXRobSBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBhbmdsZSBhZGRpdGlvbiBmb3JtdWxhLAorICogZV5pKHdzdGFydCt3c3RlcCkgPSBlXmkod3N0YXJ0KSAqIGVeaSh3c3RlcCksIHdoaWNoIHRha2VzIHVwIHRvCisgKiA0IG11bHRpcGxpZXMgYW5kIDIgYWRkcyAob3IgMyogYW5kIDMrKSBhbmQgcmVxdWlyZXMgYm90aCBzaW5lIGFuZAorICogY29zaW5lIGdlbmVyYXRpb24gZHVlIHRvIHRoZSBjb21wbGV4ICogY29tcGxleCBtdWx0aXBseSAoZnVsbCByb3RhdGlvbikuCisgKgorICogU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dvZXJ0emVsX2FsZ29yaXRobQorICoKKyAqLworCitjbGFzcyBTaW5lR2VuIHsKK3B1YmxpYzoKKyAgICBTaW5lR2VuKGRvdWJsZSB3c3RhcnQsIGRvdWJsZSB3c3RlcCwgYm9vbCBjb3NpbmUgPSBmYWxzZSkgeworICAgICAgICBpZiAoY29zaW5lKSB7CisgICAgICAgICAgICBtQ3VycmVudCA9IGNvcyh3c3RhcnQpOworICAgICAgICAgICAgbVByZXZpb3VzID0gY29zKHdzdGFydCAtIHdzdGVwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gc2luKHdzdGFydCk7CisgICAgICAgICAgICBtUHJldmlvdXMgPSBzaW4od3N0YXJ0IC0gd3N0ZXApOworICAgICAgICB9CisgICAgICAgIG1Ud29Db3MgPSAyLipjb3Mod3N0ZXApOworICAgIH0KKyAgICBTaW5lR2VuKGRvdWJsZSBleHBOb3csIGRvdWJsZSBleHBQcmV2LCBkb3VibGUgdHdvQ29zU3RlcCkgeworICAgICAgICBtQ3VycmVudCA9IGV4cE5vdzsKKyAgICAgICAgbVByZXZpb3VzID0gZXhwUHJldjsKKyAgICAgICAgbVR3b0NvcyA9IHR3b0Nvc1N0ZXA7CisgICAgfQorICAgIGlubGluZSBkb3VibGUgdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ3VycmVudDsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgICAgZG91YmxlIHRtcCA9IG1DdXJyZW50OworICAgICAgICBtQ3VycmVudCA9IG1DdXJyZW50Km1Ud29Db3MgLSBtUHJldmlvdXM7CisgICAgICAgIG1QcmV2aW91cyA9IHRtcDsKKyAgICB9CisgICAgaW5saW5lIGRvdWJsZSB2YWx1ZUFkdmFuY2UoKSB7CisgICAgICAgIGRvdWJsZSB0bXAgPSBtQ3VycmVudDsKKyAgICAgICAgbUN1cnJlbnQgPSBtQ3VycmVudCptVHdvQ29zIC0gbVByZXZpb3VzOworICAgICAgICBtUHJldmlvdXMgPSB0bXA7CisgICAgICAgIHJldHVybiB0bXA7CisgICAgfQorCitwcml2YXRlOgorICAgIGRvdWJsZSBtQ3VycmVudDsgLy8gY3VycmVudCB2YWx1ZSBvZiBzaW5lL2Nvc2luZQorICAgIGRvdWJsZSBtUHJldmlvdXM7IC8vIHByZXZpb3VzIHZhbHVlIG9mIHNpbmUvY29zaW5lCisgICAgZG91YmxlIG1Ud29Db3M7IC8vIHN0ZXBwaW5nIGZhY3RvcgorfTsKKworLyoKKyAqIGdlbmVyYXRlcyBhIHNlcmllcyBvZiBzaW5lIGdlbmVyYXRvcnMsIHBoYXNlIG9mZnNldCBieSBmaXhlZCBzdGVwcy4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcG9seXBoYXNlIHNpbmUgZ2VuZXJhdG9ycywgb25lIHBlciBwb2x5cGhhc2UKKyAqIGluIHRoZSBmaWx0ZXIgY29kZSBiZWxvdy4KKyAqCisgKiBUaGUgU2luZUdlbiByZXR1cm5lZCBieSB2YWx1ZSgpIHN0YXJ0cyBhdCBpbm5lclN0YXJ0ID0gb3V0ZXJTdGFydCArIG4qb3V0ZXJTdGVwOworICogaW5jcmVtZW50cyBieSBpbm5lclN0ZXAuCisgKgorICovCisKK2NsYXNzIFNpbmVHZW5HZW4geworcHVibGljOgorICAgIFNpbmVHZW5HZW4oZG91YmxlIG91dGVyU3RhcnQsIGRvdWJsZSBvdXRlclN0ZXAsIGRvdWJsZSBpbm5lclN0ZXAsIGJvb2wgY29zaW5lID0gZmFsc2UpCisgICAgICAgICAgICA6IG1TaW5lSW5uZXJDdXIob3V0ZXJTdGFydCwgb3V0ZXJTdGVwLCBjb3NpbmUpLAorICAgICAgICAgICAgICBtU2luZUlubmVyUHJldihvdXRlclN0YXJ0LWlubmVyU3RlcCwgb3V0ZXJTdGVwLCBjb3NpbmUpCisgICAgeworICAgICAgICBtVHdvQ29zID0gMi4qY29zKGlubmVyU3RlcCk7CisgICAgfQorICAgIGlubGluZSBTaW5lR2VuIHZhbHVlKCkgeworICAgICAgICByZXR1cm4gU2luZUdlbihtU2luZUlubmVyQ3VyLnZhbHVlKCksIG1TaW5lSW5uZXJQcmV2LnZhbHVlKCksIG1Ud29Db3MpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBhZHZhbmNlKCkgeworICAgICAgICBtU2luZUlubmVyQ3VyLmFkdmFuY2UoKTsKKyAgICAgICAgbVNpbmVJbm5lclByZXYuYWR2YW5jZSgpOworICAgIH0KKyAgICBpbmxpbmUgU2luZUdlbiB2YWx1ZUFkdmFuY2UoKSB7CisgICAgICAgIHJldHVybiBTaW5lR2VuKG1TaW5lSW5uZXJDdXIudmFsdWVBZHZhbmNlKCksIG1TaW5lSW5uZXJQcmV2LnZhbHVlQWR2YW5jZSgpLCBtVHdvQ29zKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU2luZUdlbiBtU2luZUlubmVyQ3VyOyAvLyBnZW5lcmF0ZSB0aGUgaW5uZXIgc2luZSB2YWx1ZXMgKHN0ZXBwZWQgYnkgb3V0ZXJTdGVwKS4KKyAgICBTaW5lR2VuIG1TaW5lSW5uZXJQcmV2OyAvLyBnZW5lcmF0ZSB0aGUgaW5uZXIgc2luZSBwcmV2aW91cyB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVoaW5kIGJ5IGlubmVyU3RlcCwgc3RlcHBlZCBieSBvdXRlclN0ZXApLgorICAgIGRvdWJsZSBtVHdvQ29zOyAvLyB0aGUgaW5uZXIgc3RlcHBpbmcgZmFjdG9yIGZvciB0aGUgcmV0dXJuZWQgU2luZUdlbi4KK307CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNxcihkb3VibGUgeCkgeworICAgIHJldHVybiB4ICogeDsKK30KKworLyoKKyAqIHJvdW5kcyBhIGRvdWJsZSB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGZvciBGSVIgY29lZmZpY2llbnRzLgorICoKKyAqIE9uZSB2YXJpYW50IHVzZXMgbm9pc2Ugc2hhcGluZywgd2hpY2ggbXVzdCBrZWVwIGVycm9yIGhpc3RvcnkKKyAqIHRvIHdvcmsgKHRoZSBlcnIgcGFyYW1ldGVyLCBpbml0aWFsaXplZCB0byAwKS4KKyAqIFRoZSBvdGhlciB2YXJpYW50IGlzIGEgbm9uLW5vaXNlIHNoYXBlZCB2ZXJzaW9uIGZvcgorICogUzMyIGNvZWZmaWNpZW50cyAobm9pc2Ugc2hhcGluZyBkb2Vzbid0IGdhaW4gbXVjaCkuCisgKgorICogQ2F1dGlvbjogTm8gYm91bmRzIHNhdHVyYXRpb24gaXMgYXBwbGllZCwgYnV0IGlzbid0IG5lZWRlZCBpbiB0aGlzIGNhc2UuCisgKgorICogQHBhcmFtIHggaXMgdGhlIHZhbHVlIHRvIHJvdW5kLgorICoKKyAqIEBwYXJhbSBtYXh2YWwgaXMgdGhlIG1heGltdW0gaW50ZWdlciBzY2FsZSBmYWN0b3IgZXhwcmVzc2VkIGFzIGFuIGludDY0IChmb3IgaGVhZHJvb20pLgorICogVHlwaWNhbGx5IHRoaXMgbWF5IGJlIHRoZSBtYXhpbXVtIHBvc2l0aXZlIGludGVnZXIrMSAodXNpbmcgdGhlIGZhY3QgdGhhdCBkb3VibGUgcHJlY2lzaW9uCisgKiBGSVIgY29lZmZpY2llbnRzIGdlbmVyYXRlZCBoZXJlIGFyZSBuZXZlciB0aGF0IGNsb3NlIHRvIDEuMCB0byBwb3NlIGFuIG92ZXJmbG93IGNvbmRpdGlvbikuCisgKgorICogQHBhcmFtIGVyciBpcyB0aGUgcHJldmlvdXMgZXJyb3IgKGFjdHVhbCAtIHJvdW5kZWQpIGZvciB0aGUgcHJldmlvdXMgcm91bmRpbmcgb3AuCisgKiBGb3IgMTZiIGNvZWZmaWNpZW50cyB0aGlzIGNhbiBpbXByb3ZlIHN0b3BiYW5kIGRCIHBlcmZvcm1hbmNlIGJ5IHVwIHRvIDJkQi4KKyAqCisgKiBNYW55IHZhcmlhbnRzIGV4aXN0IGZvciB0aGUgbm9pc2Ugc2hhcGluZzogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ob2lzZV9zaGFwaW5nCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCB0b2ludChkb3VibGUgeCwgaW50NjRfdCBtYXh2YWwsIGRvdWJsZSYgZXJyKSB7CisgICAgZG91YmxlIHZhbCA9IHggKiBtYXh2YWw7CisgICAgZG91YmxlIGl2YWwgPSBmbG9vcih2YWwgKyAwLjUgKyBlcnIqMC4yKTsKKyAgICBlcnIgPSB2YWwgLSBpdmFsOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihpdmFsKTsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IHRvaW50KGRvdWJsZSB4LCBpbnQ2NF90IG1heHZhbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihmbG9vcih4ICogbWF4dmFsICsgMC41KSk7Cit9CisKKy8qCisgKiBNb2RpZmllZCBCZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQKKyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmVzc2VsX2Z1bmN0aW9uCisgKgorICogVGhlIGZvcm11bGFzIGFyZSB0YWtlbiBmcm9tIEFicmFtb3dpdHogYW5kIFN0ZWd1biwKKyAqIF9IYW5kYm9vayBvZiBNYXRoZW1hdGljYWwgRnVuY3Rpb25zXyAobGlua3MgYmVsb3cpOgorICoKKyAqIGh0dHA6Ly9wZW9wbGUubWF0aC5zZnUuY2EvfmNibS9hYW5kcy9wYWdlXzM3NS5odG0KKyAqIGh0dHA6Ly9wZW9wbGUubWF0aC5zZnUuY2EvfmNibS9hYW5kcy9wYWdlXzM3OC5odG0KKyAqCisgKiBodHRwOi8vZGxtZi5uaXN0Lmdvdi8xMC4yNQorICogaHR0cDovL2RsbWYubmlzdC5nb3YvMTAuNDAKKyAqCisgKiBOb3RlIHdlIGFzc3VtZSB4IGlzIG5vbm5lZ2F0aXZlICh0aGUgZnVuY3Rpb24gaXMgc3ltbWV0cmljLAorICogcGFzcyBpbiB0aGUgYWJzb2x1dGUgdmFsdWUgYXMgbmVlZGVkKS4KKyAqCisgKiBDb25zdGFudHMgYXJlIGNvbXBpbGUgdGltZSBkZXJpdmVkIHdpdGggdGVtcGxhdGVzIEkwVGVybTw+IGFuZAorICogSTBBVGVybTw+IHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIGNvbXBpbGVyLiAgVGhlIHNlcmllcyBjYW4gYmUgZXhwYW5kZWQKKyAqIHRvIGFueSBwcmVjaXNpb24gbmVlZGVkLCBidXQgY3VycmVudGx5IHNldCBhcm91bmQgMjRiIHByZWNpc2lvbi4KKyAqCisgKiBXZSB1c2UgYSBiaXQgb2YgdGVtcGxhdGUgbWF0aCBoZXJlLCBjb25zdGV4cHIgd291bGQgcHJvYmFibHkgYmUKKyAqIG1vcmUgYXBwcm9wcmlhdGUgZm9yIGEgQysrMTEgY29tcGlsZXIuCisgKgorICogRm9yIHRoZSBpbnRlcm1lZGlhdGUgcmFuZ2UgMy43NSA8IHggPCAxNSwgd2UgdXNlIG1pbmltYXggcG9seW5vbWlhbCBmaXQuCisgKgorICovCisKK3RlbXBsYXRlIDxpbnQgTj4KK3N0cnVjdCBJMFRlcm0geworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSBJMFRlcm08Ti0xPjo6dmFsdWUgLyAoNC4gKiBOICogTik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEkwVGVybTwwPiB7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IDEuOworfTsKKwordGVtcGxhdGUgPGludCBOPgorc3RydWN0IEkwQVRlcm0geworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdmFsdWUgPSBJMEFUZXJtPE4tMT46OnZhbHVlICogKDIuKk4tMS4pICogKDIuKk4tMS4pIC8gKDguICogTik7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEkwQVRlcm08MD4geyAvLyAxL3NxcnQoMipQSSk7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IDAuMzk4OTQyMjgwNDAxNDMyNjc3OTM5OTQ2MDU5OTM0MzgxODY4NDc1ODU4NjMxMTY0OTM0NjU3NjY1OTI1OworfTsKKworI2lmIFVTRV9IT1JORVJTX01FVEhPRAorLyogUG9seW5vbWlhbCBldmFsdWF0aW9uIG9mIEEgKyBCeCArIEN4XjIgKyBEeF4zICsgLi4uCisgKiB1c2luZyBIb3JuZXIncyBNZXRob2Q6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSG9ybmVyJ3NfbWV0aG9kCisgKgorICogVGhpcyBoYXMgZmV3ZXIgbXVsdGlwbGljYXRpb25zIHRoYW4gRXN0cmluJ3MgbWV0aG9kIGJlbG93LCBidXQgaGFzIGJhY2sgdG8gYmFjaworICogZmxvYXRpbmcgcG9pbnQgZGVwZW5kZW5jaWVzLgorICoKKyAqIE9uIEFSTSB0aGlzIGFwcGVhcnMgdG8gd29yayBzbG93ZXIsIHNvIFVTRV9IT1JORVJTX01FVEhPRCBpcyBub3QgZGVmYXVsdCBlbmFibGVkLgorICovCisKK2lubGluZSBkb3VibGUgUG9seTIoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgeCAqIEI7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTQoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyB4ICogKEIgKyB4ICogKEMgKyB4ICogKEQpKSk7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTcoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIEEgKyB4ICogKEIgKyB4ICogKEMgKyB4ICogKEQgKyB4ICogKEUgKyB4ICogKEYgKyB4ICogKEcpKSkpKSk7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTkoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSBFLCBkb3VibGUgRiwgZG91YmxlIEcsCisgICAgICAgIGRvdWJsZSBILCBkb3VibGUgSSwgZG91YmxlIHgpIHsKKyAgICByZXR1cm4gQSArIHggKiAoQiArIHggKiAoQyArIHggKiAoRCArIHggKiAoRSArIHggKiAoRiArIHggKiAoRyArIHggKiAoSCArIHggKiAoSSkpKSkpKSkpOworfQorCisjZWxzZQorLyogUG9seW5vbWlhbCBldmFsdWF0aW9uIG9mIEEgKyBCeCArIEN4XjIgKyBEeF4zICsgLi4uCisgKiB1c2luZyBFc3RyaW4ncyBNZXRob2Q6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXN0cmluJ3Nfc2NoZW1lCisgKgorICogVGhpcyBpcyB0eXBpY2FsbHkgZmFzdGVyLCBwZXJoYXBzIGdhaW5zIGFib3V0IDUtMTAlIG92ZXJhbGwgb24gQVJNIHByb2Nlc3NvcnMKKyAqIG92ZXIgSG9ybmVyJ3MgbWV0aG9kIGFib3ZlLgorICovCisKK2lubGluZSBkb3VibGUgUG9seTIoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgeCkgeworICAgIHJldHVybiBBICsgQiAqIHg7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTMoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIHgsIGRvdWJsZSB4MikgeworICAgIHJldHVybiBQb2x5MihBLCBCLCB4KSArIEMgKiB4MjsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Myhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgeCkgeworICAgIHJldHVybiBQb2x5MihBLCBCLCB4KSArIEMgKiB4ICogeDsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5NChkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIHgsIGRvdWJsZSB4MikgeworICAgIHJldHVybiBQb2x5MihBLCBCLCB4KSArIFBvbHkyKEMsIEQsIHgpICogeDI7IC8vIHNhbWUgYXMgcG9seTIocG9seTIsIHBvbHkyLCB4Mik7Cit9CisKK2lubGluZSBkb3VibGUgUG9seTQoZG91YmxlIEEsIGRvdWJsZSBCLCBkb3VibGUgQywgZG91YmxlIEQsIGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIFBvbHk0KEEsIEIsIEMsIEQsIHgsIHggKiB4KTsKK30KKworaW5saW5lIGRvdWJsZSBQb2x5Nyhkb3VibGUgQSwgZG91YmxlIEIsIGRvdWJsZSBDLCBkb3VibGUgRCwgZG91YmxlIEUsIGRvdWJsZSBGLCBkb3VibGUgRywKKyAgICAgICAgZG91YmxlIHgpIHsKKyAgICBkb3VibGUgeDIgPSB4ICogeDsKKyAgICByZXR1cm4gUG9seTQoQSwgQiwgQywgRCwgeCwgeDIpICsgUG9seTMoRSwgRiwgRywgeCwgeDIpICogKHgyICogeDIpOworfQorCitpbmxpbmUgZG91YmxlIFBvbHk4KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgSCwgZG91YmxlIHgsIGRvdWJsZSB4MiwgZG91YmxlIHg0KSB7CisgICAgcmV0dXJuIFBvbHk0KEEsIEIsIEMsIEQsIHgsIHgyKSArIFBvbHk0KEUsIEYsIEcsIEgsIHgsIHgyKSAqIHg0OworfQorCitpbmxpbmUgZG91YmxlIFBvbHk5KGRvdWJsZSBBLCBkb3VibGUgQiwgZG91YmxlIEMsIGRvdWJsZSBELCBkb3VibGUgRSwgZG91YmxlIEYsIGRvdWJsZSBHLAorICAgICAgICBkb3VibGUgSCwgZG91YmxlIEksIGRvdWJsZSB4KSB7CisgICAgZG91YmxlIHgyID0geCAqIHg7CisjaWYgMQorICAgIC8vIEl0IGRvZXMgbm90IHNlZW0gZmFzdGVyIHRvIGV4cGxpY2l0bHkgZGVjb21wb3NlIFBvbHk4IGludG8gUG9seTQsIGJ1dAorICAgIC8vIGNvdWxkIGRlcGVuZCBvbiBjb21waWxlciBmbG9hdGluZyBwb2ludCBzY2hlZHVsaW5nLgorICAgIGRvdWJsZSB4NCA9IHgyICogeDI7CisgICAgcmV0dXJuIFBvbHk4KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIHgsIHgyLCB4NCkgKyBJICogKHg0ICogeDQpOworI2Vsc2UKKyAgICBkb3VibGUgdmFsID0gUG9seTQoQSwgQiwgQywgRCwgeCwgeDIpOworICAgIGRvdWJsZSB4NCA9IHgyICogeDI7CisgICAgcmV0dXJuIHZhbCArIFBvbHk0KEUsIEYsIEcsIEgsIHgsIHgyKSAqIHg0ICsgSSAqICh4NCAqIHg0KTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIEkwKGRvdWJsZSB4KSB7CisgICAgaWYgKHggPCAzLjc1KSB7CisgICAgICAgIHggKj0geDsKKyAgICAgICAgcmV0dXJuIFBvbHk3KEkwVGVybTwwPjo6dmFsdWUsIEkwVGVybTwxPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDI+Ojp2YWx1ZSwgSTBUZXJtPDM+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08ND46OnZhbHVlLCBJMFRlcm08NT46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTw2Pjo6dmFsdWUsIHgpOyAvLyBlIDwgMS42ZS03CisgICAgfQorICAgIGlmICgxKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNlcmllcyBleHBhbnNpb24gY29lZnMgYXJlIGVhc3kgdG8gY2FsY3VsYXRlLCBidXQgYXJlIGV4cGFuZGVkIGFyb3VuZCAwLAorICAgICAgICAgKiBzbyBlcnJvciBpcyB1bmVxdWFsIG92ZXIgdGhlIGludGVydmFsIDAgPCB4IDwgMy43NSwgdGhlIGVycm9yIGJlaW5nCisgICAgICAgICAqIHNpZ25pZmljYW50bHkgYmV0dGVyIG5lYXIgMC4KKyAgICAgICAgICoKKyAgICAgICAgICogQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gdXNlIHByZWNpc2UgbWluaW1heCBwb2x5bm9taWFsIGZpdHMuCisgICAgICAgICAqCisgICAgICAgICAqIFdlIHVzZSBhIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgc29sdXRpb24gZm9yIDMuNzUgPCB4IDwgMTUsIGJhc2VkIG9uCisgICAgICAgICAqIHRoZSB0YWJsZXMgaW4gQmxhaXIgYW5kIEVkd2FyZHMsICJTdGFibGUgUmF0aW9uYWwgTWluaW1heCBBcHByb3hpbWF0aW9ucworICAgICAgICAgKiB0byB0aGUgTW9kaWZpZWQgQmVzc2VsIEZ1bmN0aW9ucyBJMCh4KSBhbmQgSTEoeCkiLCBDaGFsayBIaWxsIE51Y2xlYXIgTGFib3JhdG9yeSwKKyAgICAgICAgICogQUVDTC00OTI4LgorICAgICAgICAgKgorICAgICAgICAgKiBodHRwOi8vd3d3LmlhZWEub3JnL2luaXMvY29sbGVjdGlvbi9OQ0xDb2xsZWN0aW9uU3RvcmUvX1B1YmxpYy8wNi8xNzgvNjE3ODY2Ny5wZGYKKyAgICAgICAgICoKKyAgICAgICAgICogU2VlIFRhYmxlIDExIGZvciAwIDwgeCA8IDE1OyBlIDwgMTBeKC03LjEzKS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogQmV0YSBjYW5ub3QgZXhjZWVkIDE1IChoZW5jZSBTdG9wYmFuZCBjYW5ub3QgZXhjZWVkIDE0NGRCID0gMjRiKS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBzcGVlZHMgdXAgb3ZlcmFsbCBjb21wdXRhdGlvbiBieSBhYm91dCA0MCUgb3ZlciB1c2luZyB0aGUgZWxzZSBjbGF1c2UgYmVsb3csCisgICAgICAgICAqIHdoaWNoIHJlcXVpcmVzIHNxcnQgYW5kIGV4cC4KKyAgICAgICAgICoKKyAgICAgICAgICovCisKKyAgICAgICAgeCAqPSB4OworICAgICAgICBkb3VibGUgbnVtID0gUG9seTkoLTAuMTM1NDQ5Mzg0MzBlOSwgLTAuMzMxNTM3NTQ1MTJlOCwKKyAgICAgICAgICAgICAgICAtMC4xOTQwNjYzMTk0NmU3LCAtMC40ODA1ODMxODc4M2U1LAorICAgICAgICAgICAgICAgIC0wLjYzMjY5NzgzMzYwZTMsIC0wLjQ5NTIwNzc5MDcwZTEsCisgICAgICAgICAgICAgICAgLTAuMjQ5NzA5MTAzNzBlLTEsIC0wLjc0NzQxMTU5NTUwZS00LAorICAgICAgICAgICAgICAgIC0wLjE4MjU3NjEyNDYwZS02LCB4KTsKKyAgICAgICAgZG91YmxlIHkgPSB4IC0gMjI1LjsgLy8gcmVmbGVjdGlvbiBhcm91bmQgMTUgKHNxdWFyZWQpCisgICAgICAgIGRvdWJsZSBkZW4gPSBQb2x5NCgtMC4zNDU5ODczNzE5NmU4LCAwLjIzODUyNjQzMTgxZTYsCisgICAgICAgICAgICAgICAgLTAuNzA2OTkzODc2MjBlMywgMC4xMDAwMDAwMDAwMGUxLCB5KTsKKyAgICAgICAgcmV0dXJuIG51bSAvIGRlbjsKKworI2lmIElPX0VYVEVOREVEX0JFVEEKKyAgICAgICAgLyogVGFibGUgNDIgZm9yIHggPiAxNTsgZSA8IDEwXigtOC4xMSkuCisgICAgICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgQmV0YT4xNSwgYnV0IGlzIGRpc2FibGVkIGhlcmUgYXMKKyAgICAgICAgICogd2UgbmV2ZXIgdXNlIEJldGEgdGhhdCBoaWdoLgorICAgICAgICAgKgorICAgICAgICAgKiBOT1RFOiBUaGlzIHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIHggPiAxNS4KKyAgICAgICAgICovCisKKyAgICAgICAgZG91YmxlIHkgPSAxLi94OworICAgICAgICBkb3VibGUgeiA9IHkgLSAoMS4vMTUpOworICAgICAgICBkb3VibGUgbnVtID0gUG9seTIoMC40MTUwNzk4NjE3NDZlMSwgLTAuNTE0OTA5MjQ5NmUxLCB6KTsKKyAgICAgICAgZG91YmxlIGRlbiA9IFBvbHkzKDAuMTAzMTUwNzYzODIzZTIsIC0wLjE0MTgxNjg3NDEzZTIsCisgICAgICAgICAgICAgICAgMC4xMDAwMDAwMDAwZTEsIHopOworICAgICAgICByZXR1cm4gZXhwKHgpICogc3FydCh5KSAqIG51bSAvIGRlbjsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5PVCBVU0VELCBidXQgcmVmZXJlbmNlIGZvciBsYXJnZSBCZXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBBYnJhbW93aXR6IGFuZCBTdGVndW4gYXN5bXB0b3RpYyBmb3JtdWxhLgorICAgICAgICAgKiB3b3JrcyBmb3IgeCA+IDMuNzUuCisgICAgICAgICAqLworICAgICAgICBkb3VibGUgeSA9IDEuL3g7CisgICAgICAgIHJldHVybiBleHAoeCkgKiBzcXJ0KHkpICoKKyAgICAgICAgICAgICAgICAvLyBub3RlOiByZWNpcHJvY2FsIHNxdWFyZXJvb3QgbWF5IGJlIGVhc2llciEKKyAgICAgICAgICAgICAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zhc3RfaW52ZXJzZV9zcXVhcmVfcm9vdAorICAgICAgICAgICAgICAgIFBvbHk5KEkwQVRlcm08MD46OnZhbHVlLCBJMEFUZXJtPDE+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEkwQVRlcm08Mj46OnZhbHVlLCBJMEFUZXJtPDM+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEkwQVRlcm08ND46OnZhbHVlLCBJMEFUZXJtPDU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEkwQVRlcm08Nj46OnZhbHVlLCBJMEFUZXJtPDc+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEkwQVRlcm08OD46OnZhbHVlLCB5KTsgLy8gKC4uLiBlKSA8IDEuOWUtNworICAgIH0KK30KKworLyogQSBzcGVlZCBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTW9kaWZpZWQgQmVzc2VsIEkwKCkgd2hpY2ggaW5jb3Jwb3JhdGVzCisgKiB0aGUgc3FydCBhbmQgbnVtZXJhdG9yIG11bHRpcGx5IGFuZCBkZW5vbWluYXRvciBkaXZpZGUgaW50byB0aGUgY29tcHV0YXRpb24uCisgKiBUaGlzIHNwZWVkcyB1cCBmaWx0ZXIgY29tcHV0YXRpb24gYnkgYWJvdXQgMTAtMTUlLgorICovCitzdGF0aWMgaW5saW5lIGRvdWJsZSBJMFNxclJhdChkb3VibGUgeDIsIGRvdWJsZSBudW0sIGRvdWJsZSBkZW4pIHsKKyAgICBpZiAoeDIgPCAoMy43NSAqIDMuNzUpKSB7CisgICAgICAgIHJldHVybiBQb2x5NyhJMFRlcm08MD46OnZhbHVlLCBJMFRlcm08MT46OnZhbHVlLAorICAgICAgICAgICAgICAgIEkwVGVybTwyPjo6dmFsdWUsIEkwVGVybTwzPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgSTBUZXJtPDQ+Ojp2YWx1ZSwgSTBUZXJtPDU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICBJMFRlcm08Nj46OnZhbHVlLCB4MikgKiBudW0gLyBkZW47IC8vIGUgPCAxLjZlLTcKKyAgICB9CisgICAgbnVtICo9IFBvbHk5KC0wLjEzNTQ0OTM4NDMwZTksIC0wLjMzMTUzNzU0NTEyZTgsCisgICAgICAgICAgICAtMC4xOTQwNjYzMTk0NmU3LCAtMC40ODA1ODMxODc4M2U1LAorICAgICAgICAgICAgLTAuNjMyNjk3ODMzNjBlMywgLTAuNDk1MjA3NzkwNzBlMSwKKyAgICAgICAgICAgIC0wLjI0OTcwOTEwMzcwZS0xLCAtMC43NDc0MTE1OTU1MGUtNCwKKyAgICAgICAgICAgIC0wLjE4MjU3NjEyNDYwZS02LCB4Mik7IC8vIGUgPCAxMF4oLTcuMTMpLgorICAgIGRvdWJsZSB5ID0geDIgLSAyMjUuOyAvLyByZWZsZWN0aW9uIGFyb3VuZCAxNSAoc3F1YXJlZCkKKyAgICBkZW4gKj0gUG9seTQoLTAuMzQ1OTg3MzcxOTZlOCwgMC4yMzg1MjY0MzE4MWU2LAorICAgICAgICAgICAgLTAuNzA2OTkzODc2MjBlMywgMC4xMDAwMDAwMDAwMGUxLCB5KTsKKyAgICByZXR1cm4gbnVtIC8gZGVuOworfQorCisvKgorICogY2FsY3VsYXRlcyB0aGUgdHJhbnNpdGlvbiBiYW5kd2lkdGggZm9yIGEgS2Fpc2VyIGZpbHRlcgorICoKKyAqIEZvcm11bGEgMy4yLjgsIFZhaWR5YW5hdGhhbiwgX011bHRpcmF0ZSBTeXN0ZW1zIGFuZCBGaWx0ZXIgQmFua3NfLCBwLiA0OAorICogRm9ybXVsYSA3Ljc2LCBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZS10aW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDU0MgorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZiBpcyBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIHBlciBmaWx0ZXIgcGhhc2UuCisgKgorICogQHBhcmFtIHN0b3BCYW5kQXR0ZW4gaXMgdGhlIHN0b3AgYmFuZCBhdHRlbnVhdGlvbiBkZXNpcmVkLgorICoKKyAqIEByZXR1cm4gdGhlIHRyYW5zaXRpb24gYmFuZHdpZHRoIGluIG5vcm1hbGl6ZWQgZnJlcXVlbmN5ICgwIDw9IGYgPD0gMC41KQorICovCitzdGF0aWMgaW5saW5lIGRvdWJsZSBmaXJLYWlzZXJUYncoaW50IGhhbGZOdW1Db2VmLCBkb3VibGUgc3RvcEJhbmRBdHRlbikgeworICAgIHJldHVybiAoc3RvcEJhbmRBdHRlbiAtIDcuOTUpLygoMi4qMTQuMzYpKmhhbGZOdW1Db2VmKTsKK30KKworLyoKKyAqIGNhbGN1bGF0ZXMgdGhlIGZpciB0cmFuc2ZlciByZXNwb25zZSBvZiB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyIGF0IHcuCisgKgorICogQ2FsY3VsYXRlcyB0aGUgRFRGVCB0cmFuc2ZlciBjb2VmZmljaWVudCBIKHcpIGZvciAwIDw9IHcgPD0gUEksIHV0aWxpemluZyB0aGUKKyAqIGZhY3QgdGhhdCBoW25dIGlzIHN5bW1ldHJpYyAoY29zaW5lcyBvbmx5LCBubyBjb21wbGV4IGFyaXRobWV0aWMpLgorICoKKyAqIFdlIHVzZSBHb2VydHplbCdzIGFsZ29yaXRobSB0byBhY2NlbGVyYXRlIHRoZSBjb21wdXRhdGlvbiB0byBlc3NlbnRpYWxseQorICogYSBzaW5nbGUgbXVsdGlwbHkgYW5kIDIgYWRkcyBwZXIgZmlsdGVyIGNvZWZmaWNpZW50IGhbXS4KKyAqCisgKiBCZSBjYXJlZnVsIGJlIGNhcmVmdWwgdG8gY29uc2lkZXIgdGhhdCBoW25dIGlzIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIsCisgKiB3aXRoIEwgcGhhc2VzLCBzbyByZXNjYWxpbmcgSCh3KS9MIGlzIHByb2JhYmx5IHdoYXQgeW91IGV4cGVjdCBmb3IgInVuaXR5IGdhaW4iLAorICogYXMgeW91IG9ubHkgdXNlIG9uZSBvZiB0aGUgcG9seXBoYXNlcyBhdCBhIHRpbWUuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBkb3VibGUgZmlyVHJhbnNmZXIoY29uc3QgVCogY29lZiwgaW50IEwsIGludCBoYWxmTnVtQ29lZiwgZG91YmxlIHcpIHsKKyAgICBkb3VibGUgYWNjdW0gPSBzdGF0aWNfY2FzdDxkb3VibGU+KGNvZWZbMF0pKjAuNTsgIC8vICJjZW50ZXIgY29lZmZpY2llbnQiIGZyb20gZmlyc3QgYmFuaworICAgIGNvZWYgKz0gaGFsZk51bUNvZWY7ICAgIC8vIHNraXAgZmlyc3QgZmlsdGVyYmFuayAocGlja2VkIHVwIGJ5IHRoZSBsYXN0IGZpbHRlcmJhbmspLgorI2lmIFNMT1dfRklSVFJBTlNGRVIKKyAgICAvKiBPcmlnaW5hbCBjb2RlIGZvciByZWZlcmVuY2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGUgYmVsb3csIGJ1dCBzbG93ZXIuICovCisgICAgZm9yIChpbnQgaT0xIDsgaTw9TCA7ICsraSkgeworICAgICAgICBmb3IgKGludCBqPTAsIGl4PWkgOyBqPGhhbGZOdW1Db2VmIDsgKytqLCBpeCs9TCkgeworICAgICAgICAgICAgYWNjdW0gKz0gY29zKGl4KncpKnN0YXRpY19jYXN0PGRvdWJsZT4oKmNvZWYrKyk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIC8qCisgICAgICogT3VyIG92ZXJhbGwgZmlsdGVyIGlzIHN0b3JlZCBzdHJpcGVkIGJ5IHBvbHlwaGFzZXMsIG5vdCBhIGNvbnRpZ3VvdXMgaFtuXS4KKyAgICAgKiBXZSBjb3VsZCBmZXRjaCBjb2VmZmljaWVudHMgaW4gYSBub24tY29udGlndW91cyBmYXNoaW9uCisgICAgICogYnV0IHRoYXQgd2lsbCBub3Qgc2NhbGUgdG8gdmVjdG9yIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBXZSBhcHBseSBHb2VydHplbCdzIGFsZ29yaXRobSBkaXJlY3RseSB0byBlYWNoIHBvbHlwaGFzZSBmaWx0ZXIgYmFuayBpbnN0ZWFkIG9mCisgICAgICogdXNpbmcgY29zaW5lIGdlbmVyYXRpb24vbXVsdGlwbGljYXRpb24sIHRoZXJlYnkgc2F2aW5nIG9uZSBtdWx0aXBseSBwZXIgaW5uZXIgbG9vcC4KKyAgICAgKgorICAgICAqIFNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Hb2VydHplbF9hbGdvcml0aG0KKyAgICAgKiBBbHNvOiBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZSBUaW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDcyMC4KKyAgICAgKgorICAgICAqIFdlIHVzZSB0aGUgYmFzaWMgcmVjdXJzaW9uIHRvIGluY29ycG9yYXRlIHRoZSBjb3NpbmUgc3RlcHMgaW50byByZWFsIHNlcXVlbmNlIHhbbl06CisgICAgICogc1tuXSA9IHhbbl0gKyAoMmNvc3cpKnNbbi0xXSArIHNbbi0yXQorICAgICAqCisgICAgICogeVtuXSA9IHNbbl0gLSBlXihpdylzW24tMV0KKyAgICAgKiAgICAgID0gc3VtX3trPS1caW5mdHl9XntufSB4W2tdZV4oLWl3KG4taykpCisgICAgICogICAgICA9IGVeKC1pd24pIHN1bV97az0wfV57bn0geFtrXWVeKGl3aykKKyAgICAgKgorICAgICAqIFRoZSBzdW1tYXRpb24gY29udGFpbnMgdGhlIGZyZXF1ZW5jeSBzdGVwcyB3ZSB3YW50IG11bHRpcGxpZWQgYnkgdGhlIHNvdXJjZQorICAgICAqIChzaW1pbGFyIHRvIGEgRFRGVCkuCisgICAgICoKKyAgICAgKiBVc2luZyBzeW1tZXRyeSwgYW5kIGp1c3QgdGhlIHJlYWwgcGFydCAoYmUgY2FyZWZ1bCwgdGhpcyBtdXN0IGhhcHBlbgorICAgICAqIGFmdGVyIGFueSBpbnRlcm5hbCBjb21wbGV4IG11bHRpcGxpY2F0aW9ucyksIHRoZSBwb2x5cGhhc2UgZmlsdGVyYmFuaworICAgICAqIHRyYW5zZmVyIGZ1bmN0aW9uIGlzOgorICAgICAqCisgICAgICogSHBwW24sIHcsIHdfMF0gPSBzdW1fe2s9MH1ee259IHhba10gKiBjb3Mod2sgKyB3XzApCisgICAgICogICAgICAgICAgICAgICAgPSBSZXsgZV4oaXduICsgaXdfMCkgeVtuXX0KKyAgICAgKiAgICAgICAgICAgICAgICA9IGNvcyh3bit3XzApICogc1tuXSAtIGNvcyh3KG4rMSkrd18wKSAqIHNbbi0xXQorICAgICAqCisgICAgICogdXNpbmcgdGhlIGZhY3QgdGhhdCBzW25dIG9mIHJlYWwgeFtuXSBpcyByZWFsLgorICAgICAqCisgICAgICovCisgICAgZG91YmxlIGRjb3MgPSAyLiAqIGNvcyhMKncpOworICAgIGludCBzdGFydCA9ICgoaGFsZk51bUNvZWYpKkwgKyAxKTsKKyAgICBTaW5lR2VuIGNjKChzdGFydCAtIEwpICogdywgdywgdHJ1ZSk7IC8vIGNvc2luZQorICAgIFNpbmVHZW4gY3Aoc3RhcnQgKiB3LCB3LCB0cnVlKTsgLy8gY29zaW5lCisgICAgZm9yIChpbnQgaT0xIDsgaTw9TCA7ICsraSkgeworICAgICAgICBkb3VibGUgc2MgPSAwOworICAgICAgICBkb3VibGUgc3AgPSAwOworICAgICAgICBmb3IgKGludCBqPTAgOyBqPGhhbGZOdW1Db2VmIDsgKytqKSB7CisgICAgICAgICAgICBkb3VibGUgdG1wID0gc2M7CisgICAgICAgICAgICBzYyAgPSBzdGF0aWNfY2FzdDxkb3VibGU+KCpjb2VmKyspICsgZGNvcypzYyAtIHNwOworICAgICAgICAgICAgc3AgPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgYXJlIGF3ZnVsbHkgY2xldmVyLCB3ZSBjYW4gYXBwbHkgR29lcnR6ZWwncyBhbGdvcml0aG0KKyAgICAgICAgLy8gYWdhaW4gb24gdGhlIHNjIGFuZCBzcCBzZXF1ZW5jZXMgcmV0dXJuZWQgaGVyZS4KKyAgICAgICAgYWNjdW0gKz0gY2MudmFsdWVBZHZhbmNlKCkgKiBzYyAtIGNwLnZhbHVlQWR2YW5jZSgpICogc3A7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGFjY3VtKjIuOworfQorCisvKgorICogZXZhbHVhdGVzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHxIKGYpfCBib3VuZCBpbiBhIGJhbmQgcmVnaW9uLgorICoKKyAqIFRoaXMgaXMgdXN1YWxseSBkb25lIHdpdGggZXF1YWxseSBzcGFjZWQgaW5jcmVtZW50cyBpbiB0aGUgdGFyZ2V0IGJhbmQgaW4gcXVlc3Rpb24uCisgKiBUaGUgcGFzc2JhbmQgaXMgb2Z0ZW4gdmVyeSBzbWFsbCwgYW5kIHNhbXBsZWQgdGhhdCB3YXkuIFRoZSBzdG9wYmFuZCBpcyBvZnRlbiBtdWNoCisgKiBsYXJnZXIuCisgKgorICogV2UgdXNlIHRoZSBmYWN0IHRoYXQgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciBoYXMgYW4gYWRkaXRpb25hbCBiYW5rIGF0IHRoZSBlbmQKKyAqIGZvciBpbnRlcnBvbGF0aW9uOyBoZW5jZSBpdCBpcyBvdmVyc3BlY2lmaWVkIGZvciB0aGUgSChmKSBjb21wdXRhdGlvbi4gIFRodXMgdGhlCisgKiBmaXJzdCBwb2x5cGhhc2UgaXMgbmV2ZXIgYWN0dWFsbHkgY2hlY2tlZCwgZXhjZXB0aW5nIGl0cyBmaXJzdCB0ZXJtLgorICoKKyAqIEluIHRoaXMgY29kZSB3ZSB1c2UgdGhlIGZpclRyYW5zZmVyKCkgZXZhbHVhdG9yIGFib3ZlLCB3aGljaCB1c2VzIEdvZXJ0emVsJ3MKKyAqIGFsZ29yaXRobSB0byBjYWxjdWxhdGUgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIGF0IGVhY2ggcG9pbnQuCisgKgorICogVE9ETzogQW4gYWx0ZXJuYXRpdmUgd2l0aCBlcXVhbCBzcGFjaW5nIGlzIHRoZSBGRlQvREZULiAgQW4gYWx0ZXJuYXRpdmUgd2l0aCB1bmVxdWFsCisgKiBzcGFjaW5nIGlzIGEgY2hpcnAgdHJhbnNmb3JtLgorICoKKyAqIEBwYXJhbSBjb2VmIGlzIHRoZSBkZXNpZ25lZCBwb2x5cGhhc2UgZmlsdGVyIGJhbmtzCisgKgorICogQHBhcmFtIEwgaXMgdGhlIG51bWJlciBvZiBwaGFzZXMgKGZvciBpbnRlcnBvbGF0aW9uKQorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZiBzaG91bGQgYmUgaGFsZiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgYSBzaW5nbGUKKyAqIHBvbHlwaGFzZS4KKyAqCisgKiBAcGFyYW0gZnN0YXJ0IGlzIHRoZSBub3JtYWxpemVkIGZyZXF1ZW5jeSBzdGFydC4KKyAqCisgKiBAcGFyYW0gZmVuZCBpcyB0aGUgbm9ybWFsaXplZCBmcmVxdWVuY3kgZW5kLgorICoKKyAqIEBwYXJhbSBzdGVwcyBpcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIHRvIHRha2UgKHNhbXBsaW5nKSBiZXR3ZWVuIGZyZXF1ZW5jeSBzdGFydCBhbmQgZW5kCisgKgorICogQHBhcmFtIGZpck1pbiByZXR1cm5zIHRoZSBtaW5pbXVtIHRyYW5zZmVyIHxIKGYpfCBmb3VuZAorICoKKyAqIEBwYXJhbSBmaXJNYXggcmV0dXJucyB0aGUgbWF4aW11bSB0cmFuc2ZlciB8SChmKXwgZm91bmQKKyAqCisgKiAwIDw9IGYgPD0gMC41LgorICogVGhpcyBpcyB1c2VkIHRvIHRlc3QgcGFzc2JhbmQgYW5kIHN0b3BiYW5kIHBlcmZvcm1hbmNlLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHRlc3RGaXIoY29uc3QgVCogY29lZiwgaW50IEwsIGludCBoYWxmTnVtQ29lZiwKKyAgICAgICAgZG91YmxlIGZzdGFydCwgZG91YmxlIGZlbmQsIGludCBzdGVwcywgZG91YmxlICZmaXJNaW4sIGRvdWJsZSAmZmlyTWF4KSB7CisgICAgZG91YmxlIHdzdGFydCA9IGZzdGFydCooMi4qTV9QSSk7CisgICAgZG91YmxlIHdlbmQgPSBmZW5kKigyLipNX1BJKTsKKyAgICBkb3VibGUgd3N0ZXAgPSAod2VuZCAtIHdzdGFydCkvc3RlcHM7CisgICAgZG91YmxlIGZtYXgsIGZtaW47CisgICAgZG91YmxlIHRyZiA9IGZpclRyYW5zZmVyKGNvZWYsIEwsIGhhbGZOdW1Db2VmLCB3c3RhcnQpOworICAgIGlmICh0cmY8MCkgeworICAgICAgICB0cmYgPSAtdHJmOworICAgIH0KKyAgICBmbWluID0gZm1heCA9IHRyZjsKKyAgICB3c3RhcnQgKz0gd3N0ZXA7CisgICAgZm9yIChpbnQgaT0xOyBpPHN0ZXBzOyArK2kpIHsKKyAgICAgICAgdHJmID0gZmlyVHJhbnNmZXIoY29lZiwgTCwgaGFsZk51bUNvZWYsIHdzdGFydCk7CisgICAgICAgIGlmICh0cmY8MCkgeworICAgICAgICAgICAgdHJmID0gLXRyZjsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJmPmZtYXgpIHsKKyAgICAgICAgICAgIGZtYXggPSB0cmY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHJmPGZtaW4pIHsKKyAgICAgICAgICAgIGZtaW4gPSB0cmY7CisgICAgICAgIH0KKyAgICAgICAgd3N0YXJ0ICs9IHdzdGVwOworICAgIH0KKyAgICAvLyByZW5vcm1hbGl6ZSAtIHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGludGVnZXIgZmlsdGVyIHR5cGVzCisgICAgZG91YmxlIG5vcm0gPSAxLi8oKDFVTEw8PChzaXplb2YoVCkqOC0xKSkqTCk7CisKKyAgICBmaXJNaW4gPSBmbWluICogbm9ybTsKKyAgICBmaXJNYXggPSBmbWF4ICogbm9ybTsKK30KKworLyoKKyAqIGV2YWx1YXRlcyB0aGUgfEgoZil8IGxvd3Bhc3MgYmFuZCBjaGFyYWN0ZXJpc3RpY3MuCisgKgorICogVGhpcyBmdW5jdGlvbiB0ZXN0cyB0aGUgbG93cGFzcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIHRoZSBvdmVyYWxsIHBvbHlwaGFzZSBmaWx0ZXIsCisgKiBhbmQgaXMgdXNlZCB0byB2ZXJpZnkgdGhlIGRlc2lnbi4gIEZvciB0aGlzIGNhc2UsIGZwIHNob3VsZCBiZSBzZXQgdG8gdGhlCisgKiBwYXNzYmFuZCBub3JtYWxpemVkIGZyZXF1ZW5jeSBmcm9tIDAgdG8gMC41IGZvciB0aGUgb3ZlcmFsbCBmaWx0ZXIgKHRodXMgaXQKKyAqIGlzIHRoZSBkZXNpZ25lZCBwb2x5cGhhc2UgYmFuayB2YWx1ZSAvIEwpLiAgTGlrZXdpc2UgZm9yIGZzLgorICoKKyAqIEBwYXJhbSBjb2VmIGlzIHRoZSBkZXNpZ25lZCBwb2x5cGhhc2UgZmlsdGVyIGJhbmtzCisgKgorICogQHBhcmFtIEwgaXMgdGhlIG51bWJlciBvZiBwaGFzZXMgKGZvciBpbnRlcnBvbGF0aW9uKQorICoKKyAqIEBwYXJhbSBoYWxmTnVtQ29lZiBzaG91bGQgYmUgaGFsZiB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgYSBzaW5nbGUKKyAqIHBvbHlwaGFzZS4KKyAqCisgKiBAcGFyYW0gZnAgaXMgdGhlIHBhc3NiYW5kIG5vcm1hbGl6ZWQgZnJlcXVlbmN5LCAwIDwgZnAgPCBmcyA8IDAuNS4KKyAqCisgKiBAcGFyYW0gZnMgaXMgdGhlIHN0b3BiYW5kIG5vcm1hbGl6ZWQgZnJlcXVlbmN5LCAwIDwgZnAgPCBmcyA8IDAuNS4KKyAqCisgKiBAcGFyYW0gcGFzc1N0ZXBzIGlzIHRoZSBudW1iZXIgb2YgcGFzc2JhbmQgc2FtcGxpbmcgc3RlcHMuCisgKgorICogQHBhcmFtIHN0b3BTdGVwcyBpcyB0aGUgbnVtYmVyIG9mIHN0b3BiYW5kIHNhbXBsaW5nIHN0ZXBzLgorICoKKyAqIEBwYXJhbSBwYXNzTWluIGlzIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoZSBwYXNzYmFuZAorICoKKyAqIEBwYXJhbSBwYXNzTWF4IGlzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBwYXNzYmFuZCAodXNlZnVsIGZvciBzY2FsaW5nKS4gIFRoaXMgc2hvdWxkCisgKiBiZSBsZXNzIHRoYW4gMS4sIHRvIGF2b2lkIHNpbmUgd2F2ZSB0ZXN0IG92ZXJmbG93LgorICoKKyAqIEBwYXJhbSBwYXNzUmlwcGxlIGlzIHRoZSBwYXNzYmFuZCByaXBwbGUuICBUeXBpY2FsbHkgdGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIDAuMSBmb3IKKyAqIGFuIGF1ZGlvIGZpbHRlci4gIEdlbmVyYWxseSBzcGVha2VyL2hlYWRwaG9uZSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIHdpbGwgZG9taW5hdGUKKyAqIHRoZSBwYXNzYmFuZCB0ZXJtLgorICoKKyAqIEBwYXJhbSBzdG9wTWF4IGlzIHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBzdG9wYmFuZC4KKyAqCisgKiBAcGFyYW0gc3RvcFJpcHBsZSBpcyB0aGUgc3RvcGJhbmQgcmlwcGxlLCBhbHNvIGtub3duIGFzIHN0b3BiYW5kIGF0dGVudWF0aW9uLgorICogVHlwaWNhbGx5IHRoaXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB+ODBkQiBmb3IgbG93IHF1YWxpdHksIGFuZCBncmVhdGVyIHRoYW4KKyAqIH4xMDBkQiBmb3IgZnVsbCAxNmIgcXVhbGl0eSwgb3RoZXJ3aXNlIGFsaWFzaW5nIG1heSBiZWNvbWUgbm90aWNlYWJsZS4KKyAqCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgdGVzdEZpcihjb25zdCBUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAorICAgICAgICBkb3VibGUgZnAsIGRvdWJsZSBmcywgaW50IHBhc3NTdGVwcywgaW50IHN0b3BTdGVwcywKKyAgICAgICAgZG91YmxlICZwYXNzTWluLCBkb3VibGUgJnBhc3NNYXgsIGRvdWJsZSAmcGFzc1JpcHBsZSwKKyAgICAgICAgZG91YmxlICZzdG9wTWF4LCBkb3VibGUgJnN0b3BSaXBwbGUpIHsKKyAgICBkb3VibGUgZm1pbiwgZm1heDsKKyAgICB0ZXN0RmlyKGNvZWYsIEwsIGhhbGZOdW1Db2VmLCAwLiwgZnAsIHBhc3NTdGVwcywgZm1pbiwgZm1heCk7CisgICAgZG91YmxlIGQxID0gKGZtYXggLSBmbWluKS8yLjsKKyAgICBwYXNzTWluID0gZm1pbjsKKyAgICBwYXNzTWF4ID0gZm1heDsKKyAgICBwYXNzUmlwcGxlID0gLTIwLipsb2cxMCgxLiAtIGQxKTsgLy8gcGFzc2JhbmQgcmlwcGxlCisgICAgdGVzdEZpcihjb2VmLCBMLCBoYWxmTnVtQ29lZiwgZnMsIDAuNSwgc3RvcFN0ZXBzLCBmbWluLCBmbWF4KTsKKyAgICAvLyBmbWluIGlzIHJlYWxseSBub3QgaW1wb3J0YW50IGZvciB0aGUgc3RvcGJhbmQuCisgICAgc3RvcE1heCA9IGZtYXg7CisgICAgc3RvcFJpcHBsZSA9IC0yMC4qbG9nMTAoZm1heCk7IC8vIHN0b3BiYW5kIHJpcHBsZS9hdHRlbnVhdGlvbgorfQorCisvKgorICogQ2FsY3VsYXRlcyB0aGUgb3ZlcmFsbCBwb2x5cGhhc2UgZmlsdGVyIGJhc2VkIG9uIGEgd2luZG93ZWQgc2luYyBmdW5jdGlvbi4KKyAqCisgKiBUaGUgd2luZG93ZWQgc2luYyBpcyBhbiBvZGQgbGVuZ3RoIHN5bW1ldHJpYyBmaWx0ZXIgb2YgZXhhY3RseSBMKmhhbGZOdW1Db2VmKjIrMQorICogdGFwcyBmb3IgdGhlIGVudGlyZSBrZXJuZWwuICBUaGlzIGlzIHRoZW4gZGVjb21wb3NlZCBpbnRvIEwrMSBwb2x5cGhhc2UgZmlsdGVyYmFua3MuCisgKiBUaGUgbGFzdCBmaWx0ZXJiYW5rIGlzIHVzZWQgZm9yIGludGVycG9sYXRpb24gcHVycG9zZXMgKGFuZCBpcyBtb3N0bHkgY29tcG9zZWQKKyAqIG9mIHRoZSBmaXJzdCBiYW5rIHNoaWZ0ZWQgYnkgb25lIHNhbXBsZSksIGFuZCBpcyB1bm5lY2Vzc2FyeSBpZiBvbmUgZG9lcworICogbm90IGRvIGludGVycG9sYXRpb24uCisgKgorICogV2UgdXNlIHRoZSBsYXN0IGZpbHRlcmJhbmsgZm9yIHNvbWUgdHJhbnNmZXIgZnVuY3Rpb24gY2FsY3VsYXRpb24gcHVycG9zZXMsCisgKiBzbyBpdCBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgYW55d2F5cy4KKyAqCisgKiBAcGFyYW0gY29lZiBpcyB0aGUgY2FsbGVyIGFsbG9jYXRlZCBzcGFjZSBmb3IgY29lZmZpY2llbnRzLiAgVGhpcyBzaG91bGQgYmUKKyAqIGV4YWN0bHkgKEwrMSkqaGFsZk51bUNvZWYgaW4gc2l6ZS4KKyAqCisgKiBAcGFyYW0gTCBpcyB0aGUgbnVtYmVyIG9mIHBoYXNlcyAoZm9yIGludGVycG9sYXRpb24pCisgKgorICogQHBhcmFtIGhhbGZOdW1Db2VmIHNob3VsZCBiZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBhIHNpbmdsZQorICogcG9seXBoYXNlLgorICoKKyAqIEBwYXJhbSBzdG9wQmFuZEF0dGVuIGlzIHRoZSBzdG9wYmFuZCB2YWx1ZSwgc2hvdWxkIGJlID41MGRCLgorICoKKyAqIEBwYXJhbSBmY3IgaXMgY3V0b2ZmIGZyZXF1ZW5jeS9zYW1wbGluZyByYXRlICg8MC41KS4gIEF0IHRoaXMgcG9pbnQsIHRoZSBlbmVyZ3kKKyAqIHNob3VsZCBiZSA2ZEIgbGVzcy4gKGZjciBpcyB3aGVyZSB0aGUgYW1wbGl0dWRlIGRyb3BzIGJ5IGhhbGYpLiAgVXNlIHRoZQorICogZmlyS2Fpc2VyVGJ3KCkgdG8gY2FsY3VsYXRlIHRoZSB0cmFuc2l0aW9uIGJhbmR3aWR0aC4gIGZjciBpcyB0aGUgbWlkcG9pbnQKKyAqIGJldHdlZW4gdGhlIHN0b3AgYmFuZCBhbmQgdGhlIHBhc3MgYmFuZCAoZnN0b3ArZnBhc3MpLzIuCisgKgorICogQHBhcmFtIGF0dGVuIGlzIHRoZSBhdHRlbnVhdGlvbiAoZ2VuZXJhbGx5IHNsaWdodGx5IGxlc3MgdGhhbiAxKS4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBmaXJLYWlzZXJHZW4oVCogY29lZiwgaW50IEwsIGludCBoYWxmTnVtQ29lZiwKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGRvdWJsZSBmY3IsIGRvdWJsZSBhdHRlbikgeworICAgIC8vCisgICAgLy8gRm9ybXVsYSAzLjIuNSwgMy4yLjcsIFZhaWR5YW5hdGhhbiwgX011bHRpcmF0ZSBTeXN0ZW1zIGFuZCBGaWx0ZXIgQmFua3NfLCBwLiA0OAorICAgIC8vIEZvcm11bGEgNy43NSwgT3BwZW5oZWltIGFuZCBTY2hhZmVyLCBfRGlzY3JldGUtdGltZSBTaWduYWwgUHJvY2Vzc2luZywgM2VfLCBwLiA1NDIKKyAgICAvLworICAgIC8vIFNlZSBhbHNvOiBodHRwOi8vbWVsb2RpLmVlLndhc2hpbmd0b24uZWR1L2NvdXJzZXMvZWU1MTgvbm90ZXMvbGVjMTcucGRmCisgICAgLy8KKyAgICAvLyBLYWlzZXIgd2luZG93IGFuZCBiZXRhIHBhcmFtZXRlcgorICAgIC8vCisgICAgLy8gICAgICAgICB8IDAuMTEwMiooQSAtIDguNykgICAgICAgICAgICAgICAgICAgICAgICAgQSA+IDUwCisgICAgLy8gIGJldGEgPSB8IDAuNTg0MiooQSAtIDIxKV4wLjQgKyAwLjA3ODg2KihBIC0gMjEpICAgMjEgPD0gQSA8PSA1MAorICAgIC8vICAgICAgICAgfCAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPCAyMQorICAgIC8vCisgICAgLy8gd2l0aCBBIGlzIHRoZSBkZXNpcmVkIHN0b3AtYmFuZCBhdHRlbnVhdGlvbiBpbiBkQkZTCisgICAgLy8KKyAgICAvLyAgICAzMCBkQiAgICAyLjIxMAorICAgIC8vICAgIDQwIGRCICAgIDMuMzg0CisgICAgLy8gICAgNTAgZEIgICAgNC41MzgKKyAgICAvLyAgICA2MCBkQiAgICA1LjY1OAorICAgIC8vICAgIDcwIGRCICAgIDYuNzY0CisgICAgLy8gICAgODAgZEIgICAgNy44NjUKKyAgICAvLyAgICA5MCBkQiAgICA4Ljk2MAorICAgIC8vICAgMTAwIGRCICAgMTAuMDU2CisKKyAgICBjb25zdCBpbnQgTiA9IEwgKiBoYWxmTnVtQ29lZjsgLy8gbm9uLW5lZ2F0aXZlIGhhbGYKKyAgICBjb25zdCBkb3VibGUgYmV0YSA9IDAuMTEwMiAqIChzdG9wQmFuZEF0dGVuIC0gOC43KTsgLy8gPj0gNTBkQiBhbHdheXMKKyAgICBjb25zdCBkb3VibGUgeHN0ZXAgPSAoMi4gKiBNX1BJKSAqIGZjciAvIEw7CisgICAgY29uc3QgZG91YmxlIHhmcmFjID0gMS4gLyBOOworICAgIGNvbnN0IGRvdWJsZSB5c2NhbGUgPSBhdHRlbiAqIEwgLyAoSTAoYmV0YSkgKiBNX1BJKTsKKyAgICBjb25zdCBkb3VibGUgc3FyYmV0YSA9IHNxcihiZXRhKTsKKworICAgIC8vIFdlIHVzZSBzaW5lIGdlbmVyYXRvcnMsIHdoaWNoIGNvbXB1dGVzIHNpbmVzIG9uIHJlZ3VsYXIgc3RlcCBpbnRlcnZhbHMuCisgICAgLy8gVGhpcyBzcGVlZHMgdXAgb3ZlcmFsbCBjb21wdXRhdGlvbiBhYm91dCA0MCUgZnJvbSBjb21wdXRpbmcgdGhlIHNpbmUgZGlyZWN0bHkuCisKKyAgICBTaW5lR2VuR2VuIHNnZygwLiwgeHN0ZXAsIEwqeHN0ZXApOyAvLyBnZW5lcmF0ZXMgc2luZSBnZW5lcmF0b3JzIChvbmUgcGVyIHBvbHlwaGFzZSkKKworICAgIGZvciAoaW50IGk9MCA7IGk8PUwgOyArK2kpIHsgLy8gZ2VuZXJhdGUgYW4gZXh0cmEgc2V0IG9mIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgLy8gY29tcHV0YXRpb24gZm9yIGEgc2luZ2xlIHBvbHlwaGFzZSBvZiB0aGUgb3ZlcmFsbCBmaWx0ZXIuCisgICAgICAgIFNpbmVHZW4gc2cgPSBzZ2cudmFsdWVBZHZhbmNlKCk7IC8vIGN1cnJlbnQgc2luZSBnZW5lcmF0b3IgZm9yICJqIiBpbm5lciBsb29wLgorICAgICAgICBkb3VibGUgZXJyID0gMDsgLy8gZm9yIG5vaXNlIHNoYXBpbmcgb24gaW50MTZfdCBjb2VmZmljaWVudHMgKG92ZXIgZWFjaCBwb2x5cGhhc2UpCisKKyAgICAgICAgZm9yIChpbnQgaj0wLCBpeD1pIDsgajxoYWxmTnVtQ29lZiA7ICsraiwgaXgrPUwpIHsKKyAgICAgICAgICAgIGRvdWJsZSB5OworICAgICAgICAgICAgaWYgKENDX0xJS0VMWShpeCkpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgeCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oaXgpOworCisgICAgICAgICAgICAgICAgLy8gc2luZSBnZW5lcmF0b3I6IHNnLnZhbHVlQWR2YW5jZSgpIHJldHVybnMgc2luKGl4KnhzdGVwKTsKKyAgICAgICAgICAgICAgICAvLyB5ID0gSTAoYmV0YSAqIHNxcnQoMS4wIC0gc3FyKHggKiB4ZnJhYykpKSAqIHlzY2FsZSAqIHNnLnZhbHVlQWR2YW5jZSgpIC8geDsKKyAgICAgICAgICAgICAgICB5ID0gSTBTcXJSYXQoc3FyYmV0YSAqICgxLjAgLSBzcXIoeCAqIHhmcmFjKSksIHlzY2FsZSAqIHNnLnZhbHVlQWR2YW5jZSgpLCB4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgeSA9IDIuICogYXR0ZW4gKiBmY3I7IC8vIGNlbnRlciBvZiBmaWx0ZXIsIHNpbmMoMCkgPSAxLgorICAgICAgICAgICAgICAgIHNnLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzX3NhbWU8VCwgaW50MTZfdD46OnZhbHVlKSB7IC8vIGludDE2X3QgbmVlZHMgbm9pc2Ugc2hhcGluZworICAgICAgICAgICAgICAgICpjb2VmKysgPSBzdGF0aWNfY2FzdDxUPih0b2ludCh5LCAxVUxMPDwoc2l6ZW9mKFQpKjgtMSksIGVycikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc19zYW1lPFQsIGludDMyX3Q+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICpjb2VmKysgPSBzdGF0aWNfY2FzdDxUPih0b2ludCh5LCAxVUxMPDwoc2l6ZW9mKFQpKjgtMSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFzc3VtZWQgZmxvYXQgb3IgZG91YmxlCisgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfR0VOX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIxNjNmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyT3BzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9PUFNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfT1BTX0gKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKHRydWUpCisjZWxzZQorI2RlZmluZSBVU0VfSU5MSU5FX0FTU0VNQkxZIChmYWxzZSkKKyNlbmRpZgorCisjaWYgVVNFX0lOTElORV9BU1NFTUJMWSAmJiBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNkZWZpbmUgVVNFX05FT04gKHRydWUpCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKyNlbHNlCisjZGVmaW5lIFVTRV9ORU9OIChmYWxzZSkKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzX3NhbWUKK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19zYW1lPFQsIFQ+ICAvLyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxSTChpbnQgbGVmdCwgaW50MzJfdCBpbiwgdWludDMyX3QgdlJMKQoreworI2lmIFVTRV9JTkxJTkVfQVNTRU1CTFkKKyAgICBpbnQzMl90IG91dDsKKyAgICBpZiAobGVmdCkgeworICAgICAgICBhc20oICJzbXVsdGIgJVtvdXRdLCAlW2luXSwgJVt2UkxdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZSTF0iciIodlJMKQorICAgICAgICAgICAgIDogKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc20oICJzbXVsdHQgJVtvdXRdLCAlW2luXSwgJVt2UkxdIFxuIgorICAgICAgICAgICAgIDogW291dF0iPXIiKG91dCkKKyAgICAgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZSTF0iciIodlJMKQorICAgICAgICAgICAgIDogKTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgaW50MTZfdCB2ID0gbGVmdCA/IHN0YXRpY19jYXN0PGludDE2X3Q+KHZSTCkgOiBzdGF0aWNfY2FzdDxpbnQxNl90Pih2Ukw+PjE2KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KGluKSAqIHYpID4+IDE2KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZChpbnQxNl90IGluLCBpbnQxNl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic21sYWJiICVbb3V0XSwgJVt2XSwgJVtpbl0sICVbYV0gXG4iCisgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgIDogKTsKKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICByZXR1cm4gYSArIHYgKiBpbjsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bEFkZChpbnQxNl90IGluLCBpbnQzMl90IHYsIGludDMyX3QgYSkKK3sKKyNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic21sYXdiICVbb3V0XSwgJVt2XSwgJVtpbl0sICVbYV0gXG4iCisgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgIDogKTsKKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICByZXR1cm4gYSArIHN0YXRpY19jYXN0PGludDMyX3Q+KChzdGF0aWNfY2FzdDxpbnQ2NF90Pih2KSAqIGluKSA+PiAxNik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxBZGQoaW50MzJfdCBpbiwgaW50MzJfdCB2LCBpbnQzMl90IGEpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGFzbSggInNtbWxhICVbb3V0XSwgJVt2XSwgJVtpbl0sICVbYV0gXG4iCisgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgIDogKTsKKyAgICByZXR1cm4gb3V0OworI2Vsc2UKKyAgICByZXR1cm4gYSArIHN0YXRpY19jYXN0PGludDMyX3Q+KChzdGF0aWNfY2FzdDxpbnQ2NF90Pih2KSAqIGluKSA+PiAzMik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxBZGRSTChpbnQgbGVmdCwgdWludDMyX3QgaW5STCwgaW50MTZfdCB2LCBpbnQzMl90IGEpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGFzbSggInNtbGFiYiAlW291dF0sICVbdl0sICVbaW5STF0sICVbYV0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luUkxdIiVyIihpblJMKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgICAgICA6ICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNtKCAic21sYWJ0ICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgaW50MTZfdCBzID0gbGVmdCA/IHN0YXRpY19jYXN0PGludDE2X3Q+KGluUkwpIDogc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STD4+MTYpOworICAgIHJldHVybiBhICsgdiAqIHM7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZQoraW50MzJfdCBtdWxBZGRSTChpbnQgbGVmdCwgdWludDMyX3QgaW5STCwgaW50MzJfdCB2LCBpbnQzMl90IGEpCit7CisjaWYgVVNFX0lOTElORV9BU1NFTUJMWQorICAgIGludDMyX3Qgb3V0OworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIGFzbSggInNtbGF3YiAlW291dF0sICVbdl0sICVbaW5STF0sICVbYV0gXG4iCisgICAgICAgICAgICAgOiBbb3V0XSI9ciIob3V0KQorICAgICAgICAgICAgIDogW2luUkxdIiVyIihpblJMKSwgW3ZdInIiKHYpLCBbYV0iciIoYSkKKyAgICAgICAgICAgICA6ICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNtKCAic21sYXd0ICVbb3V0XSwgJVt2XSwgJVtpblJMXSwgJVthXSBcbiIKKyAgICAgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICAgICAgOiBbaW5STF0iJXIiKGluUkwpLCBbdl0iciIodiksIFthXSJyIihhKQorICAgICAgICAgICAgIDogKTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgaW50MTZfdCBzID0gbGVmdCA/IHN0YXRpY19jYXN0PGludDE2X3Q+KGluUkwpIDogc3RhdGljX2Nhc3Q8aW50MTZfdD4oaW5STD4+MTYpOworICAgIHJldHVybiBhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKHN0YXRpY19jYXN0PGludDY0X3Q+KHYpICogcykgPj4gMTYpOworI2VuZGlmCit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9PUFNfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjODA1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gZGVwZW5kcyBvbiBBdWRpb1Jlc2FtcGxlckZpck9wcy5oCisKKy8qIHZhcmlhbnQgZm9yIGlucHV0IHR5cGUgVEkgPSBpbnQxNl90IGlucHV0IHNhbXBsZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFRDPgorc3RhdGljIGlubGluZQordm9pZCBtYWMoaW50MzJfdCYgbCwgaW50MzJfdCYgciwgVEMgY29lZiwgY29uc3QgaW50MTZfdCogc2FtcGxlcykKK3sKKyAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc2FtcGxlcyk7CisgICAgbCA9IG11bEFkZFJMKDEsIHJsLCBjb2VmLCBsKTsKKyAgICByID0gbXVsQWRkUkwoMCwgcmwsIGNvZWYsIHIpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbWFjKGludDMyX3QmIGwsIFRDIGNvZWYsIGNvbnN0IGludDE2X3QqIHNhbXBsZXMpCit7CisgICAgbCA9IG11bEFkZChzYW1wbGVzWzBdLCBjb2VmLCBsKTsKK30KKworLyogdmFyaWFudCBmb3IgaW5wdXQgdHlwZSBUSSA9IGZsb2F0IGlucHV0IHNhbXBsZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFRDPgorc3RhdGljIGlubGluZQordm9pZCBtYWMoZmxvYXQmIGwsIGZsb2F0JiByLCBUQyBjb2VmLCAgY29uc3QgZmxvYXQqIHNhbXBsZXMpCit7CisgICAgbCArPSAqc2FtcGxlcysrICogY29lZjsKKyAgICByICs9ICpzYW1wbGVzICogY29lZjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVEM+CitzdGF0aWMgaW5saW5lCit2b2lkIG1hYyhmbG9hdCYgbCwgVEMgY29lZiwgIGNvbnN0IGZsb2F0KiBzYW1wbGVzKQoreworICAgIGwgKz0gKnNhbXBsZXMgKiBjb2VmOworfQorCisvKiB2YXJpYW50IGZvciBvdXRwdXQgdHlwZSBUTyA9IGludDMyX3Qgb3V0cHV0IHNhbXBsZXMgKi8KK3N0YXRpYyBpbmxpbmUKK2ludDMyX3Qgdm9sdW1lQWRqdXN0KGludDMyX3QgdmFsdWUsIGludDMyX3Qgdm9sdW1lKQoreworICAgIHJldHVybiAyICogbXVsUkwoMCwgdmFsdWUsIHZvbHVtZSk7ICAvLyBOb3RlOiBvbmx5IHVzZSB0b3AgMTZiCit9CisKKy8qIHZhcmlhbnQgZm9yIG91dHB1dCB0eXBlIFRPID0gZmxvYXQgb3V0cHV0IHNhbXBsZXMgKi8KK3N0YXRpYyBpbmxpbmUKK2Zsb2F0IHZvbHVtZUFkanVzdChmbG9hdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKQoreworICAgIHJldHVybiB2YWx1ZSAqIHZvbHVtZTsKK30KKworLyoKKyAqIEhlbHBlciB0ZW1wbGF0ZSBmdW5jdGlvbnMgZm9yIGxvb3AgdW5yb2xsaW5nIGFjY3VtdWxhdG9yIG9wZXJhdGlvbnMuCisgKgorICogVW5yb2xsaW5nIHRoZSBsb29wcyBhY2hpZXZlcyBhYm91dCAyeCBnYWluLgorICogVXNpbmcgYSByZWN1cnNpdmUgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gYXJyYXkgb2YgVE9bXSBmb3IgdGhlIGFjY3VtdWxhdG9yCisgKiB2YWx1ZXMgaXMgYW4gYWRkaXRpb25hbCAxMC0yMCUgZ2Fpbi4KKyAqLworCit0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIHR5cGVuYW1lIFRPPgorY2xhc3MgQWNjdW11bGF0b3IgOiBwdWJsaWMgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+IC8vIHJlY3Vyc2l2ZQoreworcHVibGljOgorICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6Y2xlYXIoKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJPgorICAgIGlubGluZSB2b2lkIGFjYyhUQyBjb2VmLCBjb25zdCBUSSomIGRhdGEpIHsKKyAgICAgICAgbWFjKHZhbHVlLCBjb2VmLCBkYXRhKyspOworICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUy0xLCBUTz46OmFjYyhjb2VmLCBkYXRhKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgdm9sdW1lKFRPKiYgb3V0LCBUTyBnYWluKSB7CisgICAgICAgICpvdXQrKyA9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CisgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6dm9sdW1lKG91dCwgZ2Fpbik7CisgICAgfQorCisgICAgVE8gdmFsdWU7IC8vIG9uZSBwZXIgcmVjdXJzaXZlIGluaGVyaXRlZCBiYXNlIGNsYXNzCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUTz4KK2NsYXNzIEFjY3VtdWxhdG9yPDAsIFRPPiB7CitwdWJsaWM6CisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUST4KKyAgICBpbmxpbmUgdm9pZCBhY2MoVEMgY29lZiBfX3VudXNlZCwgY29uc3QgVEkqJiBkYXRhIF9fdW51c2VkKSB7CisgICAgfQorICAgIGlubGluZSB2b2lkIHZvbHVtZShUTyomIG91dCBfX3VudXNlZCwgVE8gZ2FpbiBfX3VudXNlZCkgeworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSU5URVJQPgoraW5saW5lCitUQyBpbnRlcnBvbGF0ZShUQyBjb2VmXzAsIFRDIGNvZWZfMSwgVElOVEVSUCBsZXJwKQoreworICAgIHJldHVybiBsZXJwICogKGNvZWZfMSAtIGNvZWZfMCkgKyBjb2VmXzA7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZQoraW50MTZfdCBpbnRlcnBvbGF0ZTxpbnQxNl90LCB1aW50MzJfdD4oaW50MTZfdCBjb2VmXzAsIGludDE2X3QgY29lZl8xLCB1aW50MzJfdCBsZXJwKQoreyAgIC8vIGluIHNvbWUgQ1BVIGFyY2hpdGVjdHVyZXMgMTZiIHggMTZiIG11bHRpcGxpZXMgYXJlIGZhc3Rlci4KKyAgICByZXR1cm4gKHN0YXRpY19jYXN0PGludDE2X3Q+KGxlcnApICogc3RhdGljX2Nhc3Q8aW50MTZfdD4oY29lZl8xIC0gY29lZl8wKSA+PiAxNSkgKyBjb2VmXzA7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZQoraW50MzJfdCBpbnRlcnBvbGF0ZTxpbnQzMl90LCB1aW50MzJfdD4oaW50MzJfdCBjb2VmXzAsIGludDMyX3QgY29lZl8xLCB1aW50MzJfdCBsZXJwKQoreworICAgIHJldHVybiAobGVycCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KGNvZWZfMSAtIGNvZWZfMCkgPj4gMzEpICsgY29lZl8wOworfQorCisvKiBjbGFzcyBzY29wZSBmb3IgcGFzc2luZyBpbiBmdW5jdGlvbnMgaW50byB0ZW1wbGF0ZXMgKi8KK3N0cnVjdCBJbnRlcnBDb21wdXRlIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVwKFRDIGNvZWZfMCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnApIHsKKyAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGNvZWZfMCwgY29lZl8xLCBsZXJwKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVElOVEVSUD4KKyAgICBzdGF0aWMgaW5saW5lCisgICAgVEMgaW50ZXJwb2xhdGVuKFRDIGNvZWZfMCwgVEMgY29lZl8xLCBUSU5URVJQIGxlcnApIHsKKyAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGNvZWZfMCwgY29lZl8xLCBsZXJwKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSW50ZXJwTnVsbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CisgICAgc3RhdGljIGlubGluZQorICAgIFRDIGludGVycG9sYXRlcChUQyBjb2VmXzAsIFRDIGNvZWZfMSBfX3VudXNlZCwgVElOVEVSUCBsZXJwIF9fdW51c2VkKSB7CisgICAgICAgIHJldHVybiBjb2VmXzA7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJTlRFUlA+CisgICAgc3RhdGljIGlubGluZQorICAgIFRDIGludGVycG9sYXRlbihUQyBjb2VmXzAgX191bnVzZWQsIFRDIGNvZWZfMSwgVElOVEVSUCBsZXJwIF9fdW51c2VkKSB7CisgICAgICAgIHJldHVybiBjb2VmXzE7CisgICAgfQorfTsKKworLyoKKyAqIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lICh0d28gc2FtcGxlcykuCisgKgorICogVGhlIFByb2Nlc3MqKCkgZnVuY3Rpb25zIGNvbXB1dGUgYm90aCB0aGUgcG9zaXRpdmUgaGFsZiBGSVIgZG90IHByb2R1Y3QgYW5kCisgKiB0aGUgbmVnYXRpdmUgaGFsZiBGSVIgZG90IHByb2R1Y3QsIGFjY3VtdWxhdGVzLCBhbmQgdGhlbiBhcHBsaWVzIHRoZSB2b2x1bWUuCisgKgorICogVXNlIGZpcigpIHRvIGNvbXB1dGUgdGhlIHByb3BlciBjb2VmZmljaWVudCBwb2ludGVycyBmb3IgYSBwb2x5cGhhc2UKKyAqIGZpbHRlciBiYW5rLgorICoKKyAqIFByb2Nlc3NCYXNlKCkgaXMgdGhlIGZ1bmRhbWVudGFsIHByb2Nlc3NpbmcgdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogUHJvY2Vzc0woKSBjYWxscyBQcm9jZXNzQmFzZSgpIHdpdGggVEZVTkMgPSBJbnRlcnBOdWxsLCBmb3IgZml4ZWQvbG9ja2VkIHBoYXNlLgorICogUHJvY2VzcygpIGNhbGxzIFByb2Nlc3NCYXNlKCkgd2l0aCBURlVOQyA9IEludGVycENvbXB1dGUsIGZvciBpbnRlcnBvbGF0ZWQgcGhhc2UuCisgKi8KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEZVTkMsIHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJTlRFUlA+CitzdGF0aWMgaW5saW5lCit2b2lkIFByb2Nlc3NCYXNlKFRPKiBjb25zdCBvdXQsCisgICAgICAgIHNpemVfdCBjb3VudCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgVEkqIHNQLAorICAgICAgICBjb25zdCBUSSogc04sCisgICAgICAgIFRJTlRFUlAgbGVycFAsCisgICAgICAgIGNvbnN0IFRPKiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKENIQU5ORUxTID4gMCkKKworICAgIGlmIChDSEFOTkVMUyA+IDIpIHsKKyAgICAgICAgLy8gVE8gYWNjdW1bQ0hBTk5FTFNdOworICAgICAgICBBY2N1bXVsYXRvcjxDSEFOTkVMUywgVE8+IGFjY3VtOworCisgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgYWNjdW1bal0gPSAwOworICAgICAgICBhY2N1bS5jbGVhcigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIFRDIGMgPSBURlVOQzo6aW50ZXJwb2xhdGVwKGNvZWZzUFswXSwgY29lZnNQW2NvdW50XSwgbGVycFApOworCisgICAgICAgICAgICAvLyBmb3IgKGludCBqID0gMDsgaiA8IENIQU5ORUxTOyArK2opIG1hYyhhY2N1bVtqXSwgYywgc1AgKyBqKTsKKyAgICAgICAgICAgIGNvbnN0IFRJICp0bXBfZGF0YSA9IHNQOyAvLyB0bXBfcHRyIHNlZW1zIHRvIHdvcmsgYmV0dGVyCisgICAgICAgICAgICBhY2N1bS5hY2MoYywgdG1wX2RhdGEpOworCisgICAgICAgICAgICBjb2Vmc1ArKzsKKyAgICAgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICAgICAgYyA9IFRGVU5DOjppbnRlcnBvbGF0ZW4oY29lZnNOW2NvdW50XSwgY29lZnNOWzBdLCBsZXJwUCk7CisKKyAgICAgICAgICAgIC8vIGZvciAoaW50IGogPSAwOyBqIDwgQ0hBTk5FTFM7ICsraikgbWFjKGFjY3VtW2pdLCBjLCBzTiArIGopOworICAgICAgICAgICAgdG1wX2RhdGEgPSBzTjsgLy8gdG1wX3B0ciBzZWVtcyBmYXN0ZXIgdGhhbiBkaXJlY3RseSB1c2luZyBzTgorICAgICAgICAgICAgYWNjdW0uYWNjKGMsIHRtcF9kYXRhKTsKKworICAgICAgICAgICAgY29lZnNOKys7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICAvLyBmb3IgKGludCBqID0gMDsgaiA8IENIQU5ORUxTOyArK2opIG91dFtqXSArPSB2b2x1bWVBZGp1c3QoYWNjdW1bal0sIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgVE8gKnRtcF9vdXQgPSBvdXQ7IC8vIG1heSByZW1vdmUgaWYgY29uc3Qgb3V0IGRlZmluaXRpb24gY2hhbmdlcy4KKyAgICAgICAgYWNjdW0udm9sdW1lKHRtcF9vdXQsIHZvbHVtZUxSWzBdKTsKKyAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgVE8gbCA9IDA7CisgICAgICAgIFRPIHIgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIG1hYyhsLCByLCBURlVOQzo6aW50ZXJwb2xhdGVwKGNvZWZzUFswXSwgY29lZnNQW2NvdW50XSwgbGVycFApLCBzUCk7CisgICAgICAgICAgICBjb2Vmc1ArKzsKKyAgICAgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICAgICAgbWFjKGwsIHIsIFRGVU5DOjppbnRlcnBvbGF0ZW4oY29lZnNOW2NvdW50XSwgY29lZnNOWzBdLCBsZXJwUCksIHNOKTsKKyAgICAgICAgICAgIGNvZWZzTisrOworICAgICAgICAgICAgc04gKz0gQ0hBTk5FTFM7CisgICAgICAgIH0KKyAgICAgICAgb3V0WzBdICs9IHZvbHVtZUFkanVzdChsLCB2b2x1bWVMUlswXSk7CisgICAgICAgIG91dFsxXSArPSB2b2x1bWVBZGp1c3Qociwgdm9sdW1lTFJbMV0pOworICAgIH0gZWxzZSB7IC8qIENIQU5ORUxTID09IDEgKi8KKyAgICAgICAgVE8gbCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgbWFjKGwsIFRGVU5DOjppbnRlcnBvbGF0ZXAoY29lZnNQWzBdLCBjb2Vmc1BbY291bnRdLCBsZXJwUCksIHNQKTsKKyAgICAgICAgICAgIGNvZWZzUCsrOworICAgICAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgICAgICBtYWMobCwgVEZVTkM6OmludGVycG9sYXRlbihjb2Vmc05bY291bnRdLCBjb2Vmc05bMF0sIGxlcnBQKSwgc04pOworICAgICAgICAgICAgY29lZnNOKys7CisgICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICAgICAgfQorICAgICAgICBvdXRbMF0gKz0gdm9sdW1lQWRqdXN0KGwsIHZvbHVtZUxSWzBdKTsKKyAgICAgICAgb3V0WzFdICs9IHZvbHVtZUFkanVzdChsLCB2b2x1bWVMUlsxXSk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgorc3RhdGljIGlubGluZQordm9pZCBQcm9jZXNzTChUTyogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04sCisgICAgICAgIGNvbnN0IFRJKiBzUCwKKyAgICAgICAgY29uc3QgVEkqIHNOLAorICAgICAgICBjb25zdCBUTyogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwTnVsbD4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgMCwgdm9sdW1lTFIpOworfQorCit0ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSU5URVJQPgorc3RhdGljIGlubGluZQordm9pZCBQcm9jZXNzKFRPKiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUDEgX191bnVzZWQsCisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04xIF9fdW51c2VkLAorICAgICAgICBjb25zdCBUSSogc1AsCisgICAgICAgIGNvbnN0IFRJKiBzTiwKKyAgICAgICAgVElOVEVSUCBsZXJwUCwKKyAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIFByb2Nlc3NCYXNlPENIQU5ORUxTLCBTVFJJREUsIEludGVycENvbXB1dGU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIGxlcnBQLCB2b2x1bWVMUik7Cit9CisKKy8qCisgKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSAodHdvIHNhbXBsZXMpIGZyb20gaW5wdXQgc2FtcGxlIHBvaW50ZXIuCisgKgorICogVGhpcyBzZXRzIHVwIHRoZSBwYXJhbXMgZm9yIHRoZSBhY2NlbGVyYXRlZCBQcm9jZXNzKCkgYW5kIFByb2Nlc3NMKCkKKyAqIGZ1bmN0aW9ucyB0byBkbyB0aGUgYXBwcm9wcmlhdGUgZG90IHByb2R1Y3RzLgorICoKKyAqIEBwYXJhbSBvdXQgc2hvdWxkIHBvaW50IHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBvdXRwdXQgZnJhbWUuCisgKgorICogQHBhcmFtIHBoYXNlIGlzIHRoZSBmcmFjdGlvbmFsIGRpc3RhbmNlIGJldHdlZW4gaW5wdXQgZnJhbWVzIGZvciBpbnRlcnBvbGF0aW9uOgorICogcGhhc2UgPj0gMCAgJiYgcGhhc2UgPCBwaGFzZVdyYXBMaW1pdC4gIEl0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgcmF0aW9uYWwgZnJhY3Rpb24KKyAqIG9mIHBoYXNlL3BoYXNlV3JhcExpbWl0LgorICoKKyAqIEBwYXJhbSBwaGFzZVdyYXBMaW1pdCBpcyAjcG9seXBoYXNlczw8Y29lZlNoaWZ0LCB3aGVyZSAjcG9seXBoYXNlcyBpcyB0aGUgbnVtYmVyIG9mIHBvbHlwaGFzZXMKKyAqIGluIHRoZSBwb2x5cGhhc2UgZmlsdGVyLiBMaWtld2lzZSwgI3BvbHlwaGFzZXMgY2FuIGJlIG9idGFpbmVkIGFzIChwaGFzZVdyYXBMaW1pdD4+Y29lZlNoaWZ0KS4KKyAqCisgKiBAcGFyYW0gY29lZlNoaWZ0IGdpdmVzIHRoZSBiaXQgYWxpZ25tZW50IG9mIHRoZSBwb2x5cGhhc2UgaW5kZXggaW4gdGhlIHBoYXNlIHBhcmFtZXRlci4KKyAqCisgKiBAcGFyYW0gaGFsZk51bUNvZWZzIGlzIHRoZSBoYWxmIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIHBlciBwb2x5cGhhc2UgZmlsdGVyLiBTaW5jZSB0aGUKKyAqIG92ZXJhbGwgZmlsdGVyYmFuayBpcyBvZGQtbGVuZ3RoIHN5bW1ldHJpYywgb25seSBoYWxmTnVtQ29lZnMgbmVlZCBiZSBzdG9yZWQuCisgKgorICogQHBhcmFtIGNvZWZzIGlzIHRoZSBwb2x5cGhhc2UgZmlsdGVyIGJhbmssIHN0YXJ0aW5nIGF0IGZyb20gcG9seXBoYXNlIGluZGV4IDAsIGFuZCByYW5naW5nIHRvCisgKiBhbmQgaW5jbHVkaW5nIHRoZSAjcG9seXBoYXNlcy4gIEVhY2ggcG9seXBoYXNlIG9mIHRoZSBmaWx0ZXIgaGFzIGhhbGYtbGVuZ3RoIGhhbGZOdW1Db2VmcworICogKGR1ZSB0byBzeW1tZXRyeSkuICBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsdGVyIGJhbmsgaW4gY29lZmZpY2llbnRzIGlzCisgKiAoI3BvbHlwaGFzZXMrMSkqaGFsZk51bUNvZWZzLgorICoKKyAqIFRoZSBmaWx0ZXIgYmFuayBjb2VmcyBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG1pbmltdW0gb2YgMTYgYnl0ZXMgKHByZWZlcnJhYmx5IHRvIGNhY2hlIGxpbmUpLgorICoKKyAqIFRoZSBjb2VmcyBzaG91bGQgYmUgYXR0ZW51YXRlZCAodG8gY29tcGVuc2F0ZSBmb3IgcGFzc2JhbmQgcmlwcGxlKQorICogaWYgc3RvcmluZyBiYWNrIGludG8gdGhlIG5hdGl2ZSBmb3JtYXQuCisgKgorICogQHBhcmFtIHNhbXBsZXMgYXJlIHVuYWxpZ25lZCBpbnB1dCBzYW1wbGVzLiAgVGhlIHBvc2l0aW9uIGlzIGluIHRoZSAibWlkZGxlIiBvZiB0aGUKKyAqIHNhbXBsZSBhcnJheSB3aXRoIHJlc3BlY3QgdG8gdGhlIEZJUiBmaWx0ZXI6CisgKiB0aGUgbmVnYXRpdmUgaGFsZiBvZiB0aGUgZmlsdGVyIGlzIGRvdCBwcm9kdWN0IGZyb20gc2FtcGxlcysxIHRvIHNhbXBsZXMraGFsZk51bUNvZWZzOworICogdGhlIHBvc2l0aXZlIGhhbGYgb2YgdGhlIGZpbHRlciBpcyBkb3QgcHJvZHVjdCBmcm9tIHNhbXBsZXMgdG8gc2FtcGxlcy1oYWxmTnVtQ29lZnMrMS4KKyAqCisgKiBAcGFyYW0gdm9sdW1lTFIgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byAzMiBiaXQgdm9sdW1lIHZhbHVlcywgb25lIHBlciBzdGVyZW8gY2hhbm5lbCwKKyAqIGV4cHJlc3NlZCBhcyBhIFMzMiBpbnRlZ2VyLiAgQSBuZWdhdGl2ZSB2YWx1ZSBpbnZlcnRzIHRoZSBjaGFubmVsIDE4MCBkZWdyZWVzLgorICogVGhlIHBvaW50ZXIgdm9sdW1lTFIgc2hvdWxkIGJlIGFsaWduZWQgdG8gYSBtaW5pbXVtIG9mIDggYnl0ZXMuCisgKiBBIHR5cGljYWwgdmFsdWUgZm9yIHZvbHVtZSBpcyAweDEwMDAgdG8gYWxpZ24gdG8gYSB1bml0eSBnYWluIG91dHB1dCBvZiAyMC4xMi4KKyAqCisgKiBJbiBiZXR3ZWVuIGNhbGxzIHRvIGZpbHRlckNvZWZmaWNpZW50LCB0aGUgcGhhc2UgaXMgaW5jcmVtZW50ZWQgYnkgcGhhc2VJbmNyZW1lbnQsIHdoZXJlCisgKiBwaGFzZUluY3JlbWVudCBpcyBjYWxjdWxhdGVkIGFzIGlucHV0U2FtcGxpbmcgKiBwaGFzZVdyYXBMaW1pdCAvIG91dHB1dFNhbXBsaW5nLgorICoKKyAqIFRoZSBmaWx0ZXIgcG9seXBoYXNlIGluZGV4IGlzIGdpdmVuIGJ5IGluZGV4UCA9IHBoYXNlID4+IGNvZWZTaGlmdC4gRHVlIHRvCisgKiBvZGQgbGVuZ3RoIHN5bW1ldHJpYyBmaWx0ZXIsIHRoZSBwb2x5cGhhc2UgaW5kZXggb2YgdGhlIG5lZ2F0aXZlIGhhbGYgZGVwZW5kcyBvbgorICogd2hldGhlciBpbnRlcnBvbGF0aW9uIGlzIHVzZWQuCisgKgorICogVGhlIGZyYWN0aW9uYWwgc2l0aW5nIGJldHdlZW4gdGhlIHBvbHlwaGFzZSBpbmRpY2VzIGlzIGdpdmVuIGJ5IHRoZSBiaXRzIGJlbG93IGNvZWZTaGlmdDoKKyAqCisgKiBsZXJwUCA9IHBoYXNlIDw8IDMyIC0gY29lZlNoaWZ0ID4+IDE7ICAvLyBmb3IgMzIgYml0IHVuc2lnbmVkIHBoYXNlIG11bHRpcGx5CisgKiBsZXJwUCA9IHBoYXNlIDw8IDMyIC0gY29lZlNoaWZ0ID4+IDE3OyAvLyBmb3IgMTYgYml0IHVuc2lnbmVkIHBoYXNlIG11bHRpcGx5CisgKgorICogRm9yIGludGVnZXIgdHlwZXMsIHRoaXMgaXMgZXhwcmVzc2VkIGFzOgorICoKKyAqIGxlcnBQID0gcGhhc2UgPDwgc2l6ZW9mKHBoYXNlKSo4IC0gY29lZlNoaWZ0CisgKiAgICAgICAgICAgICAgPj4gKHNpemVvZihwaGFzZSktc2l6ZW9mKCpjb2VmcykpKjggKyAxOworICoKKyAqIEZvciBmbG9hdGluZyBwb2ludCwgbGVycFAgaXMgdGhlIGZyYWN0aW9uYWwgcGhhc2Ugc2NhbGVkIHRvIFswLjAsIDEuMCk6CisgKgorICogbGVycFAgPSAocGhhc2UgPDwgMzIgLSBjb2VmU2hpZnQpIC8gKDEgPDwgMzIpOyAvLyBmbG9hdGluZyBwb2ludCBlcXVpdmFsZW50CisgKi8KKwordGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZmlyKFRPKiBjb25zdCBvdXQsCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlLCBjb25zdCB1aW50MzJfdCBwaGFzZVdyYXBMaW1pdCwKKyAgICAgICAgY29uc3QgaW50IGNvZWZTaGlmdCwgY29uc3QgaW50IGhhbGZOdW1Db2VmcywgY29uc3QgVEMqIGNvbnN0IGNvZWZzLAorICAgICAgICBjb25zdCBUSSogY29uc3Qgc2FtcGxlcywgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQoreworICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgorICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCisgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCisgICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorCisgICAgaWYgKExPQ0tFRCkgeworICAgICAgICAvLyBsb2NrZWQgcG9seXBoYXNlIChubyBpbnRlcnBvbGF0aW9uKQorICAgICAgICAvLyBDb21wdXRlIHRoZSBwb2x5cGhhc2UgZmlsdGVyIGluZGV4IG9uIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2lkZS4KKyAgICAgICAgdWludDMyX3QgaW5kZXhQID0gcGhhc2UgPj4gY29lZlNoaWZ0OworICAgICAgICB1aW50MzJfdCBpbmRleE4gPSAocGhhc2VXcmFwTGltaXQgLSBwaGFzZSkgPj4gY29lZlNoaWZ0OworICAgICAgICBjb25zdCBUQyogY29lZnNQID0gY29lZnMgKyBpbmRleFAqaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUQyogY29lZnNOID0gY29lZnMgKyBpbmRleE4qaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUSSogc1AgPSBzYW1wbGVzOworICAgICAgICBjb25zdCBUSSogc04gPSBzYW1wbGVzICsgQ0hBTk5FTFM7CisKKyAgICAgICAgLy8gZG90IHByb2R1Y3QgZmlsdGVyLgorICAgICAgICBQcm9jZXNzTDxDSEFOTkVMUywgU1RSSURFPihvdXQsCisgICAgICAgICAgICAgICAgaGFsZk51bUNvZWZzLCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW50ZXJwb2xhdGVkIHBvbHlwaGFzZQorICAgICAgICAvLyBDb21wdXRlIHRoZSBwb2x5cGhhc2UgZmlsdGVyIGluZGV4IG9uIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2lkZS4KKyAgICAgICAgdWludDMyX3QgaW5kZXhQID0gcGhhc2UgPj4gY29lZlNoaWZ0OworICAgICAgICB1aW50MzJfdCBpbmRleE4gPSAocGhhc2VXcmFwTGltaXQgLSBwaGFzZSAtIDEpID4+IGNvZWZTaGlmdDsgLy8gb25lJ3MgY29tcGxlbWVudC4KKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUCA9IGNvZWZzICsgaW5kZXhQKmhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzTiA9IGNvZWZzICsgaW5kZXhOKmhhbGZOdW1Db2VmczsKKyAgICAgICAgY29uc3QgVEMqIGNvZWZzUDEgPSBjb2Vmc1AgKyBoYWxmTnVtQ29lZnM7CisgICAgICAgIGNvbnN0IFRDKiBjb2Vmc04xID0gY29lZnNOICsgaGFsZk51bUNvZWZzOworICAgICAgICBjb25zdCBUSSogc1AgPSBzYW1wbGVzOworICAgICAgICBjb25zdCBUSSogc04gPSBzYW1wbGVzICsgQ0hBTk5FTFM7CisKKyAgICAgICAgLy8gSW50ZXJwb2xhdGlvbiBmcmFjdGlvbiBsZXJwUCBkZXJpdmVkIGJ5IHNoaWZ0aW5nIGFsbCB0aGUgd2F5IHVwIGFuZCBkb3duCisgICAgICAgIC8vIHRvIGNsZWFyIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFuZCBhbGlnbiB0byB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwKKyAgICAgICAgLy8gZm9yIHRoZSBpbnRlZ2VyIG11bHRpcGx5LiAgVGhlIGNvbnN0YW50cyBzaG91bGQgcmVzb2x2ZSBpbiBjb21waWxlIHRpbWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBpbnRlcnBvbGF0ZWQgZmlsdGVyIGNvZWZmaWNpZW50IGlzIGRlcml2ZWQgYXMgZm9sbG93cyBmb3IgdGhlIHBvcy9uZWcgaGFsZjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaW50ZXJwb2xhdGVkW1BdID0gaW5kZXhbUF0qbGVycFAgKyBpbmRleFtQKzFdKigxLWxlcnBQKQorICAgICAgICAvLyBpbnRlcnBvbGF0ZWRbTl0gPSBpbmRleFtOKzFdKmxlcnBQICsgaW5kZXhbTl0qKDEtbGVycFApCisKKyAgICAgICAgLy8gb24tdGhlLWZseSBpbnRlcnBvbGF0ZWQgZG90IHByb2R1Y3QgZmlsdGVyCisgICAgICAgIGlmIChpc19zYW1lPFRDLCBmbG9hdD46OnZhbHVlIHx8IGlzX3NhbWU8VEMsIGRvdWJsZT46OnZhbHVlKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgVEMgc2NhbGUgPSAxLiAvICg2NTUzNi4gKiA2NTUzNi4pOyAvLyBzY2FsZSBwaGFzZSBiaXRzIHRvIFswLjAsIDEuMCkKKyAgICAgICAgICAgIFRDIGxlcnBQID0gVEMocGhhc2UgPDwgKHNpemVvZihwaGFzZSkqOCAtIGNvZWZTaGlmdCkpICogc2NhbGU7CisKKyAgICAgICAgICAgIFByb2Nlc3M8Q0hBTk5FTFMsIFNUUklERT4ob3V0LAorICAgICAgICAgICAgICAgICAgICBoYWxmTnVtQ29lZnMsIGNvZWZzUCwgY29lZnNOLCBjb2Vmc1AxLCBjb2Vmc04xLCBzUCwgc04sIGxlcnBQLCB2b2x1bWVMUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBsZXJwUCA9IHBoYXNlIDw8IChzaXplb2YocGhhc2UpKjggLSBjb2VmU2hpZnQpCisgICAgICAgICAgICAgICAgICAgID4+ICgoc2l6ZW9mKHBoYXNlKS1zaXplb2YoKmNvZWZzKSkqOCArIDEpOworCisgICAgICAgICAgICBQcm9jZXNzPENIQU5ORUxTLCBTVFJJREU+KG91dCwKKyAgICAgICAgICAgICAgICAgICAgaGFsZk51bUNvZWZzLCBjb2Vmc1AsIGNvZWZzTiwgY29lZnNQMSwgY29lZnNOMSwgc1AsIHNOLCBsZXJwUCwgdm9sdW1lTFIpOworICAgICAgICB9CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTFjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oCkBAIC0wLDAgKzEsMTE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9QUk9DRVNTX05FT05fSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGRlcGVuZHMgb24gQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCwgQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKworI2lmIFVTRV9ORU9OCisvLworLy8gTkVPTiBzcGVjaWFsaXphdGlvbnMgYXJlIGVuYWJsZWQgZm9yIFByb2Nlc3MoKSBhbmQgUHJvY2Vzc0woKQorLy8KKy8vIFRPRE86IFN0cmlkZSAxNiBhbmQgU3RyaWRlIDggY2FuIGJlIGNvbWJpbmVkIHdpdGggb25lIHBhc3Mgc3RyaWRlIDggKGlmIG5lY2Vzc2FyeSkKKy8vIGFuZCBsb29waW5nIHN0cmlkZSAxNiAob3IgdmljZSB2ZXJzYSkuIFRoaXMgaGFzIHNvbWUgcG9seXBoYXNlIGNvZWYgZGF0YSBhbGlnbm1lbnQKKy8vIGlzc3VlcyB3aXRoIFMxNiBjb2Vmcy4gQ29uc2lkZXIgdGhpcyBsYXRlci4KKworLy8gTWFjcm9zIHRvIHNhdmUgYSBtb25vL3N0ZXJlbyBhY2N1bXVsYXRvciBzYW1wbGUgaW4gcTAgKGFuZCBxNCkgYXMgc3RlcmVvIG91dC4KKyNkZWZpbmUgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PIFwKKyAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl06NjRdICAgICAgICBcbiIvKiAoMSkgbG9hZCB2b2x1bWVzICovXAorICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIi8qICgyKSB1bmFsaWduZWQgbG9hZCB0aGUgb3V0cHV0ICovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIi8qICgxKSBhZGQgYWxsIDQgcGFydGlhbCBzdW1zICovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgIFxuIi8qICgxKzRkKSBhbmQgcmVwbGljYXRlIEwvUiAqL1wKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIGQwLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIvKiAoMiszZCkgYXBwbHkgdm9sdW1lICovXAorICAgICAgICAidnFhZGQuczMyICAgICAgZDMsIGQzLCBkMCAgICAgICAgICAgICAgIFxuIi8qICgxKzRkKSBhY2N1bXVsYXRlIHJlc3VsdCAoc2F0dXJhdGluZykgKi9cCisgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIrMmQpIHN0b3JlIHJlc3VsdCAqLworCisjZGVmaW5lIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPIFwKKyAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl06NjRdICAgICAgICBcbiIvKiAoMSkgbG9hZCB2b2x1bWVzKi9cCisgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIpIHVuYWxpZ25lZCBsb2FkIHRoZSBvdXRwdXQqL1wKKyAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICBcbiIvKiAoMSkgYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHEwKi9cCisgICAgICAgICJ2cGFkZC5zMzIgICAgICBkOCwgZDgsIGQ5ICAgICAgICAgICAgICAgXG4iLyogKDEpIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxNCovXAorICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkOCAgICAgICAgICAgICAgIFxuIi8qICgxKzRkKSBjb21iaW5lIGludG8gTC9SKi9cCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iLyogKDIrM2QpIGFwcGx5IHZvbHVtZSovXAorICAgICAgICAidnFhZGQuczMyICAgICAgZDMsIGQzLCBkMCAgICAgICAgICAgICAgIFxuIi8qICgxKzRkKSBhY2N1bXVsYXRlIHJlc3VsdCAoc2F0dXJhdGluZykqL1wKKyAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIvKiAoMisyZClzdG9yZSByZXN1bHQqLworCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMn0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTN9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0CisKKyAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSswZCkgbXVsdGlwbHkgKHJldmVyc2VkKXNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDcsIGQyMSAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyAoMCkgbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTEwIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwyLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgcmV2ZXJzZSByaWdodCBwb3NpdGl2ZQorCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDYsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZCkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkMTAsIGQyMCAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDExLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQxMiwgZDIwICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDEzLCBkMjEgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMzMiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxMTAiCisgICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZSBTMzIgUTE1CisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxMn0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTN9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnN1Yi5zMTYgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKKworICAgICAgICAidnFyZG11bGguczE2ICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSBzMywgczIsIHMxLCBzMCwgczcsIHM2LCBzNSwgczQKKworICAgICAgICAidmFkZC5zMTYgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vICgxKzJkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczE2ICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CisKKyAgICAgICAgLy8gcmVvcmRlcmluZyB0aGUgdm1hbCB0byBkbyBkNiwgZDcgYmVmb3JlIGQ0LCBkNSBpcyBzbG93ZXIoPykKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSswZCkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDUsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ3LCBkMjEgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gKDApIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwyLCAxNj4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMSkgYWNjX0wgPSAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSBhY2NfUiA9IDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTExfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZzdWIuczE2ICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczE2ICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHJpZ2h0IHBvc2l0aXZlCisKKyAgICAgICAgInZhZGQuczE2ICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMxNiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAorCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNyAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHJldmVyc2VkIHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgcmV2ZXJzZWQgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSByZXZlcnNlZCBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDEwLCBkMjAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQxMSwgZDIxICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkMTIsIGQyMCAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyByaWdodAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQxMywgZDIxICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge3EyfSwgWyVbc1BdXSAgICAgICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTN9LCBbJVtzTl1dISAgICAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM4ICAgICAgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEwLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDExLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMiwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMywgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAorICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MSwgMTY+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDE2OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTJ9LCBbJVtzUF1dICAgICAgICAgICAgICAgICBcbiIvLyBsb2FkIDggMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtxM30sIFslW3NOXV0hICAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTIsIHExM30sIFslW2NvZWZzUDFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExNCwgcTE1fSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTEzLCBxMTMsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE5LCBxOSwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMSwgcTExLCBxMTUgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQ2LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQ3LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTIsIHExM30sIFslW2NvZWZzUDFdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExNCwgcTE1fSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKworICAgICAgICAidnN1Yi5zMzIgICAgICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTEzLCBxMTMsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAidnN1Yi5zMzIgICAgICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgZDJbMF0gICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE5LCBxOSwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMSwgcTExLCBxMTUgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQxMCwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQxMSwgIzE1ICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMSAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDYsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDcsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTIsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTMsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcworICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2VkIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAorCisgICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZClzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKKworICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInExMCIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW3NQXSAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKKyAgICAgICAgICAicTgiLCAicTEwIgorICAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgdWludDMyX3QgbGVycFAsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQoreworICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcworICAgIGNvbnN0IGludCBTVFJJREUgPSA4OworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBhc20gKAorICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlIFMzMiBRMTUKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyAoMCAtIGNvbWJpbmVzKykgYWNjdW11bGF0b3IgPSAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vICgyKzBkKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyAoMikgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE2fSwgWyVbY29lZnNQMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDE3fSwgWyVbY29lZnNQMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIwfSwgWyVbY29lZnNOMV06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDIxfSwgWyVbY29lZnNOMF06NjRdISAgXG4iLy8gKDEpIGxvYWQgNCAxNi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICAgICAgInZzdWIuczE2ICAgICAgIGQxNywgZDE3LCBkMTYgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMxNiAgICAgICBkMjEsIGQyMSwgZDIwICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cworCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMTcsIGQxNywgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczE2ICAgZDIxLCBkMjEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKKworICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAorCisgICAgICAgICJ2YWRkLnMxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICAgXG4iLy8gKDErMmQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAorICAgICAgICAidmFkZC5zMTYgICAgICAgZDIwLCBkMjAsIGQyMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKKworICAgICAgICAvLyByZW9yZGVyaW5nIHRoZSB2bWFsIHRvIGRvIGQ2LCBkNyBiZWZvcmUgZDQsIGQ1IGlzIHNsb3dlcig/KQorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKzBkKSBtdWx0aXBseSAocmV2ZXJzZWQpYnkgY29lZgorICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ2LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBuZWcgc2FtcGxlcworCisgICAgICAgIC8vIG1vdmluZyB0aGVzZSBBUk0gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBuZW9uIGFib3ZlIHNlZW1zIHRvIGJlIHNsb3dlcgorICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQorICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KKworICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAorICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKKyAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCisgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQorICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAorICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCisgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKKyAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTd9LCBbJVtjb2Vmc1AxXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04xXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjF9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKworICAgICAgICAidnN1Yi5zMTYgICAgICAgZDE3LCBkMTcsIGQxNiAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKKyAgICAgICAgInZzdWIuczE2ICAgICAgIGQyMSwgZDIxLCBkMjAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisKKyAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQxNywgZDE3LCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMjEsIGQyMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIGxlZnQgcG9zaXRpdmUKKworICAgICAgICAidmFkZC5zMTYgICAgICAgZDE2LCBkMTYsIGQxNyAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczE2ICAgICAgIGQyMCwgZDIwLCBkMjEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CisKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKKyAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0CisgICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAorICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0CisKKyAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gIityIiAoc04pCisgICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAorICAgICAgICAgIFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzTDwxLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gKHN0YWxsKSBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gKHN0YWxsKSBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAiPVV2IiAob3V0WzBdKSwKKyAgICAgICAgICBbY291bnRdICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICIrciIgKHNQKSwKKyAgICAgICAgICBbc05dICIrciIgKHNOKQorICAgICAgICA6IFt2TFJdICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTQiCisgICAgKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCisKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKworICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworCisgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAorCisgICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgorICAgICk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBQcm9jZXNzPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAorICAgICAgICB1aW50MzJfdCBsZXJwUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCit7CisgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCisgICAgY29uc3QgaW50IFNUUklERSA9IDg7CisgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOworICAgIGFzbSAoCisgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKKyAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMF0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxOCwgcTgsIHE5ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0CisKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorCisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorCisgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCisKKyAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCisKKyAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9NT05PCisKKyAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCisgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKKyAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKKyAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCisgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCisgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAorICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCisgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQorICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKKyAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKKyAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKKyAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAorICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKKyAgICAgICAgICAicTEyIiwgInExNCIKKyAgICApOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lCit2b2lkIFByb2Nlc3M8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAorICAgICAgICBpbnQgY291bnQsCisgICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogc04sCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKK3sKKyAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAyOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKKyAgICBjb25zdCBpbnQgU1RSSURFID0gODsKKyAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CisgICAgYXNtICgKKyAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQorICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCisgICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDYsIGQ3fSwgWyVbc05dXSEgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKHJldmVyc2VkKSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxOSwgcTksIHE4ICAgICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCisgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCisgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCBkNSwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKworICAgICAgICAidnFyZG11bGguczMyICAgcTksIHE5LCBkMlswXSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcworICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldCBvZiBjb2VmcworICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgZDcsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKKworICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMCAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKworICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisKKyAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKworICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKKworICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTworCisgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAorICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCisgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCisgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAorICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAorICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKKyAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAorICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKKyAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCisgICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCisgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCisgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKKyAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCisgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKyAgICApOworfQorCisjZW5kaWYgLy9VU0VfTkVPTgorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9GSVJfUFJPQ0VTU19ORU9OX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCAyMDdmMjZiLi5kMDNlNTc4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlclNpbmMiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjYsNiArMjcsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKICNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlclNpbmMuaCIKIApAQCAtMzcsMTIgKzM5LDE0IEBACiAjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKGZhbHNlKQogI2VuZGlmCiAKLSNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZICYmIGRlZmluZWQoX19BUk1fTkVPTl9fKQotI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2RlZmluZSBVU0VfTkVPTgogI2Vsc2UKLSNkZWZpbmUgVVNFX05FT04gKGZhbHNlKQorI3VuZGVmIFVTRV9ORU9OCiAjZW5kaWYKIAorI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDQ5LDkgKzQ1Myw5IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQXVkaW9SZXNhbXBsZXJTaW5jOjpBdWRpb1Jlc2FtcGxlclNpbmMoaW50IGJpdERlcHRoLAorQXVkaW9SZXNhbXBsZXJTaW5jOjpBdWRpb1Jlc2FtcGxlclNpbmMoCiAgICAgICAgIGludCBpbkNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlLCBzcmNfcXVhbGl0eSBxdWFsaXR5KQotICAgIDogQXVkaW9SZXNhbXBsZXIoYml0RGVwdGgsIGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBxdWFsaXR5KSwKKyAgICA6IEF1ZGlvUmVzYW1wbGVyKGluQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlLCBxdWFsaXR5KSwKICAgICBtU3RhdGUoMCksIG1JbXB1bHNlKDApLCBtUmluZ0Z1bGwoMCksIG1GaXJDb2VmcygwKQogewogICAgIC8qCkBAIC00OTcsMTAgKzUwMSwxMiBAQAogICAgIG1SaW5nRnVsbCA9IG1JbXB1bHNlICsgKG51bUNvZWZzKzEpKm1DaGFubmVsQ291bnQ7CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KSB7Cit2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CiAgICAgQXVkaW9SZXNhbXBsZXI6OnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgbVZvbHVtZVNJTURbMF0gPSBpbnQzMl90KGxlZnQpPDwxNjsKLSAgICBtVm9sdW1lU0lNRFsxXSA9IGludDMyX3QocmlnaHQpPDwxNjsKKyAgICAvLyBjb252ZXJ0IHRvIFU0XzI4IChyb3VuZGluZyBkb3duKS4KKyAgICAvLyBpbnRlZ2VyIHZvbHVtZSB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gMCB0byBVTklUWV9HQUlOLgorICAgIG1Wb2x1bWVTSU1EWzBdID0gdTRfMjhfZnJvbV9mbG9hdChjbGFtcEZsb2F0Vm9sKGxlZnQpKTsKKyAgICBtVm9sdW1lU0lNRFsxXSA9IHU0XzI4X2Zyb21fZmxvYXQoY2xhbXBGbG9hdFZvbChyaWdodCkpOwogfQogCiB2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKQEAgLTU0MCw3ICs1NDYsNyBAQAogICAgIHVpbnQzMl90IHBoYXNlSW5jcmVtZW50ID0gbVBoYXNlSW5jcmVtZW50OwogICAgIHNpemVfdCBvdXRwdXRJbmRleCA9IDA7CiAgICAgc2l6ZV90IG91dHB1dFNhbXBsZUNvdW50ID0gb3V0RnJhbWVDb3VudCAqIDI7Ci0gICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChvdXRGcmFtZUNvdW50Km1JblNhbXBsZVJhdGUpL21TYW1wbGVSYXRlOworICAgIHNpemVfdCBpbkZyYW1lQ291bnQgPSBnZXRJbkZyYW1lQ291bnRSZXF1aXJlZChvdXRGcmFtZUNvdW50KTsKIAogICAgIHdoaWxlIChvdXRwdXRJbmRleCA8IG91dHB1dFNhbXBsZUNvdW50KSB7CiAgICAgICAgIC8vIGJ1ZmZlciBpcyBlbXB0eSwgZmV0Y2ggYSBuZXcgb25lCkBAIC02MzQsOCArNjQwLDggQEAKIH0KIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmZpbHRlckNvZWZmaWNpZW50KAotICAgICAgICBpbnQzMl90KiBvdXQsIHVpbnQzMl90IHBoYXNlLCBjb25zdCBpbnQxNl90ICpzYW1wbGVzLCB1aW50MzJfdCB2UkwpCit2b2lkIEF1ZGlvUmVzYW1wbGVyU2luYzo6ZmlsdGVyQ29lZmZpY2llbnQoaW50MzJfdCogb3V0LCB1aW50MzJfdCBwaGFzZSwKKyAgICAgICAgIGNvbnN0IGludDE2X3QgKnNhbXBsZXMsIHVpbnQzMl90IHZSTCkKIHsKICAgICAvLyBOT1RFOiBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIGNvZGUgaGVyZS4gcmVnaXN0ZXIKICAgICAvLyBwcmVzc3VyZSBpcyB2ZXJ5IGhpZ2ggYW5kIGEgc21hbGwgY2hhbmdlIG1pZ2h0IGNhdXNlIHRoZSBjb21waWxlcgpAQCAtNjYyLDE2MCArNjY4LDE3MSBAQAogCiAgICAgc2l6ZV90IGNvdW50ID0gb2Zmc2V0OwogCi0gICAgaWYgKCFVU0VfTkVPTikgewotICAgICAgICBpbnQzMl90IGwgPSAwOwotICAgICAgICBpbnQzMl90IHIgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNQKyssIG9mZnNldCwgbGVycFAsIHNQKTsKLSAgICAgICAgICAgIHNQIC09IENIQU5ORUxTOwotICAgICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzTisrLCBvZmZzZXQsIGxlcnBOLCBzTik7Ci0gICAgICAgICAgICBzTiArPSBDSEFOTkVMUzsKLSAgICAgICAgfQotICAgICAgICBvdXRbMF0gKz0gMiAqIG11bFJMKDEsIGwsIHZSTCk7Ci0gICAgICAgIG91dFsxXSArPSAyICogbXVsUkwoMCwgciwgdlJMKTsKLSAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDEpIHsKKyNpZm5kZWYgVVNFX05FT04KKyAgICBpbnQzMl90IGwgPSAwOworICAgIGludDMyX3QgciA9IDA7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgeworICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNQKyssIG9mZnNldCwgbGVycFAsIHNQKTsKKyAgICAgICAgc1AgLT0gQ0hBTk5FTFM7CisgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc04rKywgb2Zmc2V0LCBsZXJwTiwgc04pOworICAgICAgICBzTiArPSBDSEFOTkVMUzsKKyAgICB9CisgICAgb3V0WzBdICs9IDIgKiBtdWxSTCgxLCBsLCB2UkwpOworICAgIG91dFsxXSArPSAyICogbXVsUkwoMCwgciwgdlJMKTsKKyNlbHNlCisgICAgVU5VU0VEKHZSTCk7CisgICAgaWYgKENIQU5ORUxTID09IDEpIHsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNQMSA9IGNvZWZzUCArIG9mZnNldDsKICAgICAgICAgaW50MzJfdCBjb25zdCogY29lZnNOMSA9IGNvZWZzTiArIG9mZnNldDsKICAgICAgICAgc1AgLT0gQ0hBTk5FTFMqMzsKLSAgICAgICAgYXNtICgKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMV0sICVbbGVycE5dICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBuZWdhdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgICAgICJ2c2hsLnMzMiAgICAgICBkMiwgZDIsICMxNiAgICAgICAgICAgICAgXG4iICAgIC8vIGNvbnZlcnQgdG8gMzIgYml0cwogCi0gICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgInZsZDEuMTYgICAgICAgIHsgZDR9LCBbJVtzUF1dICAgICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE4fSwgWyVbY29lZnNQMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOX0sIFslW2NvZWZzUDFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgInZsZDEuMTYgICAgICAgIHsgZDZ9LCBbJVtzTl1dISAgICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICBpbnQzMng0X3Qgc3VtOworICAgICAgICBpbnQzMngyX3QgbGVycFBOOworICAgICAgICBsZXJwUE4gPSB2ZHVwX25fczMyKDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBQLCBsZXJwUE4sIDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBOLCBsZXJwUE4sIDEpOworICAgICAgICBsZXJwUE4gPSB2c2hsX25fczMyKGxlcnBQTiwgMTYpOworICAgICAgICBzdW0gPSB2ZHVwcV9uX3MzMigwKTsKIAotICAgICAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICBpbnQxNng0X3Qgc2FtcGxlUCwgc2FtcGxlTjsKKyAgICAgICAgaW50MzJ4NF90IHNhbXBsZVBFeHQsIHNhbXBsZU5FeHQ7CisgICAgICAgIGludDMyeDRfdCBjb2Vmc1BWMCwgY29lZnNQVjEsIGNvZWZzTlYwLCBjb2Vmc05WMTsKIAotICAgICAgICAgICAgInZzdWIuczMyICAgICAgICBxOSwgIHE5LCAgcTggICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgY29lZnNQID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICAgICAgY29lZnNOID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKyAgICAgICAgY29lZnNQMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04xLCAxNik7CisgICAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IDQpIHsKKyAgICAgICAgICAgIHNhbXBsZVAgPSB2bGQxX3MxNihzUCk7CisgICAgICAgICAgICBzYW1wbGVOID0gdmxkMV9zMTYoc04pOworICAgICAgICAgICAgY29lZnNQVjAgPSB2bGQxcV9zMzIoY29lZnNQKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmxkMXFfczMyKGNvZWZzTik7CisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZsZDFxX3MzMihjb2Vmc1AxKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdmxkMXFfczMyKGNvZWZzTjEpOworICAgICAgICAgICAgc1AgLT0gNDsKKyAgICAgICAgICAgIHNOICs9IDQ7CisgICAgICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTiArPSA0OworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgY29lZnNOMSArPSA0OwogCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgIHE5LCAgcTksIGQyWzBdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQ2LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICAgICAgc2FtcGxlUCA9IHZyZXY2NF9zMTYoc2FtcGxlUCk7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICAgcTgsICBxOCwgIHE5ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0Ci0gICAgICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIiAgICAvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpCisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZzdWJxX3MzMihjb2Vmc1BWMSwgY29lZnNQVjApOworICAgICAgICAgICAgY29lZnNOVjEgPSB2c3VicV9zMzIoY29lZnNOVjEsIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQgPSB2c2hsbF9uX3MxNihzYW1wbGVQLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc1BWMSwgbGVycFBOLCAwKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzTlYxLCBsZXJwUE4sIDEpOworICAgICAgICAgICAgc2FtcGxlTkV4dCA9IHZzaGxsX25fczE2KHNhbXBsZU4sIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmFkZHFfczMyKGNvZWZzUFYwLCBjb2Vmc1BWMSk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZhZGRxX3MzMihjb2Vmc05WMCwgY29lZnNOVjEpOwogCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIiAgICAvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworICAgICAgICAgICAgc2FtcGxlUEV4dCA9IHZxcmRtdWxocV9zMzIoc2FtcGxlUEV4dCwgY29lZnNQVjApOworICAgICAgICAgICAgc2FtcGxlTkV4dCA9IHZxcmRtdWxocV9zMzIoc2FtcGxlTkV4dCwgY29lZnNOVjApOworICAgICAgICAgICAgc3VtID0gdmFkZHFfczMyKHN1bSwgc2FtcGxlUEV4dCk7CisgICAgICAgICAgICBzdW0gPSB2YWRkcV9zMzIoc3VtLCBzYW1wbGVORXh0KTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMngyX3Qgdm9sdW1lc1YsIG91dFY7CisgICAgICAgIHZvbHVtZXNWID0gdmxkMV9zMzIobVZvbHVtZVNJTUQpOworICAgICAgICBvdXRWID0gdmxkMV9zMzIob3V0KTsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgIC8vYWRkIGFsbCA0IHBhcnRpYWwgc3VtcworICAgICAgICBpbnQzMngyX3Qgc3VtTG93LCBzdW1IaWdoOworICAgICAgICBzdW1Mb3cgPSB2Z2V0X2xvd19zMzIoc3VtKTsKKyAgICAgICAgc3VtSGlnaCA9IHZnZXRfaGlnaF9zMzIoc3VtKTsKKyAgICAgICAgc3VtTG93ID0gdnBhZGRfczMyKHN1bUxvdywgc3VtSGlnaCk7CisgICAgICAgIHN1bUxvdyA9IHZwYWRkX3MzMihzdW1Mb3csIHN1bUxvdyk7CiAKLSAgICAgICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIGxvb3AKLQotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl1dICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB2b2x1bWVzCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iICAgIC8vIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIHRvZ2V0aGVyCi0gICAgICAgICAgICAidmR1cC5pMzIgICAgICAgZDAsIGQwWzBdICAgICAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcmxlYXZlIEwsUiBjaGFubmVscwotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIGQwLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIgICAgLy8gYXBwbHkgdm9sdW1lCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgZDMsIGQzLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gc3RvcmUgcmVzdWx0Ci0KLSAgICAgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICAgICAgW2xlcnBOXSAgICJyIiAobGVycE4pLAotICAgICAgICAgICAgICBbdkxSXSAgICAgInIiIChtVm9sdW1lU0lNRCkKLSAgICAgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAgICAgInExMiIsICJxMTQiCi0gICAgICAgICk7CisgICAgICAgIHN1bUxvdyA9IHZxcmRtdWxoX3MzMihzdW1Mb3csIHZvbHVtZXNWKTsKKyAgICAgICAgb3V0ViA9IHZhZGRfczMyKG91dFYsIHN1bUxvdyk7CisgICAgICAgIHZzdDFfczMyKG91dCwgb3V0Vik7CiAgICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAyKSB7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzUDEgPSBjb2Vmc1AgKyBvZmZzZXQ7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzTjEgPSBjb2Vmc04gKyBvZmZzZXQ7CiAgICAgICAgIHNQIC09IENIQU5ORUxTKjM7Ci0gICAgICAgIGFzbSAoCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzFdLCAlW2xlcnBOXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgbmVnYXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iICAgIC8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAgICAgInZzaGwuczMyICAgICAgIGQyLCBkMiwgIzE2ICAgICAgICAgICAgICBcbiIgICAgLy8gY29udmVydCB0byAzMiBiaXRzCiAKLSAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LGQ1fSwgWyVbc1BdXSAgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTh9LCBbJVtjb2Vmc1AwXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE5fSwgWyVbY29lZnNQMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LGQ3fSwgWyVbc05dXSEgICAgICAgIFxuIiAgICAvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCisgICAgICAgIGludDMyeDRfdCBzdW0wLCBzdW0xOworICAgICAgICBpbnQzMngyX3QgbGVycFBOOwogCi0gICAgICAgICAgICAidnJldjY0LjE2ICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0gICAgICAgICAgICAidnJldjY0LjE2ICAgICAgZDUsIGQ1ICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgIGxlcnBQTiA9IHZkdXBfbl9zMzIoMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycFAsIGxlcnBQTiwgMCk7CisgICAgICAgIGxlcnBQTiA9IHZsZDFfbGFuZV9zMzIoKGludDMyX3QgKikmbGVycE4sIGxlcnBQTiwgMSk7CisgICAgICAgIGxlcnBQTiA9IHZzaGxfbl9zMzIobGVycFBOLCAxNik7CisgICAgICAgIHN1bTAgPSB2ZHVwcV9uX3MzMigwKTsKKyAgICAgICAgc3VtMSA9IHZkdXBxX25fczMyKDApOwogCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgIHE5LCAgcTksICBxOCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICBxMTEsIHExMSwgcTEwICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMm5kIHNldCBvZiBjb2V0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICBpbnQxNng0eDJfdCBzYW1wbGVQLCBzYW1wbGVOOworICAgICAgICBpbnQzMng0eDJfdCBzYW1wbGVQRXh0LCBzYW1wbGVORXh0OworICAgICAgICBpbnQzMng0X3QgY29lZnNQVjAsIGNvZWZzUFYxLCBjb2Vmc05WMCwgY29lZnNOVjE7CiAKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICAgcTksICBxOSwgZDJbMF0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlsxXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDYsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDcsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgIGNvZWZzUCA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgICAgIGNvZWZzTiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgICAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudCAtPSA0KSB7CisgICAgICAgICAgICBzYW1wbGVQID0gdmxkMl9zMTYoc1ApOworICAgICAgICAgICAgc2FtcGxlTiA9IHZsZDJfczE2KHNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmxkMXFfczMyKGNvZWZzUCk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZsZDFxX3MzMihjb2Vmc04pOworICAgICAgICAgICAgY29lZnNQVjEgPSB2bGQxcV9zMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZsZDFxX3MzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIHNQIC09IDg7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04gKz0gNDsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKIAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgICBxOCwgIHE4LCAgcTkgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKLSAgICAgICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iICAgIC8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKKyAgICAgICAgICAgIHNhbXBsZVAudmFsWzBdID0gdnJldjY0X3MxNihzYW1wbGVQLnZhbFswXSk7CisgICAgICAgICAgICBzYW1wbGVQLnZhbFsxXSA9IHZyZXY2NF9zMTYoc2FtcGxlUC52YWxbMV0pOwogCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTE1LCBxMTUsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIiAgICAvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2c3VicV9zMzIoY29lZnNQVjEsIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdnN1YnFfczMyKGNvZWZzTlYxLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzYW1wbGVQRXh0LnZhbFswXSA9IHZzaGxsX25fczE2KHNhbXBsZVAudmFsWzBdLCAxNSk7CisgICAgICAgICAgICBzYW1wbGVQRXh0LnZhbFsxXSA9IHZzaGxsX25fczE2KHNhbXBsZVAudmFsWzFdLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpCisgICAgICAgICAgICBjb2Vmc1BWMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc1BWMSwgbGVycFBOLCAwKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdnFyZG11bGhxX2xhbmVfczMyKGNvZWZzTlYxLCBsZXJwUE4sIDEpOworICAgICAgICAgICAgc2FtcGxlTkV4dC52YWxbMF0gPSB2c2hsbF9uX3MxNihzYW1wbGVOLnZhbFswXSwgMTUpOworICAgICAgICAgICAgc2FtcGxlTkV4dC52YWxbMV0gPSB2c2hsbF9uX3MxNihzYW1wbGVOLnZhbFsxXSwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKQorICAgICAgICAgICAgY29lZnNQVjAgPSB2YWRkcV9zMzIoY29lZnNQVjAsIGNvZWZzUFYxKTsKKyAgICAgICAgICAgIGNvZWZzTlYwID0gdmFkZHFfczMyKGNvZWZzTlYwLCBjb2Vmc05WMSk7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICAgICBzYW1wbGVQRXh0LnZhbFswXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlUEV4dC52YWxbMF0sIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIHNhbXBsZVBFeHQudmFsWzFdID0gdnFyZG11bGhxX3MzMihzYW1wbGVQRXh0LnZhbFsxXSwgY29lZnNQVjApOworICAgICAgICAgICAgc2FtcGxlTkV4dC52YWxbMF0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZU5FeHQudmFsWzBdLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzYW1wbGVORXh0LnZhbFsxXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlTkV4dC52YWxbMV0sIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHN1bTAgPSB2YWRkcV9zMzIoc3VtMCwgc2FtcGxlUEV4dC52YWxbMF0pOworICAgICAgICAgICAgc3VtMSA9IHZhZGRxX3MzMihzdW0xLCBzYW1wbGVQRXh0LnZhbFsxXSk7CisgICAgICAgICAgICBzdW0wID0gdmFkZHFfczMyKHN1bTAsIHNhbXBsZU5FeHQudmFsWzBdKTsKKyAgICAgICAgICAgIHN1bTEgPSB2YWRkcV9zMzIoc3VtMSwgc2FtcGxlTkV4dC52YWxbMV0pOworICAgICAgICB9CisgICAgICAgIGludDMyeDJfdCB2b2x1bWVzViwgb3V0VjsKKyAgICAgICAgdm9sdW1lc1YgPSB2bGQxX3MzMihtVm9sdW1lU0lNRCk7CisgICAgICAgIG91dFYgPSB2bGQxX3MzMihvdXQpOwogCi0gICAgICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyBsb29wCisgICAgICAgIC8vYWRkIGFsbCA0IHBhcnRpYWwgc3VtcworICAgICAgICBpbnQzMngyX3Qgc3VtTG93MCwgc3VtSGlnaDAsIHN1bUxvdzEsIHN1bUhpZ2gxOworICAgICAgICBzdW1Mb3cwID0gdmdldF9sb3dfczMyKHN1bTApOworICAgICAgICBzdW1IaWdoMCA9IHZnZXRfaGlnaF9zMzIoc3VtMCk7CisgICAgICAgIHN1bUxvdzEgPSB2Z2V0X2xvd19zMzIoc3VtMSk7CisgICAgICAgIHN1bUhpZ2gxID0gdmdldF9oaWdoX3MzMihzdW0xKTsKKyAgICAgICAgc3VtTG93MCA9IHZwYWRkX3MzMihzdW1Mb3cwLCBzdW1IaWdoMCk7CisgICAgICAgIHN1bUxvdzAgPSB2cGFkZF9zMzIoc3VtTG93MCwgc3VtTG93MCk7CisgICAgICAgIHN1bUxvdzEgPSB2cGFkZF9zMzIoc3VtTG93MSwgc3VtSGlnaDEpOworICAgICAgICBzdW1Mb3cxID0gdnBhZGRfczMyKHN1bUxvdzEsIHN1bUxvdzEpOwogCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXV0gICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHZvbHVtZXMKLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG91dHB1dAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICBcbiIgICAgLy8gYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHEwCi0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDgsIGQ4LCBkOSAgICAgICAgICAgICAgIFxuIiAgICAvLyBhZGQgYWxsIDQgcGFydGlhbCBzdW1zIGZyb20gcTQKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgXG4iICAgIC8vIHRvZ2V0aGVyCi0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDgsIGQ4LCBkOCAgICAgICAgICAgICAgIFxuIiAgICAvLyB0b2dldGhlcgotICAgICAgICAgICAgInZ0cm4uczMyICAgICAgIGQwLCBkOCAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJsYWNlIEwsUiBjaGFubmVscwotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIGQwLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIgICAgLy8gYXBwbHkgdm9sdW1lCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgZDMsIGQzLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZzdDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gc3RvcmUgcmVzdWx0Ci0KLSAgICAgICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICAgICAgW2xlcnBOXSAgICJyIiAobGVycE4pLAotICAgICAgICAgICAgICBbdkxSXSAgICAgInIiIChtVm9sdW1lU0lNRCkKLSAgICAgICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKLSAgICAgICAgKTsKKyAgICAgICAgc3VtTG93MCA9IHZ0cm5fczMyKHN1bUxvdzAsIHN1bUxvdzEpLnZhbFswXTsKKyAgICAgICAgc3VtTG93MCA9IHZxcmRtdWxoX3MzMihzdW1Mb3cwLCB2b2x1bWVzVik7CisgICAgICAgIG91dFYgPSB2YWRkX3MzMihvdXRWLCBzdW1Mb3cwKTsKKyAgICAgICAgdnN0MV9zMzIob3V0LCBvdXRWKTsKICAgICB9CisjZW5kaWYKIH0KIAogdGVtcGxhdGU8aW50IENIQU5ORUxTPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCmluZGV4IDFlYTQ0NzQuLjQ2OTFkMGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAogY2xhc3MgQXVkaW9SZXNhbXBsZXJTaW5jIDogcHVibGljIEF1ZGlvUmVzYW1wbGVyIHsKIHB1YmxpYzoKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMoaW50IGJpdERlcHRoLCBpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICBBdWRpb1Jlc2FtcGxlclNpbmMoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICBzcmNfcXVhbGl0eSBxdWFsaXR5ID0gSElHSF9RVUFMSVRZKTsKIAogICAgIHZpcnR1YWwgfkF1ZGlvUmVzYW1wbGVyU2luYygpOwpAQCAtNDQsNyArNDQsNyBAQAogcHJpdmF0ZToKICAgICB2b2lkIGluaXQoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoaW50MTZfdCBsZWZ0LCBpbnQxNl90IHJpZ2h0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKIAogICAgIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KICAgICB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9XYXRjaGRvZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9XYXRjaGRvZy5jcHAKaW5kZXggOTNkMTg1ZS4uODc3ZTc3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvV2F0Y2hkb2cuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1dhdGNoZG9nLmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0cmNweShidWYsICJOL0FcbiIpOwogICAgIH0KLSAgICBmZHByaW50ZihmZCwgIldhdGNoZG9nOiB1bmRlcnJ1bnM9JXUsIGxvZ3M9JXUsIG1vc3QgcmVjZW50IHVuZGVycnVuIGxvZyBhdCAlcyIsCisgICAgZHByaW50ZihmZCwgIldhdGNoZG9nOiB1bmRlcnJ1bnM9JXUsIGxvZ3M9JXUsIG1vc3QgcmVjZW50IHVuZGVycnVuIGxvZyBhdCAlcyIsCiAgICAgICAgICAgICBtVW5kZXJydW5zLCBtTG9ncywgYnVmKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKaW5kZXggYmMyMDM4YS4uNmE4YWViMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCkBAIC0zMSw5ICszMSw3IEBACiAKIC8vIHVuY29tbWVudCB0byBlbmFibGUgZmFzdCBtaXhlciB0byB0YWtlIHBlcmZvcm1hbmNlIHNhbXBsZXMgZm9yIGxhdGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzCiAjZGVmaW5lIEZBU1RfTUlYRVJfU1RBVElTVElDUwotCi0vLyB1bmNvbW1lbnQgdG8gYWxsb3cgZmFzdCB0cmFja3MgYXQgbm9uLW5hdGl2ZSBzYW1wbGUgcmF0ZQotLy8jZGVmaW5lIEZBU1RfVFJBQ0tTX0FUX05PTl9OQVRJVkVfU0FNUExFX1JBVEUKKy8vIEZJWE1FIHJlbmFtZSB0byBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAKIC8vIHVuY29tbWVudCBmb3IgZGVidWdnaW5nIHRpbWluZyBwcm9ibGVtcyByZWxhdGVkIHRvIFN0YXRlUXVldWU6OnB1c2goKQogLy8jZGVmaW5lIFNUQVRFX1FVRVVFX0RVTVAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCA3MjBlNDNiLi4yZGQ2ZmY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC00NCw2ICs0NCw4IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCisjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY2LDcgKzY4LDggQEAKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksIG1TdGF0ZShJRExFKSwKICAgICAgIC8vIG1NYXhEaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgY29uZmlndXJlKCkgYW5kIG5vdCB1c2VkIGJlZm9yZSB0aGVuCiAgICAgICAvLyBtRGlzYWJsZVdhaXRDbnQgaXMgc2V0IGJ5IHByb2Nlc3MoKSBhbmQgdXBkYXRlU3RhdGUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KLSAgICAgIG1TdXNwZW5kZWQoZmFsc2UpCisgICAgICBtU3VzcGVuZGVkKGZhbHNlKSwKKyAgICAgIG1BdWRpb0ZsaW5nZXIodGhyZWFkLT5tQXVkaW9GbGluZ2VyKQogewogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciAlcCIsIHRoaXMpOwogICAgIGludCBsU3RhdHVzOwpAQCAtMTE2LDggKzExOSw5IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAvLyBmaXJzdCBub24gZGVzdHJveWVkIGhhbmRsZSBpcyBjb25zaWRlcmVkIGluIGNvbnRyb2wKLSAgICAgICAgaWYgKGNvbnRyb2xIYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgaWYgKGNvbnRyb2xIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICAgICAgY29udHJvbEhhbmRsZSA9IGg7CisgICAgICAgIH0KICAgICAgICAgaWYgKGgtPnByaW9yaXR5KCkgPD0gcHJpb3JpdHkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTQsOSArMTk4LDE5IEBACiAgICAgLy8gZGVzdHJ1Y3RvciBiZWZvcmUgd2UgZXhpdAogICAgIHNwPEVmZmVjdE1vZHVsZT4ga2VlcCh0aGlzKTsKICAgICB7Ci0gICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwotICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIHRocmVhZC0+ZGlzY29ubmVjdEVmZmVjdChrZWVwLCBoYW5kbGUsIHVucGluSWZMYXN0KTsKKyAgICAgICAgaWYgKHJlbW92ZUhhbmRsZShoYW5kbGUpID09IDApIHsKKyAgICAgICAgICAgIGlmICghaXNQaW5uZWQoKSB8fCB1bnBpbklmTGFzdCkgeworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZC0+cmVtb3ZlRWZmZWN0X2wodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gYWYgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoYWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZi0+dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChtSWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBtSGFuZGxlcy5zaXplKCk7CkBAIC00MjYsNiArNDQwLDIwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6YWRkRWZmZWN0VG9IYWxfbCgpCit7CisgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8fAorICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdCAqc3RyZWFtID0gdGhyZWFkLT5zdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHN0cmVhbS0+YWRkX2F1ZGlvX2VmZmVjdChzdHJlYW0sIG1FZmZlY3RJbnRlcmZhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c3RhcnQoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NTEsMTUgKzQ3OSwxMSBAQAogICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CiAgICAgfQotICAgIGlmIChzdGF0dXMgPT0gMCAmJgotICAgICAgICAgICAgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8fAotICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpKSB7Ci0gICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwotICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0gPSB0aHJlYWQtPnN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLT5hZGRfYXVkaW9fZWZmZWN0KHN0cmVhbSwgbUVmZmVjdEludGVyZmFjZSk7Ci0gICAgICAgICAgICB9CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGFkZEVmZmVjdFRvSGFsX2woKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIGNoYWluLT5mb3JjZVZvbHVtZSgpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC04MzMsNyArODU3LDExMiBAQAogICAgIHJldHVybiBtT2ZmbG9hZGVkOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK1N0cmluZzggZWZmZWN0RmxhZ3NUb1N0cmluZyh1aW50MzJfdCBmbGFncykgeworICAgIFN0cmluZzggczsKKworICAgIHMuYXBwZW5kKCJjb25uLiBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVDogcy5hcHBlbmQoImluc2VydCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOiBzLmFwcGVuZCgiYXV4aWxpYXJ5Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFOiBzLmFwcGVuZCgicmVwbGFjZSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0M6IHMuYXBwZW5kKCJwcmVwcm9jIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0M6IHMuYXBwZW5kKCJwb3N0cHJvYyIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgiaW5zZXJ0IHByZWY6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWTogcy5hcHBlbmQoImFueSIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVDogcy5hcHBlbmQoImZpcnN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1Q6IHMuYXBwZW5kKCJsYXN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRTogcy5hcHBlbmQoImV4Y2x1c2l2ZSIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgidm9sdW1lIG1nbXQ6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX05PTkU6IHMuYXBwZW5kKCJub25lIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw6IHMuYXBwZW5kKCJpbXBsZW1lbnRzIGNvbnRyb2wiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgaW5kaWNhdGlvbiIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICB1aW50MzJfdCBkZXZpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0RFVklDRV9NQVNLOworICAgIGlmIChkZXZpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoImRldmljZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChkZXZpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgdXBkYXRlcyIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgcy5hcHBlbmQoImlucHV0IG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlBVVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1Q6IHMuYXBwZW5kKCJkaXJlY3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKKyAgICB9CisgICAgcy5hcHBlbmQoIiwgIik7CisKKyAgICBzLmFwcGVuZCgib3V0cHV0IG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PVVRQVVRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEg6IHMuYXBwZW5kKCJkaXJlY3QrcHJvdmlkZXIiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoIm5vdCBzZXQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgdWludDMyX3QgYWNjZWwgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLOworICAgIGlmIChhY2NlbCkgeworICAgICAgICBzLmFwcGVuZCgiaGFyZHdhcmUgYWNjZWxlcmF0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChhY2NlbCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEU6IHMuYXBwZW5kKCJub24tdHVubmVsZWQiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTDogcy5hcHBlbmQoInR1bm5lbGVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtb2RlaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19NT0RFX01BU0s7CisgICAgaWYgKG1vZGVpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoIm1vZGUgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAobW9kZWluZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHVpbnQzMl90IHNyY2luZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX01BU0s7CisgICAgaWYgKHNyY2luZCkgeworICAgICAgICBzLmFwcGVuZCgic291cmNlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKHNyY2luZCkgeworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9NQVNLKSB7CisgICAgICAgIHMuYXBwZW5kKCJvZmZsb2FkYWJsZSwgIik7CisgICAgfQorCisgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgaWYgKHMubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgIGNoYXIgKnN0ciA9IHMubG9ja0J1ZmZlcihsZW4pOworICAgICAgICBzLnVubG9ja0J1ZmZlcihsZW4gLSAyKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC04NDksOCArOTc4LDggQEAKICAgICB9CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0U2Vzc2lvbiBTdGF0dXMgU3RhdGUgRW5naW5lOlxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCUwNWQgICAlMDNkICAgICUwM2QgICAweCUwOHhcbiIsCi0gICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsICh1aW50MzJfdCltRWZmZWN0SW50ZXJmYWNlKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVwXG4iLAorICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCBtRWZmZWN0SW50ZXJmYWNlKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0RGVzY3JpcHRvcjpcbiIpOwpAQCAtODY3LDkgKzk5NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBtRGVzY3JpcHRvci50eXBlLm5vZGVbMl0sCiAgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5ub2RlWzNdLG1EZXNjcmlwdG9yLnR5cGUubm9kZVs0XSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNV0pOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzKTsKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzLAorICAgICAgICAgICAgZWZmZWN0RmxhZ3NUb1N0cmluZyhtRGVzY3JpcHRvci5mbGFncykuc3RyaW5nKCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBuYW1lOiAlc1xuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLm5hbWUpOwpAQCAtODc5LDM4ICsxMDA5LDM4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdDB4JTA4eCAlMDVkICAgJTA1ZCAgICAlMDh4ICVkXG4iLAotICAgICAgICAgICAgKHVpbnQzMl90KW1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdCBCdWZmZXJcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCUwNXp1ICAgJTA1ZCAgICAlMDh4ICU2ZCAoJXMpICVwXG4iLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscywKLSAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0KTsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0LAorICAgICAgICAgICAgZm9ybWF0VG9TdHJpbmcoKGF1ZGlvX2Zvcm1hdF90KW1Db25maWcuaW5wdXRDZmcuZm9ybWF0KSwKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQweCUwOHggJTA1ZCAgICUwNWQgICAgJTA4eCAlZFxuIiwKLSAgICAgICAgICAgICh1aW50MzJfdCltQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICVkICglcylcbiIsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKLSAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQsCisgICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0KSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCVkIENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlenUgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdFBpZCAgIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBtSGFuZGxlc1tpXTsKICAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMICYmICFoYW5kbGUtPmRlc3Ryb3llZF9sKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgaGFuZGxlLT5kdW1wVG9CdWZmZXIoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCiAgICAgaWYgKGxvY2tlZCkgewpAQCAtOTQwLDE4ICsxMDcwLDE1IEBACiAgICAgfQogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwogICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIGJ1Zk9mZnNldCk7Ci0gICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKLSAgICAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotCi0gICAgICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAorICAgICAgICAgICAgKG1DYmxrID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X3BhcmFtX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIEVmZmVjdCBzaXplPSV1IiwgRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsKICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX2NibGtfdCkpOworICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIG5ldyhtQ2JsaykgZWZmZWN0X3BhcmFtX2NibGtfdCgpOworICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OwogfQogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6fkVmZmVjdEhhbmRsZSgpCkBAIC05NjgsNiArMTA5NSwxMSBAQAogICAgIGRpc2Nvbm5lY3QoZmFsc2UpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gbUNsaWVudCA9PSAwIHx8IG1DYmxrTWVtb3J5ICE9IDAgPyBPSyA6IE5PX01FTU9SWTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmVuYWJsZSgpCiB7CiAgICAgQUxPR1YoImVuYWJsZSAlcCIsIHRoaXMpOwpAQCAtMTA4Miw4ICsxMjE0LDggQEAKICAgICAgICAgICAgIG1DYmxrLT5+ZWZmZWN0X3BhcmFtX2NibGtfdCgpOyAgIC8vIGRlc3Ryb3kgb3VyIHNoYXJlZC1zdHJ1Y3R1cmUuCiAgICAgICAgIH0KICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsgICAgLy8gZnJlZSB0aGUgc2hhcmVkIG1lbW9yeSBiZWZvcmUgcmVsZWFzaW5nIHRoZSBoZWFwIGl0IGJlbG9uZ3MgdG8KLSAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgbXVzdCBydW4gd2l0aCBBdWRpb0ZsaW5nZXIgbXV0ZXggbG9ja2VkCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUxvY2spOworICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBjbGllbnQgbXV0ZXggbG9ja2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50LT5hdWRpb0ZsaW5nZXIoKS0+bUNsaWVudExvY2spOwogICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CiAgICAgfQogfQpAQCAtMTIwOCwxNSArMTM0MCwxNSBAQAogfQogCiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmR1bXBUb0J1ZmZlcihjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCUwNWQgJTA1ZCAgICAlMDF1ICAgICUwMXUgICAgICAlMDV1ICAlMDV1XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCi0gICAgICAgICAgICBtSGFzQ29udHJvbCwKLSAgICAgICAgICAgICFsb2NrZWQsCisgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPmNsaWVudEluZGV4IDogMCwKICAgICAgICAgICAgIG1DYmxrID8gbUNibGstPnNlcnZlckluZGV4IDogMAogICAgICAgICAgICAgKTsKQEAgLTEyMzMsNyArMTM2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6IG1UaHJlYWQodGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1UcmFja0NudCgwKSwgbVRhaWxCdWZmZXJDb3VudCgwKSwKICAgICAgIG1Pd25JbkJ1ZmZlcihmYWxzZSksIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAotICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCisgICAgICBtTmV3TGVmdFZvbHVtZShVSU5UX01BWCksIG1OZXdSaWdodFZvbHVtZShVSU5UX01BWCksIG1Gb3JjZVZvbHVtZShmYWxzZSkKIHsKICAgICBtU3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX01VU0lDKTsKICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKQEAgLTEzMDcsNyArMTQzOSwxMyBAQAogLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNsZWFySW5wdXRCdWZmZXJfbChzcDxUaHJlYWRCYXNlPiB0aHJlYWQpCiB7Ci0gICAgbWVtc2V0KG1JbkJ1ZmZlciwgMCwgdGhyZWFkLT5mcmFtZUNvdW50KCkgKiB0aHJlYWQtPmZyYW1lU2l6ZSgpKTsKKyAgICAvLyBUT0RPOiBUaGlzIHdpbGwgY2hhbmdlIGluIHRoZSBmdXR1cmUsIGRlcGVuZGluZyBvbiBtdWx0aWNoYW5uZWwKKyAgICAvLyBhbmQgc2FtcGxlIGZvcm1hdCBjaGFuZ2VzIGZvciBlZmZlY3RzLgorICAgIC8vIEN1cnJlbnRseSBlZmZlY3RzIHByb2Nlc3NpbmcgaXMgb25seSBhdmFpbGFibGUgZm9yIHN0ZXJlbywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAvLyAoNCBieXRlcyBmcmFtZSBzaXplKQorICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPQorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgKiBtaW4oRkNDXzIsIHRocmVhZC0+Y2hhbm5lbENvdW50KCkpOworICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIHRocmVhZC0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKIH0KIAogLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCkBAIC0xNTUwLDcgKzE2ODgsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGN0cmxJZHggPT0gbVZvbHVtZUN0cmxJZHggJiYgKmxlZnQgPT0gbUxlZnRWb2x1bWUgJiYgKnJpZ2h0ID09IG1SaWdodFZvbHVtZSkgeworICAgIGlmICghaXNWb2x1bWVGb3JjZWQoKSAmJiBjdHJsSWR4ID09IG1Wb2x1bWVDdHJsSWR4ICYmCisgICAgICAgICAgICAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CiAgICAgICAgIGlmIChoYXNDb250cm9sKSB7CiAgICAgICAgICAgICAqbGVmdCA9IG1OZXdMZWZ0Vm9sdW1lOwogICAgICAgICAgICAgKnJpZ2h0ID0gbU5ld1JpZ2h0Vm9sdW1lOwpAQCAtMTU5MSwzOSArMTczMCw1MiBAQAogICAgIHJldHVybiBoYXNDb250cm9sOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnN5bmNIYWxFZmZlY3RzU3RhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUVmZmVjdHNbaV0tPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpBQ1RJVkUgfHwKKyAgICAgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OlNUT1BQSU5HKSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+YWRkRWZmZWN0VG9IYWxfbCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRWZmZWN0cyBmb3Igc2Vzc2lvbiAlZDpcbiIsIG1TZXNzaW9uSWQpOworICAgIHNpemVfdCBudW1FZmZlY3RzID0gbUVmZmVjdHMuc2l6ZSgpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAlZCBlZmZlY3RzIGZvciBzZXNzaW9uICVkXG4iLCBudW1FZmZlY3RzLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKLSAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwotICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKLSAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7Ci0gICAgfQotCi0gICAgcmVzdWx0LmFwcGVuZCgiXHROdW0gZnggSW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCUwMmQgICAgIDB4JTA4eCAgMHglMDh4ICAgJWRcbiIsCi0gICAgICAgICAgICBtRWZmZWN0cy5zaXplKCksCi0gICAgICAgICAgICAodWludDMyX3QpbUluQnVmZmVyLAotICAgICAgICAgICAgKHVpbnQzMl90KW1PdXRCdWZmZXIsCi0gICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKLSAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChudW1FZmZlY3RzKSB7CisgICAgICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0Q291bGQgbm90IGxvY2sgbXV0ZXg6XG4iKTsKICAgICAgICAgfQotICAgIH0KIAotICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0SW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHQlcCAgJXAgICAlZFxuIiwKKyAgICAgICAgICAgICAgICBtSW5CdWZmZXIsCisgICAgICAgICAgICAgICAgbU91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgKytpKSB7CisgICAgICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3RzW2ldOworICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xODIxLDQgKzE5NzMsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVGhyZWFkID0gdGhyZWFkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldFRocmVhZCh0aHJlYWQpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IGI3MTc4NTcuLjZmOTNmODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTE5LDYgKzExOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgIT0gMDsgfQogICAgIHN0YXR1c190ICAgICAgICAgc2V0T2ZmbG9hZGVkKGJvb2wgb2ZmbG9hZGVkLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAgICAgYm9vbCAgICAgICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOwogCiAgICAgdm9pZCAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTE1Myw2ICsxNTQsNyBAQAogICAgIHVpbnQzMl90IG1EaXNhYmxlV2FpdENudDsgICAgICAgLy8gY3VycmVudCBwcm9jZXNzKCkgY2FsbHMgY291bnQgZHVyaW5nIGRpc2FibGUgcGVyaW9kLgogICAgIGJvb2wgICAgIG1TdXNwZW5kZWQ7ICAgICAgICAgICAgLy8gZWZmZWN0IGlzIHN1c3BlbmRlZDogdGVtcG9yYXJpbHkgZGlzYWJsZWQgYnkgZnJhbWV3b3JrCiAgICAgYm9vbCAgICAgbU9mZmxvYWRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgY3VycmVudGx5IG9mZmxvYWRlZCB0byB0aGUgYXVkaW8gRFNQCisgICAgd3A8QXVkaW9GbGluZ2VyPiAgICBtQXVkaW9GbGluZ2VyOwogfTsKIAogLy8gVGhlIEVmZmVjdEhhbmRsZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJRWZmZWN0IGludGVyZmFjZS4gSXQgcHJvdmlkZXMgcmVzb3VyY2VzCkBAIC0xNjksNiArMTcxLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIH5FZmZlY3RIYW5kbGUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCiAgICAgLy8gSUVmZmVjdAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCk7CkBAIC0yMDgsNyArMjExLDcgQEAKICAgICAvLyBkZXN0cm95ZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGFzc29jaWF0ZWQgRWZmZWN0TW9kdWxlIG1Mb2NrIGhlbGQKICAgICBib29sIGRlc3Ryb3llZF9sKCkgY29uc3QgeyByZXR1cm4gbURlc3Ryb3llZDsgfQogCi0gICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZHVtcFRvQnVmZmVyKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAgICAgLy8gZm9yIG1FZmZlY3QsIG1IYXNDb250cm9sLCBtRW5hYmxlZApAQCAtMjY5LDYgKzI3Miw3IEBACiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tRGVzY19sKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbUlkX2woaW50IGlkKTsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21UeXBlX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSk7CisgICAgLy8gRklYTUUgdXNlIGZsb2F0IHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKICAgICBib29sIHNldFZvbHVtZV9sKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQpOwogICAgIHZvaWQgc2V0RGV2aWNlX2woYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAgICAgdm9pZCBzZXRNb2RlX2woYXVkaW9fbW9kZV90IG1vZGUpOwpAQCAtMzE1LDYgKzMxOSwxNCBAQAogICAgIC8vIEF0IGxlYXN0IG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGluIHRoZSBjaGFpbiBpcyBlbmFibGVkCiAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRW5hYmxlZCgpOwogCisgICAgLy8gdXNlIHJlbGVhc2VfY2FzIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb2JzZXJ2ZWQgdmFsdWUsIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhlCisgICAgLy8gbmV3IHZhbHVlIGlzIG9ic2VydmFibGUuCisgICAgdm9pZCBmb3JjZVZvbHVtZSgpIHsgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9jYXMoZmFsc2UsIHRydWUsICZtRm9yY2VWb2x1bWUpOyB9CisgICAgLy8gdXNlIGFjcXVpcmVfY2FzIGJlY2F1c2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIG9ic2VydmVkIHZhbHVlIGFuZAorICAgIC8vIHdlIGFyZSB0aGUgb25seSBvYnNlcnZlcnMuCisgICAgYm9vbCBpc1ZvbHVtZUZvcmNlZCgpIHsgcmV0dXJuIChhbmRyb2lkX2F0b21pY19hY3F1aXJlX2Nhcyh0cnVlLCBmYWxzZSwgJm1Gb3JjZVZvbHVtZSkgPT0gMCk7IH0KKworICAgIHZvaWQgc3luY0hhbEVmZmVjdHNTdGF0ZSgpOwogCiAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTM0NSw2ICszNTcsOCBAQAogCiAgICAgdm9pZCBjbGVhcklucHV0QnVmZmVyX2woc3A8VGhyZWFkQmFzZT4gdGhyZWFkKTsKIAorICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpOworCiAgICAgd3A8VGhyZWFkQmFzZT4gbVRocmVhZDsgICAgIC8vIHBhcmVudCBtaXhlciB0aHJlYWQKICAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAogICAgIFZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCkBAIC0zNzAsNCArMzg0LDUgQEAKICAgICAvLyB0aW1lTG93IGZpZWxkcyBhbW9uZyBlZmZlY3QgdHlwZSBVVUlEcy4KICAgICAvLyBVcGRhdGVkIGJ5IHVwZGF0ZVN1c3BlbmRlZFNlc3Npb25zX2woKSBvbmx5LgogICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+ID4gbVN1c3BlbmRlZEVmZmVjdHM7CisgICAgdm9sYXRpbGUgaW50MzJfdCBtRm9yY2VWb2x1bWU7IC8vIGZvcmNlIG5leHQgdm9sdW1lIGNvbW1hbmQgYmVjYXVzZSBhIG5ldyBlZmZlY3Qgd2FzIGVuYWJsZWQKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjEzZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRmFzdENhcHR1cmUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLypzdGF0aWMqLyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIEZhc3RDYXB0dXJlOjppbml0aWFsOworCitGYXN0Q2FwdHVyZTo6RmFzdENhcHR1cmUoKSA6IEZhc3RUaHJlYWQoKSwKKyAgICBpbnB1dFNvdXJjZShOVUxMKSwgaW5wdXRTb3VyY2VHZW4oMCksIHBpcGVTaW5rKE5VTEwpLCBwaXBlU2lua0dlbigwKSwKKyAgICByZWFkQnVmZmVyKE5VTEwpLCByZWFkQnVmZmVyU3RhdGUoLTEpLCBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLCBzYW1wbGVSYXRlKDApLAorICAgIC8vIGR1bW15RHVtcFN0YXRlCisgICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkKDApCit7CisgICAgcHJldmlvdXMgPSAmaW5pdGlhbDsKKyAgICBjdXJyZW50ID0gJmluaXRpYWw7CisKKyAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7Cit9CisKK0Zhc3RDYXB0dXJlOjp+RmFzdENhcHR1cmUoKQoreworfQorCitGYXN0Q2FwdHVyZVN0YXRlUXVldWUqIEZhc3RDYXB0dXJlOjpzcSgpCit7CisgICAgcmV0dXJuICZtU1E7Cit9CisKK2NvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqRmFzdENhcHR1cmU6OnBvbGwoKQoreworICAgIHJldHVybiBtU1EucG9sbCgpOworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyIF9fdW51c2VkKQoreworfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvbklkbGUoKQoreworICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiljdXJyZW50OworICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKK30KKwordm9pZCBGYXN0Q2FwdHVyZTo6b25FeGl0KCkKK3sKKyAgICBkZWxldGVbXSByZWFkQnVmZmVyOworfQorCitib29sIEZhc3RDYXB0dXJlOjppc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCkKK3sKKyAgICBzd2l0Y2ggKChGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kKSBjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEOgorICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6V1JJVEU6CisgICAgY2FzZSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEZhc3RDYXB0dXJlOjpvblN0YXRlQ2hhbmdlKCkKK3sKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICBib29sIGVpdGhlckNoYW5nZWQgPSBmYWxzZTsKKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gaW5wdXQgSEFMIGNvbmZpZ3VyYXRpb24KKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgaWYgKGN1cnJlbnQtPm1JbnB1dFNvdXJjZUdlbiAhPSBpbnB1dFNvdXJjZUdlbikgeworICAgICAgICBpbnB1dFNvdXJjZSA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZTsKKyAgICAgICAgaW5wdXRTb3VyY2VHZW4gPSBjdXJyZW50LT5tSW5wdXRTb3VyY2VHZW47CisgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0ID0gaW5wdXRTb3VyY2UtPmZvcm1hdCgpOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChjaGFubmVsQ291bnQgPT0gMSB8fCBjaGFubmVsQ291bnQgPT0gMik7CisgICAgICAgIH0KKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gcGlwZQorICAgIGlmIChjdXJyZW50LT5tUGlwZVNpbmtHZW4gIT0gcGlwZVNpbmtHZW4pIHsKKyAgICAgICAgcGlwZVNpbmsgPSBjdXJyZW50LT5tUGlwZVNpbms7CisgICAgICAgIHBpcGVTaW5rR2VuID0gY3VycmVudC0+bVBpcGVTaW5rR2VuOworICAgICAgICBlaXRoZXJDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBpbnB1dCBzb3VyY2UgYW5kIHBpcGUgc2luayBtdXN0IGJlIGNvbXBhdGlibGUKKyAgICBpZiAoZWl0aGVyQ2hhbmdlZCAmJiBpbnB1dFNvdXJjZSAhPSBOVUxMICYmIHBpcGVTaW5rICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR19BU1NFUlQoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwaXBlU2luay0+Zm9ybWF0KCkpKTsKKyAgICB9CisKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHByZXZpb3VzRm9ybWF0KSkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgeworICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCisgICAgICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7CisgICAgICAgIHJlYWRCdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCisgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIGNhcHR1cmUgdGhyZWFkIGFsbG9jYXRlIGZvcgorICAgICAgICAgICAgLy8gICAgICAgdXMgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQorICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IG5ldyBzaG9ydFtmcmFtZUNvdW50ICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIG1lbXNldChyZWFkQnVmZmVyLCAwLCBmcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHJlYWRCdWZmZXJbMF0pKTsKKyAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1CisgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJpb2ROcyA9IDA7CisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7CisgICAgICAgICAgICBmb3JjZU5zID0gMDsKKyAgICAgICAgICAgIHdhcm11cE5zID0gMDsKKyAgICAgICAgfQorICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAtMTsKKyAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfQorCit9CisKK3ZvaWQgRmFzdENhcHR1cmU6Om9uV29yaygpCit7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RDYXB0dXJlRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisKKyAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGlucHV0U291cmNlICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOworICAgICAgICBkdW1wU3RhdGUtPm1SZWFkU2VxdWVuY2UrKzsKKyAgICAgICAgQVRSQUNFX0JFR0lOKCJyZWFkIik7CisgICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZCA9IGlucHV0U291cmNlLT5yZWFkKHJlYWRCdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVJlYWRTZXF1ZW5jZSsrOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA+PSAwKSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpIGZyYW1lc1JlYWQgPiBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IHRvdGFsTmF0aXZlRnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1SZWFkRXJyb3JzKys7CisgICAgICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAwOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHJlbmFtZSB0byBhdHRlbXB0ZWRJTworICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpXUklURSkgeworICAgICAgICBBTE9HX0FTU0VSVChwaXBlU2luayAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQocmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA8IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lU2l6ZQorICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRCdWZmZXJTdGF0ZSA+IDApIHsKKyAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHBpcGVTaW5rLT53cml0ZShyZWFkQnVmZmVyLCByZWFkQnVmZmVyU3RhdGUpOworICAgICAgICAgICAgLy8gRklYTUUgVGhpcyBzdXBwb3J0cyBhdCBtb3N0IG9uZSBmYXN0IGNhcHR1cmUgY2xpZW50LgorICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAvLyAgICAgICBvciB3aXRoIGEgbG90IG1vcmUgd29yayB0aGUgY29udHJvbCBibG9jayBjb3VsZCBiZSBzaGFyZWQgYnkgYWxsIGNsaWVudHMuCisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBjdXJyZW50LT5tQ2JsazsKKyAgICAgICAgICAgIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShmcmFtZXNXcml0dGVuICsgcmVhciwgJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgICAgICAgICAgICAgY2Jsay0+bVNlcnZlciArPSBmcmFtZXNXcml0dGVuOworICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GVVRFWF9XQUtFLCAmY2Jsay0+bUZ1dGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIShvbGQgJiBDQkxLX0ZVVEVYX1dBS0UpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBuZXZlciBpbiBzZXJ2ZXIgcHJvY2Vzcywgc28gZG9uJ3QgdXNlIEZVVEVYX1dBS0VfUFJJVkFURQorICAgICAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjpGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1SZWFkU2VxdWVuY2UoMCksIG1GcmFtZXNSZWFkKDApLCBtUmVhZEVycm9ycygwKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApCit7Cit9CisKK0Zhc3RDYXB0dXJlRHVtcFN0YXRlOjp+RmFzdENhcHR1cmVEdW1wU3RhdGUoKQoreworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzNWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfSAorCisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RDYXB0dXJlU3RhdGU+IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTsKKworc3RydWN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlIDogRmFzdFRocmVhZER1bXBTdGF0ZSB7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKKworICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZER1bXBTdGF0ZQorICAgIHVpbnQzMl90IG1SZWFkU2VxdWVuY2U7ICAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVhZCgpCisgICAgdWludDMyX3QgbUZyYW1lc1JlYWQ7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVhZCBzdWNjZXNzZnVsbHkKKyAgICB1aW50MzJfdCBtUmVhZEVycm9yczsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHJlYWQoKSBlcnJvcnMKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKK307CisKK2NsYXNzIEZhc3RDYXB0dXJlIDogcHVibGljIEZhc3RUaHJlYWQgeworCitwdWJsaWM6CisgICAgICAgICAgICBGYXN0Q2FwdHVyZSgpOworICAgIHZpcnR1YWwgfkZhc3RDYXB0dXJlKCk7CisKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSogIHNxKCk7CisKK3ByaXZhdGU6CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgICBtU1E7CisKKyAgICAvLyBjYWxsb3V0cworICAgIHZpcnR1YWwgY29uc3QgRmFzdFRocmVhZFN0YXRlICpwb2xsKCk7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpOworICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25FeGl0KCk7CisgICAgdmlydHVhbCBib29sIGlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKKworICAgIHN0YXRpYyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIGluaXRpYWw7CisgICAgRmFzdENhcHR1cmVTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQorICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZAorICAgIE5CQUlPX1NvdXJjZSAqaW5wdXRTb3VyY2U7CisgICAgaW50IGlucHV0U291cmNlR2VuOworICAgIE5CQUlPX1NpbmsgKnBpcGVTaW5rOworICAgIGludCBwaXBlU2lua0dlbjsKKyAgICBzaG9ydCAqcmVhZEJ1ZmZlcjsKKyAgICBzc2l6ZV90IHJlYWRCdWZmZXJTdGF0ZTsgICAgLy8gbnVtYmVyIG9mIGluaXRpYWxpemVkIGZyYW1lcyBpbiByZWFkQnVmZmVyLCBvciAtMSB0byBjbGVhcgorICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7CisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQ7IC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkCisKK307ICAvLyBjbGFzcyBGYXN0Q2FwdHVyZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCmluZGV4IDEzY2FjNmQuLjFkMDI5YjcKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEzICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0gKLSNkZWZpbmUgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitGYXN0Q2FwdHVyZVN0YXRlOjpGYXN0Q2FwdHVyZVN0YXRlKCkgOiBGYXN0VGhyZWFkU3RhdGUoKSwKKyAgICBtSW5wdXRTb3VyY2UoTlVMTCksIG1JbnB1dFNvdXJjZUdlbigwKSwgbVBpcGVTaW5rKE5VTEwpLCBtUGlwZVNpbmtHZW4oMCksIG1GcmFtZUNvdW50KDApCit7Cit9CiAKLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KK0Zhc3RDYXB0dXJlU3RhdGU6On5GYXN0Q2FwdHVyZVN0YXRlKCkKK3sKK30KIAorfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Yzg2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9DQVBUVVJFX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAorCisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBSZXByZXNlbnQgYSBzaW5nbGUgc3RhdGUgb2YgdGhlIGZhc3QgY2FwdHVyZQorc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUgOiBGYXN0VGhyZWFkU3RhdGUgeworICAgICAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVTdGF0ZSgpOworCisgICAgLy8gYWxsIHBvaW50ZXIgZmllbGRzIHVzZSByYXcgcG9pbnRlcnM7IG9iamVjdHMgYXJlIG93bmVkIGFuZCByZWYtY291bnRlZCBieSBSZWNvcmRUaHJlYWQKKyAgICBOQkFJT19Tb3VyY2UgICAgKm1JbnB1dFNvdXJjZTsgICAgICAvLyBIQUwgaW5wdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAorICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIHRoZXNlIGZpZWxkcyB0byBGYXN0VGhyZWFkU3RhdGUKKyAgICBpbnQgICAgICAgICAgICAgbUlucHV0U291cmNlR2VuOyAgICAvLyBpbmNyZW1lbnQgd2hlbiBtSW5wdXRTb3VyY2UgaXMgYXNzaWduZWQKKyAgICBOQkFJT19TaW5rICAgICAgKm1QaXBlU2luazsgICAgICAgICAvLyBhZnRlciByZWFkaW5nIGZyb20gaW5wdXQgc291cmNlLCB3cml0ZSB0byB0aGlzIHBpcGUgc2luaworICAgIGludCAgICAgICAgICAgICBtUGlwZVNpbmtHZW47ICAgICAgIC8vIGluY3JlbWVudCB3aGVuIG1QaXBlU2luayBpcyBhc3NpZ25lZAorICAgIHNpemVfdCAgICAgICAgICBtRnJhbWVDb3VudDsgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgY2FwdHVyZSBidWZmZXIKKyAgICBhdWRpb190cmFja19jYmxrX3QgICptQ2JsazsgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciB0aGUgc2luZ2xlIGZhc3QgY2xpZW50LCBvciBOVUxMCisKKyAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAorICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CisgICAgICAgIFJFQUQgPSAweDgsICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UKKyAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gcGlwZSBzaW5rCisgICAgICAgIFJFQURfV1JJVEUgPSAweDE4OyAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UgYW5kIHdyaXRlIHRvIHBpcGUgc2luaworCit9OyAgLy8gc3RydWN0IEZhc3RDYXB0dXJlU3RhdGUKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCBmMjdlYTE3Li4yNjc4Y2JmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjYsNyArMjYsNiBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlIDxzeXMvYXRvbWljcy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtMzcsNjM5ICszNiw0MzYgQEAKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAjZW5kaWYKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAKLSNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKLSNkZWZpbmUgRkFTVF9ERUZBVUxUX05TICAgIDk5OTk5OTk5OUwgICAvLyB+MSBzZWM6IGRlZmF1bHQgdGltZSB0byBzbGVlcAotI2RlZmluZSBNSU5fV0FSTVVQX0NZQ0xFUyAgICAgICAgICAyICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotI2RlZmluZSBNQVhfV0FSTVVQX0NZQ0xFUyAgICAgICAgIDEwICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAotCiAjZGVmaW5lIEZDQ18yICAgICAgICAgICAgICAgICAgICAgICAyICAgLy8gZml4ZWQgY2hhbm5lbCBjb3VudCBhc3N1bXB0aW9uCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gRmFzdCBtaXhlciB0aHJlYWQKLWJvb2wgRmFzdE1peGVyOjp0aHJlYWRMb29wKCkKKy8qc3RhdGljKi8gY29uc3QgRmFzdE1peGVyU3RhdGUgRmFzdE1peGVyOjppbml0aWFsOworCitGYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgpLAorICAgIHNsb3BOcygwKSwKKyAgICAvLyBmYXN0VHJhY2tOYW1lcworICAgIC8vIGdlbmVyYXRpb25zCisgICAgb3V0cHV0U2luayhOVUxMKSwKKyAgICBvdXRwdXRTaW5rR2VuKDApLAorICAgIG1peGVyKE5VTEwpLAorICAgIG1TaW5rQnVmZmVyKE5VTEwpLAorICAgIG1TaW5rQnVmZmVyU2l6ZSgwKSwKKyAgICBtU2lua0NoYW5uZWxDb3VudChGQ0NfMiksCisgICAgbU1peGVyQnVmZmVyKE5VTEwpLAorICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCisgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBtTWl4ZXJCdWZmZXJTdGF0ZShVTkRFRklORUQpLAorICAgIGZvcm1hdChGb3JtYXRfSW52YWxpZCksCisgICAgc2FtcGxlUmF0ZSgwKSwKKyAgICBmYXN0VHJhY2tzR2VuKDApLAorICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKKyAgICAvLyB0aW1lc3RhbXAKKyAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKDApICAgLy8gdGhlID0gMCBpcyB0byBzaWxlbmNlIHRoZSBjb21waWxlcgogewotICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBpbml0aWFsOwotICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICpwcmV2aW91cyA9ICZpbml0aWFsLCAqY3VycmVudCA9ICZpbml0aWFsOwotICAgIEZhc3RNaXhlclN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZFRzID0gezAsIDB9OwotICAgIGJvb2wgb2xkVHNWYWxpZCA9IGZhbHNlOwotICAgIGxvbmcgc2xvcE5zID0gMDsgICAgLy8gYWNjdW11bGF0ZWQgdGltZSB3ZSd2ZSB3b2tlbiB1cCB0b28gZWFybHkgKD4gMCkgb3IgdG9vIGxhdGUgKDwgMCkKLSAgICBsb25nIHNsZWVwTnMgPSAtMTsgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAotICAgIGludCBmYXN0VHJhY2tOYW1lc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAvLyBoYW5kbGVzIHVzZWQgYnkgbWl4ZXIgdG8gaWRlbnRpZnkgdHJhY2tzCi0gICAgaW50IGdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107ICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KKyAgICAvLyBGSVhNRSBwYXNzIGluaXRpYWwgYXMgcGFyYW1ldGVyIHRvIGJhc2UgY2xhc3MgY29uc3RydWN0b3IsIGFuZCBtYWtlIGl0IHN0YXRpYyBsb2NhbAorICAgIHByZXZpb3VzID0gJmluaXRpYWw7CisgICAgY3VycmVudCA9ICZpbml0aWFsOworCisgICAgbUR1bW15RHVtcFN0YXRlID0gJmR1bW15RHVtcFN0YXRlOworICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0LgorICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgorICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOworCiAgICAgdW5zaWduZWQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSAwOwogICAgIH0KLSAgICBOQkFJT19TaW5rICpvdXRwdXRTaW5rID0gTlVMTDsKLSAgICBpbnQgb3V0cHV0U2lua0dlbiA9IDA7Ci0gICAgQXVkaW9NaXhlciogbWl4ZXIgPSBOVUxMOwotICAgIHNob3J0ICptaXhCdWZmZXIgPSBOVUxMOwotICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbWl4QnVmZmVyU3RhdGUgPSBVTkRFRklORUQ7Ci0gICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwotICAgIHVuc2lnbmVkIHNhbXBsZVJhdGUgPSAwOwotICAgIGludCBmYXN0VHJhY2tzR2VuID0gMDsKLSAgICBsb25nIHBlcmlvZE5zID0gMDsgICAgICAvLyBleHBlY3RlZCBwZXJpb2Q7IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlbmRlciBvbmUgbWl4IGJ1ZmZlcgotICAgIGxvbmcgdW5kZXJydW5OcyA9IDA7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCi0gICAgbG9uZyBvdmVycnVuTnMgPSAwOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgZm9yY2VOcyA9IDA7ICAgICAgIC8vIGlmIG92ZXJydW4gZGV0ZWN0ZWQsIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCi0gICAgbG9uZyB3YXJtdXBOcyA9IDA7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGUsICpkdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7Ci0gICAgYm9vbCBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCiAjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQgPSB7MCwgMH07ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCi0gICAgYm9vbCBvbGRMb2FkVmFsaWQgPSBmYWxzZTsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAotICAgIHVpbnQzMl90IGJvdW5kcyA9IDA7Ci0gICAgYm9vbCBmdWxsID0gZmFsc2U7ICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBUaHJlYWRDcHVVc2FnZSB0Y3U7ICAgICAvLyBmb3IgcmVhZGluZyB0aGUgY3VycmVudCBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorICAgIG9sZExvYWQudHZfc2VjID0gMDsKKyAgICBvbGRMb2FkLnR2X25zZWMgPSAwOwogI2VuZGlmCi0jZW5kaWYKLSAgICB1bnNpZ25lZCBjb2xkR2VuID0gMDsgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCi0gICAgYm9vbCBpc1dhcm0gPSBmYWxzZTsgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCi0gICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHMgPSB7MCwgMH07ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzID0gMDsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotICAgIE5CQUlPX1NpbmsqIHRlZVNpbmsgPSBOVUxMOyAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKSB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlciwgKmxvZ1dyaXRlciA9ICZkdW1teUxvZ1dyaXRlcjsKLSAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gPSAwOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KK30KIAotICAgIC8vIG5leHQgMiBmaWVsZHMgYXJlIHZhbGlkIG9ubHkgd2hlbiB0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IKLSAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gICAgdWludDMyX3QgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9IDA7ICAgIC8vIHRoZSA9IDAgaXMgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKLSAgICBzdGF0dXNfdCB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKK0Zhc3RNaXhlcjo6fkZhc3RNaXhlcigpCit7Cit9CiAKLSAgICBmb3IgKDs7KSB7CitGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBGYXN0TWl4ZXI6OnNxKCkKK3sKKyAgICByZXR1cm4gJm1TUTsKK30KIAotICAgICAgICAvLyBlaXRoZXIgbmFub3NsZWVwLCBzY2hlZF95aWVsZCwgb3IgYnVzeSB3YWl0Ci0gICAgICAgIGlmIChzbGVlcE5zID49IDApIHsKLSAgICAgICAgICAgIGlmIChzbGVlcE5zID4gMCkgewotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHNsZWVwTnMgPCAxMDAwMDAwMDAwKTsKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgcmVxID0gezAsIHNsZWVwTnN9OwotICAgICAgICAgICAgICAgIG5hbm9zbGVlcCgmcmVxLCBOVUxMKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWRfeWllbGQoKTsKK2NvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqRmFzdE1peGVyOjpwb2xsKCkKK3sKKyAgICByZXR1cm4gbVNRLnBvbGwoKTsKK30KKwordm9pZCBGYXN0TWl4ZXI6OnNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpCit7CisgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgbWl4ZXItPnNldExvZyhsb2dXcml0ZXIpOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uSWRsZSgpCit7CisgICAgcHJlSWRsZSA9ICooY29uc3QgRmFzdE1peGVyU3RhdGUgKiljdXJyZW50OworICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uRXhpdCgpCit7CisgICAgZGVsZXRlIG1peGVyOworICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBmcmVlKG1TaW5rQnVmZmVyKTsKK30KKworYm9vbCBGYXN0TWl4ZXI6OmlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQoreworICAgIHN3aXRjaCAoKEZhc3RNaXhlclN0YXRlOjpDb21tYW5kKSBjb21tYW5kKSB7CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYOgorICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OldSSVRFOgorICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UoKQoreworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+cHJldmlvdXM7CisgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKKworICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCisgICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZpbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKKyAgICB1bnNpZ25lZCBwcmV2aW91c1RyYWNrTWFzazsKKworICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCisgICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBvdXRwdXRTaW5rR2VuKSB7CisgICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKKyAgICAgICAgb3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOworICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOworICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOworICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG91dHB1dFNpbmstPmZvcm1hdCgpOworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKKworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKKyAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQorCisgICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKKyAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQorICAgICAgICBkZWxldGUgbWl4ZXI7CisgICAgICAgIG1peGVyID0gTlVMTDsKKyAgICAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOworICAgICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOworICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICAgICAgbVNpbmtCdWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIG5ldyBtYXkgYmxvY2sgZm9yIHVuYm91bmRlZCB0aW1lIGF0IGludGVybmFsIG11dGV4IG9mIHRoZSBoZWFwCisgICAgICAgICAgICAvLyAgICAgICBpbXBsZW1lbnRhdGlvbjsgaXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgbm9ybWFsIG1peGVyIGFsbG9jYXRlIGZvciB1cworICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgICAgIG1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lU2l6ZSA9IG1TaW5rQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1peGVyRnJhbWVTaXplICogZnJhbWVDb3VudDsKKyAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rRnJhbWVTaXplID0gbVNpbmtDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChzaW5rRnJhbWVTaXplID4gbWl4ZXJGcmFtZVNpemUpIHsgLy8gbmVlZCBhIHNpbmsgYnVmZmVyCisgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplID0gc2lua0ZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1TaW5rQnVmZmVyLCAzMiwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlcmlvZE5zID0gKGZyYW1lQ291bnQgKiAxMDAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMS4wMAorICAgICAgICAgICAgdW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAvLyAxLjc1CisgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIGZvcmNlTnMgPSAoZnJhbWVDb3VudCAqIDk1MDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAgLy8gMC45NQorICAgICAgICAgICAgd2FybXVwTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgICAvLyAwLjUwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZXJpb2ROcyA9IDA7CisgICAgICAgICAgICB1bmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7CisgICAgICAgICAgICBmb3JjZU5zID0gMDsKKyAgICAgICAgICAgIHdhcm11cE5zID0gMDsKICAgICAgICAgfQotICAgICAgICAvLyBkZWZhdWx0IHRvIGxvbmcgc2xlZXAgZm9yIG5leHQgY3ljbGUKLSAgICAgICAgc2xlZXBOcyA9IEZBU1RfREVGQVVMVF9OUzsKLQotICAgICAgICAvLyBwb2xsIGZvciBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKm5leHQgPSBtU1EucG9sbCgpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBjb250aW51ZSB0byB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBzdGF0ZSB1bnRpbCBhIHJlYWwgc3RhdGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBBTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKLSAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICBtTWl4ZXJCdWZmZXJTdGF0ZSA9IFVOREVGSU5FRDsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7CiAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGFsbCBhY3RpdmUgdHJhY2tzCisgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKKyAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuIC0gMTsKKyAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlvdXNUcmFja01hc2sgPSBwcmV2aW91cy0+bVRyYWNrTWFzazsKKyAgICB9CiAKLSAgICAgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOwotICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0CisgICAgY29uc3QgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKKyAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgeworICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGludCBuYW1lOwogCi0gICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKLSAgICAgICAgICAgIGR1bXBTdGF0ZSA9IG5leHQtPm1EdW1wU3RhdGUgIT0gTlVMTCA/IG5leHQtPm1EdW1wU3RhdGUgOiAmZHVtbXlEdW1wU3RhdGU7Ci0gICAgICAgICAgICB0ZWVTaW5rID0gbmV4dC0+bVRlZVNpbms7Ci0gICAgICAgICAgICBsb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZkdW1teUxvZ1dyaXRlcjsKKyAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcworICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgeworICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOworICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwogICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0TG9nKGxvZ1dyaXRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCi0gICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCi0gICAgICAgICAgICAvLyBTbyB3aGVuIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgbm9uLWlkbGUgc3RhdGUgaW50byBhbiBpZGxlIHN0YXRlLCB3ZSBtYWtlIGEKLSAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGxhc3Qga25vd24gbm9uLWlkbGUgc3RhdGUgc28gaXQgaXMgc3RpbGwgYXZhaWxhYmxlIG9uIHJldHVybiBmcm9tIGlkbGUuCi0gICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgdHJhbnNpdGlvbnMgYXJlOgotICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IG5vbi1pZGxlICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGN1cnJlbnQgaW4tcGxhY2UKLSAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKLSAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKLSAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkgewotICAgICAgICAgICAgICAgICAgICBwcmVJZGxlID0gKmN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKLSAgICAgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSBmYWxzZTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwotICAgICAgICB9Ci0jaWYgIUxPR19OREVCVUcKLSAgICAgICAgbmV4dCA9IE5VTEw7ICAgIC8vIG5vdCByZWZlcmVuY2VkIGFnYWluCi0jZW5kaWYKLQotICAgICAgICBkdW1wU3RhdGUtPm1Db21tYW5kID0gY29tbWFuZDsKLQotICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTDoKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU6Ci0gICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU6Ci0gICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCi0gICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKLSAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgX19mdXRleF9zeXNjYWxsNChjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOwotICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKLSAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCi0gICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Ci0gICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7Ci0gICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOwotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7Ci0gICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6RVhJVDoKLSAgICAgICAgICAgIGRlbGV0ZSBtaXhlcjsKLSAgICAgICAgICAgIGRlbGV0ZVtdIG1peEJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYOgotICAgICAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKLSAgICAgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfRkFUQUwoImJhZCBjb21tYW5kICVkIiwgY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGVyZSBpcyBhIG5vbi1pZGxlIHN0YXRlIGF2YWlsYWJsZSB0byB1czsgZGlkIHRoZSBzdGF0ZSBjaGFuZ2U/Ci0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSB7Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCi0gICAgICAgICAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJmluaXRpYWwgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAotICAgICAgICAgICAgdW5zaWduZWQgcHJldmlvdXNUcmFja01hc2s7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gb3V0cHV0U2lua0dlbikgewotICAgICAgICAgICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKLSAgICAgICAgICAgICAgICBvdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkgPT0gRkNDXzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChmb3JtYXQgIT0gcHJldmlvdXNGb3JtYXQpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCi0gICAgICAgICAgICAgICAgZGVsZXRlIG1peGVyOwotICAgICAgICAgICAgICAgIG1peGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBtaXhCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWl4QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgdG8gYXZvaWQgYmxvY2tpbmcgaGVyZSBhbmQgdG8gcHJldmVudCBwb3NzaWJsZSBwcmlvcml0eSBpbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOwotICAgICAgICAgICAgICAgICAgICBtaXhCdWZmZXIgPSBuZXcgc2hvcnRbZnJhbWVDb3VudCAqIEZDQ18yXTsKLSAgICAgICAgICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCi0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDE3NTAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgLy8gMS43NQotICAgICAgICAgICAgICAgICAgICBvdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIHNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKLSAgICAgICAgICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1Ci0gICAgICAgICAgICAgICAgICAgIHdhcm11cE5zID0gKGZyYW1lQ291bnQgKiA1MDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAgLy8gMC41MAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG92ZXJydW5OcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICB3YXJtdXBOcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcwotICAgICAgICAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKLSAgICAgICAgICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBmYXN0VHJhY2tzR2VuKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobWl4QnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGludCBuYW1lOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlbW92ZWRUcmFja3MgPSBwcmV2aW91c1RyYWNrTWFzayAmIH5jdXJyZW50VHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChyZW1vdmVkVHJhY2tzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IF9fYnVpbHRpbl9jdHoocmVtb3ZlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgYWRkZWRUcmFja3MgPSBjdXJyZW50VHJhY2tNYXNrICYgfnByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChhZGRlZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGFkZGVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIGdldFRyYWNrTmFtZSB3aXRoIGRlZmF1bHQgY2hhbm5lbCBtYXNrIGFuZCBhIHJhbmRvbSBpbnZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHNlc3Npb25JZCAobm8gZWZmZWN0cyBoZXJlKQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCAtNTU1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIG1peEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gMCAmJiBmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsICh2b2lkKikgZmFzdFRyYWNrLT5tU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKLSAgICAgICAgICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgotICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1vZGlmaWVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIHByZXZpb3VzVHJhY2tNYXNrOwotICAgICAgICAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikweDEwMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1TYW1wbGVSYXRlICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLCAodm9pZCopIGZhc3RUcmFjay0+bVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOwotCi0gICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7Ci0gICAgICAgICAgICB9Ci0KLSNpZiAxICAgLy8gRklYTUUgc2hvdWxkbid0IG5lZWQgdGhpcwotICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHN0YXRlIGNoYW5nZSBvbmNlCi0gICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvIHdvcmsgdXNpbmcgY3VycmVudCBzdGF0ZSBoZXJlCi0gICAgICAgIGlmICgoY29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpNSVgpICYmIChtaXhlciAhPSBOVUxMKSAmJiBpc1dhcm0pIHsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKG1peEJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KLSAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRUcmFja01hc2sgPSBjdXJyZW50LT5tVHJhY2tNYXNrOwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRUcmFja01hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGkgPSBfX2J1aWx0aW5fY3R6KGN1cnJlbnRUcmFja01hc2spOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotCi0gICAgICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgcGVyLXRyYWNrIHRpbWVzdGFtcAotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUgPSBmYXN0VHJhY2stPm1TYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBjdXJyZW50bHkgbm8gc2FtcGxlIHJhdGUgY29udmVyc2lvbiBmb3IgZmFzdCB0cmFja3MgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gMCAmJiB0cmFja1NhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogdHJhY2tTYW1wbGVSYXRlKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBwcm92aWRlIGFuIEF1ZGlvVGltZXN0YW1wIGJlZm9yZSBmaXJzdCBmcmFtZSBwcmVzZW50ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIGR1cmluZyB0aGUgYnJpZWYgMzItYml0IHdyYXBhcm91bmQgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCBwZXJUcmFja1RpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1Qb3NpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1UaW1lID0gdGltZXN0YW1wLm1UaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPm9uVGltZXN0YW1wKHBlclRyYWNrVGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICAgICAgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHZsciAmIDB4RkZGRikpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh2bHIgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKLSAgICAgICAgICAgICAgICAvLyB0YWtlcyBhIHRyeUxvY2ssIHdoaWNoIGNhbiBibG9jawotICAgICAgICAgICAgICAgIC8vIHVwIHRvIDEgbXMuICBJZiBlbm91Z2ggYWN0aXZlIHRyYWNrcyBhbGwgYmxvY2tlZCBpbiBzZXF1ZW5jZSwgdGhpcyB3b3VsZCByZXN1bHQKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgotICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWFkeSgpOwotICAgICAgICAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgdHJhY2VOYW1lWzE2XTsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgImZSZHkiKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZkdW1wU3RhdGUtPm1UcmFja3NbaV07Ci0gICAgICAgICAgICAgICAgRmFzdFRyYWNrVW5kZXJydW5zIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tRW1wdHkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZG9uJ3QgcmVzZXQgdHJhY2sgZHVtcCBzdGF0ZSwgc2luY2Ugb3RoZXIgc2lkZSBpcyBpZ25vcmluZyBpdAorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCisgICAgICAgIHVuc2lnbmVkIGFkZGVkVHJhY2tzID0gY3VycmVudFRyYWNrTWFzayAmIH5wcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CisgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMICYmIGZhc3RUcmFja05hbWVzW2ldID09IC0xKTsKKyAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1peGVyLT5nZXRUcmFja05hbWUoZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICBmYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQorICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxseSBwcm9jZXNzIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgdHJhY2tzOyB0aGVzZSB1c2UgdGhlIHNhbWUgc2xvdAorICAgICAgICAvLyBidXQgbWF5IGhhdmUgYSBkaWZmZXJlbnQgYnVmZmVyIHByb3ZpZGVyIG9yIHZvbHVtZSBwcm92aWRlcgorICAgICAgICB1bnNpZ25lZCBtb2RpZmllZFRyYWNrcyA9IGN1cnJlbnRUcmFja01hc2sgJiBwcmV2aW91c1RyYWNrTWFzazsKKyAgICAgICAgd2hpbGUgKG1vZGlmaWVkVHJhY2tzICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihtb2RpZmllZFRyYWNrcyk7CisgICAgICAgICAgICBtb2RpZmllZFRyYWNrcyAmPSB+KDEgPDwgaSk7CisgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IGdlbmVyYXRpb25zW2ldKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyB0cmFjayB3YXMgYWN0dWFsbHkgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChtaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBmYXN0VHJhY2tOYW1lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRU1PVkUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZW5hYmxlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW47CisKKyAgICAgICAgZHVtcFN0YXRlLT5tTnVtVHJhY2tzID0gcG9wY291bnQoY3VycmVudFRyYWNrTWFzayk7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKK3sKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIHRoaXMtPmR1bXBTdGF0ZTsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBjb21tYW5kID0gdGhpcy0+Y29tbWFuZDsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1peGVyICE9IE5VTEwpICYmIGlzV2FybSkgeworICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrLCB1cGRhdGUgdm9sdW1lIGFuZCBjaGVjayBmb3IgdW5kZXJydW4KKyAgICAgICAgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CisgICAgICAgIHdoaWxlIChjdXJyZW50VHJhY2tNYXNrICE9IDApIHsKKyAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihjdXJyZW50VHJhY2tNYXNrKTsKKyAgICAgICAgICAgIGN1cnJlbnRUcmFja01hc2sgJj0gfigxIDw8IGkpOworICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CisKKyAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWNrRnJhbWVzV3JpdHRlbiA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICAgICAgICAgIC8vIENhbid0IHByb3ZpZGUgYW4gQXVkaW9UaW1lc3RhbXAgYmVmb3JlIGZpcnN0IGZyYW1lIHByZXNlbnRlZCwKKyAgICAgICAgICAgICAgICAvLyBvciBkdXJpbmcgdGhlIGJyaWVmIDMyLWJpdCB3cmFwYXJvdW5kIHdpbmRvdworICAgICAgICAgICAgICAgIGlmICh0cmFja0ZyYW1lc1dyaXR0ZW4gPj0gdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZXN0YW1wIHBlclRyYWNrVGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tUG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRnJhbWVzV3JpdHRlbiAtIHRyYWNrRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVRpbWUgPSB0aW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXItPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgICAgIGZsb2F0IHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKKyAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCisgICAgICAgICAgICAvLyB1cCB0byAxIG1zLiAgSWYgZW5vdWdoIGFjdGl2ZSB0cmFja3MgYWxsIGJsb2NrZWQgaW4gc2VxdWVuY2UsIHRoaXMgd291bGQgcmVzdWx0CisgICAgICAgICAgICAvLyBpbiB0aGUgb3ZlcmFsbCBmYXN0IG1peCBjeWNsZSBiZWluZyBkZWxheWVkLiAgU2hvdWxkIHVzZSBhIG5vbi1ibG9ja2luZyBGSUZPLgorICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlYWR5KCk7CisgICAgICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgeworICAgICAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCisgICAgICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOworICAgICAgICAgICAgICAgIHN0cmNweSh0cmFjZU5hbWUsICJmUmR5Iik7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gaSArIChpIDwgMTAgPyAnMCcgOiAnQScgLSAxMCk7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZSwgZnJhbWVzUmVhZHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJmR1bXBTdGF0ZS0+bVRyYWNrc1tpXTsKKyAgICAgICAgICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBmdER1bXAtPm1VbmRlcnJ1bnM7CisgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5Kys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIG1peGVyLT5kaXNhYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKys7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgbWl4aW5nIHBhcnRpYWwgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKys7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fUEFSVElBTDsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnREdW1wLT5tVW5kZXJydW5zID0gdW5kZXJydW5zOwotICAgICAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgcHRzOwotICAgICAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkKLSAgICAgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcygpIGlzIENQVS1ib3VuZAotICAgICAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gTUlYRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobWl4QnVmZmVyU3RhdGUgPT0gTUlYRUQpIHsKLSAgICAgICAgICAgIG1peEJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKLSAgICAgICAgLy9ib29sIGRpZEZ1bGxXcml0ZSA9IGZhbHNlOyAgICAvLyBkdW1wc3lzIGNvdWxkIGRpc3BsYXkgYSBjb3VudCBvZiBwYXJ0aWFsIHdyaXRlcwotICAgICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6V1JJVEUpICYmIChvdXRwdXRTaW5rICE9IE5VTEwpICYmIChtaXhCdWZmZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgIGlmIChtaXhCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICBtZW1zZXQobWl4QnVmZmVyLCAwLCBmcmFtZUNvdW50ICogRkNDXzIgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgICAgICBtaXhCdWZmZXJTdGF0ZSA9IFpFUk9FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ZWVTaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAodm9pZCkgdGVlU2luay0+d3JpdGUobWl4QnVmZmVyLCBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKLSAgICAgICAgICAgIC8vICAgICAgIGJ1dCB0aGlzIGNvZGUgc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIG5vbi1ibG9ja2luZyBhbmQgYmxvY2tpbmcgc2lua3MKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKLSAgICAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKLSAgICAgICAgICAgIHNzaXplX3QgZnJhbWVzV3JpdHRlbiA9IG91dHB1dFNpbmstPndyaXRlKG1peEJ1ZmZlciwgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICBBVFJBQ0VfRU5EKCk7Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoKHNpemVfdCkgZnJhbWVzV3JpdHRlbiA8PSBmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgIC8vaWYgKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPT0gZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy99CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CisgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwrKzsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7CisgICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAotCi0gICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBvdXRwdXRTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IHRpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkIDw9IHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKKyAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBUbyBiZSBleGFjdGx5IHBlcmlvZGljLCBjb21wdXRlIHRoZSBuZXh0IHNsZWVwIHRpbWUgYmFzZWQgb24gY3VycmVudCB0aW1lLgotICAgICAgICAvLyBUaGlzIGNvZGUgZG9lc24ndCBoYXZlIGxvbmctdGVybSBzdGFiaWxpdHkgd2hlbiB0aGUgc2luayBpcyBub24tYmxvY2tpbmcuCi0gICAgICAgIC8vIEZJWE1FIFRvIGF2b2lkIGRyaWZ0LCB1c2UgdGhlIGxvY2FsIGF1ZGlvIGNsb2NrIG9yIHdhdGNoIHRoZSBzaW5rJ3MgZmlsbCBzdGF0dXMuCi0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdUczsKLSAgICAgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZuZXdUcyk7Ci0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAvL2xvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKLSAgICAgICAgICAgIGlmIChvbGRUc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgdGltZV90IHNlYyA9IG5ld1RzLnR2X3NlYyAtIG9sZFRzLnR2X3NlYzsKLSAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gb2xkVHMudHZfbnNlYzsKLSAgICAgICAgICAgICAgICBBTE9HRV9JRihzZWMgPCAwIHx8IChzZWMgPT0gMCAmJiBuc2VjIDwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGZhaWxlZDogd2FzICVsZC4lMDlsZCBidXQgbm93ICVsZC4lMDlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbGRUcy50dl9zZWMsIG9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tc2VjOwotICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGFuIGluaXRpYWwgdW5kZXJydW4gb24gZmFzdCB0cmFja3MgYWZ0ZXIgZXhpdGluZyBzdGFuZGJ5LAotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzdGFydCBwdWxsaW5nIGRhdGEgZnJvbSB0cmFja3MgYW5kIG1peGluZyB1bnRpbCB3YXJtdXAgaXMgY29tcGxldGUuCi0gICAgICAgICAgICAgICAgLy8gV2FybXVwIGlzIGNvbnNpZGVyZWQgY29tcGxldGUgYWZ0ZXIgdGhlIGVhcmxpZXIgb2Y6Ci0gICAgICAgICAgICAgICAgLy8gICAgICBNSU5fV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzIGFuZCBsYXN0IG9uZSBibG9ja3MgZm9yIGF0IGxlYXN0IHdhcm11cE5zCi0gICAgICAgICAgICAgICAgLy8gICAgICBNQVhfV0FSTVVQX0NZQ0xFUyB3cml0ZSgpIGF0dGVtcHRzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb3Zlcmx5IGNvbnNlcnZhdGl2ZSwgYnV0IHRvIGdldCBiZXR0ZXIgYWNjdXJhY3kgcmVxdWlyZXMgYSBuZXcgSEFMIEFQSS4KLSAgICAgICAgICAgICAgICBpZiAoIWlzV2FybSAmJiBhdHRlbXB0ZWRXcml0ZSkgewotICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYyArPSBzZWM7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID49IDEwMDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3dhcm11cEN5Y2xlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuc2VjID4gd2FybXVwTnMgJiYgd2FybXVwQ3ljbGVzID49IE1JTl9XQVJNVVBfQ1lDTEVTKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1lYXN1cmVkV2FybXVwVHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSB3YXJtdXBDeWNsZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlYyA+IDAgfHwgbnNlYyA+IHVuZGVycnVuTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgb3ZlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlTmV4dE92ZXJydW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHdvcmtzIHdpdGggYSB2YXJpYWJsZSBidWZmZXIgZGVwdGggYXVkaW8gSEFMIHRoYXQgbmV2ZXIgcHVsbHMgYXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gb3ZlcnJ1bk5zIHBlciBidWZmZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSByZWNvdmVycyBmcm9tIG92ZXJydW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdW5kZXJydW4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGEgbm9uLWJsb2NraW5nIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBmb3JjZU5zIC0gbnNlYzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgICAgICAgICAgaWYgKGlzV2FybSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHRoZSBGSUZPIHF1ZXVlIGJvdW5kcwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRzID0gKGJvdW5kcyAmIDB4RkZGRjAwMDApIHwgKChib3VuZHMgKyAxKSAmIDB4RkZGRik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHMgKz0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGJvdW5kcyAmIChkdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGRlbHRhIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb25vdG9uaWNOcyA9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbm90b25pY05zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSByYXcgQ1BVIGxvYWQgPSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsb2FkTnMgPSAwOwotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3TG9hZDsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmbmV3TG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTG9hZFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBvbGRMb2FkLnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gb2xkTG9hZC50dl9uc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLXNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkTnMgPSBuc2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwICYmIHNlYyA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zICs9IHNlYyAqIDEwMDAwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZCA9IG5ld0xvYWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegotICAgICAgICAgICAgICAgICAgICBpbnQgY3B1TnVtID0gc2NoZWRfZ2V0Y3B1KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IHRjdS5nZXRDcHVrSHooY3B1TnVtKTsKLSAgICAgICAgICAgICAgICAgICAga0h6ID0gKGtIeiA8PCA0KSB8IChjcHVOdW0gJiAweEYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGluIEZJRk8gcXVldWVzIGZvciBkdW1wc3lzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzdG9yZSAjNCBpcyBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBzdG9yZXMgIzEsICMyLCAjMyBhYm92ZSwgYnV0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXdlc3Qgb3BlbiAmIG9sZGVzdCBjbG9zZWQgaGFsdmVzIGFyZSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQm91bmRzID0gYm91bmRzOwotICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJjeWNsZV9tcyIsIG1vbm90b25pY05zIC8gMTAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImxvYWRfdXMiLCBsb2FkTnMgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOwotICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9sZFRzID0gbmV3VHM7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMIHx8IChPSyAhPSBvdXRwdXRTaW5rLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoJnB0cykpKSB7CisgICAgICAgICAgICBwdHMgPSBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MoKSBpcyBDUFUtYm91bmQKKyAgICAgICAgbWl4ZXItPnByb2Nlc3MocHRzKTsKKyAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBNSVhFRDsKKyAgICB9IGVsc2UgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IE1JWEVEKSB7CisgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOworICAgIH0KKyAgICAvL2Jvb2wgZGlkRnVsbFdyaXRlID0gZmFsc2U7ICAgIC8vIGR1bXBzeXMgY291bGQgZGlzcGxheSBhIGNvdW50IG9mIHBhcnRpYWwgd3JpdGVzCisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobU1peGVyQnVmZmVyICE9IE5VTEwpKSB7CisgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJTdGF0ZSA9PSBVTkRFRklORUQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBaRVJPRUQ7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOworICAgICAgICBpZiAoZm9ybWF0Lm1Gb3JtYXQgIT0gbU1peGVyQnVmZmVyRm9ybWF0KSB7IC8vIHNpbmsgZm9ybWF0IG5vdCB0aGUgc2FtZSBhcyBtaXhlciBmb3JtYXQKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKKyAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKKyAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIHdyaXRlKCkgaXMgbm9uLWJsb2NraW5nIGFuZCBsb2NrLWZyZWUgZm9yIGEgcHJvcGVybHkgaW1wbGVtZW50ZWQgTkJBSU8gc2luaywKKyAgICAgICAgLy8gICAgICAgYnV0IHRoaXMgY29kZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggbm9uLWJsb2NraW5nIGFuZCBibG9ja2luZyBzaW5rcworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gb3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7CisgICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICAvL2lmICgoc2l6ZV90KSBmcmFtZXNXcml0dGVuID09IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vICAgIGRpZEZ1bGxXcml0ZSA9IHRydWU7CisgICAgICAgICAgICAvL30KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1vbm90b25pYyBjbG9jayBpcyBicm9rZW4KLSAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlRXJyb3JzKys7CiAgICAgICAgIH0KKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSB0cnVlOworICAgICAgICAvLyBGSVhNRSBjb3VudCAjIG9mIHdyaXRlcyBibG9ja2VkIGV4Y2Vzc2l2ZWx5LCBDUFUgdXNhZ2UsIGV0Yy4gZm9yIGR1bXAKIAotCi0gICAgfSAgIC8vIGZvciAoOzspCi0KLSAgICAvLyBuZXZlciByZXR1cm4gJ3RydWUnOyBUaHJlYWQ6Ol90aHJlYWRMb29wKCkgbG9ja3MgbXV0ZXggd2hpY2ggY2FuIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KKyAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gb3V0cHV0U2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gdGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCisgICAgICAgICAgICAgICAgdGltZXN0YW1wU3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIEZhc3RNaXhlckR1bXBTdGF0ZTo6RmFzdE1peGVyRHVtcFN0YXRlKAogI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04KICNlbmRpZgotICAgICAgICApIDoKLSAgICBtQ29tbWFuZChGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCksIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKLSAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksIG1VbmRlcnJ1bnMoMCksIG1PdmVycnVucygwKSwKLSAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovIG1XYXJtdXBDeWNsZXMoMCksCisgICAgICAgICkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAorICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwKKyAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksCiAgICAgbVRyYWNrTWFzaygwKQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICwgbVNhbXBsaW5nTigwKSwgbUJvdW5kcygwKQotI2VuZGlmCiB7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKICNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKICAgICBpbmNyZWFzZVNhbXBsaW5nTihzYW1wbGluZ04pOwogI2VuZGlmCkBAIC03MTQsNyArNTEwLDcgQEAKIHZvaWQgRmFzdE1peGVyRHVtcFN0YXRlOjpkdW1wKGludCBmZCkgY29uc3QKIHsKICAgICBpZiAobUNvbW1hbmQgPT0gRmFzdE1peGVyU3RhdGU6OklOSVRJQUwpIHsKLSAgICAgICAgZmRwcmludGYoZmQsICJGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgRmFzdE1peGVyIG5vdCBpbml0aWFsaXplZFxuIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZGVmaW5lIENPTU1BTkRfTUFYIDMyCkBAIC03NDgsMTAgKzU0NCwxMCBAQAogICAgIGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDEwMDAuMCkgKwogICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLyAxMDAwMDAwLjApOwogICAgIGRvdWJsZSBtaXhQZXJpb2RTZWMgPSAoZG91YmxlKSBtRnJhbWVDb3VudCAvIChkb3VibGUpIG1TYW1wbGVSYXRlOwotICAgIGZkcHJpbnRmKGZkLCAiRmFzdE1peGVyIGNvbW1hbmQ9JXMgd3JpdGVTZXF1ZW5jZT0ldSBmcmFtZXNXcml0dGVuPSV1XG4iCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgotICAgICAgICAgICAgICAgICAiICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0ldSBtZWFzdXJlZFdhcm11cD0lLjNnIG1zLCB3YXJtdXBDeWNsZXM9JXVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKICAgICAgICAgICAgICAgICAgc3RyaW5nLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAogICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCkBAIC04MDIsMjEgKzU5OCwyNyBAQAogICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKICNlbmRpZgogICAgIH0KLSAgICBmZHByaW50ZihmZCwgIlNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOwotICAgIGZkcHJpbnRmKGZkLCAiICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgIHdhbGwubWVhbigpKjFlLTYsIHdhbGwubWluaW11bSgpKjFlLTYsIHdhbGwubWF4aW11bSgpKjFlLTYsIHdhbGwuc3RkZGV2KCkqMWUtNik7Ci0gICAgZmRwcmludGYoZmQsICIgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIGlmIChuKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAorICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAorICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7CisgICAgfQogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIGZkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKLSAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCi0gICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKLSAgICBmZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgotICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKLSAgICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBNSHo6XG4iCisgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMGYgbWluPSUuMGYgbWF4PSUuMGYgc3RkZGV2PSUuMGZcbiIsCisgICAgICAgICAgICAgICAga0h6Lm1lYW4oKSoxZS0zLCBrSHoubWluaW11bSgpKjFlLTMsIGtIei5tYXhpbXVtKCkqMWUtMywga0h6LnN0ZGRldigpKjFlLTMpOworICAgIGRwcmludGYoZmQsICIgIGFkanVzdGVkIENQVSBsb2FkIGluIE1IeiAoaS5lLiBub3JtYWxpemVkIGZvciBDUFUgY2xvY2sgZnJlcXVlbmN5KTpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4xZiBtaW49JS4xZiBtYXg9JS4xZiBzdGRkZXY9JS4xZlxuIiwKKyAgICAgICAgICAgICAgICBsb2FkTUh6Lm1lYW4oKSwgbG9hZE1Iei5taW5pbXVtKCksIGxvYWRNSHoubWF4aW11bSgpLCBsb2FkTUh6LnN0ZGRldigpKTsKICNlbmRpZgogICAgIGlmICh0YWlsICE9IE5VTEwpIHsKICAgICAgICAgcXNvcnQodGFpbCwgbiwgc2l6ZW9mKHVpbnQzMl90KSwgY29tcGFyZV91aW50MzJfdCk7CkBAIC04MjcsMTIgKzYyOSwxMiBAQAogICAgICAgICAgICAgbGVmdC5zYW1wbGUodGFpbFtpXSk7CiAgICAgICAgICAgICByaWdodC5zYW1wbGUodGFpbFtuIC0gKGkgKyAxKV0pOwogICAgICAgICB9Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICg+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCi0gICAgICAgICAgICAgICAgICAgICAiICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAgIiAgcmlnaHQgdGFpbDogbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAotICAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnN0ZGRldigpKjFlLTYpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKQEAgLTg0Miw5ICs2NDQsOSBAQAogICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCiAgICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgogICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0IHRyYWNrczoga01heEZhc3RUcmFja3M9JXUgYWN0aXZlTWFzaz0lI3hcbiIsCisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzLCB0cmFja01hc2spOwotICAgIGZkcHJpbnRmKGZkLCAiSW5kZXggQWN0aXZlIEZ1bGwgUGFydGlhbCBFbXB0eSAgUmVjZW50IFJlYWR5XG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbmRleCBBY3RpdmUgRnVsbCBQYXJ0aWFsIEVtcHR5ICBSZWNlbnQgUmVhZHlcbiIpOwogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSwgdHJhY2tNYXNrID4+PSAxKSB7CiAgICAgICAgIGJvb2wgaXNBY3RpdmUgPSB0cmFja01hc2sgJiAxOwogICAgICAgICBjb25zdCBGYXN0VHJhY2tEdW1wICpmdER1bXAgPSAmbVRyYWNrc1tpXTsKQEAgLTg2NCw3ICs2NjYsNyBAQAogICAgICAgICAgICAgbW9zdFJlY2VudCA9ICI/IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCiAgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCmluZGV4IDYxNTg5MjUuLmZkZThjMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKQEAgLTE3LDEyNCArMTcsNzQgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgorI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKICNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgIi4uL3ByaXZhdGUvYmlvbmljX2Z1dGV4LmgiCi19CiAjaW5jbHVkZSAiU3RhdGVRdWV1ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgQXVkaW9NaXhlcjsKKwogdHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RNaXhlclN0YXRlPiBGYXN0TWl4ZXJTdGF0ZVF1ZXVlOwogCi1jbGFzcyBGYXN0TWl4ZXIgOiBwdWJsaWMgVGhyZWFkIHsKK2NsYXNzIEZhc3RNaXhlciA6IHB1YmxpYyBGYXN0VGhyZWFkIHsKIAogcHVibGljOgotICAgICAgICAgICAgRmFzdE1peGVyKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSB7IH0KLSAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKSB7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlcigpOworICAgIHZpcnR1YWwgfkZhc3RNaXhlcigpOwogCi0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlKiBzcSgpIHsgcmV0dXJuICZtU1E7IH0KKyAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUqIHNxKCk7CiAKIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgIHRocmVhZExvb3AoKTsKICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgbVNROwogCisgICAgLy8gY2FsbG91dHMKKyAgICB2aXJ0dWFsIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcG9sbCgpOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25JZGxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpOworICAgIHZpcnR1YWwgYm9vbCBpc1N1YkNsYXNzQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OkNvbW1hbmQgY29tbWFuZCk7CisgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CisKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMgYW5kIHRvIGJlIHJlbmFtZWQgdG8gaGF2ZSAibSIgcHJlZml4CisgICAgc3RhdGljIGNvbnN0IEZhc3RNaXhlclN0YXRlIGluaXRpYWw7CisgICAgRmFzdE1peGVyU3RhdGUgcHJlSWRsZTsgLy8gY29weSBvZiBzdGF0ZSBiZWZvcmUgd2Ugd2VudCBpbnRvIGlkbGUKKyAgICBsb25nIHNsb3BOczsgICAgICAgIC8vIGFjY3VtdWxhdGVkIHRpbWUgd2UndmUgd29rZW4gdXAgdG9vIGVhcmx5ICg+IDApIG9yIHRvbyBsYXRlICg8IDApCisgICAgaW50IGZhc3RUcmFja05hbWVzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107IC8vIGhhbmRsZXMgdXNlZCBieSBtaXhlciB0byBpZGVudGlmeSB0cmFja3MKKyAgICBpbnQgZ2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIE5CQUlPX1NpbmsgKm91dHB1dFNpbms7CisgICAgaW50IG91dHB1dFNpbmtHZW47CisgICAgQXVkaW9NaXhlciogbWl4ZXI7CisKKyAgICAvLyBtU2lua0J1ZmZlciBhdWRpbyBmb3JtYXQgaXMgc3RvcmVkIGluIGZvcm1hdC5tRm9ybWF0LgorICAgIHZvaWQqIG1TaW5rQnVmZmVyOyAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzaW5rIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiBtaXhlciBvdXRwdXQuCisgICAgc2l6ZV90IG1TaW5rQnVmZmVyU2l6ZTsKKyAgICB1aW50MzJfdCBtU2lua0NoYW5uZWxDb3VudDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOworICAgIHZvaWQqIG1NaXhlckJ1ZmZlcjsgICAgICAgICAgICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCisgICAgc2l6ZV90IG1NaXhlckJ1ZmZlclNpemU7CisgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyQnVmZmVyRm9ybWF0OyAgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKworICAgIGVudW0ge1VOREVGSU5FRCwgTUlYRUQsIFpFUk9FRH0gbU1peGVyQnVmZmVyU3RhdGU7CisgICAgTkJBSU9fRm9ybWF0IGZvcm1hdDsKKyAgICB1bnNpZ25lZCBzYW1wbGVSYXRlOworICAgIGludCBmYXN0VHJhY2tzR2VuOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKKyAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgorCisgICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgorICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKKyAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKLS8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAotZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7Ci0gICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCi0gICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KLSAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KLX07Ci0KLS8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCi0vLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KLXVuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKLSAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KLSAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQotICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQotICAgIHN0cnVjdCB7Ci0jZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKLSNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQotICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAotICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybwotICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCi0gICAgfSAgICAgICAgbUJpdEZpZWxkczsKLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUF0b21pYzsKLX07Ci0KLS8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCi1zdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7Ci0gICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQotICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9Ci0gICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7Ci0gICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKLX07Ci0KLS8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KLS8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQotLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KLS8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgotLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgotLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KLXN0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgewotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSgKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTiA9IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UKLSNlbmRpZgotICAgICAgICAgICAgKTsKLSAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyRHVtcFN0YXRlKCk7Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKLQotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAotICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQotICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5Ci0gICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKLSAgICB1aW50MzJfdCBtV3JpdGVFcnJvcnM7ICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHdyaXRlKCkgZXJyb3JzCi0gICAgdWludDMyX3QgbVVuZGVycnVuczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB1bmRlcnJ1bnMKLSAgICB1aW50MzJfdCBtT3ZlcnJ1bnM7ICAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIG92ZXJydW5zCi0gICAgdWludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gbWVhc3VyZWQgd2FybXVwIHRpbWUKLSAgICB1aW50MzJfdCBtV2FybXVwQ3ljbGVzOyAgICAgLy8gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHJlcXVpcmVkIHRvIHdhcm11cAotICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKLSAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOwotCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgotICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgotICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAotICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKLSAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOwotICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdOOwotICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6Ci0gICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgotICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KLSAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegotICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KLSAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKLSAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCi0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCi0jZW5kaWYKLSAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCi0gICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOwotI2VuZGlmCi19OwotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfTUlYRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMWU0NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIERlc2NyaWJlcyB0aGUgdW5kZXJydW4gc3RhdHVzIGZvciBhIHNpbmdsZSAicHVsbCIgYXR0ZW1wdAorZW51bSBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyB7CisgICAgVU5ERVJSVU5fRlVMTCwgICAgICAvLyBmcmFtZXNSZWFkeSgpIGlzIGZ1bGwgZnJhbWUgY291bnQsIG5vIHVuZGVycnVuCisgICAgVU5ERVJSVU5fUEFSVElBTCwgICAvLyBmcmFtZXNSZWFkeSgpIGlzIG5vbi16ZXJvIGJ1dCA8IGZ1bGwgZnJhbWUgY291bnQsIHBhcnRpYWwgdW5kZXJydW4KKyAgICBVTkRFUlJVTl9FTVBUWSwgICAgIC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybywgdG90YWwgdW5kZXJydW4KK307CisKKy8vIFVuZGVycnVuIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgdG8gemVybyBmb3IgbmV3IHRyYWNrcyBvciBpZiB0cmFjayBnZW5lcmF0aW9uIGNoYW5nZXMuCisvLyBUaGlzIHBhY2tlZCByZXByZXNlbnRhdGlvbiBpcyB1c2VkIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIGF0b21pYy4KK3VuaW9uIEZhc3RUcmFja1VuZGVycnVucyB7CisgICAgRmFzdFRyYWNrVW5kZXJydW5zKCkgeyBtQXRvbWljID0gMDsKKyAgICAgICAgICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoc2l6ZW9mKEZhc3RUcmFja1VuZGVycnVucykgPT0gc2l6ZW9mKHVpbnQzMl90KSk7IH0KKyAgICBGYXN0VHJhY2tVbmRlcnJ1bnMoY29uc3QgRmFzdFRyYWNrVW5kZXJydW5zJiBjb3B5RnJvbSkgOiBtQXRvbWljKGNvcHlGcm9tLm1BdG9taWMpIHsgfQorICAgIEZhc3RUcmFja1VuZGVycnVucyYgb3BlcmF0b3I9KGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgcmhzKQorICAgICAgICAgICAgeyBpZiAodGhpcyAhPSAmcmhzKSBtQXRvbWljID0gcmhzLm1BdG9taWM7IHJldHVybiAqdGhpczsgfQorICAgIHN0cnVjdCB7CisjZGVmaW5lIFVOREVSUlVOX0JJVFMgMTAKKyNkZWZpbmUgVU5ERVJSVU5fTUFTSyAoKDEgPDwgVU5ERVJSVU5fQklUUykgLSAxKQorICAgICAgICB1aW50MzJfdCBtRnVsbCAgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtUGFydGlhbCA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgbm9uLXplcm8gYnV0IDwgZnVsbCBmcmFtZSBjb3VudAorICAgICAgICB1aW50MzJfdCBtRW1wdHkgICA6IFVOREVSUlVOX0JJVFM7IC8vIGZyYW1lc1JlYWR5KCkgaXMgemVybworICAgICAgICBGYXN0VHJhY2tVbmRlcnJ1blN0YXR1cyBtTW9zdFJlY2VudCA6IDI7ICAgIC8vIHN0YXR1cyBvZiBtb3N0IHJlY2VudCBmcmFtZXNSZWFkeSgpCisgICAgfSAgICAgICAgbUJpdEZpZWxkczsKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUF0b21pYzsKK307CisKKy8vIFJlcHJlc2VudHMgdGhlIGR1bXAgc3RhdGUgb2YgYSBmYXN0IHRyYWNrCitzdHJ1Y3QgRmFzdFRyYWNrRHVtcCB7CisgICAgRmFzdFRyYWNrRHVtcCgpIDogbUZyYW1lc1JlYWR5KDApIHsgfQorICAgIC8qdmlydHVhbCovIH5GYXN0VHJhY2tEdW1wKCkgeyB9CisgICAgRmFzdFRyYWNrVW5kZXJydW5zIG1VbmRlcnJ1bnM7CisgICAgc2l6ZV90IG1GcmFtZXNSZWFkeTsgICAgICAgIC8vIG1vc3QgcmVjZW50IHZhbHVlIG9ubHk7IG5vIGxvbmctdGVybSBzdGF0aXN0aWNzIGtlcHQKK307CisKKy8vIFRoZSBGYXN0TWl4ZXJEdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0TWl4ZXIgc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBsb2dnZWQgYnkgZHVtcHN5cy4KKy8vIEVhY2ggaW5kaXZpZHVhbCBuYXRpdmUgd29yZC1zaXplZCBmaWVsZCBpcyBhY2Nlc3NlZCBhdG9taWNhbGx5LiAgQnV0IHRoZQorLy8gb3ZlcmFsbCBzdHJ1Y3R1cmUgaXMgbm9uLWF0b21pYywgdGhhdCBpcyB0aGVyZSBtYXkgYmUgYW4gaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGZpZWxkcy4KKy8vIE5vIGJhcnJpZXJzIG9yIGxvY2tzIGFyZSB1c2VkIGZvciBlaXRoZXIgd3JpdGluZyBvciByZWFkaW5nLgorLy8gT25seSBQT0QgdHlwZXMgYXJlIHBlcm1pdHRlZCwgYW5kIHRoZSBjb250ZW50cyBzaG91bGRuJ3QgYmUgdHJ1c3RlZCAoaS5lLiBkbyByYW5nZSBjaGVja3MpLgorLy8gSXQgaGFzIGEgZGlmZmVyZW50IGxpZmV0aW1lIHRoYW4gdGhlIEZhc3RNaXhlciwgYW5kIHNvIGl0IGNhbid0IGJlIGEgbWVtYmVyIG9mIEZhc3RNaXhlci4KK3N0cnVjdCBGYXN0TWl4ZXJEdW1wU3RhdGUgOiBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ04gPSBrU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlCisjZW5kaWYKKyAgICAgICAgICAgICk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RNaXhlckR1bXBTdGF0ZSgpOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCisKKyAgICB1aW50MzJfdCBtV3JpdGVTZXF1ZW5jZTsgICAgLy8gaW5jcmVtZW50ZWQgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHdyaXRlKCkKKyAgICB1aW50MzJfdCBtRnJhbWVzV3JpdHRlbjsgICAgLy8gdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB3cml0dGVuIHN1Y2Nlc3NmdWxseQorICAgIHVpbnQzMl90IG1OdW1UcmFja3M7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIGZhc3QgdHJhY2tzCisgICAgdWludDMyX3QgbVdyaXRlRXJyb3JzOyAgICAgIC8vIHRvdGFsIG51bWJlciBvZiB3cml0ZSgpIGVycm9ycworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHNpemVfdCAgIG1GcmFtZUNvdW50OworICAgIHVpbnQzMl90IG1UcmFja01hc2s7ICAgICAgICAvLyBtYXNrIG9mIGFjdGl2ZSB0cmFja3MKKyAgICBGYXN0VHJhY2tEdW1wICAgbVRyYWNrc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOworCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLy8gQ29tcGlsZS10aW1lIGNvbnN0YW50IGZvciBhICJsb3cgUkFNIGRldmljZSIsIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04uCisgICAgLy8gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBlYWNoIGFycmF5IHVzZXMgMSBzbWFsbCBwYWdlICg0IEtieXRlcykuCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgPSAweDQwMDsKKyAgICAvLyBJbmNyZWFzZSBzYW1wbGluZyB3aW5kb3cgYWZ0ZXIgY29uc3RydWN0aW9uLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOCisgICAgdm9pZCAgICBpbmNyZWFzZVNhbXBsaW5nTih1aW50MzJfdCBzYW1wbGluZ04pOworI2VuZGlmCit9OworCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCmluZGV4IDczN2RlOTcuLjNhYThkYWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcApAQCAtMTQsMTQgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRmFzdFRyYWNrOjpGYXN0VHJhY2soKSA6Ci0gICAgbUJ1ZmZlclByb3ZpZGVyKE5VTEwpLCBtVm9sdW1lUHJvdmlkZXIoTlVMTCksIG1TYW1wbGVSYXRlKDApLAotICAgIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLCBtR2VuZXJhdGlvbigwKQorICAgIG1CdWZmZXJQcm92aWRlcihOVUxMKSwgbVZvbHVtZVByb3ZpZGVyKE5VTEwpLAorICAgIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLCBtRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwgbUdlbmVyYXRpb24oMCkKIHsKIH0KIApAQCAtMjksMTAgKzI4LDEwIEBACiB7CiB9CiAKLUZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDoKK0Zhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCisgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtQ29tbWFuZChJTklUSUFMKSwgbUNvbGRGdXRleEFkZHIoTlVMTCksIG1Db2xkR2VuKDApLAotICAgIG1EdW1wU3RhdGUoTlVMTCksIG1UZWVTaW5rKE5VTEwpLCBtTkJMb2dXcml0ZXIoTlVMTCkKKyAgICBtRnJhbWVDb3VudCgwKSwgbVRlZVNpbmsoTlVMTCkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAppbmRleCBmNmU3OTAzLi42NjFjOWNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaApAQCAtMTcsMTAgKzE3LDEyIEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9TVEFURV9ICiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsOSArMzAsOCBAQAogCiBjbGFzcyBWb2x1bWVQcm92aWRlciB7CiBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSB0cmFjayB2b2x1bWUgaW4gVTRfMTIgZm9ybWF0OiBsZWZ0IGluIGxvd2VyIGhhbGYsIHJpZ2h0IGluIHVwcGVyIGhhbGYuIFRoZQotICAgIC8vIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiByYW5nZS4KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFZvbHVtZUxSKCkgPSAwOworICAgIC8vIFRoZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZyB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gcmFuZ2UuCisgICAgdmlydHVhbCBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBnZXRWb2x1bWVMUigpID0gMDsKIHByb3RlY3RlZDoKICAgICBWb2x1bWVQcm92aWRlcigpIHsgfQogICAgIHZpcnR1YWwgflZvbHVtZVByb3ZpZGVyKCkgeyB9CkBAIC00MywxMyArNDQsMTMgQEAKIAogICAgIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciogbUJ1ZmZlclByb3ZpZGVyOyAvLyBtdXN0IGJlIE5VTEwgaWYgaW5hY3RpdmUsIG9yIG5vbi1OVUxMIGlmIGFjdGl2ZQogICAgIFZvbHVtZVByb3ZpZGVyKiAgICAgICAgIG1Wb2x1bWVQcm92aWRlcjsgLy8gb3B0aW9uYWw7IGlmIE5VTEwgdGhlbiBmdWxsLXNjYWxlCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGU7ICAgICAvLyBvcHRpb25hbDsgaWYgemVybyB0aGVuIHVzZSBtaXhlciBzYW1wbGUgcmF0ZQogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgIG1DaGFubmVsTWFzazsgICAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBvciBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgIC8vIHRyYWNrIGZvcm1hdAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uOyAgICAgLy8gaW5jcmVtZW50IHdoZW4gYW55IGZpZWxkIGlzIGFzc2lnbmVkCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCi1zdHJ1Y3QgRmFzdE1peGVyU3RhdGUgeworc3RydWN0IEZhc3RNaXhlclN0YXRlIDogRmFzdFRocmVhZFN0YXRlIHsKICAgICAgICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZSgpOwogICAgIC8qdmlydHVhbCovIH5GYXN0TWl4ZXJTdGF0ZSgpOwogCkBAIC02MiwyMyArNjMsMTYgQEAKICAgICBOQkFJT19TaW5rKiBtT3V0cHV0U2luazsgICAgLy8gSEFMIG91dHB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgaW50ICAgICAgICAgbU91dHB1dFNpbmtHZW47IC8vIGluY3JlbWVudCB3aGVuIG1PdXRwdXRTaW5rIGlzIGFzc2lnbmVkCiAgICAgc2l6ZV90ICAgICAgbUZyYW1lQ291bnQ7ICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIGZhc3QgbWl4IGJ1ZmZlcgotICAgIGVudW0gQ29tbWFuZCB7Ci0gICAgICAgIElOSVRJQUwgPSAwLCAgICAgICAgICAgIC8vIHVzZWQgb25seSBmb3IgdGhlIGluaXRpYWwgc3RhdGUKLSAgICAgICAgSE9UX0lETEUgPSAxLCAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICBDT0xEX0lETEUgPSAyLCAgICAgICAgICAvLyB3YWl0IGZvciB0aGUgZnV0ZXgKLSAgICAgICAgSURMRSA9IDMsICAgICAgICAgICAgICAgLy8gZWl0aGVyIEhPVF9JRExFIG9yIENPTERfSURMRQotICAgICAgICBFWElUID0gNCwgICAgICAgICAgICAgICAvLyBleGl0IGZyb20gdGhyZWFkCisKKyAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAorICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CiAgICAgICAgIE1JWCA9IDB4OCwgICAgICAgICAgICAgIC8vIG1peCB0cmFja3MKICAgICAgICAgV1JJVEUgPSAweDEwLCAgICAgICAgICAgLy8gd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICAgICAgTUlYX1dSSVRFID0gMHgxOCwgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKLSAgICB9IG1Db21tYW5kOwotICAgIGludDMyX3QqICAgIG1Db2xkRnV0ZXhBZGRyOyAvLyBmb3IgQ09MRF9JRExFIG9ubHksIHBvaW50ZXIgdG8gdGhlIGFzc29jaWF0ZWQgZnV0ZXgKLSAgICB1bnNpZ25lZCAgICBtQ29sZEdlbjsgICAgICAgLy8gaW5jcmVtZW50IHdoZW4gQ09MRF9JRExFIGlzIHJlcXVlc3RlZCBzbyBpdCdzIG9ubHkgcGVyZm9ybWVkIG9uY2UKKyAgICAgICAgTUlYX1dSSVRFID0gMHgxODsgICAgICAgLy8gbWl4IHRyYWNrcyBhbmQgd3JpdGUgdG8gb3V0cHV0IHNpbmsKKwogICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CiAgICAgTkJBSU9fU2luayogbVRlZVNpbms7ICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpcyB0byB0aGlzIG5vbi1ibG9ja2luZyBzaW5rCi0gICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCiB9OyAgLy8gc3RydWN0IEZhc3RNaXhlclN0YXRlCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNmRhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RUaHJlYWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0FVRElPCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgorCisjZGVmaW5lIEZBU1RfREVGQVVMVF9OUyAgICA5OTk5OTk5OTlMICAgLy8gfjEgc2VjOiBkZWZhdWx0IHRpbWUgdG8gc2xlZXAKKyNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKKyNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKyNkZWZpbmUgTUFYX1dBUk1VUF9DWUNMRVMgICAgICAgICAxMCAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0VGhyZWFkOjpGYXN0VGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKKyAgICAvLyByZS1pbml0aWFsaXplZCB0byAmaW5pdGlhbCBieSBzdWJjbGFzcyBjb25zdHJ1Y3RvcgorICAgICBwcmV2aW91cyhOVUxMKSwgY3VycmVudChOVUxMKSwKKyAgICAvKiBvbGRUcyh7MCwgMH0pLCAqLworICAgIG9sZFRzVmFsaWQoZmFsc2UpLAorICAgIHNsZWVwTnMoLTEpLAorICAgIHBlcmlvZE5zKDApLAorICAgIHVuZGVycnVuTnMoMCksCisgICAgb3ZlcnJ1bk5zKDApLAorICAgIGZvcmNlTnMoMCksCisgICAgd2FybXVwTnMoMCksCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJmR1bW15RHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgICAgbUR1bW15RHVtcFN0YXRlKE5VTEwpLAorICAgIGR1bXBTdGF0ZShOVUxMKSwKKyAgICBpZ25vcmVOZXh0T3ZlcnJ1bih0cnVlKSwKKyNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKKyAgICAvLyBvbGRMb2FkCisgICAgb2xkTG9hZFZhbGlkKGZhbHNlKSwKKyAgICBib3VuZHMoMCksCisgICAgZnVsbChmYWxzZSksCisgICAgLy8gdGN1CisjZW5kaWYKKyAgICBjb2xkR2VuKDApLAorICAgIGlzV2FybShmYWxzZSksCisgICAgLyogbWVhc3VyZWRXYXJtdXBUcyh7MCwgMH0pLCAqLworICAgIHdhcm11cEN5Y2xlcygwKSwKKyAgICAvLyBkdW1teUxvZ1dyaXRlcgorICAgIGxvZ1dyaXRlcigmZHVtbXlMb2dXcml0ZXIpLAorICAgIHRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCisKKyAgICBjb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCisjaWYgMAorICAgIGZyYW1lQ291bnQoMCksCisjZW5kaWYKKyAgICBhdHRlbXB0ZWRXcml0ZShmYWxzZSkKK3sKKyAgICBvbGRUcy50dl9zZWMgPSAwOworICAgIG9sZFRzLnR2X25zZWMgPSAwOworICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkOjp+RmFzdFRocmVhZCgpCit7Cit9CisKK2Jvb2wgRmFzdFRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgZm9yICg7OykgeworCisgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKKyAgICAgICAgaWYgKHNsZWVwTnMgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNsZWVwTnMgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoc2xlZXBOcyA8IDEwMDAwMDAwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgc2xlZXBOc307CisgICAgICAgICAgICAgICAgbmFub3NsZWVwKCZyZXEsIE5VTEwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2hlZF95aWVsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRlZmF1bHQgdG8gbG9uZyBzbGVlcCBmb3IgbmV4dCBjeWNsZQorICAgICAgICBzbGVlcE5zID0gRkFTVF9ERUZBVUxUX05TOworCisgICAgICAgIC8vIHBvbGwgZm9yIHN0YXRlIGNoYW5nZQorICAgICAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKm5leHQgPSBwb2xsKCk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsIHN0YXRlIHVudGlsIGEgcmVhbCBzdGF0ZSBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIC8vIEZJWE1FICZpbml0aWFsIG5vdCBhdmFpbGFibGUsIHNob3VsZCBzYXZlIGFkZHJlc3MgZWFybGllcgorICAgICAgICAgICAgLy9BTE9HX0FTU0VSVChjdXJyZW50ID09ICZpbml0aWFsICYmIHByZXZpb3VzID09ICZpbml0aWFsKTsKKyAgICAgICAgICAgIG5leHQgPSBjdXJyZW50OworICAgICAgICB9CisKKyAgICAgICAgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOworICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisKKyAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAorICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKKyAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOworICAgICAgICAgICAgc2V0TG9nKGxvZ1dyaXRlcik7CisKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCisgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCisgICAgICAgICAgICAvLyBTbyB3aGVuIHRoZXJlIGlzIGEgdHJhbnNpdGlvbiBmcm9tIGEgbm9uLWlkbGUgc3RhdGUgaW50byBhbiBpZGxlIHN0YXRlLCB3ZSBtYWtlIGEKKyAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGxhc3Qga25vd24gbm9uLWlkbGUgc3RhdGUgc28gaXQgaXMgc3RpbGwgYXZhaWxhYmxlIG9uIHJldHVybiBmcm9tIGlkbGUuCisgICAgICAgICAgICAvLyBUaGUgcG9zc2libGUgdHJhbnNpdGlvbnMgYXJlOgorICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IG5vbi1pZGxlICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGN1cnJlbnQgaW4tcGxhY2UKKyAgICAgICAgICAgIC8vICBub24taWRsZSAtPiBpZGxlICAgICAgICB1cGRhdGUgcHJldmlvdXMgZnJvbSBjb3B5IG9mIGN1cnJlbnQKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBpZGxlICAgICAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vICBpZGxlICAgICAtPiBub24taWRsZSAgICBkb24ndCB1cGRhdGUgcHJldmlvdXMKKyAgICAgICAgICAgIGlmICghKGN1cnJlbnQtPm1Db21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICYgRmFzdFRocmVhZFN0YXRlOjpJRExFKSB7CisgICAgICAgICAgICAgICAgICAgIG9uSWRsZSgpOworICAgICAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gZmFsc2U7CisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIG9sZExvYWRWYWxpZCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgIH0KKyNpZiAhTE9HX05ERUJVRworICAgICAgICBuZXh0ID0gTlVMTDsgICAgLy8gbm90IHJlZmVyZW5jZWQgYWdhaW4KKyNlbmRpZgorCisgICAgICAgIGR1bXBTdGF0ZS0+bUNvbW1hbmQgPSBjb21tYW5kOworCisgICAgICAgIC8vIDw8IGN1cnJlbnQsIHByZXZpb3VzLCBjb21tYW5kLCBkdW1wU3RhdGUgPj4KKworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpIT1RfSURMRToKKyAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpDT0xEX0lETEU6CisgICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCisgICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7CisgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoY29sZEZ1dGV4QWRkciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2RlYyhjb2xkRnV0ZXhBZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCBjb2xkRnV0ZXhBZGRyLCBGVVRFWF9XQUlUX1BSSVZBVEUsIG9sZCAtIDEsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgcG9saWN5ID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOworICAgICAgICAgICAgICAgIGlmICghKHBvbGljeSA9PSBTQ0hFRF9GSUZPIHx8IHBvbGljeSA9PSBTQ0hFRF9SUikpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBvdmVybHkgY29uc2VydmF0aXZlOyB0aGVyZSBjb3VsZCBiZSB0aW1lcyB0aGF0IHRoZSBub3JtYWwgbWl4ZXIKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0cyBzdWNoIGEgYnJpZWYgY29sZCBpZGxlIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIHJlc2V0dGluZyB0aGlzIGZsYWcuCisgICAgICAgICAgICAgICAgaXNXYXJtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisgICAgICAgICAgICAgICAgd2FybXVwQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICBzbGVlcE5zID0gLTE7CisgICAgICAgICAgICAgICAgY29sZEdlbiA9IGN1cnJlbnQtPm1Db2xkR2VuOworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGJvdW5kcyA9IDA7CisgICAgICAgICAgICAgICAgZnVsbCA9IGZhbHNlOworI2VuZGlmCisgICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6CisgICAgICAgICAgICBvbkV4aXQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzU3ViQ2xhc3NDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBub24taWRsZSBzdGF0ZSBhdmFpbGFibGUgdG8gdXM7IGRpZCB0aGUgc3RhdGUgY2hhbmdlPworICAgICAgICBpZiAoY3VycmVudCAhPSBwcmV2aW91cykgeworICAgICAgICAgICAgb25TdGF0ZUNoYW5nZSgpOworI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCisgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKKyAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gd29yayB1c2luZyBjdXJyZW50IHN0YXRlIGhlcmUKKyAgICAgICAgYXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgb25Xb3JrKCk7CisKKyAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KKyAgICAgICAgLy8gVGhpcyBjb2RlIGRvZXNuJ3QgaGF2ZSBsb25nLXRlcm0gc3RhYmlsaXR5IHdoZW4gdGhlIHNpbmsgaXMgbm9uLWJsb2NraW5nLgorICAgICAgICAvLyBGSVhNRSBUbyBhdm9pZCBkcmlmdCwgdXNlIHRoZSBsb2NhbCBhdWRpbyBjbG9jayBvciB3YXRjaCB0aGUgc2luaydzIGZpbGwgc3RhdHVzLgorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3VHM7CisgICAgICAgIGludCByYyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbmV3VHMpOworICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgLy9sb2dXcml0ZXItPmxvZ1RpbWVzdGFtcChuZXdUcyk7CisgICAgICAgICAgICBpZiAob2xkVHNWYWxpZCkgeworICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBvbGRUcy50dl9zZWM7CisgICAgICAgICAgICAgICAgbG9uZyBuc2VjID0gbmV3VHMudHZfbnNlYyAtIG9sZFRzLnR2X25zZWM7CisgICAgICAgICAgICAgICAgQUxPR0VfSUYoc2VjIDwgMCB8fCAoc2VjID09IDAgJiYgbnNlYyA8IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKSBmYWlsZWQ6IHdhcyAlbGQuJTA5bGQgYnV0IG5vdyAlbGQuJTA5bGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb2xkVHMudHZfc2VjLCBvbGRUcy50dl9uc2VjLCBuZXdUcy50dl9zZWMsIG5ld1RzLnR2X25zZWMpOworICAgICAgICAgICAgICAgIGlmIChuc2VjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAtLXNlYzsKKyAgICAgICAgICAgICAgICAgICAgbnNlYyArPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbiBpbml0aWFsIHVuZGVycnVuIG9uIGZhc3QgdHJhY2tzIGFmdGVyIGV4aXRpbmcgc3RhbmRieSwKKyAgICAgICAgICAgICAgICAvLyBkbyBub3Qgc3RhcnQgcHVsbGluZyBkYXRhIGZyb20gdHJhY2tzIGFuZCBtaXhpbmcgdW50aWwgd2FybXVwIGlzIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgIC8vIFdhcm11cCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlIGFmdGVyIHRoZSBlYXJsaWVyIG9mOgorICAgICAgICAgICAgICAgIC8vICAgICAgTUlOX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cyBhbmQgbGFzdCBvbmUgYmxvY2tzIGZvciBhdCBsZWFzdCB3YXJtdXBOcworICAgICAgICAgICAgICAgIC8vICAgICAgTUFYX1dBUk1VUF9DWUNMRVMgd3JpdGUoKSBhdHRlbXB0cy4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUsIGJ1dCB0byBnZXQgYmV0dGVyIGFjY3VyYWN5IHJlcXVpcmVzIGEgbmV3IEhBTCBBUEkuCisgICAgICAgICAgICAgICAgaWYgKCFpc1dhcm0gJiYgYXR0ZW1wdGVkV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKz0gc2VjOworICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKz0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X3NlYysrOworICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyt3YXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgIGlmICgobnNlYyA+IHdhcm11cE5zICYmIHdhcm11cEN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FybXVwQ3ljbGVzID49IE1BWF9XQVJNVVBfQ1lDTEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtZWFzdXJlZFdhcm11cFRzOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gd2FybXVwQ3ljbGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIG9ubHkgbG9nIG9jY2FzaW9uYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuZGVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG92ZXJydW5OcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHRPdmVycnVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU92ZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSB3b3JrcyB3aXRoIGEgdmFyaWFibGUgYnVmZmVyIGRlcHRoIGF1ZGlvIEhBTCB0aGF0IG5ldmVyIHB1bGxzIGF0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJhdGUgPCB0aGFuIG92ZXJydW5OcyBwZXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gcmVjb3ZlcnMgZnJvbSBvdmVycnVuIGltbWVkaWF0ZWx5IGFmdGVyIHVuZGVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IHdvcmsgd2l0aCBhIG5vbi1ibG9ja2luZyBhdWRpbyBIQUwuCisgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcE5zID0gZm9yY2VOcyAtIG5zZWM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkZWx0YSB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9ub3RvbmljTnMgPSBuc2VjOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb25vdG9uaWNOcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgcmF3IENQVSBsb2FkID0gZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9hZE5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIG5ld0xvYWQ7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCwgJm5ld0xvYWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZExvYWRWYWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IG5ld0xvYWQudHZfc2VjIC0gb2xkTG9hZC50dl9zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlYyA9IG5ld0xvYWQudHZfbnNlYyAtIG9sZExvYWQudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE5zID0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCAmJiBzZWMgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWROcyArPSBzZWMgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZExvYWQgPSBuZXdMb2FkOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKKyAgICAgICAgICAgICAgICAgICAgaW50IGNwdU51bSA9IHNjaGVkX2dldGNwdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrSHogPSB0Y3UuZ2V0Q3B1a0h6KGNwdU51bSk7CisgICAgICAgICAgICAgICAgICAgIGtIeiA9IChrSHogPDwgNCkgfCAoY3B1TnVtICYgMHhGKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHZhbHVlcyBpbiBGSUZPIHF1ZXVlcyBmb3IgZHVtcHN5cworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzdG9yZXMgIzEsICMyLCAjMyBhcmUgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gZWFjaCBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igd2l0aCByZXNwZWN0IHRvIHN0b3JlICM0IGJlbG93CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKKyAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgiY3ljbGVfbXMiLCBtb25vdG9uaWNOcyAvIDEwMDAwMDApOworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJsb2FkX3VzIiwgbG9hZE5zIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBwZXJpb2ROczsKKyAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRUcyA9IG5ld1RzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbW9ub3RvbmljIGNsb2NrIGlzIGJyb2tlbgorICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICB9CisKKyAgICB9ICAgLy8gZm9yICg7OykKKworICAgIC8vIG5ldmVyIHJldHVybiAndHJ1ZSc7IFRocmVhZDo6X3RocmVhZExvb3AoKSBsb2NrcyBtdXRleCB3aGljaCBjYW4gcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+CisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRmFzdFRocmVhZCBpcyB0aGUgY29tbW9uIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgRmFzdE1peGVyIGFuZCBGYXN0Q2FwdHVyZQorY2xhc3MgRmFzdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworCitwdWJsaWM6CisgICAgICAgICAgICBGYXN0VGhyZWFkKCk7CisgICAgdmlydHVhbCB+RmFzdFRocmVhZCgpOworCitwcml2YXRlOgorICAgIC8vIGltcGxlbWVudCBUaHJlYWQ6OnRocmVhZExvb3AoKQorICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjYWxsb3V0cyB0byBzdWJjbGFzcyBpbiBzYW1lIGxleGljYWwgb3JkZXIgYXMgdGhleSB3ZXJlIGluIG9yaWdpbmFsIEZhc3RNaXhlci5jcHAKKyAgICAvLyBGSVhNRSBuZWVkIGNvbW1lbnRzCisgICAgdmlydHVhbCBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnBvbGwoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldExvZyhOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIgX191bnVzZWQpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBvbklkbGUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdWJDbGFzc0NvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCkgPSAwOworCisgICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzIGFuZCB0byBiZSByZW5hbWVkIHRvIGhhdmUgYW4gIm0iIHByZWZpeAorICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqcHJldmlvdXM7CisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlICpjdXJyZW50OworICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRUczsKKyAgICBib29sIG9sZFRzVmFsaWQ7CisgICAgbG9uZyBzbGVlcE5zOyAgIC8vIC0xOiBidXN5IHdhaXQsIDA6IHNjaGVkX3lpZWxkLCA+IDA6IG5hbm9zbGVlcAorICAgIGxvbmcgcGVyaW9kTnM7ICAgICAgLy8gZXhwZWN0ZWQgcGVyaW9kOyB0aGUgdGltZSByZXF1aXJlZCB0byByZW5kZXIgb25lIG1peCBidWZmZXIKKyAgICBsb25nIHVuZGVycnVuTnM7ICAgIC8vIHVuZGVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBvdmVycnVuTnM7ICAgICAvLyBvdmVycnVuIGxpa2VseSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGxlc3MgdGhhbiB0aGlzIHZhbHVlCisgICAgbG9uZyBmb3JjZU5zOyAgICAgICAvLyBpZiBvdmVycnVuIGRldGVjdGVkLCBmb3JjZSB0aGUgd3JpdGUgY3ljbGUgdG8gdGFrZSB0aGlzIG11Y2ggdGltZQorICAgIGxvbmcgd2FybXVwTnM7ICAgICAgLy8gd2FybXVwIGNvbXBsZXRlIHdoZW4gd3JpdGUgY3ljbGUgaXMgZ3JlYXRlciB0aGFuIHRvIHRoaXMgdmFsdWUKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlICptRHVtbXlEdW1wU3RhdGU7CisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSAqZHVtcFN0YXRlOworICAgIGJvb2wgaWdub3JlTmV4dE92ZXJydW47ICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuIHVuZGVycnVuCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgc3RydWN0IHRpbWVzcGVjIG9sZExvYWQ7ICAgIC8vIHByZXZpb3VzIHZhbHVlIG9mIGNsb2NrX2dldHRpbWUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpCisgICAgYm9vbCBvbGRMb2FkVmFsaWQ7ICAvLyB3aGV0aGVyIG9sZExvYWQgaXMgdmFsaWQKKyAgICB1aW50MzJfdCBib3VuZHM7CisgICAgYm9vbCBmdWxsOyAgICAgICAgICAvLyB3aGV0aGVyIHdlIGhhdmUgY29sbGVjdGVkIGF0IGxlYXN0IG1TYW1wbGluZ04gc2FtcGxlcworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgIFRocmVhZENwdVVzYWdlIHRjdTsgICAgIC8vIGZvciByZWFkaW5nIHRoZSBjdXJyZW50IENQVSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6CisjZW5kaWYKKyNlbmRpZgorICAgIHVuc2lnbmVkIGNvbGRHZW47ICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgorICAgIGJvb2wgaXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCisgICAgc3RydWN0IHRpbWVzcGVjIG1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3Qgd2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCisgICAgTkJMb2c6OldyaXRlciBkdW1teUxvZ1dyaXRlcjsKKyAgICBOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXI7CisgICAgc3RhdHVzX3QgdGltZXN0YW1wU3RhdHVzOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIGNvbW1hbmQ7CisjaWYgMAorICAgIHNpemVfdCBmcmFtZUNvdW50OworI2VuZGlmCisgICAgYm9vbCBhdHRlbXB0ZWRXcml0ZTsKKworfTsgIC8vIGNsYXNzIEZhc3RUaHJlYWQKKworfSAgIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5NDg3MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWRTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RUaHJlYWRTdGF0ZTo6RmFzdFRocmVhZFN0YXRlKCkgOgorICAgIG1Db21tYW5kKElOSVRJQUwpLCBtQ29sZEZ1dGV4QWRkcihOVUxMKSwgbUNvbGRHZW4oMCksIG1EdW1wU3RhdGUoTlVMTCksIG1OQkxvZ1dyaXRlcihOVUxMKQorCit7Cit9CisKK0Zhc3RUaHJlYWRTdGF0ZTo6fkZhc3RUaHJlYWRTdGF0ZSgpCit7Cit9CisKKworRmFzdFRocmVhZER1bXBTdGF0ZTo6RmFzdFRocmVhZER1bXBTdGF0ZSgpIDoKKyAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLCBtVW5kZXJydW5zKDApLCBtT3ZlcnJ1bnMoMCksCisgICAgLyogbU1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KKyAgICBtV2FybXVwQ3ljbGVzKDApCisjaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisgICAgLCBtU2FtcGxpbmdOKDEpLCBtQm91bmRzKDApCisjZW5kaWYKK3sKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworfQorCitGYXN0VGhyZWFkRHVtcFN0YXRlOjp+RmFzdFRocmVhZER1bXBTdGF0ZSgpCit7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjhhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGU7CisKKy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgc3RhdGUgb2YgYSBGYXN0VGhyZWFkCitzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlIHsKKyAgICAgICAgICAgICAgICBGYXN0VGhyZWFkU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZFN0YXRlKCk7CisKKyAgICB0eXBlZGVmIHVpbnQzMl90IENvbW1hbmQ7CisgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKKyAgICAgICAgSU5JVElBTCA9IDAsICAgICAgICAgICAgLy8gdXNlZCBvbmx5IGZvciB0aGUgaW5pdGlhbCBzdGF0ZQorICAgICAgICBIT1RfSURMRSA9IDEsICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIENPTERfSURMRSA9IDIsICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBmdXRleAorICAgICAgICBJRExFID0gMywgICAgICAgICAgICAgICAvLyBlaXRoZXIgSE9UX0lETEUgb3IgQ09MRF9JRExFCisgICAgICAgIEVYSVQgPSA0OyAgICAgICAgICAgICAgIC8vIGV4aXQgZnJvbSB0aHJlYWQKKyAgICAgICAgLy8gYWRkaXRpb25hbCB2YWx1ZXMgZGVmaW5lZCBwZXIgc3ViY2xhc3MKKyAgICBDb21tYW5kICAgICBtQ29tbWFuZDsgICAgICAgLy8gY3VycmVudCBjb21tYW5kCisgICAgaW50MzJfdCogICAgbUNvbGRGdXRleEFkZHI7IC8vIGZvciBDT0xEX0lETEUgb25seSwgcG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBmdXRleAorICAgIHVuc2lnbmVkICAgIG1Db2xkR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBDT0xEX0lETEUgaXMgcmVxdWVzdGVkIHNvIGl0J3Mgb25seSBwZXJmb3JtZWQgb25jZQorCisgICAgLy8gVGhpcyBtaWdodCBiZSBhIG9uZS10aW1lIGNvbmZpZ3VyYXRpb24gcmF0aGVyIHRoYW4gcGVyLXN0YXRlCisgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CisgICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZFN0YXRlCisKKworLy8gRklYTUUgZXh0cmFjdCBjb21tb24gcGFydCBvZiBjb21tZW50IGF0IEZhc3RNaXhlckR1bXBTdGF0ZQorc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RUaHJlYWREdW1wU3RhdGUoKTsKKyAgICAvKnZpcnR1YWwqLyB+RmFzdFRocmVhZER1bXBTdGF0ZSgpOworCisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOyAgIC8vIGN1cnJlbnQgY29tbWFuZAorICAgIHVpbnQzMl90IG1VbmRlcnJ1bnM7ICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2YgdW5kZXJydW5zCisgICAgdWludDMyX3QgbU92ZXJydW5zOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBvdmVycnVucworICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIG1lYXN1cmVkIHdhcm11cCB0aW1lCisgICAgdWludDMyX3QgbVdhcm11cEN5Y2xlczsgICAgIC8vIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKKworI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUworICAgIC8vIFJlY2VudGx5IGNvbGxlY3RlZCBzYW1wbGVzIG9mIHBlci1jeWNsZSBtb25vdG9uaWMgdGltZSwgdGhyZWFkIENQVSB0aW1lLCBhbmQgQ1BVIGZyZXF1ZW5jeS4KKyAgICAvLyBrU2FtcGxpbmdOIGlzIG1heCBzaXplIG9mIHNhbXBsaW5nIGZyYW1lIChzdGF0aXN0aWNzKSwgYW5kIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IDB4ODAwMC4KKyAgICAvLyBUaGUgc2FtcGxlIGFycmF5cyBhcmUgdmlydHVhbGx5IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIGNvbXBpbGUtdGltZSBjb25zdGFudCwKKyAgICAvLyBidXQgYXJlIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIHVzZWQgYmFzZWQgb24gdGhlIHJ1bnRpbWUgcGFyYW1ldGVyIG1TYW1wbGluZ04uCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGluZ04gPSAweDgwMDA7CisgICAgLy8gQ29ycmVzcG9uZGluZyBydW50aW1lIG1heGltdW0gc2l6ZSBvZiBzYW1wbGUgYXJyYXlzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSBrU2FtcGxpbmdOLgorICAgIHVpbnQzMl90IG1TYW1wbGluZ047CisgICAgLy8gVGhlIGJvdW5kcyBkZWZpbmUgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMsIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIG5ld2VzdCBvcGVuIChleGNsdWRlZCkgZW5kcG9pbnQgICA9IGxvd2VyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgorICAgIC8vICAgICAgb2xkZXN0IGNsb3NlZCAoaW5jbHVkZWQpIGVuZHBvaW50ID0gdXBwZXIgMTYgYml0cyBvZiBib3VuZHMsIG1vZHVsbyBOCisgICAgLy8gTnVtYmVyIG9mIHZhbGlkIHNhbXBsZXMgaXMgbmV3ZXN0IC0gb2xkZXN0LgorICAgIHVpbnQzMl90IG1Cb3VuZHM7ICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kcyBmb3IgbU1vbm90b25pY05zLCBtVGhyZWFkQ3B1TnMsIGFuZCBtQ3B1a0h6CisgICAgLy8gVGhlIGVsZW1lbnRzIGluIHRoZSAqTnMgYXJyYXlzIGFyZSBpbiB1bml0cyBvZiBuYW5vc2Vjb25kcyA8PSAzOTk5OTk5OTk5LgorICAgIHVpbnQzMl90IG1Nb25vdG9uaWNOc1trU2FtcGxpbmdOXTsgIC8vIGRlbHRhIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZQorICAgIHVpbnQzMl90IG1Mb2FkTnNba1NhbXBsaW5nTl07ICAgICAgIC8vIGRlbHRhIENQVSBsb2FkIGluIHRpbWUKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICB1aW50MzJfdCBtQ3B1a0h6W2tTYW1wbGluZ05dOyAgICAgICAvLyBhYnNvbHV0ZSBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIeiwgYml0cyAwLTMgYXJlIENQVSMKKyNlbmRpZgorI2VuZGlmCisKK307ICAvLyBzdHJ1Y3QgRmFzdFRocmVhZER1bXBTdGF0ZQorCit9ICAgLy8gYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfU1RBVEVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTAsMCArMSw2OTUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZTogdGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIGZvciBleHRyZW1lbHkgdmVyYm9zZSBsb2dnaW5nIG1lc3NhZ2UuICBJbgorLy8gb3JkZXIgdG8gcnVuIHdpdGggQUxPR19BU1NFUlQgdHVybmVkIG9uLCB3ZSBuZWVkIHRvIGhhdmUgTE9HX05ERUJVRyBzZXQgdG8KKy8vIDA7IGJ1dCBvbmUgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0byB0dXJuIGFsbCBMT0dWJ3MgYXMgd2VsbC4gIFNvbWUgbWVzc2FnZXMKKy8vIGFyZSBzbyB2ZXJib3NlIHRoYXQgd2Ugd2FudCB0byBzdXBwcmVzcyB0aGVtIGV2ZW4gd2hlbiB3ZSBoYXZlIEFMT0dfQVNTRVJUCisvLyB0dXJuZWQgb24uICBEbyBub3QgdW5jb21tZW50IHRoZSAjZGVmIGJlbG93IHVubGVzcyB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UKKy8vIGFyZSBkb2luZyBhbmQgd2FudCB0byBzZWUgYWxsIG9mIHRoZSBleHRyZW1lbHkgdmVyYm9zZSBtZXNzYWdlcy4KKy8vI2RlZmluZSBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5nZXRBdWRpb1BvcnQocG9ydCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKKy8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKKy8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgeworICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKKy8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGV5IGF0dHJpYnV0ZXMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpCit7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6flBhdGNoUGFuZWwoKQoreworfQorCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkKQoreworICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cyIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIEFMT0dWKCJnZXRBdWRpb1BvcnQiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCisgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8CisgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBsaW1pdCBudW1iZXIgb2Ygc291cmNlcyB0byAxIGZvciBub3cgb3IgMiBzb3VyY2VzIGZvciBzcGVjaWFsIGNyb3NzIGh3IG1vZHVsZSBjYXNlLgorICAgIC8vIG9ubHkgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiByZXF1ZXN0IGEgcGF0Y2ggY3JlYXRpb24gd2l0aCAyIHNvdXJjZXMuCisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmICgqaGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgKmhhbmRsZSAhPSAwICYmIGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoKmhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsICpoYW5kbGUpOworICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IG1QYXRjaGVzW2luZGV4XS0+bUhhbEhhbmRsZTsKKyAgICAgICAgICAgICAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQYXRjaCAqbmV3UGF0Y2ggPSBuZXcgUGF0Y2gocGF0Y2gpOworCisgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgaWYgY29ubmVjdGlvbiB0byBhIG1peCBvciBhY3Jvc3MgSFcgbW9kdWxlcworICAgICAgICAgICAgICAgIGlmICgocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlamVjdCBjb25uZWN0aW9uIHRvIGRpZmZlcmVudCBzaW5rIHR5cGVzCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IHBhdGNoLT5zaW5rc1swXS50eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25uZWN0aW9ucyBiZXR3ZWVuIGRldmljZXMgYW5kIGlucHV0IHN0cmVhbXMgZm9yIEhBTCBiZWZvcmUgMy4wCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS5leHQubWl4Lmh3X21vZHVsZSA9PSBzcmNNb2R1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIGRldmljZSBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAvLyBsaW1pdCB0byBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24gaWYgbm90IG9uIHNhbWUgaHcgbW9kdWxlCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSBmb3IgY3Jvc3MgaHcgbW9kdWxlIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBudW0gc291cmNlcyA9PSAyIC09PiByZXVzZSBhbiBleGl0aW5nIG91dHB1dCBtaXggdG8gY29ubmVjdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzaW5rCisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaHdfbW9kdWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKE1peGVyVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOworICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGluQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLCBpbkNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCwgcGF0Y2gpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX0lOUFVUX1NPVVJDRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0Ugc2V0UGFyYW1ldGVycyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogeworICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgb3V0cHV0IHN0cmVhbXMKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gc2lua3MgYW5kIHNvdXJjZXMgb24gc2FtZSBIVyBtb2R1bGUKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAoaW50KXR5cGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBleGl0OworICAgIH0KK2V4aXQ6CisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgKmhhbmRsZSA9IGF1ZGlvZmxpbmdlci0+bmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG5ld1BhdGNoLT5tSGFuZGxlID0gKmhhbmRsZTsKKyAgICAgICAgbmV3UGF0Y2gtPm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CisgICAgICAgIG1QYXRjaGVzLmFkZChuZXdQYXRjaCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCAqaGFuZGxlLCBoYWxIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCk7CisgICAgICAgIGRlbGV0ZSBuZXdQYXRjaDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpCit7CisgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHN1YlBhdGNoOworICAgIHN1YlBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBzdWJQYXRjaC5zb3VyY2VzWzBdID0gYXVkaW9QYXRjaC0+c291cmNlc1swXTsKKyAgICBzdWJQYXRjaC5udW1fc2lua3MgPSAxOworCisgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc2lua3NbMF0pOworICAgIHN1YlBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmc3ViUGF0Y2gsICZwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCisgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zb3VyY2VzWzBdKTsKKyAgICBzdWJQYXRjaC5zaW5rc1swXSA9IGF1ZGlvUGF0Y2gtPnNpbmtzWzBdOworICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKKyAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOworICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOworICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKKyAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OworICAgIH0KKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKKyAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICVkIHJlY29yZEZyYW1lY291bnQgJWQgZnJhbWVDb3VudCAlZCAiLAorICAgICAgICAgIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVjb3VudCwgZnJhbWVDb3VudCk7CisKKyAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHJlY29yZCB0cmFjayB0byBjYXB0dXJlIGZyb20gcmVjb3JkIHRocmVhZAorICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworCisgICAgcGF0Y2gtPm1QYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVCk7CisgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5hZGRQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKKworICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcGxheWJhY2sgdHJhY2sgdG8gcmVuZGVyIHRvIHBsYXliYWNrIHRocmVhZC4KKyAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCisgICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUKTsKKyAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKKworICAgIC8vIHRpZSBwbGF5YmFjayBhbmQgcmVjb3JkIHRyYWNrcyB0b2dldGhlcgorICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoVHJhY2suZ2V0KCkpOworICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hSZWNvcmQuZ2V0KCkpOworCisgICAgLy8gc3RhcnQgY2FwdHVyZSBhbmQgcGxheWJhY2sKKyAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCAwKTsKKyAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Y2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCkKK3sKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgJWQgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlLCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworCisgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgeworICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdG9wKCk7CisgICAgfQorICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgeworICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOworICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKKyAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgeworICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmRlbGV0ZVBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VJbnB1dEludGVybmFsX2wocGF0Y2gtPm1SZWNvcmRUaHJlYWQpOworICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOworICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgbnVtIHNvdXJjZXMgPT0gMiB3ZSBhcmUgcmV1c2luZyBhbiBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgc28gd2UgZG8gbm90IGNsb3NlIGl0CisgICAgICAgIGlmIChwYXRjaC0+bUF1ZGlvUGF0Y2gubnVtX3NvdXJjZXMgIT0gMikgeworICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jbG9zZU91dHB1dEludGVybmFsX2wocGF0Y2gtPm1QbGF5YmFja1RocmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOworICAgIH0KK30KKworLyogRGlzY29ubmVjdCBhIHBhdGNoICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2ggaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBtUGF0Y2hlcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKKyAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2g7CisKKyAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgcmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkcpLCAwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHNldFBhcmFtZXRlcnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRlbGV0ZSByZW1vdmVkUGF0Y2g7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQpCit7CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWciKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInNldEF1ZGlvUG9ydENvbmZpZygpIGJhZCBodyBtb2R1bGUgJWQiLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgcmV0dXJuIGh3RGV2aWNlLT5zZXRfYXVkaW9fcG9ydF9jb25maWcoaHdEZXZpY2UsIGNvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTE3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKKyAgICAjZXJyb3IgVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgb25seSBiZSBpbmNsdWRlZCBmcm9tIEF1ZGlvRmxpbmdlci5oCisjZW5kaWYKKworY2xhc3MgUGF0Y2hQYW5lbCA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKworICAgIGNsYXNzIFBhdGNoOworCisgICAgUGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpOworICAgIHZpcnR1YWwgflBhdGNoUGFuZWwoKTsKKworICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpOworCisgICAgLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOworCisgICAgLyogUmVsZWFzZSBhIHBhdGNoICovCisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIGRldmljZXMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLworICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKKworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgc3RhdHVzX3QgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpOworICAgIHZvaWQgY2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCk7CisKKyAgICBjbGFzcyBQYXRjaCB7CisgICAgcHVibGljOgorICAgICAgICBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6CisgICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKKyAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAorICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9CisgICAgICAgIH5QYXRjaCgpIHt9CisKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgICAgICAgICBtQXVkaW9QYXRjaDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGU7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gIG1QYXRjaFRyYWNrOworICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWQ7CisgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+ICAgbVBhdGNoUmVjb3JkOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1SZWNvcmRQYXRjaEhhbmRsZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKKworICAgIH07CisKK3ByaXZhdGU6CisgICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyPiAgICAgIG1BdWRpb0ZsaW5nZXI7CisgICAgU29ydGVkVmVjdG9yIDxQYXRjaCAqPiAgICAgIG1QYXRjaGVzOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggNDNiNzdmMy4uZWU0ODI3NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTI5LDE0ICsyOSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uID0gMCk7CkBAIC01Myw2ICs1Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfT0ZGTE9BRCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgYXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpOwpAQCAtNjQsNyArNjgsNyBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2lnbmFsKCk7CiAKIC8vIGltcGxlbWVudCBGYXN0TWl4ZXJTdGF0ZTo6Vm9sdW1lUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRWb2x1bWVMUigpOworICAgIHZpcnR1YWwgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIApAQCAtOTMsMTAgKzk3LDEwIEBACiAgICAgYm9vbCBpc1JlYWR5KCkgY29uc3Q7CiAgICAgdm9pZCBzZXRQYXVzZWQoKSB7IG1TdGF0ZSA9IFBBVVNFRDsgfQogICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIGJvb2wgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fQ05UKTsKLSAgICB9CisgICAgYm9vbCBpc0ZsdXNoUGVuZGluZygpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaEh3UGVuZGluZzsgfQorICAgIHZvaWQgZmx1c2hBY2soKTsKKyAgICBib29sIGlzUmVzdW1lUGVuZGluZygpOworICAgIHZvaWQgcmVzdW1lQWNrKCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTEwOSw4ICsxMTMsNiBAQAogICAgIHZvaWQgdHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpOwogICAgIHZvaWQgaW52YWxpZGF0ZSgpOwogICAgIGJvb2wgaXNJbnZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUlzSW52YWxpZDsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1RpbWVkVHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIGJvb2wgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgIT0gMDsgfQogICAgIGludCBmYXN0SW5kZXgoKSBjb25zdCB7IHJldHVybiBtRmFzdEluZGV4OyB9CiAKIHByb3RlY3RlZDoKQEAgLTEzNyw4ICsxMzksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSEFMIHdoZW4gdGhpcyB0cmFjayB3aWxsIGJlIGZ1bGx5IHJlbmRlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIG1lYW5zIG5vdCBtb25pdG9yaW5nCiBwcml2YXRlOgotICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgbUZsYWdzOwotCiAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgZm9yIGZhc3QgdHJhY2tzLCBhbmQgc2hvdWxkIGJlIGluIGEgc3ViY2xhc3MKICAgICBpbnQgICAgICAgICAgICAgICAgIG1GYXN0SW5kZXg7IC8vIGluZGV4IHdpdGhpbiBGYXN0TWl4ZXJTdGF0ZTo6bUZhc3RUcmFja3NbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBtRmFzdEluZGV4ID09IC0xIGlmIG5vdCBpc0Zhc3RUcmFjaygpCkBAIC0xNTQsNiArMTU0LDEyIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNJbnZhbGlkOyAvLyBub24tcmVzZXR0YWJsZSBsYXRjaCwgc2V0IGJ5IGludmFsaWRhdGUoKQogICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSogIG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzdW1lVG9TdG9wcGluZzsgLy8gdHJhY2sgd2FzIHBhdXNlZCBpbiBzdG9wcGluZyBzdGF0ZS4KKyAgICBib29sICAgICAgICAgICAgICAgIG1GbHVzaEh3UGVuZGluZzsgLy8gdHJhY2sgcmVxdWVzdHMgZm9yIHRocmVhZCBmbHVzaAorCisgICAgLy8gZm9yIGxhc3QgY2FsbCB0byBnZXRUaW1lc3RhbXAKKyAgICBib29sICAgICAgICAgICAgICAgIG1QcmV2aW91c1ZhbGlkOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbjsKKyAgICBBdWRpb1RpbWVzdGFtcCAgICAgIG1QcmV2aW91c1RpbWVzdGFtcDsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogY2xhc3MgVGltZWRUcmFjayA6IHB1YmxpYyBUcmFjayB7CkBAIC0xODUsNyArMTkxLDYgQEAKICAgICB9OwogCiAgICAgLy8gTWl4ZXIgZmFjaW5nIG1ldGhvZHMuCi0gICAgdmlydHVhbCBib29sIGlzVGltZWRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZXNSZWFkeSgpIGNvbnN0OwogCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTI4NiwzICsyOTEsMzQgQEAKICAgICBEdXBsaWNhdGluZ1RocmVhZCogY29uc3QgbVNvdXJjZVRocmVhZDsgLy8gZm9yIHdhaXRUaW1lTXMoKSBpbiB3cml0ZSgpCiAgICAgQXVkaW9UcmFja0NsaWVudFByb3h5KiAgICAgIG1DbGllbnRQcm94eTsKIH07ICAvLyBlbmQgb2YgT3V0cHV0VHJhY2sKKworLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAorY2xhc3MgUGF0Y2hUcmFjayA6IHB1YmxpYyBUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFRyYWNrKCk7CisKKyAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9CisKK3ByaXZhdGU6CisgICAgc3A8Q2xpZW50UHJveHk+ICAgICAgICAgICAgIG1Qcm94eTsKKyAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0OworfTsgIC8vIGVuZCBvZiBQYXRjaFRyYWNrCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggNTdkZTU2OC4uMjA0YTlkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtMjgsOCArMjgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwgaW50IHRyaWdnZXJTZXNzaW9uKTsKQEAgLTQ1LDcgKzQ4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVN0YXRlCkBAIC01OSw1ICs2NSw2NCBAQAogICAgIC8vIHJlbGVhc2VCdWZmZXIoKSBub3Qgb3ZlcnJpZGRlbgogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtT3ZlcmZsb3c7ICAvLyBvdmVyZmxvdyBvbiBtb3N0IHJlY2VudCBhdHRlbXB0IHRvIGZpbGwgY2xpZW50IGJ1ZmZlcgotICAgIEF1ZGlvUmVjb3JkU2VydmVyUHJveHkqIG1BdWRpb1JlY29yZFNlcnZlclByb3h5OworCisgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQorICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXIgICAgICAgICAgICAgICAgICAgICAgKm1SZXNhbXBsZXI7CisKKyAgICAgICAgICAgIC8vIGludGVybGVhdmVkIHN0ZXJlbyBwYWlycyBvZiBmaXhlZC1wb2ludCBRNC4yNworICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wT3V0QnVmZmVyOworICAgICAgICAgICAgLy8gY3VycmVudCBhbGxvY2F0ZWQgZnJhbWUgY291bnQgZm9yIHRoZSBhYm92ZSwgd2hpY2ggbWF5IGJlIGxhcmdlciB0aGFuIG5lZWRlZAorICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBPdXRGcmFtZUNvdW50OworCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluVW5yZWw7ICAgLy8gdW5yZWxlYXNlZCBmcmFtZXMgcmVtYWluaW5nIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBnZXROZXh0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHkKKworICAgICAgICAgICAgLy8gcm9sbGluZyBjb3VudGVyIHRoYXQgaXMgbmV2ZXIgY2xlYXJlZAorICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkZyb250OyAgIC8vIG5leHQgYXZhaWxhYmxlIGZyYW1lCisKKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBtU2luazsgIC8vIHJlZmVyZW5jZXMgY2xpZW50J3MgYnVmZmVyIHNpbmsgaW4gc2hhcmVkIG1lbW9yeQorCisgICAgICAgICAgICAvLyBzeW5jIGV2ZW50IHRyaWdnZXJpbmcgYWN0dWFsIGF1ZGlvIGNhcHR1cmUuIEZyYW1lcyByZWFkIGJlZm9yZSB0aGlzIGV2ZW50IHdpbGwKKyAgICAgICAgICAgIC8vIGJlIGRyb3BwZWQgYW5kIHRoZXJlZm9yZSBub3QgcmVhZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICBzcDxTeW5jRXZlbnQ+ICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQ7CisKKyAgICAgICAgICAgIC8vIG51bWJlciBvZiBjYXB0dXJlZCBmcmFtZXMgdG8gZHJvcCBhZnRlciB0aGUgc3RhcnQgc3luYyBldmVudCBoYXMgYmVlbiByZWNlaXZlZC4KKyAgICAgICAgICAgIC8vIHdoZW4gPCAwLCBtYXhpbXVtIGZyYW1lcyB0byBkcm9wIGJlZm9yZSBzdGFydGluZyBjYXB0dXJlIGV2ZW4gaWYgc3luYyBldmVudCBpcworICAgICAgICAgICAgLy8gbm90IHJlY2VpdmVkCisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzVG9Ecm9wOworCisgICAgICAgICAgICAvLyB1c2VkIGJ5IHJlc2FtcGxlciB0byBmaW5kIHNvdXJjZSBmcmFtZXMKKyAgICAgICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyICptUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9OworCisvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCitjbGFzcyBQYXRjaFJlY29yZCA6IHZpcnR1YWwgcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKworICAgIFBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QYXRjaFJlY29yZCgpOworCisgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CisKKyAgICAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IE5VTEwpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIpOworCisgICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KKworcHJpdmF0ZToKKyAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OworICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OworICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7Cit9OyAgLy8gZW5kIG9mIFBhdGNoUmVjb3JkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggMTUyNDU1ZC4uODI0NmZlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtNTksNiArNTksMTMgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgcmV0dXJuIG9rOworfQorCiBib29sIGR1bXBBbGxvd2VkKCkgewogICAgIC8vIGRvbid0IG9wdGltaXplIGZvciBzYW1lIHBpZCwgc2luY2UgbWVkaWFzZXJ2ZXIgbmV2ZXIgZHVtcHMgaXRzZWxmCiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggNTMxYmM1Ni4uZGY2ZjZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0yNCw2ICsyNCw3IEBACiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKTsKIGJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCk7CiBib29sIHNldHRpbmdzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CiBib29sIGR1bXBBbGxvd2VkKCk7CiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmNwcAppbmRleCBjMmQzYmJkLi40MGQ3YmNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuY3BwCkBAIC0yOCwxMiArMjgsMTIgQEAKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiB2b2lkIFN0YXRlUXVldWVPYnNlcnZlckR1bXA6OmR1bXAoaW50IGZkKQogewotICAgIGZkcHJpbnRmKGZkLCAiU3RhdGUgcXVldWUgb2JzZXJ2ZXI6IHN0YXRlQ2hhbmdlcz0ldVxuIiwgbVN0YXRlQ2hhbmdlcyk7CisgICAgZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG9ic2VydmVyOiBzdGF0ZUNoYW5nZXM9JXVcbiIsIG1TdGF0ZUNoYW5nZXMpOwogfQogCiB2b2lkIFN0YXRlUXVldWVNdXRhdG9yRHVtcDo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgZmRwcmludGYoZmQsICJTdGF0ZSBxdWV1ZSBtdXRhdG9yOiBwdXNoRGlydHk9JXUgcHVzaEFjaz0ldSBibG9ja2VkU2VxdWVuY2U9JXVcbiIsCisgICAgZHByaW50ZihmZCwgIlN0YXRlIHF1ZXVlIG11dGF0b3I6IHB1c2hEaXJ0eT0ldSBwdXNoQWNrPSV1IGJsb2NrZWRTZXF1ZW5jZT0ldVxuIiwKICAgICAgICAgICAgIG1QdXNoRGlydHksIG1QdXNoQWNrLCBtQmxvY2tlZFNlcXVlbmNlKTsKIH0KICNlbmRpZgpAQCAtNDEsMTMgKzQxLDE0IEBACiAvLyBDb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTdGF0ZVF1ZXVlPFQ+OjpTdGF0ZVF1ZXVlKCkgOgotICAgIG1OZXh0KE5VTEwpLCBtQWNrKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKKyAgICBtQWNrKE5VTEwpLCBtQ3VycmVudChOVUxMKSwKICAgICBtTXV0YXRpbmcoJm1TdGF0ZXNbMF0pLCBtRXhwZWN0aW5nKE5VTEwpLAogICAgIG1Jbk11dGF0aW9uKGZhbHNlKSwgbUlzRGlydHkoZmFsc2UpLCBtSXNJbml0aWFsaXplZChmYWxzZSkKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgLCBtT2JzZXJ2ZXJEdW1wKCZtT2JzZXJ2ZXJEdW1teUR1bXApLCBtTXV0YXRvckR1bXAoJm1NdXRhdG9yRHVtbXlEdW1wKQogI2VuZGlmCiB7CisgICAgYXRvbWljX2luaXQoJm1OZXh0LCAwKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gU3RhdGVRdWV1ZTxUPjo6flN0YXRlUXVldWUoKQpAQCAtNTgsNyArNTksOCBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUKiBTdGF0ZVF1ZXVlPFQ+Ojpwb2xsKCkKIHsKLSAgICBjb25zdCBUICpuZXh0ID0gKGNvbnN0IFQgKikgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCh2b2xhdGlsZSBpbnQzMl90ICopICZtTmV4dCk7CisgICAgY29uc3QgVCAqbmV4dCA9IChjb25zdCBUICopIGF0b21pY19sb2FkX2V4cGxpY2l0KCZtTmV4dCwgbWVtb3J5X29yZGVyX2FjcXVpcmUpOworCiAgICAgaWYgKG5leHQgIT0gbUN1cnJlbnQpIHsKICAgICAgICAgbUFjayA9IG5leHQ7ICAgIC8vIG5vIGFkZGl0aW9uYWwgYmFycmllciBuZWVkZWQKICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwpAQCAtMTQwLDcgKzE0Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBwdWJsaXNoCi0gICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoKGludDMyX3QpIG1NdXRhdGluZywgKHZvbGF0aWxlIGludDMyX3QgKikgJm1OZXh0KTsKKyAgICAgICAgYXRvbWljX3N0b3JlX2V4cGxpY2l0KCZtTmV4dCwgKHVpbnRwdHJfdCltTXV0YXRpbmcsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKICAgICAgICAgbUV4cGVjdGluZyA9IG1NdXRhdGluZzsKIAogICAgICAgICAvLyBjb3B5IHdpdGggY2lyY3VsYXIgd3JhcGFyb3VuZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlLmgKaW5kZXggOWNkZTY0Mi4uMjdmNmEyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3RhdGVRdWV1ZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fU1RBVEVfUVVFVUVfSAogI2RlZmluZSBBTkRST0lEX0FVRElPX1NUQVRFX1FVRVVFX0gKIAorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorCiAvLyBUaGUgc3RhdGUgcXVldWUgdGVtcGxhdGUgY2xhc3Mgd2FzIG9yaWdpbmFsbHkgZHJpdmVuIGJ5IHRoaXMgdXNlIGNhc2UgLyByZXF1aXJlbWVudHM6CiAvLyAgVGhlcmUgYXJlIHR3byB0aHJlYWRzOiBhIGZhc3QgbWl4ZXIsIGFuZCBhIG5vcm1hbCBtaXhlciwgYW5kIHRoZXkgc2hhcmUgc3RhdGUuCiAvLyAgVGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIHNoYXJlZCBzdGF0ZSBpcyBhIHNldCBvZiBhY3RpdmUgZmFzdCB0cmFja3MsCkBAIC04OSw2ICs5MSw4IEBACiAvLyAgYXJpdGhtZXRpYyBvbiB0aGUgc3RhdGUgcG9pbnRlcnMuICBIb3dldmVyIHRvIHRoZSBtdXRhdG9yLCB0aGUgc3RhdGUgcG9pbnRlcnMKIC8vICBhcmUgaW4gYSBkZWZpbml0ZSBjaXJjdWxhciBvcmRlci4KIAorI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUApAQCAtMTg0LDcgKzE4OCw3IEBACiAgICAgVCAgICAgICAgICAgICAgICAgbVN0YXRlc1trTl07ICAgICAgLy8gd3JpdHRlbiBieSBtdXRhdG9yLCByZWFkIGJ5IG9ic2VydmVyCiAKICAgICAvLyAidm9sYXRpbGUiIGlzIG1lYW5pbmdsZXNzIHdpdGggU01QLCBidXQgaGVyZSBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSB1c2luZyBhdG9taWMgb3BzCi0gICAgdm9sYXRpbGUgY29uc3QgVCogbU5leHQ7IC8vIHdyaXR0ZW4gYnkgbXV0YXRvciB0byBhZHZhbmNlIG5leHQsIHJlYWQgYnkgb2JzZXJ2ZXIKKyAgICBhdG9taWNfdWludHB0cl90ICBtTmV4dDsgLy8gd3JpdHRlbiBieSBtdXRhdG9yIHRvIGFkdmFuY2UgbmV4dCwgcmVhZCBieSBvYnNlcnZlcgogICAgIHZvbGF0aWxlIGNvbnN0IFQqIG1BY2s7ICAvLyB3cml0dGVuIGJ5IG9ic2VydmVyIHRvIGFja25vd2xlZGdlIGFkdmFuY2Ugb2YgbmV4dCwgcmVhZCBieSBtdXRhdG9yCiAKICAgICAvLyBvbmx5IHVzZWQgYnkgb2JzZXJ2ZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKaW5kZXggMGQ1Y2QwYy4uNmY0NTA1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1N0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHAKQEAgLTE2LDEyICsxNiwxNCBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RNaXhlclN0YXRlLmgiCisjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKIAogLy8gRklYTUUgaGFjayBmb3IgZ2NjCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0TWl4ZXJTdGF0ZT47ICAvLyB0eXBlZGVmIEZhc3RNaXhlclN0YXRlUXVldWUKK3RlbXBsYXRlIGNsYXNzIFN0YXRlUXVldWU8RmFzdE1peGVyU3RhdGU+OyAgICAgIC8vIHR5cGVkZWYgRmFzdE1peGVyU3RhdGVRdWV1ZQordGVtcGxhdGUgY2xhc3MgU3RhdGVRdWV1ZTxGYXN0Q2FwdHVyZVN0YXRlPjsgICAgLy8gdHlwZWRlZiBGYXN0Q2FwdHVyZVN0YXRlUXVldWUKIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IDk5NGM3ZGIuLjYzZmVlYWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTM0LDggKzM1LDExIEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIE5CQUlPIGltcGxlbWVudGF0aW9ucworI2luY2x1ZGUgPG1lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9Nb25vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL01vbm9QaXBlUmVhZGVyLmg+CkBAIC01MSw2ICs1NSw3IEBACiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCiAKQEAgLTc5LDYgKzg0LDggQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKyNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gcmV0cnkgY291bnRzIGZvciBidWZmZXIgZmlsbCB0aW1lb3V0CkBAIC05NiwxOCArMTAzLDE4IEBACiAvLyBSZWNvcmRUaHJlYWQgbG9vcCBzbGVlcCB0aW1lIHVwb24gYXBwbGljYXRpb24gb3ZlcnJ1biBvciBhdWRpbyBIQUwgcmVhZCBlcnJvcgogc3RhdGljIGNvbnN0IGludCBrUmVjb3JkVGhyZWFkU2xlZXBVcyA9IDUwMDA7CiAKLS8vIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBzZXRQYXJhbWV0ZXJzIHRvIGNvbXBsZXRlCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyA9IHNlY29uZHMoMik7CisvLyBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBzZW5kQ29uZmlnRXZlbnRfbCgpIGZvciBhIHN0YXR1cyB0byBiZSByZWNlaXZlZAorc3RhdGljIGNvbnN0IG5zZWNzX3Qga0NvbmZpZ0V2ZW50VGltZW91dE5zID0gc2Vjb25kcygyKTsKIAogLy8gbWluaW11bSBzbGVlcCB0aW1lIGZvciB0aGUgbWl4ZXIgdGhyZWFkIGxvb3Agd2hlbiB0cmFja3MgYXJlIGFjdGl2ZSBidXQgaW4gdW5kZXJydW4KIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluVGhyZWFkU2xlZXBUaW1lVXMgPSA1MDAwOwogLy8gbWF4aW11bSBkaXZpZGVyIGFwcGxpZWQgdG8gdGhlIGFjdGl2ZSBzbGVlcCB0aW1lIGluIHRoZSBtaXhlciB0aHJlYWQgbG9vcAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhUaHJlYWRTbGVlcFRpbWVTaGlmdCA9IDI7CiAKLS8vIG1pbmltdW0gbm9ybWFsIG1peCBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyByYXRoZXIgdGhhbiBmcmFtZXMKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTm9ybWFsTWl4QnVmZmVyU2l6ZU1zID0gMjA7Ci0vLyBtYXhpbXVtIG5vcm1hbCBtaXggYnVmZmVyIHNpemUKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Tm9ybWFsTWl4QnVmZmVyU2l6ZU1zID0gMjQ7CisvLyBtaW5pbXVtIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplLCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZyYW1lcworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5Ob3JtYWxTaW5rQnVmZmVyU2l6ZU1zID0gMjA7CisvLyBtYXhpbXVtIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01heE5vcm1hbFNpbmtCdWZmZXJTaXplTXMgPSAyNDsKIAogLy8gT2ZmbG9hZGVkIG91dHB1dCB0aHJlYWQgc3RhbmRieSBkZWxheTogYWxsb3dzIHRyYWNrIHRyYW5zaXRpb24gd2l0aG91dCBnb2luZyB0byBzdGFuZGJ5CiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT2ZmbG9hZFN0YW5kYnlEZWxheU5zID0gc2Vjb25kcygxKTsKQEAgLTEyOSw5ICsxMzYsMTcgQEAKICAgICAvLyAgdXAgbGFyZ2Ugd3JpdGVzIGludG8gc21hbGxlciBvbmVzLCBhbmQgdGhlIHdyYXBwZXIgd291bGQgbmVlZCB0byBkZWFsIHdpdGggc2NoZWR1bGVyLgogfSBrVXNlRmFzdE1peGVyID0gRmFzdE1peGVyX1N0YXRpYzsKIAorLy8gV2hldGhlciB0byB1c2UgZmFzdCBjYXB0dXJlCitzdGF0aWMgY29uc3QgZW51bSB7CisgICAgRmFzdENhcHR1cmVfTmV2ZXIsICAvLyBuZXZlciBpbml0aWFsaXplIG9yIHVzZTogZm9yIGRlYnVnZ2luZyBvbmx5CisgICAgRmFzdENhcHR1cmVfQWx3YXlzLCAvLyBhbHdheXMgaW5pdGlhbGl6ZSBhbmQgdXNlLCBldmVuIGlmIG5vdCBuZWVkZWQ6IGZvciBkZWJ1Z2dpbmcgb25seQorICAgIEZhc3RDYXB0dXJlX1N0YXRpYywgLy8gaW5pdGlhbGl6ZSBpZiBuZWVkZWQsIHRoZW4gdXNlIGFsbCB0aGUgdGltZSBpZiBpbml0aWFsaXplZAorfSBrVXNlRmFzdENhcHR1cmUgPSBGYXN0Q2FwdHVyZV9TdGF0aWM7CisKIC8vIFByaW9yaXRpZXMgZm9yIHJlcXVlc3RQcmlvcml0eQogc3RhdGljIGNvbnN0IGludCBrUHJpb3JpdHlBdWRpb0FwcCA9IDI7CiBzdGF0aWMgY29uc3QgaW50IGtQcmlvcml0eUZhc3RNaXhlciA9IDM7CitzdGF0aWMgY29uc3QgaW50IGtQcmlvcml0eUZhc3RDYXB0dXJlID0gMzsKIAogLy8gSUF1ZGlvRmxpbmdlcjo6Y3JlYXRlVHJhY2soKSByZXBvcnRzIGJhY2sgdG8gY2xpZW50IHRoZSB0b3RhbCBzaXplIG9mIHNoYXJlZCBtZW1vcnkgYXJlYQogLy8gZm9yIHRoZSB0cmFjay4gIFRoZSBjbGllbnQgdGhlbiBzdWItZGl2aWRlcyB0aGlzIGludG8gc21hbGxlciBidWZmZXJzIGZvciBpdHMgdXNlLgpAQCAtMTQwLDggKzE1NSwzOSBAQAogLy8gRklYTUUgSXQgd291bGQgYmUgYmV0dGVyIGZvciBjbGllbnQgdG8gdGVsbCBBdWRpb0ZsaW5nZXIgdGhlIHZhbHVlIG9mIE4sCiAvLyBzbyBBdWRpb0ZsaW5nZXIgY291bGQgYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBtZW1vcnkuCiAvLyBTZWUgdGhlIGNsaWVudCdzIG1pbkJ1ZkNvdW50IGFuZCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGNhbGN1bGF0aW9ucyBmb3IgZGV0YWlscy4KKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgbm90IHNwZWNpZmllZCBieSBwcm9wZXJ0eS4KIHN0YXRpYyBjb25zdCBpbnQga0Zhc3RUcmFja011bHRpcGxpZXIgPSAyOwogCisvLyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBhbGxvd2VkIHZhbHVlcworc3RhdGljIGNvbnN0IGludCBrRmFzdFRyYWNrTXVsdGlwbGllck1pbiA9IDE7CitzdGF0aWMgY29uc3QgaW50IGtGYXN0VHJhY2tNdWx0aXBsaWVyTWF4ID0gMjsKKworLy8gVGhlIGFjdHVhbCB2YWx1ZSB0byB1c2UsIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgcGVyLWRldmljZSB2aWEgcHJvcGVydHkgYWYuZmFzdF90cmFja19tdWx0aXBsaWVyLgorc3RhdGljIGludCBzRmFzdFRyYWNrTXVsdGlwbGllciA9IGtGYXN0VHJhY2tNdWx0aXBsaWVyOworCisvLyBTZWUgVGhyZWFkOjpyZWFkT25seUhlYXAoKS4KKy8vIEluaXRpYWxseSB0aGlzIGhlYXAgaXMgdXNlZCB0byBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycyBmb3IgImZhc3QiIEF1ZGlvUmVjb3JkLgorLy8gRXZlbnR1YWxseSBpdCB3aWxsIGJlIHRoZSBzaW5nbGUgYnVmZmVyIHRoYXQgRmFzdENhcHR1cmUgd3JpdGVzIGludG8gdmlhIEhBTCByZWFkKCksCisvLyBhbmQgdGhhdCBhbGwgImZhc3QiIEF1ZGlvUmVjb3JkIGNsaWVudHMgcmVhZCBmcm9tLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBzaXplIGNhbiBiZSBzbWFsbC4KK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweDIwMDA7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHB0aHJlYWRfb25jZV90IHNGYXN0VHJhY2tNdWx0aXBsaWVyT25jZSA9IFBUSFJFQURfT05DRV9JTklUOworCitzdGF0aWMgdm9pZCBzRmFzdFRyYWNrTXVsdGlwbGllckluaXQoKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJhZi5mYXN0X3RyYWNrX211bHRpcGxpZXIiLCB2YWx1ZSwgTlVMTCkgPiAwKSB7CisgICAgICAgIGNoYXIgKmVuZHB0cjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bCA9IHN0cnRvdWwodmFsdWUsICZlbmRwdHIsIDApOworICAgICAgICBpZiAoKmVuZHB0ciA9PSAnXDAnICYmIGtGYXN0VHJhY2tNdWx0aXBsaWVyTWluIDw9IHVsICYmIHVsIDw9IGtGYXN0VHJhY2tNdWx0aXBsaWVyTWF4KSB7CisgICAgICAgICAgICBzRmFzdFRyYWNrTXVsdGlwbGllciA9IChpbnQpIHVsOworICAgICAgICB9CisgICAgfQorfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCkBAIC0xODUsNyArMjMxLDExIEBACiB7CiB9CiAKLXZvaWQgQ3B1U3RhdHM6OnNhbXBsZShjb25zdCBTdHJpbmc4ICZ0aXRsZSkgewordm9pZCBDcHVTdGF0czo6c2FtcGxlKGNvbnN0IFN0cmluZzggJnRpdGxlCisjaWZuZGVmIERFQlVHX0NQVV9VU0FHRQorICAgICAgICAgICAgICAgIF9fdW51c2VkCisjZW5kaWYKKyAgICAgICAgKSB7CiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiAgICAgLy8gZ2V0IGN1cnJlbnQgdGhyZWFkJ3MgZGVsdGEgQ1BVIHRpbWUgaW4gd2FsbCBjbG9jayBucwogICAgIGRvdWJsZSB3Y05zOwpAQCAtMjY5LDkgKzMxOSw5IEBACiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAogICAgICAgICBtVHlwZSh0eXBlKSwKICAgICAgICAgbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpLAotICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgYW5kIG1Gb3JtYXQgYXJlCi0gICAgICAgIC8vIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKSBvciBSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQotICAgICAgICBtUGFyYW1TdGF0dXMoTk9fRVJST1IpLAorICAgICAgICAvLyBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZyYW1lU2l6ZSwgbUZvcm1hdCwgbUJ1ZmZlclNpemUKKyAgICAgICAgLy8gYXJlIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIG9yCisgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KICAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCiAgICAgICAgIG1BdWRpb1NvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1JZChpZCksCkBAIC0yODMsMTIgKzMzMyw4IEBACiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6On5UaHJlYWRCYXNlKCkKIHsKICAgICAvLyBtQ29uZmlnRXZlbnRzIHNob3VsZCBiZSBlbXB0eSwgYnV0IGp1c3QgaW4gY2FzZSBpdCBpc24ndCwgZnJlZSB0aGUgbWVtb3J5IGl0IG93bnMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db25maWdFdmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1Db25maWdFdmVudHNbaV07Ci0gICAgfQogICAgIG1Db25maWdFdmVudHMuY2xlYXIoKTsKIAotICAgIG1QYXJhbUNvbmQuYnJvYWRjYXN0KCk7CiAgICAgLy8gZG8gbm90IGxvY2sgdGhlIG11dGV4IGluIGRlc3RydWN0b3IKICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IDApIHsKQEAgLTI5Nyw2ICszNDMsMTcgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVhZHlUb1J1bigpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HSSgiQXVkaW9GbGluZ2VyJ3MgdGhyZWFkICVwIHJlYWR5IHRvIHJ1biIsIHRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJObyB3b3JraW5nIGF1ZGlvIGRyaXZlciBmb3VuZC4iKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmV4aXQoKQogewogICAgIEFMT0dWKCJUaHJlYWRCYXNlOjpleGl0Iik7CkBAIC0zMjgsMTYgKzM4NSwzMCBAQAogICAgIEFMT0dWKCJUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkgJXMiLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgbU5ld1BhcmFtZXRlcnMuYWRkKGtleVZhbHVlUGFpcnMpOworICAgIHJldHVybiBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChrZXlWYWx1ZVBhaXJzKTsKK30KKworLy8gc2VuZENvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKKy8vIENhbiB0ZW1wb3JhcmlseSByZWxlYXNlIHRoZSBsb2NrIGlmIHdhaXRpbmcgZm9yIGEgcmVwbHkgZnJvbSBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKS4KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIG1Db25maWdFdmVudHMuYWRkKGV2ZW50KTsKKyAgICBBTE9HVigic2VuZENvbmZpZ0V2ZW50X2woKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCksIGV2ZW50LT5tVHlwZSk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgLy8gd2FpdCBjb25kaXRpb24gd2l0aCB0aW1lb3V0IGluIGNhc2UgdGhlIHRocmVhZCBsb29wIGhhcyBleGl0ZWQKLSAgICAvLyBiZWZvcmUgdGhlIHJlcXVlc3QgY291bGQgYmUgcHJvY2Vzc2VkCi0gICAgaWYgKG1QYXJhbUNvbmQud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RhdHVzID0gbVBhcmFtU3RhdHVzOwotICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZXZlbnQtPm1Mb2NrKTsKKyAgICAgICAgd2hpbGUgKGV2ZW50LT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgaWYgKGV2ZW50LT5tQ29uZC53YWl0UmVsYXRpdmUoZXZlbnQtPm1Mb2NrLCBrQ29uZmlnRXZlbnRUaW1lb3V0TnMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgZXZlbnQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gZXZlbnQtPm1TdGF0dXM7CiAgICAgfQorICAgIG1Mb2NrLmxvY2soKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTAsNjIgKzQyMSwxNTUgQEAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtKQogewotICAgIElvQ29uZmlnRXZlbnQgKmlvRXZlbnQgPSBuZXcgSW9Db25maWdFdmVudChldmVudCwgcGFyYW0pOwotICAgIG1Db25maWdFdmVudHMuYWRkKHN0YXRpY19jYXN0PENvbmZpZ0V2ZW50ICo+KGlvRXZlbnQpKTsKLSAgICBBTE9HVigic2VuZElvQ29uZmlnRXZlbnQoKSBudW0gZXZlbnRzICVkIGV2ZW50ICVkLCBwYXJhbSAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpLCBldmVudCwKLSAgICAgICAgICAgIHBhcmFtKTsKLSAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGFyYW0pOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAogLy8gc2VuZFByaW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pCiB7Ci0gICAgUHJpb0NvbmZpZ0V2ZW50ICpwcmlvRXZlbnQgPSBuZXcgUHJpb0NvbmZpZ0V2ZW50KHBpZCwgdGlkLCBwcmlvKTsKLSAgICBtQ29uZmlnRXZlbnRzLmFkZChzdGF0aWNfY2FzdDxDb25maWdFdmVudCAqPihwcmlvRXZlbnQpKTsKLSAgICBBTE9HVigic2VuZFByaW9Db25maWdFdmVudF9sKCkgbnVtIGV2ZW50cyAlZCBwaWQgJWQsIHRpZCAlZCBwcmlvICVkIiwKLSAgICAgICAgICBtQ29uZmlnRXZlbnRzLnNpemUoKSwgcGlkLCB0aWQsIHByaW8pOwotICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBQcmlvQ29uZmlnRXZlbnQocGlkLCB0aWQsIHByaW8pOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnByb2Nlc3NDb25maWdFdmVudHMoKQorLy8gc2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50X2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyKQogewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAoIW1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKLSAgICAgICAgQ29uZmlnRXZlbnQgKmV2ZW50ID0gbUNvbmZpZ0V2ZW50c1swXTsKLSAgICAgICAgbUNvbmZpZ0V2ZW50cy5yZW1vdmVBdCgwKTsKLSAgICAgICAgLy8gcmVsZWFzZSBtTG9jayBiZWZvcmUgbG9ja2luZyBBdWRpb0ZsaW5nZXIgbUxvY2s6IGxvY2sgb3JkZXIgaXMgYWx3YXlzCi0gICAgICAgIC8vIEF1ZGlvRmxpbmdlciB0aGVuIFRocmVhZEJhc2UgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2sKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN3aXRjaChldmVudC0+dHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIENGR19FVkVOVF9QUklPOiB7Ci0gICAgICAgICAgICAgICAgUHJpb0NvbmZpZ0V2ZW50ICpwcmlvRXZlbnQgPSBzdGF0aWNfY2FzdDxQcmlvQ29uZmlnRXZlbnQgKj4oZXZlbnQpOwotICAgICAgICAgICAgICAgIC8vIEZJWE1FIE5lZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhpcyBoYXMgYmUgZG9uZSBhc3luY2hyb25vdXNseQotICAgICAgICAgICAgICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkocHJpb0V2ZW50LT5waWQoKSwgcHJpb0V2ZW50LT50aWQoKSwgcHJpb0V2ZW50LT5wcmlvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb0V2ZW50LT5wcmlvKCksIHByaW9FdmVudC0+cGlkKCksIHByaW9FdmVudC0+dGlkKCksIGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7Ci0gICAgICAgICAgICAgICAgSW9Db25maWdFdmVudCAqaW9FdmVudCA9IHN0YXRpY19jYXN0PElvQ29uZmlnRXZlbnQgKj4oZXZlbnQpOwotICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpb0V2ZW50LT5ldmVudCgpLCBpb0V2ZW50LT5wYXJhbSgpKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9jZXNzQ29uZmlnRXZlbnRzKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPnR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGV2ZW50OwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotICAgIG1Mb2NrLnVubG9jaygpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBTZXRQYXJhbWV0ZXJDb25maWdFdmVudChrZXlWYWx1ZVBhaXIpOworICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KCpwYXRjaCwgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgKiljb25maWdFdmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICpoYW5kbGUgPSBkYXRhLT5tSGFuZGxlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGhhbmRsZSk7CisgICAgcmV0dXJuIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKK30KKworCisvLyBwb3N0IGNvbmRpdGlvbjogbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpwcm9jZXNzQ29uZmlnRXZlbnRzX2woKQoreworICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IGZhbHNlOworCisgICAgd2hpbGUgKCFtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HVigicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgcmVtYWluaW5nIGV2ZW50cyAlZCIsIG1Db25maWdFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgc3A8Q29uZmlnRXZlbnQ+IGV2ZW50ID0gbUNvbmZpZ0V2ZW50c1swXTsKKyAgICAgICAgbUNvbmZpZ0V2ZW50cy5yZW1vdmVBdCgwKTsKKyAgICAgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfUFJJTzogeworICAgICAgICAgICAgUHJpb0NvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChQcmlvQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgLy8gRklYTUUgTmVlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGhhcyB0byBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KGRhdGEtPm1QaWQsIGRhdGEtPm1UaWQsIGRhdGEtPm1QcmlvLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVByaW8sIGRhdGEtPm1QaWQsIGRhdGEtPm1UaWQsIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0lPOiB7CisgICAgICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChJb0NvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QYXJhbSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVI6IHsKKyAgICAgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChkYXRhLT5tS2V5VmFsdWVQYWlycywgZXZlbnQtPm1TdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoX2woJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hfbChkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChldmVudC0+bUxvY2spOworICAgICAgICAgICAgaWYgKGV2ZW50LT5tV2FpdFN0YXR1cykgeworICAgICAgICAgICAgICAgIGV2ZW50LT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGV2ZW50LT5tQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVl9JRihtQ29uZmlnRXZlbnRzLmlzRW1wdHkoKSwgInByb2Nlc3NDb25maWdFdmVudHNfbCgpIERPTkUgdGhyZWFkICVwIiwgdGhpcyk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHsKKyAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKKyAgICB9Cit9CisKK1N0cmluZzggY2hhbm5lbE1hc2tUb1N0cmluZyhhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrLCBib29sIG91dHB1dCkgeworICAgIFN0cmluZzggczsKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCkgcy5hcHBlbmQoImZyb250LWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgiZnJvbnQtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJiYWNrLWxlZnQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWxlZnQtb2YtY2VudGVyLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1yaWdodC1vZi1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgiYmFjay1jZW50ZXIsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCkgcy5hcHBlbmQoInNpZGUtbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCkgcy5hcHBlbmQoInNpZGUtcmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtY2VudGVyICwiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCkgcy5hcHBlbmQoInRvcC1mcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWZyb250LWNlbnRlciwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgidG9wLWZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUKSBzLmFwcGVuZCgidG9wLWJhY2stbGVmdCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1JJR0hUKSBzLmFwcGVuZCgicmlnaHQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fRlJPTlQpIHMuYXBwZW5kKCJmcm9udCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLKSBzLmFwcGVuZCgiYmFjaywgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCkgcy5hcHBlbmQoImxlZnQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1JJR0hUX1BST0NFU1NFRCkgcy5hcHBlbmQoInJpZ2h0LXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJmcm9udC1wcm9jZXNzZWQsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19QUk9DRVNTRUQpIHMuYXBwZW5kKCJiYWNrLXByb2Nlc3NlZCwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9QUkVTU1VSRSkgcy5hcHBlbmQoInByZXNzdXJlLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOworICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMpIHMuYXBwZW5kKCJaLCAiKTsKKyAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CisgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOworICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKKyAgICB9CisgICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgaWYgKHMubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgIGNoYXIgKnN0ciA9IHMubG9ja0J1ZmZlcihsZW4pOworICAgICAgICBzLnVubG9ja0J1ZmZlcihsZW4gLSAyKTsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC00MTMsNDggKzU3NywzMiBAQAogCiAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJ0aHJlYWQgJXAgbWF5YmUgZGVhZCBsb2NrZWRcbiIsIHRoaXMpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIGRwcmludGYoZmQsICJ0aHJlYWQgJXAgbWF5YmUgZGVhZCBsb2NrZWRcbiIsIHRoaXMpOwogICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImlvIGhhbmRsZTogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRJRDogJWRcbiIsIGdldFRpZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAic3RhbmRieTogJWRcbiIsIG1TdGFuZGJ5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkhBTCBmcmFtZSBjb3VudDogJWRcbiIsIG1GcmFtZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDaGFubmVsIE1hc2s6IDB4JTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZyYW1lIHNpemU6ICV1XG4iLCBtRnJhbWVTaXplKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblBlbmRpbmcgc2V0UGFyYW1ldGVycyBjb21tYW5kczogXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIEluZGV4IENvbW1hbmQiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OZXdQYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICUwMmQgICAgIiwgaSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChtTmV3UGFyYW1ldGVyc1tpXSk7CisgICAgZHByaW50ZihmZCwgIiAgSS9PIGhhbmRsZTogJWRcbiIsIG1JZCk7CisgICAgZHByaW50ZihmZCwgIiAgVElEOiAlZFxuIiwgZ2V0VGlkKCkpOworICAgIGRwcmludGYoZmQsICIgIFN0YW5kYnk6ICVzXG4iLCBtU3RhbmRieSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7CisgICAgZHByaW50ZihmZCwgIiAgSEFMIGZyYW1lIGNvdW50OiAlenVcbiIsIG1GcmFtZUNvdW50KTsKKyAgICBkcHJpbnRmKGZkLCAiICBIQUwgYnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgTWFzazogMHglMDh4ICglcylcbiIsIG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrVG9TdHJpbmcobUNoYW5uZWxNYXNrLCBtVHlwZSAhPSBSRUNPUkQpLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUhBTEZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUhBTEZvcm1hdCkpOworICAgIGRwcmludGYoZmQsICIgIEZyYW1lIHNpemU6ICV6dVxuIiwgbUZyYW1lU2l6ZSk7CisgICAgZHByaW50ZihmZCwgIiAgUGVuZGluZyBjb25maWcgZXZlbnRzOiIpOworICAgIHNpemVfdCBudW1Db25maWcgPSBtQ29uZmlnRXZlbnRzLnNpemUoKTsKKyAgICBpZiAobnVtQ29uZmlnKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKKyAgICAgICAgICAgIG1Db25maWdFdmVudHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiAgICAlcyIsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50ZihmZCwgIlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiBub25lXG4iKTsKICAgICB9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblxuUGVuZGluZyBjb25maWcgZXZlbnRzOiBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db25maWdFdmVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUNvbmZpZ0V2ZW50c1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQpAQCAtNDY2LDEwICs2MTQsMTEgQEAKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuLSAlZCBFZmZlY3QgQ2hhaW5zOlxuIiwgbUVmZmVjdENoYWlucy5zaXplKCkpOworICAgIHNpemVfdCBudW1FZmZlY3RDaGFpbnMgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICV6dSBFZmZlY3QgQ2hhaW5zXG4iLCBudW1FZmZlY3RDaGFpbnMpOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWZmZWN0Q2hhaW5zOyArK2kpIHsKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUVmZmVjdENoYWluc1tpXTsKICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgICAgIGNoYWluLT5kdW1wKGZkLCBhcmdzKTsKQEAgLTUxMywxMiArNjYyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGJpbmRlciwKICAgICAgICAgICAgICAgICAgICAgZ2V0V2FrZUxvY2tUYWcoKSwKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIm1lZGlhIiksCi0gICAgICAgICAgICAgICAgICAgIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+YWNxdWlyZVdha2VMb2NrKFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLAogICAgICAgICAgICAgICAgICAgICBnZXRXYWtlTG9ja1RhZygpLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigibWVkaWEiKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYSIpLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIEZJWE1FIGZvcmNlIG9uZXdheSBjb250cmFyeSB0byAuYWlkbCAqLyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CkBAIC01MzgsNyArNjg5LDggQEAKICAgICBpZiAobVdha2VMb2NrVG9rZW4gIT0gMCkgewogICAgICAgICBBTE9HVigicmVsZWFzZVdha2VMb2NrX2woKSAlcyIsIG1OYW1lKTsKICAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICB9CiAgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQpAQCAtNTc0LDcgKzcyNiw4IEBACiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSk7CisgICAgICAgIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkcyhtV2FrZUxvY2tUb2tlbiwgdWlkcy5zaXplKCksIHVpZHMuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwogICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtTmFtZSwgc3RhdHVzKTsKICAgICB9CiB9CkBAIC01ODYsNyArNzM5LDcgQEAKICAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UE1EZWF0aFJlY2lwaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtNzM5LDggKzg5Miw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgIGludCAqZW5hYmxlZCwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cwotICAgICAgICApCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiB7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CiAgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CkBAIC03NTYsNiArOTA4LDI0IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBEaXJlY3Qgb3V0cHV0IHRocmVhZHMgZm9yIG5vdywgc2luY2UgdGhlIGZvcm1hdCBvZgorICAgIC8vIG1TaW5rQnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlZmZlY3QgcHJvY2Vzc2luZyAoUENNIDE2IHN0ZXJlbykuCisgICAgaWYgKG1UeXBlID09IERJUkVDVCkgeworICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGVmZmVjdCAlcyBvbiBEaXJlY3Qgb3V0cHV0IHR5cGUgdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtTmFtZSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBvciBkdXBsaWNhdGluZyBtdWx0aWNoYW5uZWwgc2lua3MuCisgICAgLy8gVE9ETzogZml4IGJvdGggZm9ybWF0IGFuZCBtdWx0aWNoYW5uZWwgaXNzdWVzIHdpdGggZWZmZWN0cy4KKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSAmJiBtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CisgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgZWZmZWN0ICVzIGZvciBtdWx0aWNoYW5uZWwoJWQpICVzIHRocmVhZHMiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UeXBlID09IE1JWEVSID8gIk1JWEVSIiA6ICJEVVBMSUNBVElORyIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgLy8gQWxsb3cgZ2xvYmFsIGVmZmVjdHMgb25seSBvbiBvZmZsb2FkZWQgYW5kIG1peGVyIHRocmVhZHMKICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewogICAgICAgICBzd2l0Y2ggKG1UeXBlKSB7CkBAIC04MjksNyArOTk5LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIGVmZmVjdCBoYW5kbGUgYW5kIGNvbm5lY3QgaXQgdG8gZWZmZWN0IG1vZHVsZQogICAgICAgICBoYW5kbGUgPSBuZXcgRWZmZWN0SGFuZGxlKGVmZmVjdCwgY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5KTsKLSAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGVuYWJsZWQgIT0gTlVMTCkgewogICAgICAgICAgICAgKmVuYWJsZWQgPSAoaW50KWVmZmVjdC0+aXNFbmFibGVkKCk7CiAgICAgICAgIH0KQEAgLTg1MCw5ICsxMDIzLDcgQEAKICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCi0gICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCkBAIC05NzYsMjEgKzExNDcsMTggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkaXNjb25uZWN0RWZmZWN0KGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVucGluSWZMYXN0KSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJkaXNjb25uZWN0RWZmZWN0KCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKLSAgICAvLyBkZWxldGUgdGhlIGVmZmVjdCBtb2R1bGUgaWYgcmVtb3ZpbmcgbGFzdCBoYW5kbGUgb24gaXQKLSAgICBpZiAoZWZmZWN0LT5yZW1vdmVIYW5kbGUoaGFuZGxlKSA9PSAwKSB7Ci0gICAgICAgIGlmICghZWZmZWN0LT5pc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KSB7Ci0gICAgICAgICAgICByZW1vdmVFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOworICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBjb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgY29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7CiB9CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTAwMSw4ICsxMTY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUpCiAgICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgZGV2aWNlLCBBVURJT19ERVZJQ0VfTk9ORSwgdHlwZSksCi0gICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtTWl4QnVmZmVyKE5VTEwpLAotICAgICAgICBtQWxsb2NNaXhCdWZmZXIoTlVMTCksIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksCisgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtU2lua0J1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKKyAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSgwKSwKKyAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQoZmFsc2UpLAorICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCisgICAgICAgIG1FZmZlY3RCdWZmZXIoTlVMTCksCisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplKDApLAorICAgICAgICBtRWZmZWN0QnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9JTlZBTElEKSwKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkKGZhbHNlKSwKKyAgICAgICAgbVN1c3BlbmRlZCgwKSwgbUJ5dGVzV3JpdHRlbigwKSwKICAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbmVyYXRpb24oMCksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbU91dHB1dChvdXRwdXQpLApAQCAtMTA0NCwxMSArMTIyMiwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKKyAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICAvLyBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVF0gaXMgaW5pdGlhbGl6ZWQgYnkgc3RyZWFtX3R5cGVfdCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgLy8gVGhlcmUgaXMgbm8gQVVESU9fU1RSRUFNX01JTiwgYW5kICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKLSAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CiAgICAgICAgICAgICBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgKHN0cmVhbSArIDEpKSB7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbVZvbHVtZV9sKHN0cmVhbSk7CiAgICAgICAgIG1TdHJlYW1UeXBlc1tzdHJlYW1dLm11dGUgPSBtQXVkaW9GbGluZ2VyLT5zdHJlYW1NdXRlX2woc3RyZWFtKTsKQEAgLTEwNjAsNyArMTIzOCw5IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp+UGxheWJhY2tUaHJlYWQoKQogewogICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKLSAgICBkZWxldGUgW10gbUFsbG9jTWl4QnVmZmVyOworICAgIGZyZWUobVNpbmtCdWZmZXIpOworICAgIGZyZWUobU1peGVyQnVmZmVyKTsKKyAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQpAQCAtMTA3MCwxMyArMTI1MCwxMyBAQAogICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk91dHB1dCB0aHJlYWQgJXAgc3RyZWFtIHZvbHVtZXMgaW4gZEI6XG4gICAgIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBTdHJlYW0gdm9sdW1lcyBpbiBkQjogIik7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyArK2kpIHsKICAgICAgICAgY29uc3Qgc3RyZWFtX3R5cGVfdCAqc3QgPSAmbVN0cmVhbVR5cGVzW2ldOwogICAgICAgICBpZiAoaSA+IDApIHsKQEAgLTEwOTEsNzUgKzEyNzEsNjggQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogICAgIHJlc3VsdC5jbGVhcigpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOwotICAgICAgICBpZiAodHJhY2sgIT0gMCkgewotICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQogICAgIC8vIFRoZXNlIHZhbHVlcyBhcmUgInJhdyI7IHRoZXkgd2lsbCB3cmFwIGFyb3VuZC4gIFNlZSBwcmVwYXJlVHJhY2tzX2woKSBmb3IgYSBiZXR0ZXIgd2F5LgogICAgIEZhc3RUcmFja1VuZGVycnVucyB1bmRlcnJ1bnMgPSBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoMCk7Ci0gICAgZmRwcmludGYoZmQsICJOb3JtYWwgbWl4ZXIgcmF3IHVuZGVycnVuIGNvdW50ZXJzOiBwYXJ0aWFsPSV1IGVtcHR5PSV1XG4iLAorICAgIGRwcmludGYoZmQsICIgIE5vcm1hbCBtaXhlciByYXcgdW5kZXJydW4gY291bnRlcnM6IHBhcnRpYWw9JXUgZW1wdHk9JXVcbiIsCiAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCwgdW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5KTsKKworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgZHByaW50ZihmZCwgIiAgJWQgVHJhY2tzIiwgbnVtdHJhY2tzKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlc2VlbiA9IDA7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICVkIGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA+PSAwOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtYWN0aXZlc2VlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUsIGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgaWYgKG51bWFjdGl2ZXNlZW4gIT0gbnVtYWN0aXZlKSB7CisgICAgICAgIC8vIHNvbWUgdHJhY2tzIGluIHRoZSBhY3RpdmUgbGlzdCB3ZXJlIG5vdCBpbiB0aGUgdHJhY2tzIGxpc3QKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXS5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCAmJiBtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dCB0aHJlYWQgJXAgaW50ZXJuYWxzXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTm9ybWFsIGZyYW1lIGNvdW50OiAlZFxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJsYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCi0gICAgICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJ0b3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiZGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgImJsb2NrZWQgaW4gd3JpdGU6ICVkXG4iLCBtSW5Xcml0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgInN1c3BlbmQgY291bnQ6ICVkXG4iLCBtU3VzcGVuZGVkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibWl4IGJ1ZmZlciA6ICVwXG4iLCBtTWl4QnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZmRwcmludGYoZmQsICJGYXN0IHRyYWNrIGF2YWlsTWFzaz0lI3hcbiIsIG1GYXN0VHJhY2tBdmFpbE1hc2spOworICAgIGRwcmludGYoZmQsICJcbk91dHB1dCB0aHJlYWQgJXA6XG4iLCB0aGlzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwgbnMybXMoc3lzdGVtVGltZSgpIC0gbUxhc3RXcml0ZVRpbWUpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBUb3RhbCB3cml0ZXM6ICVkXG4iLCBtTnVtV3JpdGVzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBEZWxheWVkIHdyaXRlczogJWRcbiIsIG1OdW1EZWxheWVkV3JpdGVzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBCbG9ja2VkIGluIHdyaXRlOiAlc1xuIiwgbUluV3JpdGUgPyAieWVzIiA6ICJubyIpOworICAgIGRwcmludGYoZmQsICIgIFN1c3BlbmQgY291bnQ6ICVkXG4iLCBtU3VzcGVuZGVkKTsKKyAgICBkcHJpbnRmKGZkLCAiICBTaW5rIGJ1ZmZlciA6ICVwXG4iLCBtU2lua0J1ZmZlcik7CisgICAgZHByaW50ZihmZCwgIiAgTWl4ZXIgYnVmZmVyOiAlcFxuIiwgbU1peGVyQnVmZmVyKTsKKyAgICBkcHJpbnRmKGZkLCAiICBFZmZlY3QgYnVmZmVyOiAlcFxuIiwgbUVmZmVjdEJ1ZmZlcik7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKIAogICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKIH0KIAogLy8gVGhyZWFkIHZpcnR1YWxzCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dJKCJBdWRpb0ZsaW5nZXIncyB0aHJlYWQgJXAgcmVhZHkgdG8gcnVuIiwgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIk5vIHdvcmtpbmcgYXVkaW8gZHJpdmVyIGZvdW5kLiIpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewpAQCAtMTE4Miw3ICsxMzU1LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLApAQCAtMTE5MCw2ICsxMzYzLDcgQEAKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIApAQCAtMTIxNSwxMyArMTM4OSwxMiBAQAogICAgICAgICAgICAgKSAmJgogICAgICAgICAgICAgLy8gUENNIGRhdGEKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgotICAgICAgICAgICAgLy8gbW9ubyBvciBzdGVyZW8KLSAgICAgICAgICAgICggKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8Ci0gICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pICkgJiYKLSNpZm5kZWYgRkFTVF9UUkFDS1NfQVRfTk9OX05BVElWRV9TQU1QTEVfUkFURQorICAgICAgICAgICAgLy8gaWRlbnRpY2FsIGNoYW5uZWwgbWFzayB0byBzaW5rLCBvciBtb25vIGluIGFuZCBzdGVyZW8gc2luaworICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzayB8fAorICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgc2FtcGxlIHJhdGUKICAgICAgICAgICAgIChzYW1wbGVSYXRlID09IG1TYW1wbGVSYXRlKSAmJgotI2VuZGlmCiAgICAgICAgICAgICAvLyBub3JtYWwgbWl4ZXIgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBtaXhlcgogICAgICAgICAgICAgaGFzRmFzdE1peGVyKCkgJiYKICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBzdWZmaWNpZW50IGZhc3QgdHJhY2sgc2xvdHMgYXZhaWxhYmxlCkBAIC0xMjMxLDE1ICsxNDA0LDIxIEBACiAgICAgICAgICkgewogICAgICAgICAvLyBpZiBmcmFtZUNvdW50IG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMgdG8gZmFzdCBtaXhlciAoSEFMKSBmcmFtZSBjb3VudAogICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQgKiBrRmFzdFRyYWNrTXVsdGlwbGllcjsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIGZhc3QgdHJhY2sgbXVsdGlwbGllciBwcm9wZXJ0eSB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQKKyAgICAgICAgICAgIGludCBvayA9IHB0aHJlYWRfb25jZSgmc0Zhc3RUcmFja011bHRpcGxpZXJPbmNlLCBzRmFzdFRyYWNrTXVsdGlwbGllckluaXQpOworICAgICAgICAgICAgaWYgKG9rICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgcHRocmVhZF9vbmNlIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgb2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICogc0Zhc3RUcmFja011bHRpcGxpZXI7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JWQgbUZyYW1lQ291bnQ9JWQiLAogICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZDogaXNUaW1lZD0lZCBzaGFyZWRCdWZmZXI9JXAgZnJhbWVDb3VudD0lZCAiCi0gICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lZCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCisgICAgICAgICAgICAgICAgIm1GcmFtZUNvdW50PSVkIGZvcm1hdD0lI3ggbUZvcm1hdD0lI3ggaXNMaW5lYXI9JWQgY2hhbm5lbE1hc2s9JSN4ICIKKyAgICAgICAgICAgICAgICAic2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCiAgICAgICAgICAgICAgICAgImhhc0Zhc3RNaXhlcj0lZCB0aWQ9JWQgZmFzdFRyYWNrQXZhaWxNYXNrPSUjeCIsCi0gICAgICAgICAgICAgICAgaXNUaW1lZCwgc2hhcmVkQnVmZmVyLmdldCgpLCBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCwgZm9ybWF0LAorICAgICAgICAgICAgICAgIGlzVGltZWQsIHNoYXJlZEJ1ZmZlci5nZXQoKSwgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwgbUZvcm1hdCwKICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKICAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwpAQCAtMTI1OCw0NCArMTQzNyw1MiBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAKLSAgICBpZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGlmICgoZm9ybWF0ICYgQVVESU9fRk9STUFUX01BSU5fTUFTSykgPT0gQVVESU9fRk9STUFUX1BDTSkgeworICAgIHN3aXRjaCAobVR5cGUpIHsKKworICAgIGNhc2UgRElSRUNUOgorICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IHNhbXBsZVJhdGUgJXUgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAweCUwOHggIgotICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAldSBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCUwOHggIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG1PdXRwdXQsIG1Gb3JtYXQpOwogICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPRkZMT0FEOgogICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSB8fCBmb3JtYXQgIT0gbUZvcm1hdCB8fCBjaGFubmVsTWFzayAhPSBtQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgQmFkIHBhcmFtZXRlcjogc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKLSAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrIDB4JTA4eCBcIiIKKyAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJSN4IiwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKChmb3JtYXQgJiBBVURJT19GT1JNQVRfTUFJTl9NQVNLKSAhPSBBVURJT19GT1JNQVRfUENNKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBmb3JtYXQgJWQgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlZCIsCisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6IGZvcm1hdCAlI3ggXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG91dHB1dCAlcCB3aXRoIGZvcm1hdCAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBtT3V0cHV0LCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgICAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgotICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+IG1TYW1wbGVSYXRlKjIpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewogICAgICAgICAgICAgQUxPR0UoIlNhbXBsZSByYXRlIG91dCBvZiByYW5nZTogJXUgbVNhbXBsZVJhdGUgJXUiLCBzYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CisgICAgICAgIGJyZWFrOworCiAgICAgfQogCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIApAQCAtMTMwOCw3ICsxNDk1LDcgQEAKICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtVHlwZSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHQgPSBtVHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKHQgIT0gMCAmJiAhdC0+aXNPdXRwdXRUcmFjaygpKSB7CisgICAgICAgICAgICBpZiAodCAhPSAwICYmIHQtPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0dWFsID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHQtPnN0cmVhbVR5cGUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0LT5zZXNzaW9uSWQoKSAmJiBzdHJhdGVneSAhPSBhY3R1YWwpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrX2woKSBtaXNtYXRjaGVkIHN0cmF0ZWd5OyBleHBlY3RlZCAldSBidXQgZm91bmQgJXUiLApAQCAtMTMyMSwxOCArMTUwOCwyMSBAQAogCiAgICAgICAgIGlmICghaXNUaW1lZCkgewogICAgICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIE5VTEwsIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxUKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyYWNrID0gVGltZWRUcmFjazo6Y3JlYXRlKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhY2sgPT0gMCB8fCB0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKLSAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgIC8vIG5ldyBUcmFjayBhbHdheXMgcmV0dXJucyBub24tTlVMTCwKKyAgICAgICAgLy8gYnV0IFRpbWVkVHJhY2s6OmNyZWF0ZSgpIGlzIGEgZmFjdG9yeSB0aGF0IGNvdWxkIGZhaWwgYnkgcmV0dXJuaW5nIE5VTEwKKyAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKKyAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgaW5pdENoZWNrIGZhaWxlZCAlZDsgbm8gY29udHJvbCBibG9jaz8iLCBsU3RhdHVzKTsKICAgICAgICAgICAgIC8vIHRyYWNrIG11c3QgYmUgY2xlYXJlZCBmcm9tIHRoZSBjYWxsZXIgYXMgdGhlIGNhbGxlciBoYXMgdGhlIEFGIGxvY2sKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotCiAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKIAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CkBAIC0xMzU0LDkgKzE1NDQsNyBAQAogICAgIGxTdGF0dXMgPSBOT19FUlJPUjsKIAogRXhpdDoKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKQEAgLTE0MzQsNyArMTYyMiw3IEBACiAgICAgICAgIC8vIHRoZSB0cmFjayBpcyBuZXdseSBhZGRlZCwgbWFrZSBzdXJlIGl0IGZpbGxzIHVwIGFsbCBpdHMKICAgICAgICAgLy8gYnVmZmVycyBiZWZvcmUgcGxheWluZy4gVGhpcyBpcyB0byBlbnN1cmUgdGhlIGNsaWVudCB3aWxsCiAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IGdldCB0aGUgbGF0ZW5jeSBpdCByZXF1ZXN0ZWQuCi0gICAgICAgIGlmICghdHJhY2stPmlzT3V0cHV0VHJhY2soKSkgeworICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBUcmFja0Jhc2U6OnRyYWNrX3N0YXRlIHN0YXRlID0gdHJhY2stPm1TdGF0ZTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKQEAgLTE0NzUsOSArMTY2Myw3IEBACiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIAotICAgIEFMT0dWKCJzaWduYWwgcGxheWJhY2sgdGhyZWFkIik7Ci0gICAgYnJvYWRjYXN0X2woKTsKLQorICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0ODksNyArMTY3NSw3IEBACiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICBpZiAoIXRyYWNrQWN0aXZlKSB7CiAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOwotICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkgfHwgdHJhY2stPmlzT2ZmbG9hZGVkKCkpIHsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpIHx8IHRyYWNrLT5pc09mZmxvYWRlZCgpIHx8IHRyYWNrLT5pc0RpcmVjdCgpKSB7CiAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7CiAgICAgfQogCkBAIC0xNTQwLDEyICsxNzI2LDExIEBACiAgICAgcmV0dXJuIG91dF9zODsKIH0KIAotLy8gYXVkaW9Db25maWdDaGFuZ2VkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0pIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CiAKLSAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAorICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkLCBwYXJhbSAlZCIsIHRoaXMsIGV2ZW50LAogICAgICAgICAgICAgcGFyYW0pOwogCiAgICAgc3dpdGNoIChldmVudCkgewpAQCAtMTU1Niw3ICsxNzQxLDcgQEAKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsgLy8gRklYTUUgc2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QpCi0gICAgICAgIGRlc2MubGF0ZW5jeSA9IGxhdGVuY3koKTsKKyAgICAgICAgZGVzYy5sYXRlbmN5ID0gbGF0ZW5jeV9sKCk7CiAgICAgICAgIHBhcmFtMiA9ICZkZXNjOwogICAgICAgICBicmVhazsKIApAQCAtMTU2Niw3ICsxNzUxLDcgQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp3cml0ZUNhbGxiYWNrKCkKQEAgLTE2MDMsNyArMTc4OCw3IEBACiAKIC8vIHN0YXRpYwogaW50IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmFtIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQogewogICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKm1lID0gKEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKiljb29raWU7CkBAIC0xNjIyLDI5ICsxODA3LDMzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19GQVRBTAorICAgIC8vIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3ZlcmluZyBmcm9tIGVycm9ycyBoZXJlLCBoZW5jZSB0aGUgTE9HX0FMV0FZU19GQVRBTAogICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUNoYW5uZWxNYXNrID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIExPR19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1DaGFubmVsTWFzayk7CiAgICAgfQotICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpICYmIG1DaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgTE9HX0ZBVEFMKCJIQUwgY2hhbm5lbCBtYXNrICUjeCBub3Qgc3VwcG9ydGVkIGZvciBtaXhlZCBvdXRwdXQ7ICIKLSAgICAgICAgICAgICAgICAibXVzdCBiZSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLCBtQ2hhbm5lbE1hc2spOworICAgIGlmICgobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpCisgICAgICAgICAgICAmJiAhaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCBzdXBwb3J0ZWQgZm9yIG1peGVkIG91dHB1dCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrKTsKICAgICB9Ci0gICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7Ci0gICAgbUZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUhBTEZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtRm9ybWF0KTsKICAgICB9Ci0gICAgaWYgKChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBEVVBMSUNBVElORykgJiYgbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBMT0dfRkFUQUwoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0OyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwKKyAgICBpZiAoKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKQorICAgICAgICAgICAgJiYgIWlzVmFsaWRQY21TaW5rRm9ybWF0KG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0IiwKICAgICAgICAgICAgICAgICBtRm9ybWF0KTsKICAgICB9Ci0gICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKSAvIG1GcmFtZVNpemU7CisgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtT3V0cHV0LT5zdHJlYW0pOworICAgIG1CdWZmZXJTaXplID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2J1ZmZlcl9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7CiAgICAgaWYgKG1GcmFtZUNvdW50ICYgMTUpIHsKICAgICAgICAgQUxPR1coIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgaXMgJXUgZnJhbWVzIGJ1dCBBdWRpb01peGVyIHJlcXVpcmVzIG11bHRpcGxlcyBvZiAxNiBmcmFtZXMiLAogICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKQEAgLTE2NTksMTIgKzE4NDgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBtaXggYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgLy8gQ2FsY3VsYXRlIHNpemUgb2Ygbm9ybWFsIHNpbmsgYnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBIQUwgb3V0cHV0IGJ1ZmZlciBzaXplCiAgICAgZG91YmxlIG11bHRpcGxpZXIgPSAxLjA7CiAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmIChrVXNlRmFzdE1peGVyID09IEZhc3RNaXhlcl9TdGF0aWMgfHwKICAgICAgICAgICAgIGtVc2VGYXN0TWl4ZXIgPT0gRmFzdE1peGVyX0R5bmFtaWMpKSB7Ci0gICAgICAgIHNpemVfdCBtaW5Ob3JtYWxGcmFtZUNvdW50ID0gKGtNaW5Ob3JtYWxNaXhCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOwotICAgICAgICBzaXplX3QgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IChrTWF4Tm9ybWFsTWl4QnVmZmVyU2l6ZU1zICogbVNhbXBsZVJhdGUpIC8gMTAwMDsKKyAgICAgICAgc2l6ZV90IG1pbk5vcm1hbEZyYW1lQ291bnQgPSAoa01pbk5vcm1hbFNpbmtCdWZmZXJTaXplTXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICBzaXplX3QgbWF4Tm9ybWFsRnJhbWVDb3VudCA9IChrTWF4Tm9ybWFsU2lua0J1ZmZlclNpemVNcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgIC8vIHJvdW5kIHVwIG1pbmltdW0gYW5kIHJvdW5kIGRvd24gbWF4aW11bSB0byBuZWFyZXN0IDE2IGZyYW1lcyB0byBzYXRpc2Z5IEF1ZGlvTWl4ZXIKICAgICAgICAgbWluTm9ybWFsRnJhbWVDb3VudCA9IChtaW5Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OwogICAgICAgICBtYXhOb3JtYWxGcmFtZUNvdW50ID0gbWF4Tm9ybWFsRnJhbWVDb3VudCAmIH4xNTsKQEAgLTE2ODIsNyArMTg3MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBwcmVmZXIgYW4gZXZlbiBtdWx0aXBsaWVyLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGRvdWJsaW5nIG9mIGZhc3QgdHJhY2tzIGR1ZSB0byBIQUwKLSAgICAgICAgICAgIC8vIFNSQyAoaXQgd291bGQgYmUgdW51c3VhbCBmb3IgdGhlIG5vcm1hbCBtaXggYnVmZmVyIHNpemUgdG8gbm90IGJlIGEgbXVsdGlwbGUgb2YgZmFzdAorICAgICAgICAgICAgLy8gU1JDIChpdCB3b3VsZCBiZSB1bnVzdWFsIGZvciB0aGUgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgdG8gbm90IGJlIGEgbXVsdGlwbGUgb2YgZmFzdAogICAgICAgICAgICAgLy8gdHJhY2ssIGJ1dCB3ZSBzb21ldGltZXMgaGF2ZSB0byBkbyB0aGlzIHRvIHNhdGlzZnkgdGhlIG1heGltdW0gZnJhbWUgY291bnQKICAgICAgICAgICAgIC8vIGNvbnN0cmFpbnQpCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIHJvdW5kaW5nIHVwIHNob3VsZCBub3QgYmUgZG9uZSBpZiBubyBIQUwgU1JDCkBAIC0xNjk3LDE5ICsxODg2LDQzIEBACiAgICAgfQogICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gbXVsdGlwbGllciAqIG1GcmFtZUNvdW50OwogICAgIC8vIHJvdW5kIHVwIHRvIG5lYXJlc3QgMTYgZnJhbWVzIHRvIHNhdGlzZnkgQXVkaW9NaXhlcgotICAgIG1Ob3JtYWxGcmFtZUNvdW50ID0gKG1Ob3JtYWxGcmFtZUNvdW50ICsgMTUpICYgfjE1OwotICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIG1peCBidWZmZXIgc2l6ZSAldSBmcmFtZXMiLCBtRnJhbWVDb3VudCwKKyAgICBpZiAobVR5cGUgPT0gTUlYRVIgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcpIHsKKyAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgPSAobU5vcm1hbEZyYW1lQ291bnQgKyAxNSkgJiB+MTU7CisgICAgfQorICAgIEFMT0dJKCJIQUwgb3V0cHV0IGJ1ZmZlciBzaXplICV1IGZyYW1lcywgbm9ybWFsIHNpbmsgYnVmZmVyIHNpemUgJXUgZnJhbWVzIiwgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCk7CiAKLSAgICBkZWxldGVbXSBtQWxsb2NNaXhCdWZmZXI7Ci0gICAgc2l6ZV90IGFsaWduID0gKG1GcmFtZVNpemUgPCBzaXplb2YoaW50MTZfdCkpID8gc2l6ZW9mKGludDE2X3QpIDogbUZyYW1lU2l6ZTsKLSAgICBtQWxsb2NNaXhCdWZmZXIgPSBuZXcgaW50OF90W21Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSArIGFsaWduIC0gMV07Ci0gICAgbU1peEJ1ZmZlciA9IChpbnQxNl90ICopICgoKChzaXplX3QpbUFsbG9jTWl4QnVmZmVyICsgYWxpZ24gLSAxKSAvIGFsaWduKSAqIGFsaWduKTsKLSAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAvLyBtU2lua0J1ZmZlciBpcyB0aGUgc2luayBidWZmZXIuICBTaXplIGlzIGFsd2F5cyBtdWx0aXBsZS1vZi0xNiBmcmFtZXMuCisgICAgLy8gT3JpZ2luYWxseSB0aGlzIHdhcyBpbnQxNl90W10gYXJyYXksIG5lZWQgdG8gcmVtb3ZlIGxlZ2FjeSBpbXBsaWNhdGlvbnMuCisgICAgZnJlZShtU2lua0J1ZmZlcik7CisgICAgbVNpbmtCdWZmZXIgPSBOVUxMOworICAgIC8vIEZvciBzaW5rIGJ1ZmZlciBzaXplLCB3ZSB1c2UgdGhlIGZyYW1lIHNpemUgZnJvbSB0aGUgZG93bnN0cmVhbSBzaW5rIHRvIGF2b2lkIHByb2JsZW1zCisgICAgLy8gd2l0aCBub24gUENNIGZvcm1hdHMgZm9yIGNvbXByZXNzZWQgbXVzaWMsIGUuZy4gQUFDLCBhbmQgT2ZmbG9hZCB0aHJlYWRzLgorICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBzaW5rQnVmZmVyU2l6ZSk7CisKKyAgICAvLyBXZSByZXNpemUgdGhlIG1NaXhlckJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgc2luayBidWZmZXIgd2hpY2gKKyAgICAvLyBkcml2ZXMgdGhlIG91dHB1dC4KKyAgICBmcmVlKG1NaXhlckJ1ZmZlcik7CisgICAgbU1peGVyQnVmZmVyID0gTlVMTDsKKyAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCkgeworICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBhbHNvIHZhbGlkOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICAgICAgbU1peGVyQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CisgICAgbUVmZmVjdEJ1ZmZlciA9IE5VTEw7CisgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgIG1FZmZlY3RCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gTm90ZTogRWZmZWN0cyBzdXBwb3J0IDE2YiBvbmx5CisgICAgICAgIG1FZmZlY3RCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1FZmZlY3RCdWZmZXJGb3JtYXQpOworICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKKyAgICB9CiAKICAgICAvLyBmb3JjZSByZWNvbmZpZ3VyYXRpb24gb2YgZWZmZWN0IGNoYWlucyBhbmQgZW5naW5lcyB0byB0YWtlIG5ldyBidWZmZXIgc2l6ZSBhbmQgYXVkaW8KICAgICAvLyBwYXJhbWV0ZXJzIGludG8gYWNjb3VudAotICAgIC8vIE5vdGUgdGhhdCBtTG9jayBpcyBub3QgaGVsZCB3aGVuIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCisgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgogICAgIC8vIGJ1dCBpbiB0aGlzIGNhc2Ugbm90aGluZyBpcyBkb25lIGJlbG93IGFzIG5vIGF1ZGlvIHNlc3Npb25zIGhhdmUgZWZmZWN0IHlldCBzbyBpdCBkb2Vzbid0CiAgICAgLy8gbWF0dGVyLgogICAgIC8vIGNyZWF0ZSBhIGNvcHkgb2YgbUVmZmVjdENoYWlucyBhcyBjYWxsaW5nIG1vdmVFZmZlY3RDaGFpbl9sKCkgY2FuIHJlb3JkZXIgc29tZSBlZmZlY3QgY2hhaW5zCkBAIC0xNzIwLDcgKzE5MzMsNyBAQAogfQogCiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHNpemVfdCAqaGFsRnJhbWVzLCBzaXplX3QgKmRzcEZyYW1lcykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpCiB7CiAgICAgaWYgKGhhbEZyYW1lcyA9PSBOVUxMIHx8IGRzcEZyYW1lcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNzM4LDcgKzE5NTEsMTEgQEAKICAgICAgICAgKmRzcEZyYW1lcyA9IGZyYW1lc1dyaXR0ZW4gPj0gbGF0ZW5jeUZyYW1lcyA/IGZyYW1lc1dyaXR0ZW4gLSBsYXRlbmN5RnJhbWVzIDogMDsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0LT5zdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obU91dHB1dC0+c3RyZWFtLCBkc3BGcmFtZXMpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIHVpbnQzMl90IGZyYW1lczsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1PdXRwdXQtPnN0cmVhbSwgJmZyYW1lcyk7CisgICAgICAgICpkc3BGcmFtZXMgPSAoc2l6ZV90KWZyYW1lczsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiB9CiAKQEAgLTE4MzksMTAgKzIwNTYsMTAgQEAKICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7CiAgICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCkgeworICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXRyYWNrLT5pc091dHB1dFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCkBAIC0xODgwLDEyICsyMDk3LDEzIEBACiAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgbUluV3JpdGUgPSB0cnVlOwogICAgIHNzaXplX3QgYnl0ZXNXcml0dGVuOworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSBtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nOwogCiAgICAgLy8gSWYgYW4gTkJBSU8gc2luayBpcyBwcmVzZW50LCB1c2UgaXQgdG8gd3JpdGUgdGhlIG5vcm1hbCBtaXhlcidzIHN1Ym1peAogICAgIGlmIChtTm9ybWFsU2luayAhPSAwKSB7Ci0jZGVmaW5lIG1CaXRTaGlmdCAyIC8vIEZJWE1FCi0gICAgICAgIHNpemVfdCBjb3VudCA9IG1CeXRlc1JlbWFpbmluZyA+PiBtQml0U2hpZnQ7Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSAobUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZykgPj4gMTsKKworICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBtQnl0ZXNSZW1haW5pbmcgLyBtRnJhbWVTaXplOworCiAgICAgICAgIEFUUkFDRV9CRUdJTigid3JpdGUiKTsKICAgICAgICAgLy8gdXBkYXRlIHRoZSBzZXRwb2ludCB3aGVuIEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlIGNoYW5nZXMKICAgICAgICAgdWludDMyX3Qgc2NyZWVuU3RhdGUgPSBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZTsKQEAgLTE4OTcsMTAgKzIxMTUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChwaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPndyaXRlKG1NaXhCdWZmZXIgKyBvZmZzZXQsIGNvdW50KTsKKyAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIGNvdW50KTsKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+IDApIHsKLSAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gPDwgbUJpdFNoaWZ0OworICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOwogICAgICAgICB9CkBAIC0xOTA5LDEzICsyMTI3LDE0IEBACiAgICAgICAgICAgICBzaXplX3QgdG90YWxGcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPmZyYW1lc1dyaXR0ZW4oKTsKICAgICAgICAgICAgIGlmICh0b3RhbEZyYW1lc1dyaXR0ZW4gPj0gbUxhdGNoRC5tVGltZXN0YW1wLm1Qb3NpdGlvbikgewogICAgICAgICAgICAgICAgIG1MYXRjaEQubVVucHJlc2VudGVkRnJhbWVzID0gdG90YWxGcmFtZXNXcml0dGVuIC0gbUxhdGNoRC5tVGltZXN0YW1wLm1Qb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAvLyBtTGF0Y2hELm1GcmFtZXNSZWxlYXNlZCBpcyBzZXQgaW1tZWRpYXRlbHkgYmVmb3JlIEQgaXMgY2xvY2tlZCBpbnRvIFEKICAgICAgICAgICAgICAgICBtTGF0Y2hEVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgSEFMIC8gQXVkaW9TdHJlYW1PdXQgZGlyZWN0bHkKICAgICB9IGVsc2UgewogICAgICAgICAvLyBEaXJlY3Qgb3V0cHV0IGFuZCBvZmZsb2FkIHRocmVhZHMKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IChtQ3VycmVudFdyaXRlTGVuZ3RoIC0gbUJ5dGVzUmVtYWluaW5nKTsKKwogICAgICAgICBpZiAobVVzZUFzeW5jV3JpdGUpIHsKICAgICAgICAgICAgIEFMT0dXX0lGKG1Xcml0ZUFja1NlcXVlbmNlICYgMSwgInRocmVhZExvb3Bfd3JpdGUoKTogb3V0IG9mIHNlcXVlbmNlIHdyaXRlIHJlcXVlc3QiKTsKICAgICAgICAgICAgIG1Xcml0ZUFja1NlcXVlbmNlICs9IDI7CkBAIC0xOTI2LDcgKzIxNDUsNyBAQAogICAgICAgICAvLyBGSVhNRSBXZSBzaG91bGQgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lc3RhbXBzIGZvciBkaXJlY3Qgb3V0cHV0IHRocmVhZHMuCiAgICAgICAgIC8vIFRoZXkgYXJlIHVzZWQgZS5nIGZvciBtdWx0aWNoYW5uZWwgUENNIHBsYXliYWNrIG92ZXIgSERNSS4KICAgICAgICAgYnl0ZXNXcml0dGVuID0gbU91dHB1dC0+c3RyZWFtLT53cml0ZShtT3V0cHV0LT5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1NaXhCdWZmZXIgKyBvZmZzZXQsIG1CeXRlc1JlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBtQnl0ZXNSZW1haW5pbmcpOwogICAgICAgICBpZiAobVVzZUFzeW5jV3JpdGUgJiYKICAgICAgICAgICAgICAgICAoKGJ5dGVzV3JpdHRlbiA8IDApIHx8IChieXRlc1dyaXR0ZW4gPT0gKHNzaXplX3QpbUJ5dGVzUmVtYWluaW5nKSkpIHsKICAgICAgICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciBhc3luYyBjYWxsYmFjayBpbiBjYXNlIG9mIGVycm9yIG9mIGZ1bGwgd3JpdGUKQEAgLTE5NjUsNyArMjE4NCw3IEBACiAKIC8qCiBUaGUgZGVyaXZlZCB2YWx1ZXMgdGhhdCBhcmUgY2FjaGVkOgotIC0gbWl4QnVmZmVyU2l6ZSBmcm9tIGZyYW1lIGNvdW50ICogZnJhbWUgc2l6ZQorIC0gbVNpbmtCdWZmZXJTaXplIGZyb20gZnJhbWUgY291bnQgKiBmcmFtZSBzaXplCiAgLSBhY3RpdmVTbGVlcFRpbWUgZnJvbSBhY3RpdmVTbGVlcFRpbWVVcygpCiAgLSBpZGxlU2xlZXBUaW1lIGZyb20gaWRsZVNsZWVwVGltZVVzKCkKICAtIHN0YW5kYnlEZWxheSBmcm9tIG1BY3RpdmVTbGVlcFRpbWVVcyAoRElSRUNUIG9ubHkpCkBAIC0xOTg0LDcgKzIyMDMsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNhY2hlUGFyYW1ldGVyc19sKCkKIHsKLSAgICBtaXhCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtRnJhbWVTaXplOworICAgIG1TaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICBhY3RpdmVTbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWVVcygpOwogICAgIGlkbGVTbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lVXMoKTsKIH0KQEAgLTIwMDcsMTMgKzIyMjYsMTQgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICBpbnQgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKLSAgICBpbnQxNl90ICpidWZmZXIgPSBtTWl4QnVmZmVyOworICAgIGludDE2X3QqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1FZmZlY3RCdWZmZXJFbmFibGVkCisgICAgICAgICAgICA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlcik7CiAgICAgYm9vbCBvd25zQnVmZmVyID0gZmFsc2U7CiAKICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKICAgICBpZiAoc2Vzc2lvbiA+IDApIHsKICAgICAgICAgLy8gT25seSBvbmUgZWZmZWN0IGNoYWluIGNhbiBiZSBwcmVzZW50IGluIGRpcmVjdCBvdXRwdXQgdGhyZWFkIGFuZCBpdCB1c2VzCi0gICAgICAgIC8vIHRoZSBtaXggYnVmZmVyIGFzIGlucHV0CisgICAgICAgIC8vIHRoZSBzaW5rIGJ1ZmZlciBhcyBpbnB1dAogICAgICAgICBpZiAobVR5cGUgIT0gRElSRUNUKSB7CiAgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBpbnQxNl90W251bVNhbXBsZXNdOwpAQCAtMjA0NSw5ICsyMjY1LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBjaGFpbi0+c2V0VGhyZWFkKHRoaXMpOwogICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihidWZmZXIsIG93bnNCdWZmZXIpOwotICAgIGNoYWluLT5zZXRPdXRCdWZmZXIobU1peEJ1ZmZlcik7CisgICAgY2hhaW4tPnNldE91dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtRWZmZWN0QnVmZmVyRW5hYmxlZAorICAgICAgICAgICAgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXIpKTsKICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgaW5zZXJ0ZWQgYXQgZW5kIG9mIGVmZmVjdAogICAgIC8vIGNoYWlucyBsaXN0IGluIG9yZGVyIHRvIGJlIHByb2Nlc3NlZCBsYXN0IGFzIGl0IGNvbnRhaW5zIG91dHB1dCBzdGFnZSBlZmZlY3RzCiAgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBpbnNlcnRlZCBiZWZvcmUKQEAgLTIwOTcsNyArMjMxOCw3IEBACiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihtTWl4QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgY2hhaW4tPmRlY1RyYWNrQ250KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjE4NywyOCArMjQwOCwzNiBAQAogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCi0gICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKLQogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCisgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKwogICAgICAgICAgICAgaWYgKGxvZ1N0cmluZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbU5CTG9nV3JpdGVyLT5sb2dUaW1lc3RhbXAoKTsKICAgICAgICAgICAgICAgICBtTkJMb2dXcml0ZXItPmxvZyhsb2dTdHJpbmcpOwogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEdhdGhlciB0aGUgZnJhbWVzUmVsZWFzZWQgY291bnRlcnMgZm9yIGFsbCBhY3RpdmUgdHJhY2tzLAorICAgICAgICAgICAgLy8gYW5kIGxhdGNoIHRoZW0gYXRvbWljYWxseSB3aXRoIHRoZSB0aW1lc3RhbXAuCisgICAgICAgICAgICAvLyBGSVhNRSBXZSdyZSB1c2luZyByYXcgcG9pbnRlcnMgYXMgaW5kaWNlcy4gQSB1bmlxdWUgdHJhY2sgSUQgd291bGQgYmUgYSBiZXR0ZXIgaW5kZXguCisgICAgICAgICAgICBtTGF0Y2hELm1GcmFtZXNSZWxlYXNlZC5jbGVhcigpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXRjaEQubUZyYW1lc1JlbGVhc2VkLmFkZCh0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtTGF0Y2hEVmFsaWQpIHsKICAgICAgICAgICAgICAgICBtTGF0Y2hRID0gbUxhdGNoRDsKICAgICAgICAgICAgICAgICBtTGF0Y2hEVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtTGF0Y2hRVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSkgewotICAgICAgICAgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNhdmVPdXRwdXRUcmFja3MoKTsKICAgICAgICAgICAgIGlmIChtU2lnbmFsUGVuZGluZykgewogICAgICAgICAgICAgICAgIC8vIEEgc2lnbmFsIHdhcyByYWlzZWQgd2hpbGUgd2Ugd2VyZSB1bmxvY2tlZApAQCAtMjMwMCwxNCArMjUyOSwzMiBAQAogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd3JpdHRlbiB0byBIQUwKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1TaW5rQnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFaXRoZXIgdGhyZWFkTG9vcF9taXgoKSBvciB0aHJlYWRMb29wX3NsZWVwVGltZSgpIHNob3VsZCBoYXZlIHNldAorICAgICAgICAgICAgLy8gbU1peGVyQnVmZmVyIHdpdGggZGF0YSBpZiBtTWl4ZXJCdWZmZXJWYWxpZCBpcyB0cnVlIGFuZCBzbGVlcFRpbWUgPT0gMC4KKyAgICAgICAgICAgIC8vIE1lcmdlIG1NaXhlckJ1ZmZlciBkYXRhIGludG8gbUVmZmVjdEJ1ZmZlciAoaWYgYW55IGVmZmVjdHMgYXJlIHZhbGlkKQorICAgICAgICAgICAgLy8gb3IgbVNpbmtCdWZmZXIgKGlmIHRoZXJlIGFyZSBubyBlZmZlY3RzKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgcHJlLWVmZmVjdHMgY29tcHV0YXRpb247IGlmIGVmZmVjdHMgY2hhbmdlIHRvCisgICAgICAgICAgICAvLyBzdXBwb3J0IGhpZ2hlciBwcmVjaXNpb24sIHRoaXMgbmVlZHMgdG8gbW92ZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXJWYWxpZCBpcyBvbmx5IHNldCB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKS4KKyAgICAgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICAgICAgaWYgKG1NaXhlckJ1ZmZlclZhbGlkKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlciA6IG1TaW5rQnVmZmVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1FZmZlY3RCdWZmZXJWYWxpZCA/IG1FZmZlY3RCdWZmZXJGb3JtYXQgOiBtRm9ybWF0OworCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIGZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwogICAgICAgICAgICAgaWYgKGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSB3cml0ZSB0byBIQUwgd2hlbiBzdXNwZW5kZWQKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtU2lua0J1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKICAgICAgICAgICAgIH0KIApAQCAtMjMyOCw2ICsyNTc1LDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBPbmx5IGlmIHRoZSBFZmZlY3RzIGJ1ZmZlciBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBkYXRhIGluIHRoZQorICAgICAgICAvLyBFZmZlY3RzIGJ1ZmZlciAoYnVmZmVyIHZhbGlkKSwgd2UgbmVlZCB0bworICAgICAgICAvLyBjb3B5IGludG8gdGhlIHNpbmsgYnVmZmVyLgorICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJWYWxpZCkgeworICAgICAgICAgICAgLy9BTE9HVigid3JpdGluZyBlZmZlY3QgYnVmZmVyIHRvIHNpbmsgYnVmZmVyIGZvcm1hdCAlI3giLCBtRm9ybWF0KTsKKyAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAKQEAgLTIzNDYsMjAgKzI2MDMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQotaWYgKG1UeXBlID09IE1JWEVSKSB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RhbmRieSAmJiBkZWx0YSA+IG1heFBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX05BTUUoInVuZGVycnVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcywgJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBub3c7CisgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgZGVsdGEgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbm93OworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotfQogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVzbGVlcChzbGVlcFRpbWUpOwpAQCAtMjM4NywxMiArMjY0NCw5IEBACiAKICAgICB0aHJlYWRMb29wX2V4aXQoKTsKIAotICAgIC8vIGZvciBEdXBsaWNhdGluZ1RocmVhZCwgc3RhbmRieSBtb2RlIGlzIGhhbmRsZWQgYnkgdGhlIG91dHB1dFRyYWNrcywgb3RoZXJ3aXNlIC4uLgotICAgIGlmIChtVHlwZSA9PSBNSVhFUiB8fCBtVHlwZSA9PSBESVJFQ1QgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgewotICAgICAgICAvLyBwdXQgb3V0cHV0IHN0cmVhbSBpbnRvIHN0YW5kYnkgbW9kZQotICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgICAgIH0KKyAgICBpZiAoIW1TdGFuZGJ5KSB7CisgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOworICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgfQogCiAgICAgcmVsZWFzZVdha2VMb2NrKCk7CkBAIC0yNDA3LDcgKzI2NjEsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKICAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50KSB7CisgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwpAQCAtMjQzMyw3ICsyNjg3LDcgQEAKICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewogICAgICAgICByZXR1cm4gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwogICAgIH0KLSAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCAmJiBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pIHsKKyAgICBpZiAoKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gRElSRUNUKSAmJiBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pIHsKICAgICAgICAgdWludDY0X3QgcG9zaXRpb242NDsKICAgICAgICAgaW50IHJldCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbSwgJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpOwpAQCAtMjQ0NCw2ICsyNjk4LDY3IEBACiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgIH0KKyAgICAgICAgbU91dERldmljZSA9IHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOworICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJjcmVhdGVBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGRlc3Ryb3lUcmFja19sKHRyYWNrKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CisgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6TWl4ZXJUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LApAQCAtMjQ2MywxNSArMjc3OCwxMCBAQAogICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQpOwogICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKIAotICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQKLSAgICBpZiAobUNoYW5uZWxDb3VudCAhPSBGQ0NfMikgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBhdWRpbyBoYXJkd2FyZSBjaGFubmVsIGNvdW50ICVkIiwgbUNoYW5uZWxDb3VudCk7Ci0gICAgfQotCiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNpbmsgZm9yIHRoZSBIQUwgb3V0cHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1PdXRwdXRTaW5rID0gbmV3IEF1ZGlvU3RyZWFtT3V0U2luayhvdXRwdXQtPnN0cmVhbSk7CiAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCl9OworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Rm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCl9OwogICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U2luay0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CiAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAKQEAgLTI0OTAsOSArMjgwMCwyOCBAQAogICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKGluaXRGYXN0TWl4ZXIpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZmFzdE1peGVyRm9ybWF0OworICAgICAgICBpZiAobU1peGVyQnVmZmVyRW5hYmxlZCAmJiBtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICAgICAgZmFzdE1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhc3RNaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB9CisgICAgICAgIGlmIChtRm9ybWF0ICE9IGZhc3RNaXhlckZvcm1hdCkgeworICAgICAgICAgICAgLy8gY2hhbmdlIG91ciBTaW5rIGZvcm1hdCB0byBhY2NlcHQgb3VyIGludGVybWVkaWF0ZSBwcmVjaXNpb24KKyAgICAgICAgICAgIG1Gb3JtYXQgPSBmYXN0TWl4ZXJGb3JtYXQ7CisgICAgICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKKyAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgorICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKKyAgICAgICAgZm9ybWF0Lm1GcmFtZVNpemUgPSBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdC5tRm9ybWF0KSAqIGZvcm1hdC5tQ2hhbm5lbENvdW50OworCiAgICAgICAgIC8vIFRoaXMgcGlwZSBkZXB0aCBjb21wZW5zYXRlcyBmb3Igc2NoZWR1bGluZyBsYXRlbmN5IG9mIHRoZSBub3JtYWwgbWl4ZXIgdGhyZWFkLgogICAgICAgICAvLyBXaGVuIGl0IHdha2VzIHVwIGFmdGVyIGEgbWF4aW11bSBsYXRlbmN5LCBpdCBydW5zIGEgZmV3IGN5Y2xlcyBxdWlja2x5IGJlZm9yZQogICAgICAgICAvLyBmaW5hbGx5IGJsb2NraW5nLiAgTm90ZSB0aGUgcGlwZSBpbXBsZW1lbnRhdGlvbiByb3VuZHMgdXAgdGhlIHJlcXVlc3QgdG8gYSBwb3dlciBvZiAyLgpAQCAtMjUwOCwxNCArMjgzNywxNSBAQAogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgIGlmIChtVGVlU2lua091dHB1dEVuYWJsZWQpIHsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgRmFzdE1peGVyJ3Mgb3V0cHV0IGZvciBkdW1wc3lzCi0gICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIGZvcm1hdCk7CisgICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIG9yaWdmb3JtYXQpOworICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyczJbMV0gPSB7b3JpZ2Zvcm1hdH07CiAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgICAgICBpbmRleCA9IHRlZVNpbmstPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwogICAgICAgICAgICAgbVRlZVNpbmsgPSB0ZWVTaW5rOwogICAgICAgICAgICAgUGlwZVJlYWRlciAqdGVlU291cmNlID0gbmV3IFBpcGVSZWFkZXIoKnRlZVNpbmspOwogICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgICAgICBpbmRleCA9IHRlZVNvdXJjZS0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwogICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CiAgICAgICAgICAgICBtVGVlU291cmNlID0gdGVlU291cmNlOwogICAgICAgICB9CkBAIC0yNTMzLDYgKzI4NjMsOCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMjU3Niw4ICsyOTA4LDYgQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICB9IGVsc2UgewotICAgICAgICBtRmFzdE1peGVyID0gTlVMTDsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKQEAgLTI1OTYsMTMgKzI5MjYsMTMgQEAKIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6fk1peGVyVGhyZWFkKCkKIHsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEUpIHsKICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdE1peGVyRnV0ZXgpOwogICAgICAgICAgICAgaWYgKG9sZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDMoJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RNaXhlckZ1dGV4LCBGVVRFWF9XQUtFX1BSSVZBVEUsIDEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpFWElUOwpAQCAtMjYxOCw3ICsyOTQ4LDcgQEAKICAgICAgICAgQUxPR19BU1NFUlQoZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7CiAgICAgICAgIGRlbGV0ZSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKLSAgICAgICAgZGVsZXRlIG1GYXN0TWl4ZXI7CisgICAgICAgIG1GYXN0TWl4ZXIuY2xlYXIoKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICBpZiAobUF1ZGlvV2F0Y2hkb2cgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJlcXVlc3RFeGl0KCk7CkBAIC0yNjM0LDcgKzI5NjQsNyBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0CiB7Ci0gICAgaWYgKG1GYXN0TWl4ZXIgIT0gTlVMTCkgeworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKICAgICAgICAgTW9ub1BpcGUgKnBpcGUgPSAoTW9ub1BpcGUgKiltUGlwZVNpbmsuZ2V0KCk7CiAgICAgICAgIGxhdGVuY3kgKz0gKHBpcGUtPmdldEF2Z0ZyYW1lcygpICogMTAwMCkgLyBtU2FtcGxlUmF0ZTsKICAgICB9CkBAIC0yNjUxLDcgKzI5ODEsNyBAQAogewogICAgIC8vIEZJWE1FIHdlIHNob3VsZCBvbmx5IGRvIG9uZSBwdXNoIHBlciBjeWNsZTsgY29uZmlybSB0aGlzIGlzIHRydWUKICAgICAvLyBTdGFydCB0aGUgZmFzdCBtaXhlciBpZiBpdCdzIG5vdCBhbHJlYWR5IHJ1bm5pbmcKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kICE9IEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEUgJiYKQEAgLTI2NTksNyArMjk4OSw3IEBACiAgICAgICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEUpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IG9sZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbUZhc3RNaXhlckZ1dGV4KTsKICAgICAgICAgICAgICAgICBpZiAob2xkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9fZnV0ZXhfc3lzY2FsbDMoJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1GYXN0TWl4ZXJGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKICAgICAgICAgICAgICAgICB9CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvV2F0Y2hkb2cgIT0gMCkgewpAQCAtMjY4NSw3ICszMDE1LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKIHsKICAgICAvLyBJZGxlIHRoZSBmYXN0IG1peGVyIGlmIGl0J3MgY3VycmVudGx5IHJ1bm5pbmcKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwogICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKQEAgLTI3MTEsMTIgKzMwNDEsNiBAQAogICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKTsKIH0KIAotLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHN0YW5kYXJkIG1peGVyCi0vLyBPdmVycmlkZGVuIGZvciBvZmZsb2FkZWQgcGxheWJhY2sKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Zmx1c2hPdXRwdXRfbCgpCi17Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpCiB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjc0OCw2ICszMDcyLDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCit7CisgICAgQUxPR1YoInNpZ25hbCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICBicm9hZGNhc3RfbCgpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfbWl4KCkKIHsKICAgICAvLyBvYnRhaW4gdGhlIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlIG5leHQgb3V0cHV0IGJ1ZmZlcgpAQCAtMjc2Niw3ICszMDk2LDcgQEAKIAogICAgIC8vIG1peCBidWZmZXJzLi4uCiAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MocHRzKTsKLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgIC8vIGluY3JlYXNlIHNsZWVwIHRpbWUgcHJvZ3Jlc3NpdmVseSB3aGVuIGFwcGxpY2F0aW9uIHVuZGVycnVuIGNvbmRpdGlvbiBjbGVhcnMuCiAgICAgLy8gT25seSBpbmNyZWFzZSBzbGVlcCB0aW1lIGlmIHRoZSBtaXhlciBpcyByZWFkeSBmb3IgdHdvIGNvbnNlY3V0aXZlIHRpbWVzIHRvIGF2b2lkCiAgICAgLy8gdGhhdCBhIHN0ZWFkeSBzdGF0ZSBvZiBhbHRlcm5hdGluZyByZWFkeS9ub3QgcmVhZHkgY29uZGl0aW9ucyBrZWVwcyB0aGUgc2xlZXAgdGltZQpAQCAtMjc3Nyw2ICszMTA3LDcgQEAKICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwogICAgIC8vVE9ETzogZGVsYXkgc3RhbmRieSB3aGVuIGVmZmVjdHMgaGF2ZSBhIHRhaWwKKwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3Bfc2xlZXBUaW1lKCkKQEAgLTI4MDAsNyArMzEzMSwxMyBAQAogICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwIHx8IChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpKSB7Ci0gICAgICAgIG1lbXNldCAobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgIC8vIGNsZWFyIG91dCBtTWl4ZXJCdWZmZXIgb3IgbVNpbmtCdWZmZXIsIHRvIGVuc3VyZSBidWZmZXJzIGFyZSBjbGVhcmVkCisgICAgICAgIC8vIGJlZm9yZSBlZmZlY3RzIHByb2Nlc3Npbmcgb3Igb3V0cHV0LgorICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAgICAgICAgIHNsZWVwVGltZSA9IDA7CiAgICAgICAgIEFMT0dWX0lGKG1CeXRlc1dyaXR0ZW4gPT0gMCAmJiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSwKICAgICAgICAgICAgICAgICAiYW50aWNpcGF0ZWQgc3RhcnQiKTsKQEAgLTI4NDIsMTEgKzMxNzksMTQgQEAKICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBOVUxMOwogICAgIGJvb2wgZGlkTW9kaWZ5ID0gZmFsc2U7CiAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZTo6YmxvY2tfdCBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRDsKLSAgICBpZiAobUZhc3RNaXhlciAhPSBOVUxMKSB7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgewogICAgICAgICBzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAgICAgICAgIHN0YXRlID0gc3EtPmJlZ2luKCk7CiAgICAgfQogCisgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCisgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgorCiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV0ucHJvbW90ZSgpOwogICAgICAgICBpZiAodCA9PSAwKSB7CkBAIC0yOTY1LDcgKzMzMDUsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExPR19GQVRBTCgidW5leHBlY3RlZCB0cmFjayBzdGF0ZSAlZCIsIHRyYWNrLT5tU3RhdGUpOworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInVuZXhwZWN0ZWQgdHJhY2sgc3RhdGUgJWQiLCB0cmFjay0+bVN0YXRlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CkBAIC0yOTc1LDggKzMzMTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlciAqdnAgPSB0cmFjazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXIgPSBlYWJwOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IHZwOwotICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1TYW1wbGVSYXRlID0gdHJhY2stPm1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IHRyYWNrLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IHRyYWNrLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTI5OTcsNyArMzMzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gZGVjcmVtZW50IHRoZSBsYXN0IHNwPD4gb24gdGhvc2UgdHJhY2tzLgogICAgICAgICAgICAgICAgICAgICBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR19GQVRBTCgiZmFzdCB0cmFjayAlZCBzaG91bGQgaGF2ZSBiZWVuIGFjdGl2ZSIsIGopOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlIiwgaik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCkBAIC0zMDI2LDEyICszMzY2LDE0IEBACiAgICAgICAgICAgICAvLyArMSBmb3Igcm91bmRpbmcgYW5kICsxIGZvciBhZGRpdGlvbmFsIHNhbXBsZSBuZWVkZWQgZm9yIGludGVycG9sYXRpb24KICAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSAobU5vcm1hbEZyYW1lQ291bnQgKiBzcikgLyBtU2FtcGxlUmF0ZSArIDEgKyAxOwogICAgICAgICAgICAgLy8gYWRkIGZyYW1lcyBhbHJlYWR5IGNvbnN1bWVkIGJ1dCBub3QgeWV0IHJlbGVhc2VkIGJ5IHRoZSByZXNhbXBsZXIKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgY2Jsay0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCisgICAgICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcwogICAgICAgICAgICAgZGVzaXJlZEZyYW1lcyArPSBtQXVkaW9NaXhlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcyh0cmFjay0+bmFtZSgpKTsKKyNpZiAwCiAgICAgICAgICAgICAvLyB0aGUgbWluaW11bSB0cmFjayBidWZmZXIgc2l6ZSBpcyBub3JtYWxseSB0d2ljZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBuZWNlc3NhcnkKICAgICAgICAgICAgIC8vIHRvIGZpbGwgb25lIGJ1ZmZlciBhbmQgdGhlIHJlc2FtcGxlciBzaG91bGQgbm90IGxlYXZlIG1vcmUgdGhhbiBvbmUgYnVmZmVyIHdvcnRoCiAgICAgICAgICAgICAvLyBvZiB1bnJlbGVhc2VkIGZyYW1lcyBhZnRlciBlYWNoIHBhc3MsIGJ1dCBqdXN0IGluIGNhc2UuLi4KICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGRlc2lyZWRGcmFtZXMgPD0gY2Jsay0+ZnJhbWVDb3VudF8pOworI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC0zMDQ3LDEwICszMzg5LDE0IEBACiAKICAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CiAKLSAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlciBtZWFucyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4KLSAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKKyAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbVNpbmtCdWZmZXIgb3IgbU1peGVyQnVmZmVyIG1lYW5zCisgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4gY29ubmVjdGVkIHRvIHRoZSB0cmFjawogICAgICAgICAgICAgY2hhaW4uY2xlYXIoKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1TaW5rQnVmZmVyICYmCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peGVyQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FZmZlY3RCdWZmZXJFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IHRydWU7IC8vIExhdGVyIGNhbiBzZXQgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTMwODAsOSArMzQyNiwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjawotICAgICAgICAgICAgdWludDMyX3QgdmwsIHZyLCB2YTsKKyAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2cjsgICAgICAgLy8gaW4gVTguMjQgaW50ZWdlciBmb3JtYXQKKyAgICAgICAgICAgIGZsb2F0IHZsZiwgdnJmLCB2YWY7ICAgLy8gaW4gWzAuMCwgMS4wXSBmbG9hdCBmb3JtYXQKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKLSAgICAgICAgICAgICAgICB2bCA9IHZyID0gdmEgPSAwOworICAgICAgICAgICAgICAgIHZsID0gdnIgPSAwOworICAgICAgICAgICAgICAgIHZsZiA9IHZyZiA9IHZhZiA9IDAuOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTMwOTIsMzcgKzM0NDAsNDQgQEAKICAgICAgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKICAgICAgICAgICAgICAgICBmbG9hdCB2ID0gbWFzdGVyVm9sdW1lICogdHlwZVZvbHVtZTsKICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrU2VydmVyUHJveHkgKnByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgICAgICAgICAgdmwgPSB2bHIgJiAweEZGRkY7Ci0gICAgICAgICAgICAgICAgdnIgPSB2bHIgPj4gMTY7CisgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgICAgIHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAgICAgICAgICAgICAgICAgLy8gdHJhY2sgdm9sdW1lcyBjb21lIGZyb20gc2hhcmVkIG1lbW9yeSwgc28gY2FuJ3QgYmUgdHJ1c3RlZCBhbmQgbXVzdCBiZSBjbGFtcGVkCi0gICAgICAgICAgICAgICAgaWYgKHZsID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBsZWZ0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUwNFgiLCB2bCk7Ci0gICAgICAgICAgICAgICAgICAgIHZsID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIGlmICh2bGYgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBsZWZ0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUuM2ciLCB2bGYpOworICAgICAgICAgICAgICAgICAgICB2bGYgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodnIgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIHJpZ2h0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUwNFgiLCB2cik7Ci0gICAgICAgICAgICAgICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIGlmICh2cmYgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayByaWdodCB2b2x1bWUgb3V0IG9mIHJhbmdlOiAlLjNnIiwgdnJmKTsKKyAgICAgICAgICAgICAgICAgICAgdnJmID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gbm93IGFwcGx5IHRoZSBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWUKLSAgICAgICAgICAgICAgICB2bCA9ICh1aW50MzJfdCkodiAqIHZsKSA8PCAxMjsKLSAgICAgICAgICAgICAgICB2ciA9ICh1aW50MzJfdCkodiAqIHZyKSA8PCAxMjsKKyAgICAgICAgICAgICAgICB2bGYgKj0gdjsKKyAgICAgICAgICAgICAgICB2cmYgKj0gdjsKICAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBtYXN0ZXIgdm9sdW1lIGFuZCBzdHJlYW0gdHlwZSB2b2x1bWUgZWFjaCBnbyB1cCB0byAxLjAsCi0gICAgICAgICAgICAgICAgLy8gdmwgYW5kIHZyIGFyZSBub3cgaW4gOC4yNCBmb3JtYXQKLQorICAgICAgICAgICAgICAgIC8vIHRoZW4gZGVyaXZlIHZsIGFuZCB2ciBhcyBVOC4yNCB2ZXJzaW9ucyBmb3IgdGhlIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNjYWxldG84XzI0ID0gTUFYX0dBSU5fSU5UICogTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIHZsID0gKHVpbnQzMl90KSAoc2NhbGV0bzhfMjQgKiB2bGYpOworICAgICAgICAgICAgICAgIHZyID0gKHVpbnQzMl90KSAoc2NhbGV0bzhfMjQgKiB2cmYpOworICAgICAgICAgICAgICAgIC8vIHZsIGFuZCB2ciBhcmUgbm93IGluIFU4LjI0IGZvcm1hdAogICAgICAgICAgICAgICAgIHVpbnQxNl90IHNlbmRMZXZlbCA9IHByb3h5LT5nZXRTZW5kTGV2ZWxfVTRfMTIoKTsKICAgICAgICAgICAgICAgICAvLyBzZW5kIGxldmVsIGNvbWVzIGZyb20gc2hhcmVkIG1lbW9yeSBhbmQgc28gbWF5IGJlIGNvcnJ1cHQKICAgICAgICAgICAgICAgICBpZiAoc2VuZExldmVsID4gTUFYX0dBSU5fSU5UKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUcmFjayBzZW5kIGxldmVsIG91dCBvZiByYW5nZTogJTA0WCIsIHNlbmRMZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRMZXZlbCA9IE1BWF9HQUlOX0lOVDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmEgPSAodWludDMyX3QpKHYgKiBzZW5kTGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIHZhZiBpcyByZXByZXNlbnRlZCBhcyBbMC4wLCAxLjBdIGZsb2F0IGJ5IHJlc2NhbGluZyBzZW5kTGV2ZWwKKyAgICAgICAgICAgICAgICB2YWYgPSB2ICogc2VuZExldmVsICogKDEuIC8gTUFYX0dBSU5fSU5UKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5zZXRWb2x1bWVfbCgmdmwsICZ2cikpIHsKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmFtcCB2b2x1bWUgaWYgdm9sdW1lIGlzIGNvbnRyb2xsZWQgYnkgZWZmZWN0CiAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHJlbWFpbmluZyBmbG9hdGluZyBwb2ludCB2b2x1bWUgbGV2ZWxzCisgICAgICAgICAgICAgICAgdmxmID0gKGZsb2F0KXZsIC8gKDEgPDwgMjQpOworICAgICAgICAgICAgICAgIHZyZiA9IChmbG9hdCl2ciAvICgxIDw8IDI0KTsKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBmb3JjZSBubyB2b2x1bWUgcmFtcCB3aGVuIHZvbHVtZSBjb250cm9sbGVyIHdhcyBqdXN0IGRpc2FibGVkIG9yIHJlbW92ZWQKQEAgLTMxMzMsMjggKzM0ODgsMTMgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gOC4yNCB0byA0LjEyIGZvcm1hdAotICAgICAgICAgICAgLy8gVGhpcyBhZGRpdGlvbmFsIGNsYW1waW5nIGlzIG5lZWRlZCBpbiBjYXNlIGNoYWluLT5zZXRWb2x1bWVfbCgpIG92ZXJzaG90Ci0gICAgICAgICAgICB2bCA9ICh2bCArICgxIDw8IDExKSkgPj4gMTI7Ci0gICAgICAgICAgICBpZiAodmwgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2bCA9IE1BWF9HQUlOX0lOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZyID0gKHZyICsgKDEgPDwgMTEpKSA+PiAxMjsKLSAgICAgICAgICAgIGlmICh2ciA+IE1BWF9HQUlOX0lOVCkgewotICAgICAgICAgICAgICAgIHZyID0gTUFYX0dBSU5fSU5UOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmEgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgICAgICAgICB2YSA9IE1BWF9HQUlOX0lOVDsgICAvLyB2YSBpcyB1aW50MzJfdCwgc28gbm8gbmVlZCB0byBjaGVjayBmb3IgLQotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKIAotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgKHZvaWQgKil2bCk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAodm9pZCAqKXZyKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAodm9pZCAqKXZhKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMTYyLDkgKzM1MDIsMTMgQEAKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopdHJhY2stPmNoYW5uZWxNYXNrKCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5jaGFubmVsTWFzaygpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCi0gICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiAyOworICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYOwogICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICBpZiAocmVxU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwpAQCAtMzE3NSwxMSArMzUxOSw0MiBAQAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilyZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgdHJhY2suCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVHJhY2tzIHdpdGggZWZmZWN0cyBnbyBpbnRvIHRoZWlyIG93biBlZmZlY3RzIGNoYWluIGJ1ZmZlcgorICAgICAgICAgICAgICogYW5kIGZyb20gdGhlcmUgaW50byBlaXRoZXIgbUVmZmVjdEJ1ZmZlciBvciBtU2lua0J1ZmZlci4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBPdGhlciB0cmFja3MgY2FuIHVzZSBtTWl4ZXJCdWZmZXIgZm9yIGhpZ2hlciBwcmVjaXNpb24KKyAgICAgICAgICAgICAqIGNoYW5uZWwgYWNjdW11bGF0aW9uLiAgSWYgdGhpcyBidWZmZXIgaXMgZW5hYmxlZAorICAgICAgICAgICAgICogKG1NaXhlckJ1ZmZlckVuYWJsZWQgdHJ1ZSksIHRoZW4gc2VsZWN0ZWQgdHJhY2tzIHdpbGwgYWNjdW11bGF0ZQorICAgICAgICAgICAgICogaW50byBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CisgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCkBAIC0zMjkzLDEzICszNjY4LDM1IEBACiAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgdHJhY2tzIHRoYXQgbmVlZCB0byBiZS4uLgogICAgIHJlbW92ZVRyYWNrc19sKCp0cmFja3NUb1JlbW92ZSk7CiAKLSAgICAvLyBtaXggYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBpZiBhbGwgdHJhY2tzIGFyZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAvLyBlZmZlY3QgY2hhaW4gYXMgaW4gdGhpcyBjYXNlIHRoZSBtaXhlciB3aWxsIG5vdCB3cml0ZSB0bwotICAgIC8vIG1peCBidWZmZXIgYW5kIHRyYWNrIGVmZmVjdHMgd2lsbCBhY2N1bXVsYXRlIGludG8gaXQKKyAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICE9IDApIHsKKyAgICAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdEJ1ZmZlclZhbGlkKSB7CisgICAgICAgIC8vIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGVmZmVjdHMgd2Ugc2hvdWxkIGNsZWFyIHRoZSBlZmZlY3RzIGJ1ZmZlciwgdG8gYXZvaWQKKyAgICAgICAgLy8gcGFzc2luZyBhIG5vbi1jbGVhbiBidWZmZXIgdG8gdGhlIGVmZmVjdCBjaGFpbgorICAgICAgICBtZW1zZXQobUVmZmVjdEJ1ZmZlciwgMCwgbUVmZmVjdEJ1ZmZlclNpemUpOworICAgIH0KKyAgICAvLyBzaW5rIG9yIG1peCBidWZmZXIgbXVzdCBiZSBjbGVhcmVkIGlmIGFsbCB0cmFja3MgYXJlIGNvbm5lY3RlZCB0byBhbgorICAgIC8vIGVmZmVjdCBjaGFpbiBhcyBpbiB0aGlzIGNhc2UgdGhlIG1peGVyIHdpbGwgbm90IHdyaXRlIHRvIHRoZSBzaW5rIG9yIG1peCBidWZmZXIKKyAgICAvLyBhbmQgdHJhY2sgZWZmZWN0cyB3aWxsIGFjY3VtdWxhdGUgaW50byBpdAogICAgIGlmICgobUJ5dGVzUmVtYWluaW5nID09IDApICYmICgobWl4ZWRUcmFja3MgIT0gMCAmJiBtaXhlZFRyYWNrcyA9PSB0cmFja3NXaXRoRWZmZWN0KSB8fAogICAgICAgICAgICAgKG1peGVkVHJhY2tzID09IDAgJiYgZmFzdFRyYWNrcyA+IDApKSkgewogICAgICAgICAvLyBGSVhNRSBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgc2hvdWxkIHJlbWVtYmVyIHByZXZpb3VzIHplcm8gc3RhdHVzCi0gICAgICAgIG1lbXNldChtTWl4QnVmZmVyLCAwLCBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICAgICAgLy8gVE9ETzogSW4gdGVzdGluZywgbVNpbmtCdWZmZXIgYmVsb3cgbmVlZCBub3QgYmUgY2xlYXJlZCBiZWNhdXNlCisgICAgICAgICAgICAvLyB0aGUgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKSBjb3BpZXMgbU1peGVyQnVmZmVyIGludG8gbVNpbmtCdWZmZXIKKyAgICAgICAgICAgIC8vIGFmdGVyIG1peGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUbyBlbmZvcmNlIHRoaXMgZ3VhcmFudGVlOgorICAgICAgICAgICAgLy8gKChtaXhlZFRyYWNrcyAhPSAwICYmIG1peGVkVHJhY2tzID09IHRyYWNrc1dpdGhFZmZlY3QpIHx8CisgICAgICAgICAgICAvLyAobWl4ZWRUcmFja3MgPT0gMCAmJiBmYXN0VHJhY2tzID4gMCkpCisgICAgICAgICAgICAvLyBtdXN0IGltcGx5IE1JWEVSX1RSQUNLU19SRUFEWS4KKyAgICAgICAgICAgIC8vIExhdGVyLCB3ZSBtYXkgY2xlYXIgYnVmZmVycyByZWdhcmRsZXNzLCBhbmQgc2tpcCBtdWNoIG9mIHRoaXMgbG9naWMuCisgICAgICAgIH0KKyAgICAgICAgLy8gRklYTUUgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNob3VsZCByZW1lbWJlciBwcmV2aW91cyB6ZXJvIHN0YXR1cworICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgfQogCiAgICAgLy8gaWYgYW55IGZhc3QgdHJhY2tzLCB0aGVuIHN0YXR1cyBpcyByZWFkeQpAQCAtMzMxMSw5ICszNzA4LDEwIEBACiB9CiAKIC8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1pbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKLSAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gbUF1ZGlvTWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQpOwogfQogCiAvLyBkZWxldGVUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZApAQCAtMzMyMywxMzAgKzM3MjEsMTIyIEBACiAgICAgbUF1ZGlvTWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKIH0KIAotLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWJvb2wgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewotICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAotICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKICAgICBib29sIHJlY29uZmlnID0gZmFsc2U7CiAKLSAgICB3aGlsZSAoIW1OZXdQYXJhbWV0ZXJzLmlzRW1wdHkoKSkgeworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChtRmFzdE1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKLSAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOwotICAgICAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKCk7Ci0gICAgICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOwotICAgICAgICAgICAgfQorICAgIC8vIGlmICEmSURMRSwgaG9sZHMgdGhlIEZhc3RNaXhlciBzdGF0ZSB0byByZXN0b3JlIGFmdGVyIG5ldyBwYXJhbWV0ZXJzIHByb2Nlc3NlZAorICAgIEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIHByZXZpb3VzQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICBpZiAobUZhc3RNaXhlciAhPSAwKSB7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RNaXhlclN0YXRlOjpJRExFKSkgeworICAgICAgICAgICAgcHJldmlvdXNDb21tYW5kID0gc3RhdGUtPm1Db21tYW5kOworICAgICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgICAgICAgICAgc3EtPmVuZCgpOworICAgICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfQUNLRUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXIgPSBtTmV3UGFyYW1ldGVyc1swXTsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwotICAgICAgICBpbnQgdmFsdWU7Ci0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTYW1wbGluZ1JhdGUpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CisgICAgaW50IHZhbHVlOworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0Zvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKSkgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzYXZlIHZhbHVlLCBzaW5jZSBpdCdzIGNvbnN0YW50CiAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKChhdWRpb19jaGFubmVsX21hc2tfdCkgdmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNhdmUgdmFsdWUsIHNpbmNlIGl0J3MgY29uc3RhbnQKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCBhY2NlcHQgZnJhbWUgY291bnQgY2hhbmdlcyBpZiB0cmFja3MgYXJlIG9wZW4gYXMgdGhlIHRyYWNrIGJ1ZmZlcgotICAgICAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCi0gICAgICAgICAgICAvLyBpZiBmcmFtZSBjb3VudCBpcyBjaGFuZ2VkIGFmdGVyIHRyYWNrIGNyZWF0aW9uCi0gICAgICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICB9CisgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgLy8gd2hlbiBjaGFuZ2luZyB0aGUgYXVkaW8gb3V0cHV0IGRldmljZSwgY2FsbCBhZGRCYXR0ZXJ5RGF0YSB0byBub3RpZnkKLSAgICAgICAgICAgIC8vIHRoZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHNwZWFrZXIgaXMgb24KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKLSAgICAgICAgICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQorICAgICAgICAvLyB0aGUgY2hhbmdlCisgICAgICAgIGlmIChtT3V0RGV2aWNlICE9IHZhbHVlKSB7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSAwOworICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCisgICAgICAgICAgICBpZiAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKKyAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgorICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YU90aGVyQXVkaW9EZXZpY2VPbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgICAgICAgICAgbVN0YW5kYnkgPSB0cnVlOworICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc3RhbmRieSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb25maWcpIHsKLSAgICAgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKG1UcmFja3NbaV0tPm1DaGFubmVsTWFzaywgbVRyYWNrc1tpXS0+bVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRyYWNrc1tpXS0+bU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVQYWlyLnN0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIG1OZXdQYXJhbWV0ZXJzLnJlbW92ZUF0KDApOwotCi0gICAgICAgIG1QYXJhbVN0YXR1cyA9IHN0YXR1czsKLSAgICAgICAgbVBhcmFtQ29uZC5zaWduYWwoKTsKLSAgICAgICAgLy8gd2FpdCBmb3IgY29uZGl0aW9uIHdpdGggdGltZSBvdXQgaW4gY2FzZSB0aGUgdGhyZWFkIGNhbGxpbmcgVGhyZWFkQmFzZTo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgIC8vIGFscmVhZHkgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHRoZSBzdGF0dXMgYW5kIHdpbGwgbmV2ZXIgc2lnbmFsIHRoZSBjb25kaXRpb24uCi0gICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywga1NldFBhcmFtZXRlcnNUaW1lb3V0TnMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7CisgICAgICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CisgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IG5hbWUgPSBnZXRUcmFja05hbWVfbChtVHJhY2tzW2ldLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5tRm9ybWF0LCBtVHJhY2tzW2ldLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIShwcmV2aW91c0NvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKLSAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSBOVUxMKTsKKyAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSAwKTsKICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKICAgICAgICAgQUxPR19BU1NFUlQoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRSk7CkBAIC0zNDY3LDkgKzM4NTcsNyBAQAogCiAgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9NaXhlciB0cmFja3M6ICUwOHhcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogMHglMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKIAogICAgIC8vIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBtaXhlciBkdW1wIHN0YXRlIHNvIGl0IHdvbid0IGNoYW5nZSB1bmRlcm5lYXRoIHVzCiAgICAgY29uc3QgRmFzdE1peGVyRHVtcFN0YXRlIGNvcHkobUZhc3RNaXhlckR1bXBTdGF0ZSk7CkBAIC0zNTUwLDEzICszOTM4LDE3IEBACiAgICAgICAgIGZsb2F0IHR5cGVWb2x1bWUgPSBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lOwogICAgICAgICBmbG9hdCB2ID0gbU1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7CiAgICAgICAgIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eSAqcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgdWludDMyX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgICAgIGZsb2F0IHZfY2xhbXBlZCA9IHYgKiAodmxyICYgMHhGRkZGKTsKLSAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOKSB2X2NsYW1wZWQgPSBNQVhfR0FJTjsKLSAgICAgICAgbGVmdCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKLSAgICAgICAgdl9jbGFtcGVkID0gdiAqICh2bHIgPj4gMTYpOwotICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICByaWdodCA9IHZfY2xhbXBlZC9NQVhfR0FJTjsKKyAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgICAgIGxlZnQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CisgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCAqPSB2OworICAgICAgICByaWdodCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CisgICAgICAgIGlmIChyaWdodCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gR0FJTl9GTE9BVF9VTklUWTsKKyAgICAgICAgfQorICAgICAgICByaWdodCAqPSB2OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTM2MTEsMTQgKzQwMDMsMTQgQEAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0CiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lczsKLSAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpKSB7CisgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGluZ18xKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKLSAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKKyAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCisgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CiAKQEAgLTM2NDUsMTggKzQwMzcsMzAgQEAKICAgICAgICAgICAgIGlmICghbUVmZmVjdENoYWlucy5pc0VtcHR5KCkgJiYgbGFzdCkgewogICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbMF0tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKLSAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAotICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUElOR18yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwaW5nXzIoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCiAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRyYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYmVoYXZpb3IgZm9yIGNvbXByZXNzZWQgYXVkaW8KLSAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeV9sKCkgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOworICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lczsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb0hBTEZyYW1lcyA9IChsYXRlbmN5X2woKSAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9IQUxGcmFtZXMgPSAwOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpGTFVTSEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hId19sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTM2ODcsNyArNDA5MSw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp0aHJlYWRMb29wX21peCgpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICBpbnQ4X3QgKmN1ckJ1ZiA9IChpbnQ4X3QgKiltTWl4QnVmZmVyOworICAgIGludDhfdCAqY3VyQnVmID0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CkBAIC0zNzAyLDcgKzQxMDYsNyBAQAogICAgICAgICBjdXJCdWYgKz0gYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwogICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQotICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbU1peEJ1ZmZlcjsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gY3VyQnVmIC0gKGludDhfdCAqKW1TaW5rQnVmZmVyOwogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CiAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CkBAIC0zNzE3LDY4ICs0MTIxLDY5IEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgewotICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgIH0KIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLWludCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGludCBzZXNzaW9uSWQpCitpbnQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIF9fdW51c2VkLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgX191bnVzZWQsIGludCBzZXNzaW9uSWQgX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8vIGRlbGV0ZVRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lIF9fdW51c2VkKQogewogfQogCi0vLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorLy8gY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOworICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGdhcmFudGllZAotICAgICAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgotICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGlmICh2YWx1ZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobU91dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoIW1TdGFuZGJ5ICYmIHN0YXR1cyA9PSBJTlZBTElEX09QRVJBVElPTikgewotICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBnYXJhbnRpZWQKKyAgICAgICAgLy8gaWYgZnJhbWUgY291bnQgaXMgY2hhbmdlZCBhZnRlciB0cmFjayBjcmVhdGlvbgorICAgICAgICBpZiAoIW1UcmFja3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgeworICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZWNvbmZpZzsKIH0KIApAQCAtMzgyOCw2ICs0MjMzLDEyIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKQoreworICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPmZsdXNoICE9IE5VTEwpCisgICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2gobU91dHB1dC0+c3RyZWFtKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBdWRpb0ZsaW5nZXI6OkFzeW5jQ2FsbGJhY2tUaHJlYWQ6OkFzeW5jQ2FsbGJhY2tUaHJlYWQoCkBAIC0zOTUxLDcgKzQzNjIsMTAgQEAKICAgICAgICAgbU1peGVyU3RhdHVzID0gTUlYRVJfRFJBSU5fQUxMOwogICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgfQotICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICBBTE9HX0FTU0VSVChtQ2FsbGJhY2tUaHJlYWQgIT0gMCk7CisgICAgICAgIG1DYWxsYmFja1RocmVhZC0+ZXhpdCgpOworICAgIH0KICAgICBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9leGl0KCk7CiB9CiAKQEAgLTM5ODMsNiArNDM5NywxNyBAQAogICAgICAgICBzcDxUcmFjaz4gbCA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7CiAgICAgICAgIGJvb2wgbGFzdCA9IGwuZ2V0KCkgPT0gdHJhY2s7CiAKKyAgICAgICAgaWYgKHRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGludmFsaWRhdGVkIHRyYWNrIHNob3VsZG4ndCBiZSBpbiBhY3RpdmUgbGlzdCIpOworICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6SURMRSkgeworICAgICAgICAgICAgQUxPR1coIkFuIGlkbGUgdHJhY2sgc2hvdWxkbid0IGJlIGluIGFjdGl2ZSBsaXN0Iik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC00MDAxLDMyICs0NDI2LDM5IEBACiAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsgICAgLy8gc3RvcCB3cml0aW5nCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZnJhbWVzUmVhZHkoKSAmJiB0cmFjay0+aXNSZWFkeSgpICYmCisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmx1c2hQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHRyYWNrLT5mbHVzaEFjaygpOworICAgICAgICAgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNSZXN1bWVQZW5kaW5nKCkpeworICAgICAgICAgICAgdHJhY2stPnJlc3VtZUFjaygpOworICAgICAgICAgICAgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAobVBhdXNlZEJ5dGVzUmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29udGludWUgd3JpdGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1QYXVzZWRXcml0ZUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbVBhdXNlZEJ5dGVzUmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9taXgoKSB3aWxsIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIGFuIGludGVycnVwdGVkIHdyaXRlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3cml0ZSB0byBhdWRpbyBIQUwKKyAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOworCisgICAgICAgICAgICAgICAgLy8gRG8gbm90IGhhbmRsZSBuZXcgZGF0YSBpbiB0aGlzIGl0ZXJhdGlvbiBldmVuIGlmIHRyYWNrLT5mcmFtZXNSZWFkeSgpCisgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKICAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBwcm9jZXNzVm9sdW1lX2woKSB3aWxsIGFwcGx5IG5ldyB2b2x1bWUgZXZlbiBpZiAwCiAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IG1SaWdodFZvbEZsb2F0ID0gLTEuMDsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkQnl0ZXNSZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNvbnRpbnVlIHdyaXRlIHRoYXQgd2FzIGludGVycnVwdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRXcml0ZUxlbmd0aCA9IG1QYXVzZWRXcml0ZUxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtUGF1c2VkQnl0ZXNSZW1haW5pbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSHdQYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wX21peCgpIHdpbGwgaGFuZGxlIHRoZSBjYXNlIHRoYXQgd2UgbmVlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSBhbiBpbnRlcnJ1cHRlZCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdyaXRlIHRvIGF1ZGlvIEhBTAotICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTQwNTAsNyArNDQ4Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVrIHdoZW4gcmVzdW1pbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUcmFjay0+aW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDA5Niw3ICs0NTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGF1ZGlvSEFMRnJhbWVzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pKm1TYW1wbGVSYXRlKSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1PdXRwdXQtPnN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTQxMjYsOSArNDU1Nyw2IEBACiAgICAgLy8gaWYgcmVzdW1lIGlzIHJlY2VpdmVkIGJlZm9yZSBwYXVzZSBpcyBleGVjdXRlZC4KICAgICBpZiAoIW1TdGFuZGJ5ICYmIChkb0h3UGF1c2UgfHwgKG1GbHVzaFBlbmRpbmcgJiYgIW1Id1BhdXNlZCAmJiAoY291bnQgIT0gMCkpKSkgewogICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPnBhdXNlKG1PdXRwdXQtPnN0cmVhbSk7Ci0gICAgICAgIGlmICghZG9Id1BhdXNlKSB7Ci0gICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKLSAgICAgICAgfQogICAgIH0KICAgICBpZiAobUZsdXNoUGVuZGluZykgewogICAgICAgICBmbHVzaEh3X2woKTsKQEAgLTQxNDQsMTEgKzQ1NzIsNiBAQAogICAgIHJldHVybiBtaXhlclN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OmZsdXNoT3V0cHV0X2woKQotewotICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwotfQotCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBtdXRleCBsb2NrZWQKIGJvb2wgQXVkaW9GbGluZ2VyOjpPZmZsb2FkVGhyZWFkOjp3YWl0aW5nQXN5bmNDYWxsYmFja19sKCkKIHsKQEAgLTQxNjMsMTUgKzQ1ODYsMTUgQEAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkIG11dGV4IGxvY2tlZAogYm9vbCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6OnNob3VsZFN0YW5kYnlfbCgpCiB7Ci0gICAgYm9vbCBUcmFja1BhdXNlZCA9IGZhbHNlOworICAgIGJvb2wgdHJhY2tQYXVzZWQgPSBmYWxzZTsKIAogICAgIC8vIGRvIG5vdCBwdXQgdGhlIEhBTCBpbiBzdGFuZGJ5IHdoZW4gcGF1c2VkLiBBd2Vzb21lUGxheWVyIGNsZWFyIHRoZSBvZmZsb2FkZWQgQXVkaW9UcmFjawogICAgIC8vIGFmdGVyIGEgdGltZW91dCBhbmQgd2Ugd2lsbCBlbnRlciBzdGFuZGJ5IHRoZW4uCiAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICBUcmFja1BhdXNlZCA9IG1UcmFja3NbbVRyYWNrcy5zaXplKCkgLSAxXS0+aXNQYXVzZWQoKTsKKyAgICAgICAgdHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CiAgICAgfQogCi0gICAgcmV0dXJuICFtU3RhbmRieSAmJiAhVHJhY2tQYXVzZWQ7CisgICAgcmV0dXJuICFtU3RhbmRieSAmJiAhdHJhY2tQYXVzZWQ7CiB9CiAKIApAQCAtNDE4MywxMiArNDYwNiwxNCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6Zmx1c2hId19sKCkKIHsKLSAgICBtT3V0cHV0LT5zdHJlYW0tPmZsdXNoKG1PdXRwdXQtPnN0cmVhbSk7CisgICAgRGlyZWN0T3V0cHV0VGhyZWFkOjpmbHVzaEh3X2woKTsKICAgICAvLyBGbHVzaCBhbnl0aGluZyBzdGlsbCB3YWl0aW5nIGluIHRoZSBtaXhidWZmZXIKICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gMDsKICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgIG1QYXVzZWRXcml0ZUxlbmd0aCA9IDA7CiAgICAgbVBhdXNlZEJ5dGVzUmVtYWluaW5nID0gMDsKKyAgICBtSHdQYXVzZWQgPSBmYWxzZTsKKwogICAgIGlmIChtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAvLyBkaXNjYXJkIGFueSBwZW5kaW5nIGRyYWluIG9yIHdyaXRlIGFjayBieSBpbmNyZW1lbnRpbmcgc2VxdWVuY2UKICAgICAgICAgbVdyaXRlQWNrU2VxdWVuY2UgPSAobVdyaXRlQWNrU2VxdWVuY2UgKyAyKSAmIH4xOwpAQCAtNDE5OSw2ICs0NjI0LDE4IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6b25BZGROZXdUcmFja19sKCkKK3sKKyAgICBzcDxUcmFjaz4gcHJldmlvdXNUcmFjayA9IG1QcmV2aW91c1RyYWNrLnByb21vdGUoKTsKKyAgICBzcDxUcmFjaz4gbGF0ZXN0VHJhY2sgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKHByZXZpb3VzVHJhY2sgIT0gMCAmJiBsYXRlc3RUcmFjayAhPSAwICYmCisgICAgICAgIChwcmV2aW91c1RyYWNrLT5zZXNzaW9uSWQoKSAhPSBsYXRlc3RUcmFjay0+c2Vzc2lvbklkKCkpKSB7CisgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOworICAgIH0KKyAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6RHVwbGljYXRpbmdUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLApAQCAtNDIyMywxMSArNDY2MCwxNSBAQAogICAgIGlmIChvdXRwdXRzUmVhZHkob3V0cHV0VHJhY2tzKSkgewogICAgICAgICBtQXVkaW9NaXhlci0+cHJvY2VzcyhBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKKyAgICAgICAgICAgIG1lbXNldChtTWl4ZXJCdWZmZXIsIDAsIG1NaXhlckJ1ZmZlclNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtU2lua0J1ZmZlclNpemUpOworICAgICAgICB9CiAgICAgfQogICAgIHNsZWVwVGltZSA9IDA7CiAgICAgd3JpdGVGcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKLSAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbWl4QnVmZmVyU2l6ZTsKKyAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwogfQogCkBAIC00MjQyLDcgKzQ2ODMsNyBAQAogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHdyaXRlRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBmbHVzaCByZW1haW5pbmcgb3ZlcmZsb3cgYnVmZmVycyBpbiBvdXRwdXQgdHJhY2tzCiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IDA7CkBAIC00MjU0LDEwICs0Njk1LDE4IEBACiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobU1peEJ1ZmZlciwgd3JpdGVGcmFtZXMpOworICAgICAgICAvLyBXZSBjb252ZXJ0IHRoZSBkdXBsaWNhdGluZyB0aHJlYWQgZm9ybWF0IHRvIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgIC8vIGZvciBkZWxpdmVyeSBkb3duc3RyZWFtIGFzIG5lZWRlZC4gVGhpcyBpbi1wbGFjZSBjb252ZXJzaW9uIGlzIHNhZmUgYXMKKyAgICAgICAgLy8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgaXMgc21hbGxlciB0aGFuIGFueSBvdGhlciBzdXBwb3J0ZWQgZm9ybWF0CisgICAgICAgIC8vIChBVURJT19GT1JNQVRfUENNXzhfQklUIGlzIG5vdCBhbGxvd2VkIGhlcmUpLgorICAgICAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChtU2lua0J1ZmZlciwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyLCBtRm9ybWF0LCB3cml0ZUZyYW1lcyAqIG1DaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpLCB3cml0ZUZyYW1lcyk7CiAgICAgfQogICAgIG1TdGFuZGJ5ID0gZmFsc2U7Ci0gICAgcmV0dXJuIChzc2l6ZV90KW1peEJ1ZmZlclNpemU7CisgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3N0YW5kYnkoKQpAQCAtNDI4MywxMCArNDczMiwxNiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gRklYTUUgZXhwbGFpbiB0aGlzIGZvcm11bGEKICAgICBzaXplX3QgZnJhbWVDb3VudCA9ICgzICogbU5vcm1hbEZyYW1lQ291bnQgKiBtU2FtcGxlUmF0ZSkgLyB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAvLyBPdXRwdXRUcmFjayBpcyBmb3JjZWQgdG8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgcmVnYXJkbGVzcyBvZiBtRm9ybWF0CisgICAgLy8gZHVlIHRvIGN1cnJlbnQgdXNhZ2UgY2FzZSBhbmQgcmVzdHJpY3Rpb25zIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyLgorICAgIC8vIEFjdHVhbCBidWZmZXIgY29udmVyc2lvbiBpcyBkb25lIGluIHRocmVhZExvb3Bfd3JpdGUoKS4KKyAgICAvLworICAgIC8vIFRPRE86IFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCisgICAgLy8gKGFuZCBub24gaW50MTZfdCopIHN1cHBvcnQgb24gQUY6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjawogICAgIE91dHB1dFRyYWNrICpvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtNDM3MSw4ICs0ODI2LDYgQEAKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQpAQCAtNDM4MSwyNyArNDgzNCwxNjIgQEAKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKICAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCksCi0gICAgbUlucHV0KGlucHV0KSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wSW5CdWZmZXIoTlVMTCksCi0gICAgLy8gbVJzbXBJbkluZGV4IGFuZCBtQnVmZmVyU2l6ZSBzZXQgYnkgcmVhZElucHV0UGFyYW1ldGVycygpCi0gICAgbVJlcUNoYW5uZWxDb3VudChwb3Bjb3VudChjaGFubmVsTWFzaykpLAotICAgIG1SZXFTYW1wbGVSYXRlKHNhbXBsZVJhdGUpCi0gICAgLy8gbUJ5dGVzUmVhZCBpcyBvbmx5IG1lYW5pbmdmdWwgd2hpbGUgYWN0aXZlLCBhbmQgc28gaXMgY2xlYXJlZCBpbiBzdGFydCgpCi0gICAgLy8gKGJ1dCBtaWdodCBiZSBiZXR0ZXIgdG8gYWxzbyBjbGVhciBoZXJlIGZvciBkdW1wPykKKyAgICBtSW5wdXQoaW5wdXQpLCBtQWN0aXZlVHJhY2tzR2VuKDApLCBtUnNtcEluQnVmZmVyKE5VTEwpLAorICAgIC8vIG1Sc21wSW5GcmFtZXMgYW5kIG1Sc21wSW5GcmFtZXNQMiBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCisgICAgbVJzbXBJblJlYXIoMCkKICNpZmRlZiBURUVfU0lOSwogICAgICwgbVRlZVNpbmsodGVlU2luaykKICNlbmRpZgorICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAorICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCisgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CisgICAgLCBtRmFzdENhcHR1cmVGdXRleCgwKQorICAgIC8vIG1JbnB1dFNvdXJjZQorICAgIC8vIG1QaXBlU2luaworICAgIC8vIG1QaXBlU291cmNlCisgICAgLCBtUGlwZUZyYW1lc1AyKDApCisgICAgLy8gbVBpcGVNZW1vcnkKKyAgICAvLyBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcgorICAgICwgbUZhc3RUcmFja0F2YWlsKGZhbHNlKQogewogICAgIHNucHJpbnRmKG1OYW1lLCBrTmFtZUxlbmd0aCwgIkF1ZGlvSW5fJVgiLCBpZCk7CisgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOwogCi0gICAgcmVhZElucHV0UGFyYW1ldGVycygpOworICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOworCisgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNvdXJjZSBmb3IgdGhlIEhBTCBpbnB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKKyAgICBtSW5wdXRTb3VyY2UgPSBuZXcgQXVkaW9TdHJlYW1JblNvdXJjZShpbnB1dC0+c3RyZWFtKTsKKyAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtGb3JtYXRfZnJvbV9TUl9DKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0KX07CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisKKyAgICAvLyBpbml0aWFsaXplIGZhc3QgY2FwdHVyZSBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbgorICAgIGJvb2wgaW5pdEZhc3RDYXB0dXJlOworICAgIHN3aXRjaCAoa1VzZUZhc3RDYXB0dXJlKSB7CisgICAgY2FzZSBGYXN0Q2FwdHVyZV9OZXZlcjoKKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmFzdENhcHR1cmVfQWx3YXlzOgorICAgICAgICBpbml0RmFzdENhcHR1cmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZhc3RDYXB0dXJlX1N0YXRpYzoKKyAgICAgICAgdWludDMyX3QgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChhdWRpb0ZsaW5nZXItPm1IYXJkd2FyZUxvY2spOworICAgICAgICAgICAgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBhdWRpb0ZsaW5nZXItPm1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsKKyAgICAgICAgfQorICAgICAgICBpbml0RmFzdENhcHR1cmUgPQorICAgICAgICAgICAgICAgIC8vIGVpdGhlciBjYXB0dXJlIHNhbXBsZSByYXRlIGlzIHNhbWUgYXMgKGEgcmVhc29uYWJsZSkgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAoKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0ODAwMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKSkgfHwKKyAgICAgICAgICAgICAgICAvLyBvciBwcmltYXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBpcyB1bmtub3duLCBhbmQgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAoKG1TYW1wbGVSYXRlID09IDQ0MTAwIHx8IG1TYW1wbGVSYXRlID09IDQ4MDAwKSkpKSAmJgorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgYnVmZmVyIHNpemUgaXMgPCAxMiBtcworICAgICAgICAgICAgICAgIChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUgPCAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgLy8gY2FzZSBGYXN0Q2FwdHVyZV9EeW5hbWljOgorICAgIH0KKworICAgIGlmIChpbml0RmFzdENhcHR1cmUpIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSBmb3IgRmFzdE1peGVyIHRvIHdyaXRlIHRvLCBhbmQgZm9yIHVzIGFuZCBmYXN0IHRyYWNrcyB0byByZWFkIGZyb20KKyAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCk7CisgICAgICAgIHNpemVfdCBwaXBlRnJhbWVzUDIgPSByb3VuZHVwKG1TYW1wbGVSYXRlIC8gMjUpOyAgICAvLyBkb3VibGUtYnVmZmVyaW5nIG9mIDIwIG1zIGVhY2gKKyAgICAgICAgc2l6ZV90IHBpcGVTaXplID0gcGlwZUZyYW1lc1AyICogRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOworICAgICAgICB2b2lkICpwaXBlQnVmZmVyOworICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+IHJvSGVhcChyZWFkT25seUhlYXAoKSk7CisgICAgICAgIHNwPElNZW1vcnk+IHBpcGVNZW1vcnk7CisgICAgICAgIGlmICgocm9IZWFwID09IDApIHx8CisgICAgICAgICAgICAgICAgKHBpcGVNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKHBpcGVTaXplKSkgPT0gMCB8fAorICAgICAgICAgICAgICAgIChwaXBlQnVmZmVyID0gcGlwZU1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHBpcGUgYnVmZmVyIHNpemU9JXp1IiwgcGlwZVNpemUpOworICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gcGlwZSB3aWxsIGJlIHNoYXJlZCBkaXJlY3RseSB3aXRoIGZhc3QgY2xpZW50cywgc28gY2xlYXIgdG8gYXZvaWQgbGVha2luZyBvbGQgaW5mb3JtYXRpb24KKyAgICAgICAgbWVtc2V0KHBpcGVCdWZmZXIsIDAsIHBpcGVTaXplKTsKKyAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKHBpcGVGcmFtZXNQMiwgZm9ybWF0LCBwaXBlQnVmZmVyKTsKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OworICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7CisgICAgICAgIG1QaXBlU2luayA9IHBpcGU7CisgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7CisgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKKyAgICAgICAgbVBpcGVTb3VyY2UgPSBwaXBlUmVhZGVyOworICAgICAgICBtUGlwZUZyYW1lc1AyID0gcGlwZUZyYW1lc1AyOworICAgICAgICBtUGlwZU1lbW9yeSA9IHBpcGVNZW1vcnk7CisKKyAgICAgICAgLy8gY3JlYXRlIGZhc3QgY2FwdHVyZQorICAgICAgICBtRmFzdENhcHR1cmUgPSBuZXcgRmFzdENhcHR1cmUoKTsKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0Q2FwdHVyZS0+c3EoKTsKKyNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgRmFzdENhcHR1cmVTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgc3RhdGUtPm1DYmxrID0gTlVMTDsKKyAgICAgICAgc3RhdGUtPm1JbnB1dFNvdXJjZSA9IG1JbnB1dFNvdXJjZS5nZXQoKTsKKyAgICAgICAgc3RhdGUtPm1JbnB1dFNvdXJjZUdlbisrOworICAgICAgICBzdGF0ZS0+bVBpcGVTaW5rID0gcGlwZTsKKyAgICAgICAgc3RhdGUtPm1QaXBlU2lua0dlbisrOworICAgICAgICBzdGF0ZS0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFOworICAgICAgICAvLyBhbHJlYWR5IGRvbmUgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdAorICAgICAgICAvL21GYXN0Q2FwdHVyZUZ1dGV4ID0gMDsKKyAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0Q2FwdHVyZUZ1dGV4OworICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKKyAgICAgICAgc3RhdGUtPm1EdW1wU3RhdGUgPSAmbUZhc3RDYXB0dXJlRHVtcFN0YXRlOworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtGYXN0Q2FwdHVyZUxvZ1NpemUsICJGYXN0Q2FwdHVyZSIpOworICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdENhcHR1cmVTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOworCisgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IGNhcHR1cmUKKyAgICAgICAgbUZhc3RDYXB0dXJlLT5ydW4oIkZhc3RDYXB0dXJlIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdENhcHR1cmUtPmdldFRpZCgpOworICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAga1ByaW9yaXR5RmFzdENhcHR1cmUsIGdldHBpZF9jYWNoZWQsIHRpZCwgZXJyKTsKKyAgICAgICAgfQorCisjaWZkZWYgQVVESU9fV0FUQ0hET0cKKyAgICAgICAgLy8gRklYTUUKKyNlbmRpZgorCisgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CisgICAgfQorZmFpbGVkOiA7CisKKyAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCiB9CiAKIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6On5SZWNvcmRUaHJlYWQoKQogeworICAgIGlmIChtRmFzdENhcHR1cmUgIT0gMCkgeworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlUXVldWUgKnNxID0gbUZhc3RDYXB0dXJlLT5zcSgpOworICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoc3RhdGUtPm1Db21tYW5kID09IEZhc3RDYXB0dXJlU3RhdGU6OkNPTERfSURMRSkgeworICAgICAgICAgICAgaW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1GYXN0Q2FwdHVyZUZ1dGV4KTsKKyAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUZhc3RDYXB0dXJlRnV0ZXgsIEZVVEVYX1dBS0VfUFJJVkFURSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdENhcHR1cmVTdGF0ZTo6RVhJVDsKKyAgICAgICAgc3EtPmVuZCgpOworICAgICAgICBzcS0+cHVzaChGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CisgICAgICAgIG1GYXN0Q2FwdHVyZS0+am9pbigpOworICAgICAgICBtRmFzdENhcHR1cmUuY2xlYXIoKTsKKyAgICB9CisgICAgbUF1ZGlvRmxpbmdlci0+dW5yZWdpc3RlcldyaXRlcihtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcik7CisgICAgbUF1ZGlvRmxpbmdlci0+dW5yZWdpc3RlcldyaXRlcihtTkJMb2dXcml0ZXIpOwogICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7Ci0gICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgZGVsZXRlW10gbVJzbXBPdXRCdWZmZXI7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQpAQCAtNDQwOSwyMzAgKzQ5OTcsNDgyIEBACiAgICAgcnVuKG1OYW1lLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZHlUb1J1bigpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5pdENoZWNrKCk7Ci0gICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCJSZWNvcmRUaHJlYWQgJXAgY291bGQgbm90IGluaXRpYWxpemUiLCB0aGlzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0aHJlYWRMb29wKCkKIHsKLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwotICAgIHNwPFJlY29yZFRyYWNrPiBhY3RpdmVUcmFjazsKLSAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKLQogICAgIG5zZWNzX3QgbGFzdFdhcm5pbmcgPSAwOwogCiAgICAgaW5wdXRTdGFuZEJ5KCk7CisKK3JlYWNxdWlyZV93YWtlbG9jazoKKyAgICBzcDxSZWNvcmRUcmFjaz4gYWN0aXZlVHJhY2s7CisgICAgaW50IGFjdGl2ZVRyYWNrc0dlbjsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrOwotICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChhY3RpdmVUcmFjayAhPSAwID8gYWN0aXZlVHJhY2stPnVpZCgpIDogLTEpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICBhY3RpdmVUcmFja3NHZW4gPSBtQWN0aXZlVHJhY2tzR2VuOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FIGFuIGFyYml0cmFyeSBjaG9pY2UKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gbUFjdGl2ZVRyYWNrc1swXTsKKyAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKGFjdGl2ZVRyYWNrLT51aWQoKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgtMSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyB1c2VkIHRvIHZlcmlmeSB3ZSd2ZSByZWFkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIGV2YWx1YXRpbmcgaG93IG1hbnkgYnl0ZXMgd2VyZSByZWFkCi0gICAgYm9vbCByZWFkT25jZSA9IGZhbHNlOworICAgIC8vIHVzZWQgdG8gcmVxdWVzdCBhIGRlZmVycmVkIHNsZWVwLCB0byBiZSBleGVjdXRlZCBsYXRlciB3aGlsZSBtdXRleCBpcyB1bmxvY2tlZAorICAgIHVpbnQzMl90IHNsZWVwVXMgPSAwOwogCi0gICAgLy8gc3RhcnQgcmVjb3JkaW5nCi0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgLy8gbG9vcCB3aGlsZSB0aGVyZSBpcyB3b3JrIHRvIGRvCisgICAgZm9yICg7OykgeworICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAotICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzKCk7CisgICAgICAgIC8vIHNsZWVwIHdpdGggbXV0ZXggdW5sb2NrZWQKKyAgICAgICAgaWYgKHNsZWVwVXMgPiAwKSB7CisgICAgICAgICAgICB1c2xlZXAoc2xlZXBVcyk7CisgICAgICAgICAgICBzbGVlcFVzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFjdGl2ZVRyYWNrcyBhY2N1bXVsYXRlcyBhIGNvcHkgb2YgYSBzdWJzZXQgb2YgbUFjdGl2ZVRyYWNrcworICAgICAgICBWZWN0b3I8IHNwPFJlY29yZFRyYWNrPiA+IGFjdGl2ZVRyYWNrczsKKworICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIChmaXJzdCBhbmQgb25seSkgYWN0aXZlIGZhc3QgdHJhY2sKKyAgICAgICAgc3A8UmVjb3JkVHJhY2s+IGZhc3RUcmFjazsKKworICAgICAgICAvLyByZWZlcmVuY2UgdG8gYSBmYXN0IHRyYWNrIHdoaWNoIGlzIGFib3V0IHRvIGJlIHJlbW92ZWQKKyAgICAgICAgc3A8UmVjb3JkVHJhY2s+IGZhc3RUcmFja1RvUmVtb3ZlOwogCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCAmJiBhY3RpdmVUcmFjayAhPSBtQWN0aXZlVHJhY2spIHsKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7Ci0gICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2stPnVpZCgpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVXYWtlTG9ja1VpZHNfbCh0bXApOworCisgICAgICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZXhpdFBlbmRpbmcgaGVyZSBiZWNhdXNlIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCkgYW5kCisgICAgICAgICAgICAvLyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpIGNhbiB0ZW1wb3JhcmlseSByZWxlYXNlIG1Mb2NrCisgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSBtQWN0aXZlVHJhY2s7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrID09IDAgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGFuZGJ5KCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIC8vIGlmIG5vIGFjdGl2ZSB0cmFjayhzKSwgdGhlbiBzdGFuZGJ5IGFuZCByZWxlYXNlIHdha2Vsb2NrCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1BY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKKyAgICAgICAgICAgICAgICAvLyBleGl0UGVuZGluZygpIGNhbid0IGJlY29tZSB0cnVlIGhlcmUKICAgICAgICAgICAgICAgICByZWxlYXNlV2FrZUxvY2tfbCgpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6IGxvb3Agc3RvcHBpbmciKTsKICAgICAgICAgICAgICAgICAvLyBnbyB0byBzbGVlcAogICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXQobUxvY2spOwogICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6IGxvb3Agc3RhcnRpbmciKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbChtQWN0aXZlVHJhY2sgIT0gMCA/IG1BY3RpdmVUcmFjay0+dWlkKCkgOiAtMSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZ290byByZWFjcXVpcmVfd2FrZWxvY2s7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKG1BY3RpdmVUcmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YW5kYnkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlcUNoYW5uZWxDb3VudCAhPSBtQWN0aXZlVHJhY2stPmNoYW5uZWxDb3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRPbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgc3RhcnQgc3VjY2VlZHMgb25seSBpZiBmaXJzdCByZWFkIGZyb20gYXVkaW8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWRzCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUJ5dGVzUmVhZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKKworICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3NHZW4gIT0gYWN0aXZlVHJhY2tzR2VuKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzR2VuID0gbUFjdGl2ZVRyYWNrc0dlbjsKKyAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8aW50PiB0bXA7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChtQWN0aXZlVHJhY2tzW2ldLT51aWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVdha2VMb2NrVWlkc19sKHRtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZG9Ccm9hZGNhc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKSB7CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjayA9IG1BY3RpdmVUcmFja3NbaV07CisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFja1RvUmVtb3ZlID09IDApOworICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrVG9SZW1vdmUgPSBhY3RpdmVUcmFjazsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuKys7CisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBhY3RpdmVUcmFja1N0YXRlID0gYWN0aXZlVHJhY2stPm1TdGF0ZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGl2ZVRyYWNrU3RhdGUpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTSU5HOgorICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZShhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgZG9Ccm9hZGNhc3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlNUQVJUSU5HXzE6CisgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVEFSVElOR18yOgorICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6QUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgaSsrOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2sgPT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjayA9IGFjdGl2ZVRyYWNrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkb0Jyb2FkY2FzdCkgeworICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kLmJyb2FkY2FzdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzbGVlcCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHRyYWNrcyB0byBwcm9jZXNzCisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNsZWVwVXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXBVcyA9IDA7CiAKICAgICAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpBQ1RJVkUgJiYKLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKKyAgICAgICAgLy8gdGhyZWFkIG11dGV4IGlzIG5vdyB1bmxvY2tlZCwgbUFjdGl2ZVRyYWNrcyB1bmtub3duLCBhY3RpdmVUcmFja3Muc2l6ZSgpID4gMAorCisgICAgICAgIHNpemVfdCBzaXplID0gZWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHRocmVhZCBtdXRleCBpcyBub3QgbG9ja2VkLCBidXQgZWZmZWN0IGNoYWluIGlzIGxvY2tlZAorICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFB1c2ggYSBuZXcgZmFzdCBjYXB0dXJlIHN0YXRlIGlmIGZhc3QgY2FwdHVyZSBpcyBub3QgYWxyZWFkeSBydW5uaW5nLCBvciBjYmxrIGNoYW5nZQorICAgICAgICBpZiAobUZhc3RDYXB0dXJlICE9IDApIHsKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICAgICAgYm9vbCBkaWRNb2RpZnkgPSBmYWxzZTsKKyAgICAgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6YmxvY2tfdCBibG9jayA9IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tQ29tbWFuZCAhPSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFIC8qIEZJWE1FICYmCisgICAgICAgICAgICAgICAgICAgIChrVXNlRmFzdE1peGVyICE9IEZhc3RNaXhlcl9EeW5hbWljIHx8IHN0YXRlLT5tVHJhY2tNYXNrID4gMSkqLykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bUNvbW1hbmQgPT0gRmFzdENhcHR1cmVTdGF0ZTo6Q09MRF9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtRmFzdENhcHR1cmVGdXRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtRmFzdENhcHR1cmVGdXRleCwgRlVURVhfV0FLRV9QUklWQVRFLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFOworI2lmIDAgICAvLyBGSVhNRQorICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5pbmNyZWFzZVNhbXBsaW5nTihtQXVkaW9GbGluZ2VyLT5pc0xvd1JhbURldmljZSgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDogRmFzdE1peGVyRHVtcFN0YXRlOjprU2FtcGxpbmdOKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QgKmNibGtPbGQgPSBzdGF0ZS0+bUNibGs7CisgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QgKmNibGtOZXcgPSBmYXN0VHJhY2sgIT0gMCA/IGZhc3RUcmFjay0+Y2JsaygpIDogTlVMTDsKKyAgICAgICAgICAgIGlmIChjYmxrTmV3ICE9IGNibGtPbGQpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUNibGsgPSBjYmxrTmV3OworICAgICAgICAgICAgICAgIC8vIGJsb2NrIHVudGlsIGFja2VkIGlmIHJlbW92aW5nIGEgZmFzdCB0cmFjaworICAgICAgICAgICAgICAgIGlmIChjYmxrT2xkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOworICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgeworICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgaWYgKGtVc2VGYXN0Q2FwdHVyZSA9PSBGYXN0Q2FwdHVyZV9EeW5hbWljKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxTb3VyY2UgPSBtUGlwZVNvdXJjZTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyBydW4gdGhlIGZhc3QgdHJhY2sgZGVzdHJ1Y3RvciB3aXRoIHRocmVhZCBtdXRleCB1bmxvY2tlZAorICAgICAgICBmYXN0VHJhY2tUb1JlbW92ZS5jbGVhcigpOworCisgICAgICAgIC8vIFJlYWQgZnJvbSBIQUwgdG8ga2VlcCB1cCB3aXRoIGZhc3Rlc3QgY2xpZW50IGlmIG11bHRpcGxlIGFjdGl2ZSB0cmFja3MsIG5vdCBzbG93ZXN0IG9uZS4KKyAgICAgICAgLy8gT25seSB0aGUgY2xpZW50KHMpIHRoYXQgYXJlIHRvbyBzbG93IHdpbGwgb3ZlcnJ1bi4gQnV0IGlmIGV2ZW4gdGhlIGZhc3Rlc3QgY2xpZW50IGlzIHRvbworICAgICAgICAvLyBzbG93LCB0aGVuIHRoaXMgUmVjb3JkVGhyZWFkIHdpbGwgb3ZlcnJ1biBieSBub3QgY2FsbGluZyBIQUwgcmVhZCBvZnRlbiBlbm91Z2guCisgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCBmaXJzdCByZWFkIHBhc3QgdGhlIG5vbWluYWwgZW5kIG9mIGJ1ZmZlciwgdGhlbgorICAgICAgICAvLyBjb3B5IHRvIHRoZSByaWdodCBwbGFjZS4gIFBlcm1pdHRlZCBiZWNhdXNlIG1Sc21wSW5CdWZmZXIgd2FzIG92ZXItYWxsb2NhdGVkLgorCisgICAgICAgIGludDMyX3QgcmVhciA9IG1Sc21wSW5SZWFyICYgKG1Sc21wSW5GcmFtZXNQMiAtIDEpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQ7CisKKyAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKKyAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gbVBpcGVTb3VyY2UtPnJlYWQoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLAorICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQsIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSBwaXBlIGlzIG5vbi1ibG9ja2luZywgc2ltdWxhdGUgYmxvY2tpbmcgaW5wdXQKKyAgICAgICAgICAgICAgICBzbGVlcFVzID0gKGZyYW1lc1RvUmVhZCAqIDEwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgSEFMIC8gQXVkaW9TdHJlYW1JbiBkaXJlY3RseQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBtQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBieXRlc1JlYWQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPCAwIHx8IChmcmFtZXNSZWFkID09IDAgJiYgbVBpcGVTb3VyY2UgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIGZhaWxlZDogZnJhbWVzUmVhZD0lZCIsIGZyYW1lc1JlYWQpOworICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8gcmVjb3ZlciBhdCBuZXh0IHJlYWQgYXR0ZW1wdAorICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CisgICAgICAgICAgICBzbGVlcFVzID0ga1JlY29yZFRocmVhZFNsZWVwVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgZ290byB1bmxvY2s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR19BU1NFUlQoZnJhbWVzUmVhZCA+IDApOworCisgICAgICAgIGlmIChtVGVlU2luayAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKCZtUnNtcEluQnVmZmVyW3JlYXIgKiBtQ2hhbm5lbENvdW50XSwgZnJhbWVzUmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgZGVzdGluYXRpb24gaXMgbm9uLWNvbnRpZ3VvdXMsIHdlIG5vdyBjb3JyZWN0IGZvciByZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4KKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gcmVhcjsKKyAgICAgICAgICAgIGlmICgoc2l6ZV90KSBmcmFtZXNSZWFkID4gcGFydDEpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgJm1Sc21wSW5CdWZmZXJbbVJzbXBJbkZyYW1lc1AyICogbUNoYW5uZWxDb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVzUmVhZCAtIHBhcnQxKSAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlYXIgPSBtUnNtcEluUmVhciArPSBmcmFtZXNSZWFkOworCisgICAgICAgIHNpemUgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOworICAgICAgICAvLyBsb29wIG92ZXIgZWFjaCBhY3RpdmUgdHJhY2sKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrID0gYWN0aXZlVHJhY2tzW2ldOworCisgICAgICAgICAgICAvLyBza2lwIGZhc3QgdHJhY2tzLCBhcyB0aG9zZSBhcmUgaGFuZGxlZCBkaXJlY3RseSBieSBGYXN0Q2FwdHVyZQorICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlYWRPbmNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXNhbXBsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgICAgT1ZFUlJVTl9VTktOT1dOLAorICAgICAgICAgICAgICAgIE9WRVJSVU5fVFJVRSwKKyAgICAgICAgICAgICAgICBPVkVSUlVOX0ZBTFNFCisgICAgICAgICAgICB9IG92ZXJydW4gPSBPVkVSUlVOX1VOS05PV047CisKKyAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBnZXROZXh0QnVmZmVyIHRvIGhhbmRsZSBjaXJjdWxhciBzaW5rCisgICAgICAgICAgICBmb3IgKDs7KSB7CisKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudCA9IH4wOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzdGF0dXMgPT0gT0spICE9IChmcmFtZXNPdXQgPiAwKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZyb250ID0gYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udDsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW47CisKKyAgICAgICAgICAgICAgICBpZiAoZmlsbGVkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRyZWF0IGxpa2UgYSBtYXNzaXZlIG92ZXJydW4gYW5kIHJlLXN5bmMKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAwOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gcmVhcjsKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzaXplX3QpIGZpbGxlZCA8PSBtUnNtcEluRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gKHNpemVfdCkgZmlsbGVkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBtUnNtcEluRnJhbWVzOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ID0gZnJvbnQgPSByZWFyIC0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSAwIHx8IGZyYW1lc0luID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzYW1wbGluZwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzSW4gPSBtRnJhbWVDb3VudCAtIG1Sc21wSW5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqc3JjID0gKGludDhfdCAqKW1Sc21wSW5CdWZmZXIgKyBtUnNtcEluSW5kZXggKiBtRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYnVmZmVyLmk4ICsgKGJ1ZmZlci5mcmFtZUNvdW50IC0gZnJhbWVzT3V0KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPm1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggKz0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0IC09IGZyYW1lc0luOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBmcmFtZXNJbiAqIG1GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbWl4X3RvX3N0ZXJlb19pMTZfZnJvbV9tb25vX2kxNigoaW50MTZfdCAqKWRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKilzcmMsIGZyYW1lc0luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhfdG9fbW9ub19pMTZfZnJvbV9zdGVyZW9faTE2KChpbnQxNl90ICopZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKXNyYywgZnJhbWVzSW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCAmJiBtRnJhbWVDb3VudCA9PSBtUnNtcEluSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWFkSW50bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IG1GcmFtZUNvdW50ICYmIG1DaGFubmVsQ291bnQgPT0gbVJlcUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW50byA9IGJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludG8gPSBtUnNtcEluQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluSW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIHJlYWRJbnRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZWFkIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIGlucHV0IGludG8gc3RhbmRieSBzbyB0aGF0IGl0IHRyaWVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcChrUmVjb3JkVGhyZWFkU2xlZXBVcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUocmVhZEludG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVhZCA+PiBGb3JtYXRfZnJhbWVCaXRTaGlmdChtVGVlU2luay0+Zm9ybWF0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luID4gZnJhbWVzT3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGZyYW1lc0luOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDhfdCAqZHN0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmk4OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJhbWVzSW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9udCAmPSBtUnNtcEluRnJhbWVzUDIgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhcnQxID0gbVJzbXBJbkZyYW1lc1AyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydDEgPiBmcmFtZXNJbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxID0gZnJhbWVzSW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgKnNyYyA9IChpbnQ4X3QgKiltUnNtcEluQnVmZmVyICsgKGZyb250ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgcGFydDEgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2kxNl9mcm9tX21vbm9faTE2KChpbnQxNl90ICopZHN0LCAoY29uc3QgaW50MTZfdCAqKXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHBhcnQxICogYWN0aXZlVHJhY2stPm1GcmFtZVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBmcm9udCArPSBwYXJ0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luIC09IHBhcnQxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgKz0gZnJhbWVzT3V0OworCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGluZworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmcmFtZXNJbk5lZWRlZCBzaG91bGQgcmVhbGx5IGJlIHBhcnQgb2YgcmVzYW1wbGVyIEFQSSwgYW5kIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBkZXBlbmQgb24gdGhlIFNSQyByYXRpbworICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB0byBrZWVwIG1Sc21wSW5CdWZmZXIgZnVsbCBzbyByZXNhbXBsZXIgYWx3YXlzIGhhcyBzdWZmaWNpZW50IGlucHV0CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbk5lZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSByZS1jYWxjdWxhdGUgd2hlbiBpdCBjaGFuZ2VzLCBhbmQgb3B0aW1pemUgZm9yIGNvbW1vbiByYXRpb3MKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHByZWNvbXB1dGUgaW4vb3V0IGJlY2F1c2UgZmxvYXRpbmcgcG9pbnQgaXMgbm90IGFzc29jaWF0aXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gYSpiL2MgIT0gYSooYi9jKS4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGluKG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG91dChhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCA9IGNlaWwoZnJhbWVzT3V0ICogaW4gLyBvdXQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCB3ZSB0aGVvcmV0aWNhbGx5IGhhdmUgZnJhbWVzSW4gaW4gY2lyY3VsYXIgYnVmZmVyLCBzb21lIG9mIHRob3NlIGFyZQorICAgICAgICAgICAgICAgICAgICAvLyB1bnJlbGVhc2VkIGZyYW1lcywgYW5kIHRodXMgbXVzdCBiZSBkaXNjb3VudGVkIGZvciBwdXJwb3NlIG9mIGJ1ZGdldGluZy4KKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHVucmVsZWFzZWQgPSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsOworICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IGZyYW1lc0luID4gdW5yZWxlYXNlZCA/IGZyYW1lc0luIC0gdW5yZWxlYXNlZCA6IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm90IGVub3VnaCB0byByZXNhbXBsZTogaGF2ZSAldSBmcmFtZXMgaW4gYnV0IG5lZWQgJXUgaW4gdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0ZyYW1lc091dCA9IGZyYW1lc0luID4gMCA/IGZsb29yKChmcmFtZXNJbiAtIDEpICogb3V0IC8gaW4pIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmV3RnJhbWVzT3V0ID49IGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RnJhbWVzT3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChuZXdGcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5vdyBuZWVkICV1IGZyYW1lcyBpbiB0byBwcm9kdWNlICV1IG91dCBnaXZlbiBvdXQvaW4gcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIG91dCAvIGluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZnJhbWVzSW4gPCBmcmFtZXNJbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VjY2VzcyAyOiBoYXZlICV1IGZyYW1lcyBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBuZXdGcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IG5ld0ZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDE6IGhhdmUgJXUgaW4gYW5kIG5lZWQgJXUgaW4gdG8gcHJvZHVjZSAldSBvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIGZyYW1lc0luTmVlZGVkLCBmcmFtZXNPdXQsIGluIC8gb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgbVJzbXBPdXRCdWZmZXIgYXMgbmVlZGVkOyB3ZSB3aWxsIGdyb3cgYnV0IG5ldmVyIHNocmluaworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA8IGZyYW1lc091dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGRvZXMgZWFjaCB0cmFjayBuZWVkIGl0J3Mgb3duIG1Sc21wT3V0QnVmZmVyPyBjYW4ndCB0aGV5IHNoYXJlPworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyID0gbmV3IGludDMyX3RbZnJhbWVzT3V0ICogRkNDXzJdOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wT3V0RnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2FtcGxlciBhY2N1bXVsYXRlcywgYnV0IHdlIG9ubHkgaGF2ZSBvbmUgc291cmNlIHRyYWNrCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChtUnNtcE91dEJ1ZmZlciwgMCwgZnJhbWVzT3V0ICogRkNDXzIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBhbHRlciBvdXRwdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBleHBlY3Rpbmcgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA+Pj0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShtUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgLyogQXVkaW9CdWZmZXJQcm92aWRlciogKi8pOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCAwLCBmcmFtZXNPdXQgKiBGQ0NfMiAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyLT5yZXNhbXBsZShhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBob3cgYWJvdXQgaGF2aW5nIGFjdGl2ZVRyYWNrIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpdHNlbGY/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhpcyovIC8qIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICovKTsKICAgICAgICAgICAgICAgICAgICAgLy8gZGl0aGVyQW5kQ2xhbXAoKSB3b3JrcyBhcyBsb25nIGFzIGFsbCBidWZmZXJzIHJldHVybmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigpIGFyZSAzMiBiaXQgYWxpZ25lZCB3aGljaCBzaG91bGQgYmUgYWx3YXlzIHRydWUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDIgJiYgbVJlcUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSB0eXBlIHB1biBtUnNtcE91dEJ1ZmZlciBmcm9tIFExOS4xMiB0byBpbnQxNl90Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChtUnNtcE91dEJ1ZmZlciwgbVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCkgYXJlIDMyIGJpdCBhbGlnbmVkIHdoaWNoIHNob3VsZCBiZSBhbHdheXMgdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IHR5cGUgcHVuIG1Sc21wT3V0QnVmZmVyIGZyb20gUTQuMjcgdG8gaW50MTZfdAorICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlbyBzYW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gcG9zdCBzdGVyZW8gdG8gbW9ubyBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNihidWZmZXIuaTE2LCAoaW50MTZfdCAqKW1Sc21wT3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoYWN0aXZlVHJhY2stPm1TaW5rLmkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKilhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCAqKWJ1ZmZlci5yYXcsIG1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyQW5kQ2xhbXAoKGludDMyX3QgKilhY3RpdmVUcmFjay0+bVNpbmsucmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRvbmUgd2l0aCBtUnNtcE91dEJ1ZmZlcgogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgeworICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQgPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYWN0aXZlVHJhY2stPm1TaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc3RvRHJvcCAtPSBidWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzdG9Ecm9wIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvdWxkIGRvIGEgcGFydGlhbCBkcm9wIG9mIGZyYW1lc091dAorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCAtPSBmcmFtZXNPdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzdG9Ecm9wICs9IGJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXN0b0Ryb3AgPj0gMCB8fCBtU3luY1N0YXJ0RXZlbnQgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wICs9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+PSAwIHx8IGFjdGl2ZVRyYWNrLT5tU3luY1N0YXJ0RXZlbnQgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlN5bmNlZCByZWNvcmQgJXMsIHNlc3Npb24gJWQsIHRyaWdnZXIgc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1GcmFtZXN0b0Ryb3AgPj0gMCkgPyAidGltZWQgb3V0IiA6ICJjYW5jZWxsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjay0+c2Vzc2lvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TeW5jU3RhcnRFdmVudCAhPSAwKSA/IG1TeW5jU3RhcnRFdmVudC0+dHJpZ2dlclNlc3Npb24oKSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlVHJhY2stPm1GcmFtZXNUb0Ryb3AgPj0gMCkgPyAidGltZWQgb3V0IiA6ICJjYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5zZXNzaW9uSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aXZlVHJhY2stPm1TeW5jU3RhcnRFdmVudCAhPSAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN5bmNTdGFydEV2ZW50LT50cmlnZ2VyU2Vzc2lvbigpIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2stPmNsZWFyT3ZlcmZsb3coKTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGllbnQgaXNuJ3QgcmV0cmlldmluZyBidWZmZXJzIGZhc3QgZW5vdWdoCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFjay0+c2V0T3ZlcmZsb3coKSkgeworCisgICAgICAgICAgICBzd2l0Y2ggKG92ZXJydW4pIHsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9UUlVFOgorICAgICAgICAgICAgICAgIC8vIGNsaWVudCBpc24ndCByZXRyaWV2aW5nIGJ1ZmZlcnMgZmFzdCBlbm91Z2gKKyAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZVRyYWNrLT5zZXRPdmVyZmxvdygpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgbGFzdFdhcm5pbmcgcGVyIHRyYWNrPwogICAgICAgICAgICAgICAgICAgICBpZiAoKG5vdyAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY29yZFRocmVhZDogYnVmZmVyIG92ZXJmbG93Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBwcm9jZXNzb3IgZm9yIGEgd2hpbGUgYmVmb3JlIGFza2luZyBmb3IgYSBuZXcgYnVmZmVyLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBnaXZlIHRoZSBhcHBsaWNhdGlvbiBtb3JlIGNoYW5jZSB0byByZWFkIGZyb20gdGhlIGJ1ZmZlciBhbmQKLSAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgb3ZlcmZsb3cuCi0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1ZFUlJVTl9GQUxTRToKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+Y2xlYXJPdmVyZmxvdygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVkVSUlVOX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKICAgICAgICAgfQorCit1bmxvY2s6CiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKLSAgICAgICAgZWZmZWN0Q2hhaW5zLmNsZWFyKCk7CisgICAgICAgIC8vIGVmZmVjdENoYWlucyBkb2Vzbid0IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2luY2UgaXQgaXMgY2xlYXJlZCBieSBkZXN0cnVjdG9yIGF0IHNjb3BlIGVuZAogICAgIH0KIAotICAgIHN0YW5kYnkoKTsKKyAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00NjQwLDcgKzU0ODAsOCBAQAogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbUFjdGl2ZVRyYWNrLmNsZWFyKCk7CisgICAgICAgIG1BY3RpdmVUcmFja3MuY2xlYXIoKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOwogICAgICAgICBtU3RhcnRTdG9wQ29uZC5icm9hZGNhc3QoKTsKICAgICB9CiAKQEAgLTQ2NTAsNyArNTQ5MSw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdGFuZGJ5KCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKQogewogICAgIGlmICghbVN0YW5kYnkpIHsKICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7CkBAIC00NjYwLDkxICs1NTAxLDEzMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppbnB1dFN0YW5kQnkoKQogeworICAgIC8vIElkbGUgdGhlIGZhc3QgY2FwdHVyZSBpZiBpdCdzIGN1cnJlbnRseSBydW5uaW5nCisgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdENhcHR1cmUtPnNxKCk7CisgICAgICAgIEZhc3RDYXB0dXJlU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIGlmICghKHN0YXRlLT5tQ29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpDT0xEX0lETEU7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RDYXB0dXJlRnV0ZXg7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKKyAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUZ1dGV4ID0gMDsKKyAgICAgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgICAgIC8vIEJMT0NLX1VOVElMX1BVU0hFRCB3b3VsZCBiZSBpbnN1ZmZpY2llbnQsIGFzIHdlIG5lZWQgaXQgdG8gc3RvcCBkb2luZyBJL08gbm93CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0Q2FwdHVyZVN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEKTsKKyNpZiAwCisgICAgICAgICAgICBpZiAoa1VzZUZhc3RDYXB0dXJlID09IEZhc3RDYXB0dXJlX0R5bmFtaWMpIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRQorICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQVVESU9fV0FUQ0hET0cKKyAgICAgICAgICAgIC8vIEZJWE1FCisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7CisgICAgICAgIH0KKyAgICB9CiAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKIH0KIAotc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woCisvLyBSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAorc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgaW50IHVpZCwKICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAorICAgIC8vIGNsaWVudCBleHByZXNzZXMgYSBwcmVmZXJlbmNlIGZvciBGQVNULCBidXQgd2UgZ2V0IHRoZSBmaW5hbCBzYXkKKyAgICBpZiAoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgaWYgKAorICAgICAgICAgICAgLy8gdXNlIGNhc2U6IGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCisgICAgICAgICAgICAvLyBmcmFtZSBjb3VudCBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCisgICAgICAgICAgICAoKGZyYW1lQ291bnQgPT0gMCkgfHwgKGZyYW1lQ291bnQgPT0gbVBpcGVGcmFtZXNQMikpICYmCisgICAgICAgICAgICAvLyBQQ00gZGF0YQorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCisgICAgICAgICAgICAvLyBuYXRpdmUgZm9ybWF0CisgICAgICAgICAgICAoZm9ybWF0ID09IG1Gb3JtYXQpICYmCisgICAgICAgICAgICAvLyBuYXRpdmUgY2hhbm5lbCBtYXNrCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrKSAmJgorICAgICAgICAgICAgLy8gbmF0aXZlIGhhcmR3YXJlIHNhbXBsZSByYXRlCisgICAgICAgICAgICAoc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSkgJiYKKyAgICAgICAgICAgIC8vIHJlY29yZCB0aHJlYWQgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBjYXB0dXJlCisgICAgICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpICYmCisgICAgICAgICAgICAvLyB0aGVyZSBhcmUgc3VmZmljaWVudCBmYXN0IHRyYWNrIHNsb3RzIGF2YWlsYWJsZQorICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsCisgICAgICAgICkgeworICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGFjY2VwdGVkOiBmcmFtZUNvdW50PSV1IG1GcmFtZUNvdW50PSV1IiwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZDogZnJhbWVDb3VudD0ldSBtRnJhbWVDb3VudD0ldSBtUGlwZUZyYW1lc1AyPSV1ICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0PSUjeCBpc0xpbmVhcj0lZCBjaGFubmVsTWFzaz0lI3ggc2FtcGxlUmF0ZT0ldSBtU2FtcGxlUmF0ZT0ldSAiCisgICAgICAgICAgICAgICAgImhhc0Zhc3RDYXB0dXJlPSVkIHRpZD0lZCBtRmFzdFRyYWNrQXZhaWw9JWQiLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50LCBtUGlwZUZyYW1lc1AyLAorICAgICAgICAgICAgICAgIGZvcm1hdCwgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgaGFzRmFzdENhcHR1cmUoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICAqZmxhZ3MgJj0gfklBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcHV0ZSB0cmFjayBidWZmZXIgc2l6ZSBpbiBmcmFtZXMsIGFuZCBzdWdnZXN0IHRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQKKyAgICBpZiAoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgeworICAgICAgICAvLyBmYXN0IHRyYWNrOiBmcmFtZSBjb3VudCBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCisgICAgICAgIGZyYW1lQ291bnQgPSBtUGlwZUZyYW1lc1AyOworICAgICAgICAvLyBpZ25vcmUgcmVxdWVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcywgYW5kIGFsd2F5cyBub3RpZnkgZXhhY3RseSBvbmNlIGV2ZXJ5IEhBTCBidWZmZXIKKyAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GcmFtZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5vdCBmYXN0IHRyYWNrOiBtYXggbm90aWZpY2F0aW9uIHBlcmlvZCBpcyByZXNhbXBsZWQgZXF1aXZhbGVudCBvZiBvbmUgSEFMIGJ1ZmZlciB0aW1lCisgICAgICAgIC8vICAgICAgICAgICAgICAgICBvciAyMCBtcyBpZiB0aGVyZSBpcyBhIGZhc3QgY2FwdHVyZQorICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lLCBhbmQgY29uc3QKKyAgICAgICAgc2l6ZV90IG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9ICgoaW50NjRfdCkgKGhhc0Zhc3RDYXB0dXJlKCkgPyBtU2FtcGxlUmF0ZS81MCA6IG1GcmFtZUNvdW50KQorICAgICAgICAgICAgICAgICogc2FtcGxlUmF0ZSArIG1TYW1wbGVSYXRlIC0gMSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgLy8gbWluaW11bSBudW1iZXIgb2Ygbm90aWZpY2F0aW9uIHBlcmlvZHMgaXMgYXQgbGVhc3Qga01pbk5vdGlmaWNhdGlvbnMsCisgICAgICAgIC8vIGFuZCBhdCBsZWFzdCBrTWluTXMgcm91bmRlZCB1cCB0byBhIHdob2xlIG5vdGlmaWNhdGlvbiBwZXJpb2QgKG1pbk5vdGlmaWNhdGlvbnNCeU1zKQorICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5Ob3RpZmljYXRpb25zID0gMzsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5NcyA9IDMwOworICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lCisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZXNCeU1zID0gKHNhbXBsZVJhdGUgKiBrTWluTXMgKyAxMDAwIC0gMSkgLyAxMDAwOworICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgYSByb3VuZHVwUmF0aW8gaW5saW5lCisgICAgICAgIGNvbnN0IHNpemVfdCBtaW5Ob3RpZmljYXRpb25zQnlNcyA9IChtaW5GcmFtZXNCeU1zICsgbWF4Tm90aWZpY2F0aW9uRnJhbWVzIC0gMSkgLworICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lczsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSBtYXhOb3RpZmljYXRpb25GcmFtZXMgKgorICAgICAgICAgICAgICAgIG1heChrTWluTm90aWZpY2F0aW9ucywgbWluTm90aWZpY2F0aW9uc0J5TXMpOworICAgICAgICBmcmFtZUNvdW50ID0gbWF4KGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOworICAgICAgICBpZiAoKm5vdGlmaWNhdGlvbkZyYW1lcyA9PSAwIHx8ICpub3RpZmljYXRpb25GcmFtZXMgPiBtYXhOb3RpZmljYXRpb25GcmFtZXMpIHsKKyAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKwogICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KLSAgICAvLyBjbGllbnQgZXhwcmVzc2VzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVCwgYnV0IHdlIGdldCB0aGUgZmluYWwgc2F5Ci0gICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKLSAgICAgIGlmICgKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayBoYW5kbGVyIGFuZCBmcmFtZSBjb3VudCBpcyBkZWZhdWx0IG9yIGF0IGxlYXN0IGFzIGxhcmdlIGFzIEhBTAotICAgICAgICAgICAgKAotICAgICAgICAgICAgICAgICh0aWQgIT0gLTEpICYmCi0gICAgICAgICAgICAgICAgKChmcmFtZUNvdW50ID09IDApIHx8Ci0gICAgICAgICAgICAgICAgKGZyYW1lQ291bnQgPj0gbUZyYW1lQ291bnQpKQotICAgICAgICAgICAgKSAmJgotICAgICAgICAgICAgLy8gRklYTUUgd2hlbiByZWNvcmQgc3VwcG9ydHMgbm9uLVBDTSBkYXRhLCBhbHNvIGNoZWNrIGZvciBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKLSAgICAgICAgICAgIC8vIG1vbm8gb3Igc3RlcmVvCi0gICAgICAgICAgICAoIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB8fAotICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSApICYmCi0gICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCi0gICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGVkIGZhc3QgcmVjb3JkZXIKLSAgICAgICAgICAgIGhhc0Zhc3RSZWNvcmRlcigpCi0gICAgICAgICAgICAvLyBGSVhNRSB0ZXN0IHRoYXQgUmVjb3JkVGhyZWFkIGZvciB0aGlzIGZhc3QgdHJhY2sgaGFzIGEgY2FwYWJsZSBvdXRwdXQgSEFMCi0gICAgICAgICAgICAvLyBGSVhNRSBhZGQgYSBwZXJtaXNzaW9uIHRlc3QgYWxzbz8KLSAgICAgICAgKSB7Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgbm90IHNwZWNpZmllZCwgdGhlbiBpdCBkZWZhdWx0cyB0byBmYXN0IHJlY29yZGVyIChIQUwpIGZyYW1lIGNvdW50Ci0gICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudCAqIGtGYXN0VHJhY2tNdWx0aXBsaWVyOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgYWNjZXB0ZWQ6IGZyYW1lQ291bnQ9JWQgbUZyYW1lQ291bnQ9JWQiLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkOiBmcmFtZUNvdW50PSVkICIKLSAgICAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JWQgZm9ybWF0PSVkIGlzTGluZWFyPSVkIGNoYW5uZWxNYXNrPSUjeCBzYW1wbGVSYXRlPSV1IG1TYW1wbGVSYXRlPSV1ICIKLSAgICAgICAgICAgICAgICAiaGFzRmFzdFJlY29yZGVyPSVkIHRpZD0lZCIsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0UmVjb3JkZXIoKSwgdGlkKTsKLSAgICAgICAgKmZsYWdzICY9IH5JQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUOwotICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIEF1ZGlvUmVjb3JkIGNhbGN1bGF0aW9uLCBidWZmZXIgZGVwdGggaXMgZm9yY2VkCi0gICAgICAgIC8vIHRvIGJlIGF0IGxlYXN0IDIgeCB0aGUgcmVjb3JkIHRocmVhZCBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KLSAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB0b28gY29uc2VydmF0aXZlLCBidXQgbGVnYWN5IGFwcGxpY2F0aW9uIGNvZGUgbWF5IGRlcGVuZCBvbiBpdC4KLSAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNhbGN1bGF0aW9uLCBhbHNvIHJldmlldyB0aGUgc3RhcnQgdGhyZXNob2xkIHdoaWNoIGlzIHJlbGF0ZWQuCi0gICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IDUwOyAvLyBGSVhNRSBtSW5wdXQtPnN0cmVhbS0+Z2V0X2xhdGVuY3kobUlucHV0LT5zdHJlYW0pOwotICAgICAgICBzaXplX3QgbU5vcm1hbEZyYW1lQ291bnQgPSAyMDQ4OyAvLyBGSVhNRQotICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGxhdGVuY3lNcyAvICgoMTAwMCAqIG1Ob3JtYWxGcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgewotICAgICAgICAgICAgbWluQnVmQ291bnQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtaW5CdWZDb3VudDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEZJWE1FIHVzZSBmbGFncyBhbmQgdGlkIHNpbWlsYXIgdG8gY3JlYXRlVHJhY2tfbCgpCiAKICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzZXNzaW9uSWQsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgc2Vzc2lvbklkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCk7CiAKLSAgICAgICAgaWYgKHRyYWNrLT5nZXRDYmxrKCkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBubyBjb250cm9sIGJsb2NrIik7Ci0gICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOworICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBpbml0Q2hlY2sgZmFpbGVkICVkOyBubyBjb250cm9sIGJsb2NrPyIsIGxTdGF0dXMpOwogICAgICAgICAgICAgLy8gdHJhY2sgbXVzdCBiZSBjbGVhcmVkIGZyb20gdGhlIGNhbGxlciBhcyB0aGUgY2FsbGVyIGhhcyB0aGUgQUYgbG9jawogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CkBAIC00NzYzLDEyICs1NjQzLDExIEBACiAgICAgICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2woY2FsbGluZ1BpZCwgdGlkLCBrUHJpb3JpdHlBdWRpb0FwcCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKIEV4aXQ6Ci0gICAgaWYgKHN0YXR1cykgewotICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICB9CisgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrOwogfQogCkBAIC00NzgxLDgyICs1NjYwLDg2IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKICAgICBpZiAoZXZlbnQgPT0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSkgewotICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CiAgICAgfSBlbHNlIGlmIChldmVudCAhPSBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9TQU1FKSB7Ci0gICAgICAgIG1TeW5jU3RhcnRFdmVudCA9IG1BdWRpb0ZsaW5nZXItPmNyZWF0ZVN5bmNFdmVudChldmVudCwKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TeW5jU3RhcnRFdmVudCA9IG1BdWRpb0ZsaW5nZXItPmNyZWF0ZVN5bmNFdmVudChldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJTZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1N0YXJ0RXZlbnRDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2spOwogICAgICAgICAvLyBTeW5jIGV2ZW50IGNhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHRyaWdnZXIgc2Vzc2lvbiBpZiB0aGUgdHJhY2sgaXMgbm90IGluIGEKICAgICAgICAgLy8gY29tcGF0aWJsZSBzdGF0ZSBpbiB3aGljaCBjYXNlIHdlIHN0YXJ0IHJlY29yZCBpbW1lZGlhdGVseQotICAgICAgICBpZiAobVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICBjbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN5bmNTdGFydEV2ZW50LT5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIHRoZSBldmVudCBmb3IgbW9yZSB0aGFuIEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zCi0gICAgICAgICAgICBtRnJhbWVzdG9Ecm9wID0gLSAoKEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zICogbVJlcVNhbXBsZVJhdGUpIC8gMTAwMCk7CisgICAgICAgICAgICByZWNvcmRUcmFjay0+bUZyYW1lc1RvRHJvcCA9IC0KKyAgICAgICAgICAgICAgICAgICAgKChBdWRpb1N5c3RlbTo6a1N5bmNSZWNvcmRTdGFydFRpbWVPdXRNcyAqIHJlY29yZFRyYWNrLT5tU2FtcGxlUmF0ZSkgLyAxMDAwKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHsKKyAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrICE9IG1BY3RpdmVUcmFjay5nZXQoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FQlVTWTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUFjdGl2ZVRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgeworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjdGl2ZSByZWNvcmQgdHJhY2sgUEFVU0lORyAtPiBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIHN0YXRlICVkIiwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6SURMRTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrID0gcmVjb3JkVHJhY2s7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgLy8gVE9ETyBjb25zaWRlciBvdGhlciB3YXlzIG9mIGhhbmRsaW5nIHRoaXMsIHN1Y2ggYXMgY2hhbmdpbmcgdGhlIHN0YXRlIHRvIDpTVEFSVElORyBhbmQKKyAgICAgICAgLy8gICAgICBhZGRpbmcgdGhlIHRyYWNrIHRvIG1BY3RpdmVUcmFja3MgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoKSwKKyAgICAgICAgLy8gICAgICBvciB1c2luZyBhIHNlcGFyYXRlIGNvbW1hbmQgdGhyZWFkCisgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzE7CisgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHJlY29yZFRyYWNrKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc0dlbisrOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQsIChhdWRpb19zZXNzaW9uX3QpcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOworICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW4rKzsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IG1GcmFtZUNvdW50OwotICAgICAgICBtQnl0ZXNSZWFkID0gMDsKLSAgICAgICAgaWYgKG1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzZXQoKTsKKyAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCisgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udAorICAgICAgICAvLyB3YXMgaW5pdGlhbGl6ZWQgdG8gc29tZSB2YWx1ZSBjbG9zZXIgdG8gdGhlIHRocmVhZCdzIG1Sc21wSW5Gcm9udCwgdGhlbiB0aGUgdHJhY2sgY291bGQKKyAgICAgICAgLy8gc2VlIHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YSBiZWZvcmUgaXQgY2FsbGVkIHN0YXJ0KCksIGJ1dCB3aXRoIGdyZWF0ZXIgcmlzayBvZiBvdmVycnVuLgorCisgICAgICAgIHJlY29yZFRyYWNrLT5tUnNtcEluRnJvbnQgPSBtUnNtcEluUmVhcjsKKyAgICAgICAgcmVjb3JkVHJhY2stPm1Sc21wSW5VbnJlbCA9IDA7CisgICAgICAgIC8vIEZJWE1FIHdoeSByZXNldD8KKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVzYW1wbGVyLT5yZXNldCgpOwogICAgICAgICB9Ci0gICAgICAgIG1BY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKKyAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdGFydAotICAgICAgICBBTE9HVigiU2lnbmFsIHJlY29yZCB0aHJlYWQiKTsKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICBtQWN0aXZlVHJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwotICAgICAgICB9Ci0gICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrID09IDApIHsKKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7CiAgICAgICAgICAgICBBTE9HVigiUmVjb3JkIGZhaWxlZCB0byBzdGFydCIpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBzdGFydEVycm9yOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJSZWNvcmQgc3RhcnRlZCBPSyIpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogc3RhcnRFcnJvcjoKLSAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1JZCk7Ci0gICAgY2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNsZWFyU3luY1N0YXJ0RXZlbnQoKQotewotICAgIGlmIChtU3luY1N0YXJ0RXZlbnQgIT0gMCkgewotICAgICAgICBtU3luY1N0YXJ0RXZlbnQtPmNhbmNlbCgpOworICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQsIChhdWRpb19zZXNzaW9uX3QpcmVjb3JkVHJhY2stPnNlc3Npb25JZCgpKTsKICAgICB9Ci0gICAgbVN5bmNTdGFydEV2ZW50LmNsZWFyKCk7Ci0gICAgbUZyYW1lc3RvRHJvcCA9IDA7CisgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC00ODY0LDQ2ICs1NzQ3LDQyIEBACiAgICAgc3A8U3luY0V2ZW50PiBzdHJvbmdFdmVudCA9IGV2ZW50LnByb21vdGUoKTsKIAogICAgIGlmIChzdHJvbmdFdmVudCAhPSAwKSB7Ci0gICAgICAgIFJlY29yZFRocmVhZCAqbWUgPSAoUmVjb3JkVGhyZWFkICopc3Ryb25nRXZlbnQtPmNvb2tpZSgpOwotICAgICAgICBtZS0+aGFuZGxlU3luY1N0YXJ0RXZlbnQoc3Ryb25nRXZlbnQpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCi17Ci0gICAgaWYgKGV2ZW50ID09IG1TeW5jU3RhcnRFdmVudCkgewotICAgICAgICAvLyBUT0RPOiB1c2UgYWN0dWFsIGJ1ZmZlciBmaWxsaW5nIHN0YXR1cyBpbnN0ZWFkIG9mIDIgYnVmZmVycyB3aGVuIGluZm8gaXMgYXZhaWxhYmxlCi0gICAgICAgIC8vIGZyb20gYXVkaW8gSEFMCi0gICAgICAgIG1GcmFtZXN0b0Ryb3AgPSBtRnJhbWVDb3VudCAqIDI7CisgICAgICAgIHNwPFJlZkJhc2U+IHB0ciA9IHN0cm9uZ0V2ZW50LT5jb29raWUoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwdHIgIT0gMCkgeworICAgICAgICAgICAgUmVjb3JkVHJhY2sgKnJlY29yZFRyYWNrID0gKFJlY29yZFRyYWNrICopcHRyLmdldCgpOworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmhhbmRsZVN5bmNTdGFydEV2ZW50KHN0cm9uZ0V2ZW50KTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIGlmIChyZWNvcmRUcmFjayAhPSBtQWN0aXZlVHJhY2suZ2V0KCkgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSAhPSAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwogICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCiAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIC8vIEZJWE1FIGluY29ycmVjdCB1c2FnZSBvZiB3YWl0OiBubyBleHBsaWNpdCBwcmVkaWNhdGUgb3IgbG9vcAogICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrID09IG1BY3RpdmVUcmFjay5nZXQoKSBoZXJlCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgcmVjb3JkVHJhY2sgIT0gbUFjdGl2ZVRyYWNrLmdldCgpKSB7CisgICAgLy8gaWYgd2UgaGF2ZSBiZWVuIHJlc3RhcnRlZCwgcmVjb3JkVHJhY2sgaXMgaW4gbUFjdGl2ZVRyYWNrcyBoZXJlCisgICAgaWYgKGV4aXRQZW5kaW5nKCkgfHwgbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSAhPSAwKSB7CiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjppc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdAorYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCBfX3VudXNlZCkgY29uc3QKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50IF9fdW51c2VkKQogewogI2lmIDAgICAvLyBUaGlzIGJyYW5jaCBpcyBjdXJyZW50bHkgZGVhZCBjb2RlLCBidXQgaXMgcHJlc2VydmVkIGluIGNhc2UgaXQgd2lsbCBiZSBuZWVkZWQgaW4gZnV0dXJlCiAgICAgaWYgKCFpc1ZhbGlkU3luY0V2ZW50KGV2ZW50KSkgewpAQCAtNDkzNCw3ICs1ODEzLDcgQEAKICAgICB0cmFjay0+dGVybWluYXRlKCk7CiAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKICAgICAvLyBhY3RpdmUgdHJhY2tzIGFyZSByZW1vdmVkIGJ5IHRocmVhZExvb3AoKQotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gdHJhY2spIHsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CiAgICAgfQogfQpAQCAtNDk0Myw2ICs1ODIyLDEwIEBACiB7CiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwogICAgIC8vIG5lZWQgYW55dGhpbmcgcmVsYXRlZCB0byBlZmZlY3RzIGhlcmU/CisgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKCFtRmFzdFRyYWNrQXZhaWwpOworICAgICAgICBtRmFzdFRyYWNrQXZhaWwgPSB0cnVlOworICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC00OTU0LDIxNyArNTgzNywyMzYgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZHByaW50ZihmZCwgIlxuSW5wdXQgdGhyZWFkICVwOlxuIiwgdGhpcyk7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBpbnRlcm5hbHNcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJJbiBpbmRleDogJWRcbiIsIG1Sc21wSW5JbmRleCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVzYW1wbGluZzogJWRcbiIsIChtUmVzYW1wbGVyICE9IE5VTEwpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXQgY2hhbm5lbCBjb3VudDogJXVcbiIsIG1SZXFDaGFubmVsQ291bnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dCBzYW1wbGUgcmF0ZTogJXVcbiIsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgQnVmZmVyIHNpemU6ICV6dSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk5vIGFjdGl2ZSByZWNvcmQgY2xpZW50XG4iKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGYXN0IGNhcHR1cmUgdGhyZWFkOiAlc1xuIiwgaGFzRmFzdENhcHR1cmUoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbGFibGU6ICVzXG4iLCBtRmFzdFRyYWNrQXZhaWwgPyAieWVzIiA6ICJubyIpOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiSW5wdXQgdGhyZWFkICVwIHRyYWNrc1xuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmICh0cmFjayAhPSAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+ZHVtcChidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgbnVtYWN0aXZlID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CisgICAgc2l6ZV90IG51bWFjdGl2ZXNlZW4gPSAwOworICAgIGRwcmludGYoZmQsICIgICVkIFRyYWNrcyIsIG51bXRyYWNrcyk7CisgICAgaWYgKG51bXRyYWNrcykgeworICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICVkIGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CisgICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CisgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICBib29sIGFjdGl2ZSA9IG1BY3RpdmVUcmFja3MuaW5kZXhPZih0cmFjaykgPj0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG51bWFjdGl2ZXNlZW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFLCBhY3RpdmUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICJcbiIpOwogICAgIH0KIAotICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0IHRocmVhZCAlcCBhY3RpdmUgdHJhY2tzXG4iLCB0aGlzKTsKKyAgICBpZiAobnVtYWN0aXZlc2VlbiAhPSBudW1hY3RpdmUpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKKyAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgeworICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5kdW1wKGJ1ZmZlciwgU0laRSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICB9CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKLSAgICBzaXplX3QgZnJhbWVzUmVxID0gYnVmZmVyLT5mcmFtZUNvdW50OwotICAgIHNpemVfdCBmcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50IC0gbVJzbXBJbkluZGV4OwotICAgIGludCBjaGFubmVsQ291bnQ7Ci0KLSAgICBpZiAoZnJhbWVzUmVhZHkgPT0gMCkgewotICAgICAgICBtQnl0ZXNSZWFkID0gbUlucHV0LT5zdHJlYW0tPnJlYWQobUlucHV0LT5zdHJlYW0sIG1Sc21wSW5CdWZmZXIsIG1CdWZmZXJTaXplKTsKLSAgICAgICAgaWYgKG1CeXRlc1JlYWQgPD0gMCkgewotICAgICAgICAgICAgaWYgKChtQnl0ZXNSZWFkIDwgMCkgJiYgKG1BY3RpdmVUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6QUNUSVZFKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWNvcmRUaHJlYWQ6OmdldE5leHRCdWZmZXIoKSBFcnJvciByZWFkaW5nIGF1ZGlvIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgaW5wdXQgaW50byBzdGFuZGJ5IHNvIHRoYXQgaXQgdHJpZXMgdG8KLSAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGF0IG5leHQgcmVhZCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKGtSZWNvcmRUaHJlYWRTbGVlcFVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICB9Ci0gICAgICAgIG1Sc21wSW5JbmRleCA9IDA7Ci0gICAgICAgIGZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQ7CisgICAgUmVjb3JkVHJhY2sgKmFjdGl2ZVRyYWNrID0gbVJlY29yZFRyYWNrOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBhY3RpdmVUcmFjay0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZEJhc2UgPT0gMCkgeworICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQorICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSk7CisgICAgLy8gJ2ZpbGxlZCcgbWF5IGJlIG5vbi1jb250aWd1b3VzLCBzbyByZXR1cm4gb25seSB0aGUgZmlyc3QgY29udGlndW91cyBjaHVuaworICAgIGZyb250ICY9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICBzaXplX3QgcGFydDEgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIGZyb250OworICAgIGlmIChwYXJ0MSA+IChzaXplX3QpIGZpbGxlZCkgeworICAgICAgICBwYXJ0MSA9IGZpbGxlZDsKKyAgICB9CisgICAgc2l6ZV90IGFzayA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBBTE9HX0FTU0VSVChhc2sgPiAwKTsKKyAgICBpZiAocGFydDEgPiBhc2spIHsKKyAgICAgICAgcGFydDEgPSBhc2s7CisgICAgfQorICAgIGlmIChwYXJ0MSA9PSAwKSB7CisgICAgICAgIC8vIEhpZ2hlci1sZXZlbCBzaG91bGQga2VlcCBtUnNtcEluQnVmZmVyIGZ1bGwsIGFuZCBub3QgY2FsbCByZXNhbXBsZXIgaWYgZW1wdHkKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVjb3JkVGhyZWFkOjpnZXROZXh0QnVmZmVyKCkgc3RhcnZlZCIpOworICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGlmIChmcmFtZXNSZXEgPiBmcmFtZXNSZWFkeSkgewotICAgICAgICBmcmFtZXNSZXEgPSBmcmFtZXNSZWFkeTsKLSAgICB9Ci0KLSAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMikgewotICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYW5uZWxDb3VudCA9IDI7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmF3ID0gbVJzbXBJbkJ1ZmZlciArIG1Sc21wSW5JbmRleCAqIGNoYW5uZWxDb3VudDsKLSAgICBidWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXNSZXE7CisgICAgYnVmZmVyLT5yYXcgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUNoYW5uZWxDb3VudDsKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwYXJ0MTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gcGFydDE7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBtUnNtcEluSW5kZXggKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKKyAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGlmIChzdGVwQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsKTsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKKyAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKQorYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwogCi0gICAgd2hpbGUgKCFtTmV3UGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlyID0gbU5ld1BhcmFtZXRlcnNbMF07Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKLSAgICAgICAgaW50IHZhbHVlOwotICAgICAgICBhdWRpb19mb3JtYXRfdCByZXFGb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCByZXFTYW1wbGluZ1JhdGUgPSBtUmVxU2FtcGxlUmF0ZTsKLSAgICAgICAgdWludDMyX3QgcmVxQ2hhbm5lbENvdW50ID0gbVJlcUNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxU2FtcGxpbmdSYXRlID0gdmFsdWU7CisgICAgYXVkaW9fZm9ybWF0X3QgcmVxRm9ybWF0ID0gbUZvcm1hdDsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG1DaGFubmVsQ291bnQpOworCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOworICAgIGludCB2YWx1ZTsKKyAgICAvLyBUT0RPIEludmVzdGlnYXRlIHdoZW4gdGhpcyBjb2RlIHJ1bnMuIENoZWNrIHdpdGggYXVkaW8gcG9saWN5IHdoZW4gYSBzYW1wbGUgcmF0ZSBhbmQKKyAgICAvLyAgICAgIGNoYW5uZWwgY291bnQgY2hhbmdlIGNhbiBiZSByZXF1ZXN0ZWQuIERvIHdlIG1hbmRhdGUgdGhlIGZpcnN0IGNsaWVudCBkZWZpbmVzIHRoZQorICAgIC8vICAgICAgSEFMIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgY291bnQgb3IgZG8gd2UgYWxsb3cgY2hhbmdlcyBvbiB0aGUgZmx5PworICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHZhbHVlOworICAgICAgICByZWNvbmZpZyA9IHRydWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXFGb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIHZhbHVlOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVxRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcmVxQ2hhbm5lbENvdW50ID0gcG9wY291bnQodmFsdWUpOworICAgIH0KKyAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOworICAgICAgICBpZiAobWFzayAhPSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgbWFzayAhPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykgeworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtYXNrOwogICAgICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAvLyBzaXplIGRlcGVuZHMgb24gZnJhbWUgY291bnQgYW5kIGNvcnJlY3QgYmVoYXZpb3Igd291bGQgbm90IGJlIGd1YXJhbnRlZWQKLSAgICAgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KLSAgICAgICAgICAgIGlmIChtQWN0aXZlVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBkbyBub3QgYWNjZXB0IGZyYW1lIGNvdW50IGNoYW5nZXMgaWYgdHJhY2tzIGFyZSBvcGVuIGFzIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgLy8gc2l6ZSBkZXBlbmRzIG9uIGZyYW1lIGNvdW50IGFuZCBjb3JyZWN0IGJlaGF2aW9yIHdvdWxkIG5vdCBiZSBndWFyYW50ZWVkCisgICAgICAgIC8vIGlmIGZyYW1lIGNvdW50IGlzIGNoYW5nZWQgYWZ0ZXIgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbmZpZyA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7Ci0gICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCisgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh2YWx1ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gc3RvcmUgaW5wdXQgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlIGJ1dCBkbyBub3QgZm9yd2FyZCBvdXRwdXQgZGV2aWNlIHRvIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBzdGF0dXMgaXMgaWdub3JlZCBieSB0aGUgY2FsbGVyIGZvciBvdXRwdXQgZGV2aWNlCi0gICAgICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZXModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCi0gICAgICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBzdG9yZSBpbnB1dCBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UgYnV0IGRvIG5vdCBmb3J3YXJkIG91dHB1dCBkZXZpY2UgdG8gYXVkaW8gSEFMLgorICAgICAgICAvLyBOb3RlIHRoYXQgc3RhdHVzIGlzIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBmb3Igb3V0cHV0IGRldmljZQorICAgICAgICAvLyAoc2VlIEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycygpCisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbkRldmljZSA9IHZhbHVlOworICAgICAgICAgICAgLy8gZGlzYWJsZSBBRUMgYW5kIE5TIGlmIHRoZSBkZXZpY2UgaXMgYSBCVCBTQ08gaGVhZHNldCBzdXBwb3J0aW5nIHRob3NlCisgICAgICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKKyAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgIT0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlKSB7Ci0gICAgICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKChhdWRpb19zb3VyY2VfdCl2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpdmFsdWU7CisgICAgfQorICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLCB2YWx1ZSkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZSAhPSAoYXVkaW9fc291cmNlX3QpdmFsdWUpIHsKKyAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQorICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbCgoYXVkaW9fc291cmNlX3QpdmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOworICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBrZXlWYWx1ZVBhaXIuc3RyaW5nKCkpOworICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICBpbnB1dFN0YW5kQnkoKTsKICAgICAgICAgICAgIHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24sCiAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdGFuZEJ5KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY29uZmlnKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgorICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pICYmCisgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCisgICAgICAgICAgICAgICAgKG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgPD0gKDIgKiBzYW1wbGluZ1JhdGUpKSAmJgorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pKSA8PSBGQ0NfMiAmJgorICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVxRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCi0gICAgICAgICAgICAgICAgICAgIChtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHJlcVNhbXBsaW5nUmF0ZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBGQ0NfMiAmJgotICAgICAgICAgICAgICAgICAgICAocmVxQ2hhbm5lbENvdW50IDw9IEZDQ18yKSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06OklOUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CisgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgbU5ld1BhcmFtZXRlcnMucmVtb3ZlQXQoMCk7Ci0KLSAgICAgICAgbVBhcmFtU3RhdHVzID0gc3RhdHVzOwotICAgICAgICBtUGFyYW1Db25kLnNpZ25hbCgpOwotICAgICAgICAvLyB3YWl0IGZvciBjb25kaXRpb24gd2l0aCB0aW1lIG91dCBpbiBjYXNlIHRoZSB0aHJlYWQgY2FsbGluZyBUaHJlYWRCYXNlOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgLy8gYWxyZWFkeSB0aW1lZCBvdXQgd2FpdGluZyBmb3IgdGhlIHN0YXR1cyBhbmQgd2lsbCBuZXZlciBzaWduYWwgdGhlIGNvbmRpdGlvbi4KLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBrU2V0UGFyYW1ldGVyc1RpbWVvdXROcyk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlY29uZmlnOwogfQogCkBAIC01MTgxLDkgKzYwODMsOSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gX191bnVzZWQpIHsKICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwotICAgIHZvaWQgKnBhcmFtMiA9IE5VTEw7CisgICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CkBAIC01MjAwLDU3ICs2MTAyLDQ5IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIG1BdWRpb0ZsaW5nZXItPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGV2ZW50LCBtSWQsIHBhcmFtMik7CisgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBtSWQsIHBhcmFtMik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnMoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKIHsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOwotICAgIC8vIG1Sc21wSW5CdWZmZXIgaXMgYWx3YXlzIGFzc2lnbmVkIGEgbmV3W10gYmVsb3cKLSAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKLSAgICBtUnNtcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0KICAgICBtU2FtcGxlUmF0ZSA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtQ2hhbm5lbE1hc2sgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUNoYW5uZWxDb3VudCA9IHBvcGNvdW50KG1DaGFubmVsTWFzayk7Ci0gICAgbUZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUhBTEZvcm1hdCA9IG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2Zvcm1hdCgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUZvcm1hdCA9IG1IQUxGb3JtYXQ7CiAgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgQUxPR0UoIkhBTCBmb3JtYXQgJWQgbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOworICAgICAgICBBTE9HRSgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZDsgbXVzdCBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCIsIG1Gb3JtYXQpOwogICAgIH0KLSAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1GcmFtZVNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtSW5wdXQtPnN0cmVhbSk7CiAgICAgbUJ1ZmZlclNpemUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W21GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudF07Ci0gICAgbWVtc2V0KG1Sc21wSW5CdWZmZXIsIDAsIG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCAqIHNpemVvZihtUnNtcEluQnVmZmVyWzBdKSk7CisgICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KKyAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCisgICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgorICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KKyAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKKyAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICBtUnNtcEluRnJhbWVzID0gbUZyYW1lQ291bnQgKiA3OworICAgIG1Sc21wSW5GcmFtZXNQMiA9IHJvdW5kdXAobVJzbXBJbkZyYW1lcyk7CisgICAgZGVsZXRlW10gbVJzbXBJbkJ1ZmZlcjsKIAotICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBtUmVxU2FtcGxlUmF0ZSAmJiBtQ2hhbm5lbENvdW50IDw9IEZDQ18yICYmIG1SZXFDaGFubmVsQ291bnQgPD0gRkNDXzIpCi0gICAgewotICAgICAgICBpbnQgY2hhbm5lbENvdW50OwotICAgICAgICAvLyBvcHRpbWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgdXNlIHRoZSByZXNhbXBsZXIgaW4gc3RlcmVvIHRvIHN0ZXJlbyBtb2RlIHRvIGF2b2lkCi0gICAgICAgIC8vIHN0ZXJlbyB0byBtb25vIHBvc3QgcHJvY2VzcyBhcyB0aGUgcmVzYW1wbGVyIGFsd2F5cyBvdXRwdXRzIHN0ZXJlby4KLSAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSAmJiBtUmVxQ2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFubmVsQ291bnQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVsQ291bnQsIG1SZXFTYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOLCBBdWRpb01peGVyOjpVTklUWV9HQUlOKTsKLSAgICAgICAgbVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFttRnJhbWVDb3VudCAqIEZDQ18yXTsKKyAgICAvLyBUT0RPIG9wdGltaXplIGF1ZGlvIGNhcHR1cmUgYnVmZmVyIHNpemVzIC4uLgorICAgIC8vIEhlcmUgd2UgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzbGlkaW5nIGJ1ZmZlciB1c2VkIGFzIGEgc291cmNlCisgICAgLy8gZm9yIHJlc2FtcGxpbmcuICBtUnNtcEluRnJhbWVzUDIgaXMgY3VycmVudGx5IHJvdW5kdXAobUZyYW1lQ291bnQgKiA3KS4KKyAgICAvLyBGb3IgY3VycmVudCBIQUwgZnJhbWUgY291bnRzLCB0aGlzIGlzIHVzdWFsbHkgMjA0OCA9IDQwIG1zLiAgSXQgd291bGQKKyAgICAvLyBiZSBiZXR0ZXIgdG8gaGF2ZSBpdCBkZXJpdmVkIGZyb20gdGhlIHBpcGUgZGVwdGggaW4gdGhlIGxvbmcgdGVybS4KKyAgICAvLyBUaGUgY3VycmVudCB2YWx1ZSBpcyBoaWdoZXIgdGhhbiBuZWNlc3NhcnkuICBIb3dldmVyIGl0IHNob3VsZCBub3QgYWRkIHRvIGxhdGVuY3kuCiAKLSAgICAgICAgLy8gb3B0bWl6YXRpb246IGlmIG1vbm8gdG8gbW9ubywgYWx0ZXIgaW5wdXQgZnJhbWUgY291bnQgYXMgaWYgd2Ugd2VyZSBpbnB1dGluZwotICAgICAgICAvLyBzdGVyZW8gc2FtcGxlcwotICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxICYmIG1SZXFDaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgbUZyYW1lQ291bnQgPj49IDE7Ci0gICAgICAgIH0KKyAgICAvLyBPdmVyLWFsbG9jYXRlIGJleW9uZCBtUnNtcEluRnJhbWVzUDIgdG8gcGVybWl0IGEgSEFMIHJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyCisgICAgc2l6ZV90IGJ1ZmZlclNpemVJblNob3J0cyA9IChtUnNtcEluRnJhbWVzUDIgKyBtRnJhbWVDb3VudCAtIDEpICogbUNoYW5uZWxDb3VudDsKKyAgICBtUnNtcEluQnVmZmVyID0gbmV3IGludDE2X3RbYnVmZmVyU2l6ZUluU2hvcnRzXTsKKyAgICBtZW1zZXQobVJzbXBJbkJ1ZmZlciwgMCwgYnVmZmVyU2l6ZUluU2hvcnRzICogc2l6ZW9mKG1Sc21wSW5CdWZmZXJbMF0pKTsKIAotICAgIH0KLSAgICBtUnNtcEluSW5kZXggPSBtRnJhbWVDb3VudDsKKyAgICAvLyBBdWRpb1JlY29yZCBtU2FtcGxlUmF0ZSBhbmQgbUNoYW5uZWxDb3VudCBhcmUgY29uc3RhbnQgZHVlIHRvIEF1ZGlvUmVjb3JkIEFQSSBjb25zdHJhaW50cy4KKyAgICAvLyBCdXQgaWYgdGhyZWFkJ3MgbVNhbXBsZVJhdGUgb3IgbUNoYW5uZWxDb3VudCBjaGFuZ2VzLCBob3cgd2lsbCB0aGF0IGFmZmVjdCBhY3RpdmUgdHJhY2tzPwogfQogCi11bnNpZ25lZCBpbnQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldElucHV0RnJhbWVzTG9zdCgpCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChpbml0Q2hlY2soKSAhPSBOT19FUlJPUikgewpAQCAtNTMxMywxNSArNjIwNywyMCBAQAogewogICAgIC8vIG9ubHkgb25lIGNoYWluIHBlciBpbnB1dCB0aHJlYWQKICAgICBpZiAobUVmZmVjdENoYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICBBTE9HVygiYWRkRWZmZWN0Q2hhaW5fbCgpIGFscmVhZHkgb25lIGNoYWluICVwIG9uIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCIsIGNoYWluLmdldCgpLCB0aGlzKTsKLQorICAgIGNoYWluLT5zZXRUaHJlYWQodGhpcyk7CiAgICAgY2hhaW4tPnNldEluQnVmZmVyKE5VTEwpOwogICAgIGNoYWluLT5zZXRPdXRCdWZmZXIoTlVMTCk7CiAKICAgICBjaGVja1N1c3BlbmRPbkFkZEVmZmVjdENoYWluX2woY2hhaW4pOwogCisgICAgLy8gbWFrZSBzdXJlIGVuYWJsZWQgcHJlIHByb2Nlc3NpbmcgZWZmZWN0cyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gdGhlIEhBTCBhcyB3ZQorICAgIC8vIGp1c3QgbW92ZWQgdGhlbSB0byBhIG5ldyBpbnB1dCBzdHJlYW0uCisgICAgY2hhaW4tPnN5bmNIYWxFZmZlY3RzU3RhdGUoKTsKKwogICAgIG1FZmZlY3RDaGFpbnMuYWRkKGNoYWluKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTUzMzksNCArNjIzOCw4MCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKKyAgICAgICAgbUluRGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1JbkRldmljZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKKyAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmdzCisgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+YnROcmVjSXNPZmYoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX0FFQywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfTlMsIHN1c3BlbmQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzdG9yZSBuZXcgc291cmNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKKyAgICAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSkgeworICAgICAgICAgICAgbUF1ZGlvU291cmNlID0gcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKG1BdWRpb1NvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgImNyZWF0ZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7CisgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCBoYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicmVsZWFzZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVRyYWNrcy5hZGQocmVjb3JkKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBkZXN0cm95VHJhY2tfbChyZWNvcmQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgY29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aGFuZGxlKCk7CisgICAgY29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gbUF1ZGlvU291cmNlOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKaW5kZXggYmI5MmRmMS4uZWNiOGU0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCkBAIC0zNiw2ICszNiw4IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCB0eXBlX3QgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CisKICAgICB2b2lkIGR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTQ0LDYwICs0NiwxNjkgQEAKICAgICAvLyBiYXNlIGZvciByZWNvcmQgYW5kIHBsYXliYWNrCiAgICAgZW51bSB7CiAgICAgICAgIENGR19FVkVOVF9JTywKLSAgICAgICAgQ0ZHX0VWRU5UX1BSSU8KKyAgICAgICAgQ0ZHX0VWRU5UX1BSSU8sCisgICAgICAgIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSLAorICAgICAgICBDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENILAorICAgICAgICBDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSCwKICAgICB9OwogCi0gICAgY2xhc3MgQ29uZmlnRXZlbnQgeworICAgIGNsYXNzIENvbmZpZ0V2ZW50RGF0YTogcHVibGljIFJlZkJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgQ29uZmlnRXZlbnQoaW50IHR5cGUpIDogbVR5cGUodHlwZSkge30KLSAgICAgICAgdmlydHVhbCB+Q29uZmlnRXZlbnQoKSB7fQotCi0gICAgICAgICAgICAgICAgIGludCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKyAgICAgICAgdmlydHVhbCB+Q29uZmlnRXZlbnREYXRhKCkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgaW50IG1UeXBlOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQ29uZmlnRXZlbnREYXRhKCkge30KICAgICB9OwogCi0gICAgY2xhc3MgSW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7Ci0gICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50KGludCBldmVudCwgaW50IHBhcmFtKSA6Ci0gICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pLCBtRXZlbnQoZXZlbnQpLCBtUGFyYW0oZXZlbnQpIHt9Ci0gICAgICAgIHZpcnR1YWwgfklvQ29uZmlnRXZlbnQoKSB7fQorICAgIC8vIENvbmZpZyBldmVudCBzZXF1ZW5jZSBieSBjbGllbnQgaWYgc3RhdHVzIG5lZWRlZCAoZS5nIGJpbmRlciB0aHJlYWQgY2FsbGluZyBzZXRQYXJhbWV0ZXJzKCkpOgorICAgIC8vICAxLiBjcmVhdGUgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnQuIFRoaXMgc2V0cyBtV2FpdFN0YXR1cyBpbiBjb25maWcgZXZlbnQKKyAgICAvLyAgMi4gTG9jayBtTG9jaworICAgIC8vICAzLiBDYWxsIHNlbmRDb25maWdFdmVudF9sKCk6IEFwcGVuZCB0byBtQ29uZmlnRXZlbnRzIGFuZCBtV2FpdFdvcmtDVi5zaWduYWwKKyAgICAvLyAgNC4gc2VuZENvbmZpZ0V2ZW50X2woKSByZWFkcyBzdGF0dXMgZnJvbSBldmVudC0+bVN0YXR1czsKKyAgICAvLyAgNS4gc2VuZENvbmZpZ0V2ZW50X2woKSByZXR1cm5zIHN0YXR1cworICAgIC8vICA2LiBVbmxvY2sKKyAgICAvLworICAgIC8vIFBhcmFtZXRlciBzZXF1ZW5jZSBieSBzZXJ2ZXI6IHRocmVhZExvb3AgY2FsbGluZyBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKToKKyAgICAvLyAxLiBMb2NrIG1Mb2NrCisgICAgLy8gMi4gSWYgdGhlcmUgaXMgYW4gZW50cnkgaW4gbUNvbmZpZ0V2ZW50cyBwcm9jZWVkIC4uLgorICAgIC8vIDMuIFJlYWQgZmlyc3QgZW50cnkgaW4gbUNvbmZpZ0V2ZW50cworICAgIC8vIDQuIFJlbW92ZSBmaXJzdCBlbnRyeSBmcm9tIG1Db25maWdFdmVudHMKKyAgICAvLyA1LiBQcm9jZXNzCisgICAgLy8gNi4gU2V0IGV2ZW50LT5tU3RhdHVzCisgICAgLy8gNy4gZXZlbnQtPm1Db25kLnNpZ25hbAorICAgIC8vIDguIFVubG9jawogCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50KCkgY29uc3QgeyByZXR1cm4gbUV2ZW50OyB9Ci0gICAgICAgICAgICAgICAgaW50IHBhcmFtKCkgY29uc3QgeyByZXR1cm4gbVBhcmFtOyB9CisgICAgY2xhc3MgQ29uZmlnRXZlbnQ6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkNvbmZpZ0V2ZW50KCkge30KKworICAgICAgICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeyBtRGF0YS0+ZHVtcChidWZmZXIsIHNpemUpOyB9CisKKyAgICAgICAgY29uc3QgaW50IG1UeXBlOyAvLyBldmVudCB0eXBlIGUuZy4gQ0ZHX0VWRU5UX0lPCisgICAgICAgIE11dGV4IG1Mb2NrOyAgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB3aXRoIG1Db25kCisgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCisgICAgICAgIHN0YXR1c190IG1TdGF0dXM7IC8vIHN0YXR1cyBjb21tdW5pY2F0ZWQgdG8gc2VuZGVyCisgICAgICAgIGJvb2wgbVdhaXRTdGF0dXM7IC8vIHRydWUgaWYgc2VuZGVyIGlzIHdhaXRpbmcgZm9yIHN0YXR1cworICAgICAgICBzcDxDb25maWdFdmVudERhdGE+IG1EYXRhOyAgICAgLy8gZXZlbnQgc3BlY2lmaWMgcGFyYW1ldGVyIGRhdGEKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQ29uZmlnRXZlbnQoaW50IHR5cGUpIDogbVR5cGUodHlwZSksIG1TdGF0dXMoTk9fRVJST1IpLCBtV2FpdFN0YXR1cyhmYWxzZSksIG1EYXRhKE5VTEwpIHt9CisgICAgfTsKKworICAgIGNsYXNzIElvQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShpbnQgZXZlbnQsIGludCBwYXJhbSkgOgorICAgICAgICAgICAgbUV2ZW50KGV2ZW50KSwgbVBhcmFtKHBhcmFtKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJJTyBldmVudDogZXZlbnQgJWQsIHBhcmFtICVkXG4iLCBtRXZlbnQsIG1QYXJhbSk7CiAgICAgICAgIH0KIAotICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IGludCBtRXZlbnQ7CiAgICAgICAgIGNvbnN0IGludCBtUGFyYW07CiAgICAgfTsKIAotICAgIGNsYXNzIFByaW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgY2xhc3MgSW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgotICAgICAgICBQcmlvQ29uZmlnRXZlbnQocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykgOgotICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8pLCBtUGlkKHBpZCksIG1UaWQodGlkKSwgbVByaW8ocHJpbykge30KLSAgICAgICAgdmlydHVhbCB+UHJpb0NvbmZpZ0V2ZW50KCkge30KKyAgICAgICAgSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX0lPKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBJb0NvbmZpZ0V2ZW50RGF0YShldmVudCwgcGFyYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgfklvQ29uZmlnRXZlbnQoKSB7fQorICAgIH07CiAKLSAgICAgICAgICAgICAgICBwaWRfdCBwaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9Ci0gICAgICAgICAgICAgICAgcGlkX3QgdGlkKCkgY29uc3QgeyByZXR1cm4gbVRpZDsgfQotICAgICAgICAgICAgICAgIGludDMyX3QgcHJpbygpIGNvbnN0IHsgcmV0dXJuIG1QcmlvOyB9CisgICAgY2xhc3MgUHJpb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHJpb0NvbmZpZ0V2ZW50RGF0YShwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKSA6CisgICAgICAgICAgICBtUGlkKHBpZCksIG1UaWQodGlkKSwgbVByaW8ocHJpbykge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewogICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiUHJpbyBldmVudDogcGlkICVkLCB0aWQgJWQsIHByaW8gJWRcbiIsIG1QaWQsIG1UaWQsIG1QcmlvKTsKICAgICAgICAgfQogCi0gICAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgcGlkX3QgbVBpZDsKICAgICAgICAgY29uc3QgcGlkX3QgbVRpZDsKICAgICAgICAgY29uc3QgaW50MzJfdCBtUHJpbzsKICAgICB9OwogCisgICAgY2xhc3MgUHJpb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfUFJJTykgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgUHJpb0NvbmZpZ0V2ZW50RGF0YShwaWQsIHRpZCwgcHJpbyk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+UHJpb0NvbmZpZ0V2ZW50KCkge30KKyAgICB9OworCisgICAgY2xhc3MgU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhIDogcHVibGljIENvbmZpZ0V2ZW50RGF0YSB7CisgICAgcHVibGljOgorICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEoU3RyaW5nOCBrZXlWYWx1ZVBhaXJzKSA6CisgICAgICAgICAgICBtS2V5VmFsdWVQYWlycyhrZXlWYWx1ZVBhaXJzKSB7fQorCisgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJLZXlWYWx1ZTogJXNcbiIsIG1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFN0cmluZzggbUtleVZhbHVlUGFpcnM7CisgICAgfTsKKworICAgIGNsYXNzIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50KFN0cmluZzgga2V5VmFsdWVQYWlycykgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVIpIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YShrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgIG1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5TZXRQYXJhbWV0ZXJDb25maWdFdmVudCgpIHt9CisgICAgfTsKKworICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgOgorICAgICAgICAgICAgbVBhdGNoKHBhdGNoKSwgbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlBhdGNoIGhhbmRsZTogJXVcbiIsIG1IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICB9OworCisgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIDoKKyAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEocGF0Y2gsIGhhbmRsZSk7CisgICAgICAgICAgICBtV2FpdFN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+Q3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KCkge30KKyAgICB9OworCisgICAgY2xhc3MgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgOgorICAgICAgICAgICAgbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlBhdGNoIGhhbmRsZTogJXVcbiIsIG1IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICB9OworCisgICAgY2xhc3MgUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgOgorICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhKGhhbmRsZSk7CisgICAgICAgICAgICBtV2FpdFN0YXR1cyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+UmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudCgpIHt9CisgICAgfTsKIAogICAgIGNsYXNzIFBNRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKQEAgLTEyNCw5ICsyMzUsOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBleHRlcm5hbGx5LXZpc2libGUKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbE1hc2s7IH0KLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUhBTEZvcm1hdDsgfQorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgYnkgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgYW5kIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIFtub3JtYWwgbWl4XSBidWZmZXIncyBmcmFtZSBjb3VudC4KICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgPSAwOwpAQCAtMTM1LDE0ICsyNDYsMjkgQEAKICAgICAvLyBTaG91bGQgYmUgInZpcnR1YWwgc3RhdHVzX3QgcmVxdWVzdEV4aXRBbmRXYWl0KCkiIGFuZCBvdmVycmlkZSBzYW1lCiAgICAgLy8gbWV0aG9kIGluIFRocmVhZCwgYnV0IFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHlldCB2aXJ0dWFsLgogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpID0gMDsKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgICAgICAgICAgICAgLy8gc2VuZENvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKKyAgICAgICAgICAgICAgICAvLyBDYW4gdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGUgbG9jayBpZiB3YWl0aW5nIGZvciBhIHJlcGx5IGZyb20KKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKS4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29uZmlnRXZlbnRfbChzcDxDb25maWdFdmVudD4mIGV2ZW50KTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbyk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRTZXRQYXJhbWV0ZXJDb25maWdFdmVudF9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcik7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpID0gMDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGFuZGJ5KCkgY29uc3QgeyByZXR1cm4gbVN0YW5kYnk7IH0KQEAgLTE1OCwxMCArMjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdm9pZCBkaXNjb25uZWN0RWZmZWN0KGNvbnN0IHNwPCBFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVucGluSWZMYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMgLypub24tTlVMTCovKTsKIAogICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZXMgZm9yIGhhc0F1ZGlvU2Vzc2lvbiAoYml0IGZpZWxkKQogICAgICAgICAgICAgICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKQEAgLTIwMCwxMyArMzIzLDEzIEBACiAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CiAgICAgICAgICAgICAgICAgdm9pZCByZW1vdmVFZmZlY3RfbChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKICAgICAgICAgICAgICAgICAvLyBkZXRhY2ggYWxsIHRyYWNrcyBjb25uZWN0ZWQgdG8gYW4gYXV4aWxpYXJ5IGVmZmVjdAotICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkKSB7fQorICAgIHZpcnR1YWwgICAgIHZvaWQgZGV0YWNoQXV4RWZmZWN0X2woaW50IGVmZmVjdElkIF9fdW51c2VkKSB7fQogICAgICAgICAgICAgICAgIC8vIHJldHVybnMgZWl0aGVyIEVGRkVDVF9TRVNTSU9OIGlmIGVmZmVjdHMgb24gdGhpcyBhdWRpbyBzZXNzaW9uIGV4aXN0IGluIG9uZQogICAgICAgICAgICAgICAgIC8vIGNoYWluLCBvciBUUkFDS19TRVNTSU9OIGlmIHRyYWNrcyBvbiB0aGlzIGF1ZGlvIHNlc3Npb24gZXhpc3QsIG9yIGJvdGgKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgbm90IGltcG9ydGFudCBhcyB0aGUKICAgICAgICAgICAgICAgICAvLyBzdHJhdGVneSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFBsYXliYWNrVGhyZWFkIHdoaWNoIGltcGxlbWVudHMgdGhpcyBtZXRob2QKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGludCBzZXNzaW9uSWQpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGludCBzZXNzaW9uSWQgX191bnVzZWQpIHsgcmV0dXJuIDA7IH0KIAogICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgb3IgcmVzdG9yZSBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIGVmZmVjdCBwYXNzZWQuIGEgTlVMTAogICAgICAgICAgICAgICAgIC8vIHR5cGUgcG9pbnRlciBtZWFucyBzdXNwZW5kIGFsbCBlZmZlY3RzIGluIHRoZSBzZXNzaW9uCkBAIC0yMjUsNiArMzQ4LDE1IEBACiAgICAgICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0ID0gMDsKIAorICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIHJlZmVyZW5jZSB0byBhIHBlci10aHJlYWQgaGVhcCB3aGljaCBjYW4gYmUgdXNlZCB0byBhbGxvY2F0ZSBJTWVtb3J5CisgICAgICAgICAgICAgICAgLy8gb2JqZWN0cyB0aGF0IHdpbGwgYmUgcmVhZC1vbmx5IHRvIGNsaWVudCBwcm9jZXNzZXMsIHJlYWQvd3JpdGUgdG8gbWVkaWFzZXJ2ZXIsCisgICAgICAgICAgICAgICAgLy8gYW5kIHNoYXJlZCBieSBhbGwgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgdGhyZWFkLgorICAgICAgICAgICAgICAgIC8vIFRoZSBoZWFwIGlzIHBlci10aHJlYWQgcmF0aGVyIHRoYW4gY29tbW9uIGFjcm9zcyBhbGwgdGhyZWFkcywgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vIGNsaWVudHMgY2FuJ3QgYmUgdHJ1c3RlZCBub3QgdG8gbW9kaWZ5IHRoZSBvZmZzZXQgb2YgdGhlIElNZW1vcnkgdGhleSByZWNlaXZlLgorICAgICAgICAgICAgICAgIC8vIElmIGEgdGhyZWFkIGRvZXMgbm90IGhhdmUgc3VjaCBhIGhlYXAsIHRoaXMgbWV0aG9kIHJldHVybnMgMC4KKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHNwPE1lbW9yeURlYWxlcj4gICAgcmVhZE9ubHlIZWFwKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gMDsgfQogCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKQEAgLTI2OSw0OCArNDAxLDI5IEBACiAKICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI+ICBtQXVkaW9GbGluZ2VyOwogCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlZCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnMoKSBvcgotICAgICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVycygpCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlZCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIG9yCisgICAgICAgICAgICAgICAgLy8gUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAvLyBvdXRwdXQgSEFMLCBkaXJlY3Qgb3V0cHV0LCByZWNvcmQKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgIC8vIFNvdXJjZSBmb3JtYXQgZm9yIFJlY29yZGluZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgZm9yIFBsYXliYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5rIGZvcm1hdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSEFMIGZvcm1hdCBpZiBGYXN0bWl4ZXIgaXMgdXNlZC4KKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtSEFMRm9ybWF0OworICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAgICAgICAvLyBIQUwgYnVmZmVyIHNpemUgZm9yIHJlYWQoKSBvciB3cml0ZSgpCiAKLSAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgc2VxdWVuY2UgYnkgY2xpZW50OiBiaW5kZXIgdGhyZWFkIGNhbGxpbmcgc2V0UGFyYW1ldGVycygpOgotICAgICAgICAgICAgICAgIC8vICAxLiBMb2NrIG1Mb2NrCi0gICAgICAgICAgICAgICAgLy8gIDIuIEFwcGVuZCB0byBtTmV3UGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC8vICAzLiBtV2FpdFdvcmtDVi5zaWduYWwKLSAgICAgICAgICAgICAgICAvLyAgNC4gbVBhcmFtQ29uZC53YWl0UmVsYXRpdmUgd2l0aCB0aW1lb3V0Ci0gICAgICAgICAgICAgICAgLy8gIDUuIHJlYWQgbVBhcmFtU3RhdHVzCi0gICAgICAgICAgICAgICAgLy8gIDYuIG1XYWl0V29ya0NWLnNpZ25hbAotICAgICAgICAgICAgICAgIC8vICA3LiBVbmxvY2sKLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBzZXF1ZW5jZSBieSBzZXJ2ZXI6IHRocmVhZExvb3AgY2FsbGluZyBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOgotICAgICAgICAgICAgICAgIC8vIDEuIExvY2sgbUxvY2sKLSAgICAgICAgICAgICAgICAvLyAyLiBJZiB0aGVyZSBpcyBhbiBlbnRyeSBpbiBtTmV3UGFyYW1ldGVycyBwcm9jZWVkIC4uLgotICAgICAgICAgICAgICAgIC8vIDIuIFJlYWQgZmlyc3QgZW50cnkgaW4gbU5ld1BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyAzLiBQcm9jZXNzCi0gICAgICAgICAgICAgICAgLy8gNC4gUmVtb3ZlIGZpcnN0IGVudHJ5IGZyb20gbU5ld1BhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAvLyA1LiBTZXQgbVBhcmFtU3RhdHVzCi0gICAgICAgICAgICAgICAgLy8gNi4gbVBhcmFtQ29uZC5zaWduYWwKLSAgICAgICAgICAgICAgICAvLyA3LiBtV2FpdFdvcmtDVi53YWl0IHdpdGggdGltZW91dCAodGhpcyBpcyB0byBhdm9pZCBvdmVyd3JpdGluZyBtUGFyYW1TdGF0dXMpCi0gICAgICAgICAgICAgICAgLy8gOC4gVW5sb2NrCi0gICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVBhcmFtQ29uZDsKLSAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nOD4gICAgICAgICBtTmV3UGFyYW1ldGVyczsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtUGFyYW1TdGF0dXM7Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZWN0b3Igb3ducyBlYWNoIENvbmZpZ0V2ZW50ICosIHNvIG11c3QgZGVsZXRlIGFmdGVyIHJlbW92aW5nCi0gICAgICAgICAgICAgICAgVmVjdG9yPENvbmZpZ0V2ZW50ICo+ICAgICBtQ29uZmlnRXZlbnRzOworICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8Q29uZmlnRXZlbnQ+ID4gICAgIG1Db25maWdFdmVudHM7CiAKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBmaWVsZHMgYXJlIHdyaXR0ZW4gYW5kIHJlYWQgYnkgdGhyZWFkIGl0c2VsZiB3aXRob3V0IGxvY2sgb3IgYmFycmllciwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCkgLCBvdXREZXZpY2UoKQorICAgICAgICAgICAgICAgIC8vIGFuZCByZWFkIGJ5IG90aGVyIHRocmVhZHMgd2l0aG91dCBsb2NrIG9yIGJhcnJpZXIgdmlhIHN0YW5kYnkoKSwgb3V0RGV2aWNlKCkKICAgICAgICAgICAgICAgICAvLyBhbmQgaW5EZXZpY2UoKS4KICAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSBhYnNlbmNlIG9mIGEgbG9jayBvciBiYXJyaWVyLCBhbnkgb3RoZXIgdGhyZWFkIHRoYXQgcmVhZHMKICAgICAgICAgICAgICAgICAvLyB0aGVzZSBmaWVsZHMgbXVzdCB1c2UgdGhlIGluZm9ybWF0aW9uIGluIGlzb2xhdGlvbiwgb3IgYmUgcHJlcGFyZWQgdG8gZGVhbAogICAgICAgICAgICAgICAgIC8vIHdpdGggcG9zc2liaWxpdHkgdGhhdCBpdCBtaWdodCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBvdGhlciBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAvLyBXaGV0aGVyIHRocmVhZCBpcyBjdXJyZW50bHkgaW4gc3RhbmRieS4KKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3RhbmRieTsgICAgIC8vIFdoZXRoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBpbiBzdGFuZGJ5LgogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1PdXREZXZpY2U7ICAgLy8gb3V0cHV0IGRldmljZQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1JbkRldmljZTsgICAgLy8gaW5wdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOyAvLyAoc2VlIGF1ZGlvLmgsIGF1ZGlvX3NvdXJjZV90KQpAQCAtMzYwLDcgKzQ3Myw2IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKIAogICAgIC8vIFJlZkJhc2UKQEAgLTM5Myw3ICs1MDUsNyBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpOwotCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKICAgICAvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgcHJlRXhpdCgpOwpAQCAtNDIxLDEzICs1MzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIGNsZWFyT3V0cHV0KCk7CkBAIC00NDcsOSArNTU5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVN1c3BlbmRlZCkgPiAwOyB9CiAKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0UmVuZGVyUG9zaXRpb24oc2l6ZV90ICpoYWxGcmFtZXMsIHNpemVfdCAqZHNwRnJhbWVzKTsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbU1peEJ1ZmZlcjsgfTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSByZW5hbWUgbWl4QnVmZmVyKCkgdG8gc2lua0J1ZmZlcigpIGFuZCByZW1vdmUgaW50MTZfdCogZGVwZW5kZW5jeS4KKyAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHRvIEFGOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKCkuCisgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1peEJ1ZmZlcigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihtU2lua0J1ZmZlcik7IH07CiAKICAgICB2aXJ0dWFsICAgICB2b2lkIGRldGFjaEF1eEVmZmVjdF9sKGludCBlZmZlY3RJZCk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywKQEAgLTQ3NCwxNCArNTkwLDc2IEBACiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuJ3MgdGhlIEhBTCdzIGZyYW1lIGNvdW50IGkuZS4gZmFzdCBtaXhlciBidWZmZXIgc2l6ZS4KICAgICAgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50SEFMKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KIAotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgZ2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOworCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogcHJvdGVjdGVkOgotICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnMoKQorICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwogCi0gICAgaW50MTZfdCogICAgICAgICAgICAgICAgICAgICAgICBtTWl4QnVmZmVyOyAgICAgICAgIC8vIGZyYW1lIHNpemUgYWxpZ25lZCBtaXggYnVmZmVyCi0gICAgaW50OF90KiAgICAgICAgICAgICAgICAgICAgICAgICBtQWxsb2NNaXhCdWZmZXI7ICAgIC8vIG1peGVyIGJ1ZmZlciBhbGxvY2F0aW9uIGFkZHJlc3MKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaW5rQnVmZmVyOyAgICAgICAgIC8vIGZyYW1lIHNpemUgYWxpZ25lZCBzaW5rIGJ1ZmZlcgorCisgICAgLy8gVE9ETzoKKyAgICAvLyBSZWFycmFuZ2UgdGhlIGJ1ZmZlciBpbmZvIGludG8gYSBzdHJ1Y3QvY2xhc3Mgd2l0aAorICAgIC8vIGNsZWFyLCBjb3B5LCBjb25zdHJ1Y3Rpb24sIGRlc3RydWN0aW9uIG1ldGhvZHMuCisgICAgLy8KKyAgICAvLyBtU2lua0J1ZmZlciBhbHNvIGhhcyBhc3NvY2lhdGVkIHdpdGggaXQ6CisgICAgLy8KKyAgICAvLyBtU2lua0J1ZmZlclNpemU6IFNpbmsgQnVmZmVyIFNpemUKKyAgICAvLyBtRm9ybWF0OiBTaW5rIEJ1ZmZlciBGb3JtYXQKKworICAgIC8vIE1peGVyIEJ1ZmZlciAobU1peGVyQnVmZmVyKikKKyAgICAvLworICAgIC8vIEluIHRoZSBjYXNlIG9mIGZsb2F0aW5nIHBvaW50IG9yIG11bHRpY2hhbm5lbCBkYXRhLCB3aGljaCBpcyBub3QgaW4gdGhlCisgICAgLy8gc2luayBmb3JtYXQsIGl0IGlzIHJlcXVpcmVkIHRvIGFjY3VtdWxhdGUgaW4gYSBoaWdoZXIgcHJlY2lzaW9uIG9yIGdyZWF0ZXIgY2hhbm5lbCBjb3VudAorICAgIC8vIGJ1ZmZlciBiZWZvcmUgZG93bm1peGluZyBvciBkYXRhIGNvbnZlcnNpb24gdG8gdGhlIHNpbmsgYnVmZmVyLgorCisgICAgLy8gU2V0IHRvICJ0cnVlIiB0byBlbmFibGUgdGhlIE1peGVyIEJ1ZmZlciBvdGhlcndpc2UgbWl4ZXIgb3V0cHV0IGdvZXMgdG8gc2luayBidWZmZXIuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJFbmFibGVkOworCisgICAgLy8gU3RvcmFnZSwgMzIgYnl0ZSBhbGlnbmVkIChtYXkgbWFrZSB0aGlzIGFsaWdubWVudCBhIHJlcXVpcmVtZW50IGxhdGVyKS4KKyAgICAvLyBEdWUgdG8gY29uc3RyYWludHMgb24gbU5vcm1hbEZyYW1lQ291bnQsIHRoZSBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2IGZyYW1lcy4KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlcjsKKworICAgIC8vIFNpemUgb2YgbU1peGVyQnVmZmVyIGluIGJ5dGVzOiBtTm9ybWFsRnJhbWVDb3VudCAqICNjaGFubmVscyAqIHNhbXBzaXplLgorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyU2l6ZTsKKworICAgIC8vIFRoZSBhdWRpbyBmb3JtYXQgb2YgbU1peGVyQnVmZmVyLiBTZXQgdG8gQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKSBvbmx5LgorICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0OworCisgICAgLy8gQW4gaW50ZXJuYWwgZmxhZyBzZXQgdG8gdHJ1ZSBieSBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkKKyAgICAvLyB3aGVuIG1NaXhlckJ1ZmZlciBjb250YWlucyB2YWxpZCBkYXRhIGFmdGVyIG1peGluZy4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkOworCisgICAgLy8gRWZmZWN0cyBCdWZmZXIgKG1FZmZlY3RzQnVmZmVyKikKKyAgICAvLworICAgIC8vIEluIHRoZSBjYXNlIG9mIGVmZmVjdHMgZGF0YSwgd2hpY2ggaXMgbm90IGluIHRoZSBzaW5rIGZvcm1hdCwKKyAgICAvLyBpdCBpcyByZXF1aXJlZCB0byBhY2N1bXVsYXRlIGluIGEgZGlmZmVyZW50IGJ1ZmZlciBiZWZvcmUgZGF0YSBjb252ZXJzaW9uCisgICAgLy8gdG8gdGhlIHNpbmsgYnVmZmVyLgorCisgICAgLy8gU2V0IHRvICJ0cnVlIiB0byBlbmFibGUgdGhlIEVmZmVjdHMgQnVmZmVyIG90aGVyd2lzZSBlZmZlY3RzIG91dHB1dCBnb2VzIHRvIHNpbmsgYnVmZmVyLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckVuYWJsZWQ7CisKKyAgICAvLyBTdG9yYWdlLCAzMiBieXRlIGFsaWduZWQgKG1heSBtYWtlIHRoaXMgYWxpZ25tZW50IGEgcmVxdWlyZW1lbnQgbGF0ZXIpLgorICAgIC8vIER1ZSB0byBjb25zdHJhaW50cyBvbiBtTm9ybWFsRnJhbWVDb3VudCwgdGhlIGJ1ZmZlciBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTYgZnJhbWVzLgorICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlcjsKKworICAgIC8vIFNpemUgb2YgbUVmZmVjdHNCdWZmZXIgaW4gYnl0ZXM6IG1Ob3JtYWxGcmFtZUNvdW50ICogI2NoYW5uZWxzICogc2FtcHNpemUuCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZTsKKworICAgIC8vIFRoZSBhdWRpbyBmb3JtYXQgb2YgbUVmZmVjdHNCdWZmZXIuIFNldCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBvbmx5LgorICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdDsKKworICAgIC8vIEFuIGludGVybmFsIGZsYWcgc2V0IHRvIHRydWUgYnkgTWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgpCisgICAgLy8gd2hlbiBtRWZmZWN0c0J1ZmZlciBjb250YWlucyB2YWxpZCBkYXRhIGFmdGVyIG1peGluZy4KKyAgICAvLworICAgIC8vIFdoZW4gdGhpcyBpcyBzZXQsIGFsbCBtaXhlciBkYXRhIGlzIHJvdXRlZCBpbnRvIHRoZSBlZmZlY3RzIGJ1ZmZlcgorICAgIC8vIGZvciBhbnkgcHJvY2Vzc2luZyAoaW5jbHVkaW5nIG91dHB1dCBwcm9jZXNzaW5nKS4KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJWYWxpZDsKIAogICAgIC8vIHN1c3BlbmQgY291bnQsID4gMCBtZWFucyBzdXNwZW5kZWQuICBXaGlsZSBzdXNwZW5kZWQsIHRoZSB0aHJlYWQgY29udGludWVzIHRvIHB1bGwgZnJvbQogICAgIC8vIHRyYWNrcyBhbmQgbWl4LCBidXQgZG9lc24ndCB3cml0ZSB0byBIQUwuICBBMkRQIGFuZCBTQ08gSEFMIGltcGxlbWVudGF0aW9ucyBjYW4ndCBoYW5kbGUKQEAgLTUwNyw3ICs2ODUsOCBAQAogCiAgICAgLy8gQWxsb2NhdGUgYSB0cmFjayBuYW1lIGZvciBhIGdpdmVuIGNoYW5uZWwgbWFzay4KICAgICAvLyAgIFJldHVybnMgbmFtZSA+PSAwIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uIGZhaWx1cmUuCi0gICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGludCBzZXNzaW9uSWQpID0gMDsKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSkgPSAwOwogCiAgICAgLy8gVGltZSB0byBzbGVlcCBiZXR3ZWVuIGN5Y2xlcyB3aGVuOgpAQCAtNTI5LDExICs3MDgsMTQgQEAKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCiBwcml2YXRlOgogCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAvLyBmb3IgbnVtZXJvdXMKIAotICAgIFBsYXliYWNrVGhyZWFkKGNvbnN0IENsaWVudCYpOwogICAgIFBsYXliYWNrVGhyZWFkJiBvcGVyYXRvciA9IChjb25zdCBQbGF5YmFja1RocmVhZCYpOwogCiAgICAgc3RhdHVzX3QgICAgYWRkVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKQEAgLTU0MSw3ICs3MjMsNyBAQAogICAgIHZvaWQgICAgICAgIHJlbW92ZVRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjayk7CiAgICAgdm9pZCAgICAgICAgYnJvYWRjYXN0X2woKTsKIAotICAgIHZvaWQgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CisgICAgdm9pZCAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCiAgICAgdmlydHVhbCB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC01NjAsNyArNzQyLDcgQEAKIAogICAgIC8vIEZJWE1FIHJlbmFtZSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG9mIHRocmVhZExvb3AgdG8gc3RhbmRhcmQgIm0iIG5hbWVzCiAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1peEJ1ZmZlclNpemU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlclNpemU7CiAKICAgICAvLyBjYWNoZWQgY29waWVzIG9mIGFjdGl2ZVNsZWVwVGltZVVzKCkgYW5kIGlkbGVTbGVlcFRpbWVVcygpIG1hZGUgYnkgY2FjaGVQYXJhbWV0ZXJzX2woKQogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2xlZXBUaW1lOwpAQCAtNjI1LDEzICs4MDcsMTIgQEAKICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXI7CiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgICAgIEZhc3RUcmFja1VuZGVycnVucyBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoc2l6ZV90IGZhc3RJbmRleCkgY29uc3QKKyAgICB2aXJ0dWFsICAgICBGYXN0VHJhY2tVbmRlcnJ1bnMgZ2V0RmFzdFRyYWNrVW5kZXJydW5zKHNpemVfdCBmYXN0SW5kZXggX191bnVzZWQpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgRmFzdFRyYWNrVW5kZXJydW5zIGR1bW15OyByZXR1cm4gZHVtbXk7IH0KIAogcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIC8vIGFjY2Vzc2VkIGJ5IGJvdGggYmluZGVyIHRocmVhZHMgYW5kIHdpdGhpbiB0aHJlYWRMb29wKCksIGxvY2sgb24gbXV0ZXggbmVlZGVkCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgbUZhc3RUcmFja0F2YWlsTWFzazsgICAgLy8gYml0IGkgc2V0IGlmIGZhc3QgdHJhY2sgW2ldIGlzIGF2YWlsYWJsZQotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoT3V0cHV0X2woKTsKIAogcHJpdmF0ZToKICAgICAvLyB0aW1lc3RhbXAgbGF0Y2g6CkBAIC02NDAsOCArODIxLDExIEBACiAgICAgc3RydWN0IHsKICAgICAgICAgQXVkaW9UaW1lc3RhbXAgIG1UaW1lc3RhbXA7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICBtVW5wcmVzZW50ZWRGcmFtZXM7CisgICAgICAgIEtleWVkVmVjdG9yPFRyYWNrICosIHVpbnQzMl90PiBtRnJhbWVzUmVsZWFzZWQ7CiAgICAgfSBtTGF0Y2hELCBtTGF0Y2hROwotICAgIGJvb2wgbUxhdGNoRFZhbGlkOyAgLy8gdHJ1ZSBtZWFucyBtTGF0Y2hEIGlzIHZhbGlkLCBhbmQgY2xvY2sgaXQgaW50byBsYXRjaCBhdCBuZXh0IG9wcG9ydHVuaXR5CisgICAgYm9vbCBtTGF0Y2hEVmFsaWQ7ICAvLyB0cnVlIG1lYW5zIG1MYXRjaEQgaXMgdmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZXhjZXB0IGZvciBtRnJhbWVzUmVsZWFzZWQgd2hpY2ggaXMgZmlsbGVkIGluIGxhdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhbmQgY2xvY2sgaXQgaW50byBsYXRjaCBhdCBuZXh0IG9wcG9ydHVuaXR5CiAgICAgYm9vbCBtTGF0Y2hRVmFsaWQ7ICAvLyB0cnVlIG1lYW5zIG1MYXRjaFEgaXMgdmFsaWQKIH07CiAKQEAgLTY1NiwxMiArODQwLDE0IEBACiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKIAotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICBtaXhlcl9zdGF0ZSBwcmVwYXJlVHJhY2tzX2woVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKSBjb25zdDsKQEAgLTY3OCw3ICs4NjQsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXIqIG1BdWRpb01peGVyOyAgICAvLyBub3JtYWwgbWl4ZXIKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgRmFzdE1peGVyKiAgbUZhc3RNaXhlcjsgICAgICAgICAvLyBub24tTlVMTCBpZiB0aGVyZSBpcyBhbHNvIGEgZmFzdCBtaXhlcgorICAgICAgICAgICAgICAgIHNwPEZhc3RNaXhlcj4gICAgIG1GYXN0TWl4ZXI7ICAgICAvLyBub24tMCBpZiB0aGVyZSBpcyBhbHNvIGEgZmFzdCBtaXhlcgogICAgICAgICAgICAgICAgIHNwPEF1ZGlvV2F0Y2hkb2c+IG1BdWRpb1dhdGNoZG9nOyAvLyBub24tMCBpZiB0aGVyZSBpcyBhbiBhdWRpbyB3YXRjaGRvZyB0aHJlYWQKIAogICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50LCBubyBsb2NrcyByZXF1aXJlZApAQCAtNjk0LDExICs4ODAsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICBtRmFzdE1peGVyRnV0ZXg7ICAgIC8vIGZvciBjb2xkIGlkbGUKIAogcHVibGljOgotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIG1GYXN0TWl4ZXIgIT0gTlVMTDsgfQorICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIG1GYXN0TWl4ZXIgIT0gMDsgfQogICAgIHZpcnR1YWwgICAgIEZhc3RUcmFja1VuZGVycnVucyBnZXRGYXN0VHJhY2tVbmRlcnJ1bnMoc2l6ZV90IGZhc3RJbmRleCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFzdEluZGV4IDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRmFzdE1peGVyRHVtcFN0YXRlLm1UcmFja3NbZmFzdEluZGV4XS5tVW5kZXJydW5zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogfTsKIAogY2xhc3MgRGlyZWN0T3V0cHV0VGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKQEAgLTcxMCwxMCArODk3LDEzIEBACiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKIAotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAogcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZV9sKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtNzQ1LDE5ICs5MzUsMTcgQEAKICAgICBPZmZsb2FkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5PZmZsb2FkVGhyZWFkKCkge307CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKIHByb3RlY3RlZDoKICAgICAvLyB0aHJlYWRMb29wIHNuaXBwZXRzCiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX2V4aXQoKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaE91dHB1dF9sKCk7CiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB3YWl0aW5nQXN5bmNDYWxsYmFjaygpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrX2woKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBzaG91bGRTdGFuZGJ5X2woKTsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkFkZE5ld1RyYWNrX2woKTsKIAogcHJpdmF0ZToKICAgICBib29sICAgICAgICBtSHdQYXVzZWQ7CkBAIC04NDAsMTcgKzEwMjgsMjggQEAKIAogCiAvLyByZWNvcmQgdGhyZWFkCi1jbGFzcyBSZWNvcmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZSwgcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZXMgZnJvbSBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBmb3IgdXNlIGJ5IHJlc2FtcGxlcgorY2xhc3MgUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZEJhc2UKIHsKIHB1YmxpYzoKIAorICAgIGNsYXNzIFJlY29yZFRyYWNrOworICAgIGNsYXNzIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZXMgZnJvbSBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBmb3IgdXNlIGJ5IHJlc2FtcGxlcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgOiBtUmVjb3JkVHJhY2socmVjb3JkVHJhY2spIHsgfQorICAgICAgICB2aXJ0dWFsIH5SZXNhbXBsZXJCdWZmZXJQcm92aWRlcigpIHsgfQorICAgICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKyAgICBwcml2YXRlOgorICAgICAgICBSZWNvcmRUcmFjayAqIGNvbnN0IG1SZWNvcmRUcmFjazsKKyAgICB9OworCiAjaW5jbHVkZSAiUmVjb3JkVHJhY2tzLmgiCiAKICAgICAgICAgICAgIFJlY29yZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQpAQCAtODY5LDIzICsxMDY4LDI4IEBACiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKIAogICAgIC8vIFJlZkJhc2UKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gKG1JbnB1dCA9PSBOVUxMKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQorCisgICAgdmlydHVhbCBzcDxNZW1vcnlEZWFsZXI+ICAgIHJlYWRPbmx5SGVhcCgpIGNvbnN0IHsgcmV0dXJuIG1SZWFkT25seUhlYXA7IH0KKworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gcGlwZU1lbW9yeSgpIGNvbnN0IHsgcmV0dXJuIG1QaXBlTWVtb3J5OyB9CisKICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gIGNyZWF0ZVJlY29yZFRyYWNrX2woCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgIGludCB1aWQsCiAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLyk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0KFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCkBAIC04OTksMTUgKzExMDMsMjEgQEAKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3QqIHN0cmVhbSgpIGNvbnN0OwogCi0gICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogCi0gICAgdmlydHVhbCBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcnNfbCgpOworICAgIHZpcnR1YWwgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzKCk7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdCgpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hSZWNvcmQoY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworCisgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldElucHV0RnJhbWVzTG9zdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwogICAgIHZpcnR1YWwgc2l6ZV90IHJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CkBAIC05MjIsNDUgKzExMzIsNzMgQEAKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0OwogCiAgICAgc3RhdGljIHZvaWQgc3luY1N0YXJ0RXZlbnRDYWxsYmFjayhjb25zdCB3cDxTeW5jRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgIHZvaWQgaGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RSZWNvcmRlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBoYXNGYXN0Q2FwdHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0Q2FwdHVyZSAhPSAwOyB9CisgICAgdmlydHVhbCB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiBwcml2YXRlOgotICAgICAgICAgICAgdm9pZCBjbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0KICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCi0gICAgICAgICAgICB2b2lkIHN0YW5kYnkoKTsKKyAgICAgICAgICAgIHZvaWQgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwogCiAgICAgICAgICAgICAvLyBDYWxsIHRoZSBIQUwgc3RhbmRieSBtZXRob2QgdW5jb25kaXRpb25hbGx5LCBhbmQgZG9uJ3QgY2hhbmdlIG1TdGFuZGJ5IGZsYWcKLSAgICAgICAgICAgIHZvaWQgaW5wdXRTdGFuZEJ5KCk7CisgICAgICAgICAgICB2b2lkICAgIGlucHV0U3RhbmRCeSgpOwogCiAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICAgICAgICAgICAgICAgICAgICAgICAqbUlucHV0OwogICAgICAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8UmVjb3JkVHJhY2s+ID4gICAgbVRyYWNrczsKLSAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFjayBoYXMgZHVhbCByb2xlczogIGl0IGluZGljYXRlcyB0aGUgY3VycmVudCBhY3RpdmUgdHJhY2ssIGFuZAorICAgICAgICAgICAgLy8gbUFjdGl2ZVRyYWNrcyBoYXMgZHVhbCByb2xlczogIGl0IGluZGljYXRlcyB0aGUgY3VycmVudCBhY3RpdmUgdHJhY2socyksIGFuZAogICAgICAgICAgICAgLy8gaXMgdXNlZCB0b2dldGhlciB3aXRoIG1TdGFydFN0b3BDb25kIHRvIGluZGljYXRlIHN0YXJ0KCkvc3RvcCgpIHByb2dyZXNzCi0gICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2s7CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPFJlY29yZFRyYWNrPiA+ICAgICBtQWN0aXZlVHJhY2tzOworICAgICAgICAgICAgLy8gZ2VuZXJhdGlvbiBjb3VudGVyIGZvciBtQWN0aXZlVHJhY2tzCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzR2VuOwogICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0U3RvcENvbmQ7CiAKLSAgICAgICAgICAgIC8vIHVwZGF0ZWQgYnkgUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICptUmVzYW1wbGVyOwotICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZWQgc3RlcmVvIHBhaXJzIG9mIGZpeGVkLXBvaW50IHNpZ25lZCBRMTkuMTIKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcE91dEJ1ZmZlcjsKLSAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcEluQnVmZmVyOyAvLyBbbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50XQotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4OwotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7ICAgIC8vIHN0cmVhbSBidWZmZXIgc2l6ZSBmb3IgcmVhZCgpCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVxQ2hhbm5lbENvdW50OwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgbVJlcVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZWFkOwotICAgICAgICAgICAgLy8gc3luYyBldmVudCB0cmlnZ2VyaW5nIGFjdHVhbCBhdWRpbyBjYXB0dXJlLiBGcmFtZXMgcmVhZCBiZWZvcmUgdGhpcyBldmVudCB3aWxsCi0gICAgICAgICAgICAvLyBiZSBkcm9wcGVkIGFuZCB0aGVyZWZvcmUgbm90IHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgc3A8U3luY0V2ZW50PiAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdGFydEV2ZW50OwotICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNhcHR1cmVkIGZyYW1lcyB0byBkcm9wIGFmdGVyIHRoZSBzdGFydCBzeW5jIGV2ZW50IGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAgICAgICAgLy8gd2hlbiA8IDAsIG1heGltdW0gZnJhbWVzIHRvIGRyb3AgYmVmb3JlIHN0YXJ0aW5nIGNhcHR1cmUgZXZlbiBpZiBzeW5jIGV2ZW50IGlzCi0gICAgICAgICAgICAvLyBub3QgcmVjZWl2ZWQKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXN0b0Ryb3A7CisgICAgICAgICAgICAvLyByZXNhbXBsZXIgY29udmVydHMgaW5wdXQgYXQgSEFMIEh6IHRvIG91dHB1dCBhdCBBdWRpb1JlY29yZCBjbGllbnQgSHoKKyAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcEluQnVmZmVyOyAvLyBzZWUgbmV3W10gZm9yIGRldGFpbHMgb24gdGhlIHNpemUKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5GcmFtZXM7ICAvLyBzaXplIG9mIHJlc2FtcGxlciBpbnB1dCBpbiBmcmFtZXMKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5GcmFtZXNQMjsvLyBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yCisKKyAgICAgICAgICAgIC8vIHJvbGxpbmcgaW5kZXggdGhhdCBpcyBuZXZlciBjbGVhcmVkCisgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluUmVhcjsgICAgLy8gbGFzdCBmaWxsZWQgZnJhbWUgKyAxCiAKICAgICAgICAgICAgIC8vIEZvciBkdW1wc3lzCiAgICAgICAgICAgICBjb25zdCBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICBtVGVlU2luazsKKworICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKKworICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCisgICAgICAgICAgICBzcDxGYXN0Q2FwdHVyZT4gICAgICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmU7ICAgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgY2FwdHVyZQorICAgICAgICAgICAgLy8gRklYTUUgYXVkaW8gd2F0Y2hkb2cgdGhyZWFkCisKKyAgICAgICAgICAgIC8vIGNvbnRlbnRzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50LCBubyBsb2NrcyByZXF1aXJlZAorICAgICAgICAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlRHVtcFN0YXRlOworI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKKyAgICAgICAgICAgIC8vIEZJWE1FIFN0YXRlUXVldWUgb2JzZXJ2ZXIgYW5kIG11dGF0b3IgZHVtcCBmaWVsZHMKKyNlbmRpZgorICAgICAgICAgICAgLy8gRklYTUUgYXVkaW8gd2F0Y2hkb2cgZHVtcAorCisgICAgICAgICAgICAvLyBhY2Nlc3NpYmxlIG9ubHkgd2l0aGluIHRoZSB0aHJlYWRMb29wKCksIG5vIGxvY2tzIHJlcXVpcmVkCisgICAgICAgICAgICAvLyAgICAgICAgICBtRmFzdENhcHR1cmUtPnNxKCkgICAgICAvLyBmb3IgbXV0YXRpbmcgYW5kIHB1c2hpbmcgc3RhdGUKKyAgICAgICAgICAgIGludDMyX3QgICAgIG1GYXN0Q2FwdHVyZUZ1dGV4OyAgICAgIC8vIGZvciBjb2xkIGlkbGUKKworICAgICAgICAgICAgLy8gVGhlIEhBTCBpbnB1dCBzb3VyY2UgaXMgdHJlYXRlZCBhcyBub24tYmxvY2tpbmcsCisgICAgICAgICAgICAvLyBidXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBibG9ja2luZworICAgICAgICAgICAgc3A8TkJBSU9fU291cmNlPiAgICAgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOworICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBmb3IgdGhlIG5vcm1hbCBjYXB0dXJlIHRocmVhZCB0byByZWFkIGZyb206IG1JbnB1dFNvdXJjZSBvciBtUGlwZVNvdXJjZQorICAgICAgICAgICAgc3A8TkJBSU9fU291cmNlPiAgICAgICAgICAgICAgICAgICAgbU5vcm1hbFNvdXJjZTsKKyAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBub24tYmxvY2tpbmcgcGlwZSBzaW5rIHdyaXR0ZW4gdG8gYnkgZmFzdCBjYXB0dXJlLAorICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNsZWFyCisgICAgICAgICAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICAgICAgICBtUGlwZVNpbms7CisgICAgICAgICAgICAvLyBJZiBhIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50LCB0aGUgbm9uLWJsb2NraW5nIHBpcGUgc291cmNlIHJlYWQgYnkgbm9ybWFsIHRocmVhZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjbGVhcgorICAgICAgICAgICAgc3A8TkJBSU9fU291cmNlPiAgICAgICAgICAgICAgICAgICAgbVBpcGVTb3VyY2U7CisgICAgICAgICAgICAvLyBEZXB0aCBvZiBwaXBlIGZyb20gZmFzdCBjYXB0dXJlIHRvIG5vcm1hbCB0aHJlYWQgYW5kIGZhc3QgY2xpZW50cywgYWx3YXlzIHBvd2VyIG9mIDIKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlRnJhbWVzUDI7CisgICAgICAgICAgICAvLyBJZiBhIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50LCB0aGUgUGlwZSBhcyBJTWVtb3J5LCBvdGhlcndpc2UgY2xlYXIKKyAgICAgICAgICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlTWVtb3J5OworCisgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICAgICAgICAgICBrRmFzdENhcHR1cmVMb2dTaXplID0gNCAqIDEwMjQ7CisgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmVOQkxvZ1dyaXRlcjsKKworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNkMjAxZDkuLjk4YmY5NmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTM0LDcgKzM0LDI1IEBACiAgICAgICAgIFJFU1VNSU5HLAogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCi0gICAgICAgIFBBVVNFRAorICAgICAgICBQQVVTRUQsCisgICAgICAgIFNUQVJUSU5HXzEsICAgICAvLyBmb3IgUmVjb3JkVHJhY2sgb25seQorICAgICAgICBTVEFSVElOR18yLCAgICAgLy8gZm9yIFJlY29yZFRyYWNrIG9ubHkKKyAgICB9OworCisgICAgLy8gd2hlcmUgdG8gYWxsb2NhdGUgdGhlIGRhdGEgYnVmZmVyCisgICAgZW51bSBhbGxvY190eXBlIHsKKyAgICAgICAgQUxMT0NfQ0JMSywgICAgIC8vIGFsbG9jYXRlIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnRyb2wgYmxvY2sKKyAgICAgICAgQUxMT0NfUkVBRE9OTFksIC8vIGFsbG9jYXRlIGZyb20gYSBzZXBhcmF0ZSByZWFkLW9ubHkgaGVhcCBwZXIgdGhyZWFkCisgICAgICAgIEFMTE9DX1BJUEUsICAgICAvLyBkbyBub3QgYWxsb2NhdGU7IHVzZSB0aGUgcGlwZSBidWZmZXIKKyAgICAgICAgQUxMT0NfTE9DQUwsICAgIC8vIGFsbG9jYXRlIGEgbG9jYWwgYnVmZmVyCisgICAgICAgIEFMTE9DX05PTkUsICAgICAvLyBkbyBub3QgYWxsb2NhdGU6dXNlIHRoZSBidWZmZXIgcGFzc2VkIHRvIFRyYWNrQmFzZSBjb25zdHJ1Y3RvcgorICAgIH07CisKKyAgICBlbnVtIHRyYWNrX3R5cGUgeworICAgICAgICBUWVBFX0RFRkFVTFQsCisgICAgICAgIFRZUEVfVElNRUQsCisgICAgICAgIFRZUEVfT1VUUFVULAorICAgICAgICBUWVBFX1BBVENILAogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShUaHJlYWRCYXNlICp0aHJlYWQsCkBAIC00MywxMSArNjEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGUgYWxsb2MgPSBBTExPQ19DQkxLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUgPSBUWVBFX0RFRkFVTFQpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflRyYWNrQmFzZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbikgPSAwOwpAQCAtNTgsNiArODAsMTQgQEAKICAgICAgICAgICAgIGludCAgICAgICAgIHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldEJ1ZmZlcnMoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyTWVtb3J5OyB9CisgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXIoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSAhPSAwOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVkVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9USU1FRCk7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9PVVRQVVQpOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1BhdGNoVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9QQVRDSCk7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRXh0ZXJuYWxUcmFjaygpIGNvbnN0IHsgcmV0dXJuICFpc091dHB1dFRyYWNrKCkgJiYgIWlzUGF0Y2hUcmFjaygpOyB9CisKIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShjb25zdCBUcmFja0Jhc2UmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgVHJhY2tCYXNlJik7CkBAIC03OCwxNSArMTA4LDYgQEAKIAogICAgIHZpcnR1YWwgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9CiAKLSAgICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhIGNvbnRpZ3VvdXMgc2xpY2Ugb2YgdGhlIHRyYWNrIGJ1ZmZlci4KLSAgICAvLyBQYXJhbWV0ZXIgJ29mZnNldCcgaXMgdGhlIHJlcXVlc3RlZCBzdGFydCBwb3NpdGlvbiwgZXhwcmVzc2VkIGluCi0gICAgLy8gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGZyYW1lIHVuaXRzIHJlbGF0aXZlIHRvIHRoZSB0cmFjayBlcG9jaC4KLSAgICAvLyBQYXJhbWV0ZXIgJ2ZyYW1lcycgaXMgdGhlIHJlcXVlc3RlZCBsZW5ndGgsIGFsc28gaW4gZnJhbWUgdW5pdHMuCi0gICAgLy8gQWx3YXlzIHJldHVybnMgbm9uLU5VTEwuICBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8KLSAgICAvLyB2ZXJpZnkgdGhhdCB0aGlzIHdpbGwgYmUgc3VjY2Vzc2Z1bDsgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMKLSAgICAvLyBmdW5jdGlvbiB3aXRoIGludmFsaWQgJ29mZnNldCcgb3IgJ2ZyYW1lcycgaXMgdW5kZWZpbmVkLgotICAgIHZvaWQqIGdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3Q7Ci0KICAgICBib29sIGlzU3RvcHBlZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIChtU3RhdGUgPT0gU1RPUFBFRCB8fCBtU3RhdGUgPT0gRkxVU0hFRCk7CiAgICAgfQpAQCAtMTE4LDYgKzEzOSw3IEBACiAgICAgLypjb25zdCovIHNwPENsaWVudD4gbUNsaWVudDsgICAvLyBzZWUgZXhwbGFuYXRpb24gYXQgflRyYWNrQmFzZSgpIHdoeSBub3QgY29uc3QKICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7CisgICAgc3A8SU1lbW9yeT4gICAgICAgICBtQnVmZmVyTWVtb3J5OyAgLy8gY3VycmVudGx5IG5vbi0wIGZvciBmYXN0IFJlY29yZFRyYWNrIG9ubHkKICAgICB2b2lkKiAgICAgICAgICAgICAgIG1CdWZmZXI7ICAgIC8vIHN0YXJ0IG9mIHRyYWNrIGJ1ZmZlciwgdHlwaWNhbGx5IGluIHNoYXJlZCBtZW1vcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdCBmb3IgT3V0cHV0VHJhY2sgd2hlbiBpdCBpcyBpbiBsb2NhbCBtZW1vcnkKICAgICAvLyB3ZSBkb24ndCByZWFsbHkgbmVlZCBhIGxvY2sgZm9yIHRoZXNlCkBAIC0xMzYsMTAgKzE1OCwyNiBAQAogICAgIGNvbnN0IGludCAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgVmVjdG9yIDwgc3A8U3luY0V2ZW50PiA+bVN5bmNFdmVudHM7CisgICAgY29uc3QgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBtRmxhZ3M7CiAgICAgY29uc3QgYm9vbCAgICAgICAgICBtSXNPdXQ7CiAgICAgU2VydmVyUHJveHkqICAgICAgICBtU2VydmVyUHJveHk7CiAgICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7CiAgICAgc3A8TkJBSU9fU2luaz4gICAgICBtVGVlU2luazsKICAgICBzcDxOQkFJT19Tb3VyY2U+ICAgIG1UZWVTb3VyY2U7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtVGVybWluYXRlZDsKKyAgICB0cmFja190eXBlICAgICAgICAgIG1UeXBlOyAgICAgIC8vIG11c3QgYmUgb25lIG9mIFRZUEVfREVGQVVMVCwgVFlQRV9PVVRQVVQsIFRZUEVfUEFUQ0ggLi4uCisgICAgYXVkaW9faW9faGFuZGxlX3QgICBtVGhyZWFkSW9IYW5kbGU7IC8vIEkvTyBoYW5kbGUgb2YgdGhlIHRocmVhZCB0aGUgdHJhY2sgaXMgYXR0YWNoZWQgdG8KK307CisKKy8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCisvLyBpdCBwcm92aWRlcyBidWZmZXIgYWNjZXNzIG1ldGhvZHMgdGhhdCBtYXAgdGhvc2Ugb2YgYSBDbGllbnRQcm94eSAoc2VlIEF1ZGlvVHJhY2tTaGFyZWQuaCkKK2NsYXNzIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcgoreworcHVibGljOgorCisgICAgdmlydHVhbCB+UGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBkNmI5OTA4Li5iOTMwOGZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CkBAIC0zNCw2ICszNSw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTY2LDEwICs2OCwxMyBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGJvb2wgaXNPdXQpCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgYm9vbCBpc091dCwKKyAgICAgICAgICAgIGFsbG9jX3R5cGUgYWxsb2MsCisgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpCiAgICAgOiAgIFJlZkJhc2UoKSwKICAgICAgICAgbVRocmVhZCh0aHJlYWQpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCkBAIC03OSwxNSArODQsMjAgQEAKICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgICAgbUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSwKLSAgICAgICAgbUNoYW5uZWxDb3VudChwb3Bjb3VudChjaGFubmVsTWFzaykpLAorICAgICAgICBtQ2hhbm5lbENvdW50KGlzT3V0ID8KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDoKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykpLAogICAgICAgICBtRnJhbWVTaXplKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSA/CiAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSA6IHNpemVvZihpbnQ4X3QpKSwKICAgICAgICAgbUZyYW1lQ291bnQoZnJhbWVDb3VudCksCiAgICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKKyAgICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgICAgbUlzT3V0KGlzT3V0KSwKICAgICAgICAgbVNlcnZlclByb3h5KE5VTEwpLAogICAgICAgICBtSWQoYW5kcm9pZF9hdG9taWNfaW5jKCZuZXh0VHJhY2tJZCkpLAotICAgICAgICBtVGVybWluYXRlZChmYWxzZSkKKyAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpLAorICAgICAgICBtVHlwZSh0eXBlKSwKKyAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZC0+aWQoKSkKIHsKICAgICAvLyBpZiB0aGUgY2FsbGVyIGlzIHVzLCB0cnVzdCB0aGUgc3BlY2lmaWVkIHVpZAogICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkX2NhY2hlZCB8fCBjbGllbnRVaWQgPT0gLTEpIHsKQEAgLTEwMSwyNyArMTExLDIwIEBACiAgICAgLy8gYmF0dGVyeSB1c2FnZSBvbiBpdC4KICAgICBtVWlkID0gY2xpZW50VWlkOwogCi0gICAgLy8gY2xpZW50ID09IDAgaW1wbGllcyBzaGFyZWRCdWZmZXIgPT0gMAotICAgIEFMT0dfQVNTRVJUKCEoY2xpZW50ID09IDAgJiYgc2hhcmVkQnVmZmVyICE9IDApKTsKLQotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKLQogICAgIC8vIEFMT0dEKCJDcmVhdGluZyB0cmFjayB3aXRoICVkIGJ1ZmZlcnMgQCAlZCBieXRlcyIsIGJ1ZmZlckNvdW50LCBidWZmZXJTaXplKTsKICAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwotICAgIHNpemVfdCBidWZmZXJTaXplID0gKHNoYXJlZEJ1ZmZlciA9PSAwID8gcm91bmR1cChmcmFtZUNvdW50KSA6IGZyYW1lQ291bnQpICogbUZyYW1lU2l6ZTsKLSAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IChidWZmZXIgPT0gTlVMTCA/IHJvdW5kdXAoZnJhbWVDb3VudCkgOiBmcmFtZUNvdW50KSAqIG1GcmFtZVNpemU7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMICYmIGFsbG9jID09IEFMTE9DX0NCTEspIHsKICAgICAgICAgc2l6ZSArPSBidWZmZXJTaXplOwogICAgIH0KIAogICAgIGlmIChjbGllbnQgIT0gMCkgewogICAgICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShzaXplKTsKLSAgICAgICAgaWYgKG1DYmxrTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1DYmxrID0gc3RhdGljX2Nhc3Q8YXVkaW9fdHJhY2tfY2Jsa190ICo+KG1DYmxrTWVtb3J5LT5wb2ludGVyKCkpOwotICAgICAgICAgICAgLy8gY2FuJ3QgYXNzdW1lIG1DYmxrICE9IE5VTEwKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1DYmxrTWVtb3J5ID09IDAgfHwKKyAgICAgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSkpID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV1Iiwgc2l6ZSk7CiAgICAgICAgICAgICBjbGllbnQtPmhlYXAoKS0+ZHVtcCgiQXVkaW9UcmFjayIpOworICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xMzMsMjIgKzEzNiw1NSBAQAogICAgIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHN0cnVjdHVyZSBpbi1wbGFjZS4KICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBuZXcobUNibGspIGF1ZGlvX3RyYWNrX2NibGtfdCgpOwotICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwotICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudF8gPSBmcmFtZUNvdW50OwotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgc3dpdGNoIChhbGxvYykgeworICAgICAgICBjYXNlIEFMTE9DX1JFQURPTkxZOiB7CisgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+IHJvSGVhcCh0aHJlYWQtPnJlYWRPbmx5SGVhcCgpKTsKKyAgICAgICAgICAgIGlmIChyb0hlYXAgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlck1lbW9yeSA9IHJvSGVhcC0+YWxsb2NhdGUoYnVmZmVyU2l6ZSkpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXIgPSBtQnVmZmVyTWVtb3J5LT5wb2ludGVyKCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocm9IZWFwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcm9IZWFwLT5kdW1wKCJidWZmZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGJ1ZmZlclNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlciA9IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBTExPQ19QSVBFOgorICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeSA9IHRocmVhZC0+cGlwZU1lbW9yeSgpOworICAgICAgICAgICAgLy8gbUJ1ZmZlciBpcyB0aGUgdmlydHVhbCBhZGRyZXNzIGFzIHNlZW4gZnJvbSBjdXJyZW50IHByb2Nlc3MgKG1lZGlhc2VydmVyKSwKKyAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgY29taW5nIGZyb20gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpLgorICAgICAgICAgICAgLy8gSG93ZXZlciBpbiB0aGlzIGNhc2UgdGhlIFRyYWNrQmFzZSBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGJ1ZmZlciBkaXJlY3RseS4KKyAgICAgICAgICAgIC8vIEl0IHNob3VsZCByZWZlcmVuY2VzIHRoZSBidWZmZXIgdmlhIHRoZSBwaXBlLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0byBkZXRlY3QgaW5jb3JyZWN0IHVzYWdlIG9mIHRoZSBidWZmZXIsIHdlIHNldCBtQnVmZmVyIHRvIE5VTEwuCisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0NCTEs6CisgICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKICNpZiAwCi0gICAgICAgICAgICBtQ2Jsay0+bUZsYWdzID0gQ0JMS19GT1JDRVJFQURZOyAgICAvLyBGSVhNRSBoYWNrLCBuZWVkIHRvIGZpeCB0aGUgdHJhY2sgcmVhZHkgbG9naWMKKyAgICAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzID0gQ0JMS19GT1JDRVJFQURZOyAgICAvLyBGSVhNRSBoYWNrLCBuZWVkIHRvIGZpeCB0aGUgdHJhY2sgcmVhZHkgbG9naWMKICNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTE9DQUw6CisgICAgICAgICAgICBtQnVmZmVyID0gY2FsbG9jKDEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQpOwotICAgICAgICAgICAgaWYgKHBpcGVGb3JtYXQgIT0gRm9ybWF0X0ludmFsaWQpIHsKKyAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7CisgICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKICAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwogICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07CkBAIC0xNjcsNiArMjAzLDE3IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6aW5pdENoZWNrKCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UeXBlID09IFRZUEVfT1VUUFVUIHx8IG1UeXBlID09IFRZUEVfUEFUQ0gpIHsKKyAgICAgICAgc3RhdHVzID0gY2JsaygpICE9IE5VTEwgPyBOT19FUlJPUiA6IE5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBnZXRDYmxrKCkgIT0gMCA/IE5PX0VSUk9SIDogTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6flRyYWNrQmFzZSgpCiB7CiAjaWZkZWYgVEVFX1NJTksKQEAgLTE4MywxMyArMjMwLDE1IEBACiAgICAgfQogICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7ICAgIC8vIGZyZWUgdGhlIHNoYXJlZCBtZW1vcnkgYmVmb3JlIHJlbGVhc2luZyB0aGUgaGVhcCBpdCBiZWxvbmdzIHRvCiAgICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICAvLyBDbGllbnQgZGVzdHJ1Y3RvciBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBtdXRleCBsb2NrZWQKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgcnVuIHdpdGggQXVkaW9GbGluZ2VyIGNsaWVudCBtdXRleCBsb2NrZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tQ2xpZW50TG9jayk7CiAgICAgICAgIC8vIElmIHRoZSBjbGllbnQncyByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gemVybywgdGhlIGFzc29jaWF0ZWQgZGVzdHJ1Y3RvcgogICAgICAgICAvLyBtdXN0IHJ1biB3aXRoIEF1ZGlvRmxpbmdlciBsb2NrIGhlbGQuIFRodXMgdGhlIGV4cGxpY2l0IGNsZWFyKCkgcmF0aGVyIHRoYW4KICAgICAgICAgLy8gcmVseWluZyBvbiB0aGUgYXV0b21hdGljIGNsZWFyKCkgYXQgZW5kIG9mIHNjb3BlLgogICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CiAgICAgfQorICAgIC8vIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCkBAIC0yNzUsNiArMzI0LDExIEBACiAgICAgaWYgKCFtVHJhY2stPmlzVGltZWRUcmFjaygpKQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAKKyAgICBpZiAoYnVmZmVyID09IDAgfHwgYnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicXVldWVUaW1lZEJ1ZmZlcigpIGJ1ZmZlciBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIFBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrKiB0dCA9CiAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrKj4obVRyYWNrLmdldCgpKTsKICAgICByZXR1cm4gdHQtPnF1ZXVlVGltZWRCdWZmZXIoYnVmZmVyLCBwdHMpOwpAQCAtMzI0LDEyICszNzgsMTcgQEAKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCB0cnVlIC8qaXNPdXQqLyksCisgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlKQorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmxhZ3MsIHRydWUgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9QQVRDSCkgPyAoIGJ1ZmZlciA9PSBOVUxMID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSA6IEFMTE9DX0NCTEssCisgICAgICAgICAgICAgICAgICB0eXBlKSwKICAgICBtRmlsbGluZ1VwU3RhdHVzKEZTX0lOVkFMSUQpLAogICAgIC8vIG1SZXRyeUNvdW50IGluaXRpYWxpemVkIGxhdGVyIHdoZW4gbmVlZGVkCiAgICAgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLApAQCAtMzM5LDQ2ICszOTgsNTUgQEAKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLAogICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcygwKSwKLSAgICBtRmxhZ3MoZmxhZ3MpLAogICAgIG1GYXN0SW5kZXgoLTEpLAogICAgIG1DYWNoZWRWb2x1bWUoMS4wKSwKICAgICBtSXNJbnZhbGlkKGZhbHNlKSwKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5KE5VTEwpLAotICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKQorICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKSwKKyAgICBtRmx1c2hId1BlbmRpbmcoZmFsc2UpLAorICAgIG1QcmV2aW91c1ZhbGlkKGZhbHNlKSwKKyAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuKDApCisgICAgLy8gbVByZXZpb3VzVGltZXN0YW1wCiB7Ci0gICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKLSAgICAgICAgLy8gdG8gYXZvaWQgbGVha2luZyBhIHRyYWNrIG5hbWUsIGRvIG5vdCBhbGxvY2F0ZSBvbmUgdW5sZXNzIHRoZXJlIGlzIGFuIG1DYmxrCi0gICAgICAgIG1OYW1lID0gdGhyZWFkLT5nZXRUcmFja05hbWVfbChjaGFubmVsTWFzaywgc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKG1OYW1lIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2sgbmFtZXMgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKLSAgICAgICAgaWYgKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgIT0gMCk7Ci0gICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpICYmIGkgPCAoaW50KUZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIGlzIHRvbyBlYWdlci4gIFdlIGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAvLyAgICAgICBmYXN0IHRyYWNrIGJlY29tZXMgYWN0aXZlLiAgU2luY2UgZmFzdCB0cmFja3MgYXJlIGEgc2NhcmNlIHJlc291cmNlLAotICAgICAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCi0gICAgICAgICAgICAvLyAgICAgICBiZWluZyBjcmVhdGVkLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG9jYXRlIHRoZSBpbmRleCBkeW5hbWljYWxseS4KLSAgICAgICAgICAgIG1GYXN0SW5kZXggPSBpOwotICAgICAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKLSAgICAgICAgICAgIG1PYnNlcnZlZFVuZGVycnVucyA9IHRocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKGkpOwotICAgICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWxNYXNrICY9IH4oMSA8PCBpKTsKLSAgICAgICAgfQorICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKKyAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CisKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCisgICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobUNibGsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFMT0dWKCJUcmFjayBjb25zdHJ1Y3RvciBuYW1lICVkLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKworICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5ID0gbmV3IEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCksIHNhbXBsZVJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIG1GcmFtZVNpemUpOworICAgIH0KKyAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OworCisgICAgbU5hbWUgPSB0aHJlYWQtPmdldFRyYWNrTmFtZV9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCk7CisgICAgaWYgKG1OYW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQorICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlJc0NhbGxlZEJ5TXVsdGlwbGVUaHJlYWRzKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAhPSAwKTsKKyAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayk7CisgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpICYmIGkgPCAoaW50KUZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CisgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIGVhZ2VyLiAgV2UgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGJlZm9yZSB0aGUKKyAgICAgICAgLy8gICAgICAgZmFzdCB0cmFjayBiZWNvbWVzIGFjdGl2ZS4gIFNpbmNlIGZhc3QgdHJhY2tzIGFyZSBhIHNjYXJjZSByZXNvdXJjZSwKKyAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCisgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgorICAgICAgICBtRmFzdEluZGV4ID0gaTsKKyAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKKyAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7CisgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CisgICAgfQogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6flRyYWNrKCkKQEAgLTM5MSwxMSArNDU5LDE4IEBACiAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGF0IGxlYWsuCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIC8vIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lIDwgMCkgeworICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmRlc3Ryb3koKQogewogICAgIC8vIE5PVEU6IGRlc3Ryb3lUcmFja19sKCkgY2FuIHJlbW92ZSBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBUcmFjawpAQCAtNDA4LDMxICs0ODMsMzQgQEAKICAgICAvLyB0aGlzIFRyYWNrIHdpdGggaXRzIG1lbWJlciBtVHJhY2suCiAgICAgc3A8VHJhY2s+IGtlZXAodGhpcyk7CiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKKyAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7Ci0gICAgICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodGhyZWFkLT5pZCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhc0FjdGl2ZSA9IHBsYXliYWNrVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkgJiYgIXdhc0FjdGl2ZSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lIENsaWVudCBUeXBlICAgICAgRm10IENobiBtYXNrIFNlc3Npb24gZkNvdW50IFMgRiBTUmF0ZSAgIgorICAgIHJlc3VsdC5hcHBlbmQoIiAgICBOYW1lIEFjdGl2ZSBDbGllbnQgVHlwZSAgICAgIEZtdCBDaG4gbWFzayBTZXNzaW9uIGZDb3VudCBTIEYgU1JhdGUgICIKICAgICAgICAgICAgICAgICAgICJMIGRCICBSIGRCICAgIFNlcnZlciBNYWluIGJ1ZiAgQXV4IEJ1ZiBGbGFncyBVbmRGcm1DbnRcbiIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQogewotICAgIHVpbnQzMl90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgIEYgJTJkIiwgbUZhc3RJbmRleCk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgIEYgJTJkIiwgbUZhc3RJbmRleCk7CisgICAgfSBlbHNlIGlmIChtTmFtZSA+PSBBdWRpb01peGVyOjpUUkFDSzApIHsKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICIgICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwcmludGYoYnVmZmVyLCAiICAgJTRkIiwgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzApOworICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiAgICBub25lIik7CiAgICAgfQogICAgIHRyYWNrX3N0YXRlIHN0YXRlID0gbVN0YXRlOwogICAgIGNoYXIgc3RhdGVDaGFyOwpAQCAtNDg3LDggKzU2NSw5IEBACiAgICAgICAgIG5vd0luVW5kZXJydW4gPSAnPyc7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBzbnByaW50ZigmYnVmZmVyWzddLCBzaXplLTcsICIgJTZ1ICU0dSAlMDhYICUwOFggJTd1ICU2dSAlMWMgJTFkICU1dSAlNS4yZyAlNS4yZyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTA4WCAlMDhYIDB4JTAzWCAlOXUlY1xuIiwKKyAgICBzbnByaW50ZigmYnVmZmVyWzhdLCBzaXplLTgsICIgJTZzICU2dSAlNHUgJTA4WCAlMDhYICU3dSAlNnp1ICUxYyAlMWQgJTV1ICU1LjJnICU1LjJnICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlcCAlcCAweCUwM1ggJTl1JWNcbiIsCisgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKQEAgLTQ5OCwxMSArNTc3LDExIEBACiAgICAgICAgICAgICBzdGF0ZUNoYXIsCiAgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzLAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgMjAuMCAqIGxvZzEwKCh2bHIgJiAweEZGRkYpIC8gNDA5Ni4wKSwKLSAgICAgICAgICAgIDIwLjAgKiBsb2cxMCgodmxyID4+IDE2KSAvIDQwOTYuMCksCisgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpKSwKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpKSwKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgKGludCltTWFpbkJ1ZmZlciwKLSAgICAgICAgICAgIChpbnQpbUF1eEJ1ZmZlciwKKyAgICAgICAgICAgIG1NYWluQnVmZmVyLAorICAgICAgICAgICAgbUF1eEJ1ZmZlciwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1bik7CkBAIC01MTQsNyArNTkzLDcgQEAKIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKAotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBzaXplX3QgZGVzaXJlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKQEAgLTU1MSw3ICs2MzAsMTQgQEAKIAogLy8gRG9uJ3QgY2FsbCBmb3IgZmFzdCB0cmFja3M7IHRoZSBmcmFtZXNSZWFkeSgpIGNvdWxkIHJlc3VsdCBpbiBwcmlvcml0eSBpbnZlcnNpb24KIGJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmlzUmVhZHkoKSBjb25zdCB7Ci0gICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgIT0gRlNfRklMTElORyB8fCBpc1N0b3BwZWQoKSB8fCBpc1BhdXNpbmcoKSB8fCBpc1N0b3BwaW5nKCkpIHsKKyAgICBpZiAobUZpbGxpbmdVcFN0YXR1cyAhPSBGU19GSUxMSU5HIHx8IGlzU3RvcHBlZCgpIHx8IGlzUGF1c2luZygpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChpc1N0b3BwaW5nKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWR5KCkgPiAwKSB7CisgICAgICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTEVEOworICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNTY0LDggKzY1MCw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24pCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgQUxPR1YoInN0YXJ0KCVkKSwgY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCkBAIC01ODgsNyArNjc0LDEwIEBACiAgICAgICAgIC8vIGhlcmUgdGhlIHRyYWNrIGNvdWxkIGJlIGVpdGhlciBuZXcsIG9yIHJlc3RhcnRlZAogICAgICAgICAvLyBpbiBib3RoIGNhc2VzICJ1bnN0b3AiIHRoZSB0cmFjawogCi0gICAgICAgIGlmIChzdGF0ZSA9PSBQQVVTRUQpIHsKKyAgICAgICAgLy8gaW5pdGlhbCBzdGF0ZS1zdG9wcGluZy4gbmV4dCBzdGF0ZS1wYXVzaW5nLgorICAgICAgICAvLyBXaGF0IGlmIHJlc3VtZSBpcyBjYWxsZWQgPworCisgICAgICAgIGlmIChzdGF0ZSA9PSBQQVVTRUQgfHwgc3RhdGUgPT0gUEFVU0lORykgewogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKQEAgLTY0Myw3ICs3MzIsNyBAQAogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT5tQWN0aXZlVHJhY2tzLmluZGV4T2YodGhpcykgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGYXN0VHJhY2soKSAmJiAhaXNPZmZsb2FkZWQoKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGYXN0VHJhY2soKSAmJiAhaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIEZvciBmYXN0IHRyYWNrcyBwcmVwYXJlVHJhY2tzX2woKSB3aWxsIHNldCBzdGF0ZSB0byBTVE9QUElOR18yCkBAIC03MTksNiArODA4LDcgQEAKICAgICAgICAgICAgICAgICBtUmV0cnlDb3VudCA9IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUT1BQSU5HXzEgJiYgbVN0YXRlICE9IFNUT1BQSU5HXzIgJiYgbVN0YXRlICE9IFNUT1BQRUQgJiYKQEAgLTczNCwxNiArODI0LDI4IEBACiAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBhY3RpdmUgdHJhY2sgbGlzdCwgcmVzZXQoKSwgYW5kIHRyaWdnZXIgcHJlc2VudGF0aW9uIGNvbXBsZXRlCiAgICAgICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQtPm1BY3RpdmVUcmFja3MuaW5kZXhPZih0aGlzKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkICp0ID0gKERpcmVjdE91dHB1dFRocmVhZCAqKXBsYXliYWNrVGhyZWFkOworICAgICAgICAgICAgICAgICAgICB0LT5mbHVzaEh3X2woKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gUHJldmVudCBmbHVzaCBiZWluZyBsb3N0IGlmIHRoZSB0cmFjayBpcyBmbHVzaGVkIGFuZCB0aGVuIHJlc3VtZWQKICAgICAgICAgLy8gYmVmb3JlIG1peGVyIHRocmVhZCBjYW4gcnVuLiBUaGlzIGlzIGltcG9ydGFudCB3aGVuIG9mZmxvYWRpbmcKICAgICAgICAgLy8gYmVjYXVzZSB0aGUgaGFyZHdhcmUgYnVmZmVyIGNvdWxkIGhvbGQgYSBsYXJnZSBhbW91bnQgb2YgYXVkaW8KLSAgICAgICAgcGxheWJhY2tUaHJlYWQtPmZsdXNoT3V0cHV0X2woKTsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgfQogfQogCisvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmZsdXNoQWNrKCkKK3sKKyAgICBpZiAoIWlzT2ZmbG9hZGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1GbHVzaEh3UGVuZGluZyA9IGZhbHNlOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZXNldCgpCiB7CiAgICAgLy8gRG8gbm90IHJlc2V0IHR3aWNlIHRvIGF2b2lkIGRpc2NhcmRpbmcgZGF0YSB3cml0dGVuIGp1c3QgYWZ0ZXIgYSBmbHVzaCBhbmQgYmVmb3JlCkBAIC03NzgsMjcgKzg4MCw2MCBAQAogewogICAgIC8vIENsaWVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgdXNpbmcgU1NROyB0aGUgdW5wcmVzZW50ZWQgZnJhbWUgY291bnQgaW4gbGF0Y2ggaXMgaXJyZWxldmFudAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7CisgICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICAvLyBGSVhNRSBubyBsb2NrIGhlbGQgdG8gc2V0IG1QcmV2aW91c1ZhbGlkID0gZmFsc2UKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgIGlmICghaXNPZmZsb2FkZWQoKSkgeworICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewogICAgICAgICBpZiAoIXBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRVmFsaWQpIHsKKyAgICAgICAgICAgIG1QcmV2aW91c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgdWludDMyX3QgdW5wcmVzZW50ZWRGcmFtZXMgPQogICAgICAgICAgICAgICAgICgoaW50NjRfdCkgcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVVucHJlc2VudGVkRnJhbWVzICogbVNhbXBsZVJhdGUpIC8KICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bVNhbXBsZVJhdGU7Ci0gICAgICAgIHVpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICAvLyBGSVhNRSBTaW5jZSB3ZSdyZSB1c2luZyBhIHJhdyBwb2ludGVyIGFzIHRoZSBrZXksIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUKKyAgICAgICAgLy8gICAgICAgZm9yIGEgYnJhbmQgbmV3IHRyYWNrIHRvIHNoYXJlIHRoZSBzYW1lIGFkZHJlc3MgYXMgYSByZWNlbnRseSBkZXN0cm95ZWQKKyAgICAgICAgLy8gICAgICAgdHJhY2ssIGFuZCB0aHVzIGZvciB1cyB0byBnZXQgdGhlIGZyYW1lcyByZWxlYXNlZCBvZiB0aGUgd3JvbmcgdHJhY2suCisgICAgICAgIC8vICAgICAgIEl0IGlzIHVubGlrZWx5IHRoYXQgd2Ugd291bGQgYmUgYWJsZSB0byBjYWxsIGdldFRpbWVzdGFtcCgpIHNvIHF1aWNrbHkKKyAgICAgICAgLy8gICAgICAgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcgYSBuZXcgdHJhY2suICBOZXZlcnRoZWxlc3MsIHRoZSBpbmRleCBoZXJlIHNob3VsZAorICAgICAgICAvLyAgICAgICBiZSBjaGFuZ2VkIHRvIHNvbWV0aGluZyB0aGF0IGlzIHVuaXF1ZS4gIE9yIHVzZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHN0cmF0ZWd5LgorICAgICAgICBzc2l6ZV90IGkgPSBwbGF5YmFja1RocmVhZC0+bUxhdGNoUS5tRnJhbWVzUmVsZWFzZWQuaW5kZXhPZktleSh0aGlzKTsKKyAgICAgICAgdWludDMyX3QgZnJhbWVzV3JpdHRlbiA9IGkgPj0gMCA/CisgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubUZyYW1lc1JlbGVhc2VkW2ldIDoKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOworICAgICAgICBib29sIGNoZWNrUHJldmlvdXNUaW1lc3RhbXAgPSBtUHJldmlvdXNWYWxpZCAmJiBmcmFtZXNXcml0dGVuID49IG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW47CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuIDwgdW5wcmVzZW50ZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIG1QcmV2aW91c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KLSAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IGZyYW1lc1dyaXR0ZW4gLSB1bnByZXNlbnRlZEZyYW1lczsKLSAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVRpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgbVByZXZpb3VzRnJhbWVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgIHVpbnQzMl90IHBvc2l0aW9uID0gZnJhbWVzV3JpdHRlbiAtIHVucHJlc2VudGVkRnJhbWVzOworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7CisgICAgICAgIGlmIChjaGVja1ByZXZpb3VzVGltZXN0YW1wKSB7CisgICAgICAgICAgICBpZiAodGltZS50dl9zZWMgPCBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjIHx8CisgICAgICAgICAgICAgICAgICAgICh0aW1lLnR2X3NlYyA9PSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUudHZfc2VjICYmCisgICAgICAgICAgICAgICAgICAgIHRpbWUudHZfbnNlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9uc2VjKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lIGlzIGdvaW5nIGJhY2t3YXJkcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcG9zaXRpb24gY2FuIGJvYmJsZSBzbGlnaHRseSBhcyBhbiBhcnRpZmFjdDsgdGhpcyBoaWRlcyB0aGUgYm9iYmxlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSA9IDh1OworICAgICAgICAgICAgaWYgKChwb3NpdGlvbiA8PSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSB8fAorICAgICAgICAgICAgICAgICAgICAocG9zaXRpb24gLSBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKSA8IE1JTklNVU1fUE9TSVRJT05fREVMVEEpIHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb247CisgICAgICAgICAgICAgICAgdGltZSA9IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHRpbWU7CisgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgbVByZXZpb3VzVmFsaWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCkBAIC04ODQsOCArMTAxOSw2IEBACiAgICAgfQogCiAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPj0gbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzIHx8IGlzT2ZmbG9hZGVkKCkpIHsKLSAgICAgICAgQUxPR1YoInByZXNlbnRhdGlvbkNvbXBsZXRlKCkgc2Vzc2lvbiAlZCBjb21wbGV0ZTogZnJhbWVzV3JpdHRlbiAlZCIsCi0gICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBmcmFtZXNXcml0dGVuKTsKICAgICAgICAgdHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOwogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRTdHJlYW1FbmREb25lKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODk1LDcgKzEwMjgsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSkKIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbVN5bmNFdmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtU3luY0V2ZW50c1tpXS0+dHlwZSgpID09IHR5cGUpIHsKICAgICAgICAgICAgIG1TeW5jRXZlbnRzW2ldLT50cmlnZ2VyKCk7CiAgICAgICAgICAgICBtU3luY0V2ZW50cy5yZW1vdmVBdChpKTsKQEAgLTkwNiwyNyArMTAzOSwyNyBAQAogCiAvLyBpbXBsZW1lbnQgVm9sdW1lQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRWb2x1bWVMUigpCitnYWluX21pbmlmbG9hdF9wYWNrZWRfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0Vm9sdW1lTFIoKQogewogICAgIC8vIGNhbGxlZCBieSBGYXN0TWl4ZXIsIHNvIG5vdCBhbGxvd2VkIHRvIHRha2UgYW55IGxvY2tzLCBibG9jaywgb3IgZG8gSS9PIGluY2x1ZGluZyBsb2dzCiAgICAgQUxPR19BU1NFUlQoaXNGYXN0VHJhY2soKSAmJiAobUNibGsgIT0gTlVMTCkpOwotICAgIHVpbnQzMl90IHZsciA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFZvbHVtZUxSKCk7Ci0gICAgdWludDMyX3QgdmwgPSB2bHIgJiAweEZGRkY7Ci0gICAgdWludDMyX3QgdnIgPSB2bHIgPj4gMTY7CisgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0Vm9sdW1lTFIoKTsKKyAgICBmbG9hdCB2bCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICBmbG9hdCB2ciA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAgICAgLy8gdHJhY2sgdm9sdW1lcyBjb21lIGZyb20gc2hhcmVkIG1lbW9yeSwgc28gY2FuJ3QgYmUgdHJ1c3RlZCBhbmQgbXVzdCBiZSBjbGFtcGVkCi0gICAgaWYgKHZsID4gTUFYX0dBSU5fSU5UKSB7Ci0gICAgICAgIHZsID0gTUFYX0dBSU5fSU5UOworICAgIGlmICh2bCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKKyAgICAgICAgdmwgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgIH0KLSAgICBpZiAodnIgPiBNQVhfR0FJTl9JTlQpIHsKLSAgICAgICAgdnIgPSBNQVhfR0FJTl9JTlQ7CisgICAgaWYgKHZyID4gR0FJTl9GTE9BVF9VTklUWSkgeworICAgICAgICB2ciA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgfQogICAgIC8vIG5vdyBhcHBseSB0aGUgY2FjaGVkIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZTsKICAgICAvLyB0aGlzIGlzIHRydXN0ZWQgYnV0IGxhY2tzIGFueSBzeW5jaHJvbml6YXRpb24gb3IgYmFycmllciBzbyBtYXkgYmUgc3RhbGUKICAgICBmbG9hdCB2ID0gbUNhY2hlZFZvbHVtZTsKICAgICB2bCAqPSB2OwogICAgIHZyICo9IHY7Ci0gICAgLy8gcmUtY29tYmluZSBpbnRvIFU0LjE2Ci0gICAgdmxyID0gKHZyIDw8IDE2KSB8ICh2bCAmIDB4RkZGRik7CisgICAgLy8gcmUtY29tYmluZSBpbnRvIHBhY2tlZCBtaW5pZmxvYXQKKyAgICB2bHIgPSBnYWluX21pbmlmbG9hdF9wYWNrKGdhaW5fZnJvbV9mbG9hdCh2bCksIGdhaW5fZnJvbV9mbG9hdCh2cikpOwogICAgIC8vIEZJWE1FIGxvb2sgYXQgbXV0ZSwgcGF1c2UsIGFuZCBzdG9wIGZsYWdzCiAgICAgcmV0dXJuIHZscjsKIH0KQEAgLTk1Miw3ICsxMDg1LDcgQEAKICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZjYmxrLT5tRmxhZ3MpOwogICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoMHg0MDAwMDAwMCwgJmNibGstPm1GdXRleCk7CiAgICAgLy8gY2xpZW50IGlzIG5vdCBpbiBzZXJ2ZXIsIHNvIEZVVEVYX1dBS0UgaXMgbmVlZGVkIGluc3RlYWQgb2YgRlVURVhfV0FLRV9QUklWQVRFCi0gICAgKHZvaWQpIF9fZnV0ZXhfc3lzY2FsbDMoJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CisgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJmNibGstPm1GdXRleCwgRlVURVhfV0FLRSwgSU5UX01BWCk7CiAgICAgbUlzSW52YWxpZCA9IHRydWU7CiB9CiAKQEAgLTk2Niw2ICsxMDk5LDMzIEBACiAgICAgfQogfQogCisvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKK2Jvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmlzUmVzdW1lUGVuZGluZygpIHsKKworICAgIGlmIChtU3RhdGUgPT0gUkVTVU1JTkcpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8qIFJlc3VtZSBpcyBwZW5kaW5nIGlmIHRyYWNrIHdhcyBzdG9wcGluZyBiZWZvcmUgcGF1c2Ugd2FzIGNhbGxlZCAqLworICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSAmJgorICAgICAgICBtUmVzdW1lVG9TdG9wcGluZykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vVG8gYmUgY2FsbGVkIHdpdGggdGhyZWFkIGxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVzdW1lQWNrKCkgeworCisKKyAgICBpZiAobVN0YXRlID09IFJFU1VNSU5HKQorICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CisKKyAgICAvLyBPdGhlciBwb3NzaWJpbGl0eSBvZiAgcGVuZGluZyByZXN1bWUgaXMgc3RvcHBpbmdfMSBzdGF0ZQorICAgIC8vIERvIG5vdCB1cGRhdGUgdGhlIHN0YXRlIGZyb20gc3RvcHBpbmcgYXMgdGhpcyBwcmV2ZW50cworICAgIC8vIGRyYWluIGJlaW5nIGNhbGxlZC4KKyAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEpIHsKKyAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmcgPSBmYWxzZTsKKyAgICB9Cit9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRpbWVkVHJhY2s+CkBAIC05NzksNyArMTEzOSw4IEBACiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAotICAgICAgICAgICAgaW50IHVpZCkgeworICAgICAgICAgICAgaW50IHVpZCkKK3sKICAgICBpZiAoIWNsaWVudC0+cmVzZXJ2ZVRpbWVkVHJhY2soKSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTEwMDAsNyArMTE2MSw4IEBACiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgaW50IHVpZCkKICAgICA6IFRyYWNrKHRocmVhZCwgY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfVElNRUQpLAorICAgICAgICAgICAgZnJhbWVDb3VudCwgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpIDogTlVMTCwgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfVElNRUQsIFRZUEVfVElNRUQpLAogICAgICAgbVF1ZXVlSGVhZEluRmxpZ2h0KGZhbHNlKSwKICAgICAgIG1UcmltUXVldWVIZWFkT25SZWxlYXNlKGZhbHNlKSwKICAgICAgIG1GcmFtZXNQZW5kaW5nSW5RdWV1ZSgwKSwKQEAgLTEwNDUsMTUgKzEyMDcsMTQgQEAKIAogICAgICAgICBtVGltZWRNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtUaW1lZEJ1ZmZlckhlYXBTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpb0ZsaW5nZXJUaW1lZCIpOwotICAgICAgICBpZiAobVRpbWVkTWVtb3J5RGVhbGVyID09IE5VTEwpCisgICAgICAgIGlmIChtVGltZWRNZW1vcnlEZWFsZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHNwPElNZW1vcnk+IG5ld0J1ZmZlciA9IG1UaW1lZE1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgaWYgKG5ld0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIG5ld0J1ZmZlciA9IG1UaW1lZE1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSk7Ci0gICAgICAgIGlmIChuZXdCdWZmZXIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgaWYgKG5ld0J1ZmZlciA9PSAwIHx8IG5ld0J1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKICAgICAqYnVmZmVyID0gbmV3QnVmZmVyOwpAQCAtMTE1Miw3ICsxMzEzLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUaW1lZFRyYWNrOjp1cGRhdGVGcmFtZXNQZW5kaW5nQWZ0ZXJUcmltX2woCiAgICAgICAgIGNvbnN0IFRpbWVkQnVmZmVyJiBidWYsCi0gICAgICAgIGNvbnN0IGNoYXIqIGxvZ1RhZykgeworICAgICAgICBjb25zdCBjaGFyKiBsb2dUYWcgX191bnVzZWQpIHsKICAgICB1aW50MzJfdCBidWZCeXRlcyAgICAgICAgPSBidWYuYnVmZmVyKCktPnNpemUoKTsKICAgICB1aW50MzJfdCBjb25zdW1lZEFscmVhZHkgPSBidWYucG9zaXRpb24oKTsKIApAQCAtMTQ2Myw3ICsxNjI0LDcgQEAKICAgICAgICAgICAgIG1UcmltUXVldWVIZWFkT25SZWxlYXNlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBMT0dfRkFUQUwoIlRpbWVkVHJhY2s6OnJlbGVhc2VCdWZmZXIgb2Ygbm9uLXNpbGVuY2UgYnVmZmVyIHdpdGggbm8iCisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlRpbWVkVHJhY2s6OnJlbGVhc2VCdWZmZXIgb2Ygbm9uLXNpbGVuY2UgYnVmZmVyIHdpdGggbm8iCiAgICAgICAgICAgICAgICAgICAiIGJ1ZmZlcnMgaW4gdGhlIHRpbWVkIGJ1ZmZlciBxdWV1ZSIpOwogICAgIH0KIApAQCAtMTQ5Niw3ICsxNjU3LDcgQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgaW50IHVpZCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9DTlQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgTlVMTCwgMCwgdWlkLCBJQXVkaW9GbGluZ2VyOjpUUkFDS19ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCB1aWQsIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0RFRkFVTFQsIFRZUEVfT1VUUFVUKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpLCBtQ2xpZW50UHJveHkoTlVMTCkKIHsKIApAQCAtMTUwNCwxNyArMTY2NSwxNiBAQAogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7CiAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgotICAgICAgICAgICAgICAgICJtQ2Jsay0+ZnJhbWVDb3VudF8gJXUsIG1DaGFubmVsTWFzayAweCUwOHgiLAorICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV1LCBtQ2hhbm5lbE1hc2sgMHglMDh4IiwKICAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwKLSAgICAgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudF8sIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbUNoYW5uZWxNYXNrKTsKICAgICAgICAgLy8gc2luY2UgY2xpZW50IGFuZCBzZXJ2ZXIgYXJlIGluIHRoZSBzYW1lIHByb2Nlc3MsCiAgICAgICAgIC8vIHRoZSBidWZmZXIgaGFzIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBvbiBib3RoIHNpZGVzCi0gICAgICAgIG1DbGllbnRQcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKLSAgICAgICAgbUNsaWVudFByb3h5LT5zZXRWb2x1bWVMUigodWludDMyX3QodWludDE2X3QoMHgxMDAwKSkgPDwgMTYpIHwgdWludDE2X3QoMHgxMDAwKSk7Ci0gICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7Ci0gICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICAgICAgbUNsaWVudFByb3h5ID0gbmV3IEF1ZGlvVHJhY2tDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgbUZyYW1lQ291bnQsIG1GcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgdHJ1ZSAvKmNsaWVudEluU2VydmVyKi8pOworICAgICAgICBtQ2xpZW50UHJveHktPnNldFZvbHVtZUxSKEdBSU5fTUlOSUZMT0FUX1BBQ0tFRF9VTklUWSk7CisgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CisgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKICAgICB9CkBAIC0xNzA1LDYgKzE4NjUsNzUgQEAKIH0KIAogCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKKyAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9DTlQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgIGJ1ZmZlciwgMCwgMCwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCit7CisgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7CisgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKKworICAgIEFMT0dWKCJQYXRjaFRyYWNrICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKK30KKworQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6flBhdGNoVHJhY2soKQoreworfQorCisvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQoreworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgUHJveHk6OkJ1ZmZlciBidWY7CisgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJQYXRjaFRyYWNrKCkgJXAgZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKKyAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIH0KKyAgICBzdGF0dXMgPSBUcmFjazo6Z2V0TmV4dEJ1ZmZlcihidWZmZXIsIHB0cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgUHJveHk6OkJ1ZmZlciBidWY7CisgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CisgICAgbVBlZXJQcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmKTsKKyAgICBUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6b2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQpCit7CisgICAgcmV0dXJuIG1Qcm94eS0+b2J0YWluQnVmZmVyKGJ1ZmZlciwgdGltZU91dCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgeworICAgICAgICBBTE9HVygiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIpOworICAgICAgICBzdGFydCgpOworICAgIH0KKyAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0ZPUkNFUkVBRFksICZtQ2Jsay0+bUZsYWdzKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBSZWNvcmQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3MjEsMTAgKzE5NTAsNiBAQAogICAgIG1SZWNvcmRUcmFjay0+ZGVzdHJveSgpOwogfQogCi1zcDxJTWVtb3J5PiBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6Z2V0Q2JsaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJlY29yZFRyYWNrLT5nZXRDYmxrKCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCiAgICAgICAgIGludCB0cmlnZ2VyU2Vzc2lvbikgewogICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKQEAgLTE3NDgsNyArMTk3Myw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKKy8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LApAQCAtMTc1NiwyOCArMTk4MSw1OSBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCi0gICAgICAgICAgICBpbnQgdWlkKQorICAgICAgICAgICAgaW50IHVpZCwKKyAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICB0cmFja190eXBlIHR5cGUpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIDAgLypzaGFyZWRCdWZmZXIqLywgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLyksCi0gICAgICAgIG1PdmVyZmxvdyhmYWxzZSkKKyAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZhbHNlIC8qaXNPdXQqLywKKyAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCisgICAgICAgICAgICAgICAgICB0eXBlKSwKKyAgICAgICAgbU92ZXJmbG93KGZhbHNlKSwgbVJlc2FtcGxlcihOVUxMKSwgbVJzbXBPdXRCdWZmZXIoTlVMTCksIG1Sc21wT3V0RnJhbWVDb3VudCgwKSwKKyAgICAgICAgLy8gU2VlIHJlYWwgaW5pdGlhbGl6YXRpb24gb2YgbVJzbXBJbkZyb250IGF0IFJlY29yZFRocmVhZDo6c3RhcnQoKQorICAgICAgICBtUnNtcEluVW5yZWwoMCksIG1Sc21wSW5Gcm9udCgwKSwgbUZyYW1lc1RvRHJvcCgwKSwgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpCiB7Ci0gICAgQUxPR1YoIlJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIik7Ci0gICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvUmVjb3JkU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBtRnJhbWVTaXplKTsKLSAgICAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvUmVjb3JkU2VydmVyUHJveHk7CisgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsICFpc0V4dGVybmFsVHJhY2soKSk7CisKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgLy8gRklYTUUgSSBkb24ndCB1bmRlcnN0YW5kIGVpdGhlciBvZiB0aGUgY2hhbm5lbCBjb3VudCBjaGVja3MKKyAgICBpZiAodGhyZWFkLT5tU2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlICYmIHRocmVhZC0+bUNoYW5uZWxDb3VudCA8PSBGQ0NfMiAmJgorICAgICAgICAgICAgY2hhbm5lbENvdW50IDw9IEZDQ18yKSB7CisgICAgICAgIC8vIHNpbmsgU1IKKyAgICAgICAgbVJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbENvdW50LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gc291cmNlIFNSCisgICAgICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodGhyZWFkLT5tU2FtcGxlUmF0ZSk7CisgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FULCBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKyAgICAgICAgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKHRoaXMpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKKyAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwpOworICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCA9IGZhbHNlOwogICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewogICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgbVJlc2FtcGxlcjsKKyAgICBkZWxldGVbXSBtUnNtcE91dEJ1ZmZlcjsKKyAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLAotICAgICAgICBpbnQ2NF90IHB0cykKKyAgICAgICAgaW50NjRfdCBwdHMgX191bnVzZWQpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtMTgwOCw4ICsyMDY0LDggQEAKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICBpZiAocmVjb3JkVGhyZWFkLT5zdG9wKHRoaXMpKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRocmVhZC0+aWQoKSk7CisgICAgICAgIGlmIChyZWNvcmRUaHJlYWQtPnN0b3AodGhpcykgJiYgaXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVRocmVhZElvSGFuZGxlLCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTgxOSwxMiArMjA3NSwxNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgeworICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgeworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVRocmVhZElvSGFuZGxlLCAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtVGhyZWFkSW9IYW5kbGUsIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCk7CisgICAgICAgIH0KICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dCh0aHJlYWQtPmlkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dCh0aHJlYWQtPmlkKCkpOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopIHRocmVhZC5nZXQoKTsKICAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CkBAIC0xODM5LDI1ICsyMDk3LDExNyBAQAogICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJmNibGstPm1GbGFncyk7CiAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgweDQwMDAwMDAwLCAmY2Jsay0+bUZ1dGV4KTsKICAgICAvLyBjbGllbnQgaXMgbm90IGluIHNlcnZlciwgc28gRlVURVhfV0FLRSBpcyBuZWVkZWQgaW5zdGVhZCBvZiBGVVRFWF9XQUtFX1BSSVZBVEUKLSAgICAodm9pZCkgX19mdXRleF9zeXNjYWxsMygmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKKyAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmY2Jsay0+bUZ1dGV4LCBGVVRFWF9XQUtFLCBJTlRfTUFYKTsKIH0KIAogCiAvKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgRm10IENobiBtYXNrIFNlc3Npb24gUyAgIFNlcnZlciBmQ291bnRcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgICBBY3RpdmUgQ2xpZW50IEZtdCBDaG4gbWFzayBTZXNzaW9uIFMgICBTZXJ2ZXIgZkNvdW50IFNSYXRlXG4iKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYWN0aXZlKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiU2dSAlM3UgJTA4WCAlN3UgJTFkICUwOFggJTZ1XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICAlNnMgJTZ1ICUzdSAlMDhYICU3dSAlMWQgJTA4WCAlNnp1ICU1dVxuIiwKKyAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtU3RhdGUsCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKLSAgICAgICAgICAgIG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworCit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKK3sKKyAgICBpZiAoZXZlbnQgPT0gbVN5bmNTdGFydEV2ZW50KSB7CisgICAgICAgIHNzaXplX3QgZnJhbWVzVG9Ecm9wID0gMDsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkQmFzZSA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkQmFzZSAhPSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgYWN0dWFsIGJ1ZmZlciBmaWxsaW5nIHN0YXR1cyBpbnN0ZWFkIG9mIDIgYnVmZmVycyB3aGVuIGluZm8gaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBmcm9tIGF1ZGlvIEhBTAorICAgICAgICAgICAgZnJhbWVzVG9Ecm9wID0gdGhyZWFkQmFzZS0+bUZyYW1lQ291bnQgKiAyOworICAgICAgICB9CisgICAgICAgIG1GcmFtZXNUb0Ryb3AgPSBmcmFtZXNUb0Ryb3A7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Y2xlYXJTeW5jU3RhcnRFdmVudCgpCit7CisgICAgaWYgKG1TeW5jU3RhcnRFdmVudCAhPSAwKSB7CisgICAgICAgIG1TeW5jU3RhcnRFdmVudC0+Y2FuY2VsKCk7CisgICAgICAgIG1TeW5jU3RhcnRFdmVudC5jbGVhcigpOworICAgIH0KKyAgICBtRnJhbWVzVG9Ecm9wID0gMDsKK30KKworCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190IGZsYWdzKQorICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgYnVmZmVyLCAwLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKK3sKKyAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7CisgICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKKworICAgIEFMT0dWKCJQYXRjaFJlY29yZCAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6flBhdGNoUmVjb3JkKCkKK3sKK30KKworLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKQoreworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIFByb3h5OjpCdWZmZXIgYnVmOworICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CisgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgICJQYXRjaFJlY29yZCgpICVwIG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKKyAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIH0KKyAgICBzdGF0dXMgPSBSZWNvcmRUcmFjazo6Z2V0TmV4dEJ1ZmZlcihidWZmZXIsIHB0cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgUHJveHk6OkJ1ZmZlciBidWY7CisgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CisgICAgbVBlZXJQcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmKTsKKyAgICBUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0KQoreworICAgIHJldHVybiBtUHJveHktPm9idGFpbkJ1ZmZlcihidWZmZXIsIHRpbWVPdXQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKaW5kZXggN2EzMTRjZi4uODRhNjU1YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcApAQCAtMTQsOCArMTQsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yNCw4MSArMjIsMTE0IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgSGVhZGVyV2F2IHsKLSAgICBIZWFkZXJXYXYoc2l6ZV90IHNpemUsIGludCBuYywgaW50IHNyLCBpbnQgYml0cykgewotICAgICAgICBzdHJuY3B5KFJJRkYsICJSSUZGIiwgNCk7Ci0gICAgICAgIGNodW5rU2l6ZSA9IHNpemUgKyBzaXplb2YoSGVhZGVyV2F2KTsKLSAgICAgICAgc3RybmNweShXQVZFLCAiV0FWRSIsIDQpOwotICAgICAgICBzdHJuY3B5KGZtdCwgICJmbXQgIiwgNCk7Ci0gICAgICAgIGZtdFNpemUgPSAxNjsKLSAgICAgICAgYXVkaW9Gb3JtYXQgPSAxOwotICAgICAgICBudW1DaGFubmVscyA9IG5jOwotICAgICAgICBzYW1wbGVzUmF0ZSA9IHNyOwotICAgICAgICBieXRlUmF0ZSA9IHNyICogbnVtQ2hhbm5lbHMgKiAoYml0cy84KTsKLSAgICAgICAgYWxpZ24gPSBuYyooYml0cy84KTsKLSAgICAgICAgYml0c1BlclNhbXBsZSA9IGJpdHM7Ci0gICAgICAgIHN0cm5jcHkoZGF0YSwgImRhdGEiLCA0KTsKLSAgICAgICAgZGF0YVNpemUgPSBzaXplOwotICAgIH0KLQotICAgIGNoYXIgUklGRls0XTsgICAgICAgICAgIC8vIFJJRkYKLSAgICB1aW50MzJfdCBjaHVua1NpemU7ICAgICAvLyBGaWxlIHNpemUKLSAgICBjaGFyIFdBVkVbNF07ICAgICAgICAvLyBXQVZFCi0gICAgY2hhciBmbXRbNF07ICAgICAgICAgICAgLy8gZm10XDAKLSAgICB1aW50MzJfdCBmbXRTaXplOyAgICAgICAvLyBmbXQgc2l6ZQotICAgIHVpbnQxNl90IGF1ZGlvRm9ybWF0OyAgIC8vIDE9UENNCi0gICAgdWludDE2X3QgbnVtQ2hhbm5lbHM7ICAgLy8gbnVtIGNoYW5uZWxzCi0gICAgdWludDMyX3Qgc2FtcGxlc1JhdGU7ICAgLy8gc2FtcGxlIHJhdGUgaW4gaHoKLSAgICB1aW50MzJfdCBieXRlUmF0ZTsgICAgICAvLyBCcHMKLSAgICB1aW50MTZfdCBhbGlnbjsgICAgICAgICAvLyAyPTE2LWJpdCBtb25vLCA0PTE2LWJpdCBzdGVyZW8KLSAgICB1aW50MTZfdCBiaXRzUGVyU2FtcGxlOyAvLyBiaXRzIHBlciBzYW1wbGUKLSAgICBjaGFyIGRhdGFbNF07ICAgICAgICAgICAvLyAiZGF0YSIKLSAgICB1aW50MzJfdCBkYXRhU2l6ZTsgICAgICAvLyBzaXplCi19Oworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIAogc3RhdGljIGludCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIlVzYWdlOiAlcyBbLXBdIFstaF0gWy1zXSBbLXEge2RxfGxxfG1xfGhxfHZocX1dIFstaSBpbnB1dC1zYW1wbGUtcmF0ZV0gIgotICAgICAgICAgICAgICAgICAgICJbLW8gb3V0cHV0LXNhbXBsZS1yYXRlXSBbPGlucHV0LWZpbGU+XSA8b3V0cHV0LWZpbGU+XG4iLCBuYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiVXNhZ2U6ICVzIFstcF0gWy1mXSBbLUZdIFstdl0gWy1jIGNoYW5uZWxzXSIKKyAgICAgICAgICAgICAgICAgICAiIFstcSB7ZHF8bHF8bXF8aHF8dmhxfGRscXxkbXF8ZGhxfV0iCisgICAgICAgICAgICAgICAgICAgIiBbLWkgaW5wdXQtc2FtcGxlLXJhdGVdIFstbyBvdXRwdXQtc2FtcGxlLXJhdGVdIgorICAgICAgICAgICAgICAgICAgICIgWy1PIGNzdl0gWy1QIGNzdl0gWzxpbnB1dC1maWxlPl0iCisgICAgICAgICAgICAgICAgICAgIiA8b3V0cHV0LWZpbGU+XG4iLCBuYW1lKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1wICAgIGVuYWJsZSBwcm9maWxpbmdcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWggICAgY3JlYXRlIHdhdiBmaWxlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiICAgIC1zICAgIHN0ZXJlb1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtZiAgICBlbmFibGUgZmlsdGVyIHByb2ZpbGluZ1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtRiAgICBlbmFibGUgZmxvYXRpbmcgcG9pbnQgLXEge2RscXxkbXF8ZGhxfSBvbmx5Iik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtdiAgICB2ZXJib3NlIDogbG9nIGJ1ZmZlciBwcm92aWRlciBjYWxsc1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtYyAgICAjIGNoYW5uZWxzICgxLTIgZm9yIGxxfG1xfGhxOyAxLTggZm9yIGRscXxkbXF8ZGhxKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAtcSAgICByZXNhbXBsZXIgcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgZHEgIDogZGVmYXVsdCBxdWFsaXR5XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiICAgICAgICAgICAgICBscSAgOiBsb3cgcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgbXEgIDogbWVkaXVtIHF1YWxpdHlcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgIGhxICA6IGhpZ2ggcXVhbGl0eVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgdmhxIDogdmVyeSBoaWdoIHF1YWxpdHlcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWkgICAgaW5wdXQgZmlsZSBzYW1wbGUgcmF0ZVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgZGxxIDogZHluYW1pYyBsb3cgcXVhbGl0eVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgZG1xIDogZHluYW1pYyBtZWRpdW0gcXVhbGl0eVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgZGhxIDogZHluYW1pYyBoaWdoIHF1YWxpdHlcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLWkgICAgaW5wdXQgZmlsZSBzYW1wbGUgcmF0ZSAoaWdub3JlZCBpZiBpbnB1dCBmaWxlIGlzIHNwZWNpZmllZClcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCIgICAgLW8gICAgb3V0cHV0IGZpbGUgc2FtcGxlIHJhdGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCIgICAgLU8gICAgIyBmcmFtZXMgb3V0cHV0IHBlciBjYWxsIHRvIHJlc2FtcGxlKCkgaW4gQ1NWIGZvcm1hdFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIiAgICAtUCAgICAjIGZyYW1lcyBwcm92aWRlZCBwZXIgY2FsbCB0byByZXNhbXBsZSgpIGluIENTViBmb3JtYXRcbiIpOwogICAgIHJldHVybiAtMTsKIH0KIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworLy8gQ29udmVydCBhIGxpc3Qgb2YgaW50ZWdlcnMgaW4gQ1NWIGZvcm1hdCB0byBhIFZlY3RvciBvZiB0aG9zZSB2YWx1ZXMuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QsIG9yIC0xIG9uIGVycm9yLgoraW50IHBhcnNlQ1NWKGNvbnN0IGNoYXIgKnN0cmluZywgVmVjdG9yPGludD4mIHZhbHVlcykKK3sKKyAgICAvLyBwYXNzIDE6IGNvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGFuZCBkbyBzeW50YXggY2hlY2sKKyAgICBzaXplX3QgbnVtVmFsdWVzID0gMDsKKyAgICBib29sIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gc3RyaW5nOyA7ICkgeworICAgICAgICBzd2l0Y2ggKCpwKyspIHsKKyAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICAgICAgICBoYWREaWdpdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcyAyOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB2ZWN0b3Igb2YgdmFsdWVzCisgICAgICAgICAgICAgICAgdmFsdWVzLnJlc2l6ZSgrK251bVZhbHVlcyk7CisgICAgICAgICAgICAgICAgdmFsdWVzLmVkaXRJdGVtQXQoMCkgPSBhdG9pKHAgPSBvcHRhcmcpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbnVtVmFsdWVzOyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwKysgPT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZWRpdEl0ZW1BdChpKyspID0gYXRvaShwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtVmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CisgICAgICAgICAgICAgICAgaGFkRGlnaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBudW1WYWx1ZXMrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorfQogCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgICAgY29uc3QgY2hhciogY29uc3QgcHJvZ25hbWUgPSBhcmd2WzBdOwotICAgIGJvb2wgcHJvZmlsaW5nID0gZmFsc2U7Ci0gICAgYm9vbCB3cml0ZUhlYWRlciA9IGZhbHNlOworICAgIGJvb2wgcHJvZmlsZVJlc2FtcGxlID0gZmFsc2U7CisgICAgYm9vbCBwcm9maWxlRmlsdGVyID0gZmFsc2U7CisgICAgYm9vbCB1c2VGbG9hdCA9IGZhbHNlOwogICAgIGludCBjaGFubmVscyA9IDE7CiAgICAgaW50IGlucHV0X2ZyZXEgPSAwOwogICAgIGludCBvdXRwdXRfZnJlcSA9IDA7CiAgICAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOworICAgIFZlY3RvcjxpbnQ+IE92YWx1ZXM7CisgICAgVmVjdG9yPGludD4gUHZhbHVlczsKIAogICAgIGludCBjaDsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJwaHNxOmk6bzoiKSkgIT0gLTEpIHsKKyAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJwZkZ2YzpxOmk6bzpPOlA6IikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICBwcm9maWxpbmcgPSB0cnVlOworICAgICAgICAgICAgcHJvZmlsZVJlc2FtcGxlID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgIHdyaXRlSGVhZGVyID0gdHJ1ZTsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBwcm9maWxlRmlsdGVyID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgIGNoYW5uZWxzID0gMjsKKyAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICB1c2VGbG9hdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICBnVmVyYm9zZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICBjaGFubmVscyA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImRxIikpCkBAIC0xMTEsNiArMTQyLDEyIEBACiAgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFk7CiAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgInZocSIpKQogICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFk7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImRscSIpKQorICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJkbXEiKSkKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZGhxIikpCisgICAgICAgICAgICAgICAgcXVhbGl0eSA9IEF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZOwogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdXNhZ2UocHJvZ25hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTEyMiwxMiArMTU5LDM1IEBACiAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgb3V0cHV0X2ZyZXEgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTyc6CisgICAgICAgICAgICBpZiAocGFyc2VDU1Yob3B0YXJnLCBPdmFsdWVzKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluY29ycmVjdCBzeW50YXggZm9yIC1PIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgaWYgKHBhcnNlQ1NWKG9wdGFyZywgUHZhbHVlcykgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmNvcnJlY3Qgc3ludGF4IGZvciAtUCBvcHRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICc/JzoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChjaGFubmVscyA8IDEKKyAgICAgICAgICAgIHx8IGNoYW5uZWxzID4gKHF1YWxpdHkgPCBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZID8gMiA6IDgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgJWRcbiIsIGNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodXNlRmxvYXQgJiYgcXVhbGl0eSA8IEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmbG9hdCBwcm9jZXNzaW5nIGlzIG9ubHkgcG9zc2libGUgZm9yIGR5bmFtaWMgcmVzYW1wbGVyc1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICBhcmdjIC09IG9wdGluZDsKICAgICBhcmd2ICs9IG9wdGluZDsKIApAQCAtMTQ4LDI1ICsyMDgsMjIgQEAKICAgICBzaXplX3QgaW5wdXRfc2l6ZTsKICAgICB2b2lkKiBpbnB1dF92YWRkcjsKICAgICBpZiAoYXJnYyA9PSAyKSB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICBpZiAoc3RhdChmaWxlX2luLCAmc3QpIDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzdGF0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgU0ZfSU5GTyBpbmZvOworICAgICAgICBpbmZvLmZvcm1hdCA9IDA7CisgICAgICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihmaWxlX2luLCBTRk1fUkVBRCwgJmluZm8pOworICAgICAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICAgICAgcGVycm9yKGZpbGVfaW4pOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICAgICAgfQotCi0gICAgICAgIGludCBpbnB1dF9mZCA9IG9wZW4oZmlsZV9pbiwgT19SRE9OTFkpOwotICAgICAgICBpZiAoaW5wdXRfZmQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZW46ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5wdXRfc2l6ZSA9IHN0LnN0X3NpemU7Ci0gICAgICAgIGlucHV0X3ZhZGRyID0gbW1hcCgwLCBpbnB1dF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBpbnB1dF9mZCwgMCk7Ci0gICAgICAgIGlmIChpbnB1dF92YWRkciA9PSBNQVBfRkFJTEVEICkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtbWFwOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBpbnB1dF9zaXplID0gaW5mby5mcmFtZXMgKiBpbmZvLmNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgICAgICAgaW5wdXRfdmFkZHIgPSBtYWxsb2MoaW5wdXRfc2l6ZSk7CisgICAgICAgICh2b2lkKSBzZl9yZWFkZl9zaG9ydChzZiwgKHNob3J0ICopIGlucHV0X3ZhZGRyLCBpbmZvLmZyYW1lcyk7CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICAgICAgY2hhbm5lbHMgPSBpbmZvLmNoYW5uZWxzOworICAgICAgICBpbnB1dF9mcmVxID0gaW5mby5zYW1wbGVyYXRlOwogICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRhdGEgZm9yIHRlc3RpbmcgaXMgZXhhY3RseSAoaW5wdXQgc2FtcGxpbmcgcmF0ZS8xMDAwKS8yIHNlY29uZHMKKyAgICAgICAgLy8gc28gNDQuMWtoeiBpbnB1dCBpcyAyMi4wNSBzZWNvbmRzCiAgICAgICAgIGRvdWJsZSBrID0gMTAwMDsgLy8gSHogLyBzCiAgICAgICAgIGRvdWJsZSB0aW1lID0gKGlucHV0X2ZyZXEgLyAyKSAvIGs7CiAgICAgICAgIHNpemVfdCBpbnB1dF9mcmFtZXMgPSBzaXplX3QoaW5wdXRfZnJlcSAqIHRpbWUpOwpAQCAtMTc3LDk4ICsyMzQsMjc2IEBACiAgICAgICAgICAgICBkb3VibGUgdCA9IGRvdWJsZShpKSAvIGlucHV0X2ZyZXE7CiAgICAgICAgICAgICBkb3VibGUgeSA9IHNpbihNX1BJICogayAqIHQgKiB0KTsKICAgICAgICAgICAgIGludDE2X3QgeWkgPSBmbG9vcih5ICogMzI3NjcuMCArIDAuNSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqPTAgOyBqPChzaXplX3QpY2hhbm5lbHMgOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbltpKmNoYW5uZWxzICsgal0gPSB5aSAvICgxK2opOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgaW5baSpjaGFubmVscyArIGpdID0geWkgLyAoMSArIGopOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIHNpemVfdCBpbnB1dF9mcmFtZXNpemUgPSBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzaXplX3QgaW5wdXRfZnJhbWVzID0gaW5wdXRfc2l6ZSAvIGlucHV0X2ZyYW1lc2l6ZTsKKworICAgIC8vIEZvciBmbG9hdCBwcm9jZXNzaW5nLCBjb252ZXJ0IGlucHV0IGludDE2X3QgdG8gZmxvYXQgYXJyYXkKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgdm9pZCAqbmV3X3ZhZGRyOworCisgICAgICAgIGlucHV0X2ZyYW1lc2l6ZSA9IGNoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgaW5wdXRfc2l6ZSA9IGlucHV0X2ZyYW1lcyAqIGlucHV0X2ZyYW1lc2l6ZTsKKyAgICAgICAgbmV3X3ZhZGRyID0gbWFsbG9jKGlucHV0X3NpemUpOworICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG5ld192YWRkciksCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oaW5wdXRfdmFkZHIpLCBpbnB1dF9mcmFtZXMgKiBjaGFubmVscyk7CisgICAgICAgIGZyZWUoaW5wdXRfdmFkZHIpOworICAgICAgICBpbnB1dF92YWRkciA9IG5ld192YWRkcjsKKyAgICB9CiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBjbGFzcyBQcm92aWRlcjogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotICAgICAgICBpbnQxNl90KiBtQWRkcjsKLSAgICAgICAgc2l6ZV90IG1OdW1GcmFtZXM7CisgICAgICAgIGNvbnN0IHZvaWQqICAgICBtQWRkcjsgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgY29uc3Qgc2l6ZV90ICAgIG1OdW1GcmFtZXM7IC8vIHRvdGFsIGZyYW1lcworICAgICAgICBjb25zdCBzaXplX3QgICAgbUZyYW1lU2l6ZTsgLy8gc2l6ZSBvZiBlYWNoIGZyYW1lIGluIGJ5dGVzCisgICAgICAgIHNpemVfdCAgICAgICAgICBtTmV4dEZyYW1lOyAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIHByb3ZpZGUKKyAgICAgICAgc2l6ZV90ICAgICAgICAgIG1VbnJlbDsgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgbm90IHlldCByZWxlYXNlZAorICAgICAgICBjb25zdCBWZWN0b3I8aW50PiBtUHZhbHVlczsgLy8gbnVtYmVyIG9mIGZyYW1lcyBwcm92aWRlZCBwZXIgY2FsbAorICAgICAgICBzaXplX3QgICAgICAgICAgbU5leHRQaWR4OyAgLy8gaW5kZXggb2YgbmV4dCBlbnRyeSBpbiBtUHZhbHVlcyB0byB1c2UKICAgICBwdWJsaWM6Ci0gICAgICAgIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBzaXplLCBpbnQgY2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1BZGRyID0gKGludDE2X3QqKSBhZGRyOwotICAgICAgICAgICAgbU51bUZyYW1lcyA9IHNpemUgLyAoY2hhbm5lbHMqc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgUHJvdmlkZXIoY29uc3Qgdm9pZCogYWRkciwgc2l6ZV90IGZyYW1lcywgc2l6ZV90IGZyYW1lU2l6ZSwgY29uc3QgVmVjdG9yPGludD4mIFB2YWx1ZXMpCisgICAgICAgICAgOiBtQWRkcihhZGRyKSwKKyAgICAgICAgICAgIG1OdW1GcmFtZXMoZnJhbWVzKSwKKyAgICAgICAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKKyAgICAgICAgICAgIG1OZXh0RnJhbWUoMCksIG1VbnJlbCgwKSwgbVB2YWx1ZXMoUHZhbHVlcyksIG1OZXh0UGlkeCgwKSB7CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLAogICAgICAgICAgICAgICAgIGludDY0X3QgcHRzID0ga0ludmFsaWRQVFMpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXM7Ci0gICAgICAgICAgICBidWZmZXItPmkxNiA9IG1BZGRyOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgKHZvaWQpcHRzOyAvLyBzdXBwcmVzcyB3YXJuaW5nCisgICAgICAgICAgICBzaXplX3QgcmVxdWVzdGVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgaWYgKHJlcXVlc3RlZEZyYW1lcyA+IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1QdmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBwcm92aWRlZCA9IG1QdmFsdWVzW21OZXh0UGlkeCsrXTsKKyAgICAgICAgICAgICAgICBwcmludGYoIm1QdmFsdWVbJXp1XT0lenUgbm90ICV6dVxuIiwgbU5leHRQaWR4LTEsIHByb3ZpZGVkLCBidWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlZCA8IGJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwcm92aWRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0UGlkeCA+PSBtUHZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRQaWR4ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImdldE5leHRCdWZmZXIoKSByZXF1ZXN0ZWQgJXp1IGZyYW1lcyBvdXQgb2YgJXp1IGZyYW1lcyBhdmFpbGFibGUsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgcmV0dXJuZWQgJXp1IGZyYW1lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEZyYW1lcywgKHNpemVfdCkgKG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lKSwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1VbnJlbCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciAqKW1BZGRyICsgbUZyYW1lU2l6ZSAqIG1OZXh0RnJhbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1VbnJlbCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgcmVsZWFzZUJ1ZmZlcigpIHJlbGVhc2VkICV6dSBmcmFtZXMgYnV0IG9ubHkgJXp1IGF2YWlsYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidG8gcmVsZWFzZVxuIiwgYnVmZmVyLT5mcmFtZUNvdW50LCBtVW5yZWwpOworICAgICAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gbVVucmVsOworICAgICAgICAgICAgICAgIG1VbnJlbCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoInJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIG91dCBvZiAlenUgZnJhbWVzIGF2YWlsYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlbGVhc2VcbiIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU5leHRGcmFtZSArPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICBidWZmZXItPnJhdyA9IE5VTEw7CiAgICAgICAgIH0KLSAgICB9IHByb3ZpZGVyKGlucHV0X3ZhZGRyLCBpbnB1dF9zaXplLCBjaGFubmVscyk7CisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtTmV4dEZyYW1lID0gMDsKKyAgICAgICAgfQorICAgIH0gcHJvdmlkZXIoaW5wdXRfdmFkZHIsIGlucHV0X2ZyYW1lcywgaW5wdXRfZnJhbWVzaXplLCBQdmFsdWVzKTsKIAotICAgIHNpemVfdCBpbnB1dF9mcmFtZXMgPSBpbnB1dF9zaXplIC8gKGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICBzaXplX3Qgb3V0cHV0X3NpemUgPSAyICogNCAqICgoaW50NjRfdCkgaW5wdXRfZnJhbWVzICogb3V0cHV0X2ZyZXEpIC8gaW5wdXRfZnJlcTsKLSAgICBvdXRwdXRfc2l6ZSAmPSB+NzsgLy8gYWx3YXlzIHN0ZXJlbywgMzItYml0cworICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICBwcmludGYoIiV6dSBpbnB1dCBmcmFtZXNcbiIsIGlucHV0X2ZyYW1lcyk7CisgICAgfQogCi0gICAgdm9pZCogb3V0cHV0X3ZhZGRyID0gbWFsbG9jKG91dHB1dF9zaXplKTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSB1c2VGbG9hdCA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBpbnQgb3V0cHV0X2NoYW5uZWxzID0gY2hhbm5lbHMgPiAyID8gY2hhbm5lbHMgOiAyOyAvLyBvdXRwdXQgaXMgYXQgbGVhc3Qgc3RlcmVvIHNhbXBsZXMKKyAgICBzaXplX3Qgb3V0cHV0X2ZyYW1lc2l6ZSA9IG91dHB1dF9jaGFubmVscyAqICh1c2VGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MzJfdCkpOworICAgIHNpemVfdCBvdXRwdXRfZnJhbWVzID0gKChpbnQ2NF90KSBpbnB1dF9mcmFtZXMgKiBvdXRwdXRfZnJlcSkgLyBpbnB1dF9mcmVxOworICAgIHNpemVfdCBvdXRwdXRfc2l6ZSA9IG91dHB1dF9mcmFtZXMgKiBvdXRwdXRfZnJhbWVzaXplOwogCi0gICAgaWYgKHByb2ZpbGluZykgewotICAgICAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgxNiwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgb3V0cHV0X2ZyZXEsIHF1YWxpdHkpOwotCi0gICAgICAgIHNpemVfdCBvdXRfZnJhbWVzID0gb3V0cHV0X3NpemUvODsKLSAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0X2ZyZXEpOwotICAgICAgICByZXNhbXBsZXItPnNldFZvbHVtZSgweDEwMDAsIDB4MTAwMCk7Ci0KLSAgICAgICAgbWVtc2V0KG91dHB1dF92YWRkciwgMCwgb3V0cHV0X3NpemUpOworICAgIGlmIChwcm9maWxlRmlsdGVyKSB7CisgICAgICAgIC8vIENoZWNrIGhvdyBmYXN0IHNhbXBsZSByYXRlIGNoYW5nZXMgYXJlIHRoYXQgcmVxdWlyZSBmaWx0ZXIgY2hhbmdlcy4KKyAgICAgICAgLy8gVGhlIGRlbHRhIHNhbXBsZSByYXRlIGNoYW5nZXMgbXVzdCBpbmRpY2F0ZSBhIGRvd25zYW1wbGluZyByYXRpbywKKyAgICAgICAgLy8gYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gMTAlIGNoYW5nZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIE9uIGZhc3QgZGV2aWNlcywgZmlsdGVycyBzaG91bGQgYmUgZ2VuZXJhdGVkIGJldHdlZW4gMC4xbXMgLSAxbXMuCisgICAgICAgIC8vIChzaW5nbGUgdGhyZWFkZWQpLgorICAgICAgICBBdWRpb1Jlc2FtcGxlciogcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIDgwMDAsIHF1YWxpdHkpOworICAgICAgICBpbnQgbG9vcGxpbWl0ID0gMTAwOwogICAgICAgICB0aW1lc3BlYyBzdGFydCwgZW5kOwogICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOwotICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dF9mcmFtZXMsICZwcm92aWRlcik7Ci0gICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50Kikgb3V0cHV0X3ZhZGRyLCBvdXRfZnJhbWVzLCAmcHJvdmlkZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BsaW1pdDsgKytpKSB7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoOTAwMCk7CisgICAgICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoMTIwMDApOworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDIwMDAwKTsKKyAgICAgICAgICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSgzMDAwMCk7CisgICAgICAgIH0KICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOwogICAgICAgICBpbnQ2NF90IHN0YXJ0X25zID0gc3RhcnQudHZfc2VjICogMTAwMDAwMDAwMExMICsgc3RhcnQudHZfbnNlYzsKICAgICAgICAgaW50NjRfdCBlbmRfbnMgPSBlbmQudHZfc2VjICogMTAwMDAwMDAwMExMICsgZW5kLnR2X25zZWM7Ci0gICAgICAgIGludDY0X3QgdGltZSA9IChlbmRfbnMgLSBzdGFydF9ucykvNDsKLSAgICAgICAgcHJpbnRmKCIlZiBNc3BsL3NcbiIsIG91dF9mcmFtZXMvKHRpbWUvMWU5KS8xZTYpOworICAgICAgICBpbnQ2NF90IHRpbWUgPSBlbmRfbnMgLSBzdGFydF9uczsKKyAgICAgICAgcHJpbnRmKCIlLjJmIHNhbXBsZSByYXRlIGNoYW5nZXMgd2l0aCBmaWx0ZXIgY2FsY3VsYXRpb24vc2VjXG4iLAorICAgICAgICAgICAgICAgIGxvb3BsaW1pdCAqIDQgLyAodGltZSAvIDFlOSkpOwogCisgICAgICAgIC8vIENoZWNrIGhvdyBmYXN0IHNhbXBsZSByYXRlIGNoYW5nZXMgYXJlIHdpdGhvdXQgZmlsdGVyIGNoYW5nZXMuCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHZlcnkgZmFzdCwgcHJvYmFibHkgMC4xdXMgLSAxdXMgcGVyIHNhbXBsZSByYXRlCisgICAgICAgIC8vIGNoYW5nZS4KKyAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEwMDApOworICAgICAgICBsb29wbGltaXQgPSAxMDAwOworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wbGltaXQ7ICsraSkgeworICAgICAgICAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKDEwMDAraSk7CisgICAgICAgIH0KKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOworICAgICAgICBzdGFydF9ucyA9IHN0YXJ0LnR2X3NlYyAqIDEwMDAwMDAwMDBMTCArIHN0YXJ0LnR2X25zZWM7CisgICAgICAgIGVuZF9ucyA9IGVuZC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBlbmQudHZfbnNlYzsKKyAgICAgICAgdGltZSA9IGVuZF9ucyAtIHN0YXJ0X25zOworICAgICAgICBwcmludGYoIiUuMmYgc2FtcGxlIHJhdGUgY2hhbmdlcyB3aXRob3V0IGZpbHRlciBjYWxjdWxhdGlvbi9zZWNcbiIsCisgICAgICAgICAgICAgICAgbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpKTsKKyAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOwogICAgICAgICBkZWxldGUgcmVzYW1wbGVyOwogICAgIH0KIAotICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKDE2LCBjaGFubmVscywKKyAgICB2b2lkKiBvdXRwdXRfdmFkZHIgPSBtYWxsb2Mob3V0cHV0X3NpemUpOworICAgIEF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKGZvcm1hdCwgY2hhbm5lbHMsCiAgICAgICAgICAgICBvdXRwdXRfZnJlcSwgcXVhbGl0eSk7Ci0gICAgc2l6ZV90IG91dF9mcmFtZXMgPSBvdXRwdXRfc2l6ZS84OworCiAgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0X2ZyZXEpOwotICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKDB4MTAwMCwgMHgxMDAwKTsKKyAgICByZXNhbXBsZXItPnNldFZvbHVtZShBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworCisgICAgaWYgKHByb2ZpbGVSZXNhbXBsZSkgeworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgcHJvZmlsaW5nIG9uIG1vYmlsZSBkZXZpY2VzLCB1cG9uIGV4cGVyaW1lbnRhdGlvbgorICAgICAgICAgKiBpdCBpcyBiZXR0ZXIgdG8gcnVuIGEgZmV3IHRyaWFscyB3aXRoIGEgc2hvcnRlciBsb29wIGxpbWl0LAorICAgICAgICAgKiBhbmQgdGFrZSB0aGUgbWluaW11bSB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBMb25nIHRlc3RzIGNhbiBjYXVzZSBDUFUgdGVtcGVyYXR1cmUgdG8gYnVpbGQgdXAgYW5kIHRoZXJtYWwgdGhyb3R0bGluZworICAgICAgICAgKiB0byByZWR1Y2UgQ1BVIGZyZXF1ZW5jeS4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIGZyZXF1ZW5jeSBjaGVja3MgKGluZGV4PTAsIG9yIDEsIGV0Yy4pOgorICAgICAgICAgKiAiY2F0IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSR7aW5kZXh9L2NwdWZyZXEvc2NhbGluZ18qX2ZyZXEiCisgICAgICAgICAqCisgICAgICAgICAqIEZvciB0ZW1wZXJhdHVyZSBjaGVja3MgKGluZGV4PTAsIG9yIDEsIGV0Yy4pOgorICAgICAgICAgKiAiY2F0IC9zeXMvY2xhc3MvdGhlcm1hbC90aGVybWFsX3pvbmUke2luZGV4fS90ZW1wIgorICAgICAgICAgKgorICAgICAgICAgKiBBbm90aGVyIHdheSB0byBhdm9pZCB0aGVybWFsIHRocm90dGxpbmcgaXMgdG8gZml4IHRoZSBDUFUgZnJlcXVlbmN5CisgICAgICAgICAqIGF0IGEgbG93ZXIgbGV2ZWwgd2hpY2ggcHJldmVudHMgZXhjZXNzaXZlIHRlbXBlcmF0dXJlcy4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IGludCB0cmlhbHMgPSA0OworICAgICAgICBjb25zdCBpbnQgbG9vcGxpbWl0ID0gNDsKKyAgICAgICAgdGltZXNwZWMgc3RhcnQsIGVuZDsKKyAgICAgICAgaW50NjRfdCB0aW1lID0gMDsKKworICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IHRyaWFsczsgKytuKSB7CisgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0YXJ0KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGxpbWl0OyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIsIG91dHB1dF9mcmFtZXMsICZwcm92aWRlcik7CisgICAgICAgICAgICAgICAgcHJvdmlkZXIucmVzZXQoKTsgLy8gIGR1cmluZyBiZW5jaG1hcmtpbmcgcmVzZXQgb25seSB0aGUgcHJvdmlkZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRfbnMgPSBzdGFydC50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyBzdGFydC50dl9uc2VjOworICAgICAgICAgICAgaW50NjRfdCBlbmRfbnMgPSBlbmQudHZfc2VjICogMTAwMDAwMDAwMExMICsgZW5kLnR2X25zZWM7CisgICAgICAgICAgICBpbnQ2NF90IGRpZmZfbnMgPSBlbmRfbnMgLSBzdGFydF9uczsKKyAgICAgICAgICAgIGlmIChuID09IDAgfHwgZGlmZl9ucyA8IHRpbWUpIHsKKyAgICAgICAgICAgICAgICB0aW1lID0gZGlmZl9uczsgICAvLyBzYXZlIHRoZSBiZXN0IG91dCBvZiBvdXIgdHJpYWxzLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE1mcm1zL3MgaXMgIk1pbGxpb25zIG9mIG91dHB1dCBmcmFtZXMgcGVyIHNlY29uZCIuCisgICAgICAgIHByaW50ZigicXVhbGl0eTogJWQgIGNoYW5uZWxzOiAlZCAgbXNlYzogJSIgUFJJZDY0ICIgIE1mcm1zL3M6ICUuMmxmXG4iLAorICAgICAgICAgICAgICAgIHF1YWxpdHksIGNoYW5uZWxzLCB0aW1lLzEwMDAwMDAsIG91dHB1dF9mcmFtZXMgKiBsb29wbGltaXQgLyAodGltZSAvIDFlOSkgLyAxZTYpOworICAgICAgICByZXNhbXBsZXItPnJlc2V0KCk7CisgICAgfQogCiAgICAgbWVtc2V0KG91dHB1dF92YWRkciwgMCwgb3V0cHV0X3NpemUpOwotICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopIG91dHB1dF92YWRkciwgb3V0X2ZyYW1lcywgJnByb3ZpZGVyKTsKKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJyZXNhbXBsZSgpICV6dSBvdXRwdXQgZnJhbWVzXG4iLCBvdXRwdXRfZnJhbWVzKTsKKyAgICB9CisgICAgaWYgKE92YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIE92YWx1ZXMucHVzaChvdXRwdXRfZnJhbWVzKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGogPSAwOyBpIDwgb3V0cHV0X2ZyYW1lczsgKSB7CisgICAgICAgIHNpemVfdCB0aGlzRnJhbWVzID0gT3ZhbHVlc1tqKytdOworICAgICAgICBpZiAoaiA+PSBPdmFsdWVzLnNpemUoKSkgeworICAgICAgICAgICAgaiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXNGcmFtZXMgPT0gMCB8fCB0aGlzRnJhbWVzID4gb3V0cHV0X2ZyYW1lcyAtIGkpIHsKKyAgICAgICAgICAgIHRoaXNGcmFtZXMgPSBvdXRwdXRfZnJhbWVzIC0gaTsKKyAgICAgICAgfQorICAgICAgICByZXNhbXBsZXItPnJlc2FtcGxlKChpbnQqKSBvdXRwdXRfdmFkZHIgKyBvdXRwdXRfY2hhbm5lbHMqaSwgdGhpc0ZyYW1lcywgJnByb3ZpZGVyKTsKKyAgICAgICAgaSArPSB0aGlzRnJhbWVzOworICAgIH0KKyAgICBpZiAoZ1ZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJyZXNhbXBsZSgpIGNvbXBsZXRlXG4iKTsKKyAgICB9CisgICAgcmVzYW1wbGVyLT5yZXNldCgpOworICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInJlc2V0KCkgY29tcGxldGVcbiIpOworICAgIH0KKyAgICBkZWxldGUgcmVzYW1wbGVyOworICAgIHJlc2FtcGxlciA9IE5VTEw7CiAKLSAgICAvLyBkb3duLW1peCAod2UganVzdCB0cnVuY2F0ZSBhbmQga2VlcCB0aGUgbGVmdCBjaGFubmVsKQorICAgIC8vIEZvciBmbG9hdCBwcm9jZXNzaW5nLCBjb252ZXJ0IG91dHB1dCBmb3JtYXQgZnJvbSBmbG9hdCB0byBRNC4yNywKKyAgICAvLyB3aGljaCBpcyB0aGVuIGNvbnZlcnRlZCB0byBpbnQxNl90IGZvciBmaW5hbCBzdG9yYWdlLgorICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICBtZW1jcHlfdG9fcTRfMjdfZnJvbV9mbG9hdChyZWludGVycHJldF9jYXN0PGludDMyX3QqPihvdXRwdXRfdmFkZHIpLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPihvdXRwdXRfdmFkZHIpLCBvdXRwdXRfZnJhbWVzICogb3V0cHV0X2NoYW5uZWxzKTsKKyAgICB9CisKKyAgICAvLyBtb25vIHRha2VzIGxlZnQgY2hhbm5lbCBvbmx5IChvdXQgb2Ygc3RlcmVvIG91dHB1dCBwYWlyKQorICAgIC8vIHN0ZXJlbyBhbmQgbXVsdGljaGFubmVsIHByZXNlcnZlIGFsbCBjaGFubmVscy4KICAgICBpbnQzMl90KiBvdXQgPSAoaW50MzJfdCopIG91dHB1dF92YWRkcjsKLSAgICBpbnQxNl90KiBjb252ZXJ0ID0gKGludDE2X3QqKSBtYWxsb2Mob3V0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dF9mcmFtZXM7IGkrKykgewotICAgICAgICBmb3IgKGludCBqPTAgOyBqPGNoYW5uZWxzIDsgaisrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHMgPSBvdXRbaSAqIDIgKyBqXSA+PiAxMjsKLSAgICAgICAgICAgIGlmIChzID4gMzI3NjcpICAgICAgIHMgPSAgMzI3Njc7Ci0gICAgICAgICAgICBlbHNlIGlmIChzIDwgLTMyNzY4KSBzID0gLTMyNzY4OworICAgIGludDE2X3QqIGNvbnZlcnQgPSAoaW50MTZfdCopIG1hbGxvYyhvdXRwdXRfZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgY29uc3QgaW50IHZvbHVtZVNoaWZ0ID0gMTI7IC8vIHNoaWZ0IHJlcXVpcmVtZW50IGZvciBRNC4yNyB0byBRLjE1CisgICAgLy8gcm91bmQgdG8gaGFsZiB0b3dhcmRzIHplcm8gYW5kIHNhdHVyYXRlIGF0IGludDE2IChub24tZGl0aGVyZWQpCisgICAgY29uc3QgaW50IHJvdW5kVmFsID0gKDE8PCh2b2x1bWVTaGlmdC0xKSkgLSAxOyAvLyB2b2x1bWVQcmVjaXNpb24gPiAwCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dF9mcmFtZXM7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgcyA9IG91dFtpICogb3V0cHV0X2NoYW5uZWxzICsgal0gKyByb3VuZFZhbDsgLy8gYWRkIG9mZnNldCBoZXJlCisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBzID0gKHMgKyAxKSA+PiB2b2x1bWVTaGlmdDsgLy8gcm91bmQgdG8gMAorICAgICAgICAgICAgICAgIGlmIChzIDwgLTMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAtMzI3Njg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzID0gcyA+PiB2b2x1bWVTaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAocyA+IDMyNzY3KSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSAzMjc2NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb252ZXJ0W2kgKiBjaGFubmVscyArIGpdID0gaW50MTZfdChzKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHdyaXRlIG91dHB1dCB0byBkaXNrCi0gICAgaW50IG91dHB1dF9mZCA9IG9wZW4oZmlsZV9vdXQsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCi0gICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKLSAgICBpZiAob3V0cHV0X2ZkIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wZW46ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgU0ZfSU5GTyBpbmZvOworICAgIGluZm8uZnJhbWVzID0gMDsKKyAgICBpbmZvLnNhbXBsZXJhdGUgPSBvdXRwdXRfZnJlcTsKKyAgICBpbmZvLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaW5mby5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgU0ZfRk9STUFUX1BDTV8xNjsKKyAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4oZmlsZV9vdXQsIFNGTV9XUklURSwgJmluZm8pOworICAgIGlmIChzZiA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlX291dCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgfQorICAgICh2b2lkKSBzZl93cml0ZWZfc2hvcnQoc2YsIGNvbnZlcnQsIG91dHB1dF9mcmFtZXMpOworICAgIHNmX2Nsb3NlKHNmKTsKIAotICAgIGlmICh3cml0ZUhlYWRlcikgewotICAgICAgICBIZWFkZXJXYXYgd2F2KG91dF9mcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSwgY2hhbm5lbHMsIG91dHB1dF9mcmVxLCAxNik7Ci0gICAgICAgIHdyaXRlKG91dHB1dF9mZCwgJndhdiwgc2l6ZW9mKHdhdikpOwotICAgIH0KLQotICAgIHdyaXRlKG91dHB1dF9mZCwgY29udmVydCwgb3V0X2ZyYW1lcyAqIGNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICBjbG9zZShvdXRwdXRfZmQpOwotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiYTA1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNzMgQEAKKyMgQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGF1ZGlvZmxpbmdlcgorCisjCisjIHJlc2FtcGxlciB1bml0IHRlc3QKKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmxvZyBcCisJbGlidXRpbHMgXAorCWxpYmN1dGlscyBcCisJbGlic3RscG9ydCBcCisJbGliYXVkaW91dGlscyBcCisJbGliYXVkaW9yZXNhbXBsZXIKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisJbGliZ3Rlc3QgXAorCWxpYmd0ZXN0X21haW4KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJYmlvbmljIFwKKwliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorCWV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAorCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisJZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlyZXNhbXBsZXJfdGVzdHMuY3BwCisKK0xPQ0FMX01PRFVMRSA6PSByZXNhbXBsZXJfdGVzdHMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjCisjIGF1ZGlvIG1peGVyIHRlc3QgdG9vbAorIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0ZXN0LW1peGVyLmNwcCBcCisJLi4vQXVkaW9NaXhlci5jcHAuYXJtIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJYmlvbmljIFwKKwliaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAorCWV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKwlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKwlsaWJzbmRmaWxlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0bHBvcnQgXAorCWxpYmVmZmVjdHMgXAorCWxpYm5iYWlvIFwKKwlsaWJjb21tb25fdGltZV9jbGllbnQgXAorCWxpYmF1ZGlvcmVzYW1wbGVyIFwKKwlsaWJhdWRpb3V0aWxzIFwKKwlsaWJkbCBcCisJbGliY3V0aWxzIFwKKwlsaWJ1dGlscyBcCisJbGlibG9nCisKK0xPQ0FMX01PRFVMRTo9IHRlc3QtbWl4ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjNDUzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vYmFzaAorCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworcHVzaGQgJEFORFJPSURfQlVJTERfVE9QL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyLworcHdkCittbQorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKK2FkYiBwdXNoICRPVVQvc3lzdGVtL2xpYi9saWJhdWRpb3Jlc2FtcGxlci5zbyAvc3lzdGVtL2xpYgorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vYmluL3Jlc2FtcGxlcl90ZXN0cyAvc3lzdGVtL2JpbgorCitzaCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCisKK3BvcGQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliMzllNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMTM0IEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCB1c2VzIHRlc3QtbWl4ZXIgdG8gZ2VuZXJhdGUgV0FWIGZpbGVzCisjIGZvciBldmFsdWF0aW9uIG9mIHRoZSBBdWRpb01peGVyIGNvbXBvbmVudC4KKyMKKyMgU2luZSBhbmQgY2hpcnAgc2lnbmFscyBhcmUgdXNlZCBmb3IgaW5wdXQgYmVjYXVzZSB0aGV5CisjIHNob3cgdXAgYXMgY2xlYXIgbGluZXMsIGVpdGhlciBob3Jpem9udGFsIG9yIGRpYWdvbmFsLAorIyBvbiBhIHNwZWN0cm9ncmFtLiBUaGlzIG1lYW5zIGVhc3kgdmVyaWZpY2F0aW9uIG9mIG11bHRpcGxlCisjIHRyYWNrIG1peGluZy4KKyMKKyMgQWZ0ZXIgZXhlY3V0aW9uLCBsb29rIGZvciBjcmVhdGVkIHN1YmRpcmVjdG9yaWVzIGxpa2UKKyMgbWl4ZXJfaV9pCisjIG1peGVyX2lfZgorIyBtaXhlcl9mX2YKKyMKKyMgUmVjb21tZW5kIHVzaW5nIGEgcHJvZ3JhbSBzdWNoIGFzIGF1ZGFjaXR5IHRvIGV2YWx1YXRlCisjIHRoZSBvdXRwdXQgV0FWIGZpbGVzLCBlLmcuCisjCisjIGNkIHRlc3RkaXIKKyMgYXVkYWNpdHkgKi53YXYKKyMKKyMgVXNpbmcgQXVkYWNpdHk6CisjCisjIFVuZGVyICJXYXZlZm9ybSIgdmlldyBtb2RlIHlvdSBjYW4gem9vbSBpbnRvIHRoZQorIyBzdGFydCBvZiB0aGUgV0FWIGZpbGUgdG8gdmVyaWZ5IHByb3BlciByYW1waW5nLgorIworIyBTZWxlY3QgIlNwZWN0cm9ncmFtIiB0byBzZWUgdmVyaWZ5IHRoZSBsaW5lcworIyAoc2luZSA9IGhvcml6b250YWwsIGNoaXJwID0gZGlhZ29uYWwpIHdoaWNoIHNob3VsZAorIyBiZSBjbGVhciAoZXhjZXB0IGZvciBhcm91bmQgdGhlIHN0YXJ0IGFzIHRoZSB2b2x1bWUKKyMgcmFtcGluZyBjYXVzZXMgc3BlY3RyYWwgZGlzdG9ydGlvbikuCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCitwdXNoZCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvCisKKyMgYnVpbGQKK3B3ZAorbW0KKworIyBzZW5kIHRvIGRldmljZQorZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CithZGIgcHVzaCAkT1VUL3N5c3RlbS9saWIvbGliYXVkaW9yZXNhbXBsZXIuc28gL3N5c3RlbS9saWIKK2FkYiBwdXNoICRPVVQvc3lzdGVtL2Jpbi90ZXN0LW1peGVyIC9zeXN0ZW0vYmluCisKKyMgY3JlYXRld2F2IGNyZWF0ZXMgYSBzZXJpZXMgb2YgV0FWIGZpbGVzIHRlc3RpbmcgdmFyaW91cworIyBtaXhlciBzZXR0aW5ncworIyAkMSA9IGZsYWdzCisjICQyID0gZGlyZWN0b3J5CitmdW5jdGlvbiBjcmVhdGV3YXYoKSB7CisjIGNyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdAorICAgIGlmIFsgISAtZCAkMiBdOyB0aGVuCisgICAgICAgIG1rZGlyICQyCisgICAgZmkKKworIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZworIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCisgICAgYWRiIHNoZWxsIHRlc3QtbWl4ZXIgJDEgLXMgNDgwMDAgXAorICAgICAgICAtbyAvc2RjYXJkL3RtNDgwMDBnci53YXYgXAorICAgICAgICBzaW5lOjIsNDAwMCw3NTIwIGNoaXJwOjIsOTIwMCBzaW5lOjEsMzAwMCwxODAwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG00ODAwMGdyLndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsZQorIyB0cmFja19fUmVzYW1wbGUgLyB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlCisjIHRyYWNrX19Ob1Jlc2FtcGxlIC8gdHJhY2tfXzE2Qml0c1N0ZXJlbyAvIHRyYWNrX18xNkJpdHNNb25vCisjIEF1eCBidWZmZXIKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtYyA1IC1zIDkzMDcgXAorICAgICAgICAtYSAvc2RjYXJkL2F1eDkzMDdncmEud2F2IC1vIC9zZGNhcmQvdG05MzA3Z3JhLndhdiBcCisgICAgICAgIHNpbmU6NCwxMDAwLDMwMDAgc2luZToxLDIwMDAsOTMwNyBjaGlycDozLDkzMDcKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtOTMwN2dyYS53YXYgJDIKKyAgICBhZGIgcHVsbCAvc2RjYXJkL2F1eDkzMDdncmEud2F2ICQyCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZworIyB0cmFja19fTm9SZXNhbXBsZSAvIHRyYWNrX18xNkJpdHNTdGVyZW8gLyB0cmFja19fMTZCaXRzTW9ubworICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDMyMDAwIFwKKyAgICAgICAgLW8gL3NkY2FyZC90bTMyMDAwZ25yLndhdiBcCisgICAgICAgIHNpbmU6MiwxMDAwLDMyMDAwIGNoaXJwOjIsMzIwMDAgIHNpbmU6MSwzMDAwLDMyMDAwCisgICAgYWRiIHB1bGwgL3NkY2FyZC90bTMyMDAwZ25yLndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcKKyMgdHJhY2tfX05vUmVzYW1wbGUgLyB0cmFja19fMTZCaXRzU3RlcmVvIC8gdHJhY2tfXzE2Qml0c01vbm8KKyMgQXV4IGJ1ZmZlcgorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDMyMDAwIFwKKyAgICAgICAgLWEgL3NkY2FyZC9hdXgzMjAwMGducmEud2F2IC1vIC9zZGNhcmQvdG0zMjAwMGducmEud2F2IFwKKyAgICAgICAgc2luZToyLDEwMDAsMzIwMDAgY2hpcnA6MiwzMjAwMCAgc2luZToxLDMwMDAsMzIwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtMzIwMDBnbnJhLndhdiAkMgorICAgIGFkYiBwdWxsIC9zZGNhcmQvYXV4MzIwMDBnbnJhLndhdiAkMgorCisjIFRlc3Q6CisjIHByb2Nlc3NfX05vUmVzYW1wbGVPbmVUcmFjayAvIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nCisjIERvd25taXhlcgorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDMyMDAwIFwKKyAgICAgICAgLW8gL3NkY2FyZC90bTMyMDAwbnJvdC53YXYgXAorICAgICAgICBzaW5lOjYsMTAwMCwzMjAwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG0zMjAwMG5yb3Qud2F2ICQyCisKKyMgVGVzdDoKKyMgcHJvY2Vzc19fTm9SZXNhbXBsZU9uZVRyYWNrIC8gT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcKKyMgQXV4IGJ1ZmZlcgorICAgIGFkYiBzaGVsbCB0ZXN0LW1peGVyICQxIC1zIDQ0MTAwIFwKKyAgICAgICAgLWEgL3NkY2FyZC9hdXg0NDEwMG5yb3RhLndhdiAtbyAvc2RjYXJkL3RtNDQxMDBucm90YS53YXYgXAorICAgICAgICBzaW5lOjIsMjAwMCw0NDEwMAorICAgIGFkYiBwdWxsIC9zZGNhcmQvdG00NDEwMG5yb3RhLndhdiAkMgorICAgIGFkYiBwdWxsIC9zZGNhcmQvYXV4NDQxMDBucm90YS53YXYgJDIKK30KKworIworIyBDYWxsIGNyZWF0ZXdhdiB0byBnZW5lcmF0ZSBXQVYgZmlsZXMgaW4gdmFyaW91cyBjb21iaW5hdGlvbnMKKyMKKyMgaV9pID0gaW50ZWdlciBpbnB1dCB0cmFjaywgaW50ZWdlciBtaXhlciBvdXRwdXQKKyMgZl9mID0gZmxvYXQgaW5wdXQgdHJhY2ssICAgZmxvYXQgbWl4ZXIgb3V0cHV0CisjIGlfZiA9IGludGVnZXIgaW5wdXQgdHJhY2ssIGZsb2F0X21peGVyIG91dHB1dAorIworIyBJZiB0aGUgbWl4ZXIgb3V0cHV0IGlzIGZsb2F0LCB0aGVuIHRoZSBvdXRwdXQgV0FWIGZpbGUgaXMgcGNtIGZsb2F0LgorIworIyBUT0RPOiBjcmVhdGUgYSAic25yIiBsaWtlICJkaWZmIiB0byBhdXRvbWF0aWNhbGx5CisjIGNvbXBhcmUgZmlsZXMgaW4gdGhlc2UgZGlyZWN0b3JpZXMgdG9nZXRoZXIuCisjCisKK2NyZWF0ZXdhdiAiIiAidGVzdHMvbWl4ZXJfaV9pIgorY3JlYXRld2F2ICItZiAtbSIgInRlc3RzL21peGVyX2ZfZiIKK2NyZWF0ZXdhdiAiLW0iICJ0ZXN0cy9taXhlcl9pX2YiCisKK3BvcGQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMTdiYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyX3Rlc3RzIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyLmgiCisjaW5jbHVkZSAidGVzdF91dGlscy5oIgorCit2b2lkIHJlc2FtcGxlKGludCBjaGFubmVscywgdm9pZCAqb3V0cHV0LAorICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVzLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZvdXRwdXRJbmNyLAorICAgICAgICBhbmRyb2lkOjpBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXIgKnJlc2FtcGxlcikKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMCwgaiA9IDA7IGkgPCBvdXRwdXRGcmFtZXM7ICkgeworICAgICAgICBzaXplX3QgdGhpc0ZyYW1lcyA9IG91dHB1dEluY3JbaisrXTsKKyAgICAgICAgaWYgKGogPj0gb3V0cHV0SW5jci5zaXplKCkpIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzRnJhbWVzID09IDAgfHwgdGhpc0ZyYW1lcyA+IG91dHB1dEZyYW1lcyAtIGkpIHsKKyAgICAgICAgICAgIHRoaXNGcmFtZXMgPSBvdXRwdXRGcmFtZXMgLSBpOworICAgICAgICB9CisgICAgICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKSBvdXRwdXQgKyBjaGFubmVscyppLCB0aGlzRnJhbWVzLCBwcm92aWRlcik7CisgICAgICAgIGkgKz0gdGhpc0ZyYW1lczsKKyAgICB9Cit9CisKK3ZvaWQgYnVmZmVyY21wKGNvbnN0IHZvaWQgKnJlZmVyZW5jZSwgY29uc3Qgdm9pZCAqdGVzdCwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IG91dHB1dEZyYW1lcykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dEZyYW1lczsgKytpKSB7CisgICAgICAgIGludCBjaGVjayA9IG1lbWNtcCgoY29uc3QgY2hhciopcmVmZXJlbmNlICsgaSAqIG91dHB1dEZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopdGVzdCArIGkgKiBvdXRwdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChjaGVjaykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWx1cmUgYXQgZnJhbWUgJXp1IiwgaSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoY2hlY2ssIDApOyAvKiBmYWlscyAqLworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHRlc3RCdWZmZXJJbmNyZW1lbnQoc2l6ZV90IGNoYW5uZWxzLCBib29sIHVzZUZsb2F0LAorICAgICAgICB1bnNpZ25lZCBpbnB1dEZyZXEsIHVuc2lnbmVkIG91dHB1dEZyZXEsCisgICAgICAgIGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkpCit7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gdXNlRmxvYXQgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgLy8gY3JlYXRlIHRoZSBwcm92aWRlcgorICAgIHN0ZDo6dmVjdG9yPGludD4gaW5wdXRJbmNyOworICAgIFNpZ25hbFByb3ZpZGVyIHByb3ZpZGVyOworICAgIGlmICh1c2VGbG9hdCkgeworICAgICAgICBwcm92aWRlci5zZXRDaGlycDxmbG9hdD4oY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgMC4sIG91dHB1dEZyZXEvMi4sIG91dHB1dEZyZXEsIG91dHB1dEZyZXEvMjAwMC4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3ZpZGVyLnNldENoaXJwPGludDE2X3Q+KGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIDAuLCBvdXRwdXRGcmVxLzIuLCBvdXRwdXRGcmVxLCBvdXRwdXRGcmVxLzIwMDAuKTsKKyAgICB9CisgICAgcHJvdmlkZXIuc2V0SW5jcihpbnB1dEluY3IpOworCisgICAgLy8gY2FsY3VsYXRlIHRoZSBvdXRwdXQgc2l6ZQorICAgIHNpemVfdCBvdXRwdXRGcmFtZXMgPSAoKGludDY0X3QpIHByb3ZpZGVyLmdldE51bUZyYW1lcygpICogb3V0cHV0RnJlcSkgLyBpbnB1dEZyZXE7CisgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSA9IGNoYW5uZWxzICogKHVzZUZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQzMl90KSk7CisgICAgc2l6ZV90IG91dHB1dFNpemUgPSBvdXRwdXRGcmFtZVNpemUgKiBvdXRwdXRGcmFtZXM7CisgICAgb3V0cHV0U2l6ZSAmPSB+NzsKKworICAgIC8vIGNyZWF0ZSB0aGUgcmVzYW1wbGVyCisgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXIqIHJlc2FtcGxlcjsKKworICAgIHJlc2FtcGxlciA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywgb3V0cHV0RnJlcSwgcXVhbGl0eSk7CisgICAgcmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKGlucHV0RnJlcSk7CisgICAgcmVzYW1wbGVyLT5zZXRWb2x1bWUoYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQsCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CisKKyAgICAvLyBzZXQgdXAgdGhlIHJlZmVyZW5jZSBydW4KKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHJlZkluY3I7CisgICAgcmVmSW5jci5wdXNoX2JhY2sob3V0cHV0RnJhbWVzKTsKKyAgICB2b2lkKiByZWZlcmVuY2UgPSBtYWxsb2Mob3V0cHV0U2l6ZSk7CisgICAgcmVzYW1wbGUoY2hhbm5lbHMsIHJlZmVyZW5jZSwgb3V0cHV0RnJhbWVzLCByZWZJbmNyLCAmcHJvdmlkZXIsIHJlc2FtcGxlcik7CisKKyAgICBwcm92aWRlci5yZXNldCgpOworCisjaWYgMAorICAgIC8qIHRoaXMgdGVzdCB3aWxsIGZhaWwgLSBBUEkgaW50ZXJmYWNlIGlzc3VlOiByZXNldCgpIGRvZXMgbm90IGNsZWFyIGludGVybmFsIGJ1ZmZlcnMgKi8KKyAgICByZXNhbXBsZXItPnJlc2V0KCk7CisjZWxzZQorICAgIGRlbGV0ZSByZXNhbXBsZXI7CisgICAgcmVzYW1wbGVyID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGNoYW5uZWxzLCBvdXRwdXRGcmVxLCBxdWFsaXR5KTsKKyAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKKyAgICByZXNhbXBsZXItPnNldFZvbHVtZShhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FUKTsKKyNlbmRpZgorCisgICAgLy8gc2V0IHVwIHRoZSB0ZXN0IHJ1bgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gb3V0SW5jcjsKKyAgICBvdXRJbmNyLnB1c2hfYmFjaygxKTsKKyAgICBvdXRJbmNyLnB1c2hfYmFjaygyKTsKKyAgICBvdXRJbmNyLnB1c2hfYmFjaygzKTsKKyAgICB2b2lkKiB0ZXN0ID0gbWFsbG9jKG91dHB1dFNpemUpOworICAgIGlucHV0SW5jci5wdXNoX2JhY2soMSk7CisgICAgaW5wdXRJbmNyLnB1c2hfYmFjaygzKTsKKyAgICBwcm92aWRlci5zZXRJbmNyKGlucHV0SW5jcik7CisgICAgcmVzYW1wbGUoY2hhbm5lbHMsIHRlc3QsIG91dHB1dEZyYW1lcywgb3V0SW5jciwgJnByb3ZpZGVyLCByZXNhbXBsZXIpOworCisgICAgLy8gY2hlY2sKKyAgICBidWZmZXJjbXAocmVmZXJlbmNlLCB0ZXN0LCBvdXRwdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lcyk7CisKKyAgICBmcmVlKHJlZmVyZW5jZSk7CisgICAgZnJlZSh0ZXN0KTsKKyAgICBkZWxldGUgcmVzYW1wbGVyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBkb3VibGUgc3FyKFQgdikKK3sKKyAgICBkb3VibGUgZHYgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHYpOworICAgIHJldHVybiBkdiAqIGR2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2RvdWJsZSBzaWduYWxFbmVyZ3koVCAqc3RhcnQsIFQgKmVuZCwgdW5zaWduZWQgc3RyaWRlKQoreworICAgIGRvdWJsZSBhY2N1bSA9IDA7CisKKyAgICBmb3IgKFQgKnAgPSBzdGFydDsgcCA8IGVuZDsgcCArPSBzdHJpZGUpIHsKKyAgICAgICAgYWNjdW0gKz0gc3FyKCpwKTsKKyAgICB9CisgICAgdW5zaWduZWQgY291bnQgPSAoZW5kIC0gc3RhcnQgKyBzdHJpZGUgLSAxKSAvIHN0cmlkZTsKKyAgICByZXR1cm4gYWNjdW0gLyBjb3VudDsKK30KKworLy8gVEkgPSByZXNhbXBsZXIgaW5wdXQgdHlwZSwgaW50MTZfdCBvciBmbG9hdAorLy8gVE8gPSByZXNhbXBsZXIgb3V0cHV0IHR5cGUsIGludDMyX3Qgb3IgZmxvYXQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+Cit2b2lkIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uKHNpemVfdCBjaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgaW5wdXRGcmVxLCB1bnNpZ25lZCBvdXRwdXRGcmVxLAorICAgICAgICB1bnNpZ25lZCBwYXNzYmFuZCwgdW5zaWduZWQgc3RvcGJhbmQsCisgICAgICAgIGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkpCit7CisgICAgLy8gY3JlYXRlIHRoZSBwcm92aWRlcgorICAgIHN0ZDo6dmVjdG9yPGludD4gaW5wdXRJbmNyOworICAgIFNpZ25hbFByb3ZpZGVyIHByb3ZpZGVyOworICAgIHByb3ZpZGVyLnNldENoaXJwPFRJPihjaGFubmVscywKKyAgICAgICAgICAgIDAuLCBpbnB1dEZyZXEvMi4sIGlucHV0RnJlcSwgaW5wdXRGcmVxLzIwMDAuKTsKKyAgICBwcm92aWRlci5zZXRJbmNyKGlucHV0SW5jcik7CisKKyAgICAvLyBjYWxjdWxhdGUgdGhlIG91dHB1dCBzaXplCisgICAgc2l6ZV90IG91dHB1dEZyYW1lcyA9ICgoaW50NjRfdCkgcHJvdmlkZXIuZ2V0TnVtRnJhbWVzKCkgKiBvdXRwdXRGcmVxKSAvIGlucHV0RnJlcTsKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplID0gY2hhbm5lbHMgKiBzaXplb2YoVE8pOworICAgIHNpemVfdCBvdXRwdXRTaXplID0gb3V0cHV0RnJhbWVTaXplICogb3V0cHV0RnJhbWVzOworICAgIG91dHB1dFNpemUgJj0gfjc7CisKKyAgICAvLyBjcmVhdGUgdGhlIHJlc2FtcGxlcgorICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyKiByZXNhbXBsZXI7CisKKyAgICByZXNhbXBsZXIgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAorICAgICAgICAgICAgaXNfc2FtZTxUSSwgaW50MTZfdD46OnZhbHVlID8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgY2hhbm5lbHMsIG91dHB1dEZyZXEsIHF1YWxpdHkpOworICAgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOworICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworCisgICAgLy8gc2V0IHVwIHRoZSByZWZlcmVuY2UgcnVuCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiByZWZJbmNyOworICAgIHJlZkluY3IucHVzaF9iYWNrKG91dHB1dEZyYW1lcyk7CisgICAgdm9pZCogcmVmZXJlbmNlID0gbWFsbG9jKG91dHB1dFNpemUpOworICAgIHJlc2FtcGxlKGNoYW5uZWxzLCByZWZlcmVuY2UsIG91dHB1dEZyYW1lcywgcmVmSW5jciwgJnByb3ZpZGVyLCByZXNhbXBsZXIpOworCisgICAgVE8gKm91dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VE8gKj4ocmVmZXJlbmNlKTsKKworICAgIC8vIGNoZWNrIHNpZ25hbCBlbmVyZ3kgaW4gcGFzc2JhbmQKKyAgICBjb25zdCB1bnNpZ25lZCBwYXNzYmFuZEZyYW1lID0gcGFzc2JhbmQgKiBvdXRwdXRGcmVxIC8gMTAwMC47CisgICAgY29uc3QgdW5zaWduZWQgc3RvcGJhbmRGcmFtZSA9IHN0b3BiYW5kICogb3V0cHV0RnJlcSAvIDEwMDAuOworCisgICAgLy8gY2hlY2sgZWFjaCBjaGFubmVsIHNlcGFyYXRlbHkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgZG91YmxlIHBhc3NiYW5kRW5lcmd5ID0gc2lnbmFsRW5lcmd5KG91dCwgb3V0ICsgcGFzc2JhbmRGcmFtZSAqIGNoYW5uZWxzLCBjaGFubmVscyk7CisgICAgICAgIGRvdWJsZSBzdG9wYmFuZEVuZXJneSA9IHNpZ25hbEVuZXJneShvdXQgKyBzdG9wYmFuZEZyYW1lICogY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgb3V0ICsgb3V0cHV0RnJhbWVzICogY2hhbm5lbHMsIGNoYW5uZWxzKTsKKyAgICAgICAgZG91YmxlIGRiQXR0ZW4gPSAtMTAuICogbG9nMTAoc3RvcGJhbmRFbmVyZ3kgLyBwYXNzYmFuZEVuZXJneSk7CisgICAgICAgIEFTU0VSVF9HVChkYkF0dGVuLCA2MC4pOworCisjaWYgMAorICAgICAgICAvLyBpbnRlcm5hbCB2ZXJpZmljYXRpb24KKyAgICAgICAgcHJpbnRmKCJpZjolZCAgb2Y6JWQgIHBiZjolZCAgc2JmOiVkICBzYmU6ICVmICBwYmU6ICVmICBkYjogJS4yZlxuIiwKKyAgICAgICAgICAgICAgICBwcm92aWRlci5nZXROdW1GcmFtZXMoKSwgb3V0cHV0RnJhbWVzLAorICAgICAgICAgICAgICAgIHBhc3NiYW5kRnJhbWUsIHN0b3BiYW5kRnJhbWUsIHN0b3BiYW5kRW5lcmd5LCBwYXNzYmFuZEVuZXJneSwgZGJBdHRlbik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8IG91dFtpK3Bhc3NiYW5kRnJhbWUqY2hhbm5lbHNdIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBvdXRbaStzdG9wYmFuZEZyYW1lKmNoYW5uZWxzXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIGZyZWUocmVmZXJlbmNlKTsKKyAgICBkZWxldGUgcmVzYW1wbGVyOworfQorCisvKiBCdWZmZXIgaW5jcmVtZW50IHRlc3QKKyAqCisgKiBXZSBjb21wYXJlIGEgcmVmZXJlbmNlIG91dHB1dCwgd2hlcmUgd2UgY29uc3VtZSBhbmQgcHJvY2VzcyB0aGUgZW50aXJlCisgKiBidWZmZXIgYXQgYSB0aW1lLCBhbmQgYSB0ZXN0IG91dHB1dCwgd2hlcmUgd2UgcHJvdmlkZSBzbWFsbCBjaHVua3Mgb2YgaW5wdXQKKyAqIGRhdGEgYW5kIHByb2Nlc3Mgc21hbGwgY2h1bmtzIG9mIG91dHB1dCAod2hpY2ggbWF5IG5vdCBiZSBlcXVpdmFsZW50IGluIHNpemUpLgorICoKKyAqIFR3byBzdWJ0ZXN0cyAtIGZpeGVkIHBoYXNlICgzOjIgZG93bikgYW5kIGludGVycG9sYXRlZCBwaGFzZSAoMTQ3OjMyMCB1cCkKKyAqLworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBidWZmZXJpbmNyZW1lbnRfZml4ZWRwaGFzZSkgeworICAgIC8vIGFsbCBvZiB0aGVzZSB3b3JrCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDIsIGZhbHNlLCA0ODAwMCwgMzIwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBidWZmZXJpbmNyZW1lbnRfaW50ZXJwb2xhdGVkcGhhc2UpIHsKKyAgICAvLyBhbGwgb2YgdGhlc2Ugd29yayBleGNlcHQgbG93IHF1YWxpdHkKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworLy8gICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0QnVmZmVySW5jcmVtZW50KDIsIGZhbHNlLCAyMjA1MCwgNDgwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBidWZmZXJpbmNyZW1lbnRfZml4ZWRwaGFzZV9tdWx0aSkgeworICAgIC8vIG9ubHkgZHluYW1pYyBxdWFsaXR5CisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RCdWZmZXJJbmNyZW1lbnQoNCwgZmFsc2UsIDQ4MDAwLCAzMjAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorfQorCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGJ1ZmZlcmluY3JlbWVudF9pbnRlcnBvbGF0ZWRwaGFzZV9tdWx0aV9mbG9hdCkgeworICAgIC8vIG9ubHkgZHluYW1pYyBxdWFsaXR5CisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RCdWZmZXJJbmNyZW1lbnQoOCwgdHJ1ZSwgMjIwNTAsIDQ4MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKKy8qIFNpbXBsZSBhbGlhc2luZyB0ZXN0CisgKgorICogVGhpcyBjaGVja3Mgc3RvcGJhbmQgcmVzcG9uc2Ugb2YgdGhlIGNoaXJwIHNpZ25hbCB0byBtYWtlIHN1cmUgZnJlcXVlbmNpZXMKKyAqIGFyZSBwcm9wZXJseSBzdXBwcmVzc2VkLiAgSXQgdXNlcyBkb3duc2FtcGxpbmcgYmVjYXVzZSB0aGUgc3RvcGJhbmQgY2FuIGJlCisgKiBjbGVhcmx5IGlzb2xhdGVkIGJ5IGlucHV0IGZyZXF1ZW5jaWVzIGV4Y2VlZGluZyB0aGUgb3V0cHV0IHNhbXBsZSByYXRlIChueXF1aXN0KS4KKyAqLworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBzdG9wYmFuZHJlc3BvbnNlX2ludGVnZXIpIHsKKyAgICAvLyBub3QgYWxsIG9mIHRoZXNlIG1heSB3b3JrIChvbGQgcmVzYW1wbGVycyBmYWlsIG9uIGRvd25zYW1wbGluZykKKyAgICBzdGF0aWMgY29uc3QgZW51bSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkga1F1YWxpdHlBcnJheVtdID0geworICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpNRURfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkhJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTUVEX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gMTJrSHogYW5kIDIwa0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxpbnQxNl90LCBpbnQzMl90PigKKyAgICAgICAgICAgICAgICAyLCA0ODAwMCwgMzIwMDAsIDEyMDAwLCAyMDAwMCwga1F1YWxpdHlBcnJheVtpXSk7CisgICAgfQorCisgICAgLy8gaW4gdGhpcyB0ZXN0IHdlIGFzc3VtZSBhIG1heGltdW0gdHJhbnNpdGlvbiBiYW5kIGJldHdlZW4gN2tIeiBhbmQgMTVrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIC8vICh0aGUgd2VpcmQgcmF0aW8gdHJpZ2dlcnMgaW50ZXJwb2xhdGl2ZSByZXNhbXBsaW5nKQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGludDE2X3QsIGludDMyX3Q+KAorICAgICAgICAgICAgICAgIDIsIDQ4MDAwLCAyMjEwMSwgNzAwMCwgMTUwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBzdG9wYmFuZHJlc3BvbnNlX2ludGVnZXJfbXVsdGljaGFubmVsKSB7CisgICAgLy8gbm90IGFsbCBvZiB0aGVzZSBtYXkgd29yayAob2xkIHJlc2FtcGxlcnMgZmFpbCBvbiBkb3duc2FtcGxpbmcpCisgICAgc3RhdGljIGNvbnN0IGVudW0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IGtRdWFsaXR5QXJyYXlbXSA9IHsKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkxPV19RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6TUVEX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpWRVJZX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDEya0h6IGFuZCAyMGtIei4KKyAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IDYwZEIgcmVsYXRpdmUgYXR0ZW51YXRpb24gYmV0d2VlbiBzdG9wYmFuZCBhbmQgcGFzc2JhbmQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtRdWFsaXR5QXJyYXkpOyArK2kpIHsKKyAgICAgICAgdGVzdFN0b3BiYW5kRG93bmNvbnZlcnNpb248aW50MTZfdCwgaW50MzJfdD4oCisgICAgICAgICAgICAgICAgOCwgNDgwMDAsIDMyMDAwLCAxMjAwMCwgMjAwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDdrSHogYW5kIDE1a0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICAvLyAodGhlIHdlaXJkIHJhdGlvIHRyaWdnZXJzIGludGVycG9sYXRpdmUgcmVzYW1wbGluZykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxpbnQxNl90LCBpbnQzMl90PigKKyAgICAgICAgICAgICAgICA4LCA0ODAwMCwgMjIxMDEsIDcwMDAsIDE1MDAwLCBrUXVhbGl0eUFycmF5W2ldKTsKKyAgICB9Cit9CisKK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgc3RvcGJhbmRyZXNwb25zZV9mbG9hdCkgeworICAgIC8vIG5vdCBhbGwgb2YgdGhlc2UgbWF5IHdvcmsgKG9sZCByZXNhbXBsZXJzIGZhaWwgb24gZG93bnNhbXBsaW5nKQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiAxMmtIeiBhbmQgMjBrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGZsb2F0LCBmbG9hdD4oCisgICAgICAgICAgICAgICAgMiwgNDgwMDAsIDMyMDAwLCAxMjAwMCwgMjAwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDdrSHogYW5kIDE1a0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICAvLyAodGhlIHdlaXJkIHJhdGlvIHRyaWdnZXJzIGludGVycG9sYXRpdmUgcmVzYW1wbGluZykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDIsIDQ4MDAwLCAyMjEwMSwgNzAwMCwgMTUwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKworVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBzdG9wYmFuZHJlc3BvbnNlX2Zsb2F0X211bHRpY2hhbm5lbCkgeworICAgIC8vIG5vdCBhbGwgb2YgdGhlc2UgbWF5IHdvcmsgKG9sZCByZXNhbXBsZXJzIGZhaWwgb24gZG93bnNhbXBsaW5nKQorICAgIHN0YXRpYyBjb25zdCBlbnVtIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBrUXVhbGl0eUFycmF5W10gPSB7CisgICAgICAgICAgICAvL2FuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpMT1dfUVVBTElUWSwKKyAgICAgICAgICAgIC8vYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6SElHSF9RVUFMSVRZLAorICAgICAgICAgICAgLy9hbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6VkVSWV9ISUdIX1FVQUxJVFksCisgICAgICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZLAorICAgIH07CisKKyAgICAvLyBpbiB0aGlzIHRlc3Qgd2UgYXNzdW1lIGEgbWF4aW11bSB0cmFuc2l0aW9uIGJhbmQgYmV0d2VlbiAxMmtIeiBhbmQgMjBrSHouCisgICAgLy8gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCA2MGRCIHJlbGF0aXZlIGF0dGVudWF0aW9uIGJldHdlZW4gc3RvcGJhbmQgYW5kIHBhc3NiYW5kLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShrUXVhbGl0eUFycmF5KTsgKytpKSB7CisgICAgICAgIHRlc3RTdG9wYmFuZERvd25jb252ZXJzaW9uPGZsb2F0LCBmbG9hdD4oCisgICAgICAgICAgICAgICAgOCwgNDgwMDAsIDMyMDAwLCAxMjAwMCwgMjAwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KKworICAgIC8vIGluIHRoaXMgdGVzdCB3ZSBhc3N1bWUgYSBtYXhpbXVtIHRyYW5zaXRpb24gYmFuZCBiZXR3ZWVuIDdrSHogYW5kIDE1a0h6LgorICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QgNjBkQiByZWxhdGl2ZSBhdHRlbnVhdGlvbiBiZXR3ZWVuIHN0b3BiYW5kIGFuZCBwYXNzYmFuZC4KKyAgICAvLyAodGhlIHdlaXJkIHJhdGlvIHRyaWdnZXJzIGludGVycG9sYXRpdmUgcmVzYW1wbGluZykKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa1F1YWxpdHlBcnJheSk7ICsraSkgeworICAgICAgICB0ZXN0U3RvcGJhbmREb3duY29udmVyc2lvbjxmbG9hdCwgZmxvYXQ+KAorICAgICAgICAgICAgICAgIDgsIDQ4MDAwLCAyMjEwMSwgNzAwMCwgMTUwMDAsIGtRdWFsaXR5QXJyYXlbaV0pOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmZhZTZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCithZGIgc2hlbGwgL3N5c3RlbS9iaW4vcmVzYW1wbGVyX3Rlc3RzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ZmFkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlICJBdWRpb01peGVyLmgiCisjaW5jbHVkZSAidGVzdF91dGlscy5oIgorCisvKiBUZXN0aW5nIGlzIHR5cGljYWxseSB0aHJvdWdoIGNyZWF0aW9uIG9mIGFuIG91dHB1dCBXQVYgZmlsZSBmcm9tIHNldmVyYWwKKyAqIHNvdXJjZSBpbnB1dHMsIHRvIGJlIGxhdGVyIGFuYWx5emVkIGJ5IGFuIGF1ZGlvIHByb2dyYW0gc3VjaCBhcyBBdWRhY2l0eS4KKyAqCisgKiBTaW5lIG9yIGNoaXJwIGZ1bmN0aW9ucyBhcmUgdHlwaWNhbGx5IG1vcmUgdXNlZnVsIGFzIGlucHV0IHRvIHRoZSBtaXhlcgorICogYXMgdGhleSBzaG93IHVwIGFzIHN0cmFpZ2h0IGxpbmVzIG9uIGEgc3BlY3Ryb2dyYW0gaWYgc3VjY2Vzc2Z1bGx5IG1peGVkLgorICoKKyAqIEEgc2FtcGxlIHNoZWxsIHNjcmlwdCBpcyBwcm92aWRlZDogbWl4ZXJfdG9fd2F2ZV90ZXN0cy5zaAorICovCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1mXSBbLW1dIFstYyBjaGFubmVsc10iCisgICAgICAgICAgICAgICAgICAgICIgWy1zIHNhbXBsZS1yYXRlXSBbLW8gPG91dHB1dC1maWxlPl0gWy1hIDxhdXgtYnVmZmVyLWZpbGU+XSBbLVAgY3N2XSIKKyAgICAgICAgICAgICAgICAgICAgIiAoPGlucHV0LWZpbGU+IHwgPGNvbW1hbmQ+KStcbiIsIG5hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1mICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0cmFja1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLW0gICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IG1peGVyIG91dHB1dFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWMgICAgbnVtYmVyIG9mIG1peGVyIG91dHB1dCBjaGFubmVsc1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLXMgICAgbWl4ZXIgc2FtcGxlLXJhdGVcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1vICAgIDxvdXRwdXQtZmlsZT4gV0FWIGZpbGUsIHBjbTE2IChvciBmbG9hdCBpZiAtbSBzcGVjaWZpZWQpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYSAgICA8YXV4LWJ1ZmZlci1maWxlPlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLVAgICAgIyBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICA8aW5wdXQtZmlsZT4gaXMgYSBXQVYgZmlsZVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGNvbW1hbmQ+IGNhbiBiZSAnc2luZTo8Y2hhbm5lbHM+LDxmcmVxdWVuY3k+LDxzYW1wbGVyYXRlPidcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgJ2NoaXJwOjxjaGFubmVscz4sPHNhbXBsZXJhdGU+J1xuIik7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVGaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxzLCBzaXplX3QgZnJhbWVzLCBib29sIGlzQnVmZmVyRmxvYXQpIHsKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsgLy8gb2sgdG8gcGFzcyBpbiBOVUxMIGZpbGVuYW1lCisgICAgfQorICAgIC8vIHdyaXRlIG91dHB1dCB0byBmaWxlLgorICAgIFNGX0lORk8gaW5mbzsKKyAgICBpbmZvLmZyYW1lcyA9IDA7CisgICAgaW5mby5zYW1wbGVyYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBpbmZvLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaW5mby5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgKGlzQnVmZmVyRmxvYXQgPyBTRl9GT1JNQVRfRkxPQVQgOiBTRl9GT1JNQVRfUENNXzE2KTsKKyAgICBwcmludGYoInNhdmluZyBmaWxlOiVzICBjaGFubmVsczoldSAgc2FtcGxlcmF0ZToldSAgZnJhbWVzOiV6dVxuIiwKKyAgICAgICAgICAgIGZpbGVuYW1lLCBpbmZvLmNoYW5uZWxzLCBpbmZvLnNhbXBsZXJhdGUsIGZyYW1lcyk7CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKGZpbGVuYW1lLCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoaXNCdWZmZXJGbG9hdCkgeworICAgICAgICAodm9pZCkgc2Zfd3JpdGVmX2Zsb2F0KHNmLCAoZmxvYXQqKWJ1ZmZlciwgZnJhbWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAodm9pZCkgc2Zfd3JpdGVmX3Nob3J0KHNmLCAoc2hvcnQqKWJ1ZmZlciwgZnJhbWVzKTsKKyAgICB9CisgICAgc2ZfY2xvc2Uoc2YpOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgICAgYm9vbCB1c2VJbnB1dEZsb2F0ID0gZmFsc2U7CisgICAgYm9vbCB1c2VNaXhlckZsb2F0ID0gZmFsc2U7CisgICAgYm9vbCB1c2VSYW1wID0gdHJ1ZTsKKyAgICB1aW50MzJfdCBvdXRwdXRTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgdWludDMyX3Qgb3V0cHV0Q2hhbm5lbHMgPSAyOyAvLyBzdGVyZW8gZm9yIG5vdworICAgIHN0ZDo6dmVjdG9yPGludD4gUHZhbHVlczsKKyAgICBjb25zdCBjaGFyKiBvdXRwdXRGaWxlbmFtZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciogYXV4RmlsZW5hbWUgPSBOVUxMOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IE5hbWVzOworICAgIHN0ZDo6dmVjdG9yPFNpZ25hbFByb3ZpZGVyPiBQcm92aWRlcnM7CisKKyAgICBmb3IgKGludCBjaDsgKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmbWM6czpvOmE6UDoiKSkgIT0gLTE7KSB7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICB1c2VJbnB1dEZsb2F0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIHVzZU1peGVyRmxvYXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgb3V0cHV0Q2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBvdXRwdXRTYW1wbGVSYXRlID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgICAgb3V0cHV0RmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICBhdXhGaWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgIGlmIChwYXJzZUNTVihvcHRhcmcsIFB2YWx1ZXMpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb3JyZWN0IHN5bnRheCBmb3IgLVAgb3B0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdXNhZ2UocHJvZ25hbWUpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhcmdjIC09IG9wdGluZDsKKyAgICBhcmd2ICs9IG9wdGluZDsKKworICAgIGlmIChhcmdjID09IDApIHsKKyAgICAgICAgdXNhZ2UocHJvZ25hbWUpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoKHVuc2lnbmVkKWFyZ2MgPiBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRvbyBtYW55IHRyYWNrczogJWQgPiAldSIsIGFyZ2MsIEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzaXplX3Qgb3V0cHV0RnJhbWVzID0gMDsKKworICAgIC8vIGNyZWF0ZSBwcm92aWRlcnMgZm9yIGVhY2ggdHJhY2sKKyAgICBQcm92aWRlcnMucmVzaXplKGFyZ2MpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoaXJwW10gPSAiY2hpcnA6IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2luZVtdID0gInNpbmU6IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU2Vjb25kcyA9IDE7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sIGNoaXJwLCBzdHJsZW4oY2hpcnApKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworCisgICAgICAgICAgICBwYXJzZUNTVihhcmd2W2ldICsgc3RybGVuKGNoaXJwKSwgdik7CisgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgY2hpcnAoJWQgJWQpXG4iLCB2WzBdLCB2WzFdKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0Q2hpcnA8ZmxvYXQ+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRDaGlycDxpbnQxNl90Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsZm9ybWVkIGlucHV0ICclcydcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sIHNpbmUsIHN0cmxlbihzaW5lKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdjsKKworICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihzaW5lKSwgdik7CisgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMykgeworICAgICAgICAgICAgICAgIHByaW50ZigiY3JlYXRpbmcgc2luZSglZCAlZCAlZClcbiIsIHZbMF0sIHZbMV0sIHZbMl0pOworICAgICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRTaW5lPGZsb2F0Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldFNpbmU8aW50MTZfdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0SW5jcihQdmFsdWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxmb3JtZWQgaW5wdXQgJyVzJ1xuIiwgYXJndltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImNyZWF0aW5nIGZpbGVuYW1lKCVzKVxuIiwgYXJndltpXSk7CisgICAgICAgICAgICBpZiAodXNlSW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRGaWxlPGZsb2F0Pihhcmd2W2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEZpbGU8c2hvcnQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcworICAgICAgICBzaXplX3QgbmZyYW1lcyA9IChpbnQ2NF90KSBQcm92aWRlcnNbaV0uZ2V0TnVtRnJhbWVzKCkgKiBvdXRwdXRTYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgLyBQcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICBpZiAoaSA9PSAwIHx8IG91dHB1dEZyYW1lcyA+IG5mcmFtZXMpIHsgLy8gY2hvb3NlIG1pbmltdW0gZm9yIG91dHB1dEZyYW1lcworICAgICAgICAgICAgb3V0cHV0RnJhbWVzID0gbmZyYW1lczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNyZWF0ZSB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICBjb25zdCBzaXplX3Qgb3V0cHV0RnJhbWVTaXplID0gb3V0cHV0Q2hhbm5lbHMKKyAgICAgICAgICAgICogKHVzZU1peGVyRmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpKTsKKyAgICBjb25zdCBzaXplX3Qgb3V0cHV0U2l6ZSA9IG91dHB1dEZyYW1lcyAqIG91dHB1dEZyYW1lU2l6ZTsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzayA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQob3V0cHV0Q2hhbm5lbHMpOworICAgIHZvaWQgKm91dHB1dEFkZHIgPSBOVUxMOworICAgICh2b2lkKSBwb3NpeF9tZW1hbGlnbigmb3V0cHV0QWRkciwgMzIsIG91dHB1dFNpemUpOworICAgIG1lbXNldChvdXRwdXRBZGRyLCAwLCBvdXRwdXRTaXplKTsKKworICAgIC8vIGNyZWF0ZSB0aGUgYXV4IGJ1ZmZlciwgaWYgbmVlZGVkLgorICAgIGNvbnN0IHNpemVfdCBhdXhGcmFtZVNpemUgPSBzaXplb2YoaW50MzJfdCk7IC8vIFE0LjI3IGFsd2F5cworICAgIGNvbnN0IHNpemVfdCBhdXhTaXplID0gb3V0cHV0RnJhbWVzICogYXV4RnJhbWVTaXplOworICAgIHZvaWQgKmF1eEFkZHIgPSBOVUxMOworICAgIGlmIChhdXhGaWxlbmFtZSkgeworICAgICAgICAodm9pZCkgcG9zaXhfbWVtYWxpZ24oJmF1eEFkZHIsIDMyLCBhdXhTaXplKTsKKyAgICAgICAgbWVtc2V0KGF1eEFkZHIsIDAsIGF1eFNpemUpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSB0aGUgbWl4ZXIuCisgICAgY29uc3Qgc2l6ZV90IG1peGVyRnJhbWVDb3VudCA9IDMyMDsgLy8gdHlwaWNhbCBudW1iZXJzIG1heSByYW5nZSBmcm9tIDI0MCBvciA5NjAKKyAgICBBdWRpb01peGVyICptaXhlciA9IG5ldyBBdWRpb01peGVyKG1peGVyRnJhbWVDb3VudCwgb3V0cHV0U2FtcGxlUmF0ZSk7CisgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgPSB1c2VJbnB1dEZsb2F0CisgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBhdWRpb19mb3JtYXRfdCBtaXhlckZvcm1hdCA9IHVzZU1peGVyRmxvYXQKKyAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUIC8gUHJvdmlkZXJzLnNpemUoKTsgLy8gbm9ybWFsaXplIHZvbHVtZSBieSAjIHRyYWNrcworICAgIHN0YXRpYyBmbG9hdCBmMDsgLy8gemVybworCisgICAgLy8gc2V0IHVwIHRoZSB0cmFja3MuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBQcm92aWRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy9wcmludGYoInRyYWNrICVkIG91dCBvZiAlZFxuIiwgaSwgUHJvdmlkZXJzLnNpemUoKSk7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KFByb3ZpZGVyc1tpXS5nZXROdW1DaGFubmVscygpKTsKKyAgICAgICAgaW50MzJfdCBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgTmFtZXMucHVzaF9iYWNrKG5hbWUpOworICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgJlByb3ZpZGVyc1tpXSk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAorICAgICAgICAgICAgICAgICh2b2lkICopb3V0cHV0QWRkcik7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1peGVyRm9ybWF0KTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpaW5wdXRGb3JtYXQpOworICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClvdXRwdXRDaGFubmVsTWFzayk7CisgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWNoYW5uZWxNYXNrKTsKKyAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClQcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgaWYgKHVzZVJhbXApIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZjApOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmMCk7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmZik7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXV4RmlsZW5hbWUpIHsKKyAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGF1eEFkZHIpOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmZjApOworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZmKTsKKyAgICAgICAgfQorICAgICAgICBtaXhlci0+ZW5hYmxlKG5hbWUpOworICAgIH0KKworICAgIC8vIHB1bXAgdGhlIG1peGVyIHRvIHByb2Nlc3MgZGF0YS4KKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0RnJhbWVzIC0gbWl4ZXJGcmFtZUNvdW50OyBpICs9IG1peGVyRnJhbWVDb3VudCkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IE5hbWVzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG91dHB1dEFkZHIgKyBpICogb3V0cHV0RnJhbWVTaXplKTsKKyAgICAgICAgICAgIGlmIChhdXhGaWxlbmFtZSkgeworICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoTmFtZXNbal0sIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpBVVhfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgYXV4QWRkciArIGkgKiBhdXhGcmFtZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1peGVyLT5wcm9jZXNzKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTKTsKKyAgICB9CisgICAgb3V0cHV0RnJhbWVzID0gaTsgLy8gcmVzZXQgb3V0cHV0IGZyYW1lcyB0byB0aGUgZGF0YSBhY3R1YWxseSBwcm9kdWNlZC4KKworICAgIC8vIHdyaXRlIHRvIGZpbGVzCisgICAgd3JpdGVGaWxlKG91dHB1dEZpbGVuYW1lLCBvdXRwdXRBZGRyLAorICAgICAgICAgICAgb3V0cHV0U2FtcGxlUmF0ZSwgb3V0cHV0Q2hhbm5lbHMsIG91dHB1dEZyYW1lcywgdXNlTWl4ZXJGbG9hdCk7CisgICAgaWYgKGF1eEZpbGVuYW1lKSB7CisgICAgICAgIC8vIEF1eCBidWZmZXIgaXMgYWx3YXlzIGluIHE0XzI3IGZvcm1hdCBmb3Igbm93LgorICAgICAgICAvLyBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoKSwgYnV0IHdpdGggc3RlcmVvIGZyYW1lIGNvdW50IChub3Qgc2FtcGxlIGNvdW50KQorICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopYXV4QWRkciwgKGludDMyX3QqKWF1eEFkZHIsIG91dHB1dEZyYW1lcyA+PiAxKTsKKyAgICAgICAgd3JpdGVGaWxlKGF1eEZpbGVuYW1lLCBhdXhBZGRyLCBvdXRwdXRTYW1wbGVSYXRlLCAxLCBvdXRwdXRGcmFtZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBkZWxldGUgbWl4ZXI7CisgICAgZnJlZShvdXRwdXRBZGRyKTsKKyAgICBmcmVlKGF1eEFkZHIpOworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdF91dGlscy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3RfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUxY2RjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3RfdXRpbHMuaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19URVNUX1VUSUxTX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19URVNUX1VUSUxTX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorI2VuZGlmCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgaXNfc2FtZQoreworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGlzX3NhbWU8VCwgVD4gIC8vIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KK3sKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBUIGNvbnZlcnRWYWx1ZShkb3VibGUgdmFsKQoreworICAgIGlmIChpc19zYW1lPFQsIGludDE2X3Q+Ojp2YWx1ZSkgeworICAgICAgICByZXR1cm4gZmxvb3IodmFsICogMzI3NjcuMCArIDAuNSk7CisgICAgfSBlbHNlIGlmIChpc19zYW1lPFQsIGludDMyX3Q+Ojp2YWx1ZSkgeworICAgICAgICByZXR1cm4gZmxvb3IodmFsICogKDFVTDw8MzEpICsgMC41KTsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsgLy8gYXNzdW1lIGZsb2F0IG9yIGRvdWJsZQorfQorCisvLyBDb252ZXJ0IGEgbGlzdCBvZiBpbnRlZ2VycyBpbiBDU1YgZm9ybWF0IHRvIGEgVmVjdG9yIG9mIHRob3NlIHZhbHVlcy4KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCwgb3IgLTEgb24gZXJyb3IuCitzdGF0aWMgaW5saW5lIGludCBwYXJzZUNTVihjb25zdCBjaGFyICpzdHJpbmcsIHN0ZDo6dmVjdG9yPGludD4mIHZhbHVlcykKK3sKKyAgICAvLyBwYXNzIDE6IGNvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGFuZCBkbyBzeW50YXggY2hlY2sKKyAgICBzaXplX3QgbnVtVmFsdWVzID0gMDsKKyAgICBib29sIGhhZERpZ2l0ID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gc3RyaW5nOyA7ICkgeworICAgICAgICBzd2l0Y2ggKCpwKyspIHsKKyAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisgICAgICAgICAgICBoYWREaWdpdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgaWYgKGhhZERpZ2l0KSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcyAyOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB2ZWN0b3Igb2YgdmFsdWVzCisgICAgICAgICAgICAgICAgdmFsdWVzLnJlc2l6ZSgrK251bVZhbHVlcyk7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gYXRvaShwID0gc3RyaW5nKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bVZhbHVlczsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCsrID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2krK10gPSBhdG9pKHApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudW1WYWx1ZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKKyAgICAgICAgICAgICAgICBoYWREaWdpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG51bVZhbHVlcysrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENyZWF0ZXMgYSB0eXBlLWluZGVwZW5kZW50IGF1ZGlvIGJ1ZmZlciBwcm92aWRlciBmcm9tCisgKiBhIGJ1ZmZlciBiYXNlIGFkZHJlc3MsIHNpemUsIGZyYW1lc2l6ZSwgYW5kIGlucHV0IGluY3JlbWVudCBhcnJheS4KKyAqCisgKiBObyBhbGxvY2F0aW9uIG9yIGRlYWxsb2NhdGlvbiBvZiB0aGUgcHJvdmlkZWQgYnVmZmVyIGlzIGRvbmUuCisgKi8KK2NsYXNzIFRlc3RQcm92aWRlciA6IHB1YmxpYyBhbmRyb2lkOjpBdWRpb0J1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBUZXN0UHJvdmlkZXIodm9pZCogYWRkciwgc2l6ZV90IGZyYW1lcywgc2l6ZV90IGZyYW1lU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlucHV0SW5jcikKKyAgICA6IG1BZGRyKGFkZHIpLAorICAgICAgbU51bUZyYW1lcyhmcmFtZXMpLAorICAgICAgbUZyYW1lU2l6ZShmcmFtZVNpemUpLAorICAgICAgbU5leHRGcmFtZSgwKSwgbVVucmVsKDApLCBtSW5wdXRJbmNyKGlucHV0SW5jciksIG1OZXh0SWR4KDApCisgICAgeworICAgIH0KKworICAgIFRlc3RQcm92aWRlcigpCisgICAgOiBtQWRkcihOVUxMKSwgbU51bUZyYW1lcygwKSwgbUZyYW1lU2l6ZSgwKSwKKyAgICAgIG1OZXh0RnJhbWUoMCksIG1VbnJlbCgwKSwgbU5leHRJZHgoMCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBzZXRJbmNyKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlucHV0SW5jcikgeworICAgICAgICBtSW5wdXRJbmNyID0gaW5wdXRJbmNyOworICAgICAgICBtTmV4dElkeCA9IDA7CisgICAgfQorCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCA9IGtJbnZhbGlkUFRTKQorICAgIHsKKyAgICAgICAgc2l6ZV90IHJlcXVlc3RlZEZyYW1lcyA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgaWYgKHJlcXVlc3RlZEZyYW1lcyA+IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lKSB7CisgICAgICAgICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1JbnB1dEluY3IuZW1wdHkoKSkgeworICAgICAgICAgICAgc2l6ZV90IHByb3ZpZGVkID0gbUlucHV0SW5jclttTmV4dElkeCsrXTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyKCkgbVZhbHVlWyV6dV09JXp1IG5vdCAlenUiLAorICAgICAgICAgICAgICAgICAgICBtTmV4dElkeC0xLCBwcm92aWRlZCwgYnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChwcm92aWRlZCA8IGJ1ZmZlci0+ZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IHByb3ZpZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1OZXh0SWR4ID49IG1JbnB1dEluY3Iuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbU5leHRJZHggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyKCkgcmVxdWVzdGVkICV6dSBmcmFtZXMgb3V0IG9mICV6dSBmcmFtZXMgYXZhaWxhYmxlIgorICAgICAgICAgICAgICAgICIgYW5kIHJldHVybmVkICV6dSBmcmFtZXMiLAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZEZyYW1lcywgbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgICAgIG1VbnJlbCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIgKiltQWRkciArIG1GcmFtZVNpemUgKiBtTmV4dEZyYW1lOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKQorICAgIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IG1VbnJlbCkgeworICAgICAgICAgICAgQUxPR0UoInJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIGJ1dCBvbmx5ICV6dSBhdmFpbGFibGUgIgorICAgICAgICAgICAgICAgICAgICAidG8gcmVsZWFzZSIsIGJ1ZmZlci0+ZnJhbWVDb3VudCwgbVVucmVsKTsKKyAgICAgICAgICAgIG1OZXh0RnJhbWUgKz0gbVVucmVsOworICAgICAgICAgICAgbVVucmVsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VCdWZmZXIoKSByZWxlYXNlZCAlenUgZnJhbWVzIG91dCBvZiAlenUgZnJhbWVzIGF2YWlsYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICJ0byByZWxlYXNlIiwgYnVmZmVyLT5mcmFtZUNvdW50LCBtVW5yZWwpOworICAgICAgICAgICAgbU5leHRGcmFtZSArPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBtVW5yZWwgLT0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1OZXh0RnJhbWUgPSAwOworICAgIH0KKworICAgIHNpemVfdCBnZXROdW1GcmFtZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1OdW1GcmFtZXM7CisgICAgfQorCisKK3Byb3RlY3RlZDoKKyAgICB2b2lkKiBtQWRkcjsgICAvLyBiYXNlIGFkZHJlc3MKKyAgICBzaXplX3QgbU51bUZyYW1lczsgICAvLyB0b3RhbCBmcmFtZXMKKyAgICBpbnQgbUZyYW1lU2l6ZTsgICAgICAvLyBmcmFtZSBzaXplICgjIGNoYW5uZWxzICogYnl0ZXMgcGVyIHNhbXBsZSkKKyAgICBzaXplX3QgbU5leHRGcmFtZTsgICAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIHByb3ZpZGUKKyAgICBzaXplX3QgbVVucmVsOyAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IG1JbnB1dEluY3I7IC8vIG51bWJlciBvZiBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwKKyAgICBzaXplX3QgbU5leHRJZHg7ICAgICAvLyBpbmRleCBvZiBuZXh0IGVudHJ5IGluIG1JbnB1dEluY3IgdG8gdXNlCit9OworCisvKiBDcmVhdGVzIGEgYnVmZmVyIGZpbGxlZCB3aXRoIGEgc2luZSB3YXZlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgY3JlYXRlU2luZSh2b2lkICp2YnVmZmVyLCBzaXplX3QgZnJhbWVzLAorICAgICAgICBzaXplX3QgY2hhbm5lbHMsIGRvdWJsZSBzYW1wbGVSYXRlLCBkb3VibGUgZnJlcSkKK3sKKyAgICBkb3VibGUgdHNjYWxlID0gMS4gLyBzYW1wbGVSYXRlOworICAgIFQqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KHZidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWVzOyArK2kpIHsKKyAgICAgICAgZG91YmxlIHQgPSBpICogdHNjYWxlOworICAgICAgICBkb3VibGUgeSA9IHNpbigyLiAqIE1fUEkgKiBmcmVxICogdCk7CisgICAgICAgIFQgeXQgPSBjb252ZXJ0VmFsdWU8VD4oeSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjaGFubmVsczsgKytqKSB7CisgICAgICAgICAgICBidWZmZXJbaSpjaGFubmVscyArIGpdID0geXQgLyBUKGogKyAxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ3JlYXRlcyBhIGJ1ZmZlciBmaWxsZWQgd2l0aCBhIGNoaXJwIHNpZ25hbCAoYSBzaW5lIHdhdmUgc3dlZXApLgorICoKKyAqIFdoZW4gY3JlYXRpbmcgdGhlIENoaXJwLCBub3RlIHRoYXQgdGhlIGZyZXF1ZW5jeSBpcyB0aGUgdHJ1ZSBzaW51c29pZGFsCisgKiBmcmVxdWVuY3kgbm90IHRoZSBzYW1wbGluZyByYXRlLgorICoKKyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2hpcnAKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGNyZWF0ZUNoaXJwKHZvaWQgKnZidWZmZXIsIHNpemVfdCBmcmFtZXMsCisgICAgICAgIHNpemVfdCBjaGFubmVscywgZG91YmxlIHNhbXBsZVJhdGUsICBkb3VibGUgbWluZnJlcSwgZG91YmxlIG1heGZyZXEpCit7CisgICAgZG91YmxlIHRzY2FsZSA9IDEuIC8gc2FtcGxlUmF0ZTsKKyAgICBUICpidWZmZXIgPSByZWludGVycHJldF9jYXN0PFQqPih2YnVmZmVyKTsKKyAgICAvLyBub3RlIHRoZSBjaGlycCBjb25zdGFudCBrIGhhcyBhIGRpdmlkZS1ieS10d28uCisgICAgZG91YmxlIGsgPSAobWF4ZnJlcSAtIG1pbmZyZXEpIC8gKDIuICogdHNjYWxlICogZnJhbWVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIGRvdWJsZSB0ID0gaSAqIHRzY2FsZTsKKyAgICAgICAgZG91YmxlIHkgPSBzaW4oMi4gKiBNX1BJICogKGsgKiB0ICsgbWluZnJlcSkgKiB0KTsKKyAgICAgICAgVCB5dCA9IGNvbnZlcnRWYWx1ZTxUPih5KTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNoYW5uZWxzOyArK2opIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpKmNoYW5uZWxzICsgal0gPSB5dCAvIFQoaiArIDEpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBUaGlzIGRlcml2ZWQgY2xhc3MgY3JlYXRlcyBhIGJ1ZmZlciBwcm92aWRlciBvZiBkYXRhdHlwZSBULAorICogY29uc2lzdGluZyBvZiBhbiBpbnB1dCBzaWduYWwsIGUuZy4gZnJvbSBjcmVhdGVDaGlycCgpLgorICogVGhlIG51bWJlciBvZiBmcmFtZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGJhc2UgY2xhc3MKKyAqIFRlc3RQcm92aWRlcjo6Z2V0TnVtRnJhbWVzKCkuCisgKi8KKworY2xhc3MgU2lnbmFsUHJvdmlkZXIgOiBwdWJsaWMgVGVzdFByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBTaWduYWxQcm92aWRlcigpCisgICAgOiBtU2FtcGxlUmF0ZSgwKSwKKyAgICAgIG1DaGFubmVscygwKQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5TaWduYWxQcm92aWRlcigpCisgICAgeworICAgICAgICBmcmVlKG1BZGRyKTsKKyAgICAgICAgbUFkZHIgPSBOVUxMOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc2V0Q2hpcnAoc2l6ZV90IGNoYW5uZWxzLCBkb3VibGUgbWluZnJlcSwgZG91YmxlIG1heGZyZXEsIGRvdWJsZSBzYW1wbGVSYXRlLCBkb3VibGUgdGltZSkKKyAgICB7CisgICAgICAgIGNyZWF0ZUJ1ZmZlckJ5RnJhbWVzPFQ+KGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzYW1wbGVSYXRlKnRpbWUpOworICAgICAgICBjcmVhdGVDaGlycDxUPihtQWRkciwgbU51bUZyYW1lcywgbUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSwgbWluZnJlcSwgbWF4ZnJlcSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBzZXRTaW5lKHNpemVfdCBjaGFubmVscywKKyAgICAgICAgICAgIGRvdWJsZSBmcmVxLCBkb3VibGUgc2FtcGxlUmF0ZSwgZG91YmxlIHRpbWUpCisgICAgeworICAgICAgICBjcmVhdGVCdWZmZXJCeUZyYW1lczxUPihjaGFubmVscywgc2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSp0aW1lKTsKKyAgICAgICAgY3JlYXRlU2luZTxUPihtQWRkciwgbU51bUZyYW1lcywgIG1DaGFubmVscywgbVNhbXBsZVJhdGUsIGZyZXEpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc2V0RmlsZShjb25zdCBjaGFyICpmaWxlX2luKQorICAgIHsKKyAgICAgICAgU0ZfSU5GTyBpbmZvOworICAgICAgICBpbmZvLmZvcm1hdCA9IDA7CisgICAgICAgIFNOREZJTEUgKnNmID0gc2Zfb3BlbihmaWxlX2luLCBTRk1fUkVBRCwgJmluZm8pOworICAgICAgICBpZiAoc2YgPT0gTlVMTCkgeworICAgICAgICAgICAgcGVycm9yKGZpbGVfaW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUJ1ZmZlckJ5RnJhbWVzPFQ+KGluZm8uY2hhbm5lbHMsIGluZm8uc2FtcGxlcmF0ZSwgaW5mby5mcmFtZXMpOworICAgICAgICBpZiAoaXNfc2FtZTxULCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAodm9pZCkgc2ZfcmVhZGZfZmxvYXQoc2YsIChmbG9hdCAqKSBtQWRkciwgbU51bUZyYW1lcyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNfc2FtZTxULCBzaG9ydD46OnZhbHVlKSB7CisgICAgICAgICAgICAodm9pZCkgc2ZfcmVhZGZfc2hvcnQoc2YsIChzaG9ydCAqKSBtQWRkciwgbU51bUZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgc2ZfY2xvc2Uoc2YpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgY3JlYXRlQnVmZmVyQnlGcmFtZXMoc2l6ZV90IGNoYW5uZWxzLCB1aW50MzJfdCBzYW1wbGVSYXRlLCBzaXplX3QgZnJhbWVzKQorICAgIHsKKyAgICAgICAgbU51bUZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbHMgKiBzaXplb2YoVCk7CisgICAgICAgIGZyZWUobUFkZHIpOworICAgICAgICBtQWRkciA9IG1hbGxvYyhtRnJhbWVTaXplICogbU51bUZyYW1lcyk7CisgICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0TnVtQ2hhbm5lbHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbHM7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgdWludDMyX3QgbUNoYW5uZWxzOworfTsKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fVEVTVF9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTEyYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMCwwICsxLDg2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKKyAgICBBdWRpb1BvbGljeUVmZmVjdHMuY3BwCisKK2lmZXEgKCQoVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kpLCAxKQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBBdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwIFwKKyAgICBBdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCisKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorZWxzZQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBBdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIFwKKyAgICBBdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJtZWRpYSBcCisgICAgbGliaGFyZHdhcmUgXAorICAgIGxpYmhhcmR3YXJlX2xlZ2FjeQorCitpZm5lcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIKK2VuZGlmCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlic2VydmljZXV0aWxpdHkKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3lzZXJ2aWNlCisKK0xPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworCitpZm5lcSAoJChVU0VfTEVHQUNZX0FVRElPX1BPTElDWSksIDEpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnNvdW5kdHJpZ2dlcgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2lmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1BvbGljeUZhY3RvcnkuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA5MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lDbGllbnRJbXBsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgaW50ZXJmYWNlIGZyb20gdGhlIHBvbGljeSBtYW5hZ2VyICovCisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50Ojpsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCBkZXZpY2VzLCBhZGRyZXNzLCBsYXRlbmN5TXMsIGZsYWdzKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b3BlbkR1cGxpY2F0ZU91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6cmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5yZXN0b3JlT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBpbnB1dCwgY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfbXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjppbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHJldHVybiBhZi0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9faGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFBhcmFtZXRlcnMoaW9faGFuZGxlLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkZWxheV9tcyk7Cit9CisKK1N0cmluZzggQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Z2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5cykKK3sKKyAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwga2V5cyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdG9wVG9uZSgpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnN0b3BUb25lKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUsIGRlbGF5X21zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0X291dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPm1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY19vdXRwdXQsIGRzdF9vdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPmNsaWVudENyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5jbGllbnRSZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+Y2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Cit9CisKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om5ld0F1ZGlvVW5pcXVlSWQoKQoreworICAgIHJldHVybiBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCgpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3MTlkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyN1bmRlZiBfX1NUUklDVF9BTlNJX18KKyNkZWZpbmUgX19TVERJTlRfTElNSVRTCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKy8vI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHBvbGljeSBtYW5hZ2VyICovCitleHRlcm4gIkMiIHsKKworYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBhZi0+bG9hZEh3TW9kdWxlKG5hbWUpOworfQorCitzdGF0aWMgYXVkaW9faW9faGFuZGxlX3Qgb3Blbl9vdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgaWYgKHBTYW1wbGluZ1JhdGUgPT0gTlVMTCB8fCBwRm9ybWF0ID09IE5VTEwgfHwgcENoYW5uZWxNYXNrID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBEZXZpY2VzID09IE5VTEwgfHwgcExhdGVuY3lNcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9ICpwU2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy5mb3JtYXQgPSAqcEZvcm1hdDsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gKnBDaGFubmVsTWFzazsKKyAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgIH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+b3Blbk91dHB1dChtb2R1bGUsICZvdXRwdXQsICZjb25maWcsIHBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLCBwTGF0ZW5jeU1zLCBmbGFncyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAqcENoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICooKGF1ZGlvX29mZmxvYWRfaW5mb190ICopb2ZmbG9hZEluZm8pID0gY29uZmlnLm9mZmxvYWRfaW5mbzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCisvLyBkZXByZWNhdGVkOiByZXBsYWNlZCBieSBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKCkKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwTGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICByZXR1cm4gb3Blbl9vdXRwdXQoKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkwLCBwRGV2aWNlcywgcFNhbXBsaW5nUmF0ZSwgcEZvcm1hdCwgcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF0ZW5jeU1zLCBmbGFncywgTlVMTCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIHJldHVybiBvcGVuX291dHB1dChtb2R1bGUsIHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCBwRm9ybWF0LCBwQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXRlbmN5TXMsIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2R1cF9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDEsIG91dHB1dDIpOworfQorCitpbnQgYXBzX2Nsb3NlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOworfQorCitpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKK30KKworaW50IGFwc19yZXN0b3JlX291dHB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5yZXN0b3JlT3V0cHV0KG91dHB1dCk7Cit9CisKK3N0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBvcGVuX2lucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgaWYgKHBTYW1wbGluZ1JhdGUgPT0gTlVMTCB8fCBwRm9ybWF0ID09IE5VTEwgfHwgcENoYW5uZWxNYXNrID09IE5VTEwgfHwgcERldmljZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjs7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gKnBTYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLmZvcm1hdCA9ICpwRm9ybWF0OworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSAqcENoYW5uZWxNYXNrOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPm9wZW5JbnB1dChtb2R1bGUsICZpbnB1dCwgJmNvbmZpZywgcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgQVVESU9fU09VUkNFX01JQywgQVVESU9fSU5QVVRfRkxBR19GQVNUIC8qRklYTUUqLyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqcFNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgKnBGb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAqcENoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorCisKKy8vIGRlcHJlY2F0ZWQ6IHJlcGxhY2VkIGJ5IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSgpLCBhbmQgYWNvdXN0aWNzIHBhcmFtZXRlciBpcyBpZ25vcmVkCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgX191bnVzZWQpCit7CisgICAgcmV0dXJuICBvcGVuX2lucHV0KChhdWRpb19tb2R1bGVfaGFuZGxlX3QpMCwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IGFwc19vcGVuX2lucHV0X29uX21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKnBEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICpwQ2hhbm5lbE1hc2spCit7CisgICAgcmV0dXJuICBvcGVuX2lucHV0KG1vZHVsZSwgcERldmljZXMsIHBTYW1wbGluZ1JhdGUsIHBGb3JtYXQsIHBDaGFubmVsTWFzayk7Cit9CisKK2ludCBhcHNfY2xvc2VfaW5wdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5jbG9zZUlucHV0KGlucHV0KTsKK30KKworaW50IGFwc19pbnZhbGlkYXRlX3N0cmVhbSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gYWYtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKK30KKworaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSBfX3VudXNlZCwgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpCit7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKK30KKworY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cykKK3sKKyAgICBTdHJpbmc4IHJlc3VsdCA9IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGlvX2hhbmRsZSwgU3RyaW5nOChrZXlzKSk7CisgICAgcmV0dXJuIHN0cmR1cChyZXN1bHQuc3RyaW5nKCkpOworfQorCit2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIGF1ZGlvUG9saWN5U2VydmljZS0+c2V0UGFyYW1ldGVycyhpb19oYW5kbGUsIGt2X3BhaXJzLCBkZWxheV9tcyk7Cit9CisKK2ludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfbXMpOworfQorCitpbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnN0YXJ0VG9uZSh0b25lLCBzdHJlYW0pOworfQorCitpbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKQoreworICAgIEF1ZGlvUG9saWN5U2VydmljZSAqYXVkaW9Qb2xpY3lTZXJ2aWNlID0gKEF1ZGlvUG9saWN5U2VydmljZSAqKXNlcnZpY2U7CisKKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOworfQorCitpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpCit7CisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlICphdWRpb1BvbGljeVNlcnZpY2UgPSAoQXVkaW9Qb2xpY3lTZXJ2aWNlICopc2VydmljZTsKKworICAgIHJldHVybiBhdWRpb1BvbGljeVNlcnZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSwgZGVsYXlfbXMpOworfQorCit9OyAvLyBleHRlcm4gIkMiCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UxYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lFZmZlY3RzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCisjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5RWZmZWN0cyBJbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdWRpb1BvbGljeUVmZmVjdHM6OkF1ZGlvUG9saWN5RWZmZWN0cygpCit7CisgICAgLy8gbG9hZCBhdXRvbWF0aWMgYXVkaW8gZWZmZWN0IG1vZHVsZXMKKyAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgbG9hZEF1ZGlvRWZmZWN0Q29uZmlnKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUpOworICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgIGxvYWRBdWRpb0VmZmVjdENvbmZpZyhBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgfQorfQorCisKK0F1ZGlvUG9saWN5RWZmZWN0czo6fkF1ZGlvUG9saWN5RWZmZWN0cygpCit7CisgICAgc2l6ZV90IGkgPSAwOworICAgIC8vIHJlbGVhc2UgYXVkaW8gaW5wdXQgcHJvY2Vzc2luZyByZXNvdXJjZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUlucHV0U291cmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgbUlucHV0U291cmNlcy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtSW5wdXRTb3VyY2VzLmNsZWFyKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRzLnZhbHVlQXQoaSktPm1FZmZlY3RzLmNsZWFyKCk7CisgICAgICAgIGRlbGV0ZSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgfQorICAgIG1JbnB1dHMuY2xlYXIoKTsKKworICAgIC8vIHJlbGVhc2UgYXVkaW8gb3V0cHV0IHByb2Nlc3NpbmcgcmVzb3VyY2VzCisgICAgZm9yIChpID0gMDsgaSA8IG1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRlbGV0ZSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1PdXRwdXRTZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtT3V0cHV0U2Vzc2lvbnMudmFsdWVBdChpKS0+bUVmZmVjdHMuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGkpOworICAgIH0KKyAgICBtT3V0cHV0U2Vzc2lvbnMuY2xlYXIoKTsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZElucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24pCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICAvLyBjcmVhdGUgYXVkaW8gcHJlIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIGlucHV0IHNvdXJjZQorICAgIGF1ZGlvX3NvdXJjZV90IGFsaWFzU291cmNlID0gKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gOiBpbnB1dFNvdXJjZTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShhbGlhc1NvdXJjZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigiYWRkSW5wdXRFZmZlY3RzKCk6IG5vIHByb2Nlc3NpbmcgbmVlZHMgdG8gYmUgYXR0YWNoZWQgdG8gdGhpcyBzb3VyY2UiKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3NpemVfdCBpZHggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIEVmZmVjdFZlY3RvciAqaW5wdXREZXNjOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIGlucHV0RGVzYyA9IG5ldyBFZmZlY3RWZWN0b3IoYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRWZmZWN0VmVjdG9yIGlzIGV4aXN0aW5nIGFuZCB3ZSBqdXN0IG5lZWQgdG8gaW5jcmVhc2UgcmVmIGNvdW50CisgICAgICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpZHgpOworICAgIH0KKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCsrOworCisgICAgQUxPR1YoImFkZElucHV0RWZmZWN0cygpOiBpbnB1dDogJWQsIHJlZkNvdW50OiAlZCIsIGlucHV0LCBpbnB1dERlc2MtPm1SZWZDb3VudCk7CisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDEpIHsKKyAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIGlucHV0KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFkZElucHV0RWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIHNvdXJjZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tTmFtZSwgKGludDMyX3QpYWxpYXNTb3VyY2UpOworICAgICAgICAgICAgICAgIC8vIGZ4IGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBzdHJvbmcgcmVmIG9uIEF1ZGlvRWZmZWN0IGlzIHJlbGVhc2VkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGVmZmVjdC0+bVBhcmFtcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGZ4LT5zZXRQYXJhbWV0ZXIoZWZmZWN0LT5tUGFyYW1zW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJhZGRJbnB1dEVmZmVjdHMoKTogYWRkZWQgRnggJXMgb24gc291cmNlOiAlZCIsCisgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCAoaW50MzJfdClhbGlhc1NvdXJjZSk7CisgICAgICAgICAgICBpbnB1dERlc2MtPm1FZmZlY3RzLmFkZChmeCk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5zZXRQcm9jZXNzb3JFbmFibGVkKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBFZmZlY3RWZWN0b3IgKmlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKKyAgICBBTE9HVigicmVsZWFzZUlucHV0RWZmZWN0cygpOiBpbnB1dDogJWQsIHJlZkNvdW50OiAlZCIsIGlucHV0LCBpbnB1dERlc2MtPm1SZWZDb3VudCk7CisgICAgaWYgKGlucHV0RGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgaW5wdXREZXNjLT5zZXRQcm9jZXNzb3JFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgZGVsZXRlIGlucHV0RGVzYzsKKyAgICAgICAgbUlucHV0cy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dEVmZmVjdHMoKTogYWxsIGVmZmVjdHMgcmVsZWFzZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpxdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbUlucHV0cy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1JbnB1dHMudmFsdWVBdChpbmRleCktPm1TZXNzaW9uSWQgPT0gYXVkaW9TZXNzaW9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPiBlZmZlY3RzID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOworICAgICAgICBpZiAoaSA8ICpjb3VudCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBkZXNjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RzLnNpemUoKSA+ICpjb3VudCkgeworICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgfQorICAgICpjb3VudCA9IGVmZmVjdHMuc2l6ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1PdXRwdXRTZXNzaW9ucy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGluZGV4KS0+bVNlc3Npb25JZCA9PSBhdWRpb1Nlc3Npb24pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBtT3V0cHV0U2Vzc2lvbnMuc2l6ZSgpKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFZlY3Rvcjwgc3A8QXVkaW9FZmZlY3Q+ID4gZWZmZWN0cyA9IG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0c1tpXS0+ZGVzY3JpcHRvcigpOworICAgICAgICBpZiAoaSA8ICpjb3VudCkgeworICAgICAgICAgICAgZGVzY3JpcHRvcnNbaV0gPSBkZXNjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RzLnNpemUoKSA+ICpjb3VudCkgeworICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CisgICAgfQorICAgICpjb3VudCA9IGVmZmVjdHMuc2l6ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQorICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogbm8gb3V0cHV0IHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGlzIHN0cmVhbSIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U2Vzc2lvbnMuaW5kZXhPZktleShhdWRpb1Nlc3Npb24pOworICAgIEVmZmVjdFZlY3RvciAqcHJvY0Rlc2M7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgcHJvY0Rlc2MgPSBuZXcgRWZmZWN0VmVjdG9yKGF1ZGlvU2Vzc2lvbik7CisgICAgICAgIG1PdXRwdXRTZXNzaW9ucy5hZGQoYXVkaW9TZXNzaW9uLCBwcm9jRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRWZmZWN0VmVjdG9yIGlzIGV4aXN0aW5nIGFuZCB3ZSBqdXN0IG5lZWQgdG8gaW5jcmVhc2UgcmVmIGNvdW50CisgICAgICAgIHByb2NEZXNjID0gbU91dHB1dFNlc3Npb25zLnZhbHVlQXQoaWR4KTsKKyAgICB9CisgICAgcHJvY0Rlc2MtPm1SZWZDb3VudCsrOworCisgICAgQUxPR1YoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IHNlc3Npb246ICVkLCByZWZDb3VudDogJWQiLAorICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgcHJvY0Rlc2MtPm1SZWZDb3VudCk7CisgICAgaWYgKHByb2NEZXNjLT5tUmVmQ291bnQgPT0gMSkgeworICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaW5kZXgpLT5tRWZmZWN0czsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBlZmZlY3RzW2ldOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgb3V0cHV0KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE91dHB1dFNlc3Npb25FZmZlY3RzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggICVzIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIGF1ZGlvU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJhZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBhZGRlZCBGeCAlcyBvbiBzZXNzaW9uOiAlZCBmb3Igc3RyZWFtOiAlZCIsCisgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1OYW1lLCBhdWRpb1Nlc3Npb24sIChpbnQzMl90KXN0cmVhbSk7CisgICAgICAgICAgICBwcm9jRGVzYy0+bUVmZmVjdHMuYWRkKGZ4KTsKKyAgICAgICAgfQorCisgICAgICAgIHByb2NEZXNjLT5zZXRQcm9jZXNzb3JFbmFibGVkKHRydWUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAodm9pZCkgb3V0cHV0OyAvLyBhcmd1bWVudCBub3QgdXNlZCBmb3Igbm93CisgICAgKHZvaWQpIHN0cmVhbTsgLy8gYXJndW1lbnQgbm90IHVzZWQgZm9yIG5vdworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFNlc3Npb25zLmluZGV4T2ZLZXkoYXVkaW9TZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHM6IG5vIG91dHB1dCBwcm9jZXNzaW5nIHdhcyBhdHRhY2hlZCB0byB0aGlzIHN0cmVhbSIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgRWZmZWN0VmVjdG9yICpwcm9jRGVzYyA9IG1PdXRwdXRTZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKKyAgICBwcm9jRGVzYy0+bVJlZkNvdW50LS07CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cygpOiBzZXNzaW9uOiAlZCwgcmVmQ291bnQ6ICVkIiwKKyAgICAgICAgICBhdWRpb1Nlc3Npb24sIHByb2NEZXNjLT5tUmVmQ291bnQpOworICAgIGlmIChwcm9jRGVzYy0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgcHJvY0Rlc2MtPnNldFByb2Nlc3NvckVuYWJsZWQoZmFsc2UpOworICAgICAgICBwcm9jRGVzYy0+bUVmZmVjdHMuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIHByb2NEZXNjOworICAgICAgICBtT3V0cHV0U2Vzc2lvbnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogb3V0cHV0IHByb2Nlc3NpbmcgcmVsZWFzZWQgZnJvbSBzZXNzaW9uOiAlZCIsCisgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdFZlY3Rvcjo6c2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtRWZmZWN0cy5pdGVtQXQoaSktPnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKnN0YXRpYyovIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BvbGljeUVmZmVjdHM6OmtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdID0geworICAgIE1JQ19TUkNfVEFHLAorICAgIFZPSUNFX1VMX1NSQ19UQUcsCisgICAgVk9JQ0VfRExfU1JDX1RBRywKKyAgICBWT0lDRV9DQUxMX1NSQ19UQUcsCisgICAgQ0FNQ09SREVSX1NSQ19UQUcsCisgICAgVk9JQ0VfUkVDX1NSQ19UQUcsCisgICAgVk9JQ0VfQ09NTV9TUkNfVEFHCit9OworCisvLyByZXR1cm5zIHRoZSBhdWRpb19zb3VyY2VfdCBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNvdXJjZSBuYW1lIG9yCisvLyBBVURJT19TT1VSQ0VfQ05UIGlzIG5vIG1hdGNoIGZvdW5kCisvKnN0YXRpYyovIGF1ZGlvX3NvdXJjZV90IEF1ZGlvUG9saWN5RWZmZWN0czo6aW5wdXRTb3VyY2VOYW1lVG9FbnVtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gQVVESU9fU09VUkNFX01JQzsgaSA8IEFVRElPX1NPVVJDRV9DTlQ7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGtJbnB1dFNvdXJjZU5hbWVzW2kgLSBBVURJT19TT1VSQ0VfTUlDXSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImlucHV0U291cmNlTmFtZVRvRW51bSBmb3VuZCBzb3VyY2UgJXMgJWQiLCBuYW1lLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fc291cmNlX3QpaTsKK30KKworY29uc3QgY2hhciAqQXVkaW9Qb2xpY3lFZmZlY3RzOjprU3RyZWFtTmFtZXNbQVVESU9fU1RSRUFNX0NOVCsxXSA9IHsKKyAgICBBVURJT19TVFJFQU1fREVGQVVMVF9UQUcsCisgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTExfVEFHLAorICAgIEFVRElPX1NUUkVBTV9TWVNURU1fVEFHLAorICAgIEFVRElPX1NUUkVBTV9SSU5HX1RBRywKKyAgICBBVURJT19TVFJFQU1fTVVTSUNfVEFHLAorICAgIEFVRElPX1NUUkVBTV9BTEFSTV9UQUcsCisgICAgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTl9UQUcsCisgICAgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ09fVEFHLAorICAgIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFX1RBRywKKyAgICBBVURJT19TVFJFQU1fRFRNRl9UQUcsCisgICAgQVVESU9fU1RSRUFNX1RUU19UQUcKK307CisKKy8vIHJldHVybnMgdGhlIGF1ZGlvX3N0cmVhbV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbSBuYW1lIG9yCisvLyBBVURJT19TVFJFQU1fQ05UIGlzIG5vIG1hdGNoIGZvdW5kCithdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5RWZmZWN0czo6c3RyZWFtTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwga1N0cmVhbU5hbWVzW2kgLSBBVURJT19TVFJFQU1fREVGQVVMVF0pID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzdHJlYW1OYW1lVG9FbnVtIGZvdW5kIHN0cmVhbSAlcyAlZCIsIG5hbWUsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChhdWRpb19zdHJlYW1fdHlwZV90KWk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvIEVmZmVjdCBDb25maWcgcGFyc2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NpemVfdCBBdWRpb1BvbGljeUVmZmVjdHM6Omdyb3dQYXJhbVNpemUoY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdG90U2l6ZSkKK3sKKyAgICAvLyAqY3VyU2l6ZSBpcyBhdCBsZWFzdCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgMiAqIHNpemVvZihpbnQpCisgICAgc2l6ZV90IHBvcyA9ICgoKmN1clNpemUgLSAxICkgLyBzaXplICsgMSkgKiBzaXplOworCisgICAgaWYgKHBvcyArIHNpemUgPiAqdG90U2l6ZSkgeworICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7CisgICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW0gPSAoY2hhciAqKXJlYWxsb2MocGFyYW0sICp0b3RTaXplKTsKKyAgICB9CisgICAgKmN1clNpemUgPSBwb3MgKyBzaXplOworICAgIHJldHVybiBwb3M7Cit9CisKK3NpemVfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmN1clNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpCit7CisgICAgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU0hPUlRfVEFHLCBzaXplb2YoU0hPUlRfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihzaG9ydCksIGN1clNpemUsIHRvdFNpemUpOworICAgICAgICAqKHNob3J0ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gKHNob3J0KWF0b2kobm9kZS0+dmFsdWUpOworICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHNob3J0ICVkIiwgKihzaG9ydCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7CisgICAgICAgIHJldHVybiBzaXplb2Yoc2hvcnQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBJTlRfVEFHLCBzaXplb2YoSU5UX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoaW50KSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgICooaW50ICopKChjaGFyICopcGFyYW0gKyBwb3MpID0gYXRvaShub2RlLT52YWx1ZSk7CisgICAgICAgIEFMT0dWKCJyZWFkUGFyYW1WYWx1ZSgpIHJlYWRpbmcgaW50ICVkIiwgKihpbnQgKikoKGNoYXIgKilwYXJhbSArIHBvcykpOworICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7CisgICAgfSBlbHNlIGlmIChzdHJuY21wKG5vZGUtPm5hbWUsIEZMT0FUX1RBRywgc2l6ZW9mKEZMT0FUX1RBRykgKyAxKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBwb3MgPSBncm93UGFyYW1TaXplKHBhcmFtLCBzaXplb2YoZmxvYXQpLCBjdXJTaXplLCB0b3RTaXplKTsKKyAgICAgICAgKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IChmbG9hdClhdG9mKG5vZGUtPnZhbHVlKTsKKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBmbG9hdCAlZiIsKihmbG9hdCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSk7CisgICAgICAgIHJldHVybiBzaXplb2YoZmxvYXQpOworICAgIH0gZWxzZSBpZiAoc3RybmNtcChub2RlLT5uYW1lLCBCT09MX1RBRywgc2l6ZW9mKEJPT0xfVEFHKSArIDEpID09IDApIHsKKyAgICAgICAgc2l6ZV90IHBvcyA9IGdyb3dQYXJhbVNpemUocGFyYW0sIHNpemVvZihib29sKSwgY3VyU2l6ZSwgdG90U2l6ZSk7CisgICAgICAgIGlmIChzdHJuY21wKG5vZGUtPnZhbHVlLCAiZmFsc2UiLCBzdHJsZW4oImZhbHNlIikgKyAxKSA9PSAwKSB7CisgICAgICAgICAgICAqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICooYm9vbCAqKSgoY2hhciAqKXBhcmFtICsgcG9zKSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInJlYWRQYXJhbVZhbHVlKCkgcmVhZGluZyBib29sICVzIiwqKGJvb2wgKikoKGNoYXIgKilwYXJhbSArIHBvcykgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihib29sKTsKKyAgICB9IGVsc2UgaWYgKHN0cm5jbXAobm9kZS0+bmFtZSwgU1RSSU5HX1RBRywgc2l6ZW9mKFNUUklOR19UQUcpICsgMSkgPT0gMCkgeworICAgICAgICBzaXplX3QgbGVuID0gc3Rybmxlbihub2RlLT52YWx1ZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKTsKKyAgICAgICAgaWYgKCpjdXJTaXplICsgbGVuICsgMSA+ICp0b3RTaXplKSB7CisgICAgICAgICAgICAqdG90U2l6ZSA9ICpjdXJTaXplICsgbGVuICsgMTsKKyAgICAgICAgICAgIHBhcmFtID0gKGNoYXIgKilyZWFsbG9jKHBhcmFtLCAqdG90U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RybmNweShwYXJhbSArICpjdXJTaXplLCBub2RlLT52YWx1ZSwgbGVuKTsKKyAgICAgICAgKmN1clNpemUgKz0gbGVuOworICAgICAgICBwYXJhbVsqY3VyU2l6ZV0gPSAnXDAnOworICAgICAgICBBTE9HVigicmVhZFBhcmFtVmFsdWUoKSByZWFkaW5nIHN0cmluZyAlcyIsIHBhcmFtICsgKmN1clNpemUgLSBsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKyAgICBBTE9HVygicmVhZFBhcmFtVmFsdWUoKSB1bmtub3duIHBhcmFtIHR5cGUgJXMiLCBub2RlLT5uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworZWZmZWN0X3BhcmFtX3QgKkF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqcGFyYW07CisgICAgY25vZGUgKnZhbHVlOworICAgIHNpemVfdCBjdXJTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KTsKKyAgICBzaXplX3QgdG90U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludCk7CisgICAgZWZmZWN0X3BhcmFtX3QgKmZ4X3BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHRvdFNpemUpOworCisgICAgcGFyYW0gPSBjb25maWdfZmluZChyb290LCBQQVJBTV9UQUcpOworICAgIHZhbHVlID0gY29uZmlnX2ZpbmQocm9vdCwgVkFMVUVfVEFHKTsKKyAgICBpZiAocGFyYW0gPT0gTlVMTCAmJiB2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIHRyeSB0byBwYXJzZSBzaW1wbGUgcGFyYW1ldGVyIGZvcm0ge2ludCBpbnR9CisgICAgICAgIHBhcmFtID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChwYXJhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBOb3RlOiB0aGF0IGEgcGFpciBvZiByYW5kb20gc3RyaW5ncyBpcyByZWFkIGFzIDAgMAorICAgICAgICAgICAgaW50ICpwdHIgPSAoaW50ICopZnhfcGFyYW0tPmRhdGE7CisgICAgICAgICAgICBpbnQgKnB0cjIgPSAoaW50ICopKChjaGFyICopcGFyYW0gKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKTsKKyAgICAgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgcHRyICVwIHB0cjIgJXAiLCBwdHIsIHB0cjIpOworICAgICAgICAgICAgKnB0cisrID0gYXRvaShwYXJhbS0+bmFtZSk7CisgICAgICAgICAgICAqcHRyID0gYXRvaShwYXJhbS0+dmFsdWUpOworICAgICAgICAgICAgZnhfcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICBmeF9wYXJhbS0+dnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIHJldHVybiBmeF9wYXJhbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gJXMiLCByb290LT5uYW1lKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBmeF9wYXJhbS0+cHNpemUgPSAwOworICAgIHBhcmFtID0gcGFyYW0tPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChwYXJhbSkgeworICAgICAgICBBTE9HVigibG9hZEVmZmVjdFBhcmFtZXRlcigpIHJlYWRpbmcgcGFyYW0gb2YgdHlwZSAlcyIsIHBhcmFtLT5uYW1lKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSByZWFkUGFyYW1WYWx1ZShwYXJhbSwgKGNoYXIgKilmeF9wYXJhbSwgJmN1clNpemUsICZ0b3RTaXplKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBmeF9wYXJhbS0+cHNpemUgKz0gc2l6ZTsKKyAgICAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dDsKKyAgICB9CisKKyAgICAvLyBhbGlnbiBzdGFydCBvZiB2YWx1ZSBmaWVsZCBvbiAzMiBiaXQgYm91bmRhcnkKKyAgICBjdXJTaXplID0gKChjdXJTaXplIC0gMSApIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOworCisgICAgZnhfcGFyYW0tPnZzaXplID0gMDsKKyAgICB2YWx1ZSA9IHZhbHVlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAodmFsdWUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXIoKSByZWFkaW5nIHZhbHVlIG9mIHR5cGUgJXMiLCB2YWx1ZS0+bmFtZSk7CisgICAgICAgIHNpemVfdCBzaXplID0gcmVhZFBhcmFtVmFsdWUodmFsdWUsIChjaGFyICopZnhfcGFyYW0sICZjdXJTaXplLCAmdG90U2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZnhfcGFyYW0tPnZzaXplICs9IHNpemU7CisgICAgICAgIHZhbHVlID0gdmFsdWUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ4X3BhcmFtOworCitlcnJvcjoKKyAgICBkZWxldGUgZnhfcGFyYW07CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RQYXJhbWV0ZXJzKCkgbG9hZGluZyBwYXJhbSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSBsb2FkRWZmZWN0UGFyYW1ldGVyKG5vZGUpOworICAgICAgICBpZiAocGFyYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCisKK0F1ZGlvUG9saWN5RWZmZWN0czo6RWZmZWN0RGVzY1ZlY3RvciAqQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkRWZmZWN0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJsb2FkSW5wdXRTb3VyY2UoKSBlbXB0eSBlbGVtZW50ICVzIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVmZmVjdHNbaV0tPm1OYW1lLCBub2RlLT5uYW1lLCBFRkZFQ1RfU1RSSU5HX0xFTl9NQVgpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibG9hZEVmZmVjdENvbmZpZygpIGZvdW5kIGVmZmVjdCAlcyBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gZWZmZWN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkRWZmZWN0Q29uZmlnKCkgZWZmZWN0ICVzIG5vdCBpbiBsaXN0Iiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKCplZmZlY3RzW2ldKTsgICAvLyBkZWVwIGNvcHkKKyAgICAgICAgbG9hZEVmZmVjdFBhcmFtZXRlcnMobm9kZSwgZWZmZWN0LT5tUGFyYW1zKTsKKyAgICAgICAgQUxPR1YoImxvYWRFZmZlY3RDb25maWcoKSBhZGRpbmcgZWZmZWN0ICVzIHV1aWQgJTA4eCIsCisgICAgICAgICAgICAgIGVmZmVjdC0+bU5hbWUsIGVmZmVjdC0+bVV1aWQudGltZUxvdyk7CisgICAgICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKGRlc2MtPm1FZmZlY3RzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRWZmZWN0Q29uZmlnKCkgbm8gdmFsaWQgZWZmZWN0cyBmb3VuZCBpbiBjb25maWcgJXMiLCByb290LT5uYW1lKTsKKyAgICAgICAgZGVsZXRlIGRlc2M7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZGVzYzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkSW5wdXRFZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgUFJFUFJPQ0VTU0lOR19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dFNvdXJjZU5hbWVUb0VudW0obm9kZS0+bmFtZSk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0NOVCkgeworICAgICAgICAgICAgQUxPR1coImxvYWRJbnB1dFNvdXJjZXMoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigibG9hZElucHV0U291cmNlcygpIGxvYWRpbmcgaW5wdXQgc291cmNlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBsb2FkRWZmZWN0Q29uZmlnKG5vZGUsIGVmZmVjdHMpOworICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dFNvdXJjZXMuYWRkKHNvdXJjZSwgZGVzYyk7CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZFN0cmVhbUVmZmVjdENvbmZpZ3VyYXRpb25zKGNub2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUX1NFU1NJT05fUFJPQ0VTU0lOR19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbU5hbWVUb0VudW0obm9kZS0+bmFtZSk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICAgICAgQUxPR1coImxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucygpIGludmFsaWQgb3V0cHV0IHN0cmVhbSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigibG9hZFN0cmVhbUVmZmVjdENvbmZpZ3VyYXRpb25zKCkgbG9hZGluZyBvdXRwdXQgc3RyZWFtICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBsb2FkRWZmZWN0Q29uZmlnKG5vZGUsIGVmZmVjdHMpOworICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLmFkZChzdHJlYW0sIGRlc2MpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdERlc2MgKkF1ZGlvUG9saWN5RWZmZWN0czo6bG9hZEVmZmVjdChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIFVVSURfVEFHKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKEF1ZGlvRWZmZWN0OjpzdHJpbmdUb0d1aWQobm9kZS0+dmFsdWUsICZ1dWlkKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVygibG9hZEVmZmVjdCgpIGludmFsaWQgdXVpZCAlcyIsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgRWZmZWN0RGVzYyhyb290LT5uYW1lLCB1dWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkRWZmZWN0cyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgRUZGRUNUU19UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEVmZmVjdHMoKSBsb2FkaW5nIGVmZmVjdCAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBFZmZlY3REZXNjICplZmZlY3QgPSBsb2FkRWZmZWN0KG5vZGUpOworICAgICAgICBpZiAoZWZmZWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjpsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHM7CisgICAgbG9hZEVmZmVjdHMocm9vdCwgZWZmZWN0cyk7CisgICAgbG9hZElucHV0RWZmZWN0Q29uZmlndXJhdGlvbnMocm9vdCwgZWZmZWN0cyk7CisgICAgbG9hZFN0cmVhbUVmZmVjdENvbmZpZ3VyYXRpb25zKHJvb3QsIGVmZmVjdHMpOworCisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RWZmZWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGQ1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT1BPTElDWUVGRkVDVFNfSAorI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZRUZGRUNUU19ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEF1ZGlvUG9saWN5RWZmZWN0cyBjbGFzcworLy8gVGhpcyBjbGFzcyB3aWxsIG1hbmFnZSBhbGwgZWZmZWN0cyBhdHRhY2hlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMgaW4KKy8vIEF1ZGlvUG9saWN5U2VydmljZSBhcyBjb25maWd1cmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZi4KK2NsYXNzIEF1ZGlvUG9saWN5RWZmZWN0cyA6IHB1YmxpYyBSZWZCYXNlCit7CisKK3B1YmxpYzoKKworICAgIC8vIFRoZSBjb25zdHJ1Y3RvciB3aWxsIHBhcnNlIGF1ZGlvX2VmZmVjdHMuY29uZgorICAgIC8vIEZpcnN0IGl0IHdpbGwgbG9vayB3aGV0aGVyIHZlbmRvciBzcGVjaWZpYyBmaWxlIGV4aXN0cywKKyAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBwYXJzZSB0aGUgc3lzdGVtIGRlZmF1bHQgZmlsZS4KKwkgICAgICAgICBBdWRpb1BvbGljeUVmZmVjdHMoKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUVmZmVjdHMoKTsKKworICAgIC8vIE5PVEU6IG1ldGhvZHMgb24gQXVkaW9Qb2xpY3lFZmZlY3RzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCB0aGUgQXVkaW9Qb2xpY3lTZXJ2aWNlCisgICAgLy8gbWFpbiBtdXRleCAobUxvY2spIGhlbGQgYXMgdGhleSB3aWxsIGluZGlyZWN0bHkgY2FsbCBiYWNrIGludG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIHdoZW4KKyAgICAvLyBtYW5hZ2luZyBhdWRpbyBlZmZlY3RzLgorCisgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBlZmZlY3QgZGVzY3JpcHRvcnMgZm9yIGRlZmF1bHQgaW5wdXQgZWZmZWN0cworICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KKyAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisKKyAgICAvLyBBZGQgYWxsIGlucHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5wdXQKKyAgICAvLyBFZmZlY3RzIGFyZSBhdHRhY2hlZCBkZXBlbmRpbmcgb24gdGhlIGF1ZGlvX3NvdXJjZV90CisgICAgc3RhdHVzX3QgYWRkSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbik7CisKKyAgICAvLyBBZGQgYWxsIGlucHV0IGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIGlucHV0CisgICAgc3RhdHVzX3QgcmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKworICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IG91dHB1dCBlZmZlY3RzCisgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGF1ZGlvU2Vzc2lvbgorICAgIHN0YXR1c190IHF1ZXJ5RGVmYXVsdE91dHB1dFNlc3Npb25FZmZlY3RzKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworCisgICAgLy8gQWRkIGFsbCBvdXRwdXQgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgb3V0cHV0CisgICAgLy8gRWZmZWN0cyBhcmUgYXR0YWNoZWQgZGVwZW5kaW5nIG9uIHRoZSBhdWRpb19zdHJlYW1fdHlwZV90CisgICAgc3RhdHVzX3QgYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbik7CisKKyAgICAvLyByZWxlYXNlIGFsbCBvdXRwdXQgZWZmZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvdXRwdXQgc3RyZWFtIGFuZCBhdWRpb3Nlc3Npb24KKyAgICBzdGF0dXNfdCByZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbik7CisKK3ByaXZhdGU6CisKKyAgICAvLyBjbGFzcyB0byBzdG9yZSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWZmZWN0cyBhbmQgaXRzIHBhcmFtZXRlcnMKKyAgICAvLyBhcyBkZWZpbmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgorICAgIGNsYXNzIEVmZmVjdERlc2MgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZShzdHJkdXAobmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCkgeyB9CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBzaXplIGFuZCB2c2l6ZSBhcmUgcm91bmRlZCB1cCB0byBhbiBpbnQgYm91bmRhcnkgZm9yIGFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9yaWdTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JpZ1BhcmFtLT5wc2l6ZSArIDMpICYgfjMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmlnUGFyYW0tPnZzaXplICsgMykgJiB+Myk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpkdXBQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2Mob3JpZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZHVwUGFyYW0sIG9yaWdQYXJhbSwgb3JpZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIHBhcmFtIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGFsc28gZG9uZSBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZXMgb2YgNCBieXRlcyBvcmlnaW5hbGx5LiBJbiB0aGVvcnkgd2Ugc2hvdWxkIG1lbWNweSBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcGFyYW0gc2l6ZSwgdGhhdCBpcyB3aXRob3V0IHJvdW5kaW5nIHZzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1zLmFkZChkdXBQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0RGVzYygpIHsKKyAgICAgICAgICAgIGZyZWUobU5hbWUpOworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtUGFyYW1zLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgZnJlZShtUGFyYW1zW2tdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKKyAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOworICAgIH07CisKKyAgICAvLyBjbGFzcyB0byBzdG9yZSB2b2N0b3Igb2YgRWZmZWN0RGVzYworICAgIGNsYXNzIEVmZmVjdERlc2NWZWN0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvcigpIHt9CisgICAgICAgIC8qdmlydHVhbCovIH5FZmZlY3REZXNjVmVjdG9yKCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtRWZmZWN0cy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBtRWZmZWN0c1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gbUVmZmVjdHM7CisgICAgfTsKKworICAgIC8vIGNsYXNzIHRvIHN0b3JlIHZvY3RvciBvZiBBdWRpb0VmZmVjdHMKKyAgICBjbGFzcyBFZmZlY3RWZWN0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0VmVjdG9yKGludCBzZXNzaW9uKSA6IG1TZXNzaW9uSWQoc2Vzc2lvbiksIG1SZWZDb3VudCgwKSB7fQorICAgICAgICAvKnZpcnR1YWwqLyB+RWZmZWN0VmVjdG9yKCkge30KKworICAgICAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSBhbGwgZWZmZWN0cyBpbiBlZmZlY3QgdmVjdG9yCisgICAgICAgIHZvaWQgc2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIGNvbnN0IGludCBtU2Vzc2lvbklkOworICAgICAgICAvLyBBdWRpb1BvbGljeU1hbmFnZXIga2VlcHMgbUxvY2ssIG5vIG5lZWQgZm9yIGxvY2sgb24gcmVmZXJlbmNlIGNvdW50IGhlcmUKKyAgICAgICAgaW50IG1SZWZDb3VudDsKKyAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPm1FZmZlY3RzOworICAgIH07CisKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0lucHV0U291cmNlTmFtZXNbQVVESU9fU09VUkNFX0NOVCAtMV07CisgICAgc3RhdGljIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlTmFtZVRvRW51bShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICprU3RyZWFtTmFtZXNbQVVESU9fU1RSRUFNX0NOVCsxXTsgLy8rMSByZXF1aXJlZCBhcyBzdHJlYW1zIHN0YXJ0IGZyb20gLTEKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAvLyBQYXJzZSBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9FZmZlY3RDb25maWcoY29uc3QgY2hhciAqcGF0aCk7CisKKyAgICAvLyBMb2FkIGFsbCBlZmZlY3RzIGRlc2NyaXB0b3JzIGluIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIHN0YXR1c190IGxvYWRFZmZlY3RzKGNub2RlICpyb290LCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOworICAgIEVmZmVjdERlc2MgKmxvYWRFZmZlY3QoY25vZGUgKnJvb3QpOworCisgICAgLy8gTG9hZCBhbGwgYXV0b21hdGljIGVmZmVjdCBjb25maWd1cmF0aW9ucworICAgIHN0YXR1c190IGxvYWRJbnB1dEVmZmVjdENvbmZpZ3VyYXRpb25zKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOworICAgIHN0YXR1c190IGxvYWRTdHJlYW1FZmZlY3RDb25maWd1cmF0aW9ucyhjbm9kZSAqcm9vdCwgY29uc3QgVmVjdG9yIDxFZmZlY3REZXNjICo+JiBlZmZlY3RzKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpsb2FkRWZmZWN0Q29uZmlnKGNub2RlICpyb290LCBjb25zdCBWZWN0b3IgPEVmZmVjdERlc2MgKj4mIGVmZmVjdHMpOworCisgICAgLy8gTG9hZCBhbGwgYXV0b21hdGljIGVmZmVjdCBwYXJhbWV0ZXJzCisgICAgdm9pZCBsb2FkRWZmZWN0UGFyYW1ldGVycyhjbm9kZSAqcm9vdCwgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiYgcGFyYW1zKTsKKyAgICBlZmZlY3RfcGFyYW1fdCAqbG9hZEVmZmVjdFBhcmFtZXRlcihjbm9kZSAqcm9vdCk7CisgICAgc2l6ZV90IHJlYWRQYXJhbVZhbHVlKGNub2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjdXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpOworICAgIHNpemVfdCBncm93UGFyYW1TaXplKGNoYXIgKnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqY3VyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpOworCisgICAgLy8gcHJvdGVjdHMgYWNjZXNzIHRvIG1JbnB1dFNvdXJjZXMsIG1JbnB1dHMsIG1PdXRwdXRTdHJlYW1zLCBtT3V0cHV0U2Vzc2lvbnMKKyAgICBNdXRleCBtTG9jazsKKyAgICAvLyBBdXRvbWF0aWMgaW5wdXQgZWZmZWN0cyBhcmUgY29uZmlndXJlZCBwZXIgYXVkaW9fc291cmNlX3QKKyAgICBLZXllZFZlY3RvcjwgYXVkaW9fc291cmNlX3QsIEVmZmVjdERlc2NWZWN0b3IqID4gbUlucHV0U291cmNlczsKKyAgICAvLyBBdXRvbWF0aWMgaW5wdXQgZWZmZWN0cyBhcmUgdW5pcXVlIGZvciBhdWRpb19pb19oYW5kbGVfdAorICAgIEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgRWZmZWN0VmVjdG9yKiA+IG1JbnB1dHM7CisKKyAgICAvLyBBdXRvbWF0aWMgb3V0cHV0IGVmZmVjdHMgYXJlIG9yZ2FuaXplZCBwZXIgYXVkaW9fc3RyZWFtX3R5cGVfdAorICAgIEtleWVkVmVjdG9yPCBhdWRpb19zdHJlYW1fdHlwZV90LCBFZmZlY3REZXNjVmVjdG9yKiA+IG1PdXRwdXRTdHJlYW1zOworICAgIC8vIEF1dG9tYXRpYyBvdXRwdXQgZWZmZWN0cyBhcmUgdW5pcXVlIGZvciBhdWRpb3Nlc3Npb24gSUQKKyAgICBLZXllZFZlY3RvcjwgaW50MzJfdCwgRWZmZWN0VmVjdG9yKiA+IG1PdXRwdXRTZXNzaW9uczsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZRUZGRUNUU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWU3YmMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcigKKyAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKK3sKKyAgICByZXR1cm4gbmV3IEF1ZGlvUG9saWN5TWFuYWdlcihjbGllbnRJbnRlcmZhY2UpOworfQorCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUludGVyZmFjZSAqaW50ZXJmYWNlKQoreworICAgIGRlbGV0ZSBpbnRlcmZhY2U7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI0NDYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGFuZCBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSBjbGFzc2VzIGRlZmluZSB0aGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2VzCisvLyBiZXR3ZWVuIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgQW5kcm9pZCBnZW5lcmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIG11c3QgaW1wbGVtZW50IG1ldGhvZHMgb2YgdGhlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGNsYXNzLgorLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgdGhlIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIHRvIGNvbnRyb2wgdGhlIGFjdGl2aXR5IGFuZAorLy8gY29uZmlndXJhdGlvbiBvZiBhdWRpbyBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisvLworLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzIGluIGNoYXJnZSBvZiB0aGUgYXVkaW8gcm91dGluZyBhbmQgdm9sdW1lIGNvbnRyb2wKKy8vIHBvbGljaWVzIGZvciBhIGdpdmVuIHBsYXRmb3JtLgorLy8gVGhlIG1haW4gcm9sZXMgb2YgdGhpcyBtb2R1bGUgYXJlOgorLy8gICAtIGtlZXAgdHJhY2sgb2YgY3VycmVudCBzeXN0ZW0gc3RhdGUgKHJlbW92YWJsZSBkZXZpY2UgY29ubmVjdGlvbnMsIHBob25lIHN0YXRlLCB1c2VyIHJlcXVlc3RzLi4uKS4KKy8vICAgU3lzdGVtIHN0YXRlIGNoYW5nZXMgYW5kIHVzZXIgYWN0aW9ucyBhcmUgbm90aWZpZWQgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIgd2l0aCBtZXRob2RzIG9mIHRoZSBBdWRpb1BvbGljeUludGVyZmFjZS4KKy8vICAgLSBwcm9jZXNzIGdldE91dHB1dCgpIHF1ZXJpZXMgcmVjZWl2ZWQgd2hlbiBBdWRpb1RyYWNrIG9iamVjdHMgYXJlIGNyZWF0ZWQ6IFRob3NlIHF1ZXJpZXMKKy8vICAgcmV0dXJuIGEgaGFuZGxlciBvbiBhbiBvdXRwdXQgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCwgY29uZmlndXJlZCBhbmQgb3BlbmVkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBhbmQgdGhhdAorLy8gICBtdXN0IGJlIHVzZWQgYnkgdGhlIEF1ZGlvVHJhY2sgd2hlbiByZWdpc3RlcmluZyB0byB0aGUgQXVkaW9GbGluZ2VyIHdpdGggdGhlIGNyZWF0ZVRyYWNrKCkgbWV0aG9kLgorLy8gICBXaGVuIHRoZSBBdWRpb1RyYWNrIG9iamVjdCBpcyByZWxlYXNlZCwgYSBwdXRPdXRwdXQoKSBxdWVyeSBpcyByZWNlaXZlZCBhbmQgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGNhbiBkZWNpZGUKKy8vICAgdG8gY2xvc2Ugb3IgcmVjb25maWd1cmUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gb3RoZXIgc3RyZWFtcyB1c2luZyB0aGlzIG91dHB1dCBhbmQgY3VycmVudCBzeXN0ZW0gc3RhdGUuCisvLyAgIC0gc2ltaWxhcmx5IHByb2Nlc3MgZ2V0SW5wdXQoKSBhbmQgcHV0SW5wdXQoKSBxdWVyaWVzIHJlY2VpdmVkIGZyb20gQXVkaW9SZWNvcmQgb2JqZWN0cyBhbmQgY29uZmlndXJlIGF1ZGlvIGlucHV0cy4KKy8vICAgLSBwcm9jZXNzIHZvbHVtZSBjb250cm9sIHJlcXVlc3RzOiB0aGUgc3RyZWFtIHZvbHVtZSBpcyBjb252ZXJ0ZWQgZnJvbSBhbiBpbmRleCB2YWx1ZSAocmVjZWl2ZWQgZnJvbSBVSSkgdG8gYSBmbG9hdCB2YWx1ZQorLy8gICBhcHBsaWNhYmxlIHRvIGVhY2ggb3V0cHV0IGFzIGEgZnVuY3Rpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGluZ3MgYW5kIGN1cnJlbnQgb3V0cHV0IHJvdXRlIChkZXN0aW5hdGlvbiBkZXZpY2UpLiBJdAorLy8gICBhbHNvIG1ha2Ugc3VyZSB0aGF0IHN0cmVhbXMgYXJlIG5vdCBtdXRlZCBpZiBub3QgYWxsb3dlZCAoZS5nLiBjYW1lcmEgc2h1dHRlciBzb3VuZCBpbiBzb21lIGNvdW50cmllcykuCisvLworLy8gVGhlIHBsYXRmb3JtIHNwZWNpZmljIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzIHByb3ZpZGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkgYnkgcGxhdGZvcm0gdmVuZG9ycyAoYXMgZm9yIGxpYmF1ZGlvLnNvKQorLy8gYW5kIGlzIGxpbmtlZCB3aXRoIGxpYmF1ZGlvZmxpbmdlci5zbworCisKKy8vICAgIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQorY2xhc3MgQXVkaW9Qb2xpY3lJbnRlcmZhY2UKK3sKKworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5SW50ZXJmYWNlKCkge30KKyAgICAvLworICAgIC8vIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cworICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOworICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIHBob25lIHN0YXRlLiBWYWxpZCBwaG9uZXMgc3RhdGVzIGFyZSBkZWZpbmVkIGJ5IGF1ZGlvX21vZGVfdAorICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOworICAgIC8vIGZvcmNlIHVzaW5nIGEgc3BlY2lmaWMgZGV2aWNlIGNhdGVnb3J5IGZvciB0aGUgc3BlY2lmaWVkIHVzYWdlCisgICAgdmlydHVhbCB2b2lkIHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKKyAgICAvLyByZXRyaWV2ZSBjdXJyZW50IGRldmljZSBjYXRlZ29yeSBmb3JjZWQgZm9yIGEgZ2l2ZW4gdXNhZ2UKKyAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSA9IDA7CisgICAgLy8gc2V0IGEgc3lzdGVtIHByb3BlcnR5IChlLmcuIGNhbWVyYSBzb3VuZCBhbHdheXMgYXVkaWJsZSkKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKSA9IDA7CisgICAgLy8gY2hlY2sgcHJvcGVyIGluaXRpYWxpemF0aW9uCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7CisKKyAgICAvLworICAgIC8vIEF1ZGlvIHJvdXRpbmcgcXVlcnkgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIHJlcXVlc3QgYW4gb3V0cHV0IGFwcHJvcHJpYXRlIGZvciBwbGF5YmFjayBvZiB0aGUgc3VwcGxpZWQgc3RyZWFtIHR5cGUgYW5kIHBhcmFtZXRlcnMKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSA9IDA7CisgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RhcnRzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOworICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0b3BzIGJlaW5nIHVzZWQgYnkgY29ycmVzcG9uZGluZyBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCkgPSAwOworICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisKKyAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisKKyAgICAvLworICAgIC8vIHZvbHVtZSBjb250cm9sIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBpbml0aWFsaXNlcyBzdHJlYW0gdm9sdW1lIGNvbnZlcnNpb24gcGFyYW1ldGVycyBieSBzcGVjaWZ5aW5nIHZvbHVtZSBpbmRleCByYW5nZS4KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKKworICAgIC8vIHNldHMgdGhlIG5ldyBzdHJlYW0gdm9sdW1lIGF0IGEgbGV2ZWwgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgaW5kZXggZm9yIHRoZQorICAgIC8vIHN1cHBsaWVkIGRldmljZS4gQnkgY29udmVudGlvbiwgc3BlY2lmeWluZyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgbWVhbnMKKyAgICAvLyBzZXR0aW5nIHZvbHVtZSBmb3IgYWxsIGRldmljZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgLy8gcmV0cmlldmUgY3VycmVudCB2b2x1bWUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtIGFuZCB0aGUKKyAgICAvLyBzcGVjaWZpZWQgZGV2aWNlLiBCeSBjb252ZW50aW9uLCBzcGVjaWZ5aW5nIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBtZWFucworICAgIC8vIHF1ZXJ5aW5nIHRoZSB2b2x1bWUgb2YgdGhlIGFjdGl2ZSBkZXZpY2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKworICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgLy8gQXVkaW8gZWZmZWN0IG1hbmFnZW1lbnQKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdCA9IDA7CisKKyAgICAvL2R1bXAgc3RhdGUKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Cit9OworCisKKy8vIEF1ZGlvIFBvbGljeSBjbGllbnQgSW50ZXJmYWNlCitjbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZQoreworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKCkge30KKworICAgIC8vCisgICAgLy8gQXVkaW8gSFcgbW9kdWxlIGZ1bmN0aW9ucworICAgIC8vCisKKyAgICAvLyBsb2FkcyBhIEhXIG1vZHVsZS4KKyAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkgPSAwOworCisgICAgLy8KKyAgICAvLyBBdWRpbyBvdXRwdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAvLworCisgICAgLy8gb3BlbnMgYW4gYXVkaW8gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIHZhbHVlcyBjYW4gaW5kaWNhdGUgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcworICAgIC8vIGluIGNhc2UgdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGhhcyBubyBzcGVjaWZpYyByZXF1aXJlbWVudHMgZm9yIHRoZSBvdXRwdXQgYmVpbmcgb3BlbmVkLgorICAgIC8vIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHJlZmxlY3QgdGhlIGFjdHVhbCB2YWx1ZXMgdXNlZCBieSB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4KKyAgICAvLyBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGNoZWNrIGlmIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzIGFyZSBzdWl0YWJsZSBvciBub3QgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOworICAgIC8vIGNyZWF0ZXMgYSBzcGVjaWFsIG91dHB1dCB0aGF0IGlzIGR1cGxpY2F0ZWQgdG8gdGhlIHR3byBvdXRwdXRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkKKyAgICAvLyBhIHNwZWNpYWwgbWl4ZXIgdGhyZWFkIGluIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpID0gMDsKKyAgICAvLyBjbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworICAgIC8vIHN1c3BlbmRzIHRoZSBvdXRwdXQuIFdoZW4gYW4gb3V0cHV0IGlzIHN1c3BlbmRlZCwgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSBpcyBwbGFjZWQgaW4KKyAgICAvLyBzdGFuZGJ5IGFuZCB0aGUgQXVkaW9UcmFja3MgYXR0YWNoZWQgdG8gdGhlIG1peGVyIHRocmVhZCBhcmUgc3RpbGwgcHJvY2Vzc2VkIGJ1dCB0aGUgb3V0cHV0IG1peCBpcyBkaXNjYXJkZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOworICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CisKKyAgICAvLworICAgIC8vIEF1ZGlvIGlucHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIG9wZW5zIGFuIGF1ZGlvIGlucHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgLy8gY2xvc2VzIGFuIGF1ZGlvIGlucHV0CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSA9IDA7CisgICAgLy8KKyAgICAvLyBtaXNjIGNvbnRyb2wgZnVuY3Rpb25zCisgICAgLy8KKworICAgIC8vIHNldCBhIHN0cmVhbSB2b2x1bWUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQuIEZvciB0aGUgc2FtZSB1c2VyIHNldHRpbmcsIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgY2FuIGhhdmUgZGlmZmVyZW50IHZvbHVtZXMKKyAgICAvLyBmb3IgZWFjaCBvdXRwdXQgKGRlc3RpbmF0aW9uIGRldmljZSkgaXQgaXMgYXR0YWNoZWQgdG8uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApID0gMDsKKworICAgIC8vIGludmFsaWRhdGUgYSBzdHJlYW0gdHlwZSwgY2F1c2luZyBhIHJlcm91dGUgdG8gYW4gdW5zcGVjaWZpZWQgbmV3IG91dHB1dAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gc2VuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0byBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UuCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCkgPSAwOworICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CisKKyAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKKyAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOworCisgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOworCisgICAgLy8gbW92ZSBlZmZlY3QgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpID0gMDsKKworICAgIC8qIENyZWF0ZSBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykgPSAwOworCisgICAgLyogUmVsZWFzZSBhIHBhdGNoICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykgPSAwOworCisgICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOworCisgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCkgPSAwOworfTsKKworZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSk7CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MzljNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOworCisgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgorICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UGhvbmVTdGF0ZShzdGF0ZSk7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX21vZGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1QaG9uZVN0YXRlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGNvbmZpZyA8IDAgfHwgY29uZmlnID49IEFVRElPX1BPTElDWV9GT1JDRV9DRkdfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorICAgIGlmICh1c2FnZSA8IDAgfHwgdXNhZ2UgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Rm9yY2VVc2UodXNhZ2UpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgeworICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXQoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKKyAgICBpZiAoaW5wdXRTb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKKyAgICAgICAgaW5wdXQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dChpbnB1dFNvdXJjZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGZsYWdzKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGlucHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGlucHV0OworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRJbnB1dEVmZmVjdHMoaW5wdXQsIGlucHV0U291cmNlLCBhdWRpb1Nlc3Npb24pOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5wdXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoaW5wdXQsIHNlc3Npb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KGlucHV0LCBzZXNzaW9uKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoaW5wdXQsIHNlc3Npb24pOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhpbnB1dCk7CisgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworfQorCisvL2F1ZGlvIHBvbGljeTogdXNlIGF1ZGlvX2RldmljZV90IGFwcHJvcHJpYXRlbHkKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gRklYTUUgY2hhbmdlIHJldHVybiB0eXBlIHRvIHN0YXR1c190LCBhbmQgcmV0dXJuIE5PX0lOSVQgaGVyZQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgeworICAgICAgICAqY291bnQgPSAwOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsIG51bV9wb3J0cywgcG9ydHMsIGdlbmVyYXRpb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRBdWRpb1BvcnQocG9ydCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMsIGdlbmVyYXRpb24pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5hY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uLCBpb0hhbmRsZSwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjZhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCkBAIC0wLDAgKzEsNTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKKyNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9kZXZpY2VfY29ubmVjdGlvbl9zdGF0ZShtcEF1ZGlvUG9saWN5LCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUobXBBdWRpb1BvbGljeSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RhdGUpID49IEFVRElPX01PREVfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSIpOworCisgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgorICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+c2V0X3Bob25lX3N0YXRlKG1wQXVkaW9Qb2xpY3ksIHN0YXRlKTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBob25lU3RhdGU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1wQXVkaW9Qb2xpY3ktPnNldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UsIGNvbmZpZyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIH0KKyAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9mb3JjZV91c2UobXBBdWRpb1BvbGljeSwgdXNhZ2UpOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfb3V0cHV0KG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQorICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnN0YXJ0X291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HVigic3RvcE91dHB1dCgpIik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX291dHB1dChtcEF1ZGlvUG9saWN5LCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbXBBdWRpb1BvbGljeS0+cmVsZWFzZV9vdXRwdXQobXBBdWRpb1BvbGljeSwgb3V0cHV0KTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAorICAgIGlmIChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCisgICAgICAgIGlucHV0ID0gbXBBdWRpb1BvbGljeS0+Z2V0X2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpIDApOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorCisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcmUgcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gaW5wdXQgc291cmNlCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkSW5wdXRFZmZlY3RzKGlucHV0LCBpbnB1dFNvdXJjZSwgYXVkaW9TZXNzaW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdGFydF9pbnB1dChtcEF1ZGlvUG9saWN5LCBpbnB1dCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5zdG9wX2lucHV0KG1wQXVkaW9Qb2xpY3ksIGlucHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1wQXVkaW9Qb2xpY3ktPnJlbGVhc2VfaW5wdXQobXBBdWRpb1BvbGljeSwgaW5wdXQpOworICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIH0KKyAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKKyAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhpbnB1dCk7CisgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtcEF1ZGlvUG9saWN5LT5pbml0X3N0cmVhbV92b2x1bWUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPnNldF9zdHJlYW1fdm9sdW1lX2luZGV4X2Zvcl9kZXZpY2UobXBBdWRpb1BvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X3N0cmVhbV92b2x1bWVfaW5kZXgobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpbmRleCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZSkgeworICAgICAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X3N0cmVhbV92b2x1bWVfaW5kZXhfZm9yX2RldmljZShtcEF1ZGlvUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5nZXRfc3RyZWFtX3ZvbHVtZV9pbmRleChtcEF1ZGlvUG9saWN5LCBzdHJlYW0sIGluZGV4KTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9zdHJhdGVneV9mb3Jfc3RyZWFtKG1wQXVkaW9Qb2xpY3ksIHN0cmVhbSk7Cit9CisKKy8vYXVkaW8gcG9saWN5OiB1c2UgYXVkaW9fZGV2aWNlX3QgYXBwcm9wcmlhdGVseQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmdldF9kZXZpY2VzX2Zvcl9zdHJlYW0obXBBdWRpb1BvbGljeSwgc3RyZWFtKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gTk9fSU5JVCBoZXJlCisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+Z2V0X291dHB1dF9mb3JfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+cmVnaXN0ZXJfZWZmZWN0KG1wQXVkaW9Qb2xpY3ksIGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT51bnJlZ2lzdGVyX2VmZmVjdChtcEF1ZGlvUG9saWN5LCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbXBBdWRpb1BvbGljeS0+c2V0X2VmZmVjdF9lbmFibGVkKG1wQXVkaW9Qb2xpY3ksIGlkLCBlbmFibGVkKTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmUobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1wQXVkaW9Qb2xpY3ktPmlzX3N0cmVhbV9hY3RpdmVfcmVtb3RlbHkobXBBdWRpb1BvbGljeSwgc3RyZWFtLCBpblBhc3RNcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19zb3VyY2VfYWN0aXZlKG1wQXVkaW9Qb2xpY3ksIHNvdXJjZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBpZiAobXBBdWRpb1BvbGljeSA9PSBOVUxMKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICB9CisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyA9PSAwKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQoreworICAgIGlmIChtcEF1ZGlvUG9saWN5ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIm1wQXVkaW9Qb2xpY3kgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1wQXVkaW9Qb2xpY3ktPmlzX29mZmxvYWRfc3VwcG9ydGVkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIkhBTCBkb2VzIG5vdCBpbXBsZW1lbnQgaXNfb2ZmbG9hZF9zdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtcEF1ZGlvUG9saWN5LT5pc19vZmZsb2FkX3N1cHBvcnRlZChtcEF1ZGlvUG9saWN5LCAmaW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uIF9fdW51c2VkKQoreworICAgICpudW1fcG9ydHMgPSAwOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcyBfX3VudXNlZCwKKyAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uIF9fdW51c2VkKQoreworICAgICpudW1fcGF0Y2hlcyA9IDA7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKKworICAgIHJldHVybiBnZXRPdXRwdXQoc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBvZmZsb2FkSW5mbyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjk4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNzI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKKy8vIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXQoKQorI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInJlbW90ZSIgd2hlbiBldmFsdWF0aW5nCisvLyBhY3RpdmUgb3V0cHV0IGRldmljZXMgaW4gaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgpCisjZGVmaW5lIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKKy8vIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KKyNkZWZpbmUgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgU3RyaW5nVG9FbnVtIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQzMl90IHZhbHVlOworfTsKKworI2RlZmluZSBTVFJJTkdfVE9fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRGV2aWNlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FVWF9ESUdJVEFMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1NQRElGKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX0ZBU1QpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0Zvcm1hdE5hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKK307CisKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHRhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHRhYmxlW2ldLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyICpBdWRpb1BvbGljeU1hbmFnZXI6OmVudW1Ub1N0cmluZyhjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAodGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvQm9vbChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gKChzdHJjYXNlY21wKCJ0cnVlIiwgdmFsdWUpID09IDApIHx8IChzdHJjbXAoIjEiLCB2YWx1ZSkgPT0gMCkpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoreworICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlOiAleCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOworICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworCisgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKKyAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICB7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bU1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQorICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKKyAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKKyAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoYWRkcmVzcyk7CisgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgYWRkcmVzcyk7CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgICAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCisgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgIGlmICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobU91dHB1dHMua2V5QXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQorICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhbU91dHB1dHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSAgLy8gZW5kIGlmIGlzIG91dHB1dCBkZXZpY2UKKworICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2VzCisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIFNvcnRlZFZlY3RvciA8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0czsKKworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOworICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRldkRlc2MpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtb2R1bGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZSBkaXNjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJWQiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihhZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cywgYWRkcmVzcyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2VBbGxJbnB1dHMoKTsKKworICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IC8vIGVuZCBpZiBpcyBpbnB1dCBkZXZpY2UKKworICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUgPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBOVUxMKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBEZXZpY2VWZWN0b3IgKmRldmljZVZlY3RvcjsKKworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgIH0KKworICAgIGluZGV4ID0gZGV2aWNlVmVjdG9yLT5pbmRleE9mKGRldkRlc2MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIGludCBkZWxheU1zKQoreworICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisKKyAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsUnhQYXRjaC5jbGVhcigpOworICAgIH0KKyAgICAvLyByZWxlYXNlIFRYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOworICAgIH0KKworICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzCisgICAgLy8gdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgorICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSAmIHJ4RGV2aWNlKSB7CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIHRydWUsIGRlbGF5TXMpOworICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIGFsc28gb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCBzZXRPdXRwdXREZXZpY2UoKSB3aWxsIHRha2UgY2FyZQorICAgICAgICAvLyBvZiBpdCBkdWUgdG8gbGVnYWN5IGltcGxlbWVudGF0aW9uLiBJZiBub3QsIGNyZWF0ZSBhIHBhdGNoLgorICAgICAgICBpZiAoKGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIHR4RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pCisgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY3JlYXRlIFJYIHBhdGggYXVkaW8gcGF0Y2gKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShyeERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBvdXRwdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFJYIGRldmljZSIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKworICAgICAgICByeFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcnhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBSWCBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShyeERldmljZSwgbU91dHB1dHMpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgIH0KKyAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeworCisgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKKyAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKKyAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKKyAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcworICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQorICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKKworICAgIC8vIGFyZSB3ZSBlbnRlcmluZyBvciBzdGFydGluZyBhIGNhbGwKKyAgICBpZiAoIWlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEVudGVyaW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN0YXJ0aW5nIGEgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9EVE1GXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX1ZPSUNFX0NBTExdW2pdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiAhaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRXhpdGluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBleGl0aW5nIGEgY2FsbAorICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9EVE1GXS5tVm9sdW1lQ3VydmVbal0gPQorICAgICAgICAgICAgICAgICAgICBzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0RUTUZdW2pdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIFN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gdGVsZXBob255IGFuZCBWb0lQCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgZm9yY2UgPSB0cnVlOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKKyAgICBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworCisgICAgaW50IGRlbGF5TXMgPSAwOworICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgeworICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAorICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCisgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5TXMgPCAoaW50KWRlc2MtPm1MYXRlbmN5KjIpKSB7CisgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPm1MYXRlbmN5KjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIG1PdXRwdXRzLmtleUF0KGkpLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG1PdXRwdXRzLmtleUF0KGkpLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAvLyB0aGUgZGV2aWNlIHJldHVybmVkIGlzIG5vdCBuZWNlc3NhcmlseSByZWFjaGFibGUgdmlhIHRoaXMgb3V0cHV0CisgICAgYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAorICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgcnhEZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcnhEZXZpY2UgPSBod091dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcocnhEZXZpY2UsIGRlbGF5TXMpOworICAgIH0gZWxzZSBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgIH0KKyAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgeworICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbVBob25lU3RhdGUpOworCisgICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOworICAgIHN3aXRjaCh1c2FnZSkgeworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfQ09NTVVOSUNBVElPTiIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hFQURQSE9ORVMgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0sgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQ6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0s6CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU06CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1NZU1RFTSIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU86CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvckhETUlfU1lTVEVNX0FVRElPIiwgY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIHVzYWdlICVkIiwgdXNhZ2UpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChvdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKKyAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXQsIG5ld0RldmljZSwgMCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IGdldEFjdGl2ZUlucHV0KCk7CisgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDApIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoYWN0aXZlSW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZUlucHV0KSk7CisgICAgfQorCit9CisKK2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCit7CisgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpCit7CisgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKK30KKworLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbworLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA6IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgICAgICBpZiAoZm91bmQgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCisgICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLAorICAgICAgICAgICAgb2ZmbG9hZEluZm8pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCkgY2FsbGVkIHdpdGggTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHVzYWdlPSVkLCBjb250ZW50PSVkLCB0YWc9JXMgZmxhZ3M9JTA4eCIsCisgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT50YWdzLCBhdHRyLT5mbGFncyk7CisKKyAgICAvLyBUT0RPIHRoaXMgaXMgd2hlcmUgZmlsdGVyaW5nIGZvciBjdXN0b20gcG9saWNpZXMgKHJlcm91dGluZywgZHluYW1pYyBzb3VyY2VzKSB3aWxsIGdvCisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoYXR0cik7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBkZXZpY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChhdHRyKTsKKyAgICByZXR1cm4gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLAorICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7CisKKyAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBtVGVzdERldmljZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gbVRlc3RMYXRlbmN5TXM7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1EaXJlY3RPdXRwdXQgPyBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgOiAwKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1UZXN0U2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG1UZXN0Q2hhbm5lbHM7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbVRlc3RGb3JtYXQ7CisgICAgICAgICAgICBpZiAob2ZmbG9hZEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSAqb2ZmbG9hZEluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLG1DdXJPdXRwdXQpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSxvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XTsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorCisgICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQorCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworCisgICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0CisgICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAorICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CisgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAorICAgICAgICAgICAgIWlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAocHJvZmlsZSAhPSAwKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IGRlc2M7CisgICAgICAgICAgICAgICAgLy8gcmV1c2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc2FtcGxpbmdSYXRlID09IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xvc2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChvdXRwdXREZXNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0oYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworCisgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAoc2FtcGxpbmdSYXRlICE9IDAgJiYgc2FtcGxpbmdSYXRlICE9IGNvbmZpZy5zYW1wbGVfcmF0ZSkgfHwKKyAgICAgICAgICAgIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgeworICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGluZ1JhdGUgJWQgJWQsIgorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsTWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKK25vbl9kaXJlY3Rfb3V0cHV0OgorCisgICAgLy8gaWdub3JpbmcgY2hhbm5lbCBtYXNrIGR1ZSB0byBkb3dubWl4IGNhcGFiaWxpdHkgaW4gbWl4ZXIKKworICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAorCisgICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAorICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgorICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIGZsYWdzLCBmb3JtYXQpOworICAgIH0KKyAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0KCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsIHNhbXBsaW5nUmF0ZSAlZCwiCisgICAgICAgICAgICAiZm9ybWF0ICVkLCBjaGFubmVscyAleCwgZmxhZ3MgJXgiLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgQUxPR1YoImdldE91dHB1dCgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgorICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCisgICAgLy8gMjogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRzWzBdOworICAgIH0KKworICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAvLyBpZiBhIHZhbGlkIGZvcm1hdCBpcyBzcGVjaWZpZWQsIHNraXAgb3V0cHV0IGlmIG5vdCBjb21wYXRpYmxlCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGNvbW1vbkZsYWdzID0gcG9wY291bnQob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+IG1heENvbW1vbkZsYWdzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG1heENvbW1vbkZsYWdzID0gY29tbW9uRmxhZ3M7CisgICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXRzW2ldLCBjb21tb25GbGFncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRQcmltYXJ5ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRGbGFncyAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRGbGFnczsKKyAgICB9CisgICAgaWYgKG91dHB1dFByaW1hcnkgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0UHJpbWFyeTsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgorICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKKyAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQorICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIHVpbnQzMl90IHdhaXRNcyA9IDA7CisgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpcyBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3CisgICAgICAgICAgICAgICAgLy8gbW9kdWxlIGFuZCBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgorICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gbmV3RGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmICh3YWl0TXMgPCBsYXRlbmN5KSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCBmb3JjZSk7CisKKyAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KG5ld0RldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhlIG91dHB1dHMgaWYgc3RhcnRpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbgorICAgICAgICAvLyByb3V0aW5nCisgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgaWYgKHdhaXRNcyA+IG11dGVXYWl0TXMpIHsKKyAgICAgICAgICAgIHVzbGVlcCgod2FpdE1zIC0gbXV0ZVdhaXRNcykgKiAyICogMTAwMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7CisgICAgICAgIC8vIGRlY3JlbWVudCB1c2FnZSBjb3VudCBvZiB0aGlzIHN0cmVhbSBvbiB0aGUgb3V0cHV0CisgICAgICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgLTEpOworICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQorICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCisgICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgorICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCisgICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZmFsc2UsIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOworCisgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQorICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGN1ck91dHB1dCAhPSBvdXRwdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGN1ck91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShjdXJPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpbnQgdGVzdEluZGV4ID0gdGVzdE91dHB1dEluZGV4KG91dHB1dCk7CisgICAgaWYgKHRlc3RJbmRleCAhPSAwKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CisgICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIC8vIElmIGVmZmVjdHMgd2hlcmUgcHJlc2VudCBvbiB0aGUgb3V0cHV0LCBhdWRpb2ZsaW5nZXIgbW92ZWQgdGhlbSB0byB0aGUgcHJpbWFyeQorICAgICAgICAgICAgLy8gb3V0cHV0IGJ5IGRlZmF1bHQ6IG1vdmUgdGhlbSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQuCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgICAgIGlmIChkc3RPdXRwdXQgIT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBtUHJpbWFyeU91dHB1dCwgZHN0T3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgQUxPR1YoImdldElucHV0KCkgaW5wdXRTb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3giLAorICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb24sIGZsYWdzKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7CisKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dCgpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3IgaW5wdXRTb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICAvLyBhZGFwdCBjaGFubmVsIHNlbGVjdGlvbiB0byBpbnB1dCBzb3VyY2UKKyAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIgPSBmYWxzZTsKKyAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBpbnB1dCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKKyAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKTsKKyAgICAgICAgICAgIEFMT0dWKCJTb3VuZFRyaWdnZXIgY2FwdHVyZSBvbiBzZXNzaW9uICVkIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAocHJvZmlsZSA9PSAwKSB7CisgICAgICAgIC8vcmV0cnkgd2l0aG91dCBmbGFncworICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxvZ19mbGFncyA9IGZsYWdzOworICAgICAgICBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgaWYgKHByb2ZpbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0KCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGxvZ19mbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dCgpOiBIVyBtb2R1bGUgJXMgbm90IG9wZW5lZCIsIHByb2ZpbGUtPm1Nb2R1bGUtPm1OYW1lKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKKyAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgIChzYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAoZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8CisgICAgICAgIChjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXQoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4IiwKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICBpZiAoaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGlucHV0RGVzYy0+bVJlZkNvdW50ID0gMDsKKyAgICBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPSAxOworICAgIGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMuYWRkKHNlc3Npb24pOworICAgIGlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyID0gaXNTb3VuZFRyaWdnZXI7CisKKyAgICBhZGRJbnB1dChpbnB1dCwgaW5wdXREZXNjKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIGlucHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0YXJ0SW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyB2aXJ0dWFsIGlucHV0IGRldmljZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBpbnB1dCBkZXZpY2VzCisgICAgaWYgKCFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisKKyAgICAgICAgLy8gZm9yIGEgbm9uLXZpcnR1YWwgaW5wdXQgZGV2aWNlLCBjaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIChub24tdmlydHVhbCkgYWN0aXZlIGlucHV0CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDAgJiYgYWN0aXZlSW5wdXQgIT0gaW5wdXQpIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGFscmVhZHkgYWN0aXZlIGlucHV0IHVzZXMgQVVESU9fU09VUkNFX0hPVFdPUkQgdGhlbiBpdCBpcyBjbG9zZWQsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGFjdGl2ZSBpbnB1dCBjb250aW51ZXMgYW5kIHRoZSBuZXcgaW5wdXQgY2Fubm90IGJlIHN0YXJ0ZWQuCisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBwcmVlbXB0aW5nIGxvdy1wcmlvcml0eSBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CisgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dCksIHRydWUgLyogZm9yY2UgKi8pOworCisgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQuCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIEFVRElPX1JFTU9URV9TVUJNSVhfREVWSUNFX0FERFJFU1MpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgeworCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBBVURJT19SRU1PVEVfU1VCTUlYX0RFVklDRV9BRERSRVNTKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOworCisgICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLnJlbW92ZShzZXNzaW9uKTsKKyAgICBpZiAoaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiByZWYgY291bnQgJWQiLCBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudC0tOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2xvc2VJbnB1dChpbnB1dCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFsbElucHV0cygpIHsKKyAgICBib29sIHBhdGNoUmVtb3ZlZCA9IGZhbHNlOworCisgICAgZm9yKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7CisgICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICB9CisgICAgbUlucHV0cy5jbGVhcigpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBpZiAocGF0Y2hSZW1vdmVkKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7CisgICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWluID0gaW5kZXhNaW47CisgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXggPSBpbmRleE1heDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisKKyAgICBpZiAoKGluZGV4IDwgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4pIHx8IChpbmRleCA+IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAorICAgIGlmICghbVN0cmVhbXNbc3RyZWFtXS5tQ2FuQmVNdXRlZCkgaW5kZXggPSBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heDsKKworICAgIEFMT0dWKCJzZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCwgZGV2aWNlICUwNHgsIGluZGV4ICVkIiwKKyAgICAgICAgICBzdHJlYW0sIGRldmljZSwgaW5kZXgpOworCisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCBzZXQgZGVmYXVsdCB2YWx1ZSBhbmQKKyAgICAvLyBjbGVhciBhbGwgZGV2aWNlIHNwZWNpZmljIHZhbHVlcworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB7CisgICAgICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmNsZWFyKCk7CisgICAgfQorICAgIG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKKworICAgIC8vIGNvbXB1dGUgYW5kIGFwcGx5IHN0cmVhbSB2b2x1bWUgb24gYWxsIG91dHB1dHMgYWNjb3JkaW5nIHRvIGNvbm5lY3RlZCBkZXZpY2UKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPQorICAgICAgICAgICAgICAgIGdldERldmljZUZvclZvbHVtZShtT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2UoKSk7CisgICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKGRldmljZSA9PSBjdXJEZXZpY2UpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIGluZGV4LCBtT3V0cHV0cy5rZXlBdChpKSwgY3VyRGV2aWNlKTsKKyAgICAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChpbmRleCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShnZXRTdHJhdGVneShzdHJlYW0pLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKworICAgICppbmRleCA9ICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSk7CisgICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dEZvckVmZmVjdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCBzdWl0YWJsZSBmb3IgZ2xvYmFsIGVmZmVjdHMuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogQW4gb2ZmbG9hZGVkIG91dHB1dC4gSWYgdGhlIGVmZmVjdCBlbmRzIHVwIG5vdCBiZWluZyBvZmZsb2FkYWJsZSwKKyAgICAvLyAgICBBdWRpb0ZsaW5nZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSB0cmFjayBhbmQgdGhlIG9mZmxvYWRlZCBvdXRwdXQKKyAgICAvLyAgICB3aWxsIGJlIGNsb3NlZCBjYXVzaW5nIHRoZSBlZmZlY3QgdG8gYmUgbW92ZWQgdG8gYSBQQ00gb3V0cHV0LgorICAgIC8vIDI6IEEgZGVlcCBidWZmZXIgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0T2ZmbG9hZGVkID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0c1slenVdIGZsYWdzICV4IiwgaSwgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dERlZXBCdWZmZXIgPSBvdXRwdXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0T2ZmbG9hZGVkICVkIG91dHB1dERlZXBCdWZmZXIgJWQiLAorICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCwgb3V0cHV0RGVlcEJ1ZmZlcik7CisgICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRPZmZsb2FkZWQ7CisgICAgfQorICAgIGlmIChvdXRwdXREZWVwQnVmZmVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERlZXBCdWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dHNbMF07Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBmeCAlcyBmbGFncyAleCIsCisgICAgICAgICAgb3V0cHV0LCAoZGVzYyA9PSBOVUxMKSA/ICJ1bnNwZWNpZmllZCIgOiBkZXNjLT5uYW1lLCAgKGRlc2MgPT0gTlVMTCkgPyAwIDogZGVzYy0+ZmxhZ3MpOworCisgICAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgeworICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOworICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAorICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKKyAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKKyAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneTsKKyAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKKworICAgIG1FZmZlY3RzLmFkZChpZCwgZWZmZWN0RGVzYyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKKworICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBtZW1vcnkgJWQgdG90YWwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGlkLCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBtRWZmZWN0cy5yZW1vdmVJdGVtKGlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gc2V0RWZmZWN0RW5hYmxlZChtRWZmZWN0cy52YWx1ZUF0KGluZGV4KSwgZW5hYmxlZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkID09IGVmZmVjdERlc2MtPm1FbmFibGVkKSB7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKCVzKSBlZmZlY3QgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgZW5hYmxlZD8idHJ1ZSI6ImZhbHNlIiwgZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID4gZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCisgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIChmbG9hdCllZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLzEwKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCAtPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0KKyAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgICAgICgoZWZmZWN0RGVzYy0+bURlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgPT0gMCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgJXMgZW5hYmxlZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGVmZmVjdERlc2MtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IChpbnQpc291cmNlIHx8CisgICAgICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gJiYKKyAgICAgICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKQorICAgICAgICAgICAgICYmIChpbnB1dERlc2NyaXB0b3ItPm1SZWZDb3VudCA+IDApKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLCBtUHJpbWFyeU91dHB1dCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQaG9uZSBzdGF0ZTogJWRcbiIsIG1QaG9uZVN0YXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCisgICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKKyAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlczpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gQXZhaWxhYmxlIGlucHV0IGRldmljZXM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUh3TW9kdWxlc1tpXS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1PdXRwdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIG1JbnB1dHMua2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIG1TdHJlYW1zW2ldLmR1bXAoZmQpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKKyAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIG1FZmZlY3RzLmtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICBtRWZmZWN0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9QYXRjaGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1BhdGNoZXNbaV0tPmR1bXAoZmQsIDIsIGkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCisvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5CisvLyBvZiB0aGUgc3lzdGVtLgorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCit7CisgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKKyAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lIiBQUklkNjQgIiB1cywgaGFzX3ZpZGVvPSVkIiwKKyAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKKyAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSwgb2ZmbG9hZEluZm8uYml0X3JhdGUsIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzLAorICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8pOworCisgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAorICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7CisgICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgorICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCisgICAgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL1RPRE86IGVuYWJsZSBhdWRpbyBvZmZsb2FkaW5nIHdpdGggdmlkZW8gd2hlbiByZWFkeQorICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8pCisgICAgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQorICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgeworICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQorICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCisgICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KKyAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKKyAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICBpZiAoaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCisgICAgLy8gQVVESU9fREVWSUNFX05PTkUKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKKyAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCit7CisgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOworICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fcG9ydHMgPSAwOworICAgIH0KKworICAgIHNpemVfdCBwb3J0c1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwb3J0c01heCA9ICpudW1fcG9ydHM7CisgICAgKm51bV9wb3J0cyA9IDA7CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUlucHV0cy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0cyA9IDA7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0c1tpXS0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0cysrOworICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbnVtT3V0cHV0czsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSBnb3QgJXp1IHBvcnRzIG5lZWRlZCAlZCIsIHBvcnRzV3JpdHRlbiwgKm51bV9wb3J0cyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKK3sKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZyb21JZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXREZXNjOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0RnJvbUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0RGVzYzsKK30KKworc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRm9yRGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAoreworICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKK3sKKyAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAobUh3TW9kdWxlc1tpXS0+bU5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGU7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkKK3sKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICByZXR1cm4gZGV2aWNlcyAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKQoreworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBwcmltYXJ5SGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpLT5tUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bU1vZHVsZS0+bUhhbmRsZSA9PSBwcmltYXJ5SGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VzIHw9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQoreworICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkiKTsKKworICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKworICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKKyAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIG9ubHkgb25lIHNvdXJjZSBwZXIgYXVkaW8gcGF0Y2ggc3VwcG9ydGVkIGZvciBub3cKKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzb3VyY2UgaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpOworI2lmIExPR19OREVCVUcgPT0gMAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNpbmsgJWQ6IGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIGksIHBhdGNoLT5zaW5rc1tpXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0ucm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAqaGFuZGxlID0gMDsKKyAgICB9CisKKyAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwiZHVwbGljYXRlZCBvdXRwdXQgJWQgaW4gc291cmNlIGluIHBvcnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBtaXggdG8gZGV2aWNlcyBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBtaXggdG8gbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgbWl4IGJ1dCBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dCBkZXZpY2Ugbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwcm9maWxlIG5vdCBzdXBwb3J0ZWQgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlcy50eXBlcygpLCB0cnVlLCAwLCBoYW5kbGUpOworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0T3V0cHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0T3V0cHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgLy8gaW5wdXQgZGV2aWNlIHRvIGlucHV0IG1peCBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBvbmx5IG9uZSBzaW5rIHN1cHBvcnRlZCB3aGVuIGNvbm5lY3RpbmcgYW4gaW5wdXQgZGV2aWNlIHRvIGEgbWl4CisgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc2lua3NbMF0uaWQgIT0gcGF0Y2gtPnNpbmtzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+bURldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tRGV2aWNlVHlwZSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPm1EZXZpY2VUeXBlLCB0cnVlLCBoYW5kbGUpOworICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgLy8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc291cmNlc1swXS5pZCAhPSBwYXRjaC0+c291cmNlc1swXS5pZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5CisgICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOworICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgZGV2aWNlIGJ1dCBvbmUgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOworICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOworCisgICAgICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUgIT0gc2lua0RldmljZURlc2MtPm1Nb2R1bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0ZWQgZGV2aWNlcyBhY3Jvc3MgSFcgbW9kdWxlcworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMV0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdQYXRjaCwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQoreworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZwYXRjaERlc2MtPm1QYXRjaDsKKyAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIHRydWUgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGlucHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAobnVtX3BhdGNoZXMgPT0gTlVMTCB8fCAoKm51bV9wYXRjaGVzICE9IDAgJiYgcGF0Y2hlcyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgbnVtX3BhdGNoZXMgJWQgcGF0Y2hlcyAlcCBhdmFpbGFibGUgcGF0Y2hlcyAlenUiLAorICAgICAgICAgICpudW1fcGF0Y2hlcywgcGF0Y2hlcywgbUF1ZGlvUGF0Y2hlcy5zaXplKCkpOworICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wYXRjaGVzID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgcGF0Y2hlc1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwYXRjaGVzTWF4ID0gKm51bV9wYXRjaGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgaSAgPCBtQXVkaW9QYXRjaGVzLnNpemUoKSAmJiBwYXRjaGVzV3JpdHRlbiA8IHBhdGNoZXNNYXg7IGkrKykgeworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuXSA9IG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaDsKKyAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IG1BdWRpb1BhdGNoZXNbaV0tPm1IYW5kbGU7CisgICAgICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzKCkgcGF0Y2ggJXp1IG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICAgIGksIG1BdWRpb1BhdGNoZXNbaV0tPm1QYXRjaC5udW1fc291cmNlcywgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zaW5rcyk7CisgICAgfQorICAgICpudW1fcGF0Y2hlcyA9IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOworCisgICAgKmdlbmVyYXRpb24gPSBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBnb3QgJXp1IHBhdGNoZXMgbmVlZGVkICVkIiwgcGF0Y2hlc1dyaXR0ZW4sICpudW1fcGF0Y2hlcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkiKTsKKworICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkgb24gcG9ydCBoYW5kbGUgJWQiLCBjb25maWctPmlkKTsKKyAgICAvLyBPbmx5IHN1cHBvcnQgZ2FpbiBjb25maWd1cmF0aW9uIGZvciBub3cKKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAhPSBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZzsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IG91dHB1dERlc2M7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gZ2V0SW5wdXRGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gaW5wdXREZXNjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKKyAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlRGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGRldmljZURlc2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOworICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKKyAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZiYWNrdXBDb25maWcpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpCit7CisgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDwgKHNzaXplX3QpbUF1ZGlvUGF0Y2hlcy5zaXplKCk7IGkrKykgIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgLy8gcmVsZWFzZUF1ZGlvUGF0Y2goKSByZW1vdmVzIHRoZSBwYXRjaCBmcm9tIG1BdWRpb1BhdGNoZXMKKyAgICAgICAgICAgIGlmIChyZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICpkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisKKyAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWRkKCpzZXNzaW9uLCAqaW9IYW5kbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbigpIHNlc3Npb24gJWQgbm90IHJlZ2lzdGVyZWQiLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMucmVtb3ZlSXRlbShzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgYWxyZWFkeSBpbiIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgbUF1ZGlvUGF0Y2hlcy5hZGQoaGFuZGxlLCBwYXRjaCk7CisgICAgQUxPR1YoImFkZEF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBzb3VyY2UgaGFuZGxlICVkIgorICAgICAgICAgICAgInNpbmsgaGFuZGxlICVkIiwKKyAgICAgICAgICBoYW5kbGUsIHBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcywgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3MsCisgICAgICAgICAgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygicmVtb3ZlQXVkaW9QYXRjaCgpIHBhdGNoICVkIG5vdCBpbiIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIiwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCktPm1BZlBhdGNoSGFuZGxlKTsKKyAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6bmV4dFVuaXF1ZUlkKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmbUF1ZGlvUG9ydEdlbmVyYXRpb24pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQorICAgIDoKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIFRocmVhZChmYWxzZSksCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1QcmltYXJ5T3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkwKSwKKyAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKKyAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCgwKSwgbVRvdGFsRWZmZWN0c01lbW9yeSgwKSwKKyAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisgICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKSwKKyAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKQoreworICAgIG1VaWRDYWNoZWQgPSBnZXR1aWQoKTsKKyAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgeworICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgIGlmIChsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOworICAgICAgICAgICAgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKKworICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kKKyAgICBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7CisKKyAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAvLyBvdXRwdXREZXZpY2VUeXBlcworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUpOworCisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChvdXRQcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBpbnB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcyB0byB2YWxpZGF0ZQorICAgICAgICAvLyBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIGxpc3QKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBpblByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKKworICAgICAgICAgICAgaWYgKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIklucHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgorICAgICAgICAgICAgLy8gaW5wdXREZXZpY2VUeXBlcworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSk7CisKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bUlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOworCisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gaW5wdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoaW5Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPj0gMCkgJiYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbUh3TW9kdWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPm1OYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUlkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCisgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgeworICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7CisgICAgfQorCisgICAgQUxPR0VfSUYoKG1QcmltYXJ5T3V0cHV0ID09IDApLCAiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKKworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dCwgb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworCisgICAgICAgIG1UZXN0RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgICAgICBtVGVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBtVGVzdENoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgbVRlc3RMYXRlbmN5TXMgPSAwOworICAgICAgICBtQ3VyT3V0cHV0ID0gMDsKKyAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RPdXRwdXRzW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCIpOworICAgICAgICBydW4oYnVmZmVyLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICB9CisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorfQorCitBdWRpb1BvbGljeU1hbmFnZXI6On5BdWRpb1BvbGljeU1hbmFnZXIoKQoreworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgZXhpdCgpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgIH0KKyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChtSW5wdXRzLmtleUF0KGkpKTsKKyAgIH0KKyAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNsZWFyKCk7CisgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNsZWFyKCk7CisgICBtT3V0cHV0cy5jbGVhcigpOworICAgbUlucHV0cy5jbGVhcigpOworICAgbUh3TW9kdWxlcy5jbGVhcigpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtUHJpbWFyeU91dHB1dCA9PSAwKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsKK30KKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dGhyZWFkTG9vcCgpCit7CisgICAgQUxPR1YoImVudGVyaW5nIHRocmVhZExvb3AoKSIpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIFN0cmluZzggY29tbWFuZDsKKyAgICAgICAgaW50IHZhbHVlSW50OworICAgICAgICBTdHJpbmc4IHZhbHVlOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgbWlsbGlzZWNvbmRzKDUwKSk7CisKKyAgICAgICAgY29tbWFuZCA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihjb21tYW5kKTsKKworICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgIHZhbHVlSW50ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJUZXN0IGNvbW1hbmQgJXMgcmVjZWl2ZWQiLCBjb21tYW5kLnN0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzggdGFyZ2V0OworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0YXJnZXQiKSwgdGFyZ2V0KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHRhcmdldCA9ICJNYW5hZ2VyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X291dHB1dCIpKTsKKyAgICAgICAgICAgICAgICBtQ3VyT3V0cHV0ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9kaXJlY3QiKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gInRydWUiKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSk7CisgICAgICAgICAgICAgICAgbVRlc3RJbnB1dCA9IHZhbHVlSW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9mb3JtYXQiKSk7CisgICAgICAgICAgICAgICAgaW50IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiUENNIDE2IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIlBDTSA4IGJpdHMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ29tcHJlc3NlZCBNUDMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9NUDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Rm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiZm9ybWF0IiksIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpKTsKKyAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJDaGFubmVscyBTdGVyZW8iKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDaGFubmVscyBNb25vIikgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RDaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgiY2hhbm5lbHMiKSwgY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfcmVvcGVuIikpOworCisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtUHJpbWFyeU91dHB1dCk7CisKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gb3V0cHV0RGVzYy0+bU1vZHVsZS0+bUhhbmRsZTsKKworICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obVByaW1hcnlPdXRwdXQpOworCisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobW9kdWxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUHJpbWFyeU91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChtUHJpbWFyeU91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZXhpdCgpCit7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Cit9CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKy8vIC0tLQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKQoreworICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKKyAgICBvdXRwdXREZXNjLT5tSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpCit7CisgICAgaW5wdXREZXNjLT5tSW9IYW5kbGUgPSBpbnB1dDsKKyAgICBpbnB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOworICAgIG1JbnB1dHMuYWRkKGlucHV0LCBpbnB1dERlc2MpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCisgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgeworICAgIC8vIGxvb2sgZm9yIGEgbWF0Y2ggb24gdGhlIGdpdmVuIGFkZHJlc3Mgb24gdGhlIGFkZHJlc3NlcyBvZiB0aGUgb3V0cHV0czoKKyAgICAvLyBmaW5kIHRoZSBhZGRyZXNzIGJ5IGZpbmRpbmcgdGhlIHBhdGNoIHRoYXQgbWFwcyB0byB0aGlzIG91dHB1dAorICAgIHNzaXplX3QgcGF0Y2hJZHggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoZGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAvL0FMT0dWKCIgICAgaW5zcGVjdGluZyBvdXRwdXQgJWQgKHBhdGNoICVkKSBmb3Igc3VwcG9ydGVkIGRldmljZT0weCV4IiwKKyAgICAvLyAgICAgICAgb3V0cHV0SWR4LCBwYXRjaElkeCwgIGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKyAgICBpZiAocGF0Y2hJZHggPj0gMCkgeworICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hJZHgpOworICAgICAgICBjb25zdCBpbnQgbnVtU2lua3MgPSBwYXRjaERlc2MtPm1QYXRjaC5udW1fc2lua3M7CisgICAgICAgIGZvciAoc3NpemVfdCBqPTA7IGogPCBudW1TaW5rczsgaisrKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGF0Y2hBZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzW2pdLmV4dC5kZXZpY2UuYWRkcmVzczsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChwYXRjaEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLCAgcGF0Y2hEZXNjLT5tUGF0Y2guc2lua3Nbal0uZXh0LmRldmljZS5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+bURldmljZVR5cGU7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcworICAgIGRldkRlc2MtPmNsZWFyQ2FwYWJpbGl0aWVzKCk7CisKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgY2hlY2tpbmcgYWRkcmVzcyBtYXRjaCBkdWUgdG8gZGV2aWNlIDB4JXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiAgZm91bmQgJWQgcHJvZmlsZXMsICVkIG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIG91dHB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IG91dHB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgb3V0cHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBwcm9maWxlOiBzYXZlIHRoZSBzYW1wbGUgcmF0ZXMsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHByb2ZpbGUgaW4gb3VyIGRldmljZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSk7CisgICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAorICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCisgICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKKyAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGZvcm1hdHMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIG1pc3NpbmcgcGFyYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCB8fCBwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCAwLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1MYXRlbmN5ID0gZGVzYy0+bUxhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQsIGR1cE91dHB1dERlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkdXBsaWNhdGVkT3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gZHVwIG91dHB1dCBmb3IgJWQgYW5kICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGV2aWNlLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBvdXRwdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgICghKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgPT0gZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIGlucHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBpbnB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pZHggPSAwOyBtb2R1bGVfaWR4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIG1vZHVsZV9pZHgpOworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQobUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgaW5wdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wZW4gaW5wdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBpbnB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IHByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgaW5wdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQorICAgICAgICAgICAgc2l6ZV90IGlucHV0X2luZGV4OworICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5wdXRfaW5kZXggIT0gbUlucHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAweCVYIHdpdGggcGFyYW1zICVzIiwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dCwgU3RyaW5nOChwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcworICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7CisgICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgZm9ybWF0cyAlcyIsIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRJbkNoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBtaXNzaW5nIHBhcmFtIik7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dChpbnB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCisKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERpc2Nvbm5lY3QKKyAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOworICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KKyAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2luZGV4ID0gMDsgbW9kdWxlX2luZGV4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pbmRleCsrKSB7CisgICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgeworICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLy8gZW5kIGRpc2Nvbm5lY3QKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOworCisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZU91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKKyAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKKyAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFzIGFsbCBhY3RpdmUgdHJhY2tzIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IHdpbGwgYmUgZGVsZXRlZCwKKyAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCisgICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQoZHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOworICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCit7CisgICAgQUxPR1YoImNsb3NlSW5wdXQoJWQpIiwgaW5wdXQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KKworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworfQorCitTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gb3Blbk91dHB1dHMpCit7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworCisgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJWQgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRzOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3sKKyAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKHNyY091dHB1dHNbaV0pOworICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBzcmNPdXRwdXRzW2ldKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBzcmNPdXRwdXRzW2ldLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBmeE91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG1vdmVkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChlZmZlY3REZXNjLT5tU2Vzc2lvbiA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyAhPSBmeE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobW92ZWQuaW5kZXhPZihlZmZlY3REZXNjLT5tSW8pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3ZpbmcgZWZmZWN0ICVkIHRvIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0cy5rZXlBdChpKSwgZnhPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgZWZmZWN0RGVzYy0+bUlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVkLmFkZChlZmZlY3REZXNjLT5tSW8pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1JbyA9IGZ4T3V0cHV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQoreworICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBMmRwT3V0cHV0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgb3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQoreworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQgPSBnZXRBMmRwT3V0cHV0KCk7CisgICAgaWYgKGEyZHBPdXRwdXQgPT0gMCkgeworICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBpc1Njb0Nvbm5lY3RlZCA9CisgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgIT0gMDsKKyAgICAvLyBzdXNwZW5kIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKE5PVCBhbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQgJiYKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIGZvciBjb21tdW5pY2F0aW9uIHx8IGZvciByZWNvcmQgaXMgU0NPKSkpIHx8CisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgcmluZ2luZyB8fCBpbiBjYWxsKQorICAgIC8vCisgICAgLy8gcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKKyAgICAvLyAgICAgIChBbHJlYWR5IHN1c3BlbmRlZCkgJiYKKyAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkIHx8CisgICAgLy8gICAgICAgKGZvcmNlZCB1c2FnZSBOT1QgZm9yIGNvbW11bmljYXRpb24gJiYgTk9UIGZvciByZWNvcmQgaXMgU0NPKSkpICYmCisgICAgLy8gICAgICAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcgJiYgTk9UIGluIGNhbGwpCisgICAgLy8KKyAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgaWYgKCghaXNTY29Db25uZWN0ZWQgfHwKKyAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgJiYKKyAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKKyAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVzdG9yZU91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGlzU2NvQ29ubmVjdGVkICYmCisgICAgICAgICAgICAgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHx8CisgICAgICAgICAgICAgKChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHx8CisgICAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN1c3BlbmRPdXRwdXQoYTJkcE91dHB1dCk7CisgICAgICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpLCBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgorICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKKyAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQorICAgIC8vIDM6IHRoZSBzdHJhdGVneSBmb3IgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYnV0IG5vdCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIHRoZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKKyAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCisgICAgLy8gNTogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCisgICAgLy8gNjogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKKyAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgorICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9QSE9ORSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRFRNRikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOworCisgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKKyAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCisgICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KKyAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlczsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGRldmljZXMgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZXMsIG1PdXRwdXRzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKKyAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCisgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgeworICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoIChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlIik7CisgICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgorICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCisgICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0CisgICAgY2FzZSBBVURJT19TVFJFQU1fVFRTOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfTUVESUE7CisgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpIHsKKyAgICAvLyBmbGFncyB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfUEhPTkU7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRFRNRjsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT047CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfTUVESUE7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHN3aXRjaChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK3sKKyAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKworICAgIGlmIChmcm9tQ2FjaGUpIHsKKyAgICAgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZyb20gY2FjaGUgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsCisgICAgICAgICAgICAgIHN0cmF0ZWd5LCBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldKTsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV07CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgc3dpdGNoIChzdHJhdGVneSkgeworCisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBVURJT19TVFJFQU1fTVVTSUMsCisgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQorICAgICAgICAgICAgLy8gICB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90CisgICAgICAgICAgICAvLyAgIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKQorICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIChvciBoYXMgcmVjZW50bHkgcGxheWVkKSwgdXNlIHRoZSBzYW1lIGRldmljZQorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCisgICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9EVE1GOgorICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gb2ZmIGNhbGwsIERUTUYgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBNRURJQSBzdHJhdGVneQorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcworICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CisgICAgICAgIC8vIEZvcmNlIHVzZSBvZiBvbmx5IGRldmljZXMgb24gcHJpbWFyeSBvdXRwdXQgaWY6CisgICAgICAgIC8vIC0gaW4gY2FsbCBBTkQKKyAgICAgICAgLy8gICAtIGNhbm5vdCByb3V0ZSBmcm9tIHZvaWNlIGNhbGwgUlggT1IKKyAgICAgICAgLy8gICAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wIGFuZCBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgaWYgKCgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKCh0eERldmljZSAmIGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChod091dHB1dERlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5tSGFsVmVyc2lvbiA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApKSkgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieSBvcmRlcgorICAgICAgICAvLyBvZiBwcmlvcml0eQorICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkgJiYgIW1BMmRwU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBpZiAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIFNUUkFURUdZX1BIT05FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KKyAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0QTJkcE91dHB1dCgpICE9IDApICYmICFtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9QSE9ORSwgRk9SQ0VfU1BFQUtFUiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgorCisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKKyAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisgICAgICAgIC8vIGV4Y2VwdDoKKyAgICAgICAgLy8gICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKyAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisKKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIHNlY29uZCBkZXZpY2UgdXNlZCBmb3Igc29uaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXZpY2UgdXNlZCBieSBtZWRpYSBzdHJhdGVneQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfTUVESUE6IHsKKyAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSAmJiAhbUEyZHBTdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIGF1eCBkaWdpdGFsIChlLmcuIEhETUkpCisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisgICAgICAgIGludCBkZXZpY2UzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgLy8gQVJDLCBTUERJRiBhbmQgQVVYX0xJTkUgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzLgorICAgICAgICAgICAgZGV2aWNlMyA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUERJRik7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlMiB8PSBkZXZpY2UzOworICAgICAgICAvLyBkZXZpY2UgaXMgREVWSUNFX09VVF9TUEVBS0VSIGlmIHdlIGNvbWUgZnJvbSBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTiBvcgorICAgICAgICAvLyBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBBVURJT19ERVZJQ0VfTk9ORSBvdGhlcndpc2UKKyAgICAgICAgZGV2aWNlIHw9IGRldmljZTI7CisKKyAgICAgICAgLy8gSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9PQorICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgIGRldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9NRURJQSIpOworICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSB1bmtub3duIHN0cmF0ZWd5OiAlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKHBvcGNvdW50KGRldmljZSkgPj0gMik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKKworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZG9NdXRlKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKKyAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKKyAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChqKTsKKyAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlZCAoY3VyRGV2aWNlICUwNHgpIG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlLCBjdXJPdXRwdXQpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBjdXJPdXRwdXQsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgdGltZSB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcHJvY2VzcyBhIGJ1ZmZlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gb25lIGJ1ZmZlciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgZGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bworICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7CisgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIC8vIGRvIHRlbXBNdXRlIHVubXV0ZSBhZnRlciB0d2ljZSB0aGUgbXV0ZSB3YWl0IHRpbWUKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyAqMiwgZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBQQ00gb3V0cHV0IGJ1ZmZlcnMgdG8gZW1wdHkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZAorICAgIGlmIChtdXRlV2FpdE1zID4gZGVsYXlNcykgeworICAgICAgICBtdXRlV2FpdE1zIC09IGRlbGF5TXM7CisgICAgICAgIHVzbGVlcChtdXRlV2FpdE1zICogMTAwMCk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCit7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIG91dHB1dCAlZCBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgb3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKKworICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQxLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tT3V0cHV0Mi0+bUlvSGFuZGxlLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpID09IDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKKyAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgcHJldkRldmljZSAlMDR4IiwgcHJldkRldmljZSk7CisKKyAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgfQorICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworCisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKKyAgICAvLyAgLSB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBBVURJT19ERVZJQ0VfTk9ORQorICAgIC8vICAtIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlIGFuZCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucworICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJiAhZm9yY2UpIHsKKyAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHNldHRpbmcgc2FtZSBkZXZpY2UgJTA0eCBvciBudWxsIGRldmljZSBmb3Igb3V0cHV0ICVkIiwgZGV2aWNlLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisKKyAgICAvLyBkbyB0aGUgcm91dGluZworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgcmVzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBkZWxheU1zLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IChhZGRyZXNzID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKQorICAgICAgICAgICAgICAgIDogbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAwOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgorICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluZm9ybSBhbGwgaW5wdXQgYXMgd2VsbAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKCFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgaW5wdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogaW5mb3JtIGlucHV0ICVkIG9mIGRldmljZTolZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIGlucHV0Q21kLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSxkZXZpY2UpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q21kLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgc3RyZWFtIHZvbHVtZXMgYWNjb3JkaW5nIHRvIG5ldyBkZXZpY2UKKyAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIGRlbGF5TXMpOworCisgICAgcmV0dXJuIG11dGVXYWl0TXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIH0KKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCJyZXNldE91dHB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICBvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOworICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgeworICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CisgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCisgICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5tSXNTb3VuZFRyaWdnZXIpIHsKKyAgICAgICAgICAgICAgICBwYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKKyAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4OworICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBBTE9HVigic2V0SW5wdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleDsKKyAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgQUxPR1YoInJlc2V0SW5wdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSAwOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3A8QXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIC8vIENob29zZSBhbiBpbnB1dCBwcm9maWxlIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2FwdHVyZSBwYXJhbWV0ZXJzOiBzZWxlY3QgdGhlIGZpcnN0IGF2YWlsYWJsZQorICAgIC8vIHByb2ZpbGUgc3VwcG9ydGluZyBhbGwgcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCisgICAgeworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIC8vIHByb2ZpbGUtPmxvZygpOworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX291dHB1dF9mbGFnc190KSBmbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCit7CisgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKKyAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7CisgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAvLyBBbGxvdyBvbmx5IHVzZSBvZiBkZXZpY2VzIG9uIHByaW1hcnkgaW5wdXQgaWYgaW4gY2FsbCBhbmQgSEFMIGRvZXMgbm90IHN1cHBvcnQgcm91dGluZworICAgICAgICAvLyB0byB2b2ljZSBjYWxsIHBhdGguCisgICAgICAgIGlmICgobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgorICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpID09IDApIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKKyAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgorICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CisgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEFMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgeworICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKKyAgICByZXR1cm4gKChkZXZpY2UgJiBBUE1fQVVESU9fREVWSUNFX01BVENIX0FERFJFU1NfQUxMKSAhPSAwKTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBY3RpdmVJbnB1dChib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXRfZGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChpbnB1dF9kZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fCAhaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXRfZGVzY3JpcHRvci0+bURldmljZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0Cit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5tUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiBmb3JjaW5nIGEgcm91dGUgdXBkYXRlIGFuZCBubyB0cmFjayBpcyBhY3RpdmUgb24gYW4gb3V0cHV0LgorICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIHJldHVybmVkIGNhdGVnb3J5IGlzIG5vdCBpbXBvcnRhbnQuCisgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgfSBlbHNlIGlmIChwb3Bjb3VudChkZXZpY2UpID4gMSkgeworICAgICAgICAvLyBNdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uIGlzIGVpdGhlcjoKKyAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCisgICAgICAgIC8vICAtIG9uZSBBMkRQIGRldmljZSArIGFub3RoZXIgZGV2aWNlOiBoYXBwZW5zIHdpdGggZHVwbGljYXRlZCBvdXRwdXQuIEluIHRoaXMgY2FzZQorICAgICAgICAvLyByZXRhaW4gdGhlIGRldmljZSBvbiB0aGUgQTJEUCBvdXRwdXQgYXMgdGhlIG90aGVyIG11c3Qgbm90IGNvcnJlc3BvbmQgdG8gYW4gYWN0aXZlCisgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCisgICAgICAgIC8vICAtIEhETUktQ0VDIHN5c3RlbSBhdWRpbyBtb2RlIG9ubHkgb3V0cHV0OiBnaXZlIHByaW9yaXR5IHRvIGF2YWlsYWJsZSBpdGVtIGluIG9yZGVyLgorICAgICAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BESUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qU1BFQUtFUl9TQUZFIGlzIGFuIGFsaWFzIG9mIFNQRUFLRVIgZm9yIHB1cnBvc2VzIG9mIHZvbHVtZSBjb250cm9sKi8KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKQorICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisKKyAgICBBTE9HV19JRihwb3Bjb3VudChkZXZpY2UpICE9IDEsCisgICAgICAgICAgICAiZ2V0RGV2aWNlRm9yVm9sdW1lKCkgaW52YWxpZCBkZXZpY2UgY29tYmluYXRpb246ICUwOHgiLAorICAgICAgICAgICAgZGV2aWNlKTsKKworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6ZGV2aWNlX2NhdGVnb3J5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ2F0ZWdvcnkoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBzd2l0Y2goZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSkpIHsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRTsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfTElORToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOgorICAgICAgICAvKlVTQj8gIFJlbW90ZSBzdWJtaXg/Ki8KKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKKyAgICB9Cit9CisKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6dm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgaW50IGluZGV4SW5VaSkKK3sKKyAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSBnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpOworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5tVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldOworCisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCisgICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVk9MTUlOXS5tSW5kZXg7CisgICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHN0cmVhbURlc2MubUluZGV4TWluKSkgLworICAgICAgICAgICAgKHN0cmVhbURlc2MubUluZGV4TWF4IC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pOworCisgICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcworICAgIGludCBzZWdtZW50ID0gMDsKKyAgICBpZiAodm9sSWR4IDwgY3VydmVbVk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTFdLm1JbmRleCkgeworICAgICAgICBzZWdtZW50ID0gMDsKKyAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUyXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDE7CisgICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVk9MTUFYXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDI7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7CisKKyAgICBmbG9hdCBhbXBsaWZpY2F0aW9uID0gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCisKKyAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSBhbXBsPSUuNWYiLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgZGVjaWJlbHMsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uLAorICAgICAgICAgICAgYW1wbGlmaWNhdGlvbik7CisKKyAgICByZXR1cm4gYW1wbGlmaWNhdGlvbjsKK30KKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7CisgICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Cit9OworCisvLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcworLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KKy8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgorLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgorCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKKyAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQorfTsKKworY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0geworICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAorICAgICAgICAgICAgKkF1ZGlvUG9saWN5TWFuYWdlcjo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX01VU0lDCisgICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0FMQVJNCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIHNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCisgICAgICAgIHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUKKyAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgorICAgICAgICBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1RUUworICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgbVN0cmVhbXNbaV0ubVZvbHVtZUN1cnZlW2pdID0KKyAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW2ldW2pdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKKyAgICBpZiAobVNwZWFrZXJEcmNFbmFibGVkKSB7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9TWVNURU1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9SSU5HXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KKyAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOworICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUxBUk1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT05dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQorICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7CisgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9CisgICAgICAgICAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjOworICAgIH0KK30KKworZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBmbG9hdCB2b2x1bWUgPSAxLjA7CisgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKKworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgdm9sdW1lID0gdm9sSW5kZXhUb0FtcGwoZGV2aWNlLCBzdHJlYW1EZXNjLCBpbmRleCk7CisKKyAgICAvLyBpZiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkLCBhcHBseSB0aGUgZm9sbG93aW5nIHJ1bGVzIHRvIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMKKyAgICAvLyB0byBhdm9pZCBzb3VuZCBsZXZlbCBidXJzdHMgaW4gdXNlcidzIGVhcnM6CisgICAgLy8gLSBhbHdheXMgYXR0ZW51YXRlIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMgdm9sdW1lIGJ5IDZkQgorICAgIC8vIC0gaWYgbXVzaWMgaXMgcGxheWluZywgYWx3YXlzIGxpbWl0IHRoZSB2b2x1bWUgdG8gY3VycmVudCBtdXNpYyB2b2x1bWUsCisgICAgLy8gd2l0aCBhIG1pbmltdW0gdGhyZXNob2xkIGF0IC0zNmRCIHNvIHRoYXQgbm90aWZpY2F0aW9uIGlzIGFsd2F5cyBwZXJjZWl2ZWQuCisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSkpICYmCisgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKKyAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQorICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkKKyAgICAgICAgICAgICAgICB8fCAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICBzdHJlYW1EZXNjLm1DYW5CZU11dGVkKSB7CisgICAgICAgIHZvbHVtZSAqPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SOworICAgICAgICAvLyB3aGVuIHRoZSBwaG9uZSBpcyByaW5naW5nIHdlIG11c3QgY29uc2lkZXIgdGhhdCBtdXNpYyBjb3VsZCBoYXZlIGJlZW4gcGF1c2VkIGp1c3QgYmVmb3JlCisgICAgICAgIC8vIGJ5IHRoZSBtdXNpYyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIG11c2ljIHdhcyBhY3RpdmUgaWYgdGhlIGxhc3QgbXVzaWMgdHJhY2sgd2FzCisgICAgICAgIC8vIGp1c3Qgc3RvcHBlZAorICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkgfHwKKyAgICAgICAgICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbCA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10uZ2V0Vm9sdW1lSW5kZXgobXVzaWNEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7CisgICAgICAgICAgICBmbG9hdCBtaW5Wb2wgPSAobXVzaWNWb2wgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTjsKKyAgICAgICAgICAgIGlmICh2b2x1bWUgPiBtaW5Wb2wpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWUgPSBtaW5Wb2w7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sLCBtdXNpY1ZvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdm9sdW1lOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKworICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAorICAgIGlmIChtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtLCBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0pOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCisgICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKKyAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gJiYKKyAgICAgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgeworICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCisgICAgICAgICAgICAgc3RyZWFtLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKKyAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKKyAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAorICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0CisgICAgaWYgKHZvbHVtZSAhPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tQ3VyVm9sdW1lW3N0cmVhbV0gfHwKKyAgICAgICAgICAgIGZvcmNlKSB7CisgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKKyAgICAgICAgQUxPR1ZWKCJjaGVja0FuZFNldFZvbHVtZSgpIGZvciBvdXRwdXQgJWQgc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgb3V0cHV0LCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzCisgICAgICAgIC8vIGVuYWJsZWQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBvdXRwdXQsIGRlbGF5TXMpOworICAgICAgICB9CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAorICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICAgICAgZmxvYXQgdm9pY2VWb2x1bWU7CisgICAgICAgIC8vIEZvcmNlIHZvaWNlIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gYXMgdm9sdW1lIGlzIG1hbmFnZWQgYnkgdGhlIGhlYWRzZXQKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KW1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CisgICAgICAgIH0KKworICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSAmJiBvdXRwdXQgPT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBvdXRwdXQgJWQgYW5kIGRldmljZSAleCIsIG91dHB1dCwgZGV2aWNlKTsKKworICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgJWQiLCBzdHJhdGVneSwgb24sIG91dHB1dCk7CisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBvbiwgb3V0cHV0LCBkZWxheU1zLCBkZXZpY2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSBtU3RyZWFtc1tzdHJlYW1dOworICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICB9CisKKyAgICBBTE9HVlYoInNldFN0cmVhbU11dGUoKSBzdHJlYW0gJWQsIG11dGUgJWQsIG91dHB1dCAlZCwgbU11dGVDb3VudCAlZCBkZXZpY2UgJTA0eCIsCisgICAgICAgICAgc3RyZWFtLCBvbiwgb3V0cHV0LCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0sIGRldmljZSk7CisKKyAgICBpZiAob24pIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtRGVzYy5tQ2FuQmVNdXRlZCAmJgorICAgICAgICAgICAgICAgICAgICAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBpbmNyZW1lbnQgbU11dGVDb3VudCBhZnRlciBjYWxsaW5nIGNoZWNrQW5kU2V0Vm9sdW1lKCkgc28gdGhhdCB2b2x1bWUgY2hhbmdlIGlzIG5vdCBpZ25vcmVkCisgICAgICAgIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInNldFN0cmVhbU11dGUoKSB1bm11dGluZyBub24gbXV0ZWQgc3RyZWFtISIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCit7CisgICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKKyAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQorICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAorICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKKyAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCisgICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0CisgICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKKyAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOworICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKKyAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOworICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKQoreworICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1QaG9uZVN0YXRlKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKSB7CisgICAgcmV0dXJuICgoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAorICAgICAgICAgICAgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTikpOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heEVmZmVjdHNDcHVMb2FkKCkKK3sKKyAgICByZXR1cm4gTUFYX0VGRkVDVFNfQ1BVX0xPQUQ7Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4RWZmZWN0c01lbW9yeSgpCit7CisgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKK30KKworCisvLyAtLS0gQXVkaW9PdXRwdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpBdWRpb091dHB1dERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCisgICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwgbUxhdGVuY3koMCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1QYXRjaEhhbmRsZSgwKSwKKyAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtRGlyZWN0T3BlbkNvdW50KDApCit7CisgICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBtUmVmQ291bnRbaV0gPSAwOworICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKKyAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7CisgICAgICAgIG1TdG9wVGltZVtpXSA9IDA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgfQorICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKKyAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPm1GbGFnczsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmxhdGVuY3koKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5tTGF0ZW5jeSA+IG1PdXRwdXQyLT5tTGF0ZW5jeSkgPyBtT3V0cHV0MS0+bUxhdGVuY3kgOiBtT3V0cHV0Mi0+bUxhdGVuY3k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1MYXRlbmN5OworICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAorICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CisgICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSl7CisgICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDEpIHx8IHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChtUHJvZmlsZS0+bU1vZHVsZSA9PSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bU1vZHVsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit7CisgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7CisgICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICB9CisgICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgeworICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7CisgICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICByZXR1cm4gaXNTdHJhdGVneUFjdGl2ZShOVU1fU1RSQVRFR0lFUywgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAorICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCisgICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghaXNEdXBsaWNhdGVkKCksICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIG1Jb0hhbmRsZSk7CisKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKyAgICBtUHJvZmlsZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0KKyAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKKyAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tIEF1ZGlvSW5wdXREZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCisgICAgOiBtSWQoMCksIG1Jb0hhbmRsZSgwKSwKKyAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUGF0Y2hIYW5kbGUoMCksIG1SZWZDb3VudCgwKSwKKyAgICAgIG1JbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfREVGQVVMVCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtSXNTb3VuZFRyaWdnZXIoZmFsc2UpCit7CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwKKyAgICAgICAgICAgICAgICAidG9BdWRpb1BvcnRDb25maWcoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOworICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtSW5wdXRTb3VyY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKKworICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPSBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBSZWYgQ291bnQgJWRcbiIsIG1SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBPcGVuIFJlZiBDb3VudCAlZFxuIiwgbU9wZW5SZWZDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6U3RyZWFtRGVzY3JpcHRvcigpCisgICAgOiAgIG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQoreworICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCAwKTsKK30KKworaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6U3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBkZXZpY2UgPSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQKKyAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUOworICAgIH0KKyAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAorICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCisgICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKKyAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gSHdNb2R1bGUgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwKKyAgICAgIG1IYWxWZXJzaW9uKEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pLCBtSGFuZGxlKDApCit7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6On5Id01vZHVsZSgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5tU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOworICAgIH0KKyAgICBmcmVlKCh2b2lkICopbU5hbWUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkSW5wdXQoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChyb290LT5uYW1lKSwgQVVESU9fUE9SVF9ST0xFX1NJTkssIHRoaXMpOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21OYW1lKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXMpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGTEFHU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1GbGFncyA9IHBhcnNlSW5wdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZElucHV0KCkgYWRkaW5nIGlucHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKworICAgICAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZE91dHB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCB0aGlzKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VPdXRwdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGRldmljZXMiKTsKKyAgICBBTE9HV19JRihwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGZvcm1hdHMiKTsKKyAgICBpZiAoIXByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpICE9IDApKSB7CisKKyAgICAgICAgQUxPR1YoImxvYWRPdXRwdXQoKSBhZGRpbmcgb3V0cHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSwgcHJvZmlsZS0+bUZsYWdzKTsKKworICAgICAgICBtT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWREZXZpY2UoY25vZGUgKnJvb3QpCit7CisgICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKKworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfVFlQRSkgPT0gMCkgeworICAgICAgICAgICAgdHlwZSA9IHBhcnNlRGV2aWNlTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKKyAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgeworICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgocm9vdC0+bmFtZSksIHR5cGUpOworICAgIGRldmljZURlc2MtPm1Nb2R1bGUgPSB0aGlzOworCisgICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFX0FERFJFU1MpID09IDApIHsKKyAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIG5hbWUgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAorICAgICAgICAgIGRldmljZURlc2MtPm1OYW1lLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICBtRGVjbGFyZWREZXZpY2VzLmFkZChkZXZpY2VEZXNjKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgbU5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gaGFuZGxlOiAlZFxuIiwgbUhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSB2ZXJzaW9uOiAldS4ldVxuIiwgbUhhbFZlcnNpb24gPj4gOCwgbUhhbFZlcnNpb24gJiAweEZGKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgb3V0cHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtRGVjbGFyZWREZXZpY2VzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBkZXZpY2VzOlxuIiwgc3RybGVuKCIgIC0gZGV2aWNlczpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGVjbGFyZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA0LCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkgOgorICAgIG1OYW1lKG5hbWUpLCBtVHlwZSh0eXBlKSwgbVJvbGUocm9sZSksIG1Nb2R1bGUobW9kdWxlKSwgbUZsYWdzKDApCit7CisgICAgbVVzZUluQ2hhbm5lbE1hc2sgPSAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBwb3J0LT5yb2xlID0gbVJvbGU7CisgICAgcG9ydC0+dHlwZSA9IG1UeXBlOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX1NBTVBMSU5HX1JBVEVTOyBpKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPnNhbXBsZV9yYXRlc1tpXSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9zYW1wbGVfcmF0ZXMgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmNoYW5uZWxfbWFza3NbaV0gPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9jaGFubmVsX21hc2tzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9GT1JNQVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmZvcm1hdHNbaV0gPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fZm9ybWF0cyA9IGk7CisKKyAgICBBTE9HVigiQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydCgpIG51bSBnYWlucyAlenUiLCBtR2FpbnMuc2l6ZSgpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9HQUlOUzsgaSsrKSB7CisgICAgICAgIHBvcnQtPmdhaW5zW2ldID0gbUdhaW5zW2ldLT5tR2FpbjsKKyAgICB9CisgICAgcG9ydC0+bnVtX2dhaW5zID0gaTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCkgeworICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA7IGsrKykgeworICAgICAgICBjb25zdCB1aW50MzJfdCByYXRlID0gcG9ydC0+bVNhbXBsaW5nUmF0ZXMuaXRlbUF0KGspOworICAgICAgICBpZiAocmF0ZSAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIHJhdGVzCisgICAgICAgICAgICBib29sIGhhc1JhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChyYXRlID09IG1TYW1wbGluZ1JhdGVzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNSYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNSYXRlKSB7IC8vIG5ldmVyIGltcG9ydCBhIHNhbXBsaW5nIHJhdGUgdHdpY2UKKyAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUNoYW5uZWxNYXNrcy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayA9IHBvcnQtPm1DaGFubmVsTWFza3MuaXRlbUF0KGspOworICAgICAgICBpZiAobWFzayAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIG1hc2tzCisgICAgICAgICAgICBib29sIGhhc01hc2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1DaGFubmVsTWFza3Muc2l6ZSgpIDsgbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT0gbUNoYW5uZWxNYXNrcy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzTWFzayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzTWFzaykgeyAvLyBuZXZlciBpbXBvcnQgYSBjaGFubmVsIG1hc2sgdHdpY2UKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tRm9ybWF0cy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcG9ydC0+bUZvcm1hdHMuaXRlbUF0KGspOworICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsgLy8gc2tpcCAiZHluYW1pYyIgZm9ybWF0cworICAgICAgICAgICAgYm9vbCBoYXNGb3JtYXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGwgPSAwIDsgbCA8IG1Gb3JtYXRzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbUZvcm1hdHMuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc0Zvcm1hdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzRm9ybWF0KSB7IC8vIG5ldmVyIGltcG9ydCBhIGNoYW5uZWwgbWFzayB0d2ljZQorICAgICAgICAgICAgICAgIG1Gb3JtYXRzLmFkZChmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjbGVhckNhcGFiaWxpdGllcygpIHsKKyAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgbUZvcm1hdHMuY2xlYXIoKTsKKyAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBzYW1wbGluZworICAgIC8vIHJhdGVzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgcmF0ZSA9IGF0b2koc3RyKTsKKyAgICAgICAgaWYgKHJhdGUgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRTYW1wbGluZ1JhdGVzKCkgYWRkaW5nIHJhdGUgJWQiLCByYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRGb3JtYXRzKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICAvLyBieSBjb252ZW50aW9uLCAiMCcgaW4gdGhlIGZpcnN0IGVudHJ5IGluIG1Gb3JtYXRzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGZvcm1hdHMKKyAgICAvLyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3Qpc3RyaW5nVG9FbnVtKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZEluQ2hhbm5lbHMoKSAlcyIsIG5hbWUpOworCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgYWRkaW5nIGNoYW5uZWxNYXNrICUwNHgiLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkT3V0Q2hhbm5lbHMoKSAlcyIsIG5hbWUpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtQ2hhbm5lbE1hc2tzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGNoYW5uZWwKKyAgICAvLyBtYXNrcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClzdHJpbmdUb0VudW0oc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCithdWRpb19nYWluX21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZEdhaW5Nb2RlKCkgJXMiLCBuYW1lKTsKKyAgICBhdWRpb19nYWluX21vZGVfdCBtb2RlID0gMDsKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgbW9kZSB8PSAoYXVkaW9fZ2Fpbl9tb2RlX3Qpc3RyaW5nVG9FbnVtKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm4gbW9kZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8QXVkaW9HYWluPiBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCwgbVVzZUluQ2hhbm5lbE1hc2spOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1vZGUgPSBsb2FkR2Fpbk1vZGUoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1pbl92YWx1ZSA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tYXhfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLmRlZmF1bHRfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLnN0ZXBfdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5taW5fcmFtcF9tcyA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1heF9yYW1wX21zID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAorICAgICAgICAgIGdhaW4tPm1HYWluLm1vZGUsIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzaywgZ2Fpbi0+bUdhaW4ubWluX3ZhbHVlLCBnYWluLT5tR2Fpbi5tYXhfdmFsdWUpOworCisgICAgaWYgKGdhaW4tPm1HYWluLm1vZGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1HYWlucy5hZGQoZ2Fpbik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWlucyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworICAgIGludCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICBsb2FkR2Fpbihub2RlLCBpbmRleCsrKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldID09IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKK3sKKyAgICAvLyBTZWFyY2ggZm9yIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCBzYW1wbGluZyByYXRlIHRoYXQgaXMgYWJvdmUgKHByZWZlcnJlZCkKKyAgICAvLyBvciBiZWxvdyAoYWNjZXB0YWJsZSkgdGhlIGRlc2lyZWQgc2FtcGxpbmcgcmF0ZSwgd2l0aGluIGEgcGVybWl0dGVkIHJhdGlvLgorICAgIC8vIFRoZSBzYW1wbGluZyByYXRlcyBkbyBub3QgbmVlZCB0byBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAgIHNzaXplX3QgbWF4QmVsb3cgPSAtMTsKKyAgICBzc2l6ZV90IG1pbkFib3ZlID0gLTE7CisgICAgdWludDMyX3QgY2FuZGlkYXRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuZGlkYXRlIDwgZGVzaXJlZAorICAgICAgICBpZiAoY2FuZGlkYXRlIDwgc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAobWF4QmVsb3cgPCAwIHx8IGNhbmRpZGF0ZSA+IG1TYW1wbGluZ1JhdGVzW21heEJlbG93XSkgeworICAgICAgICAgICAgICAgIG1heEJlbG93ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gY2FuZGlkYXRlID4gZGVzaXJlZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1pbkFib3ZlIDwgMCB8fCBjYW5kaWRhdGUgPCBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV0pIHsKKyAgICAgICAgICAgICAgICBtaW5BYm92ZSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIGFib3V0IEF1ZGlvRmxpbmdlciByZXNhbXBsaW5nIHJhdGlvcy4KKyAgICAvLyBUT0RPIE1vdmUgdGhlc2UgYXNzdW1wdGlvbnMgb3V0LgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4RG93blNhbXBsZVJhdGlvID0gNjsgIC8vIGJleW9uZCB0aGlzIGFsaWFzaW5nIG9jY3VycworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VXBTYW1wbGVSYXRpbyA9IDI1NjsgIC8vIGJleW9uZCB0aGlzIHNhbXBsZSByYXRlIGluYWNjdXJhY2llcyBvY2N1cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byBhcHByb3hpbWF0aW9uIGJ5IGFuIGludDMyX3Qgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGhhc2UgaW5jcmVtZW50cworICAgIC8vIFByZWZlciB0byBkb3duLXNhbXBsZSBmcm9tIGEgaGlnaGVyIHNhbXBsaW5nIHJhdGUsIGFzIHdlIGdldCB0aGUgZGVzaXJlZCBmcmVxdWVuY3kgc3BlY3RydW0uCisgICAgaWYgKG1pbkFib3ZlID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdOworICAgICAgICBpZiAoY2FuZGlkYXRlIC8ga01heERvd25TYW1wbGVSYXRpbyA8PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBCdXQgaWYgd2UgaGF2ZSB0byB1cC1zYW1wbGUgZnJvbSBhIGxvd2VyIHNhbXBsaW5nIHJhdGUsIHRoYXQncyBPSy4KKyAgICBpZiAobWF4QmVsb3cgPj0gMCkgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttYXhCZWxvd107CisgICAgICAgIGlmIChjYW5kaWRhdGUgKiBrTWF4VXBTYW1wbGVSYXRpbyA+PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBsZWF2ZSB1cGRhdGVkU2FtcGxpbmdSYXRlIHVubW9kaWZpZWQKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tFeGFjdENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykKKyAgICAgICAgY29uc3QKK3sKKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIC8vIEZJWE1FIERvZXMgbm90IGhhbmRsZSBtdWx0aS1jaGFubmVsIGF1dG9tYXRpYyBjb252ZXJzaW9ucyB5ZXQKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3VwcG9ydGVkID0gbUNoYW5uZWxNYXNrc1tpXTsKKyAgICAgICAgaWYgKHN1cHBvcnRlZCA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChpc1JlY29yZFRocmVhZCkgeworICAgICAgICAgICAgLy8gVGhpcyB1c2VzIGhhcmQtY29kZWQga25vd2xlZGdlIHRoYXQgQXVkaW9GbGluZ2VyIGNhbiBzaWxlbnRseSBkb3duLW1peCBhbmQgdXAtbWl4LgorICAgICAgICAgICAgLy8gRklYTUUgQWJzdHJhY3QgdGhpcyBvdXQgdG8gYSB0YWJsZS4KKyAgICAgICAgICAgIGlmICgoKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sgfHwgc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKQorICAgICAgICAgICAgICAgICAgICAmJiBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHx8CisgICAgICAgICAgICAgICAgKHN1cHBvcnRlZCA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSworICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdAoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKKyAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDEgJiYgbVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBzYW1wbGluZyByYXRlOiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCisgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAvLyBzaW5rCisgICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA8IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldID4gMCkpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHNhbXBsaW5nUmF0ZSA9PSBVSU5UX01BWCkgPyAwIDogc2FtcGxpbmdSYXRlOworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgdWludDMyX3QgbWF4UmF0ZSA9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFOworCisgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIHNhbXBsaW5nIHJhdGVzLiBEbyBub3QKKyAgICAvLyBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQorICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKChtU2FtcGxpbmdSYXRlc1tpXSA+IHNhbXBsaW5nUmF0ZSkgJiYgKG1TYW1wbGluZ1JhdGVzW2ldIDw9IG1heFJhdGUpKSB7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtU2FtcGxpbmdSYXRlc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpID09IDEgJiYgbUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworCisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgeworICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFubmVsTWFzazsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOworICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4gRG8gbm90CisgICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKKyAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtYXhDb3VudCA9IFVJTlRfTUFYOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hhbm5lbE1hc2s7Cit9CisKKy8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW10gPSB7CisgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VELAorICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKK307CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKK3sKKyAgICAvLyBOT1RFOiBBVURJT19GT1JNQVRfSU5WQUxJRCBpcyBhbHNvIGNvbnNpZGVyZWQgbm90IFBDTSBhbmQgd2lsbCBiZSBjb21wYXJlZCBlcXVhbCB0byBhbnkKKyAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhbmQgYmV0dGVyIHRoYW4gYW55IFBDTSBmb3JtYXQuIFRoaXMgaXMgYnkgZGVzaWduIG9mIHBpY2tGb3JtYXQoKQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQxKSkgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0MikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBpbmRleDEgPSAtMSwgaW5kZXgyID0gLTE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAoaSA8IEFSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkpICYmICgoaW5kZXgxID09IC0xKSB8fCAoaW5kZXgyID09IC0xKSk7CisgICAgICAgICAgICBpICsrKSB7CisgICAgICAgIGlmIChzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW2ldID09IGZvcm1hdDEpIHsKKyAgICAgICAgICAgIGluZGV4MSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MikgeworICAgICAgICAgICAgaW5kZXgyID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb3JtYXQxIG5vdCBmb3VuZCA9PiBpbmRleDEgPCAwID0+IGZvcm1hdDIgPiBmb3JtYXQxCisgICAgLy8gZm9ybWF0MiBub3QgZm91bmQgPT4gaW5kZXgyIDwgMCA9PiBmb3JtYXQyIDwgZm9ybWF0MQorICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrRm9ybWF0KCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1Gb3JtYXRzLnNpemUoKSA9PSAxICYmIG1Gb3JtYXRzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPQorICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbCisgICAgICAgICAgICAgICAgQVJSQVlfU0laRShBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuIERvIG5vdAorICAgIC8vIGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKKyAgICBpZiAoKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHx8CisgICAgICAgICAgICAoKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAgKCgobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSAhPSAwKSkpKSB7CisgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKGNvbXBhcmVGb3JtYXRzKG1Gb3JtYXRzW2ldLCBmb3JtYXQpID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGJlc3RGb3JtYXQpIDw9IDApKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdAoreworICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBpZiAobU5hbWUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbVNhbXBsaW5nUmF0ZXNbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Qb3J0OjpkdW1wIG1DaGFubmVsTWFza3MgJXp1ICUwOHgiLCBpLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtQ2hhbm5lbE1hc2tzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtRm9ybWF0cy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdHM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdFN0ciA9IGVudW1Ub1N0cmluZyhzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdHNbaV0pOworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBzdHJjbXAoZm9ybWF0U3RyLCAiIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMiLCBmb3JtYXRTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtRm9ybWF0cy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpICsgMSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLSBBdWRpb0dhaW4gY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OkF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzaykKK3sKKyAgICBtSW5kZXggPSBpbmRleDsKKyAgICBtVXNlSW5DaGFubmVsTWFzayA9IHVzZUluQ2hhbm5lbE1hc2s7CisgICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluKSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKKyAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOworICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOworICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Y2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgaWYgKChjb25maWctPm1vZGUgJiB+bUdhaW4ubW9kZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbMF0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8CisgICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1swXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfm1HYWluLmNoYW5uZWxfbWFzaykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzW2ldIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbaV0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgeworICAgICAgICBpZiAoKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA8IG1HYWluLm1pbl9yYW1wX21zKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID4gbUdhaW4ubWF4X3JhbXBfbXMpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtb2RlOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tb2RlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsX21hc2s6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLmNoYW5uZWxfbWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKKy8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCit7CisgICAgbVNhbXBsaW5nUmF0ZSA9IDA7CisgICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBtR2Fpbi5pbmRleCA9IC0xOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKKworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Q2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tGb3JtYXQoY29uZmlnLT5mb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgbUZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0dhaW4oJmNvbmZpZy0+Z2FpbiwgY29uZmlnLT5nYWluLmluZGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOworICAgIH0KKworZXhpdDoKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGFwcGx5QXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CisgICAgfQorICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgeworICAgICAgICAqYmFja3VwQ29uZmlnID0gbG9jYWxCYWNrdXBDb25maWc7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pKSB7CisgICAgICAgICAgICBkc3RDb25maWctPmdhaW4gPSBzcmNDb25maWctPmdhaW47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmdhaW4uaW5kZXggPSAtMTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Z2Fpbi5pbmRleCAhPSAtMSkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayAmPSB+QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9Cit9CisKKy8vIC0tLSBJT1Byb2ZpbGUgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OklPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKKyAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlLCBtb2R1bGUpCit7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKK3sKK30KKworLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKy8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCisvLyBnZXQgYSB2YWxpZCBhIG1hdGNoCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0Cit7CisgICAgY29uc3QgYm9vbCBpc1BsYXliYWNrVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOworCisgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzYW1wbGluZ1JhdGUgPT0gMCkgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgY2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlLCAmbXlVcGRhdGVkU2FtcGxpbmdSYXRlKSAhPQorICAgICAgICAgICAgTk9fRVJST1IpIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8IGNoZWNrRm9ybWF0KGZvcm1hdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0V4YWN0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhjaGFubmVsTWFzaykgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAobUZsYWdzICYgZmxhZ3MpICE9IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gVGhlIG9ubHkgaW5wdXQgZmxhZyB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGlzIHRoZSBmYXN0IGZsYWcuCisgICAgLy8gQW4gZXhpc3RpbmcgZmFzdCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgbm9ybWFsIHRyYWNrIHJlcXVlc3QuCisgICAgLy8gQW4gZXhpc3Rpbmcgbm9ybWFsIHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBmYXN0IHRyYWNrIHJlcXVlc3QsCisgICAgLy8gYnV0IHRoZSBmYXN0IHJlcXVlc3Qgd2lsbCBiZSBkZW5pZWQgYnkgQXVkaW9GbGluZ2VyIGFuZCBjb252ZXJ0ZWQgdG8gbm9ybWFsIHRyYWNrLgorICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoKG1GbGFncyBeIGZsYWdzKSAmCisgICAgICAgICAgICB+QVVESU9fSU5QVVRfRkxBR19GQVNUKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IG15VXBkYXRlZFNhbXBsaW5nUmF0ZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNiwgaSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpsb2coKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQUxPR1YoIiAgICAtIHNhbXBsaW5nIHJhdGVzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgICVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBjaGFubmVsIG1hc2tzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGZvcm1hdHM6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDh4IiwgbUZvcm1hdHNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBkZXZpY2VzOiAweCUwNHhcbiIsIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworICAgIEFMT0dWKCIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOworfQorCisKKy8vIC0tLSBEZXZpY2VEZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCisKKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6CisgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKHR5cGUpLCBtQWRkcmVzcygiIiksIG1JZCgwKQoreworICAgIGlmIChtR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBtR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAoreworICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKKyAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcyBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgY2hhbm5lbCBtYXNrIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY2hhbm5lbCBtYXNrCisgICAgcmV0dXJuIChtRGV2aWNlVHlwZSA9PSBvdGhlci0+bURldmljZVR5cGUpICYmCisgICAgICAgICAgIChtQWRkcmVzcyA9PSAiIiB8fCBvdGhlci0+bUFkZHJlc3MgPT0gIiIgfHwgbUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKSAmJgorICAgICAgICAgICAobUNoYW5uZWxNYXNrID09IDAgfHwgb3RoZXItPm1DaGFubmVsTWFzayA9PSAwIHx8CisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID09IG90aGVyLT5tQ2hhbm5lbE1hc2spOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQoreworICAgIG1EZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBtRGV2aWNlVHlwZXMgfD0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAoreworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3NpemVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6YWRkKGl0ZW0pOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT5tRGV2aWNlVHlwZSk7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc2l6ZV90IGk7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6cmVtb3ZlIGRldmljZSAlMDh4IG5vdCBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpCit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7CisKKyAgICB1aW50MzJfdCByb2xlX2JpdCA9IEFVRElPX0RFVklDRV9CSVRfSU4gJiB0eXBlczsKKyAgICB0eXBlcyAmPSB+cm9sZV9iaXQ7CisKKyAgICB3aGlsZSAodHlwZXMpIHsKKyAgICAgICAgdWludDMyX3QgaSA9IDMxIC0gX19idWlsdGluX2Nseih0eXBlcyk7CisgICAgICAgIHVpbnQzMl90IHR5cGUgPSAxIDw8IGk7CisgICAgICAgIHR5cGVzICY9IH50eXBlOworICAgICAgICBhZGQobmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUgfCByb2xlX2JpdCkpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6bG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcykKK3sKKyAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2TmFtZSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgdHlwZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tTmFtZShTdHJpbmc4KGRldk5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZChkZXZpY2VEZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZVR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKCkgZm9yIHR5cGUgJWQgYWRkcmVzcyAlcyBmb3VuZCAlcCIsCisgICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKCVkKSBpdGVtQXQoJXp1KS0+bUlkICVkIiwgaWQsIGksIGl0ZW1BdChpKS0+bUlkKTsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIHR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKKyAgICAgICAgICAgIHR5cGUgJj0gfml0ZW1BdChpKS0+bURldmljZVR5cGU7CisgICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoKSBmb3IgdHlwZSAleCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICBpdGVtQXQoaSktPm1EZXZpY2VUeXBlLCBpdGVtQXQoaSkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlQWRkcigKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICAvL0FMT0dWKCIgICBsb29raW5nIGZvciBkZXZpY2U9JXgsIGFkZHI9JXMiLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vQUxPR1YoIiAgICAgYXQgaT0lZDogZGV2aWNlPSV4LCBhZGRyPSVzIiwKKyAgICAgICAgLy8gICAgICAgIGksIGl0ZW1BdChpKS0+bURldmljZVR5cGUsIGl0ZW1BdChpKS0+bUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiICAgICAgZm91bmQgbWF0Y2hpbmcgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3NwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21OYW1lKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1OYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShtRGV2aWNlVHlwZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NJTksgOiBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICBzdHJuY3B5KGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAleCIsIG1JZCwgbURldmljZVR5cGUpOworICAgIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+aWQgPSBtSWQ7CisgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOworICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+bUhhbmRsZTsKKyAgICBzdHJuY3B5KHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgaWYgKG1JZCAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUlkKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAobUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgc3BhY2VzKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BhdGNoOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uZXh0LmRldmljZS50eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLCBtUGF0Y2guc291cmNlc1tpXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNpbmtzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zaW5rcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIGlmIChtUGF0Y2guc2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIGVudW1Ub1N0cmluZyhzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IHN0cmluZ1RvRW51bShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ05hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWcgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7CisgICAgICAgIGZsYWcgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOworICAgIH0KKworICAgIHJldHVybiBmbGFnOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IHN0cmluZ1RvRW51bShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBmbGFnOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZURldmljZU5hbWVzKGNoYXIgKm5hbWUpCit7CisgICAgdWludDMyX3QgZGV2aWNlID0gMDsKKworICAgIGNoYXIgKmRldk5hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZGV2TmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJsZW4oZGV2TmFtZSkgIT0gMCkgeworICAgICAgICAgICAgZGV2aWNlIHw9IHN0cmluZ1RvRW51bShzRGV2aWNlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldk5hbWUpOworICAgICAgICAgfQorICAgICAgICBkZXZOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290KQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOworICAgIGNub2RlICpub2RlOworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUocm9vdC0+bmFtZSk7CisKKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgREVWSUNFU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWREZXZpY2Uobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBPVVRQVVRTX1RBRyk7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBvdXRwdXQgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZE91dHB1dChub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIElOUFVUU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgaW5wdXQgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgICAgIHN0YXR1c190IHRtcFN0YXR1cyA9IG1vZHVsZS0+bG9hZElucHV0KG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRId01vZHVsZShub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7CisKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKKyAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKKyAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5tRGVjbGFyZWREZXZpY2VzOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKKyAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJsb2FkR2xvYmFsQ29uZmlnKCkgZGVmYXVsdCBkZXZpY2Ugbm90IHNwZWNpZmllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcyk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBtU3BlYWtlckRyY0VuYWJsZWQgPSBzdHJpbmdUb0Jvb2woKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgbVNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOworICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTihtYWpvciwgbWlub3IpOworICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtSGFsVmVyc2lvbiA9ICUwNHggbWFqb3IgJXUgbWlub3IgJXUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlLT5tSGFsVmVyc2lvbiwgbWFqb3IsIG1pbm9yKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgY25vZGUgKnJvb3Q7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSAoY2hhciAqKWxvYWRfZmlsZShwYXRoLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKKyAgICBjb25maWdfbG9hZChyb290LCBkYXRhKTsKKworICAgIGxvYWRId01vZHVsZXMocm9vdCk7CisgICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24KKyAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIGdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCkKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOworICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGVmYXVsdElucHV0RGV2aWNlKTsKKworICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZSgicHJpbWFyeSIpOworCisgICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFLCBtb2R1bGUpOworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCg0NDEwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgcHJvZmlsZS0+bUZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKKyAgICBtb2R1bGUtPm1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TSU5LLCBtb2R1bGUpOworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCg4MDAwKTsKKyAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKEFVRElPX0NIQU5ORUxfSU5fTU9OTyk7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CisgICAgbW9kdWxlLT5tSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKK3sKKyAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087CisgICAgfQorCisgICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgorICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhN2I5NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41CisvLyBNaW4gdm9sdW1lIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT04gc3RyZWFtcyB3aGVuIGxpbWl0ZWQgYnkgbXVzaWMgdm9sdW1lOiAtMzZkQgorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOICAwLjAxNgorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKKy8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAorLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQorLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCisjZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGR1cmluZyB3aXRjaCBzb21lIHN0cmVhbXMgYXJlIG11dGVkIHdoaWxlIHRoZSBhdWRpbyBwYXRoCisvLyBpcyBzd2l0Y2hlZAorI2RlZmluZSBNVVRFX1RJTUVfTVMgMjAwMAorCisjZGVmaW5lIE5VTV9URVNUX09VVFBVVFMgNQorCisjZGVmaW5lIE5VTV9WT0xfQ1VSVkVfS05FRVMgMgorCisvLyBEZWZhdWx0IG1pbmltdW0gbGVuZ3RoIGFsbG93ZWQgZm9yIG9mZmxvYWRpbmcgYSBjb21wcmVzc2VkIHRyYWNrCisvLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyBwcm9wZXJ0eQorI2RlZmluZSBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgNjAKKworI2RlZmluZSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSA0ODAwMAorI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCA4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlciBpbXBsZW1lbnRzIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXI6IHB1YmxpYyBBdWRpb1BvbGljeUludGVyZmFjZQorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgLCBwdWJsaWMgVGhyZWFkCisjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAoreworCitwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOworICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXIoKTsKKworICAgICAgICAvLyBBdWRpb1BvbGljeUludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFN5c3RlbVByb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gTlVMTCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAvLyAgIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKKyAgICAgICAgLy8gICBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworCitwcm90ZWN0ZWQ6CisKKyAgICAgICAgZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKKyAgICAgICAgICAgIFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCisgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICAgICAgICAgIFNUUkFURUdZX0RUTUYsCisgICAgICAgICAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAorICAgICAgICAgICAgTlVNX1NUUkFURUdJRVMKKyAgICAgICAgfTsKKworICAgICAgICAvLyA0IHBvaW50cyB0byBkZWZpbmUgdGhlIHZvbHVtZSBhdHRlbnVhdGlvbiBjdXJ2ZSwgZWFjaCBjaGFyYWN0ZXJpemVkIGJ5IHRoZSB2b2x1bWUKKyAgICAgICAgLy8gaW5kZXggKGZyb20gMCB0byAxMDApIGF0IHdoaWNoIHRoZXkgYXBwbHksIGFuZCB0aGUgYXR0ZW51YXRpb24gaW4gZEIgYXQgdGhhdCBpbmRleC4KKyAgICAgICAgLy8gd2UgdXNlIDEwMCBzdGVwcyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgd2hlbiBjb21wdXRpbmcgdGhlIHZvbHVtZSBpbiB2b2xJbmRleFRvQW1wbCgpCisKKyAgICAgICAgZW51bSB7IFZPTE1JTiA9IDAsIFZPTEtORUUxID0gMSwgVk9MS05FRTIgPSAyLCBWT0xNQVggPSAzLCBWT0xDTlQgPSA0fTsKKworICAgICAgICBjbGFzcyBWb2x1bWVDdXJ2ZVBvaW50CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW50IG1JbmRleDsKKyAgICAgICAgICAgIGZsb2F0IG1EQkF0dGVudWF0aW9uOworICAgICAgICB9OworCisgICAgICAgIC8vIGRldmljZSBjYXRlZ29yaWVzIHVzZWQgZm9yIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50LgorICAgICAgICBlbnVtIGRldmljZV9jYXRlZ29yeSB7CisgICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFLAorICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSwKKyAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9DTlQKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBId01vZHVsZTsKKworICAgICAgICBjbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvR2FpbigpIHt9CisKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIEF1ZGlvUG9ydDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9ydCgpIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICAgICAgICAgIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCk7CisgICAgICAgICAgICB2b2lkIGNsZWFyQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAgICAgICAgIHZvaWQgbG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRGb3JtYXRzKGNoYXIgKm5hbWUpOworICAgICAgICAgICAgdm9pZCBsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRJbkNoYW5uZWxzKGNoYXIgKm5hbWUpOworCisgICAgICAgICAgICBhdWRpb19nYWluX21vZGVfdCBsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSk7CisgICAgICAgICAgICB2b2lkIGxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpOworICAgICAgICAgICAgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOworCisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdDsKKyAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGFuZCByZXR1cm5zIHRoZSBiZXN0IG1hdGNoIHZpYSB1cGRhdGVkU2FtcGxpbmdSYXRlCisgICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7CisgICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGlucHV0IGNoYW5uZWwgbWFza3Mgb25seQorICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OworICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICAgICAgICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdDsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHBpY2tDaGFubmVsTWFzaygpIGNvbnN0OworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgcGlja0Zvcm1hdCgpIGNvbnN0OworCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdOworICAgICAgICAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisKKyAgICAgICAgICAgIFN0cmluZzggICAgICAgICAgIG1OYW1lOworICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CisgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworICAgICAgICAgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcywgbUNoYW5uZWxNYXNrcyBvciBtRm9ybWF0cworICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAvLyBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgICAgICAgICBWZWN0b3IgPHVpbnQzMl90PiBtU2FtcGxpbmdSYXRlczsgLy8gc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCisgICAgICAgICAgICBWZWN0b3IgPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtQ2hhbm5lbE1hc2tzOyAvLyBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcworICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19mb3JtYXRfdD4gbUZvcm1hdHM7IC8vIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCisgICAgICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0dhaW4+ID4gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCisgICAgICAgICAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KKyAgICAgICAgICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIChlLmcgcHJpbWFyeSBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0Li4uKS4KKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBBdWRpb1BvcnRDb25maWc6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdWRpb1BvcnRDb25maWcoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9CisKKyAgICAgICAgICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOworICAgICAgICAgICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CisgICAgICAgIH07CisKKworICAgICAgICBjbGFzcyBBdWRpb1BhdGNoOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwgbVBhdGNoKCpwYXRjaCksIG1VaWQodWlkKSwgbUFmUGF0Y2hIYW5kbGUoMCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworICAgICAgICAgICAgdWlkX3QgbVVpZDsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIERldmljZURlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKKworICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CisKKyAgICAgICAgICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gKEF1ZGlvUG9ydCopIHRoaXM7IH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIFN0cmluZzggbUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPCBzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgRGV2aWNlVmVjdG9yKCkgOiBTb3J0ZWRWZWN0b3IoKSwgbURldmljZVR5cGVzKEFVRElPX0RFVklDRV9OT05FKSB7fQorCisgICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KKworICAgICAgICAgICAgdm9pZCBsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcyk7CisgICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbU5hbWUoY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpOworCisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3Q7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tTmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKSBjb25zdDsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0OworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyB0aGUgSU9Qcm9maWxlIGNsYXNzIGRlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGFuIG91dHB1dCBvciBpbnB1dCBzdHJlYW0uCisgICAgICAgIC8vIEl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgYWxsIGNvbWJpbmF0aW9uIG9mIGxpc3RlZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgIC8vIEl0IGlzIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgb3IgaW5wdXQgaXMgc3VpdGFibGUgZm9yCisgICAgICAgIC8vIGEgZ2l2ZW4gdXNlIGNhc2UsICBvcGVuL2Nsb3NlIGl0IGFjY29yZGluZ2x5IGFuZCBjb25uZWN0L2Rpc2Nvbm5lY3QgYXVkaW8gdHJhY2tzCisgICAgICAgIC8vIHRvL2Zyb20gaXQuCisgICAgICAgIGNsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgICAgICAgICAgdmlydHVhbCB+SU9Qcm9maWxlKCk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dC4KKyAgICAgICAgICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgorICAgICAgICAgICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgorICAgICAgICAgICAgLy8gVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICAgICAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGxvZygpOworCisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgIG1TdXBwb3J0ZWREZXZpY2VzOyAvLyBzdXBwb3J0ZWQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGRldmljZXMgdGhpcyBvdXRwdXQgY2FuIGJlIHJvdXRlZCB0bykKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBId01vZHVsZSA6IHB1YmxpYyBSZWZCYXNlCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgICAgICBId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfkh3TW9kdWxlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWRPdXRwdXQoY25vZGUgKnJvb3QpOworICAgICAgICAgICAgc3RhdHVzX3QgbG9hZElucHV0KGNub2RlICpyb290KTsKKyAgICAgICAgICAgIHN0YXR1c190IGxvYWREZXZpY2UoY25vZGUgKnJvb3QpOworCisgICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkKTsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqY29uc3QgICAgICAgIG1OYW1lOyAvLyBiYXNlIG5hbWUgb2YgdGhlIGF1ZGlvIEhXIG1vZHVsZSAocHJpbWFyeSwgYTJkcCAuLi4pCisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgICAgICAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbU91dHB1dFByb2ZpbGVzOyAvLyBvdXRwdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgICAgICAgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgICAgICAgICAgRGV2aWNlVmVjdG9yICAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXM7IC8vIGRldmljZXMgZGVjbGFyZWQgaW4gYXVkaW9fcG9saWN5LmNvbmYKKworICAgICAgICB9OworCisgICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBub24tbWVkaWEgYXVkaW8gb24gZXh0IG1lZGlhIG91dHB1dHMgKEhETUksIExpbmUsIGV0YykKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IG9uIHNwZWFrZXJzCisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07CisgICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOworICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKKyAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQorICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdW0RFVklDRV9DQVRFR09SWV9DTlRdOworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAorICAgICAgICAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KKyAgICAgICAgY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKKyAgICAgICAgICAgIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisKKyAgICAgICAgICAgIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5KCk7CisgICAgICAgICAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICAgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgICAgICAgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICAgICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKyAgICAgICAgICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKKyAgICAgICAgICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CisgICAgICAgICAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZQorICAgICAgICAgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgorICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgICAgICAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCisgICAgICAgICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKKyAgICAgICAgfTsKKworICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CisgICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgorICAgICAgICBjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBBdWRpb1JlY29yZCBjbGllbnRzIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5wdXQKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1PcGVuUmVmQ291bnQ7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7ICAgIC8vIGlucHV0IHNvdXJjZSBzZWxlY3RlZCBieSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyhtZWRpYXJlY29yZGVyLmgpCisgICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVNlc3Npb25zOyAgICAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0CisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNTb3VuZFRyaWdnZXI7IC8vIHVzZWQgYnkgYSBzb3VuZHRyaWdnZXIgY2FwdHVyZQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisgICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKyAgICAgICAgICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworICAgICAgICB9OworCisgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGNsYXNzIFN0cmVhbURlc2NyaXB0b3IKKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTdHJlYW1EZXNjcmlwdG9yKCk7CisKKyAgICAgICAgICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBpbnQgbUluZGV4TWluOyAgICAgIC8vIG1pbiB2b2x1bWUgaW5kZXgKKyAgICAgICAgICAgIGludCBtSW5kZXhNYXg7ICAgICAgLy8gbWF4IHZvbHVtZSBpbmRleAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgICAvLyBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlCisgICAgICAgICAgICBib29sIG1DYW5CZU11dGVkOyAgIC8vIHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQKKworICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOworICAgICAgICB9OworCisgICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQorICAgICAgICB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgICAgICAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCisgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IG1TdHJhdGVneTsgLy8gcm91dGluZyBzdHJhdGVneSB0aGUgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8KKyAgICAgICAgICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICAgICAgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOworICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICBzdGF0aWMgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKKyAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCisgICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKKyAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86CisgICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bworICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgorICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcyA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCByZXNldElucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOworCisgICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlCisgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKTsKKworICAgICAgICAvLyByZXR1cm4gaW8gaGFuZGxlIG9mIGFjdGl2ZSBpbnB1dCBvciAwIGlmIG5vIGlucHV0IGlzIGFjdGl2ZQorICAgICAgICAvLyAgICBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgorICAgICAgICAvLyAgICBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cyA9IHRydWUpOworCisgICAgICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB2b2x1bWUgY3VydmVzIGZvciBlYWNoIHN0cmF0ZWd5IGFuZCBkZXZpY2UgY2F0ZWdvcnkKKyAgICAgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCk7CisKKyAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgorICAgICAgICAvLyBkZXZpY2UKKyAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQorICAgICAgICBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBhcHBseSBhbGwgc3RyZWFtIHZvbHVtZXMgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgYW5kIGRldmljZQorICAgICAgICB2b2lkIGFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSBhbGwgc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgd2hpbGUgaW4gY2FsbDogbXV0ZSBzdHJlYW1zIG9yIHJlcGxhY2UgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIHRvbmUgaW4gdGhlIGRldmljZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHZvaWQgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKTsKKworICAgICAgICAvLyB0cnVlIGlmIGRldmljZSBpcyBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5DYWxsKCk7CisKKyAgICAgICAgLy8gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpOworCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3BlbiBvdXRwdXQgY2FuIGJlIHJvdXRlZAorICAgICAgICAvLyB0byB0aGlzIGRldmljZS4gSWYgbm9uZSBpcyBvcGVuLCB0cmllcyB0byBvcGVuIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG91dHB1dHMuCisgICAgICAgIC8vIFJldHVybnMgYW4gb3V0cHV0IHN1aXRhYmxlIHRvIHRoaXMgZGV2aWNlIG9yIDAuCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3V0cHV0IGlzIG5vdCB1c2VkIGFueSBtb3JlIGFuZAorICAgICAgICAvLyByZXR1cm5zIGl0cyBoYW5kbGUgaWYgYW55LgorICAgICAgICAvLyB0cmFuc2ZlcnMgdGhlIGF1ZGlvIHRyYWNrcyBhbmQgZWZmZWN0cyBmcm9tIG9uZSBvdXRwdXQgdGhyZWFkIHRvIGFub3RoZXIgYWNjb3JkaW5nbHkuCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KKyAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgIC8vIGNsb3NlIGFuIGlucHV0LgorICAgICAgICB2b2lkIGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisgICAgICAgIC8vIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciBhbGwgc3RyYXRlZ2llcy4KKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgICAgLy8gY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CisKKyAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgYnV0IGZvciBhIGFsbCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisKKyAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKKyAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QTJkcE91dHB1dCgpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIG91dHB1dCBmb3IgY3VycmVudCBzdGF0ZQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCisgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld091dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGJvb2wgZnJvbUNhY2hlKTsKKworICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKKyAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgdm9pZCB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworCisgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIGlucHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKTsKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgaW50IHRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+JiBlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOworCisgICAgICAgIC8vIHJldHVybnMgdGhlIGNhdGVnb3J5IHRoZSBkZXZpY2UgYmVsb25ncyB0byB3aXRoIHJlZ2FyZCB0byB2b2x1bWUgY3VydmUgbWFuYWdlbWVudAorICAgICAgICBzdGF0aWMgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGV4dHJhY3Qgb25lIGRldmljZSByZWxldmFudCBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gb3Blbk91dHB1dHMpOworICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAvLyBzYW1wbGluZ1JhdGUgcGFyYW1ldGVyIGlzIGFuIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOworCisgICAgICAgIGJvb2wgaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKTsKKworICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpOworICAgICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBnZXRJbnB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKyAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKKworICAgICAgICB2b2lkIHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcgKGF1ZGlvX3BvbGljeS5jb25mKQorICAgICAgICAvLworICAgICAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpOworICAgICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpOworICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOworICAgICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IHBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSk7CisgICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlKGNub2RlICpyb290KTsKKyAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KTsKKyAgICAgICAgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKyAgICAgICAgdm9pZCBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCk7CisKKworICAgICAgICB1aWRfdCBtVWlkQ2FjaGVkOworICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtUHJpbWFyeU91dHB1dDsgICAgICAgICAgICAgIC8vIHByaW1hcnkgb3V0cHV0IGhhbmRsZQorICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gbU91dHB1dHM7CisgICAgICAgIC8vIGNvcHkgb2YgbU91dHB1dHMgYmVmb3JlIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIG9wZW5zIG5ldyBvdXRwdXRzCisgICAgICAgIC8vIHJlc2V0IHRvIG1PdXRwdXRzIHdoZW4gdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1QcmV2aW91c091dHB1dHM7CisgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKKyAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcworICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKKyAgICAgICAgaW50IG1QaG9uZVN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBob25lIHN0YXRlCisgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsgICAvLyBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbgorCisgICAgICAgIFN0cmVhbURlc2NyaXB0b3IgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0NOVF07ICAgICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvcnMgZm9yIHZvbHVtZSBjb250cm9sCisgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKKyAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAorCisgICAgICAgIC8vIE1heGltdW0gQ1BVIGxvYWQgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gMC4xIE1JUFMgKEFSTXY1VEUsIDAgV1MgbWVtb3J5KSB1bml0cworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfQ1BVX0xPQUQgPSAxMDAwOworICAgICAgICAvLyBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYXVkaW8gZWZmZWN0cyBpbiBLQgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfTUVNT1JZID0gNTEyOworICAgICAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzQ3B1TG9hZDsgLy8gY3VycmVudCBDUFUgbG9hZCB1c2VkIGJ5IGVmZmVjdHMKKyAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c01lbW9yeTsgIC8vIGN1cnJlbnQgbWVtb3J5IHVzZWQgYnkgZWZmZWN0cworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cworICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKKyAgICAgICAgYm9vbCBtU3BlYWtlckRyY0VuYWJsZWQ7Ly8gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseQorCisgICAgICAgIFZlY3RvciA8IHNwPEh3TW9kdWxlPiA+IG1Id01vZHVsZXM7CisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKKyAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKKworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4gbUF1ZGlvUGF0Y2hlczsKKworICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBhdWRpb19pb19oYW5kbGVfdD4gbVNvdW5kVHJpZ2dlclNlc3Npb25zOworCisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAgICAgTXV0ZXggICBtTG9jazsKKyAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOworCisgICAgICAgIGludCAgICAgICAgICAgICBtQ3VyT3V0cHV0OworICAgICAgICBib29sICAgICAgICAgICAgbURpcmVjdE91dHB1dDsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVRlc3RPdXRwdXRzW05VTV9URVNUX09VVFBVVFNdOworICAgICAgICBpbnQgICAgICAgICAgICAgbVRlc3RJbnB1dDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0RGV2aWNlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdEZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Q2hhbm5lbHM7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdExhdGVuY3lNczsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKK3ByaXZhdGU6CisgICAgICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvQW1wbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAorICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOworICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQorICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKKyAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsSW5wdXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIHN0YXRpYyBib29sIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgICAgIC8vIGZpbmQgdGhlIG91dHB1dHMgb24gYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGhhdmUgdGhlIGdpdmVuIGFkZHJlc3MuCisgICAgICAgIC8vIHRvIGJlIGNhbGxlZCBvbiBhbiBBdWRpb091dHB1dERlc2NyaXB0b3Igd2hvc2Ugc3VwcG9ydGVkIGRldmljZXMgKGFzIGRlZmluZWQKKyAgICAgICAgLy8gICBpbiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMpIG1hdGNoZXMgdGhlIGRldmljZSB3aG9zZSBhZGRyZXNzIGlzIHRvIGJlIG1hdGNoZWQuCisgICAgICAgIC8vIHNlZSBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCkgZm9yIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQorICAgICAgICAvLyAgIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyLgorICAgICAgICB2b2lkIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CisgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOworICAgICAgICB1aW50MzJfdCBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICB1aW50MzJfdCBjdXJBdWRpb1BvcnRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb247IH0KKyAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgLy8gaW50ZXJuYWwgZnVuY3Rpb24gdG8gZGVyaXZlIGEgc3RyZWFtIHR5cGUgdmFsdWUgZnJvbSBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7Cit9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0MDY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTAsMCArMSwxMDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeVNlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjdW5kZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIF9fU1RESU5UX0xJTUlUUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtDbWREZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgdGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iOworCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrQXVkaW9Db21tYW5kVGltZW91dE5zID0gc2Vjb25kcygzKTsgLy8gMyBzZWNvbmRzCisKK25hbWVzcGFjZSB7CisgICAgZXh0ZXJuIHN0cnVjdCBhdWRpb19wb2xpY3lfc2VydmljZV9vcHMgYXBzX29wczsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeVNlcnZpY2UoKQorICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSwgbXBBdWRpb1BvbGljeURldihOVUxMKSwgbXBBdWRpb1BvbGljeShOVUxMKSwKKyAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIoTlVMTCksIG1BdWRpb1BvbGljeUNsaWVudChOVUxMKSwgbVBob25lU3RhdGUoQVVESU9fTU9ERV9JTlZBTElEKQoreworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCAqbW9kdWxlOworICAgIGludCBmb3JjZWRfdmFsOworICAgIGludCByYzsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAorICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOworICAgICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKKyAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7CisgICAgICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZAorICAgICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtT3V0cHV0IiksIHRoaXMpOworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICAgICAgQUxPR0koIkF1ZGlvUG9saWN5U2VydmljZSBDU1RPUiBpbiBsZWdhY3kgbW9kZSIpOworCisgICAgICAgIC8qIGluc3RhbnRpYXRlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciAqLworICAgICAgICByYyA9IGh3X2dldF9tb2R1bGUoQVVESU9fUE9MSUNZX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1vZHVsZSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJjID0gYXVkaW9fcG9saWN5X2Rldl9vcGVuKG1vZHVsZSwgJm1wQXVkaW9Qb2xpY3lEZXYpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IG9wZW4gYXVkaW8gcG9saWN5IGRldmljZSAoJXMpIiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtcEF1ZGlvUG9saWN5RGV2LT5jcmVhdGVfYXVkaW9fcG9saWN5KG1wQXVkaW9Qb2xpY3lEZXYsICZhcHNfb3BzLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1wQXVkaW9Qb2xpY3kpOworICAgICAgICBBTE9HRV9JRihyYywgImNvdWxkbid0IGNyZWF0ZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbXBBdWRpb1BvbGljeS0+aW5pdF9jaGVjayhtcEF1ZGlvUG9saWN5KTsKKyAgICAgICAgQUxPR0VfSUYocmMsICJjb3VsZG4ndCBpbml0X2NoZWNrIHRoZSBhdWRpbyBwb2xpY3kgKCVzKSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgiTG9hZGVkIGF1ZGlvIHBvbGljeSBmcm9tICVzICglcykiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+aWQpOworI2Vsc2UKKyAgICAgICAgQUxPR0koIkF1ZGlvUG9saWN5U2VydmljZSBDU1RPUiBpbiBuZXcgbW9kZSIpOworCisgICAgICAgIG1BdWRpb1BvbGljeUNsaWVudCA9IG5ldyBBdWRpb1BvbGljeUNsaWVudCh0aGlzKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlciA9IGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihtQXVkaW9Qb2xpY3lDbGllbnQpOworI2VuZGlmCisgICAgfQorICAgIC8vIGxvYWQgYXVkaW8gcHJvY2Vzc2luZyBtb2R1bGVzCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0cyA9IG5ldyBBdWRpb1BvbGljeUVmZmVjdHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1BdWRpb1BvbGljeUVmZmVjdHMgPSBhdWRpb1BvbGljeUVmZmVjdHM7CisgICAgfQorfQorCitBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQoreworICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmV4aXQoKTsKKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgaWYgKG1wQXVkaW9Qb2xpY3kgIT0gTlVMTCAmJiBtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgbXBBdWRpb1BvbGljeURldi0+ZGVzdHJveV9hdWRpb19wb2xpY3kobXBBdWRpb1BvbGljeURldiwgbXBBdWRpb1BvbGljeSk7CisgICAgfQorICAgIGlmIChtcEF1ZGlvUG9saWN5RGV2ICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9jbG9zZShtcEF1ZGlvUG9saWN5RGV2KTsKKyAgICB9CisjZWxzZQorICAgIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIobUF1ZGlvUG9saWN5TWFuYWdlcik7CisgICAgZGVsZXRlIG1BdWRpb1BvbGljeUNsaWVudDsKKyNlbmRpZgorCisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuY2xlYXIoKTsKKyAgICBtQXVkaW9Qb2xpY3lFZmZlY3RzLmNsZWFyKCk7Cit9CisKKy8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcworLy8gY29ubmVjdHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlLgordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCit7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQiLCBjbGllbnQuZ2V0KCksIHVpZCk7CisKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBjbGllbnQtPmFzQmluZGVyKCk7CisgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICB9Cit9CisKKy8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odWlkKTsKKworI2lmbmRlZiBVU0VfTEVHQUNZX0FVRElPX1BPTElDWQorICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2xlYXJBdWRpb1BhdGNoZXModWlkKTsKKyAgICAgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT51cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+dXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Y2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiBtQXVkaW9Db21tYW5kVGhyZWFkLT5jcmVhdGVBdWRpb1BhdGNoQ29tbWFuZChwYXRjaCwgaGFuZGxlLCBkZWxheU1zKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRSZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChoYW5kbGUsIGRlbGF5TXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICByZXR1cm4gbUF1ZGlvQ29tbWFuZFRocmVhZC0+c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25maWcsIGRlbGF5TXMpOworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KQoreworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6fk5vdGlmaWNhdGlvbkNsaWVudCgpCit7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKK3sKKyAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IDApIHsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CisgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKK30KKworc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCit7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOworICAgIH0KKyAgICByZXR1cm4gbG9ja2VkOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBJbnRlcm5hbHMoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisjaWZkZWYgVVNFX0xFR0FDWV9BVURJT19QT0xJQ1kKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQb2xpY3lNYW5hZ2VyIEludGVyZmFjZTogJXBcbiIsIG1wQXVkaW9Qb2xpY3kpOworI2Vsc2UKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXI6ICVwXG4iLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyKTsKKyNlbmRpZgorICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit7CisgICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7CisgICAgICAgIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBkdW1wSW50ZXJuYWxzKGZkKTsKKyAgICAgICAgaWYgKG1BdWRpb0NvbW1hbmRUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Ub25lUGxheWJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+ZHVtcChmZCk7CisgICAgICAgIH0KKworI2lmZGVmIFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZCisgICAgICAgIGlmIChtcEF1ZGlvUG9saWN5KSB7CisgICAgICAgICAgICBtcEF1ZGlvUG9saWN5LT5kdW1wKG1wQXVkaW9Qb2xpY3ksIGZkKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmR1bXAoZmQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgImNhbid0IGR1bXAgQXVkaW9Qb2xpY3lTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKKyAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gQm5BdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCisvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQorCitBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKKyAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQoreworICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Cit9CisKKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6On5BdWRpb0NvbW1hbmRUaHJlYWQoKQoreworICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKKyAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBydW4obU5hbWUuc3RyaW5nKCksIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp0aHJlYWRMb29wKCkKK3sKKyAgICBuc2Vjc190IHdhaXRUaW1lID0gSU5UNjRfTUFYOworCisgICAgbUxvY2subG9jaygpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc3ZjOworICAgICAgICB3aGlsZSAoIW1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgbnNlY3NfdCBjdXJUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgLy8gY29tbWFuZHMgYXJlIHNvcnRlZCBieSBpbmNyZWFzaW5nIHRpbWUgc3RhbXA6IGV4ZWN1dGUgdGhlbSBmcm9tIGluZGV4IDAgYW5kIHVwCisgICAgICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIDw9IGN1clRpbWUpIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBtQXVkaW9Db21tYW5kc1swXTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Db21tYW5kcy5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogeworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CisgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7CisgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CisgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogeworICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSAoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGNyZWF0ZSBhdWRpbyBwYXRjaCIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSAoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIGF1ZGlvIHBhdGNoIik7CisgICAgICAgICAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlIGF1ZGlvIHBvcnQgbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QQVRDSF9MSVNUOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyBwYXRjaCBsaXN0Iik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfQVVESU9QT1JUX0NPTkZJRzogeworICAgICAgICAgICAgICAgICAgICBTZXRBdWRpb1BvcnRDb25maWdEYXRhICpkYXRhID0gKFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwb3J0IGNvbmZpZyIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woY29tbWFuZC0+bUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YWl0VGltZSA9IElOVDY0X01BWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FpdFRpbWUgPSBtQXVkaW9Db21tYW5kc1swXS0+bVRpbWUgLSBjdXJUaW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgbUxvY2sgYmVmb3JlIHJlbGVhc2luZyBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBzZXJ2aWNlIGFzCisgICAgICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBkZXN0cnVjdG9yIGNhbGxzIEF1ZGlvQ29tbWFuZFRocmVhZDo6ZXhpdCgpIHdoaWNoIGFjcXVpcmVzIG1Mb2NrLgorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgc3ZjLmNsZWFyKCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKCFleGl0UGVuZGluZygpICYmIG1BdWRpb0NvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gcmVsZWFzZSBkZWxheWVkIGNvbW1hbmRzIHdha2UgbG9jaworICAgICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7CisgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRUaW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB3YWtpbmcgdXAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGJlZm9yZSBxdWl0dGluZworICAgIGlmICghbUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb0NvbW1hbmRUaHJlYWQgJXAgRHVtcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICBTdHJpbmc4IHJlc3VsdDIoa0NtZERlYWRsb2NrZWRTdHJpbmcpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0Mi5zdHJpbmcoKSwgcmVzdWx0Mi5zaXplKCkpOworICAgIH0KKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gQ29tbWFuZHM6XG4iKTsKKyAgICByZXN1bHQgPSBTdHJpbmc4KGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgQ29tbWFuZCBUaW1lICAgICAgICBXYWl0IHBQYXJhbVxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Db21tYW5kcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9Db21tYW5kc1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIiAgTGFzdCBDb21tYW5kXG4iKTsKKyAgICBpZiAobUxhc3RDb21tYW5kICE9IDApIHsKKyAgICAgICAgbUxhc3RDb21tYW5kLT5kdW1wKGJ1ZmZlciwgU0laRSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgIG5vbmVcbiIpOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHR5cGUsCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUQVJUX1RPTkU7CisgICAgc3A8VG9uZURhdGE+IGRhdGEgPSBuZXcgVG9uZURhdGEoKTsKKyAgICBkYXRhLT5tVHlwZSA9IHR5cGU7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdGFydCB0eXBlICVkLCBzdHJlYW0gJWQiLCB0eXBlLCBzdHJlYW0pOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wVG9uZUNvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfVE9ORTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RvcCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9WT0xVTUU7CisgICAgc3A8Vm9sdW1lRGF0YT4gZGF0YSA9IG5ldyBWb2x1bWVEYXRhKCk7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBkYXRhLT5tVm9sdW1lID0gdm9sdW1lOworICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCB2b2x1bWUgJWYsIG91dHB1dCAlZCIsCisgICAgICAgICAgICBzdHJlYW0sIHZvbHVtZSwgb3V0cHV0KTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9QQVJBTUVURVJTOworICAgIHNwPFBhcmFtZXRlcnNEYXRhPiBkYXRhID0gbmV3IFBhcmFtZXRlcnNEYXRhKCk7CisgICAgZGF0YS0+bUlPID0gaW9IYW5kbGU7CisgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMgPSBTdHJpbmc4KGtleVZhbHVlUGFpcnMpOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLCBpb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX1ZPSUNFX1ZPTFVNRTsKKyAgICBzcDxWb2ljZVZvbHVtZURhdGE+IGRhdGEgPSBuZXcgVm9pY2VWb2x1bWVEYXRhKCk7CisgICAgZGF0YS0+bVZvbHVtZSA9IHZvbHVtZTsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gdHJ1ZTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwgdm9sdW1lKTsKKyAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7CisgICAgc3A8U3RvcE91dHB1dERhdGE+IGRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKKyAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7CisgICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKKyAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfT1VUUFVUOworICAgIHNwPFJlbGVhc2VPdXRwdXREYXRhPiBkYXRhID0gbmV3IFJlbGVhc2VPdXRwdXREYXRhKCk7CisgICAgZGF0YS0+bUlPID0gb3V0cHV0OworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDUkVBVEVfQVVESU9fUEFUQ0g7CisgICAgQ3JlYXRlQXVkaW9QYXRjaERhdGEgKmRhdGEgPSBuZXcgQ3JlYXRlQXVkaW9QYXRjaERhdGEoKTsKKyAgICBkYXRhLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgZGF0YS0+bUhhbmRsZSA9ICpoYW5kbGU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IHRydWU7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBjcmVhdGUgcGF0Y2ggZGVsYXkgJWQiLCBkZWxheU1zKTsKKyAgICBzdGF0dXMgPSBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpoYW5kbGUgPSBkYXRhLT5tSGFuZGxlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX0FVRElPX1BBVENIOworICAgIFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqZGF0YSA9IG5ldyBSZWxlYXNlQXVkaW9QYXRjaERhdGEoKTsKKyAgICBkYXRhLT5tSGFuZGxlID0gaGFuZGxlOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBwYXRjaCBkZWxheSAlZCIsIGRlbGF5TXMpOworICAgIHJldHVybiBzZW5kQ29tbWFuZChjb21tYW5kLCBkZWxheU1zKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQXVkaW9Qb3J0TGlzdENvbW1hbmQoKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BVURJT1BPUlRfTElTVDsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHVwZGF0ZSBhdWRpbyBwb3J0IGxpc3QiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dXBkYXRlQXVkaW9QYXRjaExpc3RDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFVQREFURV9BVURJT1BBVENIX0xJU1Q7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB1cGRhdGUgYXVkaW8gcGF0Y2ggbGlzdCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9BVURJT1BPUlRfQ09ORklHOworICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSBuZXcgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSgpOworICAgIGRhdGEtPm1Db25maWcgPSAqY29uZmlnOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgY29tbWFuZC0+bVdhaXRTdGF0dXMgPSB0cnVlOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBvcnQgY29uZmlnIGRlbGF5ICVkIiwgZGVsYXlNcyk7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMpCit7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7CisgICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2woY29tbWFuZC0+bUxvY2spOworICAgIHdoaWxlIChjb21tYW5kLT5tV2FpdFN0YXR1cykgeworICAgICAgICBuc2Vjc190IHRpbWVPdXROcyA9IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgKyBtaWxsaXNlY29uZHMoZGVsYXlNcyk7CisgICAgICAgIGlmIChjb21tYW5kLT5tQ29uZC53YWl0UmVsYXRpdmUoY29tbWFuZC0+bUxvY2ssIHRpbWVPdXROcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBUSU1FRF9PVVQ7CisgICAgICAgICAgICBjb21tYW5kLT5tV2FpdFN0YXR1cyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb21tYW5kLT5tU3RhdHVzOworfQorCisvLyBpbnNlcnRDb21tYW5kX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Omluc2VydENvbW1hbmRfbChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGk7ICAvLyBub3Qgc2l6ZV90IGJlY2F1c2UgaSB3aWxsIGNvdW50IGRvd24gdG8gLTEKKyAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gcmVtb3ZlZENvbW1hbmRzOworICAgIGNvbW1hbmQtPm1UaW1lID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKGRlbGF5TXMpOworCisgICAgLy8gYWNxdWlyZSB3YWtlIGxvY2sgdG8gbWFrZSBzdXJlIGRlbGF5ZWQgY29tbWFuZHMgYXJlIHByb2Nlc3NlZAorICAgIGlmIChtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIG1OYW1lLnN0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBzYW1lIHBlbmRpbmcgY29tbWFuZHMgd2l0aCBsYXRlciB0aW1lIHN0YW1wcyBhbmQgZWxpbWluYXRlIHRoZW0KKyAgICBmb3IgKGkgPSBtQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kMiA9IG1BdWRpb0NvbW1hbmRzW2ldOworICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogbm8gbmVlZCB0byBzY2FuIHRoZSByZXN0IG9mIG1BdWRpb0NvbW1hbmRzCisgICAgICAgIGlmIChjb21tYW5kMi0+bVRpbWUgPD0gY29tbWFuZC0+bVRpbWUpIGJyZWFrOworCisgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwYXRjaCBvciByZWxlYXNlIGF1ZGlvIHBhdGNoIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50CisgICAgICAgIC8vIHdpdGggcmVnYXJkIHRvIGZpbHRlcmluZworICAgICAgICBpZiAoKGNvbW1hbmQtPm1Db21tYW5kID09IENSRUFURV9BVURJT19QQVRDSCkgfHwKKyAgICAgICAgICAgICAgICAoY29tbWFuZC0+bUNvbW1hbmQgPT0gUkVMRUFTRV9BVURJT19QQVRDSCkpIHsKKyAgICAgICAgICAgIGlmICgoY29tbWFuZDItPm1Db21tYW5kICE9IENSRUFURV9BVURJT19QQVRDSCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBSRUxFQVNFX0FVRElPX1BBVENIKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCAhPSBjb21tYW5kLT5tQ29tbWFuZCkgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgeworICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CisgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOworICAgICAgICAgICAgQUxPR1YoIkNvbXBhcmluZyBwYXJhbWV0ZXIgY29tbWFuZCAlcyB0byBuZXcgY29tbWFuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCkpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTIgPSBBdWRpb1BhcmFtZXRlcihkYXRhMi0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXJhbS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWU7CisgICAgICAgICAgICAgICAgcGFyYW0uZ2V0QXQoaiwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwYXJhbTIuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBrZXkyOworICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlMjsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0yLmdldEF0KGssIGtleTIsIHZhbHVlMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXkyID09IGtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLnJlbW92ZShrZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0IHBhcmFtZXRlciAlcyIsIGtleTIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBhbGwga2V5cyBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0LCByZW1vdmUgdGhlIGNvbW1hbmQuCisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVwZGF0ZSB0aGUga2V5IHZhbHVlIHBhaXJzCisgICAgICAgICAgICBpZiAocGFyYW0yLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRhdGEyLT5tS2V5VmFsdWVQYWlycyA9IHBhcmFtMi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZC0+bVRpbWUgPSBjb21tYW5kMi0+bVRpbWU7CisgICAgICAgICAgICAvLyBmb3JjZSBkZWxheU1zIHRvIG5vbiAwIHNvIHRoYXQgY29kZSBiZWxvdyBkb2VzIG5vdCByZXF1ZXN0IHRvIHdhaXQgZm9yCisgICAgICAgICAgICAvLyBjb21tYW5kIHN0YXR1cyBhcyB0aGUgY29tbWFuZCBpcyBub3cgZGVsYXllZAorICAgICAgICAgICAgZGVsYXlNcyA9IDE7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CisgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CisgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhMiA9IChWb2x1bWVEYXRhICopY29tbWFuZDItPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChkYXRhLT5tSU8gIT0gZGF0YTItPm1JTykgYnJlYWs7CisgICAgICAgICAgICBpZiAoZGF0YS0+bVN0cmVhbSAhPSBkYXRhMi0+bVN0cmVhbSkgYnJlYWs7CisgICAgICAgICAgICBBTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICByZW1vdmVkQ29tbWFuZHMuYWRkKGNvbW1hbmQyKTsKKyAgICAgICAgICAgIGNvbW1hbmQtPm1UaW1lID0gY29tbWFuZDItPm1UaW1lOworICAgICAgICAgICAgLy8gZm9yY2UgZGVsYXlNcyB0byBub24gMCBzbyB0aGF0IGNvZGUgYmVsb3cgZG9lcyBub3QgcmVxdWVzdCB0byB3YWl0IGZvcgorICAgICAgICAgICAgLy8gY29tbWFuZCBzdGF0dXMgYXMgdGhlIGNvbW1hbmQgaXMgbm93IGRlbGF5ZWQKKyAgICAgICAgICAgIGRlbGF5TXMgPSAxOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgICAgIGlmIChjb21tYW5kLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaCA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tUGF0Y2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZSA9ICgoUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZTI7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2gyOworICAgICAgICAgICAgaWYgKGNvbW1hbmQyLT5tQ29tbWFuZCA9PSBDUkVBVEVfQVVESU9fUEFUQ0gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUyID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBhdGNoMiA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kbGUyID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gaGFuZGxlMikgYnJlYWs7CisgICAgICAgICAgICAvKiBGaWx0ZXIgQ1JFQVRFX0FVRElPX1BBVENIIGNvbW1hbmRzIG9ubHkgd2hlbiB0aGV5IGFyZSBpc3N1ZWQgZm9yCisgICAgICAgICAgICAgICBzYW1lIG91dHB1dC4gKi8KKyAgICAgICAgICAgIGlmKCAoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSAmJgorICAgICAgICAgICAgICAgIChjb21tYW5kMi0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSApIHsKKyAgICAgICAgICAgICAgICBib29sIGlzT3V0cHV0RGlmZiA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwYXRjaC5udW1fc291cmNlcyA9PSBwYXRjaDIubnVtX3NvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjb3VudCA9IDA7IGNvdW50IDwgcGF0Y2gubnVtX3NvdXJjZXM7IGNvdW50KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC5zb3VyY2VzW2NvdW50XS5pZCAhPSBwYXRjaDIuc291cmNlc1tjb3VudF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dHB1dERpZmYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc091dHB1dERpZmYpCisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJGaWx0ZXJpbmcgb3V0ICVzIGF1ZGlvIHBhdGNoIGNvbW1hbmQgZm9yIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAoY29tbWFuZC0+bUNvbW1hbmQgPT0gQ1JFQVRFX0FVRElPX1BBVENIKSA/ICJjcmVhdGUiIDogInJlbGVhc2UiLCBoYW5kbGUpOworICAgICAgICAgICAgcmVtb3ZlZENvbW1hbmRzLmFkZChjb21tYW5kMik7CisgICAgICAgICAgICBjb21tYW5kLT5tVGltZSA9IGNvbW1hbmQyLT5tVGltZTsKKyAgICAgICAgICAgIC8vIGZvcmNlIGRlbGF5TXMgdG8gbm9uIDAgc28gdGhhdCBjb2RlIGJlbG93IGRvZXMgbm90IHJlcXVlc3QgdG8gd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIGNvbW1hbmQgc3RhdHVzIGFzIHRoZSBjb21tYW5kIGlzIG5vdyBkZWxheWVkCisgICAgICAgICAgICBkZWxheU1zID0gMTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNUQVJUX1RPTkU6CisgICAgICAgIGNhc2UgU1RPUF9UT05FOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZW1vdmUgZmlsdGVyZWQgY29tbWFuZHMKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlbW92ZWRDb21tYW5kcy5zaXplKCk7IGorKykgeworICAgICAgICAvLyByZW1vdmVkIGNvbW1hbmRzIGFsd2F5cyBoYXZlIHRpbWUgc3RhbXBzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGNvbW1hbmQKKyAgICAgICAgZm9yIChzaXplX3QgayA9IGkgKyAxOyBrIDwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChtQXVkaW9Db21tYW5kc1trXS5nZXQoKSA9PSByZW1vdmVkQ29tbWFuZHNbal0uZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic3VwcHJlc3NpbmcgY29tbWFuZDogJWQiLCBtQXVkaW9Db21tYW5kc1trXS0+bUNvbW1hbmQpOworICAgICAgICAgICAgICAgIG1BdWRpb0NvbW1hbmRzLnJlbW92ZUF0KGspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJlbW92ZWRDb21tYW5kcy5jbGVhcigpOworCisgICAgLy8gRGlzYWJsZSB3YWl0IGZvciBzdGF0dXMgaWYgZGVsYXkgaXMgbm90IDAKKyAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CisgICAgICAgIGNvbW1hbmQtPm1XYWl0U3RhdHVzID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5zZXJ0IGNvbW1hbmQgYXQgdGhlIHJpZ2h0IHBsYWNlIGFjY29yZGluZyB0byBpdHMgdGltZSBzdGFtcAorICAgIEFMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJXpkLCBudW0gY29tbWFuZHMgJXp1IiwKKyAgICAgICAgICAgIGNvbW1hbmQtPm1Db21tYW5kLCBpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7CisgICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkKK3sKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0Iik7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OkF1ZGlvQ29tbWFuZDo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwMmQgICAgICAlMDZkLiUwM2QgICUwMXUgICAgJXBcbiIsCisgICAgICAgICAgICBtQ29tbWFuZCwKKyAgICAgICAgICAgIChpbnQpbnMycyhtVGltZSksCisgICAgICAgICAgICAoaW50KW5zMm1zKG1UaW1lKSUxMDAwLAorICAgICAgICAgICAgbVdhaXRTdGF0dXMsCisgICAgICAgICAgICBtUGFyYW0uZ2V0KCkpOworfQorCisvKioqKioqKiBoZWxwZXJzIGZvciB0aGUgc2VydmljZV9vcHMgY2FsbGJhY2tzIGRlZmluZWQgYmVsb3cgKioqKioqKioqLwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoc3RyZWFtLCB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOworICAgIH0KKyAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CisgICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAorICAgICAgICAgICAgdG9uZSk7CisgICAgfQorICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCit7CisgICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCit7CisgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7Cit9CisKK2V4dGVybiAiQyIgeworYXVkaW9fbW9kdWxlX2hhbmRsZV90IGFwc19sb2FkX2h3X21vZHVsZSh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXQodm9pZCAqc2VydmljZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9vdXRwdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpwRGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAqcENoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBMYXRlbmN5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9kdXBfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKK2ludCBhcHNfY2xvc2Vfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CitpbnQgYXBzX3N1c3BlbmRfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CitpbnQgYXBzX3Jlc3RvcmVfb3V0cHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CithdWRpb19pb19oYW5kbGVfdCBhcHNfb3Blbl9pbnB1dCh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbl9hY291c3RpY3NfdCBhY291c3RpY3MgX191bnVzZWQpOworYXVkaW9faW9faGFuZGxlX3QgYXBzX29wZW5faW5wdXRfb25fbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqcERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqcEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnBDaGFubmVsTWFzayk7CitpbnQgYXBzX2Nsb3NlX2lucHV0KHZvaWQgKnNlcnZpY2UgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKK2ludCBhcHNfaW52YWxpZGF0ZV9zdHJlYW0odm9pZCAqc2VydmljZSBfX3VudXNlZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworaW50IGFwc19tb3ZlX2VmZmVjdHModm9pZCAqc2VydmljZSBfX3VudXNlZCwgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdF9vdXRwdXQpOworY2hhciAqIGFwc19nZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5cyk7Cit2b2lkIGFwc19zZXRfcGFyYW1ldGVycyh2b2lkICpzZXJ2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBpb19oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmt2X3BhaXJzLCBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlfbXMpOworaW50IGFwc19zdGFydF90b25lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKK2ludCBhcHNfc3RvcF90b25lKHZvaWQgKnNlcnZpY2UpOworaW50IGFwc19zZXRfdm9pY2Vfdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5X21zKTsKK307CisKK25hbWVzcGFjZSB7CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9zZXJ2aWNlX29wcyBhcHNfb3BzID0geworICAgICAgICAub3Blbl9vdXRwdXQgICAgICAgICAgID0gYXBzX29wZW5fb3V0cHV0LAorICAgICAgICAub3Blbl9kdXBsaWNhdGVfb3V0cHV0ID0gYXBzX29wZW5fZHVwX291dHB1dCwKKyAgICAgICAgLmNsb3NlX291dHB1dCAgICAgICAgICA9IGFwc19jbG9zZV9vdXRwdXQsCisgICAgICAgIC5zdXNwZW5kX291dHB1dCAgICAgICAgPSBhcHNfc3VzcGVuZF9vdXRwdXQsCisgICAgICAgIC5yZXN0b3JlX291dHB1dCAgICAgICAgPSBhcHNfcmVzdG9yZV9vdXRwdXQsCisgICAgICAgIC5vcGVuX2lucHV0ICAgICAgICAgICAgPSBhcHNfb3Blbl9pbnB1dCwKKyAgICAgICAgLmNsb3NlX2lucHV0ICAgICAgICAgICA9IGFwc19jbG9zZV9pbnB1dCwKKyAgICAgICAgLnNldF9zdHJlYW1fdm9sdW1lICAgICA9IGFwc19zZXRfc3RyZWFtX3ZvbHVtZSwKKyAgICAgICAgLmludmFsaWRhdGVfc3RyZWFtICAgICA9IGFwc19pbnZhbGlkYXRlX3N0cmVhbSwKKyAgICAgICAgLnNldF9wYXJhbWV0ZXJzICAgICAgICA9IGFwc19zZXRfcGFyYW1ldGVycywKKyAgICAgICAgLmdldF9wYXJhbWV0ZXJzICAgICAgICA9IGFwc19nZXRfcGFyYW1ldGVycywKKyAgICAgICAgLnN0YXJ0X3RvbmUgICAgICAgICAgICA9IGFwc19zdGFydF90b25lLAorICAgICAgICAuc3RvcF90b25lICAgICAgICAgICAgID0gYXBzX3N0b3BfdG9uZSwKKyAgICAgICAgLnNldF92b2ljZV92b2x1bWUgICAgICA9IGFwc19zZXRfdm9pY2Vfdm9sdW1lLAorICAgICAgICAubW92ZV9lZmZlY3RzICAgICAgICAgID0gYXBzX21vdmVfZWZmZWN0cywKKyAgICAgICAgLmxvYWRfaHdfbW9kdWxlICAgICAgICA9IGFwc19sb2FkX2h3X21vZHVsZSwKKyAgICAgICAgLm9wZW5fb3V0cHV0X29uX21vZHVsZSA9IGFwc19vcGVuX291dHB1dF9vbl9tb2R1bGUsCisgICAgICAgIC5vcGVuX2lucHV0X29uX21vZHVsZSAgPSBhcHNfb3Blbl9pbnB1dF9vbl9tb2R1bGUsCisgICAgfTsKK307IC8vIG5hbWVzcGFjZSA8dW5uYW1lZD4KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2OGFiMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0wLDAgKzEsNTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKKworI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsCisgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Cit7CisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPjsKKworcHVibGljOgorICAgIC8vIGZvciBCaW5kZXJTZXJ2aWNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFNlcnZpY2VOYW1lKCkgQU5EUk9JRF9BUEkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX3BvbGljeSI7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgLy8KKyAgICAvLyBCbkF1ZGlvUG9saWN5U2VydmljZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQorICAgIC8vCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGludCBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworICAgIC8vIFJlZkJhc2UKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7CisKKyAgICAvLworICAgIC8vIEhlbHBlcnMgZm9yIHRoZSBzdHJ1Y3QgYXVkaW9fcG9saWN5X3NlcnZpY2Vfb3BzIGltcGxlbWVudGF0aW9uLgorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0CisgICAgLy8gYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBwb2xpY3kgc2VydmljZS4KKyAgICAvLworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50UmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCk7CisgICAgICAgICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworCitwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+QXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGR1bXBJbnRlcm5hbHMoaW50IGZkKTsKKworICAgIC8vIFRocmVhZCB1c2VkIGZvciB0b25lIHBsYXliYWNrIGFuZCB0byBzZW5kIGF1ZGlvIGNvbmZpZyBjb21tYW5kcyB0byBhdWRpbyBmbGluZ2VyCisgICAgLy8gRm9yIHRvbmUgcGxheWJhY2ssIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkbG9jayB3aXRoIG1Mb2NrIGJlY2F1c2UKKyAgICAvLyBzdGFydFRvbmUoKSBhbmQgc3RvcFRvbmUoKSBhcmUgbm9ybWFsbHkgY2FsbGVkIHdpdGggbUxvY2sgbG9ja2VkIGFuZCByZXF1ZXN0aW5nIGEgdG9uZSBzdGFydAorICAgIC8vIG9yIHN0b3Agd2lsbCBjYXVzZSBjYWxscyB0byBBdWRpb1BvbGljeVNlcnZpY2UgYW5kIGFuIGF0dGVtcHQgdG8gbG9jayBtTG9jay4KKyAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKKyAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCisgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZDsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgLy8gY29tbWFuZHMgZm9yIHRvbmUgQXVkaW9Db21tYW5kCisgICAgICAgIGVudW0geworICAgICAgICAgICAgU1RBUlRfVE9ORSwKKyAgICAgICAgICAgIFNUT1BfVE9ORSwKKyAgICAgICAgICAgIFNFVF9WT0xVTUUsCisgICAgICAgICAgICBTRVRfUEFSQU1FVEVSUywKKyAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUsCisgICAgICAgICAgICBTVE9QX09VVFBVVCwKKyAgICAgICAgICAgIFJFTEVBU0VfT1VUUFVULAorICAgICAgICAgICAgQ1JFQVRFX0FVRElPX1BBVENILAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKKyAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCisgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKKyAgICAgICAgfTsKKworICAgICAgICBBdWRpb0NvbW1hbmRUaHJlYWQgKFN0cmluZzggbmFtZSwgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkF1ZGlvQ29tbWFuZFRocmVhZCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKworICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOworICAgICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcFRvbmVDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBwYXJhbWV0ZXJzQ29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgdm9pY2VWb2x1bWVDb21tYW5kKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZChjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOworCisgICAgICAgIC8vIGRlc2NyaXB0b3IgZm9yIHJlcXVlc3RlZCB0b25lIHBsYXliYWNrIGV2ZW50CisgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZDogcHVibGljIFJlZkJhc2UgeworCisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEF1ZGlvQ29tbWFuZCgpCisgICAgICAgICAgICA6IG1Db21tYW5kKC0xKSwgbVN0YXR1cyhOT19FUlJPUiksIG1XYWl0U3RhdHVzKGZhbHNlKSB7fQorCisgICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCisgICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAorICAgICAgICAgICAgTXV0ZXggbUxvY2s7ICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgdG8gbUNvbmQKKyAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCisgICAgICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBjb21tYW5kIHN0YXR1cworICAgICAgICAgICAgYm9vbCBtV2FpdFN0YXR1czsgLy8gdHJ1ZSBpZiBjYWxsZXIgaXMgd2FpdGluZyBmb3Igc3RhdHVzCisgICAgICAgICAgICBzcDxBdWRpb0NvbW1hbmREYXRhPiBtUGFyYW07ICAgICAvLyBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlciBkYXRhCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTogcHVibGljIFJlZkJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb0NvbW1hbmREYXRhKCkge30KKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgQXVkaW9Db21tYW5kRGF0YSgpIHt9CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVG9uZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSBtVHlwZTsgLy8gdG9uZSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07ICAgIC8vIHN0cmVhbSB0eXBlIChTVEFSVF9UT05FIG9ubHkpCisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVm9sdW1lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgICAgICAgICAgZmxvYXQgbVZvbHVtZTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBQYXJhbWV0ZXJzRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICAgICAgU3RyaW5nOCBtS2V5VmFsdWVQYWlyczsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBWb2ljZVZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGZsb2F0IG1Wb2x1bWU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKKyAgICAgICAgICAgIGludCBtU2Vzc2lvbjsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBSZWxlYXNlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CisgICAgICAgIH07CisKKyAgICAgICAgTXV0ZXggICBtTG9jazsKKyAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOworICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcworICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKKyAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBtTGFzdENvbW1hbmQ7ICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQorICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcworICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgIH07CisKKyAgICBjbGFzcyBBdWRpb1BvbGljeUNsaWVudCA6IHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZQorICAgIHsKKyAgICAgcHVibGljOgorICAgICAgICBBdWRpb1BvbGljeUNsaWVudChBdWRpb1BvbGljeVNlcnZpY2UgKnNlcnZpY2UpIDogbUF1ZGlvUG9saWN5U2VydmljZShzZXJ2aWNlKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUNsaWVudCgpIHt9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gSFcgbW9kdWxlIGZ1bmN0aW9ucworICAgICAgICAvLworCisgICAgICAgIC8vIGxvYWRzIGEgSFcgbW9kdWxlLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gb3V0cHV0IENvbnRyb2wgZnVuY3Rpb25zCisgICAgICAgIC8vCisKKyAgICAgICAgLy8gb3BlbnMgYW4gYXVkaW8gb3V0cHV0IHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVyIHZhbHVlcyBjYW4gaW5kaWNhdGUgdG8gdXNlIHRoZSBkZWZhdWx0IHZhbHVlcworICAgICAgICAvLyBpbiBjYXNlIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBoYXMgbm8gc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGZvciB0aGUgb3V0cHV0IGJlaW5nIG9wZW5lZC4KKyAgICAgICAgLy8gV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgdGhlIHBhcmFtZXRlciB2YWx1ZXMgcmVmbGVjdCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLgorICAgICAgICAvLyBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgY2FuIGNoZWNrIGlmIHRoZSBwcm9wb3NlZCBwYXJhbWV0ZXJzIGFyZSBzdWl0YWJsZSBvciBub3QgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAvLyBjcmVhdGVzIGEgc3BlY2lhbCBvdXRwdXQgdGhhdCBpcyBkdXBsaWNhdGVkIHRvIHRoZSB0d28gb3V0cHV0cyBwYXNzZWQgYXMgYXJndW1lbnRzLiBUaGUgZHVwbGljYXRpb24gaXMgcGVyZm9ybWVkIGJ5CisgICAgICAgIC8vIGEgc3BlY2lhbCBtaXhlciB0aHJlYWQgaW4gdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpOworICAgICAgICAvLyBjbG9zZXMgdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworICAgICAgICAvLyBzdXNwZW5kcyB0aGUgb3V0cHV0LiBXaGVuIGFuIG91dHB1dCBpcyBzdXNwZW5kZWQsIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0gaXMgcGxhY2VkIGluCisgICAgICAgIC8vIHN0YW5kYnkgYW5kIHRoZSBBdWRpb1RyYWNrcyBhdHRhY2hlZCB0byB0aGUgbWl4ZXIgdGhyZWFkIGFyZSBzdGlsbCBwcm9jZXNzZWQgYnV0IHRoZSBvdXRwdXQgbWl4IGlzIGRpc2NhcmRlZC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIC8vIHJlc3RvcmVzIGEgc3VzcGVuZGVkIG91dHB1dC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXVkaW8gaW5wdXQgQ29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBvcGVucyBhbiBhdWRpbyBpbnB1dAorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLy8gY2xvc2VzIGFuIGF1ZGlvIGlucHV0CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CisgICAgICAgIC8vCisgICAgICAgIC8vIG1pc2MgY29udHJvbCBmdW5jdGlvbnMKKyAgICAgICAgLy8KKworICAgICAgICAvLyBzZXQgYSBzdHJlYW0gdm9sdW1lIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0LiBGb3IgdGhlIHNhbWUgdXNlciBzZXR0aW5nLCBhIGdpdmVuIHN0cmVhbSB0eXBlIGNhbiBoYXZlIGRpZmZlcmVudCB2b2x1bWVzCisgICAgICAgIC8vIGZvciBlYWNoIG91dHB1dCAoZGVzdGluYXRpb24gZGV2aWNlKSBpdCBpcyBhdHRhY2hlZCB0by4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBpbnQgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8vIGludmFsaWRhdGUgYSBzdHJlYW0gdHlwZSwgY2F1c2luZyBhIHJlcm91dGUgdG8gYW4gdW5zcGVjaWZpZWQgbmV3IG91dHB1dAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHNlbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlLgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgLy8gZnVuY3Rpb24gZW5hYmxpbmcgdG8gcmVjZWl2ZSBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbnMgZGlyZWN0bHkgZnJvbSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgdG8gYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKKyAgICAgICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKKworICAgICAgICAvLyBzZXQgZG93biBsaW5rIGF1ZGlvIHZvbHVtZS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisKKyAgICAgICAgLy8gbW92ZSBlZmZlY3QgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworCisgICAgICAgIC8qIENyZWF0ZSBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgLyogUmVsZWFzZSBhIHBhdGNoICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKworICAgICAgICAvKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcyk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworCisgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZCgpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSAqbUF1ZGlvUG9saWN5U2VydmljZTsKKyAgICB9OworCisgICAgLy8gLS0tIE5vdGlmaWNhdGlvbiBDbGllbnQgLS0tCisgICAgY2xhc3MgTm90aWZpY2F0aW9uQ2xpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBOb3RpZmljYXRpb25DbGllbnQmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQmIG9wZXJhdG9yID0gKGNvbnN0IE5vdGlmaWNhdGlvbkNsaWVudCYpOworCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOworICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OworICAgIH07CisKKyAgICAvLyBJbnRlcm5hbCBkdW1wIHV0aWxpdGllcy4KKyAgICBzdGF0dXNfdCBkdW1wUGVybWlzc2lvbkRlbmlhbChpbnQgZmQpOworCisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtQXVkaW9Db21tYW5kVGhyZWFkOyAgICAgLy8gYXVkaW8gY29tbWFuZHMgdGhyZWFkCisgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtVG9uZVBsYXliYWNrVGhyZWFkOyAgICAgLy8gdG9uZSBwbGF5YmFjayB0aHJlYWQKKyAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1PdXRwdXRDb21tYW5kVGhyZWFkOyAgICAvLyBwcm9jZXNzIHN0b3AgYW5kIHJlbGVhc2Ugb3V0cHV0CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeV9kZXZpY2UgKm1wQXVkaW9Qb2xpY3lEZXY7CisgICAgc3RydWN0IGF1ZGlvX3BvbGljeSAqbXBBdWRpb1BvbGljeTsKKyAgICBBdWRpb1BvbGljeUludGVyZmFjZSAqbUF1ZGlvUG9saWN5TWFuYWdlcjsKKyAgICBBdWRpb1BvbGljeUNsaWVudCAqbUF1ZGlvUG9saWN5Q2xpZW50OworCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCB1aWRfdCwgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiA+ICAgIG1Ob3RpZmljYXRpb25DbGllbnRzOworCisgICAgLy8gTWFuYWdlIGFsbCBlZmZlY3RzIGNvbmZpZ3VyZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBtQXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeS5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODNmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZgpAQCAtMCwwICsxLDE0NSBAQAorIworIyBUZW1wbGF0ZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisjCisKKyMgR2xvYmFsIGNvbmZpZ3VyYXRpb24gc2VjdGlvbjoKKyMgLSBiZWZvcmUgYXVkaW8gSEFMIHZlcnNpb24gMy4wOgorIyAgIGxpc3RzIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyBhbHdheXMgcHJlc2VudCBvbiB0aGUgZGV2aWNlCisjICAgYXMgd2VsbCBhcyB0aGUgb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0LgorIyAgIERldmljZXMgYXJlIGRlc2lnbmF0ZWQgYnkgYSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZW51bSBpbiBhdWRpby5oCisjCisjICBnbG9iYWxfY29uZmlndXJhdGlvbiB7CisjICAgIGF0dGFjaGVkX291dHB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICBkZWZhdWx0X291dHB1dF9kZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgIGF0dGFjaGVkX2lucHV0X2RldmljZXMgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisjICB9CisjCisjIC0gYWZ0ZXIgYW5kIGluY2x1ZGluZyBhdWRpbyBIQUwgMy4wIHRoZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uIGlzIGluY2x1ZGVkIGluIGVhY2gKKyMgICBoYXJkd2FyZSBtb2R1bGUgc2VjdGlvbi4KKyMgICBpdCBhbHNvIGluY2x1ZGVzIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBvZiB0aGlzIGh3IG1vZHVsZToKKyMgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyMgICAgLi4uCisjICAgICBhdWRpb19oYWxfdmVyc2lvbiA8bWFqb3IubWlub3I+ICAjIGF1ZGlvIEhBTCB2ZXJzaW9uIGluIGUuZy4gMy4wCisjICB9CisjICAgb3RoZXIgYXR0cmlidXRlcyAoYXR0YWNoZWQgZGV2aWNlcywgZGVmYXVsdCBkZXZpY2UpIGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCisjICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gc2VjdGlvbiBvZiBlYWNoIGhhcmR3YXJlIG1vZHVsZQorCisKKyMgYXVkaW8gaGFyZHdhcmUgbW9kdWxlIHNlY3Rpb246IGNvbnRhaW5zIGRlc2NyaXB0b3JzIGZvciBhbGwgYXVkaW8gaHcgbW9kdWxlcyBwcmVzZW50IG9uIHRoZQorIyBkZXZpY2UuIEVhY2ggaHcgbW9kdWxlIG5vZGUgaXMgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgaHcgbW9kdWxlIGxpYnJhcnkgYmFzZSBuYW1lLgorIyBGb3IgaW5zdGFuY2UsICJwcmltYXJ5IiBjb3JyZXNwb25kcyB0byBhdWRpby5wcmltYXJ5LjxkZXZpY2U+LnNvLgorIyBUaGUgInByaW1hcnkiIG1vZHVsZSBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgb3V0cHV0IHdpdGgKKyMgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSBmbGFnLgorIyBFYWNoIG1vZHVsZSBkZXNjcmlwdG9yIGNvbnRhaW5zIG9uZSBvciBtb3JlIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0b3JzIGFuZCB6ZXJvIG9yIG1vcmUKKyMgaW5wdXQgcHJvZmlsZSBkZXNjcmlwdG9ycy4gRWFjaCBwcm9maWxlIGxpc3RzIGFsbCB0aGUgcGFyYW1ldGVycyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBvdXRwdXQKKyMgb3IgaW5wdXQgc3RyZWFtIGNhdGVnb3J5LgorIyBUaGUgImNoYW5uZWxfbWFza3MiLCAiZm9ybWF0cyIsICJkZXZpY2VzIiBhbmQgImZsYWdzIiBhcmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZ3MgY29ycmVzcG9uZGluZworIyB0byBlbnVtcyBpbiBhdWRpby5oIGFuZCBhdWRpb19wb2xpY3kuaC4gVGhleSBhcmUgY29uY2F0ZW5hdGVkIGJ5IHVzZSBvZiAifCIgd2l0aG91dCBzcGFjZSBvciAiXG4iLgorIworIyBGb3IgYXVkaW8gSEFMIHZlcnNpb24gcG9zdGVyaW9yIHRvIDMuMCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIG9yIHN1YiBzZWN0aW9ucyBjYW4gYmUgcHJlc2VudCBpbgorIyBhIGh3IG1vZHVsZSBzZWN0aW9uOgorIyAtIEEgImdsb2JhbF9jb25maWd1cmF0aW9uIiBzZWN0aW9uOiBzZWUgYWJvdmUKKyMgLSBPcHRpb25hbGx5IGEgImRldmljZXMiIHNlY3Rpb246CisjICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlc2NyaXB0b3JzIGZvciBhdWRpbyBkZXZpY2VzIHdpdGggYXR0cmlidXRlcyBsaWtlIGFuIGFkZHJlc3Mgb3IgYQorIyAgIGdhaW4gY29udHJvbGxlci4gVGhlIHN5bnRheCBmb3IgdGhlIGRldmljZXMgc2VjdGlvbiBhbmQgZGV2aWNlIGRlc2NyaXB0b3IgaXMgYXMgZm9sbG93czoKKyMgICAgZGV2aWNlcyB7CisjICAgICAgPGRldmljZSBuYW1lPiB7ICAgICAgICAgICAgICAjIDxkZXZpY2UgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZQorIyAgICAgICAgdHlwZSA8ZGV2aWNlIHR5cGU+ICAgICAgICAgIyA8ZGV2aWNlIHR5cGU+IGUuZy4gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCisjICAgICAgICBhZGRyZXNzIDxhZGRyZXNzPiAgICAgICAgICAjIG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0IGluIGxlbmd0aAorIyAgICAgIH0KKyMgICAgfQorIyAtIG9uZSBvciBtb3JlICJnYWlucyIgc2VjdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4gYSBkZXZpY2UgZGVzY3JpcHRvciBzZWN0aW9uLgorIyAgIElmIHByZXNlbnQsIHRoZXkgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiBnYWluIGNvbnRyb2xsZXJzIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQgb3IKKyMgICBvdXRwdXQgZGV2aWNlLiBlLmcuIDoKKyMgICA8ZGV2aWNlIG5hbWU+IHsgICAgICAgICAgICAgICAgICAjIDxkZXZpY2UgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZQorIyAgICAgdHlwZSA8ZGV2aWNlIHR5cGU+ICAgICAgICAgICAgICMgPGRldmljZSB0eXBlPiBlLmcuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorIyAgICAgYWRkcmVzcyA8YWRkcmVzcz4gICAgICAgICAgICAgICMgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQgaW4gbGVuZ3RoCisjICAgICBnYWlucyB7CisjICAgICAgIDxnYWluIG5hbWU+IHsKKyMgICAgICAgICBtb2RlIDxnYWluIG1vZGVzIHN1cHBvcnRlZD4gICAgICAgICAgICAgICMgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMKKyMgICAgICAgICBjaGFubmVsX21hc2sgPGNvbnRyb2xsZWQgY2hhbm5lbHM+ICAgICAgICMgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTCisjICAgICAgICAgbWluX3ZhbHVlX21CIDxtaW4gdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgbWF4X3ZhbHVlX21CIDxtYXggdmFsdWUgaW4gbWlsbGliZWw+CisjICAgICAgICAgZGVmYXVsdF92YWx1ZV9tQiA8ZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbD4KKyMgICAgICAgICBzdGVwX3ZhbHVlX21CIDxzdGVwIHZhbHVlIGluIG1pbGxpYmVsPgorIyAgICAgICAgIG1pbl9yYW1wX21zIDxtaW4gZHVyYXRpb24gaW4gbXM+ICAgICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUAorIyAgICAgICAgIG1heF9yYW1wX21zIDxtYXggZHVyYXRpb24gbXM+ICAgICAgICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUAorIyAgICAgICB9CisjICAgICB9CisjICAgfQorIyAtIHdoZW4gYSBkZXZpY2UgZGVzY3JpcHRvciBpcyBwcmVzZW50LCBvdXRwdXQgYW5kIGlucHV0IHByb2ZpbGVzIGNhbiByZWZlciB0byB0aGlzIGRldmljZSBieQorIyBpdHMgbmFtZSBpbiB0aGVpciAiZGV2aWNlcyIgc2VjdGlvbiBpbnN0ZWFkIG9mIHNwZWNpZnlpbmcgYSBkZXZpY2UgdHlwZS4gZS5nLiA6CisjICAgb3V0cHV0cyB7CisjICAgICBwcmltYXJ5IHsKKyMgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDQxMDAKKyMgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyMgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorIyAgICAgICBkZXZpY2VzIDxkZXZpY2UgbmFtZT4KKyMgICAgICAgZmxhZ3MgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWQorIyAgICAgfQorIyAgIH0KKyMgc2FtcGxlIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgYmVsb3cKKworYXVkaW9faHdfbW9kdWxlcyB7CisgIHByaW1hcnkgeworICAgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyAgICAgIGF0dGFjaGVkX291dHB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgZGVmYXVsdF9vdXRwdXRfZGV2aWNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMKKyAgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDMuMAorICAgIH0KKyAgICBkZXZpY2VzIHsKKyAgICAgIHNwZWFrZXIgeworICAgICAgICB0eXBlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgICBnYWlucyB7CisgICAgICAgICAgZ2Fpbl8xIHsKKyAgICAgICAgICAgIG1vZGUgQVVESU9fR0FJTl9NT0RFX0pPSU5UCisgICAgICAgICAgICBtaW5fdmFsdWVfbUIgLTg0MDAKKyAgICAgICAgICAgIG1heF92YWx1ZV9tQiA0MDAwCisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlX21CIDAKKyAgICAgICAgICAgIHN0ZXBfdmFsdWVfbUIgMTAwCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG91dHB1dHMgeworICAgICAgcHJpbWFyeSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBzcGVha2VyCisgICAgICAgIGZsYWdzIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRzIHsKKyAgICAgIHByaW1hcnkgeworICAgICAgICBzYW1wbGluZ19yYXRlcyA4MDAwfDE2MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9JTl9NT05PCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcl9zdWJtaXggeworICAgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKKyAgICAgIGF0dGFjaGVkX2lucHV0X2RldmljZXMgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDIuMAorICAgIH0KKyAgICBvdXRwdXRzIHsKKyAgICAgIHN1Ym1peCB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgIGZvcm1hdHMgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKyAgICAgICAgZGV2aWNlcyBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRzIHsKKyAgICAgIHN1Ym1peCB7CisgICAgICAgIHNhbXBsaW5nX3JhdGVzIDQ4MDAwCisgICAgICAgIGNoYW5uZWxfbWFza3MgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYCisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3lfY29uZi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTM1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUE9MSUNZX0NPTkZfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgIERlZmluaXRpb25zIGZvciBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIChhdWRpb19wb2xpY3kuY29uZikKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTiAzMgorCisjZGVmaW5lIEFVRElPX1BPTElDWV9DT05GSUdfRklMRSAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5LmNvbmYiCisjZGVmaW5lIEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeS5jb25mIgorCisvLyBnbG9iYWwgY29uZmlndXJhdGlvbgorI2RlZmluZSBHTE9CQUxfQ09ORklHX1RBRyAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iCisKKyNkZWZpbmUgQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHICJhdHRhY2hlZF9vdXRwdXRfZGV2aWNlcyIKKyNkZWZpbmUgREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRyAiZGVmYXVsdF9vdXRwdXRfZGV2aWNlIgorI2RlZmluZSBBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRyAiYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyIKKyNkZWZpbmUgU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcgInNwZWFrZXJfZHJjX2VuYWJsZWQiCisjZGVmaW5lIEFVRElPX0hBTF9WRVJTSU9OX1RBRyAiYXVkaW9faGFsX3ZlcnNpb24iCisKKy8vIGh3IG1vZHVsZXMgZGVzY3JpcHRpb25zCisjZGVmaW5lIEFVRElPX0hXX01PRFVMRV9UQUcgImF1ZGlvX2h3X21vZHVsZXMiCisKKyNkZWZpbmUgT1VUUFVUU19UQUcgIm91dHB1dHMiCisjZGVmaW5lIElOUFVUU19UQUcgImlucHV0cyIKKworI2RlZmluZSBTQU1QTElOR19SQVRFU19UQUcgInNhbXBsaW5nX3JhdGVzIgorI2RlZmluZSBGT1JNQVRTX1RBRyAiZm9ybWF0cyIKKyNkZWZpbmUgQ0hBTk5FTFNfVEFHICJjaGFubmVsX21hc2tzIgorI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKKyNkZWZpbmUgRkxBR1NfVEFHICJmbGFncyIKKworI2RlZmluZSBEWU5BTUlDX1ZBTFVFX1RBRyAiZHluYW1pYyIgLy8gc3BlY2lhbCB2YWx1ZSBmb3IgImNoYW5uZWxfbWFza3MiLCAic2FtcGxpbmdfcmF0ZXMiIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcm1hdHMiIGluIG91dHB1dHMgZGVzY3JpcHRvcnMgaW5kaWNhdGluZyB0aGF0IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNob3VsZCBiZSBxdWVyaWVkIGFmdGVyIG9wZW5pbmcgdGhlIG91dHB1dC4KKworI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKKyNkZWZpbmUgREVWSUNFX1RZUEUgInR5cGUiCisjZGVmaW5lIERFVklDRV9BRERSRVNTICJhZGRyZXNzIgorCisjZGVmaW5lIE1JWEVSU19UQUcgIm1peGVycyIKKyNkZWZpbmUgTUlYRVJfVFlQRSAidHlwZSIKKyNkZWZpbmUgTUlYRVJfVFlQRV9NVVggIm11eCIKKyNkZWZpbmUgTUlYRVJfVFlQRV9NSVggIm1peCIKKworI2RlZmluZSBHQUlOU19UQUcgImdhaW5zIgorI2RlZmluZSBHQUlOX01PREUgIm1vZGUiCisjZGVmaW5lIEdBSU5fQ0hBTk5FTFMgImNoYW5uZWxfbWFzayIKKyNkZWZpbmUgR0FJTl9NSU5fVkFMVUUgIm1pbl92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9NQVhfVkFMVUUgIm1heF92YWx1ZV9tQiIKKyNkZWZpbmUgR0FJTl9ERUZBVUxUX1ZBTFVFICJkZWZhdWx0X3ZhbHVlX21CIgorI2RlZmluZSBHQUlOX1NURVBfVkFMVUUgInN0ZXBfdmFsdWVfbUIiCisjZGVmaW5lIEdBSU5fTUlOX1JBTVBfTVMgIm1pbl9yYW1wX21zIgorI2RlZmluZSBHQUlOX01BWF9SQU1QX01TICJtYXhfcmFtcF9tcyIKKworCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA1MWJhNjk4Li5lMTg0ZDk3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEsMyArMSwxNyBAQAorIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAogIwpAQCAtMjAsNiArMzQsNyBAQAogICAgIGFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAorICAgIGFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvQnVyc3RDYXB0dXJlLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCBcCiAgICAgYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIFwKQEAgLTMzLDYgKzQ4LDcgQEAKICAgICBkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgXAogICAgIGRldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgXAorICAgIGRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBcCiAgICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCiAgICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAogICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXApAQCAtNTMsNiArNjksNyBAQAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKICAgICBleHRlcm5hbC9qcGVnCiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRGV2aWNlRmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAppbmRleCA3ZmRmMzA0Li5iZmVmNTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcApAQCAtNDYsNiArNDYsOCBAQAogICAgICAgICAgICAgZGV2aWNlID0gbmV3IENhbWVyYTJEZXZpY2UoY2FtZXJhSWQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgICBkZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggNGUzYmIxOS4uYTgyN2UwNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTEsMjQgKzEsMjQgQEAKIC8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKQEAgLTMyLDEwICszMiwxNSBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYV92ZW5kb3JfdGFncy5oPgorI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKQEAgLTEzMCw2ICsxMzUsMTIgQEAKICAgICAgICAgICAgIG1Nb2R1bGUtPnNldF9jYWxsYmFja3ModGhpcyk7CiAgICAgICAgIH0KIAorICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKworICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgeworICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisgICAgICAgIH0KKwogICAgICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpyZWdpc3RlclNlcnZpY2UodGhpcyk7CiAgICAgfQogfQpAQCAtMTQxLDYgKzE1Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBWZW5kb3JUYWdEZXNjcmlwdG9yOjpjbGVhckdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICBnQ2FtZXJhU2VydmljZSA9IE5VTEw7CiB9CiAKQEAgLTE2OCw2ICsxODAsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtU2VydmljZUxvY2spOwogCisgICAgICAgICAgIC8qIFJlbW92ZSBjYWNoZWQgcGFyYW1ldGVycyBmcm9tIHNoaW0gY2FjaGUgKi8KKyAgICAgICAgICAgbVNoaW1QYXJhbXMucmVtb3ZlSXRlbShjYW1lcmFJZCk7CisKICAgICAgICAgICAgLyogRmluZCBhbGwgY2xpZW50cyB0aGF0IHdlIG5lZWQgdG8gZGlzY29ubmVjdCAqLwogICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwogICAgICAgICAgICBpZiAoY2xpZW50LmdldCgpICE9IE5VTEwpIHsKQEAgLTE5Niw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICovCiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiJXM6IEFmdGVyIHVucGx1ZywgZGlzY29ubmVjdGVkICVkIGNsaWVudHMiLAorICAgICAgICBBTE9HVigiJXM6IEFmdGVyIHVucGx1ZywgZGlzY29ubmVjdGVkICV6dSBjbGllbnRzIiwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnRzVG9EaXNjb25uZWN0LnNpemUoKSk7CiAgICAgfQogCkBAIC0yMjAsMTIgKzIzNSw5OSBAQAogICAgIH0KIAogICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwotICAgIHN0YXR1c190IHJjID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbyk7CisgICAgc3RhdHVzX3QgcmMgPSBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKAorICAgICAgICBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CiAgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gaW5mby5mYWNpbmc7CiAgICAgY2FtZXJhSW5mby0+b3JpZW50YXRpb24gPSBpbmZvLm9yaWVudGF0aW9uOwogICAgIHJldHVybiByYzsKIH0KIAorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgeworICAgIHN0YXR1c190IHJldCA9IE9LOworICAgIHN0cnVjdCBDYW1lcmFJbmZvIGluZm87CisgICAgaWYgKChyZXQgPSBnZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCAmaW5mbykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgc2hpbUluZm87CisgICAgaW50MzJfdCBvcmllbnRhdGlvbiA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGluZm8ub3JpZW50YXRpb24pOworICAgIGlmICgocmV0ID0gc2hpbUluZm8udXBkYXRlKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OLCAmb3JpZW50YXRpb24sIDEpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHVpbnQ4X3QgZmFjaW5nID0gKGluZm8uZmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpID8KKyAgICAgICAgICAgIEFORFJPSURfTEVOU19GQUNJTkdfRlJPTlQgOiBBTkRST0lEX0xFTlNfRkFDSU5HX0JBQ0s7CisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9MRU5TX0ZBQ0lORywgJmZhY2luZywgMSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQ2FtZXJhUGFyYW1ldGVycyBzaGltUGFyYW1zOworICAgIGlmICgocmV0ID0gZ2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoY2FtZXJhSWQsIC8qb3V0Ki8mc2hpbVBhcmFtcykpICE9IE9LKSB7CisgICAgICAgIC8vIEVycm9yIGxvZ2dlZCBieSBjYWxsZWUKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBWZWN0b3I8U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFNpemU+IGpwZWdTaXplczsKKyAgICBWZWN0b3I8aW50MzJfdD4gZm9ybWF0czsKKyAgICBjb25zdCBjaGFyKiBzdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0czsKKyAgICB7CisgICAgICAgIHNoaW1QYXJhbXMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKC8qb3V0Ki9zaXplcyk7CisgICAgICAgIHNoaW1QYXJhbXMuZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoLypvdXQqL2Zvcm1hdHMpOworICAgICAgICBzaGltUGFyYW1zLmdldFN1cHBvcnRlZFBpY3R1cmVTaXplcygvKm91dCovanBlZ1NpemVzKTsKKyAgICB9CisKKyAgICAvLyBBbHdheXMgaW5jbHVkZSBJTVBMRU1FTlRBVElPTl9ERUZJTkVECisgICAgZm9ybWF0cy5hZGQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKworICAgIGNvbnN0IHNpemVfdCBJTlRTX1BFUl9DT05GSUcgPSA0OworCisgICAgLy8gQnVpbGQgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBtZXRhZGF0YQorICAgIHNpemVfdCBzdHJlYW1Db25maWdTaXplID0gKHNpemVzLnNpemUoKSAqIGZvcm1hdHMuc2l6ZSgpICsganBlZ1NpemVzLnNpemUoKSkgKiBJTlRTX1BFUl9DT05GSUc7CisKKyAgICBWZWN0b3I8aW50MzJfdD4gc3RyZWFtQ29uZmlnczsKKyAgICBzdHJlYW1Db25maWdzLnNldENhcGFjaXR5KHN0cmVhbUNvbmZpZ1NpemUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKGZvcm1hdHNbaV0pOworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoc2l6ZXNbal0ud2lkdGgpOworICAgICAgICAgICAgc3RyZWFtQ29uZmlncy5hZGQoc2l6ZXNbal0uaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwganBlZ1NpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKGpwZWdTaXplc1tpXS53aWR0aCk7CisgICAgICAgIHN0cmVhbUNvbmZpZ3MuYWRkKGpwZWdTaXplc1tpXS5oZWlnaHQpOworICAgICAgICBzdHJlYW1Db25maWdzLmFkZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuYXJyYXkoKSwgc3RyZWFtQ29uZmlnU2l6ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50NjRfdCBmYWtlTWluRnJhbWVzWzBdOworICAgIC8vIFRPRE86IEZpeG1lLCBkb24ndCBmYWtlIG1pbiBmcmFtZSBkdXJhdGlvbnMuCisgICAgaWYgKChyZXQgPSBzaGltSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBmYWtlTWluRnJhbWVzLCAwKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGZha2VTdGFsbHNbMF07CisgICAgLy8gVE9ETzogRml4bWUsIGRvbid0IGZha2Ugc3RhbGwgZHVyYXRpb25zLgorICAgIGlmICgocmV0ID0gc2hpbUluZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBmYWtlU3RhbGxzLCAwKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqY2FtZXJhSW5mbyA9IHNoaW1JbmZvOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKSB7CiAgICAgaWYgKCFjYW1lcmFJbmZvKSB7CkBAIC0yMzgsMzcgKzM0MCw1MSBAQAogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9CiAKLSAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7Ci0gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIG9uY2UgSEFMMSBzaGltIGlzIGluIHBsYWNlLgotICAgICAgICBBTE9HRSgiJXM6IE9ubHkgSEFMIG1vZHVsZSB2ZXJzaW9uIFYyIG9yIGhpZ2hlciBzdXBwb3J0cyBzdGF0aWMgbWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQogICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgewogICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGludCBmYWNpbmc7Ci0gICAgaWYgKGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7Ci0gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIG9uY2UgSEFMMSBzaGltIGlzIGluIHBsYWNlLgotICAgICAgICBBTE9HRSgiJXM6IEhBTDEgZG9lc24ndCBzdXBwb3J0IHN0YXRpYyBtZXRhZGF0YSB5ZXQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICBzdGF0dXNfdCByZXQgPSBPSzsKKyAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wIHx8CisgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKSA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMSApIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUgZm9yIG9sZCBIQUxzOgorICAgICAgICAgKiAtIENvbnZlcnQgQ2FtZXJhSW5mbyBpbnRvIHN0YXRpYyBDYW1lcmFNZXRhZGF0YSBwcm9wZXJ0aWVzLgorICAgICAgICAgKiAtIFJldHJpZXZlIGNhY2hlZCBDYW1lcmFQYXJhbWV0ZXJzIGZvciB0aGlzIGNhbWVyYS4gIElmIG5vbmUgZXhpc3QsCisgICAgICAgICAqICAgYXR0ZW1wdCB0byBvcGVuIENhbWVyYUNsaWVudCBhbmQgcmV0cmlldmUgdGhlIENhbWVyYVBhcmFtZXRlcnMuCisgICAgICAgICAqIC0gQ29udmVydCBjYWNoZWQgQ2FtZXJhUGFyYW1ldGVycyBpbnRvIHN0YXRpYyBDYW1lcmFNZXRhZGF0YQorICAgICAgICAgKiAgIHByb3BlcnRpZXMuCisgICAgICAgICAqLworICAgICAgICBBTE9HSSgiJXM6IFN3aXRjaGluZyB0byBIQUwxIHNoaW0gaW1wbGVtZW50YXRpb24uLi4iLCBfX0ZVTkNUSU9OX18pOwogCi0gICAgaWYgKGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xKSB7Ci0gICAgICAgIC8vIERpc2FibGUgSEFMMi54IHN1cHBvcnQgZm9yIGNhbWVyYTIgQVBJIGZvciBub3cuCi0gICAgICAgIEFMT0dXKCIlczogSEFMMi54IGRvZXNuJ3Qgc3VwcG9ydCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIG5vdyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgICAgICBpZiAoKHJldCA9IGdlbmVyYXRlU2hpbU1ldGFkYXRhKGNhbWVyYUlkLCBjYW1lcmFJbmZvKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwotICAgIHN0YXR1c190IHJldCA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pOwotICAgICpjYW1lcmFJbmZvID0gaW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljczsKKyAgICB9IGVsc2UgeworICAgICAgICAvKioKKyAgICAgICAgICogTm9ybWFsIEhBTCAyLjErIGNvZGVwYXRoLgorICAgICAgICAgKi8KKyAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CisgICAgICAgIHJldCA9IGZpbHRlckdldEluZm9FcnJvckNvZGUobU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykpOworICAgICAgICAqY2FtZXJhSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CisgICAgfQogCiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigvKm91dCovc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpIHsKKyAgICBpZiAoIW1Nb2R1bGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaGFyZHdhcmUgbW9kdWxlIGRvZXNuJ3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBkZXNjID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIHJldHVybiBPSzsKK30KKwogaW50IENhbWVyYVNlcnZpY2U6OmdldERldmljZVZlcnNpb24oaW50IGNhbWVyYUlkLCBpbnQqIGZhY2luZykgewogICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvOwogICAgIGlmIChtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSAhPSBPSykgewpAQCAtMjg5LDIxICs0MDUsMTYyIEBACiAgICAgcmV0dXJuIGRldmljZVZlcnNpb247CiB9CiAKLWJvb2wgQ2FtZXJhU2VydmljZTo6aXNWYWxpZENhbWVyYUlkKGludCBjYW1lcmFJZCkgewotICAgIGludCBmYWNpbmc7Ci0gICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmZpbHRlck9wZW5FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CisgICAgc3dpdGNoKGVycikgeworICAgICAgICBjYXNlIE5PX0VSUk9SOgorICAgICAgICBjYXNlIC1FQlVTWToKKyAgICAgICAgY2FzZSAtRUlOVkFMOgorICAgICAgICBjYXNlIC1FVVNFUlM6CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAtRU5PREVWOworfQogCi0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKLSAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZGVmYXVsdDoKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKSB7CisgICAgc3dpdGNoKGVycikgeworICAgICAgICBjYXNlIE5PX0VSUk9SOgorICAgICAgICBjYXNlIC1FSU5WQUw6CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAtRU5PREVWOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OnNldFVwVmVuZG9yVGFncygpIHsKKyAgICB2ZW5kb3JfdGFnX29wc190IHZPcHMgPSB2ZW5kb3JfdGFnX29wc190KCk7CisKKyAgICAvLyBDaGVjayBpZiB2ZW5kb3Igb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQKKyAgICBpZiAobU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koIiVzOiBObyB2ZW5kb3IgdGFncyBkZWZpbmVkIGZvciB0aGlzIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzIik7CisgICAgbU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzKCZ2T3BzKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisKKyAgICAvLyBFbnN1cmUgYWxsIHZlbmRvciBvcGVyYXRpb25zIGFyZSBwcmVzZW50CisgICAgaWYgKHZPcHMuZ2V0X3RhZ19jb3VudCA9PSBOVUxMIHx8IHZPcHMuZ2V0X2FsbF90YWdzID09IE5VTEwgfHwKKyAgICAgICAgICAgIHZPcHMuZ2V0X3NlY3Rpb25fbmFtZSA9PSBOVUxMIHx8IHZPcHMuZ2V0X3RhZ19uYW1lID09IE5VTEwgfHwKKyAgICAgICAgICAgIHZPcHMuZ2V0X3RhZ190eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBWZW5kb3IgdGFnIG9wZXJhdGlvbnMgbm90IGZ1bGx5IGRlZmluZWQuIElnbm9yaW5nIGRlZmluaXRpb25zLiIKKyAgICAgICAgICAgICAgICwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjOworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tT3BzKCZ2T3BzLCAvKm91dCovZGVzYykpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgorICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGdsb2JhbCBkZXNjcmlwdG9yIHRvIHVzZSB3aXRoIGNhbWVyYSBtZXRhZGF0YQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OnNldEFzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcihkZXNjKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpIHsKKyAgICBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gdmFsaWRhdGVDb25uZWN0KGNhbWVyYUlkLCB1aWQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYm9vbCBuZWVkc05ld0NsaWVudCA9IGZhbHNlOworICAgIHNwPENsaWVudD4gY2xpZW50OworCisgICAgU3RyaW5nMTYgaW50ZXJuYWxQYWNrYWdlTmFtZSgibWVkaWEiKTsKKyAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICBpZiAobUNsaWVudFtjYW1lcmFJZF0gIT0gTlVMTCkgeworICAgICAgICAgICAgY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4obUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5lZWRzTmV3Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldCA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjYW1lcmFDbGllbnQqL05VTEwsIC8vIEVtcHR5IGJpbmRlciBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKworICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGNvbm5lY3QgdG8gY2xpZW50IGNhbWVyYSBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IHJhd1BhcmFtcyA9IGNsaWVudC0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhyYXdQYXJhbXMpOworICAgICAgICBtU2hpbVBhcmFtcy5hZGQoY2FtZXJhSWQsIHBhcmFtcyk7CisgICAgfQorCisgICAgLy8gQ2xvc2UgY2xpZW50IGlmIG9uZSB3YXMgb3BlbmVkIHNvbGVseSBmb3IgdGhpcyBjYWxsCisgICAgaWYgKG5lZWRzTmV3Q2xpZW50KSB7CisgICAgICAgIGNsaWVudC0+ZGlzY29ubmVjdCgpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGludCBjYW1lcmFJZCwKKyAgICAgICAgLypvdXQqLworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzKiBwYXJhbWV0ZXJzKSB7CisKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmFJZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKKworICAgIHN0YXR1c190IHJldCA9IDA7CisKKyAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gLTE7CisgICAgeyAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgaW5kZXggPSBtU2hpbVBhcmFtcy5pbmRleE9mS2V5KGNhbWVyYUlkKTsKKyAgICAgICAgLy8gUmVsZWFzZSBzZXJ2aWNlIGxvY2sgc28gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YSBjYW4gYmUgY2FsbGVkIGNvcnJlY3RseS4KKworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBtU2hpbVBhcmFtc1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgICAgICAgICAgaW5kZXggPSBtU2hpbVBhcmFtcy5pbmRleE9mS2V5KGNhbWVyYUlkKTsKKworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJpbmRleCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIik7CisKKyAgICAgICAgICAgICpwYXJhbWV0ZXJzID0gbVNoaW1QYXJhbXNbaW5kZXhdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNvbm5lY3QoaW50IGNhbWVyYUlkLApAQCAtNDAyLDYgKzY1OSw3NyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyTG9ja2VkKAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgLyppbiovCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgY2xpZW50VWlkLAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sCisgICAgICAgIGJvb2wgbGVnYWN5TW9kZSkgeworCisgICAgaW50IGZhY2luZyA9IC0xOworICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CisKKyAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CisgICAgICAgIC8vIERlZmF1bHQgcGF0aDogSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgYnkgY2FsbGVyLCBjcmVhdGUgQ2FtZXJhQ2xpZW50CisgICAgICAgIC8vIGJhc2VkIG9uIGRldmljZSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCisgICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQSBwYXJ0aWN1bGFyIEhBTCB2ZXJzaW9uIGlzIHJlcXVlc3RlZCBieSBjYWxsZXIuIENyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBIQUwgdmVyc2lvbi4KKyAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCAmJgorICAgICAgICAgICAgaGFsVmVyc2lvbiA9PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgeworICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IGhpZ2hlciBIQUwgdmVyc2lvbiBkZXZpY2Ugb3BlbmVkIGFzIEhBTDEuMCBkZXZpY2UuCisgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksIGxlZ2FjeU1vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgorICAgICAgICAgICAgICAgICAgICAiIG9wZW5lZCBhcyBIQUwgJXggZGV2aWNlIiwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgLy8gdGhpcyBpcyBwcm9iYWJseSBub3QgcmVjb3ZlcmFibGUuLiBtYXliZSB0aGUgY2xpZW50IGNhbiB0cnkgYWdhaW4KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBtQ2xpZW50W2NhbWVyYUlkXSA9IGNsaWVudDsKKyAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKGlkICVkLCB0aGlzIHBpZCBpcyAlZCkiLCBjYW1lcmFJZCwKKyAgICAgICAgIGdldHBpZCgpKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdCgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgaW50IGNhbWVyYUlkLApAQCAtNDM1LDUwICs3NjMsODEgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCi0gICAgICAgIGludCBmYWNpbmcgPSAtMTsKLSAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAmZmFjaW5nKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgb3RoZXIgbm9uLWV4Y2x1c2l2ZSB1c2VycyBvZiB0aGUgY2FtZXJhLAotICAgICAgICAvLyAgdGhpcyB3aWxsIHRlYXIgdGhlbSBkb3duIGJlZm9yZSB3ZSBjYW4gcmV1c2UgdGhlIGNhbWVyYQotICAgICAgICBpZiAoaXNWYWxpZENhbWVyYUlkKGNhbWVyYUlkKSkgewotICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7CisgICAgICAgIHN0YXR1cyA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgotICAgICAgICAgICAgLy8gT0s6IHdlIGNhbiBvbmx5IGdldCBoZXJlIGlmIHdlIHdlcmUgb3JpZ2luYWxseSBpbiBQUkVTRU5UIHN0YXRlCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsIGNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KIAotICAgICAgICBtQ2xpZW50W2NhbWVyYUlkXSA9IGNsaWVudDsKLSAgICAgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChpZCAlZCwgdGhpcyBwaWQgaXMgJWQpIiwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgZ2V0cGlkKCkpOworICAgIH0KKyAgICAvLyBpbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrCisgICAgLy8gICAgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKKworICAgIGRldmljZSA9IGNsaWVudDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RMZWdhY3koCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKSB7CisKKyAgICBpZiAoaGFsVmVyc2lvbiAhPSBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEICYmCisgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzMpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRWl0aGVyIHRoZSBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBpbiB3aGljaCBjYXNlIHRoaXMganVzdCBjcmVhdGVzCisgICAgICAgICAqIGEgY2FtZXJhIGNsaWVudCBzZWxlY3RlZCBieSB0aGUgbGF0ZXN0IGRldmljZSB2ZXJzaW9uLCBvcgorICAgICAgICAgKiBpdCdzIGEgcGFydGljdWxhciB2ZXJzaW9uIGluIHdoaWNoIGNhc2UgdGhlIEhBTCBtdXN0IHN1cHBvcnRlZAorICAgICAgICAgKiB0aGUgb3Blbl9sZWdhY3kgY2FsbAorICAgICAgICAgKi8KKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgSEFMIG1vZHVsZSB2ZXJzaW9uICV4IGRvZXNuJ3Qgc3VwcG9ydCBjb25uZWN0aW5nIHRvIGxlZ2FjeSBIQUwgZGV2aWNlcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgbGVnYWN5IEUgKHBpZCAlZCBcIiVzXCIsIGlkICVkKSIsIGNhbGxpbmdQaWQsCisgICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gdmFsaWRhdGVDb25uZWN0KGNhbWVyYUlkLCAvKmlub3V0Ki9jbGllbnRVaWQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzcDxDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUbXA7CisgICAgICAgIGlmICghY2FuQ29ubmVjdFVuc2FmZShjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQtPmFzQmluZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50VG1wKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY2xpZW50VG1wLmdldCgpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqL3RydWUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKICAgICB9CiAgICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawogICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCkBAIC00OTMsOCArODUyLDkgQEAKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotCi0gICAgcmVtb3RlQ2FsbGJhY2stPmxpbmtUb0RlYXRoKHRoaXMpOworICAgIGlmIChyZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHJlbW90ZUNhbGxiYWNrLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC01MDcsNiArODY3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElQcm9DYW1lcmFVc2VyPiYgZGV2aWNlKQogeworICAgIGlmIChjYW1lcmFDYiA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAKQEAgLTU0MSw2ICs5MDYsOCBAQAogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBQcm9DYW1lcmEyQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTYwMywxNCArOTcwLDYgQEAKICAgICAgICAgaW50IGZhY2luZyA9IC0xOwogICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwogCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBvdGhlciBub24tZXhjbHVzaXZlIHVzZXJzIG9mIHRoZSBjYW1lcmEsCi0gICAgICAgIC8vICB0aGlzIHdpbGwgdGVhciB0aGVtIGRvd24gYmVmb3JlIHdlIGNhbiByZXVzZSB0aGUgY2FtZXJhCi0gICAgICAgIGlmIChpc1ZhbGlkQ2FtZXJhSWQoY2FtZXJhSWQpKSB7Ci0gICAgICAgICAgICAvLyB0cmFuc2l0aW9uIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCi0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpOwotICAgICAgICB9Ci0KICAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgogICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CkBAIC02MTksNiArOTc4LDggQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTYzMyw4ICs5OTQsNiBAQAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCi0gICAgICAgICAgICAvLyBPSzogd2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgd2Ugd2VyZSBvcmlnaW5hbGx5IGluIFBSRVNFTlQgc3RhdGUKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwgY2FtZXJhSWQpOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCkBAIC03MDksNiArMTA2OCw3OCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldExlZ2FjeVBhcmFtZXRlcnMoCisgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBTdHJpbmcxNiogcGFyYW1ldGVycykgeworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisKKyAgICBpZiAocGFyYW1ldGVycyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyYW1ldGVycyBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSAwOworCisgICAgQ2FtZXJhUGFyYW1ldGVycyBzaGltUGFyYW1zOworICAgIGlmICgocmV0ID0gZ2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoY2FtZXJhSWQsIC8qb3V0Ki8mc2hpbVBhcmFtcykpICE9IE9LKSB7CisgICAgICAgIC8vIEVycm9yIGxvZ2dlZCBieSBjYWxsZXIKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBTdHJpbmc4IHNoaW1QYXJhbXNTdHJpbmc4ID0gc2hpbVBhcmFtcy5mbGF0dGVuKCk7CisgICAgU3RyaW5nMTYgc2hpbVBhcmFtc1N0cmluZzE2ID0gU3RyaW5nMTYoc2hpbVBhcmFtc1N0cmluZzgpOworCisgICAgKnBhcmFtZXRlcnMgPSBzaGltUGFyYW1zU3RyaW5nMTY7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnN1cHBvcnRzQ2FtZXJhQXBpKGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pIHsKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworCisgICAgc3dpdGNoIChhcGlWZXJzaW9uKSB7CisgICAgICAgIGNhc2UgQVBJX1ZFUlNJT05fMToKKyAgICAgICAgY2FzZSBBUElfVkVSU0lPTl8yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IEJhZCBBUEkgdmVyc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgYXBpVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCBmYWNpbmcgPSAtMTsKKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOworCisgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgorICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBpZiAoYXBpVmVyc2lvbiA9PSBBUElfVkVSU0lPTl8yKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlZCB1c2VzIEhBTCBwcmlvciB0byBIQUwzLjIsIGRvZXNuJ3Qgc3VwcG9ydCBhcGkyIHdpdGhvdXQgc2hpbSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9IGVsc2UgeyAvLyBpZiAoYXBpVmVyc2lvbiA9PSBBUElfVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlZCB1c2VzIG9sZGVyIEhBTCBiZWZvcmUgMy4yLCBidXQgYXBpMSBpcyBhbHdheXMgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gT0s7CisgICAgICBjYXNlIC0xOgorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGlkICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZVZlcnNpb24pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiByZW1vdGVCaW5kZXIpIHsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnRCeVJlbW90ZSBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CkBAIC03MjMsOSArMTE1NCwxMyBAQAogICAgIGlmIChjbGllbnQgIT0gMCkgewogICAgICAgICAvLyBGb3VuZCBvdXIgY2FtZXJhLCBjbGVhciBhbmQgbGVhdmUuCiAgICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgY2FtZXJhICVkIiwgb3V0SW5kZXgpOwotICAgICAgICBtQ2xpZW50W291dEluZGV4XS5jbGVhcigpOwogCi0gICAgICAgIGNsaWVudC0+Z2V0UmVtb3RlKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIHNwPElCaW5kZXI+IHJlbW90ZSA9IGNsaWVudC0+Z2V0UmVtb3RlKCk7CisgICAgICAgIGlmIChyZW1vdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVtb3RlLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgbUNsaWVudFtvdXRJbmRleF0uY2xlYXIoKTsKICAgICB9IGVsc2UgewogCiAgICAgICAgIHNwPFByb0NsaWVudD4gY2xpZW50UHJvID0gZmluZFByb0NsaWVudFVuc2FmZShyZW1vdGVCaW5kZXIpOwpAQCAtODM1LDYgKzEyNzAsNyBAQAogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVDoKICAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfUFJPOgogICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9ERVZJQ0U6CisgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0xFR0FDWToKICAgICAgICAgICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKICAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZl9waWQpIHsKQEAgLTg3Nyw3ICsxMzEzLDcgQEAKIAogTWVkaWFQbGF5ZXIqIENhbWVyYVNlcnZpY2U6Om5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpIHsKICAgICBNZWRpYVBsYXllciogbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKLSAgICBpZiAobXAtPnNldERhdGFTb3VyY2UoZmlsZSwgTlVMTCkgPT0gTk9fRVJST1IpIHsKKyAgICBpZiAobXAtPnNldERhdGFTb3VyY2UoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZSwgTlVMTCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbXAtPnNldEF1ZGlvU3RyZWFtVHlwZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSk7CiAgICAgICAgIG1wLT5wcmVwYXJlKCk7CiAgICAgfSBlbHNlIHsKQEAgLTk4MSw2ICsxNDE3LDggQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7CiAgICAgQUxPR1YoIkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0Iik7CiAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudEJ5UmVtb3RlKG1SZW1vdGVCaW5kZXIpOworCisgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAgICAgLy8gY2xpZW50IHNob3VsZG4ndCBiZSBhYmxlIHRvIGNhbGwgaW50byB1cyBhbnltb3JlCiAgICAgbUNsaWVudFBpZCA9IDA7CiB9CkBAIC05OTUsNyArMTQzMyw3IEBACiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBpbnQzMl90IHJlczsKLQorICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBub3QgYXZhaWxhYmxlCiAgICAgbU9wc0NhbGxiYWNrID0gbmV3IE9wc0NhbGxiYWNrKHRoaXMpOwogCiAgICAgewpAQCAtMTAxMywxNiArMTQ1MSwzOSBAQAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKwogICAgIG1PcHNBY3RpdmUgPSB0cnVlOworCisgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQorICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUsCisgICAgICAgICAgICBtQ2FtZXJhSWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZmluaXNoQ2FtZXJhT3BzKCkgeworICAgIC8vIENoZWNrIGlmIHN0YXJ0Q2FtZXJhT3BzIHN1Y2NlZWRlZCwgYW5kIGlmIHNvLCBmaW5pc2ggdGhlIGNhbWVyYSBvcAogICAgIGlmIChtT3BzQWN0aXZlKSB7CisgICAgICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBhdmFpbGFibGUgYWdhaW4KICAgICAgICAgbUFwcE9wc01hbmFnZXIuZmluaXNoT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSk7CiAgICAgICAgIG1PcHNBY3RpdmUgPSBmYWxzZTsKKworICAgICAgICAvLyBOb3RpZnkgZGV2aWNlIGF2YWlsYWJpbGl0eSBsaXN0ZW5lcnMgdGhhdCB0aGlzIGNhbWVyYSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gYWdhaW4KKworICAgICAgICBTdGF0dXNWZWN0b3IgcmVqZWN0U291cmNlU3RhdGVzOworICAgICAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCk7CisgICAgICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKTsKKworICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIGFib3ZlIDIKKyAgICAgICAgLy8gc3RhdGVzCisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOworCiAgICAgfQorICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKICAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CiAgICAgbU9wc0NhbGxiYWNrLmNsZWFyKCk7CiAKQEAgLTEwNTMsNyArMTUxNCw4IEBACiAgICAgICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCiAgICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKKyAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICB9CiB9CkBAIC0xMDYxLDEzICsxNTIzLDEzIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIE11dGV4KiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudExvY2tGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudExvY2tCeUlkKChpbnQpIHVzZXIpOworICAgIHJldHVybiBnQ2FtZXJhU2VydmljZS0+Z2V0Q2xpZW50TG9ja0J5SWQoKGludCkoaW50cHRyX3QpIHVzZXIpOwogfQogCiAvLyBQcm92aWRlIGNsaWVudCBwb2ludGVyIGZvciBjYWxsYmFja3MuIENsaWVudCBsb2NrIHJldHVybmVkIGZyb20gZ2V0Q2xpZW50TG9ja0Zyb21Db29raWUgc2hvdWxkCiAvLyBiZSBhY3F1aXJlZCBmb3IgdGhpcyB0byBiZSBzYWZlCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQqIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKSB7Ci0gICAgQmFzaWNDbGllbnQgKmJhc2ljQ2xpZW50ID0gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudEJ5SWRVbnNhZmUoKGludCkgdXNlcik7CisgICAgQmFzaWNDbGllbnQgKmJhc2ljQ2xpZW50ID0gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudEJ5SWRVbnNhZmUoKGludCkoaW50cHRyX3QpIHVzZXIpOwogICAgIC8vIE9LOiBvbmx5IENhbWVyYUNsaWVudCBjYWxscyB0aGlzLCBhbmQgdGhleSBhbHJlYWR5IGNhc3QgYW55d2F5LgogICAgIENsaWVudCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oYmFzaWNDbGllbnQpOwogCkBAIC0xMDgyLDcgKzE1NDQsOCBAQAogICAgIHJldHVybiBjbGllbnQ7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICBtUmVtb3RlQ2FsbGJhY2stPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfRVJST1IsIENBTUVSQV9FUlJPUl9SRUxFQVNFRCwgMCk7CiB9CiAKQEAgLTEwOTEsMTUgKzE1NTQsNiBAQAogICAgIEFMT0dWKCJDbGllbnQ6OmRpc2Nvbm5lY3QiKTsKICAgICBCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCgpOwogICAgIG1DYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFGcmVlKG1DYW1lcmFJZCk7Ci0KLSAgICBTdGF0dXNWZWN0b3IgcmVqZWN0U291cmNlU3RhdGVzOwotICAgIHJlamVjdFNvdXJjZVN0YXRlcy5wdXNoX2JhY2soSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKTsKLSAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORyk7Ci0KLSAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIGFib3ZlIDIgc3RhdGVzCi0gICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWplY3RTb3VyY2VTdGF0ZXMpOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Ok9wc0NhbGxiYWNrOjpPcHNDYWxsYmFjayh3cDxCYXNpY0NsaWVudD4gY2xpZW50KToKQEAgLTExMzYsNyArMTU5MCw4IEBACiBDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ6On5Qcm9DbGllbnQoKSB7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojpub3RpZnlFcnJvcigpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6UHJvQ2xpZW50Ojpub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICBtUmVtb3RlQ2FsbGJhY2stPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfRVJST1IsIENBTUVSQV9FUlJPUl9SRUxFQVNFRCwgMCk7CiB9CiAKQEAgLTExNzgsNiArMTYzMyw3IEBACiAgICAgICAgIGlmICghbU1vZHVsZSkgewogICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJObyBjYW1lcmEgbW9kdWxlIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBpZiAobG9ja2VkKSBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTE5MCw3ICsxNjQ2LDIwIEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgYXV0aG9yOiAlc1xuIiwKICAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24uYXV0aG9yKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiTnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzOiAlZFxuXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKKworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgICAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJWZW5kb3IgdGFncyBsZWZ0IHVuaW1wbGVtZW50ZWQuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlZlbmRvciB0YWcgZGVmaW5pdGlvbnM6XG4iKTsKKyAgICAgICAgfQorCiAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgICAgIGlmIChkZXNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlc2MtPmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi80KTsKKyAgICAgICAgfQorCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlZCBzdGF0aWMgaW5mb3JtYXRpb246XG4iLCBpKTsKICAgICAgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CkBAIC0xMjE1LDcgKzE2ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIERldmljZSBzdGF0aWMgbWV0YWRhdGE6XG4iKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIDIsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAvKnZlcmJvc2l0eSovMiwgLyppbmRlbnRhdGlvbiovNCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDdmMzY5MWEuLjhhM2RiMDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTEsMjQgKzEsMjQgQEAKIC8qCi0qKgotKiogQ29weXJpZ2h0IChDKSAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLworICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgpAQCAtMzEsNiArMzEsOSBAQAogI2luY2x1ZGUgPGNhbWVyYS9JUHJvQ2FtZXJhQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogCkBAIC03NiwxMiArNzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFWZW5kb3JUYWdEZXNjcmlwdG9yKC8qb3V0Ki8gc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPElDYW1lcmE+JiBkZXZpY2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0TGVnYWN5KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBjbGllbnRVaWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdFBybyhjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KQEAgLTk5LDYgKzEwOCwxNSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVtb3ZlTGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRMZWdhY3lQYXJhbWV0ZXJzKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpOworCisgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xMjMsNiArMTQxLDEwIEBACiAgICAgLy8gQ2FtZXJhRGV2aWNlRmFjdG9yeSBmdW5jdGlvbmFsaXR5CiAgICAgaW50ICAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGludCBjYW1lcmFJZCwgaW50KiBmYWNpbmcgPSBOVUxMKTsKIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFNoYXJlZCB1dGlsaXRpZXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgICAgIGZpbHRlck9wZW5FcnJvckNvZGUoc3RhdHVzX3QgZXJyKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgICAgIGZpbHRlckdldEluZm9FcnJvckNvZGUoc3RhdHVzX3QgZXJyKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENhbWVyYUNsaWVudCBmdW5jdGlvbmFsaXR5CkBAIC0xMzQsMTYgKzE1NiwxNSBAQAogCiAgICAgY2xhc3MgQmFzaWNDbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOwotCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkaXNjb25uZWN0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCB2aXJ0dWFsbHkgaW5oZXJpdCBJSW50ZXJmYWNlLCB3aGljaCBicmVha3MKICAgICAgICAgLy8gdmlydHVhbCBpbmhlcml0YW5jZQogICAgICAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGFzQmluZGVyV3JhcHBlcigpID0gMDsKIAogICAgICAgICAvLyBSZXR1cm4gdGhlIHJlbW90ZSBjYWxsYmFjayBiaW5kZXIgb2JqZWN0IChlLmcuIElQcm9DYW1lcmFDYWxsYmFja3MpCi0gICAgICAgIHNwPElCaW5kZXI+ICAgICBnZXRSZW1vdGUoKSB7CisgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgZ2V0UmVtb3RlKCkgewogICAgICAgICAgICAgcmV0dXJuIG1SZW1vdGVCaW5kZXI7CiAgICAgICAgIH0KIApAQCAtMTg3LDcgKzIwOCw5IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAKICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKICAgICBwcml2YXRlOgogICAgICAgICBBcHBPcHNNYW5hZ2VyICAgICAgICAgICAgICAgICAgIG1BcHBPcHNNYW5hZ2VyOwogCkBAIC0yNjQsNyArMjg3LDggQEAKICAgICAgICAgLy8gY29udmVydCBjbGllbnQgZnJvbSBjb29raWUuIENsaWVudCBsb2NrIHNob3VsZCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBDbGllbnQuCiAgICAgICAgIHN0YXRpYyBDbGllbnQqICAgICAgIGdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcik7CiAKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCkBAIC0zMTIsNyArMzM2LDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpID0gMDsKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUVycm9yKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgICAgICBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiBtUmVtb3RlQ2FsbGJhY2s7CiAgICAgfTsgLy8gY2xhc3MgUHJvQ2xpZW50CkBAIC0zOTMsNiArNDE4LDU3IEBACiAgICAgLy8gSGVscGVycwogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBpc1ZhbGlkQ2FtZXJhSWQoaW50IGNhbWVyYUlkKTsKKworICAgIGJvb2wgICAgICAgICAgICAgICAgc2V0VXBWZW5kb3JUYWdzKCk7CisKKyAgICAvKioKKyAgICAgKiBBIG1hcHBpbmcgb2YgY2FtZXJhIGlkcyB0byBDYW1lcmFQYXJhbWV0ZXJzIHJldHVybmVkIGJ5IHRoYXQgY2FtZXJhIGRldmljZS4KKyAgICAgKgorICAgICAqIFRoaXMgY2FjaGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBDYW1lcmFDaGFyYWN0ZXJpc3RpYyBtZXRhZGF0YSB3aGVuIHVzaW5nCisgICAgICogdGhlIEhBTDEgc2hpbS4KKyAgICAgKi8KKyAgICBLZXllZFZlY3RvcjxpbnQsIENhbWVyYVBhcmFtZXRlcnM+ICAgIG1TaGltUGFyYW1zOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbmQgY2FjaGUgdGhlIG1ldGFkYXRhIHVzZWQgYnkgdGhlIEhBTDEgc2hpbSBmb3IgYSBnaXZlbiBjYW1lcmFJZC4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgICAgaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjYWNoZWQgQ2FtZXJhUGFyYW1ldGVycyBmb3IgdGhlIGNhbWVyYS4gSWYgdGhleSBoYXZlbid0IGJlZW4KKyAgICAgKiBjYWNoZWQgeWV0LCB0aGVuIGluaXRpYWxpemUgdGhlbSBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIGdldExlZ2FjeVBhcmFtZXRlcnNMYXp5KGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYVBhcmFtZXRlcnMqIHBhcmFtZXRlcnMpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIENhbWVyYUNoYXJhY3RlcmlzdGljcyBtZXRhZGF0YSByZXF1aXJlZCBieSB0aGUgQ2FtZXJhMiBBUEkKKyAgICAgKiBmcm9tIHRoZSBhdmFpbGFibGUgSEFMMSBDYW1lcmFQYXJhbWV0ZXJzIGFuZCBDYW1lcmFJbmZvLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IGEgbmV3IGNhbWVyYSBjbGllbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hpbGUgaG9sZGluZyB0aGUKKyAgICAgKiBtdXRleCBmb3IgbVNlcnZpY2VMb2NrLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgICBjb25uZWN0SGVscGVyTG9ja2VkKAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgLyppbiovCisgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgICAgIGludCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24gPSBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggMTMxMDQ4ZS4uMzY0YjE0MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIApAQCAtNTMsMTYgKzU0LDE3IEBACiAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGludCBkZXZpY2VWZXJzaW9uKToKKyAgICAgICAgYm9vbCBsZWdhY3lNb2RlKToKICAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCi0gICAgICAgIG1QYXJhbWV0ZXJzKGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpLAotICAgICAgICBtRGV2aWNlVmVyc2lvbihkZXZpY2VWZXJzaW9uKQorICAgICAgICBtUGFyYW1ldGVycyhjYW1lcmFJZCwgY2FtZXJhRmFjaW5nKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7CisKKyAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCkBAIC03OSw3ICs4MSw3IEBACiAgICAgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogCi0gICAgICAgIHJlcyA9IGwubVBhcmFtZXRlcnMuaW5pdGlhbGl6ZSgmKG1EZXZpY2UtPmluZm8oKSkpOworICAgICAgICByZXMgPSBsLm1QYXJhbWV0ZXJzLmluaXRpYWxpemUoJihtRGV2aWNlLT5pbmZvKCkpLCBtRGV2aWNlVmVyc2lvbik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiB1bmFibGUgdG8gYnVpbGQgZGVmYXVsdHM6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTcsNyArMTE5LDkgQEAKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3JUaHJlYWQgPSB6c2xQcm9jOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDp7CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6IHsKICAgICAgICAgICAgIHNwPFpzbFByb2Nlc3NvcjM+IHpzbFByb2MgPQogICAgICAgICAgICAgICAgICAgICBuZXcgWnNsUHJvY2Vzc29yMyh0aGlzLCBtQ2FwdHVyZVNlcXVlbmNlcik7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yID0genNsUHJvYzsKQEAgLTE5Nyw3ICsyMDEsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIGxhdCB4IGxvbmcgeCBhbHQ6ICVmIHggJWYgeCAlZlxuIiwKICAgICAgICAgICAgICAgICBwLmdwc0Nvb3JkaW5hdGVzWzBdLCBwLmdwc0Nvb3JkaW5hdGVzWzFdLAogICAgICAgICAgICAgICAgIHAuZ3BzQ29vcmRpbmF0ZXNbMl0pOwotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgR1BTIHRpbWVzdGFtcDogJWxsZFxuIiwKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIEdQUyB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiXG4iLAogICAgICAgICAgICAgICAgIHAuZ3BzVGltZXN0YW1wKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIEdQUyBwcm9jZXNzaW5nIG1ldGhvZDogJXNcbiIsCiAgICAgICAgICAgICAgICAgcC5ncHNQcm9jZXNzaW5nTWV0aG9kLnN0cmluZygpKTsKQEAgLTI0MSw3ICsyNDUsNyBAQAogCiAgICAgcmVzdWx0LmFwcGVuZCgiICAgIFNjZW5lIG1vZGU6ICIpOwogICAgIHN3aXRjaCAocC5zY2VuZU1vZGUpIHsKLSAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRDoKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIkFVVE9cbiIpOyBicmVhazsKICAgICAgICAgQ0FTRV9BUFBFTkRfRU5VTShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9BQ1RJT04pCiAgICAgICAgIENBU0VfQVBQRU5EX0VOVU0oQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfUE9SVFJBSVQpCkBAIC00MTksMTIgKzQyMywyMCBAQAogCiAgICAgQUxPR1YoIkNhbWVyYSAlZDogV2FpdGluZyBmb3IgdGhyZWFkcyIsIG1DYW1lcmFJZCk7CiAKLSAgICBtU3RyZWFtaW5nUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgbUZyYW1lUHJvY2Vzc29yLT5qb2luKCk7Ci0gICAgbUNhcHR1cmVTZXF1ZW5jZXItPmpvaW4oKTsKLSAgICBtSnBlZ1Byb2Nlc3Nvci0+am9pbigpOwotICAgIG1ac2xQcm9jZXNzb3JUaHJlYWQtPmpvaW4oKTsKLSAgICBtQ2FsbGJhY2tQcm9jZXNzb3ItPmpvaW4oKTsKKyAgICB7CisgICAgICAgIC8vIERvbid0IHdhaXQgd2l0aCBsb2NrIGhlbGQsIGluIGNhc2UgdGhlIG90aGVyIHRocmVhZHMgbmVlZCB0bworICAgICAgICAvLyBjb21wbGV0ZSBjYWxsYmFja3MgdGhhdCByZS1lbnRlciBDYW1lcmEyQ2xpZW50CisgICAgICAgIG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jay51bmxvY2soKTsKKworICAgICAgICBtU3RyZWFtaW5nUHJvY2Vzc29yLT5qb2luKCk7CisgICAgICAgIG1GcmFtZVByb2Nlc3Nvci0+am9pbigpOworICAgICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+am9pbigpOworICAgICAgICBtSnBlZ1Byb2Nlc3Nvci0+am9pbigpOworICAgICAgICBtWnNsUHJvY2Vzc29yVGhyZWFkLT5qb2luKCk7CisgICAgICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+am9pbigpOworCisgICAgICAgIG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jay5sb2NrKCk7CisgICAgfQogCiAgICAgQUxPR1YoIkNhbWVyYSAlZDogRGVsZXRpbmcgc3RyZWFtcyIsIG1DYW1lcmFJZCk7CiAKQEAgLTQzNCw2ICs0NDYsOSBAQAogICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CiAgICAgbVpzbFByb2Nlc3Nvci0+ZGVsZXRlU3RyZWFtKCk7CiAKKyAgICAvLyBSZW1vdmUgYWxsIFpTTCBzdHJlYW0gc3RhdGUgYmVmb3JlIGRpc2Nvbm5lY3Q7IG5lZWRlZCB0byB3b3JrIGFyb3VuZCBiLzE1NDA4MTI4LgorICAgIG1ac2xQcm9jZXNzb3ItPmRpc2Nvbm5lY3QoKTsKKwogICAgIEFMT0dWKCJDYW1lcmEgJWQ6IERpc2Nvbm5lY3RpbmcgZGV2aWNlIiwgbUNhbWVyYUlkKTsKIAogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKQEAgLTc1Niw2ICs3NzEsNyBAQAogICAgIC8vIGV2ZXIgdGFrZSBhIHBpY3R1cmUuCiAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciBjb21wcm9taXNlLCB0aG91Z2ggdGhpcyBsaWtlbHkgd291bGQgaW52b2x2ZSBIQUwKICAgICAvLyBjaGFuZ2VzLgorICAgIGludCBsYXN0SnBlZ1N0cmVhbUlkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCk7CiAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1KcGVnUHJvY2Vzc29yLCBwYXJhbXMpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHByZS1jb25maWd1cmUgc3RpbGwgaW1hZ2UgIgpAQCAtNzYzLDYgKzc3OSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKyAgICBib29sIGpwZWdTdHJlYW1DaGFuZ2VkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCkgIT0gbGFzdEpwZWdTdHJlYW1JZDsKIAogICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1zOwogICAgIGJvb2wgY2FsbGJhY2tzRW5hYmxlZCA9IChwYXJhbXMucHJldmlld0NhbGxiYWNrRmxhZ3MgJgpAQCAtODExLDE0ICs4MjgsMjQgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBhcmFtcy56c2xNb2RlICYmICFwYXJhbXMucmVjb3JkaW5nSGludCkgeworCisgICAgaWYgKHBhcmFtcy56c2xNb2RlICYmICFwYXJhbXMucmVjb3JkaW5nSGludCAmJgorICAgICAgICAgICAgZ2V0UmVjb3JkaW5nU3RyZWFtSWQoKSA9PSBOT19TVFJFQU0pIHsKICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtKG1ac2xQcm9jZXNzb3IsIHBhcmFtcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIFpTTCBzdHJlYW06ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGpwZWdTdHJlYW1DaGFuZ2VkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ2xlYXIgWlNMIGJ1ZmZlciBxdWV1ZSB3aGVuIEpwZWcgc2l6ZSBpcyBjaGFuZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgICAgICB9CiAgICAgICAgIG91dHB1dFN0cmVhbXMucHVzaChnZXRac2xTdHJlYW1JZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKICAgICB9CiAKICAgICBvdXRwdXRTdHJlYW1zLnB1c2goZ2V0UHJldmlld1N0cmVhbUlkKCkpOwpAQCAtODk5LDYgKzkyNiwyMCBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbGVhbiB1cCByZWNvcmRpbmcgc3RyZWFtCisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5kZWxldGVSZWNvcmRpbmdTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGRlbGV0ZSByZWNvcmRpbmcgc3RyZWFtIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RvcCBwcmV2aWV3OiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCByZWNvdmVyIHRoZSBvdmVycmlkZSBhZnRlciByZWNvcmRpbmcgc3RvcHBlZCwgYnV0CisgICAgICAgICAgICAgICAgLy8gcmlnaHQgbm93IHJlY29yZGluZyBzdHJlYW0gd2lsbCBsaXZlIHVudGlsIGhlcmUsIHNvIHdlIGFyZSBmb3JjZWQgdG8KKyAgICAgICAgICAgICAgICAvLyByZWNvdmVyIGhlcmUuIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGF0IChiLzE3NDk1MTY1KQorICAgICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5yZWNvdmVyT3ZlcnJpZGRlbkpwZWdTaXplKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBicmVhawogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OldBSVRJTkdfRk9SX1BSRVZJRVdfV0lORE9XOiB7CiAgICAgICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwpAQCAtOTY2LDYgKzEwMDcsMTAgQEAKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpTVE9QUEVEOgogICAgICAgICAgICAgcmVzID0gc3RhcnRQcmV2aWV3TChwYXJhbXMsIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgZmlyc3QgcHJldmlldyByZXF1ZXN0IGlzIHN1Ym1pdHRlZCB0byB0aGUgSEFMIGRldmljZSB0byBhdm9pZAorICAgICAgICAgICAgLy8gdHdvIGNvbnNlY3V0aXZlIHNldCBvZiBjb25maWd1cmVfc3RyZWFtcyBiZWluZyBjYWxsZWQgaW50byB0aGUgSEFMLgorICAgICAgICAgICAgLy8gVE9ETzogUmVmYWN0b3IgdGhpcyB0byBhdm9pZCBpbml0aWFsIHByZXZpZXcgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgIHN5bmNXaXRoRGV2aWNlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpQUkVWSUVXOgogICAgICAgICAgICAgLy8gUmVhZHkgdG8gZ28KQEAgLTEwMTksMTggKzEwNjQsOTUgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvLyBPbiBjdXJyZW50IEhBTHMsIGNsZWFuIHVwIFpTTCBiZWZvcmUgdHJhbnNpdGlvbmluZyBpbnRvIHJlY29yZGluZworICAgIGlmIChtRGV2aWNlVmVyc2lvbiAhPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICBpZiAobVpzbFByb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKSAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDbGVhcmluZyBvdXQgenNsIHN0cmVhbSBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgcmVjb3JkaW5nIHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0b3BTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3Qgc3RvcCBzdHJlYW1pbmcgdG8gZGVsZXRlIGNhbGxiYWNrIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogV2FpdGluZyB0byBzdG9wIHN0cmVhbWluZyBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjbGVhciB6c2wgcXVldWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBtWnNsUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGRlbGV0ZSB6c2wgc3RyZWFtIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVjb3JkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gRGlzYWJsZSBjYWxsYmFja3MgaWYgdGhleSdyZSBlbmFibGVkOyBjYW4ndCByZWNvcmQgYW5kIHVzZSBjYWxsYmFja3MsCiAgICAgLy8gYW5kIHdlIGNhbid0IGZhaWwgcmVjb3JkIHN0YXJ0IHdpdGhvdXQgc3RhZ2VmcmlnaHQgYXNzZXJ0aW5nLgogICAgIHBhcmFtcy5wcmV2aWV3Q2FsbGJhY2tGbGFncyA9IDA7CiAKLSAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW08Ci0gICAgICAgICAgICBTdHJlYW1pbmdQcm9jZXNzb3IsCi0gICAgICAgICAgICAmU3RyZWFtaW5nUHJvY2Vzc29yOjp1cGRhdGVSZWNvcmRpbmdTdHJlYW0+KG1TdHJlYW1pbmdQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHVwZGF0ZSByZWNvcmRpbmcgc3RyZWFtOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uICE9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIC8vIEZvciBuZXdlciBkZXZpY2VzLCBtYXkgbmVlZCB0byByZWNvbmZpZ3VyZSB2aWRlbyBzbmFwc2hvdCBKUEVHIHNpemVzCisgICAgICAgIC8vIGR1cmluZyByZWNvcmRpbmcgc3RhcnR1cCwgc28gbmVlZCBhIG1vcmUgY29tcGxleCBzZXF1ZW5jZSBoZXJlIHRvCisgICAgICAgIC8vIGVuc3VyZSBhbiBlYXJseSBzdHJlYW0gcmVjb25maWd1cmF0aW9uIGRvZXNuJ3QgaGFwcGVuCisgICAgICAgIGJvb2wgcmVjb3JkaW5nU3RyZWFtTmVlZHNVcGRhdGU7CisgICAgICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKHBhcmFtcywgJnJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHF1ZXJ5IHJlY29yZGluZyBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIHN0b3Agc3RyZWFtIGhlcmUgc28gdXBkYXRlUHJvY2Vzc29yU3RyZWFtIHdvbid0IHRyaWdnZXIgY29uZmlndXJlU3RyZWFtCisgICAgICAgICAgICAvLyBSaWdodCBub3cgY2FtZXJhIGRldmljZSBjYW5ub3QgaGFuZGxlIGNvbmZpZ3VyZVN0cmVhbSBmYWlsdXJlIGdyYWNlZnVsbHkKKyAgICAgICAgICAgIC8vIHdoZW4gZGV2aWNlIGlzIHN0cmVhbWluZworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RvcFN0cmVhbSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBzdG9wIHN0cmVhbWluZyB0byB1cGRhdGUgcmVjb3JkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogV2FpdGluZyB0byBzdG9wIHN0cmVhbWluZyBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtPAorICAgICAgICAgICAgICAgICAgICBTdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICZTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbT4oCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtaW5nUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHVwZGF0ZSByZWNvcmRpbmcgc3RyZWFtOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1haW50YWluIGNhbGwgc2VxdWVuY2luZyBmb3IgSEFMdjIgZGV2aWNlcy4KKyAgICAgICAgcmVzID0gdXBkYXRlUHJvY2Vzc29yU3RyZWFtPAorICAgICAgICAgICAgICAgIFN0cmVhbWluZ1Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAmU3RyZWFtaW5nUHJvY2Vzc29yOjp1cGRhdGVSZWNvcmRpbmdTdHJlYW0+KG1TdHJlYW1pbmdQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIHJlY29yZGluZyBzdHJlYW06ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAgICAgfQogCiAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbXM7CkBAIC0xMDM5LDYgKzExNjEsMTYgQEAKIAogICAgIHJlcyA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPnN0YXJ0U3RyZWFtKFN0cmVhbWluZ1Byb2Nlc3Nvcjo6UkVDT1JELAogICAgICAgICAgICAgb3V0cHV0U3RyZWFtcyk7CisKKyAgICAvLyBzdGFydFN0cmVhbSBtaWdodCB0cmlnZ2VyIGEgY29uZmlndXJlU3RyZWFtIGNhbGwgYW5kIGRldmljZSBtaWdodCBmYWlsCisgICAgLy8gY29uZmlndXJlU3RyZWFtIGR1ZSB0byBqcGVnIHNpemUgPiB2aWRlbyBzaXplLiBUcnkgYWdhaW4gd2l0aCBqcGVnIHNpemUgb3ZlcnJpZGRlbgorICAgIC8vIHRvIHZpZGVvIHNpemUuCisgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShwYXJhbXMpOworICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zdGFydFN0cmVhbShTdHJlYW1pbmdQcm9jZXNzb3I6OlJFQ09SRCwKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1zKTsKKyAgICB9CisKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc3RhcnQgcmVjb3JkaW5nIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTEyMyw2ICsxMjU1LDggQEAKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlIDwgUGFyYW1ldGVyczo6UFJFVklFVykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbGwgYXV0b0ZvY3VzIHdoZW4gcHJldmlldyBpcyBpbmFjdGl2ZSAoc3RhdGUgPSAlZCkuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGwubVBhcmFtZXRlcnMuc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAKQEAgLTExNjUsNyArMTI5OSw3IEBACiAgICAgICAgICAqIEhhbmRsZSBxdWlyayBtb2RlIGZvciBBRiBpbiBzY2VuZSBtb2RlcwogICAgICAgICAgKi8KICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMucXVpcmtzLnRyaWdnZXJBZldpdGhBdXRvICYmCi0gICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQgJiYKKyAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCAmJgogICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuZm9jdXNNb2RlICE9IFBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQVVUTyAmJgogICAgICAgICAgICAgICAgICFsLm1QYXJhbWV0ZXJzLmZvY3VzaW5nQXJlYXNbMF0uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IFF1aXJrOiBTd2l0Y2hpbmcgZnJvbSBmb2N1c01vZGUgJWQgdG8gQVVUTyIsCkBAIC0xMjIyLDYgKzEzNTYsOSBAQAogCiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuenNsTW9kZSkgeworICAgICAgICAgICAgbVpzbFByb2Nlc3Nvci0+Y2xlYXJac2xRdWV1ZSgpOworICAgICAgICB9CiAgICAgfQogICAgIHN5bmNXaXRoRGV2aWNlKCk7CiAKQEAgLTEyNjksMTMgKzE0MDYsMjggQEAKIAogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RhcnRpbmcgcGljdHVyZSBjYXB0dXJlIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogCisgICAgICAgIGludCBsYXN0SnBlZ1N0cmVhbUlkID0gbUpwZWdQcm9jZXNzb3ItPmdldFN0cmVhbUlkKCk7CiAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgbC5tUGFyYW1ldGVycyk7CisgICAgICAgIC8vIElmIHZpZGVvIHNuYXBzaG90IGZhaWwgdG8gY29uZmlndXJlU3RyZWFtLCB0cnkgb3ZlcnJpZGUgdmlkZW8gc25hcHNob3Qgc2l6ZSB0bworICAgICAgICAvLyB2aWRlbyBzaXplCisgICAgICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFICYmIGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKKyAgICAgICAgICAgIG92ZXJyaWRlVmlkZW9TbmFwc2hvdFNpemUobC5tUGFyYW1ldGVycyk7CisgICAgICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIGwubVBhcmFtZXRlcnMpOworICAgICAgICB9CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBzZXQgdXAgc3RpbGwgaW1hZ2Ugc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICB0YWtlUGljdHVyZUNvdW50ZXIgPSArK2wubVBhcmFtZXRlcnMudGFrZVBpY3R1cmVDb3VudGVyOworCisgICAgICAgIC8vIENsZWFyIFpTTCBidWZmZXIgcXVldWUgd2hlbiBKcGVnIHNpemUgaXMgY2hhbmdlZC4KKyAgICAgICAgYm9vbCBqcGVnU3RyZWFtQ2hhbmdlZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IGxhc3RKcGVnU3RyZWFtSWQ7CisgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnpzbE1vZGUgJiYganBlZ1N0cmVhbUNoYW5nZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDbGVhciBaU0wgYnVmZmVyIHF1ZXVlIHdoZW4gSnBlZyBzaXplIGlzIGNoYW5nZWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oa1Rha2VwaWN0dXJlTGFiZWwsIHRha2VQaWN0dXJlQ291bnRlcik7CkBAIC0xMzAxLDggKzE0NTMsMTQgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAKKyAgICBQYXJhbWV0ZXJzOjpmb2N1c01vZGVfdCBmb2N1c01vZGVCZWZvcmUgPSBsLm1QYXJhbWV0ZXJzLmZvY3VzTW9kZTsKICAgICByZXMgPSBsLm1QYXJhbWV0ZXJzLnNldChwYXJhbXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgUGFyYW1ldGVyczo6Zm9jdXNNb2RlX3QgZm9jdXNNb2RlQWZ0ZXIgPSBsLm1QYXJhbWV0ZXJzLmZvY3VzTW9kZTsKKworICAgIGlmIChsLm1QYXJhbWV0ZXJzLnpzbE1vZGUgJiYgZm9jdXNNb2RlQWZ0ZXIgIT0gZm9jdXNNb2RlQmVmb3JlKSB7CisgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKKyAgICB9CiAKICAgICByZXMgPSB1cGRhdGVSZXF1ZXN0cyhsLm1QYXJhbWV0ZXJzKTsKIApAQCAtMTMxMyw3ICsxNDcxLDggQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBpZiAoIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CisgICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcworICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OlJlYWRMb2NrIGwobVBhcmFtZXRlcnMpOwogCkBAIC0xMzkzLDYgKzE1NTIsMTMgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKKyAgICBpZiAobUxlZ2FjeU1vZGUpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKICAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0xNjU4LDggKzE4MjQsOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpyZWdpc3RlckZyYW1lTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKLSAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyKSB7Ci0gICAgcmV0dXJuIG1GcmFtZVByb2Nlc3Nvci0+cmVnaXN0ZXJMaXN0ZW5lcihtaW5JZCwgbWF4SWQsIGxpc3RlbmVyKTsKKyAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHNlbmRQYXJ0aWFscykgeworICAgIHJldHVybiBtRnJhbWVQcm9jZXNzb3ItPnJlZ2lzdGVyTGlzdGVuZXIobWluSWQsIG1heElkLCBsaXN0ZW5lciwgc2VuZFBhcnRpYWxzKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6cmVtb3ZlRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLApAQCAtMTgyOCw2ICsxOTk0LDE4IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6b3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShQYXJhbWV0ZXJzICZwYXJhbXMpIHsKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogY29uZmlndXJlIHN0aWxsIHNpemUgdG8gdmlkZW8gc2l6ZSBiZWZvcmUgcmVjb3JkaW5nIgorICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgcGFyYW1zLm92ZXJyaWRlSnBlZ1NpemVCeVZpZGVvU2l6ZSgpOworICAgIHN0YXR1c190IHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgcGFyYW1zKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBvdmVycmlkZSB2aWRlbyBzbmFwc2hvdCBzaXplIHRvIHZpZGVvIHNpemU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwogY29uc3QgY2hhciogQ2FtZXJhMkNsaWVudDo6a0F1dG9mb2N1c0xhYmVsID0gImF1dG9mb2N1cyI7CiBjb25zdCBjaGFyKiBDYW1lcmEyQ2xpZW50OjprVGFrZXBpY3R1cmVMYWJlbCA9ICJ0YWtlX3BpY3R1cmUiOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IGRmY2Y4MzYuLmFiZWU3OTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudCgpOwogCkBAIC0xMjAsNyArMTIwLDggQEAKICAgICBpbnQgZ2V0WnNsU3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHN0YXR1c190IHJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAotICAgICAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHdwPGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yOjpGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGJvb2wgc2VuZFBhcnRpYWxzID0gdHJ1ZSk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlRnJhbWVMaXN0ZW5lcihpbnQzMl90IG1pbklkLCBpbnQzMl90IG1heElkLAogICAgICAgICAgICAgd3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyKTsKIApAQCAtMTcyLDcgKzE3Myw2IEBACiAKICAgICB2b2lkICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnTChQYXJhbWV0ZXJzICZwYXJhbXMsIGludCBmbGFnKTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0cyhQYXJhbWV0ZXJzICZwYXJhbXMpOwotICAgIGludCBtRGV2aWNlVmVyc2lvbjsKIAogICAgIC8vIFVzZWQgd2l0aCBzdHJlYW0gSURzCiAgICAgc3RhdGljIGNvbnN0IGludCBOT19TVFJFQU0gPSAtMTsKQEAgLTIwNiw5ICsyMDYsMTMgQEAKICAgICBib29sIG1BZkluTW90aW9uOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLworICAgIGJvb2wgbUxlZ2FjeU1vZGU7CiAKICAgICAvLyBXYWl0IHVudGlsIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyByZWNlaXZlZCB0aGUgbGF0ZXN0IGNvbnRyb2wgc2V0dGluZ3MKICAgICBzdGF0dXNfdCBzeW5jV2l0aERldmljZSgpOworCisgICAgLy8gVmlkZW8gc25hcHNob3QganBlZyBzaXplIG92ZXJyaWRpbmcgaGVscGVyIGZ1bmN0aW9uCisgICAgc3RhdHVzX3Qgb3ZlcnJpZGVWaWRlb1NuYXBzaG90U2l6ZShQYXJhbWV0ZXJzICZwYXJhbXMpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCAyZTNhMmVkLi43NWIzYjcyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUpOgogICAgICAgICBDbGllbnQoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAvLyBDYWxsYmFjayBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CiAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOwogICAgIG1PcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKDAsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7CisgICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIH0KQEAgLTc5LDEzICs4MCwxMyBAQAogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIG1IYXJkd2FyZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBtSGFyZHdhcmUtPnNldENhbGxiYWNrcyhub3RpZnlDYWxsYmFjaywKICAgICAgICAgICAgIGRhdGFDYWxsYmFjaywKICAgICAgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCwKLSAgICAgICAgICAgICh2b2lkICopbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltQ2FtZXJhSWQpOwogCiAgICAgLy8gRW5hYmxlIHpvb20sIGVycm9yLCBmb2N1cywgYW5kIG1ldGFkYXRhIG1lc3NhZ2VzIGJ5IGRlZmF1bHQKICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfRVJST1IgfCBDQU1FUkFfTVNHX1pPT00gfCBDQU1FUkFfTVNHX0ZPQ1VTIHwKQEAgLTEyNSw2ICsxMjYsMTYgQEAKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKICAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOworCisgICAgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiTGF0ZXN0IHNldCBwYXJhbWV0ZXJzOlxuIik7CisgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOworICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CisKKyAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycy5kdW1wKGZkLCBhcmdzKTsKKworICAgIGNvbnN0IGNoYXIgKmVuZGR1bXAgPSAiXG5cbiI7CisgICAgd3JpdGUoZmQsIGVuZGR1bXAsIHN0cmxlbihlbmRkdW1wKSk7CisKICAgICByZXR1cm4gbUhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKIH0KIApAQCAtNTUzLDYgKzU2NCw3IEBACiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKKyAgICBtTGF0ZXN0U2V0UGFyYW1ldGVycyA9IENhbWVyYVBhcmFtZXRlcnMocGFyYW1zKTsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHAocGFyYW1zKTsKICAgICByZXR1cm4gbUhhcmR3YXJlLT5zZXRQYXJhbWV0ZXJzKHApOwogfQpAQCAtNTYwLDcgKzU3Miw4IEBACiAvLyBnZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIFN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gU3RyaW5nOCgpOworICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKKyAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFN0cmluZzggcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpLmZsYXR0ZW4oKSk7CiAgICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwpAQCAtNTc5LDYgKzU5MiwxMyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAorICAgIGlmIChtTGVnYWN5TW9kZSkgeworICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5CiAgICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwpAQCAtOTMzLDcgKzk1MywyMCBAQAogICAgIH0KICAgICBwcmV2aWV3QnVmZmVyID0gbVByZXZpZXdCdWZmZXI7CiAKLSAgICBtZW1jcHkocHJldmlld0J1ZmZlci0+YmFzZSgpLCAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7CisgICAgdm9pZCogcHJldmlld0J1ZmZlckJhc2UgPSBwcmV2aWV3QnVmZmVyLT5iYXNlKCk7CisgICAgdm9pZCogaGVhcEJhc2UgPSBoZWFwLT5iYXNlKCk7CisKKyAgICBpZiAoaGVhcEJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBtbWFwIGhlYXAgZm9yIHByZXZpZXcgZnJhbWUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHByZXZpZXdCdWZmZXJCYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbW1hcCBwcmV2aWV3IGJ1ZmZlciBmb3IgcHJldmlldyBmcmFtZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweShwcmV2aWV3QnVmZmVyQmFzZSwgKHVpbnQ4X3QgKikgaGVhcEJhc2UgKyBvZmZzZXQsIHNpemUpOwogCiAgICAgc3A8TWVtb3J5QmFzZT4gZnJhbWUgPSBuZXcgTWVtb3J5QmFzZShwcmV2aWV3QnVmZmVyLCAwLCBzaXplKTsKICAgICBpZiAoZnJhbWUgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggYTI3MGY5MC4uZWRhMWE5ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02NCw3ICs2NCw4IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKKyAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKICAgICBzdGF0dXNfdCBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKQEAgLTEzMSw2ICsxMzIsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWc7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb247ICAgICAvLyBDdXJyZW50IGRpc3BsYXkgb3JpZW50YXRpb24KICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5U2h1dHRlclNvdW5kOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeU1vZGU7IC8vIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlPwogCiAgICAgLy8gRW5zdXJlcyBhdG9taWNpdHkgYW1vbmcgdGhlIHB1YmxpYyBtZXRob2RzCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKQEAgLTE0Miw2ICsxNDQsOSBAQAogICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCiAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgICAgICBtUHJldmlld0J1ZmZlcjsKIAorICAgIC8vIERlYnVnZ2luZyBpbmZvcm1hdGlvbgorICAgIENhbWVyYVBhcmFtZXRlcnMgICAgICAgICAgICAgICAgbUxhdGVzdFNldFBhcmFtZXRlcnM7CisKICAgICAvLyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBkZWFkbG9jayB3aGVuIHRoZSBpbmNvbWluZyBjb21tYW5kIHRocmVhZCBhbmQKICAgICAvLyB0aGUgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgY2FsbGJhY2sgdGhyZWFkIGJvdGggd2FudCB0byBncmFiIG1Mb2NrLgogICAgIC8vIEFuIGV4dHJhIGZsYWcgaXMgdXNlZCB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKaW5kZXggZDJhYzc5Yy4uYmYzMzE4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCkBAIC0xMTAsMTEgKzExMCwxMyBAQAogICAgIGlmICghbUNhbGxiYWNrVG9BcHAgJiYgbUNhbGxiYWNrQ29uc3VtZXIgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQ1BVIGJ1ZmZlciBxdWV1ZSBlbmRwb2ludCwgc2luY2UgYXBwIGhhc24ndCBnaXZlbiB1cyBvbmUKICAgICAgICAgLy8gTWFrZSBpdCBhc3luYyB0byBhdm9pZCBkaXNjb25uZWN0IGRlYWRsb2NrcwotICAgICAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIGtDYWxsYmFja0hlYXBDb3VudCk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGtDYWxsYmFja0hlYXBDb3VudCk7CiAgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50OjpDYWxsYmFja0NvbnN1bWVyIikpOwotICAgICAgICBtQ2FsbGJhY2tXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1DYWxsYmFja1dpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKICAgICBpZiAobUNhbGxiYWNrU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CkBAIC0xNTMsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgcGFyYW1zLnByZXZpZXdGb3JtYXQpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FsbGJhY2tXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIDAsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgY2FsbGJhY2tzOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggOGE0Y2U0ZS4uOTg0OWY0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtMTgsNiArMTgsOCBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTEwNCwxMyArMTA2LDEyIEBACiAgICAgfQogfQogCi12b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewotICAgIEFMT0dWKCIlczogTGlzdGVuZXIgZm91bmQgbmV3IGZyYW1lIiwgX19GVU5DVElPTl9fKTsKK3ZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IE5ldyByZXN1bHQgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwotICAgIG1OZXdGcmFtZUlkID0gcmVxdWVzdElkOwotICAgIG1OZXdGcmFtZSA9IGZyYW1lOworICAgIG1OZXdGcmFtZUlkID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIG1OZXdGcmFtZSA9IHJlc3VsdC5tTWV0YWRhdGE7CiAgICAgaWYgKCFtTmV3RnJhbWVSZWNlaXZlZCkgewogICAgICAgICBtTmV3RnJhbWVSZWNlaXZlZCA9IHRydWU7CiAgICAgICAgIG1OZXdGcmFtZVNpZ25hbC5zaWduYWwoKTsKQEAgLTM0OSw4ICszNTAsMTAgQEAKICAgICAgICAgcmV0dXJuIERPTkU7CiAgICAgfQogCisgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBnZXQgcGFydGlhbCByZXN1bHRzIGZvciBaU0wgY2FwdHVyZS4KICAgICBjbGllbnQtPnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihtQ2FwdHVyZUlkLCBtQ2FwdHVyZUlkICsgMSwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICAvLyBUT0RPOiBBY3R1YWxseSBzZWxlY3QgdGhlIHJpZ2h0IHRoaW5nIGhlcmUuCiAgICAgcmVzID0gcHJvY2Vzc29yLT5wdXNoVG9SZXByb2Nlc3MobUNhcHR1cmVJZCk7CkBAIC0zOTIsOCArMzk1LDE0IEBACiAKICAgICBib29sIGlzQWVDb252ZXJnZWQgPSBmYWxzZTsKICAgICAvLyBHZXQgdGhlIG9uRnJhbWVBdmFpbGFibGUgY2FsbGJhY2sgd2hlbiB0aGUgcmVxdWVzdElEID09IG1DYXB0dXJlSWQKKyAgICAvLyBXZSBkb24ndCB3YW50IHRvIGdldCBwYXJ0aWFsIHJlc3VsdHMgZm9yIG5vcm1hbCBjYXB0dXJlLCBhcyB3ZSBuZWVkCisgICAgLy8gR2V0IEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCBmcm9tIHRoZSBjYXB0dXJlIHJlc3VsdCwgYnV0IHBhcnRpYWwKKyAgICAvLyByZXN1bHQgZG9lc24ndCBoYXZlIHRvIGhhdmUgdGhpcyBtZXRhZGF0YSBhdmFpbGFibGUuCisgICAgLy8gVE9ETzogVXBkYXRlIHRvIHVzZSB0aGUgSEFMdjMgc2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlbW92ZSB0aGUKKyAgICAvLyBuZWVkIGZvciB0aGlzIGxpc3RlbmVyIGFuZCBtYWtlIGl0IGZhc3Rlci4gc2VlIGJ1ZyAxMjUzMDYyOC4KICAgICBjbGllbnQtPnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihtQ2FwdHVyZUlkLCBtQ2FwdHVyZUlkICsgMSwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKQEAgLTQzNiwxMSArNDQ1LDE4IEBACiAgICAgaWYgKG1OZXdBRVN0YXRlKSB7CiAgICAgICAgIGlmICghbUFlSW5QcmVjYXB0dXJlKSB7CiAgICAgICAgICAgICAvLyBXYWl0aW5nIHRvIHNlZSBQUkVDQVBUVVJFIHN0YXRlCi0gICAgICAgICAgICBpZiAobUFFVHJpZ2dlcklkID09IG1UcmlnZ2VySWQgJiYKLSAgICAgICAgICAgICAgICAgICAgbUFFU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX1BSRUNBUFRVUkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEdvdCBwcmVjYXB0dXJlIHN0YXJ0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICBtQWVJblByZWNhcHR1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1UaW1lb3V0Q291bnQgPSBrTWF4VGltZW91dHNGb3JQcmVjYXB0dXJlRW5kOworICAgICAgICAgICAgaWYgKG1BRVRyaWdnZXJJZCA9PSBtVHJpZ2dlcklkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BRVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9QUkVDQVBUVVJFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogR290IHByZWNhcHR1cmUgc3RhcnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBtQWVJblByZWNhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yUHJlY2FwdHVyZUVuZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BRVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BRVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9GTEFTSF9SRVFVSVJFRCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBsZWdhbCB0byB0cmFuc2l0IHRvIENPTlZFUkdFRCBvciBGTEFTSF9SRVFVSVJFRAorICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBhZnRlciBhIHRyaWdnZXIuCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQUUgaXMgYWxyZWFkeSBpbiBnb29kIHN0YXRlLCBzdGFydCBjYXB0dXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQU5EQVJEX0NBUFRVUkU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2FpdGluZyB0byBzZWUgUFJFQ0FQVFVSRSBzdGF0ZSBlbmQKQEAgLTU4MywxMiArNTk5LDE1IEBACiAgICAgICAgIGVudHJ5ID0gbU5ld0ZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJObyB0aW1lc3RhbXAgZmllbGQgaW4gY2FwdHVyZSBmcmFtZSEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW50cnkuZGF0YS5pNjRbMF0gIT0gbUNhcHR1cmVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIEFMT0dXKCJNaXNtYXRjaGVkIGNhcHR1cmUgdGltZXN0YW1wczogTWV0YWRhdGEgZnJhbWUgJWxsZCwiCi0gICAgICAgICAgICAgICAgICAgICIgY2FwdHVyZWQgYnVmZmVyICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmk2NFswXSwKLSAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVUaW1lc3RhbXApOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmk2NFswXSAhPSBtQ2FwdHVyZVRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJNaXNtYXRjaGVkIGNhcHR1cmUgdGltZXN0YW1wczogTWV0YWRhdGEgZnJhbWUgJSIgUFJJZDY0ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBjYXB0dXJlZCBidWZmZXIgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pNjRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiVGltZXN0YW1wIG1ldGFkYXRhIGlzIG1hbGZvcm1lZCEiKTsKICAgICAgICAgfQogICAgICAgICBjbGllbnQtPnJlbW92ZUZyYW1lTGlzdGVuZXIobUNhcHR1cmVJZCwgbUNhcHR1cmVJZCArIDEsIHRoaXMpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCA5ZmI0ZWU3Li5kNDJhYjEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAjaW5jbHVkZSAiUGFyYW1ldGVycy5oIgogI2luY2x1ZGUgIkZyYW1lUHJvY2Vzc29yLmgiCiAKQEAgLTYxLDggKzYyLDggQEAKICAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IEFFIHN0YXRlIGNoYW5nZXMKICAgICB2b2lkIG5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKIAotICAgIC8vIE5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSk7CisgICAgLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIGZyYW1lIHByb2Nlc3NvcgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpOwogCiAgICAgLy8gTm90aWZpY2F0aW9ucyBmcm9tIHRoZSBKUEVHIHByb2Nlc3NvcgogICAgIHZvaWQgb25DYXB0dXJlQXZhaWxhYmxlKG5zZWNzX3QgdGltZXN0YW1wLCBzcDxNZW1vcnlCYXNlPiBjYXB0dXJlQnVmZmVyKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDE5YWNhZTQuLjMxMmE3OGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtNDAsNyArNDAsMTIgQEAKIAogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgbVVzZVBhcnRpYWxRdWlyayA9IGwubVBhcmFtZXRlcnMucXVpcmtzLnBhcnRpYWxSZXN1bHRzOworCisgICAgICAgIGlmIChjbGllbnQtPmdldENhbWVyYURldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSAobU51bVBhcnRpYWxSZXN1bHRzID4gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdCA9IGwubVBhcmFtZXRlcnMucXVpcmtzLnBhcnRpYWxSZXN1bHRzOworICAgICAgICB9CiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZSBzdGFydGluZyAzQSBzdGF0ZQogICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCA9IGwubVBhcmFtZXRlcnMuYWZUcmlnZ2VyQ291bnRlcjsKQEAgLTU1LDcgKzYwLDcgQEAKIEZyYW1lUHJvY2Vzc29yOjp+RnJhbWVQcm9jZXNzb3IoKSB7CiB9CiAKLWJvb2wgRnJhbWVQcm9jZXNzb3I6OnByb2Nlc3NTaW5nbGVGcmFtZShDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitib29sIEZyYW1lUHJvY2Vzc29yOjpwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogCiAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CkBAIC02MywxNyArNjgsMjEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGJvb2wgcGFydGlhbFJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChtVXNlUGFydGlhbFF1aXJrKSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwotICAgICAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOwotICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwICYmCi0gICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7Ci0gICAgICAgICAgICBwYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCkgeworICAgICAgICBpZiAoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgbU51bVBhcnRpYWxSZXN1bHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CisgICAgICAgICAgICBlbnRyeSA9IGZyYW1lLm1NZXRhZGF0YS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7CisgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghcGFydGlhbFJlc3VsdCAmJiBwcm9jZXNzRmFjZURldGVjdChmcmFtZSwgY2xpZW50KSAhPSBPSykgeworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0ICYmIHByb2Nlc3NGYWNlRGV0ZWN0KGZyYW1lLm1NZXRhZGF0YSwgY2xpZW50KSAhPSBPSykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xNjgsNyArMTc3LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmYWNlU2NvcmVzW2ldID4gMTAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzOiBGYWNlIGluZGV4ICVkIHdpdGggb3V0IG9mIHJhbmdlIHNjb3JlICVkIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IEZhY2UgaW5kZXggJXp1IHdpdGggb3V0IG9mIHJhbmdlIHNjb3JlICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaSwgZmFjZVNjb3Jlc1tpXSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIxMiwxNCArMjIxLDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBGcmFtZVByb2Nlc3Nvcjo6cHJvY2VzczNhU3RhdGUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3I6OnByb2Nlc3MzYVN0YXRlKGNvbnN0IENhcHR1cmVSZXN1bHQgJmZyYW1lLAogICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiAmY2xpZW50KSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IGZyYW1lLm1NZXRhZGF0YTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKICAgICBpbnQgY2FtZXJhSWQgPSBjbGllbnQtPmdldENhbWVyYUlkKCk7CiAKLSAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKKyAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5UKTsKICAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gZW50cnkuZGF0YS5pMzJbMF07CiAKICAgICAvLyBEb24ndCBzZW5kIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lIG51bWJlciB0d2ljZQpAQCAtMjM4LDI2ICsyNDgsMzEgQEAKIAogICAgIC8vIFRPRE86IEFsc28gdXNlIEFFIG1vZGUsIEFFIHRyaWdnZXIgSUQKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCisgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKICAgICAgICAgICAgICZuZXczYVN0YXRlLmFmTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYXdiTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWVTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAorICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAogICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDx1aW50OF90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmbmV3M2FTdGF0ZS5hd2JTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihmcmFtZSwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICAgICAmbmV3M2FTdGF0ZS5hZlRyaWdnZXJJZCwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKKyAgICBpZiAoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgbmV3M2FTdGF0ZS5hZlRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQ7CisgICAgICAgIG5ldzNhU3RhdGUuYWVUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290QWxsU3RhdGVzICY9IGdldDNhUmVzdWx0PGludDMyX3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKKyAgICAgICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gZ2V0M2FSZXN1bHQ8aW50MzJfdD4oZnJhbWUsIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lELAotICAgICAgICAgICAgJm5ldzNhU3RhdGUuYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CisgICAgICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzYVJlc3VsdDxpbnQzMl90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCisgICAgICAgICAgICAgICAgICZuZXczYVN0YXRlLmFlVHJpZ2dlcklkLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOworICAgIH0KIAogICAgIGlmICghZ290QWxsU3RhdGVzKSByZXR1cm4gQkFEX1ZBTFVFOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCmluZGV4IDg1NmFkMzIuLjY4Y2Y1NWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oCkBAIC01MSwxNCArNTEsMTQgQEAKIAogICAgIHZvaWQgcHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiAmY2xpZW50KTsKIAotICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAogICAgIHN0YXR1c190IHByb2Nlc3NGYWNlRGV0ZWN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+ICZjbGllbnQpOwogCiAgICAgLy8gU2VuZCAzQSBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBjbGllbnQgYmFzZWQgb24gZnJhbWUgbWV0YWRhdGEKLSAgICBzdGF0dXNfdCBwcm9jZXNzM2FTdGF0ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCisgICAgc3RhdHVzX3QgcHJvY2VzczNhU3RhdGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmZnJhbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiAmY2xpZW50KTsKIAogICAgIC8vIEhlbHBlciBmb3IgcHJvY2VzczNhU3RhdGUKQEAgLTkxLDggKzkxLDggQEAKICAgICAgICAgfQogICAgIH0gbTNhU3RhdGU7CiAKLSAgICAvLyBXaGV0aGVyIHRoZSBwYXJ0aWFsIHJlc3VsdCBxdWlyayBpcyBlbmFibGVkIGZvciB0aGlzIGRldmljZQotICAgIGJvb2wgbVVzZVBhcnRpYWxRdWlyazsKKyAgICAvLyBXaGV0aGVyIHRoZSBwYXJ0aWFsIHJlc3VsdCBpcyBlbmFibGVkIGZvciB0aGlzIGRldmljZQorICAgIGJvb2wgbVVzZVBhcnRpYWxSZXN1bHQ7CiAKICAgICAvLyBUcmFjayBtb3N0IHJlY2VudCBmcmFtZSBudW1iZXIgZm9yIHdoaWNoIDNBIG5vdGlmaWNhdGlvbnMgd2VyZSBzZW50IGZvci4KICAgICAvLyBVc2VkIHRvIGZpbHRlciBhZ2FpbnN0IHNlbmRpbmcgM0Egbm90aWZpY2F0aW9ucyBmb3IgdGhlIHNhbWUgZnJhbWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwCmluZGV4IDJmMGM2N2QuLjllY2FiNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcApAQCAtMTk3LDcgKzE5Nyw3IEBACiB2b2lkIEpwZWdDb21wcmVzc29yOjpqcGVnSW5pdERlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBKcGVnRGVzdGluYXRpb24gKmRlc3Q9IHN0YXRpY19jYXN0PEpwZWdEZXN0aW5hdGlvbio+KGNpbmZvLT5kZXN0KTsKLSAgICBBTE9HVigiJXM6IFNldHRpbmcgZGVzdGluYXRpb24gdG8gJXAsIHNpemUgJWQiLAorICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXN0aW5hdGlvbiB0byAlcCwgc2l6ZSAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXN0LT5wYXJlbnQtPm1KcGVnQnVmZmVyLT5kYXRhLCBrTWF4SnBlZ1NpemUpOwogICAgIGRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSAoSk9DVEVUKikoZGVzdC0+cGFyZW50LT5tSnBlZ0J1ZmZlci0+ZGF0YSk7CiAgICAgZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBrTWF4SnBlZ1NpemU7CkBAIC0yMTMsNyArMjEzLDcgQEAKIHZvaWQgSnBlZ0NvbXByZXNzb3I6OmpwZWdUZXJtRGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKICAgICAodm9pZCkgY2luZm87IC8vIFRPRE86IGNsZWFuIHVwCiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBBTE9HVigiJXM6IERvbmUgd3JpdGluZyBKUEVHIGRhdGEuICVkIGJ5dGVzIGxlZnQgaW4gYnVmZmVyIiwKKyAgICBBTE9HVigiJXM6IERvbmUgd3JpdGluZyBKUEVHIGRhdGEuICV6dSBieXRlcyBsZWZ0IGluIGJ1ZmZlciIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBlYzgxNDU2Li5iNDMzNzgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC03MywzMCArNzMsNDMgQEAKICAgICB9CiAKICAgICAvLyBGaW5kIG91dCBidWZmZXIgc2l6ZSBmb3IgSlBFRwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heEpwZWdTaXplID0KLSAgICAgICAgICAgIHBhcmFtcy5zdGF0aWNJbmZvKEFORFJPSURfSlBFR19NQVhfU0laRSk7Ci0gICAgaWYgKG1heEpwZWdTaXplLmNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgQU5EUk9JRF9KUEVHX01BWF9TSVpFISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHNzaXplX3QgbWF4SnBlZ1NpemUgPSBkZXZpY2UtPmdldEpwZWdCdWZmZXJTaXplKHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKKyAgICBpZiAobWF4SnBlZ1NpemUgPD0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogSnBlZyBidWZmZXIgc2l6ZSAoJXp1KSBpcyBpbnZhbGlkICIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1heEpwZWdTaXplKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIGlmIChtQ2FwdHVyZUNvbnN1bWVyID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1DYXB0dXJlQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoYnEsIDEpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1DYXB0dXJlQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOwogICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OkNhcHR1cmVDb25zdW1lciIpKTsKLSAgICAgICAgbUNhcHR1cmVXaW5kb3cgPSBuZXcgU3VyZmFjZShicSk7CisgICAgICAgIG1DYXB0dXJlV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgIH0KKworICAgIC8vIFNpbmNlIGFzaG1lbSBoZWFwcyBhcmUgcm91bmRlZCB1cCB0byBwYWdlIHNpemUsIGRvbid0IHJlYWxsb2NhdGUgaWYKKyAgICAvLyB0aGUgY2FwdHVyZSBoZWFwIGlzbid0IGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgcmVxdWlyZWQgSlBFRyBidWZmZXIKKyAgICBjb25zdCBzaXplX3QgSEVBUF9TTEFDS19GQUNUT1IgPSAyOworICAgIGlmIChtQ2FwdHVyZUhlYXAgPT0gMCB8fAorICAgICAgICAgICAgKG1DYXB0dXJlSGVhcC0+Z2V0U2l6ZSgpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhKcGVnU2l6ZSkpIHx8CisgICAgICAgICAgICAobUNhcHR1cmVIZWFwLT5nZXRTaXplKCkgPgorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KG1heEpwZWdTaXplKSAqIEhFQVBfU0xBQ0tfRkFDVE9SKSApIHsKICAgICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBmb3IgQVBJIGNvbnN1bXB0aW9uCi0gICAgICAgIG1DYXB0dXJlSGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShtYXhKcGVnU2l6ZS5kYXRhLmkzMlswXSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEyQ2xpZW50OjpDYXB0dXJlSGVhcCIpOworICAgICAgICBtQ2FwdHVyZUhlYXAuY2xlYXIoKTsKKyAgICAgICAgbUNhcHR1cmVIZWFwID0KKyAgICAgICAgICAgICAgICBuZXcgTWVtb3J5SGVhcEJhc2UobWF4SnBlZ1NpemUsIDAsICJDYW1lcmEyQ2xpZW50OjpDYXB0dXJlSGVhcCIpOwogICAgICAgICBpZiAobUNhcHR1cmVIZWFwLT5nZXRTaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNhcHR1cmUiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAgICAgfQorICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBKUEVHIGNhcHR1cmUgaGVhcCBub3cgJWQgYnl0ZXM7IHJlcXVlc3RlZCAlZCBieXRlcyIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUNhcHR1cmVIZWFwLT5nZXRTaXplKCksIG1heEpwZWdTaXplKTsKIAogICAgIGlmIChtQ2FwdHVyZVN0cmVhbUlkICE9IE5PX1NUUkVBTSkgewogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQpAQCAtMTMyLDggKzE0NSw3IEBACiAgICAgICAgIC8vIENyZWF0ZSBzdHJlYW0gZm9yIEhBTCBwcm9kdWN0aW9uCiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYXB0dXJlV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0LAotICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgbWF4SnBlZ1NpemUuZGF0YS5pMzJbMF0sCi0gICAgICAgICAgICAgICAgJm1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgJm1DYXB0dXJlU3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIGNhcHR1cmU6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTI0MSw3ICsyNTMsNyBAQAogICAgICAgICBzaXplX3QgaGVhcFNpemUgPSBtQ2FwdHVyZUhlYXAtPmdldFNpemUoKTsKICAgICAgICAgaWYgKGpwZWdTaXplID4gaGVhcFNpemUpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogSlBFRyBpbWFnZSBpcyBsYXJnZXIgdGhhbiBleHBlY3RlZCwgdHJ1bmNhdGluZyAiCi0gICAgICAgICAgICAgICAgICAgICIoZ290ICVkLCBleHBlY3RlZCBhdCBtb3N0ICVkIGJ5dGVzKSIsCisgICAgICAgICAgICAgICAgICAgICIoZ290ICV6dSwgZXhwZWN0ZWQgYXQgbW9zdCAlenUgYnl0ZXMpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBqcGVnU2l6ZSwgaGVhcFNpemUpOwogICAgICAgICAgICAganBlZ1NpemUgPSBoZWFwU2l6ZTsKICAgICAgICAgfQpAQCAtMzM1LDEzICszNDcsMTMgQEAKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplIC0gTUFSS0VSX0xFTkdUSDsKICAgICAgICAgICAgIHVpbnQ4X3QgKmVuZCA9IGpwZWdCdWZmZXIgKyBvZmZzZXQ7CiAgICAgICAgICAgICBpZiAoY2hlY2tKcGVnU3RhcnQoanBlZ0J1ZmZlcikgJiYgY2hlY2tKcGVnRW5kKGVuZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyLCBpbWcgc2l6ZSAlZCIsIHNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCBKUEVHIHRyYW5zcG9ydCBoZWFkZXIsIGltZyBzaXplICV6dSIsIHNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVygiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIHdpdGggYmFkIEltYWdlIFN0YXJ0L0VuZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkZvdW5kIEpQRUcgdHJhbnNwb3J0IGhlYWRlciB3aXRoIGJhZCBzaXplICVkIiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HVygiRm91bmQgSlBFRyB0cmFuc3BvcnQgaGVhZGVyIHdpdGggYmFkIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1NywxNSArMzY5LDE1IEBACiAgICAgICAgIHNlZ21lbnRfdCAqc2VnbWVudCA9IChzZWdtZW50X3QqKShqcGVnQnVmZmVyICsgc2l6ZSk7CiAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGNoZWNrSnBlZ01hcmtlcihzZWdtZW50LT5tYXJrZXIpOwogICAgICAgICBpZiAodHlwZSA9PSAwKSB7IC8vIGludmFsaWQgbWFya2VyLCBubyBtb3JlIHNlZ21lbnRzLCBiZWdpbiBKUEVHIGRhdGEKLSAgICAgICAgICAgIEFMT0dWKCJKUEVHIHN0cmVhbSBmb3VuZCBiZWdpbm5pbmcgYXQgb2Zmc2V0ICVkIiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HVigiSlBFRyBzdHJlYW0gZm91bmQgYmVnaW5uaW5nIGF0IG9mZnNldCAlenUiLCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlID09IEVPSSB8fCBzaXplID4gbWF4U2l6ZSAtIHNpemVvZihzZWdtZW50X3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiR290IHByZW1hdHVyZSBFbmQgYmVmb3JlIEpQRUcgZGF0YSwgb2Zmc2V0ICVkIiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiR290IHByZW1hdHVyZSBFbmQgYmVmb3JlIEpQRUcgZGF0YSwgb2Zmc2V0ICV6dSIsIHNpemUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IG50b2hzKHNlZ21lbnQtPmxlbmd0aCk7Ci0gICAgICAgIEFMT0dWKCJKRklGIFNlZ21lbnQsIHR5cGUgJXggbGVuZ3RoICV4IiwgdHlwZSwgbGVuZ3RoKTsKKyAgICAgICAgQUxPR1YoIkpGSUYgU2VnbWVudCwgdHlwZSAleCBsZW5ndGggJXp4IiwgdHlwZSwgbGVuZ3RoKTsKICAgICAgICAgc2l6ZSArPSBsZW5ndGggKyBNQVJLRVJfTEVOR1RIOwogICAgIH0KIApAQCAtMzg1LDEwICszOTcsMTAgQEAKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heFNpemUpIHsKLSAgICAgICAgQUxPR1coIkpQRUcgc2l6ZSAlZCB0b28gbGFyZ2UsIHJlZHVjaW5nIHRvIG1heFNpemUgJWQiLCBzaXplLCBtYXhTaXplKTsKKyAgICAgICAgQUxPR1coIkpQRUcgc2l6ZSAlenUgdG9vIGxhcmdlLCByZWR1Y2luZyB0byBtYXhTaXplICV6dSIsIHNpemUsIG1heFNpemUpOwogICAgICAgICBzaXplID0gbWF4U2l6ZTsKICAgICB9Ci0gICAgQUxPR1YoIkZpbmFsIEpQRUcgc2l6ZSAlZCIsIHNpemUpOworICAgIEFMT0dWKCJGaW5hbCBKUEVHIHNpemUgJXp1Iiwgc2l6ZSk7CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCA2MWUzNTg4Li43YjkwZDI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC0yOSw2ICsyOSw5IEBACiAKICNpbmNsdWRlICJQYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAic3lzdGVtL2NhbWVyYS5oIgorI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYV9jb21tb24uaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CkBAIC00Myw3ICs0Niw3IEBACiBQYXJhbWV0ZXJzOjp+UGFyYW1ldGVycygpIHsKIH0KIAotc3RhdHVzX3QgUGFyYW1ldGVyczo6aW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbykgeworc3RhdHVzX3QgUGFyYW1ldGVyczo6aW5pdGlhbGl6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSAqaW5mbywgaW50IGRldmljZVZlcnNpb24pIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBpZiAoaW5mby0+ZW50cnlDb3VudCgpID09IDApIHsKQEAgLTUxLDYgKzU0LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgUGFyYW1ldGVyczo6aW5mbyA9IGluZm87CisgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2VWZXJzaW9uOwogCiAgICAgcmVzID0gYnVpbGRGYXN0SW5mbygpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CkBAIC01OSwxMiArNjMsNDIgQEAKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgY29uc3QgU2l6ZSBNQVhfUFJFVklFV19TSVpFID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07Ci0gICAgcmVzID0gZ2V0RmlsdGVyZWRQcmV2aWV3U2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCisgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOworICAgIGludDMyX3QgbWF4VmlkZW9XaWR0aCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC53aWR0aC5tYXgiLCBWSURFT19FTkNPREVSX0gyNjQpOworICAgIGludDMyX3QgbWF4VmlkZW9IZWlnaHQgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1heCIsIFZJREVPX0VOQ09ERVJfSDI2NCk7CisgICAgY29uc3QgU2l6ZSBNQVhfVklERU9fU0laRSA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CisKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKE1BWF9QUkVWSUVXX1NJWkUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOworICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfVklERU9fU0laRSwgJmF2YWlsYWJsZVZpZGVvU2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1vcmUgaW50ZWxsaWdlbnRseQotICAgIHByZXZpZXdXaWR0aCA9IGF2YWlsYWJsZVByZXZpZXdTaXplc1swXS53aWR0aDsKLSAgICBwcmV2aWV3SGVpZ2h0ID0gYXZhaWxhYmxlUHJldmlld1NpemVzWzBdLmhlaWdodDsKKyAgICAvLyBTZWxlY3QgaW5pdGlhbCBwcmV2aWV3IGFuZCB2aWRlbyBzaXplIHRoYXQncyB1bmRlciB0aGUgaW5pdGlhbCBib3VuZCBhbmQKKyAgICAvLyBvbiB0aGUgbGlzdCBvZiBib3RoIHByZXZpZXcgYW5kIHJlY29yZGluZyBzaXplcworICAgIHByZXZpZXdXaWR0aCA9IDA7CisgICAgcHJldmlld0hlaWdodCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWxhYmxlUHJldmlld1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGludCBuZXdXaWR0aCA9IGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS53aWR0aDsKKyAgICAgICAgaW50IG5ld0hlaWdodCA9IGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS5oZWlnaHQ7CisgICAgICAgIGlmIChuZXdXaWR0aCA+PSBwcmV2aWV3V2lkdGggJiYgbmV3SGVpZ2h0ID49IHByZXZpZXdIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBuZXdXaWR0aCA8PSBNQVhfSU5JVElBTF9QUkVWSUVXX1dJRFRIICYmCisgICAgICAgICAgICAgICAgbmV3SGVpZ2h0IDw9IE1BWF9JTklUSUFMX1BSRVZJRVdfSEVJR0hUKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGF2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVmlkZW9TaXplc1tqXS53aWR0aCA9PSBuZXdXaWR0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVmlkZW9TaXplc1tqXS5oZWlnaHQgPT0gbmV3SGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdXaWR0aCA9IG5ld1dpZHRoOworICAgICAgICAgICAgICAgICAgICBwcmV2aWV3SGVpZ2h0ID0gbmV3SGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocHJldmlld1dpZHRoID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBpbml0aWFsIHByZXZpZXcgc2l6ZSBjYW4gYmUgZm91bmQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgdmlkZW9XaWR0aCA9IHByZXZpZXdXaWR0aDsKICAgICB2aWRlb0hlaWdodCA9IHByZXZpZXdIZWlnaHQ7CiAKQEAgLTg0LDggKzExOCwxNyBAQAogICAgICAgICBBTE9HVigiU3VwcG9ydGVkIHByZXZpZXcgc2l6ZXMgYXJlOiAlcyIsIHN1cHBvcnRlZFByZXZpZXdTaXplcy5zdHJpbmcoKSk7CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX1NJWkVTLAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisKKyAgICAgICAgU3RyaW5nOCBzdXBwb3J0ZWRWaWRlb1NpemVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVZpZGVvU2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHN1cHBvcnRlZFZpZGVvU2l6ZXMgKz0gIiwiOworICAgICAgICAgICAgc3VwcG9ydGVkVmlkZW9TaXplcyArPSBTdHJpbmc4Ojpmb3JtYXQoIiVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVmlkZW9TaXplc1tpXS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVmlkZW9TaXplc1tpXS5oZWlnaHQpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgdmlkZW8gc2l6ZXMgYXJlOiAlcyIsIHN1cHBvcnRlZFZpZGVvU2l6ZXMuc3RyaW5nKCkpOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfVklERU9fU0laRVMsCi0gICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRWaWRlb1NpemVzKTsKICAgICB9CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtOTksMTYgKzE0MiwxNCBAQAogICAgIHByZXZpZXdUcmFuc2Zvcm0gPSBkZWdUb1RyYW5zZm9ybSgwLAogICAgICAgICAgICAgY2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRm9ybWF0cyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFMpOwotCiAgICAgewogICAgICAgICBTdHJpbmc4IHN1cHBvcnRlZFByZXZpZXdGb3JtYXRzOworICAgICAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gb3V0cHV0Rm9ybWF0cyA9IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKICAgICAgICAgYm9vbCBhZGRDb21tYSA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgb3V0cHV0Rm9ybWF0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKGFkZENvbW1hKSBzdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyArPSAiLCI7CiAgICAgICAgICAgICBhZGRDb21tYSA9IHRydWU7Ci0gICAgICAgICAgICBzd2l0Y2ggKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3V0cHV0Rm9ybWF0c1tpXSkgewogICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyArPQogICAgICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIyU1A7CkBAIC0xNTAsNyArMTkxLDcgQEAKIAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogVW5rbm93biBwcmV2aWV3IGZvcm1hdDogJXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgYXZhaWxhYmxlRm9ybWF0cy5kYXRhLmkzMltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCBvdXRwdXRGb3JtYXRzW2ldKTsKICAgICAgICAgICAgICAgICBhZGRDb21tYSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjIyLDI0ICsyNjMsMjYgQEAKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnJhbWVSYXRlcyk7CiAgICAgfQogCi0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlSnBlZ1NpemVzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19TSVpFUywgMik7Ci0gICAgaWYgKCFhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQpIHJldHVybiBOT19JTklUOworICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVKcGVnU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCkpIHJldHVybiBOT19JTklUOwogCiAgICAgLy8gVE9ETzogUGljayBtYXhpbXVtCi0gICAgcGljdHVyZVdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyWzBdOwotICAgIHBpY3R1cmVIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbMV07CisgICAgcGljdHVyZVdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLndpZHRoOworICAgIHBpY3R1cmVIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0uaGVpZ2h0OworICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CisgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OworICAgIHBpY3R1cmVTaXplT3ZlcnJpZGVuID0gZmFsc2U7CiAKICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUocGljdHVyZVdpZHRoLAogICAgICAgICAgICAgcGljdHVyZUhlaWdodCk7CiAKICAgICB7CiAgICAgICAgIFN0cmluZzggc3VwcG9ydGVkUGljdHVyZVNpemVzOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuY291bnQ7IGkgKz0gMikgeworICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChpICE9IDApIHN1cHBvcnRlZFBpY3R1cmVTaXplcyArPSAiLCI7CiAgICAgICAgICAgICBzdXBwb3J0ZWRQaWN0dXJlU2l6ZXMgKz0gU3RyaW5nODo6Zm9ybWF0KCIlZHglZCIsCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXSwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2krMV0pOworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVKcGVnU2l6ZXNbaV0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUpwZWdTaXplc1tpXS5oZWlnaHQpOwogICAgICAgICB9CiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTLAogICAgICAgICAgICAgICAgIHN1cHBvcnRlZFBpY3R1cmVTaXplcyk7CkBAIC00NzAsNyArNTEzLDcgQEAKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRBbnRpYmFuZGluZyk7CiAgICAgfQogCi0gICAgc2NlbmVNb2RlID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgc2NlbmVNb2RlID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU0NFTkVfTU9ERSwKICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQVVUTyk7CiAKQEAgLTQ4Niw3ICs1MjksNyBAQAogICAgICAgICAgICAgaWYgKGFkZENvbW1hKSBzdXBwb3J0ZWRTY2VuZU1vZGVzICs9ICIsIjsKICAgICAgICAgICAgIGFkZENvbW1hID0gdHJ1ZTsKICAgICAgICAgICAgIHN3aXRjaCAoYXZhaWxhYmxlU2NlbmVNb2Rlcy5kYXRhLnU4W2ldKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOgogICAgICAgICAgICAgICAgICAgICBub1NjZW5lTW9kZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFk6CkBAIC01NzksOCArNjIyLDggQEAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVBZU1vZGVzID0KICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX01PREVTLCAwLCAwLCBmYWxzZSk7CiAKKyAgICBmbGFzaE1vZGUgPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRjsKICAgICBpZiAoaXNGbGFzaEF2YWlsYWJsZSkgewotICAgICAgICBmbGFzaE1vZGUgPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRjsKICAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRik7CiAKQEAgLTYwMCwxMSArNjQzLDEwIEBACiAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GTEFTSF9NT0RFUywKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRGbGFzaE1vZGVzKTsKICAgICB9IGVsc2UgewotICAgICAgICBmbGFzaE1vZGUgPSBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRjsKLSAgICAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKLSAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRik7Ci0gICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GTEFTSF9NT0RFUywKLSAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRik7CisgICAgICAgIC8vIE5vIGZsYXNoIG1lYW5zIG51bGwgZmxhc2ggbW9kZSBhbmQgc3VwcG9ydGVkIGZsYXNoIG1vZGVzIGtleXMsIHNvCisgICAgICAgIC8vIHJlbW92ZSB0aGVtIGp1c3QgdG8gYmUgc2FmZQorICAgICAgICBwYXJhbXMucmVtb3ZlKENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFKTsKKyAgICAgICAgcGFyYW1zLnJlbW92ZShDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTKTsKICAgICB9CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtaW5Gb2N1c0Rpc3RhbmNlID0KQEAgLTYyNCw4ICs2NjYsMTcgQEAKICAgICAgICAgZm9jdXNNb2RlID0gUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9BVVRPOwogICAgICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19NT0RFLAogICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQVVUTyk7Ci0gICAgICAgIFN0cmluZzggc3VwcG9ydGVkRm9jdXNNb2RlcyhDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0lORklOSVRZKTsKLSAgICAgICAgYm9vbCBhZGRDb21tYSA9IHRydWU7CisgICAgICAgIFN0cmluZzggc3VwcG9ydGVkRm9jdXNNb2RlczsKKyAgICAgICAgYm9vbCBhZGRDb21tYSA9IGZhbHNlOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24gPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTiwgMCwgMCwgZmFsc2UpOworCisgICAgICAgIGlmIChmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uY291bnQgJiYKKyAgICAgICAgICAgICAgICBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uZGF0YS51OFswXSAhPQorICAgICAgICAgICAgICAgIEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OX1VOQ0FMSUJSQVRFRCkgeworICAgICAgICAgICAgc3VwcG9ydGVkRm9jdXNNb2RlcyArPSBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0lORklOSVRZOworICAgICAgICAgICAgYWRkQ29tbWEgPSB0cnVlOworICAgICAgICB9CiAKICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlQWZNb2Rlcy5jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYWRkQ29tbWEpIHN1cHBvcnRlZEZvY3VzTW9kZXMgKz0gIiwiOwpAQCAtNjY4LDEzICs3MTksMTMgQEAKICAgICBmb2N1c1N0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX0lOQUNUSVZFOwogICAgIHNoYWRvd0ZvY3VzTW9kZSA9IEZPQ1VTX01PREVfSU5WQUxJRDsKIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9Ci0gICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLCAxLCAxKTsKLSAgICBpZiAoIW1heDNhUmVnaW9ucy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgbWF4M2FSZWdpb25zID0gc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKTsKKyAgICBpZiAobWF4M2FSZWdpb25zLmNvdW50ICE9IFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pIHJldHVybiBOT19JTklUOwogCiAgICAgaW50MzJfdCBtYXhOdW1Gb2N1c0FyZWFzID0gMDsKICAgICBpZiAoZm9jdXNNb2RlICE9IFBhcmFtZXRlcnM6OkZPQ1VTX01PREVfRklYRUQpIHsKLSAgICAgICAgbWF4TnVtRm9jdXNBcmVhcyA9IG1heDNhUmVnaW9ucy5kYXRhLmkzMlswXTsKKyAgICAgICAgbWF4TnVtRm9jdXNBcmVhcyA9IG1heDNhUmVnaW9ucy5kYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUZdOwogICAgIH0KICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9NQVhfTlVNX0ZPQ1VTX0FSRUFTLCBtYXhOdW1Gb2N1c0FyZWFzKTsKICAgICBwYXJhbXMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUywKQEAgLTczNCw3ICs3ODUsNyBAQAogCiAgICAgbWV0ZXJpbmdBcmVhcy5hZGQoUGFyYW1ldGVyczo6QXJlYSgwLCAwLCAwLCAwLCAwKSk7CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9NRVRFUklOR19BUkVBUywKLSAgICAgICAgICAgIG1heDNhUmVnaW9ucy5kYXRhLmkzMlswXSk7CisgICAgICAgICAgICBtYXgzYVJlZ2lvbnMuZGF0YS5pMzJbUGFyYW1ldGVyczo6UkVHSU9OX0FFXSk7CiAgICAgcGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUVURVJJTkdfQVJFQVMsCiAgICAgICAgICAgICAiKDAsMCwwLDAsMCkiKTsKIApAQCAtOTMxLDEzICs5ODIsMTkgQEAKICAgICBib29sIGZpeGVkTGVucyA9IG1pbkZvY3VzRGlzdGFuY2UuY291bnQgPT0gMCB8fAogICAgICAgICBtaW5Gb2N1c0Rpc3RhbmNlLmRhdGEuZlswXSA9PSAwOwogCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uID0KKyAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT04sIDAsIDAsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBib29sIGNhbkZvY3VzSW5maW5pdHkgPSAoZm9jdXNEaXN0YW5jZUNhbGlicmF0aW9uLmNvdW50ICYmCisgICAgICAgICAgICBmb2N1c0Rpc3RhbmNlQ2FsaWJyYXRpb24uZGF0YS51OFswXSAhPQorICAgICAgICAgICAgQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT05fVU5DQUxJQlJBVEVEKTsKKwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvY2FsTGVuZ3RocyA9CiAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0ZPQ0FMX0xFTkdUSFMpOwogICAgIGlmICghYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKLSAgICBpZiAoIWF2YWlsYWJsZUZvcm1hdHMuY291bnQpIHJldHVybiBOT19JTklUOworICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOworICAgIGlmICghYXZhaWxhYmxlRm9ybWF0cy5zaXplKCkpIHJldHVybiBOT19JTklUOwogCiAKICAgICBpZiAoc2NlbmVNb2RlT3ZlcnJpZGVzLmNvdW50ID4gMCkgewpAQCAtOTQ4LDcgKzEwMDUsNyBAQAogICAgICAgICBpZiAoc2NlbmVNb2RlT3ZlcnJpZGVzLmNvdW50ICE9CiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlU2NlbmVNb2Rlcy5jb3VudCAqIGtNb2Rlc1BlclNjZW5lTW9kZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNjZW5lIG1vZGUgb3ZlcnJpZGUgbGlzdCBpcyBhbiAiCi0gICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHNpemU6ICVkIChleHBlY3RlZCAlZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHNpemU6ICV6dSAoZXhwZWN0ZWQgJXp1KSIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIHNjZW5lTW9kZU92ZXJyaWRlcy5jb3VudCwKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlU2NlbmVNb2Rlcy5jb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTk4Miw2ICsxMDM5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHNjZW5lTW9kZU92ZXJyaWRlcy5kYXRhLnU4W2kgKiBrTW9kZXNQZXJTY2VuZU1vZGUgKyAyXTsKICAgICAgICAgICAgIHN3aXRjaChhZk1vZGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXhlZExlbnMgJiYgIWNhbkZvY3VzSW5maW5pdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTY2VuZSBtb2RlIG92ZXJyaWRlIGxpc3RzIGFza3MgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpeGVkIGZvY3VzIG9uIGEgZGV2aWNlIHdpdGggZm9jdXNlciBidXQgbm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNhbGlicmF0ZWQgZm9yIGluZmluaXR5IGZvY3VzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtb2Rlcy5mb2N1c01vZGUgPSBmaXhlZExlbnMgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPQ1VTX01PREVfRklYRUQgOiBGT0NVU19NT0RFX0lORklOSVRZOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwMjEsOCArMTA4NSw4IEBACiAKICAgICAvLyBDaGVjayBpZiB0aGUgSEFMIHN1cHBvcnRzIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OAogICAgIGZhc3RJbmZvLnVzZUZsZXhpYmxlWXV2ID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLmNvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChhdmFpbGFibGVGb3JtYXRzW2ldID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgewogICAgICAgICAgICAgZmFzdEluZm8udXNlRmxleGlibGVZdXYgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEwNzgsNyArMTE0Miw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIqIHRhZ05hbWUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lKHRhZyk7CiAgICAgICAgIGlmICh0YWdOYW1lID09IE5VTEwpIHRhZ05hbWUgPSAiPHVua25vd24+IjsKICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBzdGF0aWMgbWV0YWRhdGEgZW50cnkgJyVzLiVzJyAoJXgpOiIKLSAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYmV0d2VlbiAlZCBhbmQgJWQgdmFsdWVzLCBidXQgZ290ICVkIHZhbHVlcyIsCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGJldHdlZW4gJXp1IGFuZCAlenUgdmFsdWVzLCBidXQgZ290ICV6dSB2YWx1ZXMiLAogICAgICAgICAgICAgICAgIHRhZ1NlY3Rpb24sIHRhZ05hbWUsIHRhZywgbWluQ291bnQsIG1heENvdW50LCBlbnRyeS5jb3VudCk7CiAgICAgfQogCkBAIC0xMjI1LDggKzEyODksNyBAQAogICAgICAgICAgICAgICAgICAgICAiaXMgYWN0aXZlISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPQotICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUyk7CisgICAgICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVGb3JtYXRzID0gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgICAgICAvLyBJZiB1c2luZyBmbGV4aWJsZSBZVVYsIGFsd2F5cyBzdXBwb3J0IE5WMjEvWVYxMi4gT3RoZXJ3aXNlLCBjaGVjawogICAgICAgICAvLyBIQUwncyBsaXN0LgogICAgICAgICBpZiAoISAoZmFzdEluZm8udXNlRmxleGlibGVZdXYgJiYKQEAgLTEyMzUsMTEgKzEyOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikgKSApIHsKICAgICAgICAgICAgIC8vIE5vdCB1c2luZyBmbGV4aWJsZSBZVVYgZm9ybWF0LCBzbyBjaGVjayBleHBsaWNpdGx5Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHMuZGF0YS5pMzJbaV0gPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5wcmV2aWV3Rm9ybWF0KSBicmVhazsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVGb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUZvcm1hdHNbaV0gPT0gdmFsaWRhdGVkUGFyYW1zLnByZXZpZXdGb3JtYXQpIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlRm9ybWF0cy5jb3VudCkgeworICAgICAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlRm9ybWF0cy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBwcmV2aWV3IGZvcm1hdCAlcyAoMHgleCkgaXMgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1BhcmFtcy5nZXRQcmV2aWV3Rm9ybWF0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMucHJldmlld0Zvcm1hdCk7CkBAIC0xMzU1LDE3ICsxNDE3LDE2IEBACiAgICAgLy8gUElDVFVSRV9TSVpFCiAgICAgbmV3UGFyYW1zLmdldFBpY3R1cmVTaXplKCZ2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0KTsKLSAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCA9PSBwaWN0dXJlV2lkdGggfHwKLSAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlSGVpZ2h0ID09IHBpY3R1cmVIZWlnaHQpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlUGljdHVyZVNpemVzID0KLSAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlUGljdHVyZVNpemVzLmNvdW50OyBpKz0yKSB7Ci0gICAgICAgICAgICBpZiAoKGF2YWlsYWJsZVBpY3R1cmVTaXplcy5kYXRhLmkzMltpXSA9PQorICAgIGlmICh2YWxpZGF0ZWRQYXJhbXMucGljdHVyZVdpZHRoICE9IHBpY3R1cmVXaWR0aCB8fAorICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQgIT0gcGljdHVyZUhlaWdodCkgeworICAgICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUGljdHVyZVNpemVzID0gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlUGljdHVyZVNpemVzW2ldLndpZHRoID09CiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5waWN0dXJlV2lkdGgpICYmCi0gICAgICAgICAgICAgICAgKGF2YWlsYWJsZVBpY3R1cmVTaXplcy5kYXRhLmkzMltpKzFdID09CisgICAgICAgICAgICAgICAgKGF2YWlsYWJsZVBpY3R1cmVTaXplc1tpXS5oZWlnaHQgPT0KICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpKSBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVQaWN0dXJlU2l6ZXMuY291bnQpIHsKKyAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlUGljdHVyZVNpemVzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgcGljdHVyZSBzaXplICVkIHggJWQgaXMgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnBpY3R1cmVIZWlnaHQpOwpAQCAtMTUyMiw3ICsxNTgzLDcgQEAKICAgICAgICAgbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU0NFTkVfTU9ERSkgKTsKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBzY2VuZU1vZGUgJiYKICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEKSB7CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCkgewogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTY2VuZU1vZGVzID0KICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9TQ0VORV9NT0RFUyk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmFpbGFibGVTY2VuZU1vZGVzLmNvdW50OyBpKyspIHsKQEAgLTE1MzcsNyArMTU5OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgYm9vbCBzY2VuZU1vZGVTZXQgPQotICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnNjZW5lTW9kZSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5zY2VuZU1vZGUgIT0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAKICAgICAvLyBGTEFTSF9NT0RFCiAgICAgaWYgKHNjZW5lTW9kZVNldCkgewpAQCAtMTU1NSw3ICsxNjE2LDkgQEAKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLmZsYXNoTW9kZSAhPSBmbGFzaE1vZGUpIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZmxhc2hBdmFpbGFibGUgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFLCAxLCAxKTsKLSAgICAgICAgaWYgKCFmbGFzaEF2YWlsYWJsZS5kYXRhLnU4WzBdICYmCisgICAgICAgIGJvb2wgaXNGbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUU7CisgICAgICAgIGlmICghaXNGbGFzaEF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUgIT0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PRkYpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIGZsYXNoIG1vZGUgXCIlc1wiIGlzIG5vdCBzdXBwb3J0ZWQ6ICIKICAgICAgICAgICAgICAgICAgICAgIk5vIGZsYXNoIG9uIGRldmljZSIsIF9fRlVOQ1RJT05fXywKQEAgLTE1ODAsOSArMTY0MywxMSBAQAogICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSBpbiBjYXNlIG9mIG92ZXJyaWRlCi0gICAgICAgIG5ld1BhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCi0gICAgICAgICAgICAgICAgZmxhc2hNb2RlRW51bVRvU3RyaW5nKHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUpKTsKKyAgICAgICAgLy8gVXBkYXRlIGluIGNhc2Ugb2Ygb3ZlcnJpZGUsIGJ1dCBvbmx5IGlmIGZsYXNoIGlzIHN1cHBvcnRlZAorICAgICAgICBpZiAoaXNGbGFzaEF2YWlsYWJsZSkgeworICAgICAgICAgICAgbmV3UGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgZmxhc2hNb2RlRW51bVRvU3RyaW5nKHZhbGlkYXRlZFBhcmFtcy5mbGFzaE1vZGUpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFdISVRFX0JBTEFOQ0UKQEAgLTE2NjcsMTAgKzE3MzIsMTEgQEAKICAgICAvLyBGT0NVU19BUkVBUwogICAgIHJlcyA9IHBhcnNlQXJlYXMobmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DVVNfQVJFQVMpLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5mb2N1c2luZ0FyZWFzKTsKLSAgICBzaXplX3QgbWF4M2FSZWdpb25zID0KLSAgICAgICAgKHNpemVfdClzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywgMSwgMSkuZGF0YS5pMzJbMF07CisgICAgc2l6ZV90IG1heEFmUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pLgorICAgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUZdOwogICAgIGlmIChyZXMgPT0gT0spIHJlcyA9IHZhbGlkYXRlQXJlYXModmFsaWRhdGVkUGFyYW1zLmZvY3VzaW5nQXJlYXMsCi0gICAgICAgICAgICBtYXgzYVJlZ2lvbnMsIEFSRUFfS0lORF9GT0NVUyk7CisgICAgICAgICAgICBtYXhBZlJlZ2lvbnMsIEFSRUFfS0lORF9GT0NVUyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3RlZCBmb2N1cyBhcmVhcyBhcmUgbWFsZm9ybWVkOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19BUkVBUykpOwpAQCAtMTcwMCwxMCArMTc2NiwxMyBAQAogICAgICAgICBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9BVVRPX1dISVRFQkFMQU5DRV9MT0NLKSk7CiAKICAgICAvLyBNRVRFUklOR19BUkVBUworICAgIHNpemVfdCBtYXhBZVJlZ2lvbnMgPSAoc2l6ZV90KXN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTikuCisgICAgICAgICAgICBkYXRhLmkzMltQYXJhbWV0ZXJzOjpSRUdJT05fQUVdOwogICAgIHJlcyA9IHBhcnNlQXJlYXMobmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUVURVJJTkdfQVJFQVMpLAogICAgICAgICAgICAgJnZhbGlkYXRlZFBhcmFtcy5tZXRlcmluZ0FyZWFzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlQXJlYXModmFsaWRhdGVkUGFyYW1zLm1ldGVyaW5nQXJlYXMsIG1heDNhUmVnaW9ucywKKyAgICAgICAgcmVzID0gdmFsaWRhdGVBcmVhcyh2YWxpZGF0ZWRQYXJhbXMubWV0ZXJpbmdBcmVhcywgbWF4QWVSZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRUFfS0lORF9NRVRFUklORyk7CiAgICAgfQogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTE3MjgsMjEgKzE3OTcsMjYgQEAKICAgICBpZiAodmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGggIT0gdmlkZW9XaWR0aCB8fAogICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0ICE9IHZpZGVvSGVpZ2h0KSB7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBSRUNPUkQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVmlkZW8gc2l6ZSBjYW5ub3QgYmUgdXBkYXRlZCB3aGVuIHJlY29yZGluZyBpcyBhY3RpdmUhIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2YWlsYWJsZVByZXZpZXdTaXplcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKChhdmFpbGFibGVQcmV2aWV3U2l6ZXNbaV0ud2lkdGggPT0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgpICYmCi0gICAgICAgICAgICAgICAgKGF2YWlsYWJsZVByZXZpZXdTaXplc1tpXS5oZWlnaHQgPT0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KSkgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gYXZhaWxhYmxlUHJldmlld1NpemVzLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0ZWQgdmlkZW8gc2l6ZSAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoLAorICAgICAgICAgICAgQUxPR1coIiVzOiBWaWRlbyBzaXplIGNhbm5vdCBiZSB1cGRhdGVkIChmcm9tICVkIHggJWQgdG8gJWQgeCAlZCkiCisgICAgICAgICAgICAgICAgICAgICIgd2hlbiByZWNvcmRpbmcgaXMgYWN0aXZlISBJZ25vcmUgdGhlIHNpemUgdXBkYXRlISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQsIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb1dpZHRoID0gdmlkZW9XaWR0aDsKKyAgICAgICAgICAgIHZhbGlkYXRlZFBhcmFtcy52aWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OworICAgICAgICAgICAgbmV3UGFyYW1zLnNldFZpZGVvU2l6ZSh2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlVmlkZW9TaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlVmlkZW9TaXplc1tpXS53aWR0aCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVWaWRlb1NpemVzW2ldLmhlaWdodCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUGFyYW1zLnZpZGVvSGVpZ2h0KSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBhdmFpbGFibGVWaWRlb1NpemVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVxdWVzdGVkIHZpZGVvIHNpemUgJWQgeCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdmFsaWRhdGVkUGFyYW1zLnZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRQYXJhbXMudmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE3NjQsNiArMTgzOCw3IEBACiAgICAgLyoqIFVwZGF0ZSBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCiAKICAgICAqdGhpcyA9IHZhbGlkYXRlZFBhcmFtczsKKyAgICB1cGRhdGVPdmVycmlkZGVuSnBlZ1NpemUoKTsKIAogICAgIC8qKiBVcGRhdGUgZXh0ZXJuYWwgcGFyYW1ldGVycyBjYWxjdWxhdGVkIGZyb20gdGhlIGludGVybmFsIG9uZXMgKi8KIApAQCAtMTgyNiw2ICsxOTAxLDkgQEAKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGludGVudCA9CiAgICAgICAgICAgICByZXF1ZXN0LT5maW5kKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCk7CisKKyAgICBpZiAoaW50ZW50LmNvdW50ID09IDApIHJldHVybiBCQURfVkFMVUU7CisKICAgICBpZiAoaW50ZW50LmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpIHsKICAgICAgICAgcmVzID0gcmVxdWVzdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLAogICAgICAgICAgICAgICAgIGZhc3RJbmZvLmJlc3RTdGlsbENhcHR1cmVGcHNSYW5nZSwgMik7CkBAIC0xODUyLDcgKzE5MzAsNyBAQAogICAgIC8vIChmYWNlIGRldGVjdGlvbiBzdGF0aXN0aWNzIGFuZCBmYWNlIHByaW9yaXR5IHNjZW5lIG1vZGUpLiBNYXAgZnJvbSBvdGhlcgogICAgIC8vIHRvIHRoZSBvdGhlci4KICAgICBib29sIHNjZW5lTW9kZUFjdGl2ZSA9Ci0gICAgICAgICAgICBzY2VuZU1vZGUgIT0gKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICBzY2VuZU1vZGUgIT0gKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CiAgICAgdWludDhfdCByZXFDb250cm9sTW9kZSA9IEFORFJPSURfQ09OVFJPTF9NT0RFX0FVVE87CiAgICAgaWYgKGVuYWJsZUZhY2VEZXRlY3QgfHwgc2NlbmVNb2RlQWN0aXZlKSB7CiAgICAgICAgIHJlcUNvbnRyb2xNb2RlID0gQU5EUk9JRF9DT05UUk9MX01PREVfVVNFX1NDRU5FX01PREU7CkBAIC0xODY0LDcgKzE5NDIsNyBAQAogICAgIHVpbnQ4X3QgcmVxU2NlbmVNb2RlID0KICAgICAgICAgICAgIHNjZW5lTW9kZUFjdGl2ZSA/IHNjZW5lTW9kZSA6CiAgICAgICAgICAgICBlbmFibGVGYWNlRGV0ZWN0ID8gKHVpbnQ4X3QpQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRkFDRV9QUklPUklUWSA6Ci0gICAgICAgICAgICAodWludDhfdClBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICh1aW50OF90KUFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEOwogICAgIHJlcyA9IHJlcXVlc3QtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERSwKICAgICAgICAgICAgICZyZXFTY2VuZU1vZGUsIDEpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CkBAIC0xOTg1LDYgKzIwNjMsMjMgQEAKICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXMsIHJlcU1ldGVyaW5nQXJlYXNTaXplKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCisgICAgLy8gU2V0IGF3YiByZWdpb25zIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBtZXRlcmluZyByZWdpb25zIGlmIGFsbG93ZWQKKyAgICBzaXplX3QgbWF4QXdiUmVnaW9ucyA9IChzaXplX3Qpc3RhdGljSW5mbyhBTkRST0lEX0NPTlRST0xfTUFYX1JFR0lPTlMsCisgICAgICAgICAgICBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OLCBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKS4KKyAgICAgICAgICAgIGRhdGEuaTMyW1BhcmFtZXRlcnM6OlJFR0lPTl9BV0JdOworICAgIGlmIChtYXhBd2JSZWdpb25zID4gMCkgeworICAgICAgICBpZiAobWF4QXdiUmVnaW9ucyA+PSBtZXRlcmluZ0FyZWFzLnNpemUoKSkgeworICAgICAgICAgICAgcmVzID0gcmVxdWVzdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9BV0JfUkVHSU9OUywKKyAgICAgICAgICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhcywgcmVxTWV0ZXJpbmdBcmVhc1NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBhd2IgcmVnaW9ucyBhcmUgemVyb2VkIGlmIHRoZSByZWdpb24gY291bnQgaXMgdG9vIGhpZ2guCisgICAgICAgICAgICBpbnQzMl90IHplcm9lZEF3YkFyZWFzWzVdID0gezAsIDAsIDAsIDAsIDB9OworICAgICAgICAgICAgcmVzID0gcmVxdWVzdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9BV0JfUkVHSU9OUywKKyAgICAgICAgICAgICAgICAgICAgemVyb2VkQXdiQXJlYXMsIHNpemVvZih6ZXJvZWRBd2JBcmVhcykvc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGRlbGV0ZVtdIHJlcU1ldGVyaW5nQXJlYXM7CiAKICAgICAvKiBkb24ndCBpbmNsdWRlIGpwZWcgdGh1bWJuYWlsIHNpemUgLSBpdCdzIHZhbGlkIGZvcgpAQCAtMjA2MSw2ICsyMTU2LDUyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBQYXJhbWV0ZXJzOjpvdmVycmlkZUpwZWdTaXplQnlWaWRlb1NpemUoKSB7CisgICAgaWYgKHBpY3R1cmVTaXplT3ZlcnJpZGVuKSB7CisgICAgICAgIEFMT0dWKCJQaWN0dXJlIHNpemUgaGFzIGJlZW4gb3ZlcnJpZGRlbi4gU2tpcCBvdmVycmlkaW5nIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IHRydWU7CisgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CisgICAgcGljdHVyZVdpZHRoID0gdmlkZW9XaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CisgICAgLy8gVGhpcyBjaGFuZ2Ugb2YgcGljdHVyZSBzaXplIGlzIGludmlzaWJsZSB0byBhcHAgbGF5ZXIuCisgICAgLy8gRG8gbm90IHVwZGF0ZSBhcHAgdmlzaWJsZSBwYXJhbXMKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlcnM6OnVwZGF0ZU92ZXJyaWRkZW5KcGVnU2l6ZSgpIHsKKyAgICBpZiAoIXBpY3R1cmVTaXplT3ZlcnJpZGVuKSB7CisgICAgICAgIEFMT0dWKCJQaWN0dXJlIHNpemUgaGFzIG5vdCBiZWVuIG92ZXJyaWRkZW4uIFNraXAgY2hlY2tpbmciKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHBpY3R1cmVXaWR0aExhc3RTZXQgPSBwaWN0dXJlV2lkdGg7CisgICAgcGljdHVyZUhlaWdodExhc3RTZXQgPSBwaWN0dXJlSGVpZ2h0OworCisgICAgaWYgKHBpY3R1cmVXaWR0aCA8PSB2aWRlb1dpZHRoICYmIHBpY3R1cmVIZWlnaHQgPD0gdmlkZW9IZWlnaHQpIHsKKyAgICAgICAgLy8gUGljdHVyZSBzaXplIGlzIG5vdyBzbWFsbGVyIHRoYW4gdmlkZW8gc2l6ZS4gTm8gbmVlZCB0byBvdmVycmlkZSBhbnltb3JlCisgICAgICAgIHJldHVybiByZWNvdmVyT3ZlcnJpZGRlbkpwZWdTaXplKCk7CisgICAgfQorCisgICAgcGljdHVyZVdpZHRoID0gdmlkZW9XaWR0aDsKKyAgICBwaWN0dXJlSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlcnM6OnJlY292ZXJPdmVycmlkZGVuSnBlZ1NpemUoKSB7CisgICAgaWYgKCFwaWN0dXJlU2l6ZU92ZXJyaWRlbikgeworICAgICAgICBBTE9HVigiUGljdHVyZSBzaXplIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuLiBTa2lwIHJlY292ZXJpbmciKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOworICAgIHBpY3R1cmVXaWR0aCA9IHBpY3R1cmVXaWR0aExhc3RTZXQ7CisgICAgcGljdHVyZUhlaWdodCA9IHBpY3R1cmVIZWlnaHRMYXN0U2V0OworICAgIHJldHVybiBPSzsKK30KIAogY29uc3QgY2hhciogUGFyYW1ldGVyczo6Z2V0U3RhdGVOYW1lKFN0YXRlIHN0YXRlKSB7CiAjZGVmaW5lIENBU0VfRU5VTV9UT19DSEFSKHgpIGNhc2UgeDogcmV0dXJuKCN4KTsgYnJlYWs7CkBAIC0yMDgwLDI0ICsyMjIxLDcgQEAKIH0KIAogaW50IFBhcmFtZXRlcnM6OmZvcm1hdFN0cmluZ1RvRW51bShjb25zdCBjaGFyICpmb3JtYXQpIHsKLSAgICByZXR1cm4KLSAgICAgICAgIWZvcm1hdCA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCA6Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIyU1ApID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQIDogLy8gTlYxNgotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCA6IC8vIE5WMjEKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJJKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JIDogIC8vIFlVWTIKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBQKSA/Ci0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIgOiAgICAgICAgIC8vIFlWMTIKLSAgICAgICAgIXN0cmNtcChmb3JtYXQsIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0I1NjUpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSA6ICAgICAgLy8gUkdCNTY1Ci0gICAgICAgICFzdHJjbXAoZm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCQTg4ODgpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4IDogICAgLy8gUkdCODg4OAotICAgICAgICAhc3RyY21wKGZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX0JBWUVSX1JHR0IpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUiA6ICAgLy8gUmF3IHNlbnNvciBkYXRhCi0gICAgICAgIC0xOworICAgIHJldHVybiBDYW1lcmFQYXJhbWV0ZXJzOjpwcmV2aWV3Rm9ybWF0VG9FbnVtKGZvcm1hdCk7CiB9CiAKIGNvbnN0IGNoYXIqIFBhcmFtZXRlcnM6OmZvcm1hdEVudW1Ub1N0cmluZyhpbnQgZm9ybWF0KSB7CkBAIC0yMjI1LDkgKzIzNDksOSBAQAogaW50IFBhcmFtZXRlcnM6OnNjZW5lTW9kZVN0cmluZ1RvRW51bShjb25zdCBjaGFyICpzY2VuZU1vZGUpIHsKICAgICByZXR1cm4KICAgICAgICAgIXNjZW5lTW9kZSA/Ci0gICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9VTlNVUFBPUlRFRCA6CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCA6CiAgICAgICAgICFzdHJjbXAoc2NlbmVNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0FVVE8pID8KLSAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX1VOU1VQUE9SVEVEIDoKKyAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0RJU0FCTEVEIDoKICAgICAgICAgIXN0cmNtcChzY2VuZU1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVfQUNUSU9OKSA/CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9BQ1RJT04gOgogICAgICAgICAhc3RyY21wKHNjZW5lTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9QT1JUUkFJVCkgPwpAQCAtMjI2NSw3ICsyMzg5LDcgQEAKICAgICAgICAgY29uc3QgY2hhciAqZmxhc2hNb2RlKSB7CiAgICAgcmV0dXJuCiAgICAgICAgICFmbGFzaE1vZGUgPwotICAgICAgICAgICAgUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9JTlZBTElEIDoKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGIDoKICAgICAgICAgIXN0cmNtcChmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKSA/CiAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX09GRiA6CiAgICAgICAgICFzdHJjbXAoZmxhc2hNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX0FVVE8pID8KQEAgLTI0MDYsNyArMjUzMCw3IEBACiAgICAgfQogCiAgICAgaWYgKGFyZWFzLnNpemUoKSA+IG1heFJlZ2lvbnMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUb28gbWFueSBhcmVhcyByZXF1ZXN0ZWQ6ICVkIiwKKyAgICAgICAgQUxPR0UoIiVzOiBUb28gbWFueSBhcmVhcyByZXF1ZXN0ZWQ6ICV6dSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcmVhcy5zaXplKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTI1NjYsNyArMjY5MCw3IEBACiAgICAgcmV0dXJuIGNyb3BZVG9BcnJheShub3JtYWxpemVkWVRvQ3JvcCh5KSk7CiB9CiAKLXN0YXR1c190IFBhcmFtZXRlcnM6OmdldEZpbHRlcmVkUHJldmlld1NpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpIHsKK3N0YXR1c190IFBhcmFtZXRlcnM6OmdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcykgewogICAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdGF0aWMgbWV0YWRhdGEgaXMgbm90IGluaXRpYWxpemVkIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0yNTc1LDIyICsyNjk5LDM3IEBACiAgICAgICAgIEFMT0dFKCIlczogSW5wdXQgc2l6ZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc2l6ZXMtPmNsZWFyKCk7CiAKLSAgICBjb25zdCBzaXplX3QgU0laRV9DT1VOVCA9IHNpemVvZihTaXplKSAvIHNpemVvZihpbnQpOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzID0KLSAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTLCBTSVpFX0NPVU5UKTsKLSAgICBpZiAoYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQgPCBTSVpFX0NPVU5UKSByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgU2l6ZSBwcmV2aWV3U2l6ZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzLmNvdW50OyBpICs9IFNJWkVfQ09VTlQpIHsKLSAgICAgICAgcHJldmlld1NpemUud2lkdGggPSBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5kYXRhLmkzMltpXTsKLSAgICAgICAgcHJldmlld1NpemUuaGVpZ2h0ID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaSsxXTsKLSAgICAgICAgICAgIC8vIE5lZWQgc2tpcCB0aGUgcHJldmlldyBzaXplcyB0aGF0IGFyZSB0b28gbGFyZ2UuCi0gICAgICAgICAgICBpZiAocHJldmlld1NpemUud2lkdGggPD0gbGltaXQud2lkdGggJiYKLSAgICAgICAgICAgICAgICAgICAgcHJldmlld1NpemUuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgewotICAgICAgICAgICAgICAgIHNpemVzLT5wdXNoKHByZXZpZXdTaXplKTsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CisgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAgICAgICAgIHNjLndpZHRoIDw9IGxpbWl0LndpZHRoICYmIHNjLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBTaXplIHN6ID0ge3NjLndpZHRoLCBzYy5oZWlnaHR9OworICAgICAgICAgICAgICAgIHNpemVzLT5wdXNoKHN6KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBTSVpFX0NPVU5UID0gc2l6ZW9mKFNpemUpIC8gc2l6ZW9mKGludCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVByb2Nlc3NlZFNpemVzID0KKyAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1BST0NFU1NFRF9TSVpFUywgU0laRV9DT1VOVCk7CisgICAgICAgIGlmIChhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudCA8IFNJWkVfQ09VTlQpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAgICAgU2l6ZSBmaWx0ZXJlZFNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuY291bnQ7IGkgKz0gU0laRV9DT1VOVCkgeworICAgICAgICAgICAgZmlsdGVyZWRTaXplLndpZHRoID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaV07CisgICAgICAgICAgICBmaWx0ZXJlZFNpemUuaGVpZ2h0ID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaSsxXTsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHNraXAgdGhlIHByZXZpZXcgc2l6ZXMgdGhhdCBhcmUgdG9vIGxhcmdlLgorICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFNpemUud2lkdGggPD0gbGltaXQud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkU2l6ZS5oZWlnaHQgPD0gbGltaXQuaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVzLT5wdXNoKGZpbHRlcmVkU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKHNpemVzLT5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoImdlbmVyYXRlZCBwcmV2aWV3IHNpemUgbGlzdCBpcyBlbXB0eSEhIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yNjI0LDYgKzI3NjMsNzggQEAKICAgICByZXR1cm4gbWF4U2l6ZTsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCkgeworICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIEFMT0dFKCJTdHJlYW1Db25maWd1cmF0aW9uIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgZGV2aWNlIEhBTCAzLjIhIik7CisgICAgICAgIHJldHVybiBzY3M7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgICAgc2NzLmFkZChzYyk7CisgICAgfQorICAgIHJldHVybiBzY3M7Cit9CisKK1NvcnRlZFZlY3RvcjxpbnQzMl90PiBQYXJhbWV0ZXJzOjpnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCkgeworICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBvdXRwdXRGb3JtYXRzOyAvLyBOb24tZHVwbGljYXRlZCBvdXRwdXQgZm9ybWF0cworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0cy5hZGQoc2MuZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPSBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXRzLmFkZChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0cHV0Rm9ybWF0czsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldEF2YWlsYWJsZUpwZWdTaXplcygpIHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4ganBlZ1NpemVzOworICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gc2NzID0gZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgc2NzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBTdHJlYW1Db25maWd1cmF0aW9uICZzYyA9IHNjc1tpXTsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCisgICAgICAgICAgICAgICAgICAgIHNjLmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICBTaXplIHN6ID0ge3NjLndpZHRoLCBzYy5oZWlnaHR9OworICAgICAgICAgICAgICAgIGpwZWdTaXplcy5hZGQoc3opOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IEpQRUdfU0laRV9FTlRSWV9DT1VOVCA9IDI7CisgICAgICAgIGNvbnN0IGludCBXSURUSF9PRkZTRVQgPSAwOworICAgICAgICBjb25zdCBpbnQgSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUpwZWdTaXplcyA9CisgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpKz0gSlBFR19TSVpFX0VOVFJZX0NPVU5UKSB7CisgICAgICAgICAgICBpbnQgd2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIFdJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBIRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIFNpemUgc3ogPSB7d2lkdGgsIGhlaWdodH07CisgICAgICAgICAgICBqcGVnU2l6ZXMuYWRkKHN6KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ganBlZ1NpemVzOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbjo6T3V0cHV0cyBvdXRwdXRzKSBjb25zdCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IGRhMDdjY2YuLjgxNWNjNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtNTIsNiArNTIsOSBAQAogICAgIGludCBwcmV2aWV3VHJhbnNmb3JtOyAvLyBzZXQgYnkgQ0FNRVJBX0NNRF9TRVRfRElTUExBWV9PUklFTlRBVElPTgogCiAgICAgaW50IHBpY3R1cmVXaWR0aCwgcGljdHVyZUhlaWdodDsKKyAgICAvLyBTdG9yZSB0aGUgcGljdHVyZSBzaXplIGJlZm9yZSB0aGV5IGFyZSBvdmVycmlkZW4gYnkgdmlkZW8gc25hcHNob3QKKyAgICBpbnQgcGljdHVyZVdpZHRoTGFzdFNldCwgcGljdHVyZUhlaWdodExhc3RTZXQ7CisgICAgYm9vbCBwaWN0dXJlU2l6ZU92ZXJyaWRlbjsKIAogICAgIGludDMyX3QganBlZ1RodW1iU2l6ZVsyXTsKICAgICB1aW50OF90IGpwZWdRdWFsaXR5LCBqcGVnVGh1bWJRdWFsaXR5OwpAQCAtMTE0LDYgKzExNywxNCBAQAogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9jazsKICAgICBib29sIGF1dG9XaGl0ZUJhbGFuY2VMb2NrOwogCisgICAgLy8gM0EgcmVnaW9uIHR5cGVzLCBmb3IgdXNlIHdpdGggQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TCisgICAgZW51bSByZWdpb25fdCB7CisgICAgICAgIFJFR0lPTl9BRSA9IDAsCisgICAgICAgIFJFR0lPTl9BV0IsCisgICAgICAgIFJFR0lPTl9BRiwKKyAgICAgICAgTlVNX1JFR0lPTiAvLyBOdW1iZXIgb2YgcmVnaW9uIHR5cGVzCisgICAgfSByZWdpb247CisKICAgICBWZWN0b3I8QXJlYT4gbWV0ZXJpbmdBcmVhczsKIAogICAgIGludCB6b29tOwpAQCAtMTY4LDggKzE3OSwxMyBAQAogICAgIC8vIE51bWJlciBvZiB6b29tIHN0ZXBzIHRvIHNpbXVsYXRlCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fWk9PTV9TVEVQUyA9IDEwMDsKICAgICAvLyBNYXggcHJldmlldyBzaXplIGFsbG93ZWQKKyAgICAvLyBUaGlzIGlzIHNldCB0byBhIDE6MSB2YWx1ZSB0byBhbGxvdyBmb3IgYW55IGFzcGVjdCByYXRpbyB0aGF0IGhhcworICAgIC8vIGEgbWF4IGxvbmcgc2lkZSBvZiAxOTIwIHBpeGVscwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1BSRVZJRVdfV0lEVEggPSAxOTIwOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTUFYX1BSRVZJRVdfSEVJR0hUID0gMTA4MDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE1BWF9QUkVWSUVXX0hFSUdIVCA9IDE5MjA7CisgICAgLy8gSW5pdGlhbCBtYXggcHJldmlldy9yZWNvcmRpbmcgc2l6ZSBib3VuZAorICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX0lOSVRJQUxfUFJFVklFV19XSURUSCA9IDE5MjA7CisgICAgc3RhdGljIGNvbnN0IGludCBNQVhfSU5JVElBTF9QUkVWSUVXX0hFSUdIVCA9IDEwODA7CiAgICAgLy8gQXNwZWN0IHJhdGlvIHRvbGVyYW5jZQogICAgIHN0YXRpYyBjb25zdCBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMDE7CiAKQEAgLTIxOSw3ICsyMzUsNyBAQAogICAgIH5QYXJhbWV0ZXJzKCk7CiAKICAgICAvLyBTZXRzIHVwIGRlZmF1bHQgcGFyYW1ldGVycwotICAgIHN0YXR1c190IGluaXRpYWxpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmluZm8pOworICAgIHN0YXR1c190IGluaXRpYWxpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKmluZm8sIGludCBkZXZpY2VWZXJzaW9uKTsKIAogICAgIC8vIEJ1aWxkIGZhc3QtYWNjZXNzIGRldmljZSBzdGF0aWMgaW5mbyBmcm9tIHN0YXRpYyBpbmZvCiAgICAgc3RhdHVzX3QgYnVpbGRGYXN0SW5mbygpOwpAQCAtMjQ1LDYgKzI2MSwxMiBAQAogICAgIC8vIEFkZC91cGRhdGUgSlBFRyBlbnRyaWVzIGluIG1ldGFkYXRhCiAgICAgc3RhdHVzX3QgdXBkYXRlUmVxdWVzdEpwZWcoQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIGNvbnN0OwogCisgICAgLyogSGVscGVyIGZ1bmN0aW9ucyB0byBvdmVycmlkZSBqcGVnIHNpemUgZm9yIHZpZGVvIHNuYXBzaG90ICovCisgICAgLy8gT3ZlcnJpZGUganBlZyBzaXplIGJ5IHZpZGVvIHNpemUuIENhbGxlZCBkdXJpbmcgc3RhcnRSZWNvcmRpbmcuCisgICAgc3RhdHVzX3Qgb3ZlcnJpZGVKcGVnU2l6ZUJ5VmlkZW9TaXplKCk7CisgICAgLy8gUmVjb3ZlciBvdmVycmlkZGVuIGpwZWcgc2l6ZS4gIENhbGxlZCBkdXJpbmcgc3RvcFJlY29yZGluZy4KKyAgICBzdGF0dXNfdCByZWNvdmVyT3ZlcnJpZGRlbkpwZWdTaXplKCk7CisKICAgICAvLyBDYWxjdWxhdGUgdGhlIGNyb3AgcmVnaW9uIHJlY3RhbmdsZSBiYXNlZCBvbiBjdXJyZW50IHN0cmVhbSBzaXplcwogICAgIHN0cnVjdCBDcm9wUmVnaW9uIHsKICAgICAgICAgZmxvYXQgbGVmdDsKQEAgLTMzNCwxMCArMzU2LDM1IEBACiAgICAgaW50IG5vcm1hbGl6ZWRZVG9Dcm9wKGludCB5KSBjb25zdDsKIAogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVQcmV2aWV3U2l6ZXM7CisgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZVZpZGVvU2l6ZXM7CiAgICAgLy8gR2V0IHNpemUgbGlzdCAodGhhdCBhcmUgbm8gbGFyZ2VyIHRoYW4gbGltaXQpIGZyb20gc3RhdGljIG1ldGFkYXRhLgotICAgIHN0YXR1c190IGdldEZpbHRlcmVkUHJldmlld1NpemVzKFNpemUgbGltaXQsIFZlY3RvcjxTaXplPiAqc2l6ZXMpOworICAgIHN0YXR1c190IGdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcyk7CiAgICAgLy8gR2V0IG1heCBzaXplIChmcm9tIHRoZSBzaXplIGFycmF5KSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGFzcGVjdCByYXRpby4KICAgICBTaXplIGdldE1heFNpemVGb3JSYXRpbyhmbG9hdCByYXRpbywgY29uc3QgaW50MzJfdCogc2l6ZUFycmF5LCBzaXplX3QgY291bnQpOworCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBvdmVycmlkaW5nIGpwZWcgc2l6ZSBmb3IgdmlkZW8gc25hcHNob3QKKyAgICAvLyBDaGVjayBpZiBvdmVycmlkZGVuIGpwZWcgc2l6ZSBuZWVkcyB0byBiZSB1cGRhdGVkIGFmdGVyIFBhcmFtZXRlcnM6OnNldC4KKyAgICAvLyBUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBpcyB0YWlsb3JlZCB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgUGFyYW1ldGVyczo6c2V0LgorICAgIC8vIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiBmb3Igb3RoZXIgcHVycG9zZS4KKyAgICBzdGF0dXNfdCB1cGRhdGVPdmVycmlkZGVuSnBlZ1NpemUoKTsKKworICAgIHN0cnVjdCBTdHJlYW1Db25maWd1cmF0aW9uIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQ7CisgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICBpbnQzMl90IGlzSW5wdXQ7CisgICAgfTsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZXh0cmFjdCBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAgICAvLyBPbmx5IHZhbGlkIHNpbmNlIGRldmljZSBIQUwgdmVyc2lvbiAzLjIKKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG5vbi1kdXBsaWNhdGVkIGF2YWlsYWJsZSBvdXRwdXQgZm9ybWF0cworICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBnZXRBdmFpbGFibGVPdXRwdXRGb3JtYXRzKCk7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhdmFpbGFibGUgb3V0cHV0IGpwZWcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCk7CisKKyAgICBpbnQgbURldmljZVZlcnNpb247CiB9OwogCiAvLyBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgUGFyYW1ldGVycyBjbGFzcyBzbyB0aGF0IGl0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IGY2ODM0YzUuLjM3ZGYyNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC05MCw4ICs5MCwyNiBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIG0obU11dGV4KTsKICAgICBpZiAobVByZXZpZXdSZXF1ZXN0LmVudHJ5Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBMl9URU1QTEFURV9QUkVWSUVXLAotICAgICAgICAgICAgICAgICZtUHJldmlld1JlcXVlc3QpOworICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2xpZW50IGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXNlIENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRyBmb3IgWlNMIHN0cmVhbWluZyBjYXNlLgorICAgICAgICBpZiAoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgIGlmIChwYXJhbXMuenNsTW9kZSAmJiAhcGFyYW1zLnJlY29yZGluZ0hpbnQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtUHJldmlld1JlcXVlc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtUHJldmlld1JlcXVlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEyX1RFTVBMQVRFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICZtUHJldmlld1JlcXVlc3QpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCBwcmV2aWV3IHJlcXVlc3Q6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNjQsOCArMTgyLDcgQEAKICAgICBpZiAobVByZXZpZXdTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVByZXZpZXdXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgMCwKLSAgICAgICAgICAgICAgICAmbVByZXZpZXdTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgQ0FNRVJBMl9IQUxfUElYRUxfRk9STUFUX09QQVFVRSwgJm1QcmV2aWV3U3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBwcmV2aWV3IHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTIyNiwxNCArMjQzLDE0IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIHN1cHBvcnQgdGhpcyBtYW55IGJ1ZmZlciBzbG90cwogICAgIGlmIChjb3VudCA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUb28gbWFueSByZWNvcmRpbmcgYnVmZmVycyByZXF1ZXN0ZWQ6ICVkLCBtYXggJWQiLAorICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVG9vIG1hbnkgcmVjb3JkaW5nIGJ1ZmZlcnMgcmVxdWVzdGVkOiAlenUsIG1heCAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGNvdW50LCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIG0obU11dGV4KTsKIAotICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGJ1ZmZlciBjb3VudCBmcm9tIGVuY29kZXI6ICVkIiwKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTmV3IHJlY29yZGluZyBidWZmZXIgY291bnQgZnJvbSBlbmNvZGVyOiAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGNvdW50KTsKIAogICAgIC8vIE5lZWQgdG8gcmUtc2l6ZSBjb25zdW1lciBhbmQgaGVhcApAQCAtMzAyLDYgKzMxOSw0NCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RyZWFtaW5nUHJvY2Vzc29yOjpyZWNvcmRpbmdTdHJlYW1OZWVkc1VwZGF0ZSgKKyAgICAgICAgY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLCBib29sICpuZWVkc1VwZGF0ZSkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChuZWVkc1VwZGF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBpbnZhbGlkIGFyZ3VtZW50IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1SZWNvcmRpbmdTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKKyAgICAgICAgKm5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXZpY2UgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRGV2aWNlIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0OworICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUmVjb3JkaW5nU3RyZWFtSWQsCisgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgorICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKG1SZWNvcmRpbmdDb25zdW1lciA9PSAwIHx8IGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKKyAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCkgeworICAgICAgICAqbmVlZHNVcGRhdGUgPSB0cnVlOworICAgIH0KKyAgICAqbmVlZHNVcGRhdGUgPSBmYWxzZTsKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnVwZGF0ZVJlY29yZGluZ1N0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTMxNSwxOCArMzcwLDIwIEBACiAKICAgICBib29sIG5ld0NvbnN1bWVyID0gZmFsc2U7CiAgICAgaWYgKG1SZWNvcmRpbmdDb25zdW1lciA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgY29uc3VtZXIgd2l0aCAlZCArIDEgIgorICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVjb3JkaW5nIGNvbnN1bWVyIHdpdGggJXp1ICsgMSAiCiAgICAgICAgICAgICAgICAgImNvbnN1bWVyLXNpZGUgYnVmZmVycyIsIF9fRlVOQ1RJT05fXywgbUlkLCBtUmVjb3JkaW5nSGVhcENvdW50KTsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQuIFdlIG5lZWQgb25lIG1vcmUgYnVmZmVyIGhlcmUgc28gdGhhdCB3ZSBjYW4KICAgICAgICAgLy8gYWx3YXlzIGFjcXVpcmUgYW5kIGZyZWUgYSBidWZmZXIgd2hlbiB0aGUgaGVhcCBpcyBmdWxsOyBvdGhlcndpc2UgdGhlIGNvbnN1bWVyCiAgICAgICAgIC8vIHdpbGwgaGF2ZSBidWZmZXJzIGluIGZsaWdodCB3ZSdsbCBuZXZlciBjbGVhciBvdXQuCi0gICAgICAgIHNwPEJ1ZmZlclF1ZXVlPiBicSA9IG5ldyBCdWZmZXJRdWV1ZSgpOwotICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGJxLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAogICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQgKyAxKTsKICAgICAgICAgbVJlY29yZGluZ0NvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1SZWNvcmRpbmdDb25zdW1lciIpKTsKLSAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKGJxKTsKKyAgICAgICAgbVJlY29yZGluZ1dpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICAgICAgbmV3Q29uc3VtZXIgPSB0cnVlOwogICAgICAgICAvLyBBbGxvY2F0ZSBtZW1vcnkgbGF0ZXIsIHNpbmNlIHdlIGRvbid0IGtub3cgYnVmZmVyIHNpemUgdW50aWwgcmVjZWlwdAogICAgIH0KQEAgLTM2Niw3ICs0MjMsNyBAQAogICAgICAgICBtUmVjb3JkaW5nRnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1SZWNvcmRpbmdXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnZpZGVvV2lkdGgsIHBhcmFtcy52aWRlb0hlaWdodCwKLSAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAwLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciByZWNvcmRpbmc6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTQyOSwxNCArNDg2LDE3IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOwogCi0gICAgLy8gSWYgYSByZWNvcmRpbmcgc3RyZWFtIGlzIGJlaW5nIHN0YXJ0ZWQgdXAsIGZyZWUgdXAgYW55Ci0gICAgLy8gb3V0c3RhbmRpbmcgYnVmZmVycyBsZWZ0IGZyb20gdGhlIHByZXZpb3VzIHJlY29yZGluZyBzZXNzaW9uLgotICAgIC8vIFRoZXJlIHNob3VsZCBuZXZlciBiZSBhbnksIHNvIGlmIHRoZXJlIGFyZSwgd2FybiBhYm91dCBpdC4KLSAgICBpZiAoaXNTdHJlYW1BY3RpdmUob3V0cHV0U3RyZWFtcywgbVJlY29yZGluZ1N0cmVhbUlkKSkgeworICAgIC8vIElmIGEgcmVjb3JkaW5nIHN0cmVhbSBpcyBiZWluZyBzdGFydGVkIHVwIGFuZCBubyByZWNvcmRpbmcKKyAgICAvLyBzdHJlYW0gaXMgYWN0aXZlIHlldCwgZnJlZSB1cCBhbnkgb3V0c3RhbmRpbmcgYnVmZmVycyBsZWZ0CisgICAgLy8gZnJvbSB0aGUgcHJldmlvdXMgcmVjb3JkaW5nIHNlc3Npb24uIFRoZXJlIHNob3VsZCBuZXZlciBiZQorICAgIC8vIGFueSwgc28gaWYgdGhlcmUgYXJlLCB3YXJuIGFib3V0IGl0LgorICAgIGJvb2wgaXNSZWNvcmRpbmdTdHJlYW1JZGxlID0gIWlzU3RyZWFtQWN0aXZlKG1BY3RpdmVTdHJlYW1JZHMsIG1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgYm9vbCBzdGFydFJlY29yZGluZ1N0cmVhbSA9IGlzU3RyZWFtQWN0aXZlKG91dHB1dFN0cmVhbXMsIG1SZWNvcmRpbmdTdHJlYW1JZCk7CisgICAgaWYgKHN0YXJ0UmVjb3JkaW5nU3RyZWFtICYmIGlzUmVjb3JkaW5nU3RyZWFtSWRsZSkgewogICAgICAgICByZWxlYXNlQWxsUmVjb3JkaW5nRnJhbWVzTG9ja2VkKCk7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6ICVzIHN0YXJ0ZWQsIHJlY29yZGluZyBoZWFwIGhhcyAlZCBmcmVlIG9mICVkIiwKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogJXMgc3RhcnRlZCwgcmVjb3JkaW5nIGhlYXAgaGFzICV6dSBmcmVlIG9mICV6dSIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgKHR5cGUgPT0gUFJFVklFVykgPyAicHJldmlldyIgOiAicmVjb3JkaW5nIiwKICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwRnJlZSwgbVJlY29yZGluZ0hlYXBDb3VudCk7CiAKQEAgLTY1OSw4ICs3MTksOCBAQAogCiAgICAgICAgIGlmIChtUmVjb3JkaW5nSGVhcCA9PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KTsKLSAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBDcmVhdGluZyByZWNvcmRpbmcgaGVhcCB3aXRoICVkIGJ1ZmZlcnMgb2YgIgotICAgICAgICAgICAgICAgICAgICAic2l6ZSAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgbUlkLAorICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBoZWFwIHdpdGggJXp1IGJ1ZmZlcnMgb2YgIgorICAgICAgICAgICAgICAgICAgICAic2l6ZSAlenUgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKICAgICAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCwgYnVmZmVyU2l6ZSk7CiAKICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwID0gbmV3IENhbWVyYTJIZWFwKGJ1ZmZlclNpemUsIG1SZWNvcmRpbmdIZWFwQ291bnQsCkBAIC04MjUsMTAgKzg4NSwxMCBAQAogICAgIH0KIAogICAgIGlmIChyZWxlYXNlZENvdW50ID4gMCkgewotICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogRm9yY2UtZnJlZWQgJWQgb3V0c3RhbmRpbmcgYnVmZmVycyAiCisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBGb3JjZS1mcmVlZCAlenUgb3V0c3RhbmRpbmcgYnVmZmVycyAiCiAgICAgICAgICAgICAgICAgImZyb20gcHJldmlvdXMgcmVjb3JkaW5nIHNlc3Npb24iLCBfX0ZVTkNUSU9OX18sIG1JZCwgcmVsZWFzZWRDb3VudCk7CiAgICAgICAgIEFMT0dFX0lGKHJlbGVhc2VkQ291bnQgIT0gbVJlY29yZGluZ0hlYXBDb3VudCAtIG1SZWNvcmRpbmdIZWFwRnJlZSwKLSAgICAgICAgICAgICIlczogQ2FtZXJhICVkOiBGb3JjZS1mcmVlZCAlZCBidWZmZXJzLCBidXQgZXhwZWN0ZWQgJWQiLAorICAgICAgICAgICAgIiVzOiBDYW1lcmEgJWQ6IEZvcmNlLWZyZWVkICV6dSBidWZmZXJzLCBidXQgZXhwZWN0ZWQgJXp1IiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCByZWxlYXNlZENvdW50LCBtUmVjb3JkaW5nSGVhcENvdW50IC0gbVJlY29yZGluZ0hlYXBGcmVlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAppbmRleCA4MzNiYjhmLi44NDY2YWY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCkBAIC01NCw2ICs1NCw5IEBACiAKICAgICBzdGF0dXNfdCBzZXRSZWNvcmRpbmdCdWZmZXJDb3VudChzaXplX3QgY291bnQpOwogICAgIHN0YXR1c190IHVwZGF0ZVJlY29yZGluZ1JlcXVlc3QoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKKyAgICAvLyBJZiBuZWVkc1VwZGF0ZSBpcyBzZXQgdG8gdHJ1ZSwgYSB1cGRhdGVSZWNvcmRpbmdTdHJlYW0gY2FsbCB3aXRoIHBhcmFtcyB3aWxsIHJlY3JlYXRlCisgICAgLy8gcmVjb3JkaW5nIHN0cmVhbQorICAgIHN0YXR1c190IHJlY29yZGluZ1N0cmVhbU5lZWRzVXBkYXRlKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywgYm9vbCAqbmVlZHNVcGRhdGUpOwogICAgIHN0YXR1c190IHVwZGF0ZVJlY29yZGluZ1N0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOwogICAgIGludCBnZXRSZWNvcmRpbmdTdHJlYW1JZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAppbmRleCA0MjA3YmE5Li44Zjc4MTAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcApAQCAtMjUsNiArMjUsOCBAQAogI2RlZmluZSBBTE9HVlYoLi4uKSAoKHZvaWQpMCkKICNlbmRpZgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KQEAgLTQ2LDYgKzQ4LDcgQEAKICAgICAgICAgbURldmljZShjbGllbnQtPmdldENhbWVyYURldmljZSgpKSwKICAgICAgICAgbVNlcXVlbmNlcihzZXF1ZW5jZXIpLAogICAgICAgICBtSWQoY2xpZW50LT5nZXRDYW1lcmFJZCgpKSwKKyAgICAgICAgbURlbGV0ZWQoZmFsc2UpLAogICAgICAgICBtWnNsQnVmZmVyQXZhaWxhYmxlKGZhbHNlKSwKICAgICAgICAgbVpzbFN0cmVhbUlkKE5PX1NUUkVBTSksCiAgICAgICAgIG1ac2xSZXByb2Nlc3NTdHJlYW1JZChOT19TVFJFQU0pLApAQCAtNjAsNyArNjMsNyBAQAogCiBac2xQcm9jZXNzb3I6On5ac2xQcm9jZXNzb3IoKSB7CiAgICAgQUxPR1YoIiVzOiBFeGl0IiwgX19GVU5DVElPTl9fKTsKLSAgICBkZWxldGVTdHJlYW0oKTsKKyAgICBkaXNjb25uZWN0KCk7CiB9CiAKIHZvaWQgWnNsUHJvY2Vzc29yOjpvbkZyYW1lQXZhaWxhYmxlKCkgewpAQCAtNzEsMTggKzc0LDE5IEBACiAgICAgfQogfQogCi12b2lkIFpzbFByb2Nlc3Nvcjo6b25GcmFtZUF2YWlsYWJsZShpbnQzMl90IC8qcmVxdWVzdElkKi8sCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSkgewordm9pZCBac2xQcm9jZXNzb3I6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzOiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwotICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CiAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKICAgICAodm9pZCl0aW1lc3RhbXA7Ci0gICAgQUxPR1ZWKCJHb3QgcHJldmlldyBmcmFtZSBmb3IgdGltZXN0YW1wICVsbGQiLCB0aW1lc3RhbXApOworICAgIEFMT0dWVigiR290IHByZXZpZXcgZnJhbWUgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQsIHRpbWVzdGFtcCk7CiAKICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSBmcmFtZTsKKyAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUga0ZyYW1lTGlzdERlcHRoOwogCiAgICAgZmluZE1hdGNoZXNMb2NrZWQoKTsKQEAgLTEyOCwxMyArMTMyLDE1IEBACiAKICAgICBpZiAobVpzbENvbnN1bWVyID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIENQVSBidWZmZXIgcXVldWUgZW5kcG9pbnQKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1ac2xDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgbVpzbENvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwKICAgICAgICAgICAgIGtac2xCdWZmZXJEZXB0aCk7CiAgICAgICAgIG1ac2xDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbVpzbENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OlpzbENvbnN1bWVyIikpOwotICAgICAgICBtWnNsV2luZG93ID0gbmV3IFN1cmZhY2UoYnEpOworICAgICAgICBtWnNsV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIAogICAgIGlmIChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CkBAIC0xNzAsNiArMTc2LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG1EZWxldGVkID0gZmFsc2U7CisKICAgICBpZiAobVpzbFN0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICAvLyBDcmVhdGUgc3RyZWFtIGZvciBIQUwgcHJvZHVjdGlvbgogICAgICAgICAvLyBUT0RPOiBTb3J0IG91dCBiZXR0ZXIgd2F5IHRvIHNlbGVjdCByZXNvbHV0aW9uIGZvciBaU0wKQEAgLTE3OCw4ICsxODYsNyBAQAogICAgICAgICAgICAgICAgIChpbnQpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtWnNsV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgMCwKLSAgICAgICAgICAgICAgICAmbVpzbFN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCAmbVpzbFN0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBaU0w6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTE5NywxMyArMjA0LDIyIEBACiAgICAgfQogICAgIGNsaWVudC0+cmVnaXN0ZXJGcmFtZUxpc3RlbmVyKENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkU3RhcnQsCiAgICAgICAgICAgICBDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZEVuZCwKLSAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi9mYWxzZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFpzbFByb2Nlc3Nvcjo6ZGVsZXRlU3RyZWFtKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOworICAgIC8vIFdBUihiLzE1NDA4MTI4KTogZG8gbm90IGRlbGV0ZSBzdHJlYW0gdW5sZXNzIGNsaWVudCBpcyBiZWluZyBkaXNjb25uZWN0ZWQuCisgICAgbURlbGV0ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgWnNsUHJvY2Vzc29yOjpkaXNjb25uZWN0KCkgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNDYxLDcgKzQ3Nyw3IEBACiAKICAgICBtWnNsUXVldWVIZWFkID0gKG1ac2xRdWV1ZUhlYWQgKyAxKSAlIGtac2xCdWZmZXJEZXB0aDsKIAotICAgIEFMT0dWVigiICBBY3F1aXJlZCBidWZmZXIsIHRpbWVzdGFtcCAlbGxkIiwgcXVldWVIZWFkLmJ1ZmZlci5tVGltZXN0YW1wKTsKKyAgICBBTE9HVlYoIiAgQWNxdWlyZWQgYnVmZmVyLCB0aW1lc3RhbXAgJSIgUFJJZDY0LCBxdWV1ZUhlYWQuYnVmZmVyLm1UaW1lc3RhbXApOwogCiAgICAgZmluZE1hdGNoZXNMb2NrZWQoKTsKIApAQCAtNDgwLDcgKzQ5Niw3IEBACiAgICAgICAgICAgICAgICAgZW50cnkgPSBxdWV1ZUVudHJ5LmZyYW1lLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgICAgICAgICBmcmFtZVRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1ZWKCIgICAlZDogYjogJWxsZFx0ZjogJWxsZCIsIGksCisgICAgICAgICAgICBBTE9HVlYoIiAgICVkOiBiOiAlIiBQUklkNjQgIlx0ZjogJSIgUFJJZDY0LCBpLAogICAgICAgICAgICAgICAgICAgICBidWZmZXJUaW1lc3RhbXAsIGZyYW1lVGltZXN0YW1wICk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHF1ZXVlRW50cnkuZnJhbWUuaXNFbXB0eSgpICYmIGJ1ZmZlclRpbWVzdGFtcCAhPSAwKSB7CkBAIC00OTgsMTMgKzUxNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgZnJhbWVUaW1lc3RhbXAgPSBlbnRyeS5kYXRhLmk2NFswXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclRpbWVzdGFtcCA9PSBmcmFtZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgbWF0Y2ggJWxsZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiJXM6IEZvdW5kIG1hdGNoICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhID0gYWJzKGJ1ZmZlclRpbWVzdGFtcCAtIGZyYW1lVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVsdGEgPCAxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCIlczogRm91bmQgY2xvc2UgbWF0Y2ggJWxsZCAoZGVsdGEgJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigiJXM6IEZvdW5kIGNsb3NlIG1hdGNoICUiIFBSSWQ2NCAiIChkZWx0YSAlIiBQUklkNjQgIikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJUaW1lc3RhbXAsIGRlbHRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC01NDAsNyArNTU2LDcgQEAKICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIGZyYW1lQWVTdGF0ZSA9IGVudHJ5LmRhdGEudThbMF07CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nOCByZXN1bHQgPQotICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiICAgJWQ6IGI6ICVsbGRcdGY6ICVsbGQsIEFFIHN0YXRlOiAlZCIsIGksCisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIgICAlenU6IGI6ICUiIFBSSWQ2NCAiXHRmOiAlIiBQUklkNjQgIiwgQUUgc3RhdGU6ICVkIiwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclRpbWVzdGFtcCwgZnJhbWVUaW1lc3RhbXAsIGZyYW1lQWVTdGF0ZSk7CiAgICAgICAgIEFMT0dWKCIlcyIsIHJlc3VsdC5zdHJpbmcoKSk7CiAgICAgICAgIGlmIChmZCAhPSAtMSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCmluZGV4IDZkM2NiODUuLmI2NTMzY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oIgpAQCAtNTQsNyArNTUsNyBAQAogICAgIC8vIEZyb20gbVpzbENvbnN1bWVyCiAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKTsKICAgICAvLyBGcm9tIEZyYW1lUHJvY2Vzc29yCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSk7CiAKQEAgLTY2LDYgKzY3LDcgQEAKIAogICAgIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOworICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKICAgICBpbnQgZ2V0U3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHN0YXR1c190IHB1c2hUb1JlcHJvY2VzcyhpbnQzMl90IHJlcXVlc3RJZCk7CkBAIC04NSw2ICs4Nyw4IEBACiAgICAgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gbVNlcXVlbmNlcjsKICAgICBpbnQgbUlkOwogCisgICAgYm9vbCBtRGVsZXRlZDsKKwogICAgIG11dGFibGUgTXV0ZXggbUlucHV0TXV0ZXg7CiAgICAgYm9vbCBtWnNsQnVmZmVyQXZhaWxhYmxlOwogICAgIENvbmRpdGlvbiBtWnNsQnVmZmVyQXZhaWxhYmxlU2lnbmFsOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCmluZGV4IDc3NmViZTIuLmYxMTBiNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKQEAgLTI1LDYgKzI1LDggQEAKICNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCiAjZW5kaWYKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC00Miw2ICs0NCw3IEBACiAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LAogICAgIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik6CiAgICAgICAgIFRocmVhZChmYWxzZSksCisgICAgICAgIG1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wKDApLAogICAgICAgICBtU3RhdGUoUlVOTklORyksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKICAgICAgICAgbVNlcXVlbmNlcihzZXF1ZW5jZXIpLApAQCAtNDksOSArNTIsNDIgQEAKICAgICAgICAgbVpzbFN0cmVhbUlkKE5PX1NUUkVBTSksCiAgICAgICAgIG1GcmFtZUxpc3RIZWFkKDApLAogICAgICAgICBtWnNsUXVldWVIZWFkKDApLAotICAgICAgICBtWnNsUXVldWVUYWlsKDApIHsKLSAgICBtWnNsUXVldWUuaW5zZXJ0QXQoMCwga1pzbEJ1ZmZlckRlcHRoKTsKLSAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIGtGcmFtZUxpc3REZXB0aCk7CisgICAgICAgIG1ac2xRdWV1ZVRhaWwoMCksCisgICAgICAgIG1IYXNGb2N1c2VyKGZhbHNlKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBidWZmZXIgcXVldWUgYW5kIGZyYW1lIGxpc3QgYmFzZWQgb24gcGlwZWxpbmUgbWF4IGRlcHRoLgorICAgIHNpemVfdCBwaXBlbGluZU1heERlcHRoID0ga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoOworICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBkZXZpY2UgPQorICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmEzRGV2aWNlKj4oY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKS5nZXQoKSk7CisgICAgICAgIGlmIChkZXZpY2UgIT0gMCkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPQorICAgICAgICAgICAgICAgIGRldmljZS0+aW5mbygpLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BJUEVMSU5FX01BWF9ERVBUSCk7CisgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIHBpcGVsaW5lTWF4RGVwdGggPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFVuYWJsZSB0byBmaW5kIHRoZSBhbmRyb2lkLnJlcXVlc3QucGlwZWxpbmVNYXhEZXB0aCwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHVzZSBkZWZhdWx0IHBpcGVsaW5lIG1heCBkZXB0aCAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE1heFBpcGVsaW5lRGVwdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbnRyeSA9IGRldmljZS0+aW5mbygpLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRSk7CisgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwICYmIGVudHJ5LmRhdGEuZlswXSAhPSAwLikgeworICAgICAgICAgICAgICAgIG1IYXNGb2N1c2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlczogSW5pdGlhbGl6ZSBidWZmZXIgcXVldWUgYW5kIGZyYW1lIGxpc3QgZGVwdGggYmFzZWQgb24gbWF4IHBpcGVsaW5lIGRlcHRoICglZCkiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGlwZWxpbmVNYXhEZXB0aCk7CisgICAgLy8gTmVlZCB0byBrZWVwIGJ1ZmZlciBxdWV1ZSBsb25nZXIgdGhhbiBtZXRhZGF0YSBxdWV1ZSBiZWNhdXNlIHNvbWV0aW1lcyBidWZmZXIgYXJyaXZlcworICAgIC8vIGVhcmxpZXIgdGhhbiBtZXRhZGF0YSB3aGljaCBjYXVzZXMgdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIG9sZGVzdCBtZXRhZGF0YSBiZWluZworICAgIC8vIHJlbW92ZWQuCisgICAgbUZyYW1lTGlzdERlcHRoID0gcGlwZWxpbmVNYXhEZXB0aDsKKyAgICBtQnVmZmVyUXVldWVEZXB0aCA9IG1GcmFtZUxpc3REZXB0aCArIDE7CisKKworICAgIG1ac2xRdWV1ZS5pbnNlcnRBdCgwLCBtQnVmZmVyUXVldWVEZXB0aCk7CisgICAgbUZyYW1lTGlzdC5pbnNlcnRBdCgwLCBtRnJhbWVMaXN0RGVwdGgpOwogICAgIHNwPENhcHR1cmVTZXF1ZW5jZXI+IGNhcHR1cmVTZXF1ZW5jZXIgPSBtU2VxdWVuY2VyLnByb21vdGUoKTsKICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlciAhPSAwKSBjYXB0dXJlU2VxdWVuY2VyLT5zZXRac2xQcm9jZXNzb3IodGhpcyk7CiB9CkBAIC02MSwxOSArOTcsMzQgQEAKICAgICBkZWxldGVTdHJlYW0oKTsKIH0KIAotdm9pZCBac2xQcm9jZXNzb3IzOjpvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgLypyZXF1ZXN0SWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpIHsKK3ZvaWQgWnNsUHJvY2Vzc29yMzo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7Ci0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgZW50cnkgPSByZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGVudHJ5LmRhdGEuaTY0WzBdOwotICAgICh2b2lkKXRpbWVzdGFtcDsKLSAgICBBTE9HVlYoIkdvdCBwcmV2aWV3IG1ldGFkYXRhIGZvciB0aW1lc3RhbXAgJWxsZCIsIHRpbWVzdGFtcCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtZXRhZGF0YSBkb2Vzbid0IGhhdmUgdGltZXN0YW1wLCBza2lwIHRoaXMgcmVzdWx0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9GUkFNRV9DT1VOVCk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtZXRhZGF0YSBkb2Vzbid0IGhhdmUgZnJhbWUgbnVtYmVyLCBza2lwIHRoaXMgcmVzdWx0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gZW50cnkuZGF0YS5pMzJbMF07CisKKyAgICBBTE9HVlYoIkdvdCBwcmV2aWV3IG1ldGFkYXRhIGZvciBmcmFtZSAlZCB3aXRoIHRpbWVzdGFtcCAlIiBQUklkNjQsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXApOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBSVU5OSU5HKSByZXR1cm47CiAKLSAgICBtRnJhbWVMaXN0LmVkaXRJdGVtQXQobUZyYW1lTGlzdEhlYWQpID0gZnJhbWU7Ci0gICAgbUZyYW1lTGlzdEhlYWQgPSAobUZyYW1lTGlzdEhlYWQgKyAxKSAlIGtGcmFtZUxpc3REZXB0aDsKKyAgICAvLyBDb3JyZXNwb25kaW5nIGJ1ZmZlciBoYXMgYmVlbiBjbGVhcmVkLiBObyBuZWVkIHRvIHB1c2ggaW50byBtRnJhbWVMaXN0CisgICAgaWYgKHRpbWVzdGFtcCA8PSBtTGF0ZXN0Q2xlYXJlZEJ1ZmZlclRpbWVzdGFtcCkgcmV0dXJuOworCisgICAgbUZyYW1lTGlzdC5lZGl0SXRlbUF0KG1GcmFtZUxpc3RIZWFkKSA9IHJlc3VsdC5tTWV0YWRhdGE7CisgICAgbUZyYW1lTGlzdEhlYWQgPSAobUZyYW1lTGlzdEhlYWQgKyAxKSAlIG1GcmFtZUxpc3REZXB0aDsKIH0KIAogc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6dXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewpAQCAtMTMzLDcgKzE4NCw3IEBACiAgICAgICAgIC8vIE5vdGUgdGhhdCBmb3JtYXQgc3BlY2lmaWVkIGludGVybmFsbHkgaW4gQ2FtZXJhM1pzbFN0cmVhbQogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVpzbFN0cmVhbSgKICAgICAgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCwgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LAotICAgICAgICAgICAgICAgIGtac2xCdWZmZXJEZXB0aCwKKyAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWVEZXB0aCwKICAgICAgICAgICAgICAgICAmbVpzbFN0cmVhbUlkLAogICAgICAgICAgICAgICAgICZtWnNsU3RyZWFtKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTQyLDEwICsxOTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CisKKyAgICAgICAgLy8gT25seSBhZGQgdGhlIGNhbWVyYTMgYnVmZmVyIGxpc3RlbmVyIHdoZW4gdGhlIHN0cmVhbSBpcyBjcmVhdGVkLgorICAgICAgICBtWnNsU3RyZWFtLT5hZGRCdWZmZXJMaXN0ZW5lcih0aGlzKTsKICAgICB9CisKICAgICBjbGllbnQtPnJlZ2lzdGVyRnJhbWVMaXN0ZW5lcihDYW1lcmEyQ2xpZW50OjprUHJldmlld1JlcXVlc3RJZFN0YXJ0LAogICAgICAgICAgICAgQ2FtZXJhMkNsaWVudDo6a1ByZXZpZXdSZXF1ZXN0SWRFbmQsCi0gICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovZmFsc2UpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTg4LDYgKzI0NCw0NiBAQAogICAgIHJldHVybiBtWnNsU3RyZWFtSWQ7CiB9CiAKK3N0YXR1c190IFpzbFByb2Nlc3NvcjM6OnVwZGF0ZVJlcXVlc3RXaXRoRGVmYXVsdFN0aWxsUmVxdWVzdChDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgY29uc3QgeworICAgIHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2xpZW50IGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPENhbWVyYTNEZXZpY2U+IGRldmljZSA9CisgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYTNEZXZpY2UqPihjbGllbnQtPmdldENhbWVyYURldmljZSgpLmdldCgpKTsKKyAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IERldmljZSBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIHN0aWxsVGVtcGxhdGU7CisgICAgZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZzdGlsbFRlbXBsYXRlKTsKKworICAgIC8vIEZpbmQgc29tZSBvZiB0aGUgcG9zdC1wcm9jZXNzaW5nIHRhZ3MsIGFuZCBhc3NpZ24gdGhlIHZhbHVlIGZyb20gdGVtcGxhdGUgdG8gdGhlIHJlcXVlc3QuCisgICAgLy8gT25seSBjaGVjayB0aGUgYWJlcnJhdGlvbiBtb2RlIGFuZCBub2lzZSByZWR1Y3Rpb24gbW9kZSBmb3Igbm93LCBhcyB0aGV5IGFyZSB2ZXJ5IGltcG9ydGFudAorICAgIC8vIGZvciBpbWFnZSBxdWFsaXR5LgorICAgIHVpbnQzMl90IHBvc3RQcm9jZXNzaW5nVGFnc1tdID0geworICAgICAgICAgICAgQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgIEFORFJPSURfVE9ORU1BUF9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9TSEFESU5HX01PREUsCisgICAgICAgICAgICBBTkRST0lEX0hPVF9QSVhFTF9NT0RFLAorICAgICAgICAgICAgQU5EUk9JRF9FREdFX01PREUKKyAgICB9OworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YocG9zdFByb2Nlc3NpbmdUYWdzKSAvIHNpemVvZih1aW50MzJfdCk7IGkrKykgeworICAgICAgICBlbnRyeSA9IHN0aWxsVGVtcGxhdGUuZmluZChwb3N0UHJvY2Vzc2luZ1RhZ3NbaV0pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0LnVwZGF0ZShwb3N0UHJvY2Vzc2luZ1RhZ3NbaV0sIGVudHJ5LmRhdGEudTgsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBac2xQcm9jZXNzb3IzOjpwdXNoVG9SZXByb2Nlc3MoaW50MzJfdCByZXF1ZXN0SWQpIHsKICAgICBBTE9HVigiJXM6IFNlbmQgaW4gcmVwcm9jZXNzIHJlcXVlc3Qgd2l0aCBpZCAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CkBAIC0yNDcsMTggKzM0Myw0NSBAQAogICAgICAgICB1aW50OF90IHJlcXVlc3RUeXBlID0gQU5EUk9JRF9SRVFVRVNUX1RZUEVfUkVQUk9DRVNTOwogICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfVFlQRSwKICAgICAgICAgICAgICAgICAmcmVxdWVzdFR5cGUsIDEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGlucHV0U3RyZWFtc1sxXSA9CiAgICAgICAgICAgICAgICAgeyBtWnNsU3RyZWFtSWQgfTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsCisgICAgICAgIHJlcyA9IHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TLAogICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtcywgMSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVwZGF0ZSByZXF1ZXN0IGlucHV0IHN0cmVhbXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgY2FwdHVyZUludGVudCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpOworICAgICAgICByZXMgPSByZXF1ZXN0LnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgJmNhcHR1cmVJbnRlbnQsIDEpOworICAgICAgICBpZiAocmVzICE9IE9LICkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gdXBkYXRlIHJlcXVlc3QgY2FwdHVyZSBpbnRlbnQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRPRE86IFNob3VsZG4ndCB3ZSBhbHNvIHVwZGF0ZSB0aGUgbGF0ZXN0IHByZXZpZXcgZnJhbWU/CiAgICAgICAgIGludDMyX3Qgb3V0cHV0U3RyZWFtc1sxXSA9CiAgICAgICAgICAgICAgICAgeyBjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpIH07Ci0gICAgICAgIGlmIChyZXMgPT0gT0spIHJlcXVlc3QudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKKyAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLAogICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbXMsIDEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgcmVxdWVzdCBvdXRwdXQgc3RyZWFtcyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgcmVzID0gcmVxdWVzdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELAogICAgICAgICAgICAgICAgICZyZXF1ZXN0SWQsIDEpOwotCiAgICAgICAgIGlmIChyZXMgIT0gT0sgKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byB1cGRhdGUgZnJhbWUgdG8gYSByZXByb2Nlc3MgcmVxdWVzdCIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtMjg2LDYgKzQwOSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gVXBkYXRlIHBvc3QtcHJvY2Vzc2luZyBzZXR0aW5ncworICAgICAgICByZXMgPSB1cGRhdGVSZXF1ZXN0V2l0aERlZmF1bHRTdGlsbFJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5hYmxlIHRvIHVwZGF0ZSBwb3N0LXByb2Nlc3NpbmcgdGFncywgdGhlIHJlcHJvY2Vzc2VkIGltYWdlIHF1YWxpdHkgIgorICAgICAgICAgICAgICAgICAgICAibWF5IGJlIGNvbXByb21pc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1MYXRlc3RDYXB0dXJlZFJlcXVlc3QgPSByZXF1ZXN0OwogICAgICAgICByZXMgPSBjbGllbnQtPmdldENhbWVyYURldmljZSgpLT5jYXB0dXJlKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzICE9IE9LICkgewpAQCAtMzEwLDExICs0NDAsMTkgQEAKIAogc3RhdHVzX3QgWnNsUHJvY2Vzc29yMzo6Y2xlYXJac2xRdWV1ZUxvY2tlZCgpIHsKICAgICBpZiAobVpzbFN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtWnNsU3RyZWFtLT5jbGVhcklucHV0UmluZ0J1ZmZlcigpOworICAgICAgICAvLyBjbGVhciByZXN1bHQgbWV0YWRhdGEgbGlzdCBmaXJzdC4KKyAgICAgICAgY2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpOworICAgICAgICByZXR1cm4gbVpzbFN0cmVhbS0+Y2xlYXJJbnB1dFJpbmdCdWZmZXIoJm1MYXRlc3RDbGVhcmVkQnVmZmVyVGltZXN0YW1wKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIFpzbFByb2Nlc3NvcjM6OmNsZWFyWnNsUmVzdWx0UXVldWVMb2NrZWQoKSB7CisgICAgbUZyYW1lTGlzdC5jbGVhcigpOworICAgIG1GcmFtZUxpc3RIZWFkID0gMDsKKyAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIG1GcmFtZUxpc3REZXB0aCk7Cit9CisKIHZvaWQgWnNsUHJvY2Vzc29yMzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogICAgIGlmICghbUxhdGVzdENhcHR1cmVkUmVxdWVzdC5pc0VtcHR5KCkpIHsKQEAgLTM1NSw3ICs0OTMsNyBAQAogICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgZnJhbWVBZVN0YXRlID0gZW50cnkuZGF0YS51OFswXTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmc4IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIgICAlZDogYjogJWxsZFx0ZjogJWxsZCwgQUUgc3RhdGU6ICVkIiwgaSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiAgICV6dTogYjogJSIgUFJJZDY0ICJcdGY6ICUiIFBSSWQ2NCAiLCBBRSBzdGF0ZTogJWQiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyVGltZXN0YW1wLCBmcmFtZVRpbWVzdGFtcCwgZnJhbWVBZVN0YXRlKTsKICAgICAgICAgQUxPR1YoIiVzIiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgaWYgKGZkICE9IC0xKSB7CkBAIC0zNjYsNiArNTA0LDIzIEBACiAgICAgfQogfQogCitib29sIFpzbFByb2Nlc3NvcjM6OmlzRml4ZWRGb2N1c01vZGUodWludDhfdCBhZk1vZGUpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGFmTW9kZSkgeworICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0FVVE86CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQ09OVElOVU9VU19WSURFTzoKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1BJQ1RVUkU6CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfTUFDUk86CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkY6CisgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfRURPRjoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIGZvY3VzIG1vZGUgJWQiLCBfX0ZVTkNUSU9OX18sIGFmTW9kZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCiBuc2Vjc190IFpzbFByb2Nlc3NvcjM6OmdldENhbmRpZGF0ZVRpbWVzdGFtcExvY2tlZChzaXplX3QqIG1ldGFkYXRhSWR4KSBjb25zdCB7CiAgICAgLyoqCiAgICAgICogRmluZCB0aGUgc21hbGxlc3QgdGltZXN0YW1wIHdlIGtub3cgYWJvdXQgc28gZmFyCkBAIC00MTEsMTEgKzU2Niw0MyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGZyYW1lLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX01PREUpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGZyYW1lIGhhcyBubyBBRiBtb2RlIGZpZWxkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWZNb2RlID0gZW50cnkuZGF0YS51OFswXTsKKyAgICAgICAgICAgICAgICBpZiAoYWZNb2RlID09IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRikgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCB0aGUgWlNMIGJ1ZmZlciBmb3IgbWFudWFsIEFGIG1vZGUsIGFzIHdlIGRvbid0IHJlYWxseQorICAgICAgICAgICAgICAgICAgICAvLyBrbm93IHRoZSBhZiBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgQUYgc3RhdGUgaWYgZGV2aWNlIGhhcyBmb2N1c2VyIGFuZCBmb2N1cyBtb2RlIGlzbid0IGZpeGVkCisgICAgICAgICAgICAgICAgaWYgKG1IYXNGb2N1c2VyICYmICFpc0ZpeGVkRm9jdXNNb2RlKGFmTW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYW5kaWRhdGUgZnJhbWUgaGFzIGdvb2QgZm9jdXMuCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBaU0wgcXVldWUgZnJhbWUgaGFzIG5vIEFGIHN0YXRlIGZpZWxkISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFmU3RhdGUgPSBlbnRyeS5kYXRhLnU4WzBdOworICAgICAgICAgICAgICAgICAgICBpZiAoYWZTdGF0ZSAhPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfUEFTU0lWRV9GT0NVU0VEICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZTdGF0ZSAhPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfRk9DVVNFRF9MT0NLRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZlN0YXRlICE9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczogWlNMIHF1ZXVlIGZyYW1lIEFGIHN0YXRlIGlzICVkIGlzIG5vdCBnb29kIGZvciBjYXB0dXJlLCBza2lwIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhZlN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbWluVGltZXN0YW1wID0gZnJhbWVUaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgaWR4ID0gajsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1ZWKCIlczogU2F3IHRpbWVzdGFtcCAlbGxkIiwgX19GVU5DVElPTl9fLCBmcmFtZVRpbWVzdGFtcCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzOiBTYXcgdGltZXN0YW1wICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCBmcmFtZVRpbWVzdGFtcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNSw3ICs2MjIsNyBAQAogICAgICAgICBBTE9HVygiJXM6IFpTTCBxdWV1ZSBoYXMgbm8gbWV0YWRhdGEgZnJhbWVzIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6IENhbmRpZGF0ZSB0aW1lc3RhbXAgJWxsZCAoaWR4ICVkKSwgZW1wdHkgZnJhbWVzOiAlZCIsCisgICAgQUxPR1YoIiVzOiBDYW5kaWRhdGUgdGltZXN0YW1wICUiIFBSSWQ2NCAiIChpZHggJXp1KSwgZW1wdHkgZnJhbWVzOiAlenUiLAogICAgICAgICAgIF9fRlVOQ1RJT05fXywgbWluVGltZXN0YW1wLCBpZHgsIGVtcHR5Q291bnQpOwogCiAgICAgaWYgKG1ldGFkYXRhSWR4KSB7CkBAIC00NTEsMTMgKzYzOCwxNSBAQAogfQogCiB2b2lkIFpzbFByb2Nlc3NvcjM6Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKIAogICAgIC8vIGlnbm9yZSBvdXRwdXQgYnVmZmVycwogICAgIGlmIChidWZmZXJJbmZvLm1PdXRwdXQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIExvY2sgbXV0ZXggb25seSBvbmNlIHdlIGtub3cgdGhpcyBpcyBhbiBpbnB1dCBidWZmZXIgcmV0dXJuZWQgdG8gYXZvaWQKKyAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2sKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAgICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgdGhlIGJ1ZmZlciBpcyBpbiBvdXIgcXVldWUgYnkgbG9va2luZyBhdCB0aW1lc3RhbXAKICAgICAvLyB0aGVvcmV0aWNhbGx5IHVubmVjZXNzYXJ5IHVubGVzcyB3ZSBjaGFuZ2UgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICAgICAvLyAtLSBvbmx5IDEgYnVmZmVyIHJlcHJvY2Vzc2VkIGF0IGEgdGltZSAod2hpY2ggaXMgdGhlIGNhc2Ugbm93KQpAQCAtNDY4LDExICs2NTcsMTcgQEAKICAgICAvLyBXZSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGlmIHdlIGRvIHR3byBiYWNrLXRvLWJhY2sgY2FwdHVyZXMsCiAgICAgLy8gdGhlIHNlY29uZCB3b24ndCB1c2UgYSBidWZmZXIgdGhhdCdzIG9sZGVyL3RoZSBzYW1lIGFzIHRoZSBmaXJzdCwgd2hpY2gKICAgICAvLyBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIGlmIHdlIGRvbid0IGNsZWFyIG91dCB0aGUgcXVldWUgYW5kIHRoZQotICAgIC8vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyBzb21ldGhpbmcgbGlrZSAnbmV3ZXN0Jy4gQ2xlYXJpbmcgb3V0IHRoZSBxdWV1ZQotICAgIC8vIG9uIGEgY29tcGxldGVkIGNhcHR1cmUgZW5zdXJlcyB3ZSdsbCBvbmx5IHVzZSBuZXcgZGF0YS4KKyAgICAvLyBzZWxlY3Rpb24gY3JpdGVyaWEgaXMgc29tZXRoaW5nIGxpa2UgJ25ld2VzdCcuIENsZWFyaW5nIG91dCB0aGUgcmVzdWx0CisgICAgLy8gbWV0YWRhdGEgcXVldWUgb24gYSBjb21wbGV0ZWQgY2FwdHVyZSBlbnN1cmVzIHdlJ2xsIG9ubHkgdXNlIG5ldyB0aW1lc3RhbXAuCisgICAgLy8gQ2FsbGluZyBjbGVhclpzbFF1ZXVlTG9ja2VkIGlzIGEgZ3VhcmFudGVlZCBkZWFkbG9jayBiZWNhdXNlIHRoaXMgY2FsbGJhY2sKKyAgICAvLyBob2xkcyB0aGUgQ2FtZXJhM1N0cmVhbSBpbnRlcm5hbCBsb2NrIChtTG9jayksIGFuZCBjbGVhclpzbFF1ZXVlTG9ja2VkIHJlcXVpcmVzCisgICAgLy8gdG8gaG9sZCB0aGUgc2FtZSBsb2NrLgorICAgIC8vIFRPRE86IG5lZWQgZmlndXJlIG91dCBhIHdheSB0byBjbGVhciB0aGUgWnNsIGJ1ZmZlciBxdWV1ZSBwcm9wZXJseS4gUmlnaHQgbm93CisgICAgLy8gaXQgaXMgc2FmZSBub3QgdG8gZG8gc28sIGFzIGJhY2sgdG8gYmFjayBaU0wgY2FwdHVyZSByZXF1aXJlcyBzdG9wIGFuZCBzdGFydAorICAgIC8vIHByZXZpZXcsIHdoaWNoIHdpbGwgZmx1c2ggWlNMIHF1ZXVlIGF1dG9tYXRpY2FsbHkuCiAgICAgQUxPR1YoIiVzOiBNZW1vcnkgb3B0aW1pemF0aW9uLCBjbGVhcmluZyBaU0wgcXVldWUiLAogICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgY2xlYXJac2xRdWV1ZUxvY2tlZCgpOworICAgIGNsZWFyWnNsUmVzdWx0UXVldWVMb2NrZWQoKTsKIAogICAgIC8vIFJlcXVpcmVkIHNvIHdlIGFjY2VwdCBtb3JlIFpTTCByZXF1ZXN0cwogICAgIG1TdGF0ZSA9IFJVTk5JTkc7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuaAppbmRleCBkMmY4MzIyLi5mYzlmNzBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmgKQEAgLTUwLDggKzUwLDggQEAKICAgICBac2xQcm9jZXNzb3IzKHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gc2VxdWVuY2VyKTsKICAgICB+WnNsUHJvY2Vzc29yMygpOwogCi0gICAgLy8gRnJvbSBGcmFtZVByb2Nlc3NvcgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpOworICAgIC8vIEZyb20gRnJhbWVQcm9jZXNzb3I6OkZpbHRlcmVkTGlzdGVuZXIKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIAogICAgIC8qKgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04Miw2ICs4Miw3IEBACiAKICAgcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCisgICAgbnNlY3NfdCBtTGF0ZXN0Q2xlYXJlZEJ1ZmZlclRpbWVzdGFtcDsKIAogICAgIGVudW0gewogICAgICAgICBSVU5OSU5HLApAQCAtMTA3LDggKzEwOCw5IEBACiAgICAgICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lOwogICAgIH07CiAKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtac2xCdWZmZXJEZXB0aCA9IDQ7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVMaXN0RGVwdGggPSBrWnNsQnVmZmVyRGVwdGggKiAyOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZWZhdWx0TWF4UGlwZWxpbmVEZXB0aCA9IDQ7CisgICAgc2l6ZV90IG1CdWZmZXJRdWV1ZURlcHRoOworICAgIHNpemVfdCBtRnJhbWVMaXN0RGVwdGg7CiAgICAgVmVjdG9yPENhbWVyYU1ldGFkYXRhPiBtRnJhbWVMaXN0OwogICAgIHNpemVfdCBtRnJhbWVMaXN0SGVhZDsKIApAQCAtMTIwLDEzICsxMjIsMjIgQEAKIAogICAgIENhbWVyYU1ldGFkYXRhIG1MYXRlc3RDYXB0dXJlZFJlcXVlc3Q7CiAKKyAgICBib29sIG1IYXNGb2N1c2VyOworCiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAogICAgIHN0YXR1c190IGNsZWFyWnNsUXVldWVMb2NrZWQoKTsKIAorICAgIHZvaWQgY2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpOworCiAgICAgdm9pZCBkdW1wWnNsUXVldWUoaW50IGlkKSBjb25zdDsKIAogICAgIG5zZWNzX3QgZ2V0Q2FuZGlkYXRlVGltZXN0YW1wTG9ja2VkKHNpemVfdCogbWV0YWRhdGFJZHgpIGNvbnN0OworCisgICAgYm9vbCBpc0ZpeGVkRm9jdXNNb2RlKHVpbnQ4X3QgYWZNb2RlKSBjb25zdDsKKworICAgIC8vIFVwZGF0ZSB0aGUgcG9zdC1wcm9jZXNzaW5nIG1ldGFkYXRhIHdpdGggdGhlIGRlZmF1bHQgc3RpbGwgY2FwdHVyZSByZXF1ZXN0IHRlbXBsYXRlCisgICAgc3RhdHVzX3QgdXBkYXRlUmVxdWVzdFdpdGhEZWZhdWx0U3RpbGxSZXF1ZXN0KENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCmNvcHkgdG8gc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5jcHAKaW5kZXggMTNjYWM2ZC4uOWVmZWFiYQotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxMyArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAorI2luY2x1ZGUgIlpzbFByb2Nlc3NvckludGVyZmFjZS5oIgogCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTIgewogCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCitzdGF0dXNfdCBac2xQcm9jZXNzb3JJbnRlcmZhY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgcmV0dXJuIE9LOworfQogCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19IICovCit9OyAvL25hbWVzcGFjZSBjYW1lcmEyCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3JJbnRlcmZhY2UuaAppbmRleCAxODNjMGMyLi45ZTI2NmU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29ySW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvckludGVyZmFjZS5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTIgewpAQCAtMzcsNiArMzksOSBAQAogICAgIC8vIERlbGV0ZSB0aGUgdW5kZXJseWluZyBDYW1lcmFEZXZpY2Ugc3RyZWFtcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCkgPSAwOwogCisgICAgLy8gQ2xlYXIgYW55IGFkZGl0aW9uYWwgc3RhdGUgbmVjZXNzYXJ5IGJlZm9yZSB0aGUgQ2FtZXJhRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpOworCiAgICAgLyoqCiAgICAgICogU3VibWl0cyBhIFpTTCBjYXB0dXJlIHJlcXVlc3QgKGlkID0gcmVxdWVzdElkKQogICAgICAqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggYWI3MDU3Zi4uYWRkNjdmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMTYsMTMgKzE2LDE0IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhRGV2aWNlQ2xpZW50IgogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKQEAgLTgyLDcgKzgzLDcgQEAKICAgICBtRnJhbWVQcm9jZXNzb3ItPnJlZ2lzdGVyTGlzdGVuZXIoRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsaXN0ZW5lciovdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypxdWlya1NlbmRQYXJ0aWFscyovdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc2VuZFBhcnRpYWxzKi90cnVlKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTkxLDc5ICs5MiwxMDEgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RMaXN0OworICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIHN0cmVhbWluZywgbGFzdEZyYW1lTnVtYmVyKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzdWJtaXRSZXF1ZXN0TGlzdChMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIEFMT0dWKCIlcy1zdGFydCBvZiBmdW5jdGlvbi4gUmVxdWVzdCBsaXN0IHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCByZXF1ZXN0cy5zaXplKCkpOwogCiAgICAgc3RhdHVzX3QgcmVzOwotCiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKLSAgICBpZiAocmVxdWVzdCA9PSAwKSB7CisgICAgaWYgKHJlcXVlc3RzLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgbnVsbCByZXF1ZXN0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAogICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEocmVxdWVzdC0+bU1ldGFkYXRhKTsKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YVJlcXVlc3RMaXN0OworICAgIGludDMyX3QgcmVxdWVzdElkID0gbVJlcXVlc3RJZENvdW50ZXI7CisgICAgdWludDMyX3QgbG9vcENvdW50ZXIgPSAwOwogCi0gICAgaWYgKG1ldGFkYXRhLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogU2VudCBlbXB0eSBtZXRhZGF0YSBwYWNrZXQuIFJlamVjdGluZyByZXF1ZXN0LiIsCi0gICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmIChyZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFJlcXVlc3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VyZmFjZSB0YXJnZXQuICIKLSAgICAgICAgICAgICAgIlJlamVjdGluZyByZXF1ZXN0LiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMobWV0YWRhdGEpKSB7Ci0gICAgICAgIC8vIENhbGxlZSBsb2dzCi0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBJRHMgd2hpY2ggd2UgY2FsY3VsYXRlIGZyb20KLSAgICAgKiB0aGUgY2FwdHVyZSByZXF1ZXN0J3MgbGlzdCBvZiBzdXJmYWNlIHRhcmdldHMKLSAgICAgKi8KLSAgICBWZWN0b3I8aW50MzJfdD4gb3V0cHV0U3RyZWFtSWRzOwotICAgIG91dHB1dFN0cmVhbUlkcy5zZXRDYXBhY2l0eShyZXF1ZXN0LT5tU3VyZmFjZUxpc3Quc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gcmVxdWVzdC0+bVN1cmZhY2VMaXN0W2ldOwotCi0gICAgICAgIGlmIChzdXJmYWNlID09IDApIGNvbnRpbnVlOwotCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKLSAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShnYnAtPmFzQmluZGVyKCkpOwotCi0gICAgICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZAotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgotICAgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdCBjYWxsZWQgY3JlYXRlU3RyZWFtIG9uIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICBmb3IgKExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID46Oml0ZXJhdG9yIGl0ID0gcmVxdWVzdHMuYmVnaW4oKTsgaXQgIT0gcmVxdWVzdHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSAqaXQ7CisgICAgICAgIGlmIChyZXF1ZXN0ID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IG51bGwgcmVxdWVzdC4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IHN0cmVhbUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7Ci0gICAgICAgIG91dHB1dFN0cmVhbUlkcy5wdXNoX2JhY2soc3RyZWFtSWQpOwotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQXBwZW5kaW5nIG91dHB1dCBzdHJlYW0gJWQgdG8gcmVxdWVzdCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKHJlcXVlc3QtPm1NZXRhZGF0YSk7CisgICAgICAgIGlmIChtZXRhZGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKKyAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBSZXF1ZXN0cyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN1cmZhY2UgdGFyZ2V0LiAiCisgICAgICAgICAgICAgICAgICAiUmVqZWN0aW5nIHJlcXVlc3QuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhtZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIC8vIENhbGxlZSBsb2dzCisgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV3JpdGUgaW4gdGhlIG91dHB1dCBzdHJlYW0gSURzIHdoaWNoIHdlIGNhbGN1bGF0ZSBmcm9tCisgICAgICAgICAqIHRoZSBjYXB0dXJlIHJlcXVlc3QncyBsaXN0IG9mIHN1cmZhY2UgdGFyZ2V0cworICAgICAgICAgKi8KKyAgICAgICAgVmVjdG9yPGludDMyX3Q+IG91dHB1dFN0cmVhbUlkczsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNldENhcGFjaXR5KHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm1TdXJmYWNlTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHJlcXVlc3QtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgICAgIGlmIChzdXJmYWNlID09IDApIGNvbnRpbnVlOworCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnAgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgICAgICBpbnQgaWR4ID0gbVN0cmVhbU1hcC5pbmRleE9mS2V5KGdicC0+YXNCaW5kZXIoKSk7CisKKyAgICAgICAgICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZAorICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCisgICAgICAgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdCBjYWxsZWQgY3JlYXRlU3RyZWFtIG9uIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbUlkKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCB0byByZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CisgICAgICAgIH0KKworICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmb3V0cHV0U3RyZWFtSWRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7CisKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgLypzaXplKi8xKTsKKyAgICAgICAgbG9vcENvdW50ZXIrKzsgLy8gbG9vcENvdW50ZXIgc3RhcnRzIGZyb20gMQorICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVxdWVzdCB3aXRoIElEICVkICglZCBvZiAlenUpIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcXVlc3RJZCwgbG9vcENvdW50ZXIsIHJlcXVlc3RzLnNpemUoKSk7CisKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0TGlzdC5wdXNoX2JhY2sobWV0YWRhdGEpOwogICAgIH0KLQotICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbUlkcy5zaXplKCkpOwotCi0gICAgaW50MzJfdCByZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcisrOwotICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZyZXF1ZXN0SWQsIC8qc2l6ZSovMSk7Ci0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Ym1pdHRpbmcgcmVxdWVzdCB3aXRoIElEICVkIiwKLSAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVxdWVzdElkKTsKKyAgICBtUmVxdWVzdElkQ291bnRlcisrOwogCiAgICAgaWYgKHN0cmVhbWluZykgewotICAgICAgICByZXMgPSBtRGV2aWNlLT5zZXRTdHJlYW1pbmdSZXF1ZXN0KG1ldGFkYXRhKTsKKyAgICAgICAgcmVzID0gbURldmljZS0+c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QobWV0YWRhdGFSZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6ICBHb3QgZXJyb3IgJWQgYWZ0ZXIgdHJ5aW5nIHRvIHNldCBzdHJlYW1pbmcgIgogICAgICAgICAgICAgICAgICAgInJlcXVlc3QiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgcmVzKTsKQEAgLTE3MSwxMSArMTk0LDEyIEBACiAgICAgICAgICAgICBtU3RyZWFtaW5nUmVxdWVzdExpc3QucHVzaF9iYWNrKHJlcXVlc3RJZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBtRGV2aWNlLT5jYXB0dXJlKG1ldGFkYXRhKTsKKyAgICAgICAgcmVzID0gbURldmljZS0+Y2FwdHVyZUxpc3QobWV0YWRhdGFSZXF1ZXN0TGlzdCwgbGFzdEZyYW1lTnVtYmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEdvdCBlcnJvciAlZCBhZnRlciB0cnlpbmcgdG8gc2V0IGNhcHR1cmUiLAotICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHJlcyk7CiAgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlZCAiLCBfX0ZVTkNUSU9OX18sIHJlcXVlc3RJZCk7CiAgICAgfQogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEVuZCBvZiBmdW5jdGlvbiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKQEAgLTE4Niw3ICsyMTAsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y2FuY2VsUmVxdWVzdChpbnQgcmVxdWVzdElkKSB7CitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMsIHJlcXVlc3RJZCA9ICVkIiwgX19GVU5DVElPTl9fLCByZXF1ZXN0SWQpOwogCkBAIC0yMTIsNyArMjM2LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXMgPSBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QoKTsKKyAgICByZXMgPSBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QobGFzdEZyYW1lTnVtYmVyKTsKIAogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN1Y2Nlc3NmdWxseSBjbGVhcmVkIHN0cmVhbWluZyByZXF1ZXN0IiwKQEAgLTIyMyw2ICsyNDcsMjYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmJlZ2luQ29uZmlndXJlKCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzLgorICAgIEFMT0dFKCIlczogTm90IGltcGxlbWVudGVkIHlldC4iLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmRDb25maWd1cmUoKSB7CisgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglenUgc3RyZWFtcykiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RyZWFtTWFwLnNpemUoKSk7CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisKKyAgICByZXR1cm4gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcygpOworfQorCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyAoc3RyZWFtSWQgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwpAQCAtMjU5LDggKzMwMyw2IEBACiAgICAgfSBlbHNlIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgbVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKIAotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgc3RyZWFtIElEICglZCkiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yNzcsNiArMzE5LDEwIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKKyAgICBpZiAoYnVmZmVyUHJvZHVjZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlclByb2R1Y2VyIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKIAogICAgIC8vIERvbid0IGNyZWF0ZSBtdWx0aXBsZSBzdHJlYW1zIGZvciB0aGUgc2FtZSB0YXJnZXQgc3VyZmFjZQpAQCAtMjg0LDcgKzMzMCw3IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoYnVmZmVyUHJvZHVjZXItPmFzQmluZGVyKCkpOwogICAgICAgICBpZiAoaW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBCdWZmZXIgcHJvZHVjZXIgYWxyZWFkeSBoYXMgYSBzdHJlYW0gZm9yIGl0ICIKLSAgICAgICAgICAgICAgICAgICIoSUQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICIoSUQgJXpkKSIsCiAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgICAgICB9CkBAIC0zNDYsMjMgKzM5Miw3IEBACiAgICAgLy8gYWZ0ZXIgZWFjaCBjYWxsLCBidXQgb25seSBvbmNlIHdlIGFyZSBkb25lIHdpdGggYWxsLgogCiAgICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKLSAgICAgICAgLy8gSlBFRyBidWZmZXJzIG5lZWQgdG8gYmUgc2l6ZWQgZm9yIG1heGltdW0gcG9zc2libGUgY29tcHJlc3NlZCBzaXplCi0gICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7Ci0gICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIEpQRUcgc2l6ZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICJzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgbWF4SnBlZ1NpemUgPSBlbnRyeS5kYXRhLmkzMlswXTsKLSAgICAgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBtYXhKcGVnU2l6ZSwKLSAgICAgICAgICAgICAgICAmc3RyZWFtSWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFsbCBvdGhlciBzdHJlYW1zIGFyZSBhIGtub3duIHNpemUKLSAgICAgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAvKnNpemUqLzAsCi0gICAgICAgICAgICAgICAgJnN0cmVhbUlkKTsKLSAgICB9CisgICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAmc3RyZWFtSWQpOwogCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBtU3RyZWFtTWFwLmFkZChidWZmZXJQcm9kdWNlci0+YXNCaW5kZXIoKSwgc3RyZWFtSWQpOwpAQCAtNDY1LDcgKzQ5NSw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Zmx1c2goaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC00NzYsNyArNTA2LDggQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKCk7CisgICAgbVN0cmVhbWluZ1JlcXVlc3RMaXN0LmNsZWFyKCk7CisgICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKQEAgLTQ4NSwyNSArNTE2LDM3IEBACiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDYW1lcmFEZXZpY2VDbGllbnRbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhRGV2aWNlQ2xpZW50WyVkXSAoJXApIGR1bXA6XG4iLAogICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgICAgIG1DbGllbnRQaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOworICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDdXJyZW50IGNsaWVudDogJXMgKFBJRCAlZCwgVUlEICV1KVxuIiwKKyAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKKyAgICAgICAgICAgIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOwogCisgICAgcmVzdWx0LmFwcGVuZCgiICBTdGF0ZTpcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICBSZXF1ZXN0IElEIGNvdW50ZXI6ICVkXG4iLCBtUmVxdWVzdElkQ291bnRlcik7CisgICAgaWYgKCFtU3RyZWFtTWFwLmlzRW1wdHkoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgQ3VycmVudCBzdHJlYW0gSURzOlxuIik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtICVkXG4iLCBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5vIHN0cmVhbXMgY29uZmlndXJlZC5cbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAvLyBUT0RPOiBwcmludCBkeW5hbWljL3JlcXVlc3Qgc2VjdGlvbiBmcm9tIG1vc3QgcmVjZW50IHJlcXVlc3RzCiAgICAgbUZyYW1lUHJvY2Vzc29yLT5kdW1wKGZkLCBhcmdzKTsKIAogICAgIHJldHVybiBkdW1wRGV2aWNlKGZkLCBhcmdzKTsKIH0KIAotCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5RXJyb3IoKSB7Cit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKICAgICAvLyBUaHJlYWQgc2FmZS4gRG9uJ3QgYm90aGVyIGxvY2tpbmcuCiAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKLSAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlRXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CiAKQEAgLTUxNiwxMiArNTU5LDEyIEBACiAgICAgfQogfQogCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLAordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKLSAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgICAgICByZW1vdGVDYi0+b25DYXB0dXJlU3RhcnRlZChyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CiAgICAgfQogfQogCkBAIC01NTYsMTYgKzU5OSwxNCBAQAogfQogCiAvKiogRGV2aWNlLXJlbGF0ZWQgbWV0aG9kcyAqLwotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBmcmFtZSkgewordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIAogICAgIC8vIFRocmVhZC1zYWZlLiBObyBsb2NrIG5lY2Vzc2FyeS4KICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IG1SZW1vdGVDYWxsYmFjazsKICAgICBpZiAocmVtb3RlQ2IgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiJXM6IGZyYW1lID0gJXAgIiwgX19GVU5DVElPTl9fLCAmZnJhbWUpOwotICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXF1ZXN0SWQsIGZyYW1lKTsKKyAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1NZXRhZGF0YSwgcmVzdWx0Lm1SZXN1bHRFeHRyYXMpOwogICAgIH0KIH0KIApAQCAtNjI0LDYxICs2NjUsOCBAQAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZChpbnQzMl90KiB0cmFuc2Zvcm0pIHsKICAgICBBTE9HVigiJXM6IGJlZ2luIiwgX19GVU5DVElPTl9fKTsKIAotICAgIGlmICh0cmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IG51bGwgdHJhbnNmb3JtIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAqdHJhbnNmb3JtID0gMDsKLQogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OKTsKLSAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgInN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpbnQzMl90JiBmbGFncyA9ICp0cmFuc2Zvcm07Ci0KLSAgICBpbnQgb3JpZW50YXRpb24gPSBlbnRyeS5kYXRhLmkzMlswXTsKLSAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGZsYWdzID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgZmxhZ3MgPSBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9ST1RfOTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8xODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBmbGFncyA9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX1JPVF8yNzA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIQUwgYW5kcm9pZC5zZW5zb3Iub3JpZW50YXRpb24gdmFsdWU6ICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWFnaWMgZmxhZyBtYWtlcyBzdXJmYWNlZmxpbmdlciB1bi1yb3RhdGUgdGhlIGJ1ZmZlcnMKLSAgICAgKiB0byBjb3VudGVyIHRoZSBleHRyYSBnbG9iYWwgZGV2aWNlIFVJIHJvdGF0aW9uIHdoZW5ldmVyIHRoZSB1c2VyCi0gICAgICogcGh5c2ljYWxseSByb3RhdGVzIHRoZSBkZXZpY2UuCi0gICAgICoKLSAgICAgKiBCeSBkb2luZyB0aGlzLCB0aGUgY2FtZXJhIGJ1ZmZlciBhbHdheXMgZW5kcyB1cCBhbGlnbmVkCi0gICAgICogd2l0aCB0aGUgcGh5c2ljYWwgY2FtZXJhIGZvciBhICJzZWUgdGhyb3VnaCIgZWZmZWN0LgotICAgICAqCi0gICAgICogSW4gZXNzZW5jZSwgdGhlIGJ1ZmZlciBvbmx5IGdldHMgcm90YXRlZCBkdXJpbmcgcHJldmlldyB1c2UtY2FzZXMuCi0gICAgICogVGhlIHVzZXIgaXMgc3RpbGwgcmVzcG9uc2libGUgdG8gcmUtY3JlYXRlIHN0cmVhbXMgb2YgdGhlIHByb3BlcgotICAgICAqIGFzcGVjdCByYXRpbywgb3IgdGhlIHByZXZpZXcgd2lsbCBlbmQgdXAgbG9va2luZyBub24tdW5pZm9ybWx5Ci0gICAgICogc3RyZXRjaGVkLgotICAgICAqLwotICAgIGZsYWdzIHw9IE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0lOVkVSU0VfRElTUExBWTsKLQotICAgIEFMT0dWKCIlczogZmluYWwgdHJhbnNmb3JtID0gMHgleCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOwotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBDYW1lcmFVdGlsczo6Z2V0Um90YXRpb25UcmFuc2Zvcm0oc3RhdGljSW5mbywgdHJhbnNmb3JtKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggOTlkZjM4Ni4uMWFlYWU2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC02Myw5ICs2MywyMiBAQAogICAgICAqLwogCiAgICAgLy8gTm90ZSB0aGF0IHRoZSBjYWxsZWUgZ2V0cyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhLgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBzdWJtaXRSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjYW5jZWxSZXF1ZXN0KGludCByZXF1ZXN0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgIHN1Ym1pdFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgLy8gTGlzdCBvZiByZXF1ZXN0cyBhcmUgY29waWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGJlZ2luQ29uZmlndXJlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZSgpOwogCiAgICAgLy8gUmV0dXJucyAtRUJVU1kgaWYgZGV2aWNlIGlzIG5vdCBpZGxlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwpAQCAtODksNyArMTAyLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgd2FpdFVudGlsSWRsZSgpOwogCiAgICAgLy8gRmx1c2ggYWxsIGFjdGl2ZSBhbmQgcGVuZGluZyByZXF1ZXN0cyBhcyBmYXN0IGFzIHBvc3NpYmxlCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGZsdXNoKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC0xMTYsMTYgKzEzMCwxNiBAQAogICAgICAqLwogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoKTsKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIENhbWVyYURldmljZUNsaWVudC4KICAgICAgKi8KIHByb3RlY3RlZDoKICAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBkZXRhY2hEZXZpY2UoKTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgQU5hdGl2ZVdpbmRvdyB0cmFuc2Zvcm0gZnJvbSBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggMjcxNTZiMS4uNmFiMjVlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuY3BwCkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgd2luZG93ID0gbmV3IFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIpOwogICAgIH0KIAotICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVTdHJlYW0od2luZG93LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIC8qc2l6ZSovMSwKKyAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlU3RyZWFtKHdpbmRvdywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQpOwogfQogCkBAIC0zNDAsMTEgKzM0MCwxMSBAQAogICAgICAgICAgICAgbUNhbWVyYUlkLAogICAgICAgICAgICAgZ2V0UmVtb3RlQ2FsbGJhY2soKS0+YXNCaW5kZXIoKS5nZXQoKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKICAgICBtRnJhbWVQcm9jZXNzb3ItPmR1bXAoZmQsIGFyZ3MpOwotCiAgICAgcmV0dXJuIGR1bXBEZXZpY2UoZmQsIGFyZ3MpOwogfQogCkBAIC0zNzcsOSArMzc3LDcgQEAKICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6ZGV0YWNoRGV2aWNlKCk7CiB9CiAKLS8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uRnJhbWVBdmFpbGFibGUoaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGZyYW1lKSB7Cit2b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzg3LDEzICszODUsMTIgQEAKICAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKIAogICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAoZnJhbWUpOworICAgICAgICBDYW1lcmFNZXRhZGF0YSB0bXAocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhID0gdG1wLnJlbGVhc2UoKTsKICAgICAgICAgQUxPR1YoIiVzOiBtZXRhID0gJXAgIiwgX19GVU5DVElPTl9fLCBtZXRhKTsKLSAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vblJlc3VsdFJlY2VpdmVkKHJlcXVlc3RJZCwgbWV0YSk7CisgICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG1ldGEpOwogICAgICAgICB0bXAuYWNxdWlyZShtZXRhKTsKICAgICB9Ci0KIH0KIAogYm9vbCBQcm9DYW1lcmEyQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAppbmRleCAxMzdjMjcyLi5mYmQ4NjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKICNpbmNsdWRlICJkZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk5LDggKzEwMCw4IEBACiAKIHByb3RlY3RlZDoKICAgICAvKiogRmlsdGVyZWRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZShpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOworCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRldGFjaERldmljZSgpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggYjZhZDA0Mi4uM2JlNjM5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCkBAIC01MiwxMCArNTQsMTMgQEAKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBUQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAotICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKQorICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKKyAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCkpCiB7Ci0gICAgQUxPR0koIkNhbWVyYSAlZDogT3BlbmVkIiwgY2FtZXJhSWQpOworICAgIEFMT0dJKCJDYW1lcmEgJWQ6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQsCisgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCisgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7CiAgICAgbURldmljZSA9IENhbWVyYURldmljZUZhY3Rvcnk6OmNyZWF0ZURldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KQEAgLTEwOSwxMSArMTE0LDEyIEBACiAKICAgICBUQ2xpZW50QmFzZTo6bURlc3RydWN0aW9uU3RhcnRlZCA9IHRydWU7CiAKLSAgICBUQ2xpZW50QmFzZTo6ZmluaXNoQ2FtZXJhT3BzKCk7Ci0KICAgICBkaXNjb25uZWN0KCk7CiAKLSAgICBBTE9HSSgiQ2xvc2VkIENhbWVyYSAlZCIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQpOworICAgIEFMT0dJKCJDbG9zZWQgQ2FtZXJhICVkLiBDbGllbnQgd2FzOiAlcyAoUElEICVkLCBVSUQgJXUpIiwKKyAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWQsCisgICAgICAgICAgICBTdHJpbmc4KFRDbGllbnRCYXNlOjptQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLAorICAgICAgICAgICAgbUluaXRpYWxDbGllbnRQaWQsIFRDbGllbnRCYXNlOjptQ2xpZW50VWlkKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpAQCAtMjE5LDEwICsyMjUsMTEgQEAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXZvaWQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojpub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBpbnQgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnMikgewotICAgIEFMT0dFKCJFcnJvciBjb25kaXRpb24gJWQgcmVwb3J0ZWQgYnkgSEFMLCBhcmd1bWVudHMgJWQsICVkIiwgZXJyb3JDb2RlLAotICAgICAgICAgIGFyZzEsIGFyZzIpOwordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUVycm9yKAorICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRSgiRXJyb3IgY29uZGl0aW9uICVkIHJlcG9ydGVkIGJ5IEhBTCwgcmVxdWVzdElkICUiIFBSSWQzMiwgZXJyb3JDb2RlLAorICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC0yMzEsMTMgKzIzOCwxMyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Ci12b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5U2h1dHRlcihpbnQgcmVxdWVzdElkLAordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKLSAgICAodm9pZClyZXF1ZXN0SWQ7CisgICAgKHZvaWQpcmVzdWx0RXh0cmFzOwogICAgICh2b2lkKXRpbWVzdGFtcDsKIAotICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJWQgYXQgdGltZSAlbGxkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJSIgUFJJZDMyICIgYXQgdGltZSAlIiBQUklkNjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTI3Nyw2ICsyODQsMTEgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgoraW50IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhRGV2aWNlVmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURldmljZVZlcnNpb247Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+JiBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmdldENhbWVyYURldmljZSgpIHsKICAgICByZXR1cm4gbURldmljZTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggYzEyNzkzYS4uY2ViYjlhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEyQ0xJRU5UX0JBU0VfSAogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYxLDkgKzYyLDExIEBACiAgICAgICogQ2FtZXJhRGV2aWNlQmFzZTo6Tm90aWZpY2F0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KICAgICAgKi8KIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBpbnQgYXJnMSwgaW50IGFyZzIpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoaW50IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lc3RhbXApOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvV2hpdGViYWxhbmNlKHVpbnQ4X3QgbmV3U3RhdGUsCkBAIC03Myw2ICs3Niw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUlkKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYURldmljZSgpOworICAgIGludCAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFEZXZpY2VWZXJzaW9uKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYVNlcnZpY2UoKTsKIApAQCAtMTAzLDYgKzEwNyw5IEBACiAKIHByb3RlY3RlZDoKIAorICAgIC8vIFRoZSBQSUQgcHJvdmlkZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGNhbGwKKyAgICBwaWRfdCBtSW5pdGlhbENsaWVudFBpZDsKKwogICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgewogICAgICAgICByZXR1cm4gSUludGVyZmFjZTo6YXNCaW5kZXIoKTsKICAgICB9CkBAIC0xMTksNiArMTI2LDcgQEAKIAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDIrIGVudHJ5ICovCiAKKyAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247CiAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBlODBhYmYxLi5kMjZlMjBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTIyLDkgKzIyLDEzIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMi5oIgorI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ0LDcgKzQ4LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgPSAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIGRldmljZSdzIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3MgbWV0YWRhdGEgYnVmZmVyCkBAIC01NCwxOSArNTgsMzcgQEAKICAgICAvKioKICAgICAgKiBTdWJtaXQgcmVxdWVzdCBmb3IgY2FwdHVyZS4gVGhlIENhbWVyYURldmljZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICogcGFzc2VkLWluIGJ1ZmZlci4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBmcmFtZSBudW1iZXIgb2YgdGhpcyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cy4KKyAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgbGlzdCBvZiByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIFN1Ym1pdCByZXF1ZXN0IGZvciBzdHJlYW1pbmcuIFRoZSBDYW1lcmFEZXZpY2UgbWFrZXMgYSBjb3B5IG9mIHRoZQogICAgICAqIHBhc3NlZC1pbiBidWZmZXIgYW5kIHRoZSBjYWxsZXIgcmV0YWlucyBvd25lcnNoaXAuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgPSAwOworCisgICAgLyoqCisgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cyBmb3Igc3RyZWFtaW5nLgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgogICAgICAqIENsZWFyIHRoZSBzdHJlYW1pbmcgcmVxdWVzdCBzbG90LgorICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBXYWl0IHVudGlsIGEgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiBJRCBoYXMgYmVlbiBkZXF1ZXVlZCBieSB0aGUKQEAgLTg3LDggKzEwOSw3IEBACiAgICAgICogb3RoZXIgZm9ybWF0cywgdGhlIHNpemUgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCByZXByb2Nlc3Mgc3RyZWFtIHRoYXQgdXNlcyBidWZmZXJzIGZyb20gYW4gZXhpc3RpbmcKQEAgLTEyMCw2ICsxNDEsMTggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpID0gMDsKIAogICAgIC8qKgorICAgICAqIFRha2UgdGhlIGN1cnJlbnRseS1kZWZpbmVkIHNldCBvZiBzdHJlYW1zIGFuZCBjb25maWd1cmUgdGhlIEhBTCB0byB1c2UKKyAgICAgKiB0aGVtLiBUaGlzIGlzIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiAobWF5IGJlIHNldmVyYWwgaHVuZGVyZWQgbXMpLgorICAgICAqCisgICAgICogVGhlIGRldmljZSBtdXN0IGJlIGlkbGUgKHNlZSB3YWl0VW50aWxEcmFpbmVkKSBiZWZvcmUgY2FsbGluZyB0aGlzLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzOyBvdGhlcndpc2Ugb24gZXJyb3I6CisgICAgICogLSBCQURfVkFMVUUgaWYgdGhlIHNldCBvZiBzdHJlYW1zIHdhcyBpbnZhbGlkIChlLmcuIGZtdHMgb3Igc2l6ZXMpCisgICAgICogLSBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgZGV2aWNlIHdhcyBpbiB0aGUgd3Jvbmcgc3RhdGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBDcmVhdGUgYSBtZXRhZGF0YSBidWZmZXIgd2l0aCBmaWVsZHMgdGhhdCB0aGUgSEFMIGRldmljZSBiZWxpZXZlcyBhcmUKICAgICAgKiBiZXN0IGZvciB0aGUgZ2l2ZW4gdXNlIGNhc2UKICAgICAgKi8KQEAgLTEzNCw2ICsxNjcsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbERyYWluZWQoKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBHZXQgSnBlZyBidWZmZXIgc2l6ZSBmb3IgYSBnaXZlbiBqcGVnIHJlc29sdXRpb24uCisgICAgICogTmVnYXRpdmUgdmFsdWVzIGFyZSBlcnJvciBjb2Rlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgPSAwOworCisgICAgLyoqCiAgICAgICogQWJzdHJhY3QgY2xhc3MgZm9yIEhBTCBub3RpZmljYXRpb24gbGlzdGVuZXJzCiAgICAgICovCiAgICAgY2xhc3MgTm90aWZpY2F0aW9uTGlzdGVuZXIgewpAQCAtMTQyLDExICsxODEsMTIgQEAKICAgICAgICAgLy8gQVBJMSBhbmQgQVBJMi4KIAogICAgICAgICAvLyBSZXF1aXJlZCBmb3IgQVBJIDEgYW5kIDIKLSAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIGludCBhcmcxLCBpbnQgYXJnMikgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcykgPSAwOwogCiAgICAgICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTIKICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGludCByZXF1ZXN0SWQsCisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgPSAwOwogCiAgICAgICAgIC8vIFJlcXVpcmVkIG9ubHkgZm9yIEFQSTEKQEAgLTE3OSwxMSArMjE5LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogR2V0IG5leHQgbWV0YWRhdGEgZnJhbWUgZnJvbSB0aGUgZnJhbWUgcXVldWUuIFJldHVybnMgTlVMTCBpZiB0aGUgcXVldWUKLSAgICAgKiBpcyBlbXB0eTsgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyLgotICAgICAqIE1heSBiZSBjYWxsZWQgY29uY3VycmVudGx5IHRvIG1vc3QgbWV0aG9kcywgZXhjZXB0IGZvciB3YWl0Rm9yTmV4dEZyYW1lCisgICAgICogR2V0IG5leHQgY2FwdHVyZSByZXN1bHQgZnJhbWUgZnJvbSB0aGUgcmVzdWx0IHF1ZXVlLiBSZXR1cm5zIE5PVF9FTk9VR0hfREFUQQorICAgICAqIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eTsgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVyIGluc2lkZQorICAgICAqIHRoZSBjYXB0dXJlIHJlc3VsdCBvYmplY3QncyBtZXRhZGF0YSBmaWVsZC4KKyAgICAgKiBNYXkgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSB0byBtb3N0IG1ldGhvZHMsIGV4Y2VwdCBmb3Igd2FpdEZvck5leHRGcmFtZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRGcmFtZShDYW1lcmFNZXRhZGF0YSAqZnJhbWUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpID0gMDsKIAogICAgIC8qKgogICAgICAqIFRyaWdnZXIgYXV0by1mb2N1cy4gVGhlIGxhdGVzdCBJRCB1c2VkIGluIGEgdHJpZ2dlciBhdXRvZm9jdXMgb3IgY2FuY2VsCkBAIC0yMjQsOSArMjY1LDE0IEBACiAgICAgLyoqCiAgICAgICogRmx1c2ggYWxsIHBlbmRpbmcgYW5kIGluLWZsaWdodCByZXF1ZXN0cy4gQmxvY2tzIHVudGlsIGZsdXNoIGlzCiAgICAgICogY29tcGxldGUuCisgICAgICogT3V0cHV0IGxhc3RGcmFtZU51bWJlciBpcyB0aGUgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIHByZXZpb3VzIHN0cmVhbWluZyByZXF1ZXN0LgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEhBTCBkZXZpY2UgdmVyc2lvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKSA9IDA7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcAppbmRleCBmMjA2NGZiLi4yOWViNzhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcApAQCAtMjksNyArMjksMTcgQEAKIAogRnJhbWVQcm9jZXNzb3JCYXNlOjpGcmFtZVByb2Nlc3NvckJhc2Uod3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlKSA6CiAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKLSAgICBtRGV2aWNlKGRldmljZSkgeworICAgIG1EZXZpY2UoZGV2aWNlKSwKKyAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZSAhPSAwICYmCisgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPmdldERldmljZVZlcnNpb24oKSA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9CisgICAgfQogfQogCiBGcmFtZVByb2Nlc3NvckJhc2U6On5GcmFtZVByb2Nlc3NvckJhc2UoKSB7CkBAIC0zNywxMSArNDcsMjMgQEAKIH0KIAogc3RhdHVzX3QgRnJhbWVQcm9jZXNzb3JCYXNlOjpyZWdpc3Rlckxpc3RlbmVyKGludDMyX3QgbWluSWQsCi0gICAgICAgIGludDMyX3QgbWF4SWQsIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHF1aXJrU2VuZFBhcnRpYWxzKSB7CisgICAgICAgIGludDMyX3QgbWF4SWQsIHdwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyLCBib29sIHNlbmRQYXJ0aWFscykgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKKyAgICBMaXN0PFJhbmdlTGlzdGVuZXI+OjppdGVyYXRvciBpdGVtID0gbVJhbmdlTGlzdGVuZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ZW0gIT0gbVJhbmdlTGlzdGVuZXJzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVtLT5taW5JZCA9PSBtaW5JZCAmJgorICAgICAgICAgICAgICAgIGl0ZW0tPm1heElkID09IG1heElkICYmCisgICAgICAgICAgICAgICAgaXRlbS0+bGlzdGVuZXIgPT0gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4KKyAgICAgICAgICAgIEFMT0dWKCIlczogQXR0ZW1wdCB0byByZWdpc3RlciB0aGUgc2FtZSBjbGllbnQgdHdpY2UsIGlnbm9yaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpdGVtKys7CisgICAgfQogICAgIEFMT0dWKCIlczogUmVnaXN0ZXJpbmcgbGlzdGVuZXIgZm9yIGZyYW1lIGlkIHJhbmdlICVkIC0gJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtaW5JZCwgbWF4SWQpOwotICAgIFJhbmdlTGlzdGVuZXIgckxpc3RlbmVyID0geyBtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBxdWlya1NlbmRQYXJ0aWFscyB9OworICAgIFJhbmdlTGlzdGVuZXIgckxpc3RlbmVyID0geyBtaW5JZCwgbWF4SWQsIGxpc3RlbmVyLCBzZW5kUGFydGlhbHMgfTsKICAgICBtUmFuZ2VMaXN0ZW5lcnMucHVzaF9iYWNrKHJMaXN0ZW5lcik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTksMTUgKzEyMSwxNyBAQAogdm9pZCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NOZXdGcmFtZXMoY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogICAgIHN0YXR1c190IHJlczsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lOworICAgIENhcHR1cmVSZXN1bHQgcmVzdWx0OwogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFByb2Nlc3MgbmV3IGZyYW1lcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKIAotICAgIHdoaWxlICggKHJlcyA9IGRldmljZS0+Z2V0TmV4dEZyYW1lKCZmcmFtZSkpID09IE9LKSB7CisgICAgd2hpbGUgKCAocmVzID0gZGV2aWNlLT5nZXROZXh0UmVzdWx0KCZyZXN1bHQpKSA9PSBPSykgewogCisgICAgICAgIC8vIFRPRE86IGluc3RlYWQgb2YgZ2V0dGluZyBmcmFtZSBudW1iZXIgZnJvbSBtZXRhZGF0YSwgd2Ugc2hvdWxkIHJlYWQKKyAgICAgICAgLy8gdGhpcyBmcm9tIHJlc3VsdC5tUmVzdWx0RXh0cmFzIHdoZW4gQ2FtZXJhRGV2aWNlQmFzZSBpbnRlcmZhY2UgaXMgZml4ZWQuCiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogCi0gICAgICAgIGVudHJ5ID0gZnJhbWUuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOworICAgICAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQpOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHJlYWRpbmcgZnJhbWUgbnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwpAQCAtMTE1LDEzICsxMzksMTMgQEAKICAgICAgICAgfQogICAgICAgICBBVFJBQ0VfSU5UKCJjYW0yX2ZyYW1lIiwgZW50cnkuZGF0YS5pMzJbMF0pOwogCi0gICAgICAgIGlmICghcHJvY2Vzc1NpbmdsZUZyYW1lKGZyYW1lLCBkZXZpY2UpKSB7CisgICAgICAgIGlmICghcHJvY2Vzc1NpbmdsZUZyYW1lKHJlc3VsdCwgZGV2aWNlKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWZyYW1lLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIXJlc3VsdC5tTWV0YWRhdGEuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhc3RGcmFtZU11dGV4KTsKLSAgICAgICAgICAgIG1MYXN0RnJhbWUuYWNxdWlyZShmcmFtZSk7CisgICAgICAgICAgICBtTGFzdEZyYW1lLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlcyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKQEAgLTEzMywzMiArMTU3LDQwIEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhbWVyYU1ldGFkYXRhICZmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7Citib29sIEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc1NpbmdsZUZyYW1lKENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSkgewogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBQcm9jZXNzIHNpbmdsZSBmcmFtZSAoaXMgZW1wdHk/ICVkKSIsCi0gICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCksIGZyYW1lLmlzRW1wdHkoKSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NMaXN0ZW5lcnMoZnJhbWUsIGRldmljZSkgPT0gT0s7CisgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCksIHJlc3VsdC5tTWV0YWRhdGEuaXNFbXB0eSgpKTsKKyAgICByZXR1cm4gcHJvY2Vzc0xpc3RlbmVycyhyZXN1bHQsIGRldmljZSkgPT0gT0s7CiB9CiAKLXN0YXR1c190IEZyYW1lUHJvY2Vzc29yQmFzZTo6cHJvY2Vzc0xpc3RlbmVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUsCitzdGF0dXNfdCBGcmFtZVByb2Nlc3NvckJhc2U6OnByb2Nlc3NMaXN0ZW5lcnMoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogCi0gICAgLy8gUXVpcmtzOiBEb24ndCBkZWxpdmVyIHBhcnRpYWwgcmVzdWx0cyB0byBsaXN0ZW5lcnMgdGhhdCBkb24ndCB3YW50IHRoZW0KLSAgICBib29sIHF1aXJrSXNQYXJ0aWFsID0gZmFsc2U7Ci0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKLSAgICBpZiAoZW50cnkuY291bnQgIT0gMCAmJgotICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOb3QgZm9yd2FyZGluZyBwYXJ0aWFsIHJlc3VsdCB0byBsaXN0ZW5lcnMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLT5nZXRJZCgpKTsKLSAgICAgICAgcXVpcmtJc1BhcnRpYWwgPSB0cnVlOworICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHBhcnRpYWwuCisgICAgYm9vbCBpc1BhcnRpYWxSZXN1bHQgPSBmYWxzZTsKKyAgICBpZiAoZGV2aWNlLT5nZXREZXZpY2VWZXJzaW9uKCkgPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgbU51bVBhcnRpYWxSZXN1bHRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGVudHJ5ID0gcmVzdWx0Lm1NZXRhZGF0YS5maW5kKEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ICE9IDAgJiYKKyAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLnU4WzBdID09IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUwpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBUaGlzIGlzIGEgcGFydGlhbCByZXN1bHQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICBpc1BhcnRpYWxSZXN1bHQgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCi0gICAgZW50cnkgPSBmcmFtZS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCk7CisgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBnZXR0aW5nIHJlcXVlc3RJRCBmcm9tIENhbWVyYU1ldGFkYXRhLCB3ZSBzaG91bGQgZ2V0IGl0CisgICAgLy8gZnJvbSBDYXB0dXJlUmVzdWx0RXh0cmFzLiBUaGlzIHdpbGwgcmVxdWlyZSBjaGFuZ2luZyBDYW1lcmEyRGV2aWNlLgorICAgIC8vIEN1cnJlbnRseSBDYW1lcmEyRGV2aWNlIHVzZXMgTWV0YWRhdGFRdWV1ZSB0byBzdG9yZSByZXN1bHRzLCB3aGljaCBkb2VzIG5vdAorICAgIC8vIGluY2x1ZGUgQ2FwdHVyZVJlc3VsdEV4dHJhcy4KKyAgICBlbnRyeSA9IHJlc3VsdC5tTWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOwogICAgIGlmIChlbnRyeS5jb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciByZWFkaW5nIGZyYW1lIGlkIiwgX19GVU5DVElPTl9fLCBkZXZpY2UtPmdldElkKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpbnQzMl90IHJlcXVlc3RJZCA9IGVudHJ5LmRhdGEuaTMyWzBdOwpAQCAtMTY4LDEwICsyMDAsMTAgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwogCiAgICAgICAgIExpc3Q8UmFuZ2VMaXN0ZW5lcj46Oml0ZXJhdG9yIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICAgICAgLy8gRG9uJ3QgZGVsaXZlciBwYXJ0aWFsIHJlc3VsdHMgdG8gbGlzdGVuZXJzIHRoYXQgZG9uJ3Qgd2FudCB0aGVtCiAgICAgICAgIHdoaWxlIChpdGVtICE9IG1SYW5nZUxpc3RlbmVycy5lbmQoKSkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA+PSBpdGVtLT5taW5JZCAmJgotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQgPCBpdGVtLT5tYXhJZCAmJgotICAgICAgICAgICAgICAgICAgICAoIXF1aXJrSXNQYXJ0aWFsIHx8IGl0ZW0tPnF1aXJrU2VuZFBhcnRpYWxzKSApIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPj0gaXRlbS0+bWluSWQgJiYgcmVxdWVzdElkIDwgaXRlbS0+bWF4SWQgJiYKKyAgICAgICAgICAgICAgICAgICAgKCFpc1BhcnRpYWxSZXN1bHQgfHwgaXRlbS0+c2VuZFBhcnRpYWxzKSkgewogICAgICAgICAgICAgICAgIHNwPEZpbHRlcmVkTGlzdGVuZXI+IGxpc3RlbmVyID0gaXRlbS0+bGlzdGVuZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBtUmFuZ2VMaXN0ZW5lcnMuZXJhc2UoaXRlbSk7CkBAIC0xODMsMTAgKzIxNSwxMiBAQAogICAgICAgICAgICAgaXRlbSsrOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dWKCJHb3QgJWQgcmFuZ2UgbGlzdGVuZXJzIG91dCBvZiAlZCIsIGxpc3RlbmVycy5zaXplKCksIG1SYW5nZUxpc3RlbmVycy5zaXplKCkpOworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBHb3QgJXp1IHJhbmdlIGxpc3RlbmVycyBvdXQgb2YgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGRldmljZS0+Z2V0SWQoKSwgbGlzdGVuZXJzLnNpemUoKSwgbVJhbmdlTGlzdGVuZXJzLnNpemUoKSk7CisKICAgICBMaXN0PHNwPEZpbHRlcmVkTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0ZW0gPSBsaXN0ZW5lcnMuYmVnaW4oKTsKICAgICBmb3IgKDsgaXRlbSAhPSBsaXN0ZW5lcnMuZW5kKCk7IGl0ZW0rKykgewotICAgICAgICAoKml0ZW0pLT5vbkZyYW1lQXZhaWxhYmxlKHJlcXVlc3RJZCwgZnJhbWUpOworICAgICAgICAoKml0ZW0pLT5vblJlc3VsdEF2YWlsYWJsZShyZXN1bHQpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKaW5kZXggODliNjA4YS4uYTYxOGQ4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzksMTYgKzQwLDE2IEBACiAgICAgdmlydHVhbCB+RnJhbWVQcm9jZXNzb3JCYXNlKCk7CiAKICAgICBzdHJ1Y3QgRmlsdGVyZWRMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZnJhbWUpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgPSAwOwogICAgIH07CiAKICAgICAvLyBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBhIHJhbmdlIG9mIElEcyBbbWluSWQsIG1heElkKS4gTXVsdGlwbGUgbGlzdGVuZXJzCi0gICAgLy8gY2FuIGJlIGxpc3RlbmluZyB0byB0aGUgc2FtZSByYW5nZS4KLSAgICAvLyBRVUlSSzogc2VuZFBhcnRpYWxzIGNvbnRyb2xzIHdoZXRoZXIgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgc2VudC4KKyAgICAvLyBjYW4gYmUgbGlzdGVuaW5nIHRvIHRoZSBzYW1lIHJhbmdlLiBSZWdpc3RlcmluZyB0aGUgc2FtZSBsaXN0ZW5lciB3aXRoCisgICAgLy8gdGhlIHNhbWUgcmFuZ2Ugb2YgSURzIGhhcyBubyBlZmZlY3QuCisgICAgLy8gc2VuZFBhcnRpYWxzIGNvbnRyb2xzIHdoZXRoZXIgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgc2VudC4KICAgICBzdGF0dXNfdCByZWdpc3Rlckxpc3RlbmVyKGludDMyX3QgbWluSWQsIGludDMyX3QgbWF4SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcXVpcmtTZW5kUGFydGlhbHMgPSB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZFBhcnRpYWxzID0gdHJ1ZSk7CiAgICAgc3RhdHVzX3QgcmVtb3ZlTGlzdGVuZXIoaW50MzJfdCBtaW5JZCwgaW50MzJfdCBtYXhJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAKQEAgLTY2LDE2ICs2NywxOSBAQAogICAgICAgICBpbnQzMl90IG1pbklkOwogICAgICAgICBpbnQzMl90IG1heElkOwogICAgICAgICB3cDxGaWx0ZXJlZExpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICAgICAgYm9vbCBxdWlya1NlbmRQYXJ0aWFsczsKKyAgICAgICAgYm9vbCBzZW5kUGFydGlhbHM7CiAgICAgfTsKICAgICBMaXN0PFJhbmdlTGlzdGVuZXI+IG1SYW5nZUxpc3RlbmVyczsKIAorICAgIC8vIE51bWJlciBvZiBwYXJ0aWFsIHJlc3VsdCB0aGUgSEFMIHdpbGwgcG90ZW50aWFsbHkgc2VuZC4KKyAgICBpbnQzMl90IG1OdW1QYXJ0aWFsUmVzdWx0czsKKwogICAgIHZvaWQgcHJvY2Vzc05ld0ZyYW1lcyhjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAotICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FtZXJhTWV0YWRhdGEgJmZyYW1lLAorICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzU2luZ2xlRnJhbWUoQ2FwdHVyZVJlc3VsdCAmcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKLSAgICBzdGF0dXNfdCBwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZSwKKyAgICBzdGF0dXNfdCBwcm9jZXNzTGlzdGVuZXJzKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICZkZXZpY2UpOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhc3RGcmFtZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCA4N2IyODA3Li42Mzg2ODM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC05Miw4ICs5MiwyMiBAQAogICAgIHN0YXR1c190IGluaXRpYWxpemUoaHdfbW9kdWxlX3QgKm1vZHVsZSkKICAgICB7CiAgICAgICAgIEFMT0dJKCJPcGVuaW5nIGNhbWVyYSAlcyIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgaW50IHJjID0gbW9kdWxlLT5tZXRob2RzLT5vcGVuKG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOworICAgICAgICBjYW1lcmFfbW9kdWxlX3QgKmNhbWVyYU1vZHVsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21vZHVsZV90ICo+KG1vZHVsZSk7CisgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CisgICAgICAgIHN0YXR1c190IHJlcyA9IGNhbWVyYU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGF0b2kobU5hbWUuc3RyaW5nKCkpLCAmaW5mbyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisKKyAgICAgICAgaW50IHJjID0gT0s7CisgICAgICAgIGlmIChtb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMyAmJgorICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgICAgICAvLyBPcGVuIGhpZ2hlciB2ZXJzaW9uIGNhbWVyYSBkZXZpY2UgYXMgSEFMMS4wIGRldmljZS4KKyAgICAgICAgICAgIHJjID0gY2FtZXJhTW9kdWxlLT5vcGVuX2xlZ2FjeShtb2R1bGUsIG1OYW1lLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPm1ldGhvZHMtPm9wZW4oCisgICAgICAgICAgICAgICAgbW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKSk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHJjICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gY2FtZXJhICVzOiAlZCIsIG1OYW1lLnN0cmluZygpLCByYyk7CiAgICAgICAgICAgICByZXR1cm4gcmM7CkBAIC02MTEsOSArNjI1LDE0IEBACiAgICAgc3RhdGljIGludCBfX3NldF9idWZmZXJzX2dlb21ldHJ5KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMqIHcsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KQogICAgIHsKKyAgICAgICAgaW50IHJjOwogICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotICAgICAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworCisgICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKGEsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoIXJjKSB7CisgICAgICAgICAgICByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KGEsIGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAogICAgIHN0YXRpYyBpbnQgX19zZXRfY3JvcChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKaW5kZXggMmJjMWE4YS4uOGNhYWRkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCkBAIC0yNSwxMCArMjUsMTIgQEAKICNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCiAjZW5kaWYKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlICJDYW1lcmEyRGV2aWNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY2LDggKzY4LDggQEAKIAogICAgIGNhbWVyYTJfZGV2aWNlX3QgKmRldmljZTsKIAotICAgIHJlcyA9IG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1vZHVsZS0+Y29tbW9uLCBuYW1lLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAorICAgICAgICAmbW9kdWxlLT5jb21tb24sIG5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCkBAIC0xMTEsMjAgKzExMyw2IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgcmVzID0gZGV2aWNlLT5vcHMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhkZXZpY2UsICZtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LICkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHJldHJpZXZlIHRhZyBvcHMgZnJvbSBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UoJmRldmljZS0+Y29tbW9uKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gc2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhtVmVuZG9yVGFnT3BzKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gc2V0IHRhZyBvcHM6ICVzICglZCkiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSgmZGV2aWNlLT5jb21tb24pOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KICAgICByZXMgPSBkZXZpY2UtPm9wcy0+c2V0X25vdGlmeV9jYWxsYmFjayhkZXZpY2UsIG5vdGlmaWNhdGlvbkNhbGxiYWNrLAogICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMTM2LDYgKzEyNCw3IEBACiAKICAgICBtRGV2aWNlSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgbUhhbDJEZXZpY2UgPSBkZXZpY2U7CisgICAgbURldmljZVZlcnNpb24gPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjEyLDcgKzIwMSw3IEBACiAgICAgcmV0dXJuIG1EZXZpY2VJbmZvOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0yMjAsMTUgKzIwOSwyOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBDYW1lcmEyRGV2aWNlIGJ1cnN0IGNhcHR1cmUgbm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQ2FtZXJhTWV0YWRhdGEgc3RyZWFtUmVxdWVzdChyZXF1ZXN0KTsKICAgICByZXR1cm4gbVJlcXVlc3RRdWV1ZS5zZXRTdHJlYW1TbG90KHN0cmVhbVJlcXVlc3QucmVsZWFzZSgpKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzLCBDYW1lcmEyRGV2aWNlIHN0cmVhbWluZyBidXJzdCBub3QgaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHJldHVybiBtUmVxdWVzdFF1ZXVlLnNldFN0cmVhbVNsb3QoTlVMTCk7CiB9CkBAIC0yMzksMTMgKzI0MiwxNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIHNpemVfdCBzaXplLCBpbnQgKmlkKSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgc3A8U3RyZWFtQWRhcHRlcj4gc3RyZWFtID0gbmV3IFN0cmVhbUFkYXB0ZXIobUhhbDJEZXZpY2UpOwotCisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgIHNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CiAgICAgcmVzID0gc3RyZWFtLT5jb25uZWN0VG9EZXZpY2UoY29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc2l6ZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBzdHJlYW0gKCVkIHggJWQsIGZvcm1hdCAleCk6IgpAQCAtMjYwLDYgKzI2NiwxNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBDYW1lcmEyRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgLy8gQWx3YXlzIGdpdmUgdGhlIG1heCBqcGVnIGJ1ZmZlciBzaXplIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCBqcGVnIHJlc29sdXRpb24uCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGpwZWdCdWZNYXhTaXplID0gbURldmljZUluZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgIGlmIChqcGVnQnVmTWF4U2l6ZS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIG1heGltdW0gSlBFRyBzaXplIGluIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGpwZWdCdWZNYXhTaXplLmRhdGEuaTMyWzBdOworfQorCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMzk4LDYgKzQxNSwxOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvKioKKyAgICAgKiBIQUwyIGRldmljZXMgZG8gbm90IG5lZWQgdG8gY29uZmlndXJlIHN0cmVhbXM7CisgICAgICogc3RyZWFtcyBhcmUgY3JlYXRlZCBvbiB0aGUgZmx5LgorICAgICAqLworICAgIEFMT0dXKCIlczogTm8tb3AgZm9yIEhBTDIgZGV2aWNlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIAogc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSB7CkBAIC00NjEsNyArNDkxLDEzIEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkgewogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19FUlJPUjoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXh0MSwgZXh0MiwgZXh0Myk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBuZWVkcyB0byBiZSBmaXhlZC4gZXh0MiBhbmQgZXh0MyBuZWVkIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgKChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0RFVklDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChleHQxID09IENBTUVSQTJfTVNHX0VSUk9SX0hBUkRXQVJFKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDQU1FUkEyX01TR19TSFVUVEVSOiB7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogT25seSBuZWVkZWQgZm9yIGNhbWVyYTIgQVBJLCB3aGljaCBpcyB1bnN1cHBvcnRlZApAQCAtNDkwLDE2ICs1MjYsMjIgQEAKICAgICByZXR1cm4gbUZyYW1lUXVldWUud2FpdEZvckJ1ZmZlcih0aW1lb3V0KTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0TmV4dFJlc3VsdChDYXB0dXJlUmVzdWx0ICpyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogZ2V0IENhcHR1cmVSZXN1bHQiLCBfX0ZVTkNUSU9OX18pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBwb2ludGVyIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBzdGF0dXNfdCByZXM7CiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJhd0ZyYW1lOwogICAgIHJlcyA9IG1GcmFtZVF1ZXVlLmRlcXVldWUoJnJhd0ZyYW1lKTsKLSAgICBpZiAocmF3RnJhbWUgID09IE5VTEwpIHsKKyAgICBpZiAocmF3RnJhbWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0gZWxzZSBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZyYW1lLT5hY3F1aXJlKHJhd0ZyYW1lKTsKKyAgICAgICAgcmVzdWx0LT5tTWV0YWRhdGEuYWNxdWlyZShyYXdGcmFtZSk7CiAgICAgfQorCiAgICAgcmV0dXJuIHJlczsKIH0KIApAQCAtNTY5LDEzICs2MTEsMTggQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmZsdXNoKGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgbVJlcXVlc3RRdWV1ZS5jbGVhcigpOwogICAgIHJldHVybiB3YWl0VW50aWxEcmFpbmVkKCk7CiB9CiAKK3VpbnQzMl90IENhbWVyYTJEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gbURldmljZVZlcnNpb247Cit9CisKIC8qKgogICogQ2FtZXJhMkRldmljZTo6TWV0YWRhdGFRdWV1ZQogICovCkBAIC04MjIsNyArODY5LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgU3RyZWFtIHNsb3Q6IEVtcHR5XG4iKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtIHNsb3Q6ICVkIGVudHJpZXNcbiIsCisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgIFN0cmVhbSBzbG90OiAlenUgZW50cmllc1xuIiwKICAgICAgICAgICAgICAgICBtU3RyZWFtU2xvdC5zaXplKCkpOwogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGZvciAoTGlzdDxjYW1lcmFfbWV0YWRhdGFfdCo+OjppdGVyYXRvciByID0gbVN0cmVhbVNsb3QuYmVnaW4oKTsKQEAgLTgzNyw3ICs4ODQsNyBAQAogICAgICAgICByZXN1bHQgPSAiICAgICAgTWFpbiBxdWV1ZSBpcyBlbXB0eVxuIjsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBNYWluIHF1ZXVlIGhhcyAlZCBlbnRyaWVzOlxuIiwKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBNYWluIHF1ZXVlIGhhcyAlenUgZW50cmllczpcbiIsCiAgICAgICAgICAgICAgICAgbUVudHJpZXMuc2l6ZSgpKTsKICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICBmb3IgKExpc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPjo6aXRlcmF0b3IgciA9IG1FbnRyaWVzLmJlZ2luKCk7CkBAIC0xMDAwLDcgKzEwNDcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogTmV3IHN0cmVhbSBwYXJhbWV0ZXJzICVkIHggJWQsIGZvcm1hdCAweCV4LCBzaXplICVkIiwKKyAgICBBTE9HVigiJXM6IE5ldyBzdHJlYW0gcGFyYW1ldGVycyAlZCB4ICVkLCBmb3JtYXQgMHgleCwgc2l6ZSAlenUiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHNpemUpOwogCiAgICAgbUNvbnN1bWVySW50ZXJmYWNlID0gY29uc3VtZXI7CkBAIC0xMDY4LDI1ICsxMTE1LDMzIEBACiAgICAgfQogCiAgICAgaWYgKG1Gb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgIG1TaXplLCAxLCBtRm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lckludGVyZmFjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICBtU2l6ZSwgMSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBjb21wcmVzc2VkIHN0cmVhbSBidWZmZXIgZ2VvbWV0cnkiCi0gICAgICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgc2l6ZSAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBjb21wcmVzc2VkIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkLCBzaXplICV6dSBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtV2lkdGgsIG1IZWlnaHQsIG1TaXplLCBtSWQpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCk7CisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZ2VvbWV0cnkiCi0gICAgICAgICAgICAgICAgICAgICIgJWQgeCAlZCwgZm9ybWF0IDB4JXggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtSWQpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAgICAgIiAlZCB4ICVkIGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1XaWR0aCwgbUhlaWdodCwgbUlkKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXJJbnRlcmZhY2UuZ2V0KCksIG1Gb3JtYXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0IgorICAgICAgICAgICAgICAgICIgJSN4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUZvcm1hdCwgbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOwogICAgIHJlcyA9IG1Db25zdW1lckludGVyZmFjZS0+cXVlcnkobUNvbnN1bWVySW50ZXJmYWNlLmdldCgpLAogICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLCAmbWF4Q29uc3VtZXJCdWZmZXJzKTsKQEAgLTEyMTQsMTEgKzEyNjksMTEgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIFN0cmluZzggcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICAgICBTdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAweCV4XG4iLAogICAgICAgICAgICAgbUlkLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgc2l6ZSAlZCwgdXNhZ2UgMHgleCwgcmVxdWVzdGVkIGZvcm1hdCAweCV4XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgc2l6ZSAlenUsIHVzYWdlIDB4JXgsIHJlcXVlc3RlZCBmb3JtYXQgMHgleFxuIiwKICAgICAgICAgICAgIG1TaXplLCBtVXNhZ2UsIG1Gb3JtYXRSZXF1ZXN0ZWQpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgdG90YWwgYnVmZmVyczogJWQsIGRlcXVldWVkIGJ1ZmZlcnM6ICVkXG4iLAogICAgICAgICAgICAgbVRvdGFsQnVmZmVycywgbUFjdGl2ZUJ1ZmZlcnMpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgZnJhbWUgY291bnQ6ICVkLCBsYXN0IHRpbWVzdGFtcCAlbGxkXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICAgZnJhbWUgY291bnQ6ICVkLCBsYXN0IHRpbWVzdGFtcCAlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAppbmRleCAxZjUzYzU2Li4yYTNmMWQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaApAQCAtNDcsMzggKzQ3LDQ4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxSZXF1ZXN0UmVjZWl2ZWQoaW50MzJfdCByZXF1ZXN0SWQsIG5zZWNzX3QgdGltZW91dCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1JbmZvKGludCBpZCwKICAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1UcmFuc2Zvcm0oaW50IGlkLCBpbnQgdHJhbnNmb3JtKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CisgICAgLy8gTm8tb3Agb24gSEFMMiBkZXZpY2VzCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgIHdpbGxOb3RpZnkzQSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd2FpdEZvck5leHRGcmFtZShuc2Vjc190IHRpbWVvdXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEZyYW1lKENhbWVyYU1ldGFkYXRhICpmcmFtZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJBdXRvZm9jdXModWludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHJpZ2dlckNhbmNlbEF1dG9mb2N1cyh1aW50MzJfdCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyUHJlY2FwdHVyZU1ldGVyaW5nKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHB1c2hSZXByb2Nlc3NCdWZmZXIoaW50IHJlcHJvY2Vzc1N0cmVhbUlkLAogICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHdwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IGxpc3RlbmVyKTsKICAgICAvLyBGbHVzaCBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgd2FpdAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpOworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKKwogICBwcml2YXRlOgogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY2FtZXJhMl9kZXZpY2VfdCAqbUhhbDJEZXZpY2U7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtRGV2aWNlSW5mbzsKLSAgICB2ZW5kb3JfdGFnX3F1ZXJ5X29wc190ICptVmVuZG9yVGFnT3BzOworCisgICAgdWludDMyX3QgbURldmljZVZlcnNpb247CiAKICAgICAvKioKICAgICAgKiBRdWV1ZSBjbGFzcyBmb3IgYm90aCBzZW5kaW5nIHJlcXVlc3RzIHRvIGEgY2FtZXJhMiBkZXZpY2UsIGFuZCBmb3IKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDdlZWYwOTQuLjUxZDUzZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMzcsNiArMzcsOCBAQAogICAgICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgICAgICAgICAgICAgICAgICAgIFwKICAgICAjI19fVkFfQVJHU19fKQogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CkBAIC00Nyw2ICs0OSw4IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgorI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CiAKQEAgLTU2LDcgKzYwLDggQEAKICAgICAgICAgbUlkKGlkKSwKICAgICAgICAgbUhhbDNEZXZpY2UoTlVMTCksCiAgICAgICAgIG1TdGF0dXMoU1RBVFVTX1VOSU5JVElBTElaRUQpLAotICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrKGZhbHNlKSwKKyAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQoZmFsc2UpLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCiAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCkKQEAgLTEwMSw4ICsxMDYsMTEgQEAKIAogICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZTsKIAotICAgIHJlcyA9IG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1vZHVsZS0+Y29tbW9uLCBkZXZpY2VOYW1lLnN0cmluZygpLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSk7CisgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5vcGVuIik7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAorICAgICAgICAmbW9kdWxlLT5jb21tb24sIGRldmljZU5hbWUuc3RyaW5nKCksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKKyAgICBBVFJBQ0VfRU5EKCk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IG9wZW4gY2FtZXJhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMTAsMTAgKzExOCw5IEBACiAgICAgfQogCiAgICAgLyoqIENyb3NzLWNoZWNrIGRldmljZSB2ZXJzaW9uICovCi0KLSAgICBpZiAoZGV2aWNlLT5jb21tb24udmVyc2lvbiAhPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgIGlmIChkZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmE6ICIKLSAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBpcyBub3QgdmVyc2lvbiAleCwgcmVwb3J0cyAleCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBzaG91bGQgYmUgYXQgbGVhc3QgJXgsIHJlcG9ydHMgJXggaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAsCiAgICAgICAgICAgICAgICAgZGV2aWNlLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7CkBAIC0xMjEsMTMgKzEyOCwxNCBAQAogICAgIH0KIAogICAgIGNhbWVyYV9pbmZvIGluZm87Ci0gICAgcmVzID0gbW9kdWxlLT5nZXRfY2FtZXJhX2luZm8obUlkLCAmaW5mbyk7CisgICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtb2R1bGUtPmdldF9jYW1lcmFfaW5mbygKKyAgICAgICAgbUlkLCAmaW5mbykpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBpZiAoaW5mby5kZXZpY2VfdmVyc2lvbiAhPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiSEFMIHJlcG9ydGluZyBtaXNtYXRjaGVkIGNhbWVyYV9pbmZvIHZlcnNpb24gKCV4KSIKICAgICAgICAgICAgICAgICAiIGFuZCBkZXZpY2UgdmVyc2lvbiAoJXgpLiIsCi0gICAgICAgICAgICAgICAgZGV2aWNlLT5jb21tb24udmVyc2lvbiwgaW5mby5kZXZpY2VfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgaW5mby5kZXZpY2VfdmVyc2lvbiwgZGV2aWNlLT5jb21tb24udmVyc2lvbik7CiAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTQ1LDI0ICsxNTMsNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8qKiBHZXQgdmVuZG9yIG1ldGFkYXRhIHRhZ3MgKi8KLQotICAgIG1WZW5kb3JUYWdPcHMuZ2V0X2NhbWVyYV92ZW5kb3Jfc2VjdGlvbl9uYW1lID0gTlVMTDsKLQotICAgIEFUUkFDRV9CRUdJTigiY2FtZXJhMy0+Z2V0X21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzIik7Ci0gICAgZGV2aWNlLT5vcHMtPmdldF9tZXRhZGF0YV92ZW5kb3JfdGFnX29wcyhkZXZpY2UsICZtVmVuZG9yVGFnT3BzKTsKLSAgICBBVFJBQ0VfRU5EKCk7Ci0KLSAgICBpZiAobVZlbmRvclRhZ09wcy5nZXRfY2FtZXJhX3ZlbmRvcl9zZWN0aW9uX25hbWUgIT0gTlVMTCkgewotICAgICAgICByZXMgPSBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl90YWdfb3BzKCZtVmVuZG9yVGFnT3BzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc2V0IHRhZyBvcHM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIGRldmljZS0+Y29tbW9uLmNsb3NlKCZkZXZpY2UtPmNvbW1vbik7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqIFN0YXJ0IHVwIHN0YXR1cyB0cmFja2VyIHRocmVhZCAqLwogICAgIG1TdGF0dXNUcmFja2VyID0gbmV3IFN0YXR1c1RyYWNrZXIodGhpcyk7CiAgICAgcmVzID0gbVN0YXR1c1RyYWNrZXItPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVkLVN0YXR1cyIsIG1JZCkuc3RyaW5nKCkpOwpAQCAtMTg4LDIwICsxNzgsMjkgQEAKIAogICAgIC8qKiBFdmVyeXRoaW5nIGlzIGdvb2QgdG8gZ28gKi8KIAorICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlLT5jb21tb24udmVyc2lvbjsKICAgICBtRGV2aWNlSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgbUhhbDNEZXZpY2UgPSBkZXZpY2U7CiAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CiAgICAgbU5leHRTdHJlYW1JZCA9IDA7CisgICAgbUR1bW15U3RyZWFtSWQgPSBOT19TVFJFQU07CiAgICAgbU5lZWRDb25maWcgPSB0cnVlOwogICAgIG1QYXVzZVN0YXRlTm90aWZ5ID0gZmFsc2U7CiAKLSAgICAvKiogQ2hlY2sgZm9yIHF1aXJrcyAqLwotCiAgICAgLy8gV2lsbCB0aGUgSEFMIGJlIHNlbmRpbmcgaW4gZWFybHkgcGFydGlhbCByZXN1bHQgbWV0YWRhdGE/Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBhcnRpYWxSZXN1bHRzUXVpcmsgPQotICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQpOwotICAgIGlmIChwYXJ0aWFsUmVzdWx0c1F1aXJrLmNvdW50ID4gMCAmJiBwYXJ0aWFsUmVzdWx0c1F1aXJrLmRhdGEudThbMF0gPT0gMSkgewotICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrID0gdHJ1ZTsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBhcnRpYWxSZXN1bHRzQ291bnQgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX1BBUlRJQUxfUkVTVUxUX0NPVU5UKTsKKyAgICAgICAgaWYgKHBhcnRpYWxSZXN1bHRzQ291bnQuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMgPSBwYXJ0aWFsUmVzdWx0c0NvdW50LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSAobU51bVBhcnRpYWxSZXN1bHRzID4gMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgcGFydGlhbFJlc3VsdHNRdWlyayA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1FVSVJLU19VU0VfUEFSVElBTF9SRVNVTFQpOworICAgICAgICBpZiAocGFydGlhbFJlc3VsdHNRdWlyay5jb3VudCA+IDAgJiYgcGFydGlhbFJlc3VsdHNRdWlyay5kYXRhLnU4WzBdID09IDEpIHsKKyAgICAgICAgICAgIG1Vc2VQYXJ0aWFsUmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTI3MCw3ICsyNjksOSBAQAogICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOwogCiAgICAgICAgIGlmIChtSGFsM0RldmljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmNsb3NlIik7CiAgICAgICAgICAgICBtSGFsM0RldmljZS0+Y29tbW9uLmNsb3NlKCZtSGFsM0RldmljZS0+Y29tbW9uKTsKKyAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgIG1IYWwzRGV2aWNlID0gTlVMTDsKICAgICAgICAgfQogCkBAIC0yOTcsNiArMjk4LDg1IEBACiAgICAgcmV0dXJuIGdvdExvY2s7CiB9CiAKK0NhbWVyYTNEZXZpY2U6OlNpemUgQ2FtZXJhM0RldmljZTo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24oKSBjb25zdCB7CisgICAgaW50MzJfdCBtYXhKcGVnV2lkdGggPSAwLCBtYXhKcGVnSGVpZ2h0ID0gMDsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDE7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAorICAgICAgICAgICAgICAgIGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgJSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTaXplKDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCisgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgICAgICBpZiAoaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVAorICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CICYmCisgICAgICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgbWF4SnBlZ0hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVKcGVnU2l6ZXMgPQorICAgICAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0pQRUdfU0laRVMpOworICAgICAgICBpZiAoYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50ID09IDAgfHwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50ICUgMiAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU2l6ZSgwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUpwZWdTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpXSAqIGF2YWlsYWJsZUpwZWdTaXplcy5kYXRhLmkzMltpICsgMV0pCisgICAgICAgICAgICAgICAgICAgID4gKG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTaXplKG1heEpwZWdXaWR0aCwgbWF4SnBlZ0hlaWdodCk7Cit9CisKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpLgorICAgIFNpemUgbWF4SnBlZ1Jlc29sdXRpb24gPSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpOworICAgIGlmIChtYXhKcGVnUmVzb2x1dGlvbi53aWR0aCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGZpbmQgdmFsaWQgYXZhaWxhYmxlIGpwZWcgc2l6ZXMgaW4gc3RhdGljIG1ldGFkYXRhISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEdldCBtYXgganBlZyBidWZmZXIgc2l6ZQorICAgIHNzaXplX3QgbWF4SnBlZ0J1ZmZlclNpemUgPSAwOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBqcGVnQnVmTWF4U2l6ZSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKKyAgICBpZiAoanBlZ0J1Zk1heFNpemUuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIEpQRUcgc2l6ZSBpbiBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtYXhKcGVnQnVmZmVyU2l6ZSA9IGpwZWdCdWZNYXhTaXplLmRhdGEuaTMyWzBdOworCisgICAgLy8gQ2FsY3VsYXRlIGZpbmFsIGpwZWcgYnVmZmVyIHNpemUgZm9yIHRoZSBnaXZlbiByZXNvbHV0aW9uLgorICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gKChmbG9hdCkgKHdpZHRoICogaGVpZ2h0KSkgLworICAgICAgICAgICAgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoICogbWF4SnBlZ1Jlc29sdXRpb24uaGVpZ2h0KTsKKyAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gc2NhbGVGYWN0b3IgKiBtYXhKcGVnQnVmZmVyU2l6ZTsKKyAgICAvLyBCb3VuZCB0aGUgYnVmZmVyIHNpemUgdG8gW01JTl9KUEVHX0JVRkZFUl9TSVpFLCBtYXhKcGVnQnVmZmVyU2l6ZV0uCisgICAgaWYgKGpwZWdCdWZmZXJTaXplID4gbWF4SnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAganBlZ0J1ZmZlclNpemUgPSBtYXhKcGVnQnVmZmVyU2l6ZTsKKyAgICB9IGVsc2UgaWYgKGpwZWdCdWZmZXJTaXplIDwga01pbkpwZWdCdWZmZXJTaXplKSB7CisgICAgICAgIGpwZWdCdWZmZXJTaXplID0ga01pbkpwZWdCdWZmZXJTaXplOworICAgIH0KKworICAgIHJldHVybiBqcGVnQnVmZmVyU2l6ZTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgICh2b2lkKWFyZ3M7CkBAIC0zNDYsNyArNDI2LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0IHIgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlbGxkLCBtZXRhZGF0YSIKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCiAgICAgICAgICAgICAgICAgICAgICIgYXJyaXZlZDogJXMsIGJ1ZmZlcnMgbGVmdDogJWRcbiIsIG1JbkZsaWdodE1hcC5rZXlBdChpKSwKICAgICAgICAgICAgICAgICAgICAgci5jYXB0dXJlVGltZXN0YW1wLCByLmhhdmVSZXN1bHRNZXRhZGF0YSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgICAgICAgICAgICAgIHIubnVtQnVmZmVyc0xlZnQpOwpAQCAtMzg1LDE0ICs0NjUsNyBAQAogICAgIHJldHVybiBtRGV2aWNlSW5mbzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotCi0gICAgLy8gVE9ETzogdGFrZSBvd25lcnNoaXAgb2YgdGhlIHJlcXVlc3QKLQorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKICAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6CiAgICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKQEAgLTQwMSw3ICs0NzQsNiBAQAogICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgY2FzZSBTVEFUVVNfVU5DT05GSUdVUkVEOgotICAgICAgICAgICAgLy8gTWF5IGJlIGxhemlseSBjb25maWd1cmluZyBzdHJlYW1zLCB3aWxsIGNoZWNrIGR1cmluZyBzZXR1cAogICAgICAgICBjYXNlIFNUQVRVU19DT05GSUdVUkVEOgogICAgICAgICBjYXNlIFNUQVRVU19BQ1RJVkU6CiAgICAgICAgICAgICAvLyBPSwpAQCAtNDEwLDcxICs0ODIsMTE5IEBACiAgICAgICAgICAgICBTRVRfRVJSX0woIlVuZXhwZWN0ZWQgc3RhdHVzOiAlZCIsIG1TdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CiAKLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZChyZXF1ZXN0KTsKLSAgICBpZiAobmV3UmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgY2FwdHVyZSByZXF1ZXN0Iik7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKKyAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJm1ldGFkYXRhTGlzdCwgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KSB7CisgICAgaWYgKHJlcXVlc3RMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgQ0xPR0UoInJlcXVlc3RMaXN0IGNhbm5vdCBiZSBOVUxMLiIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVJlcXVlc3QobmV3UmVxdWVzdCk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAotICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOworICAgIGludDMyX3QgYnVyc3RJZCA9IDA7CisgICAgZm9yIChMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXRhZGF0YUxpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1ldGFkYXRhTGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZCgqaXQpOworICAgICAgICBpZiAobmV3UmVxdWVzdCA9PSAwKSB7CisgICAgICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgZW5xdWV1ZWQiLCBtSWQpOworCisgICAgICAgIC8vIFNldHVwIGJ1cnN0IElkIGFuZCByZXF1ZXN0IElkCisgICAgICAgIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGJ1cnN0SWQrKzsKKyAgICAgICAgaWYgKGl0LT5leGlzdHMoQU5EUk9JRF9SRVFVRVNUX0lEKSkgeworICAgICAgICAgICAgaWYgKGl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZW50cnkgZXhpc3RzOyBidXQgbXVzdCBub3QgYmUgZW1wdHkgaW4gbWV0YWRhdGEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBpdC0+ZmluZChBTkRST0lEX1JFUVVFU1RfSUQpLmRhdGEuaTMyWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3RJRCBkb2VzIG5vdCBleGlzdCBpbiBtZXRhZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RMaXN0LT5wdXNoX2JhY2sobmV3UmVxdWVzdCk7CisKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgPSAlIiBQUklkMzIsIF9fRlVOQ1RJT05fXywgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogICAgIH0KLSAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBPSzsKIH0KIAotCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzSGVscGVyKAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICAvKm91dCovCisgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKLSAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5JTklUSUFMSVpFRDoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2Ugbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKLSAgICAgICAgICAgIC8vIE1heSBiZSBsYXppbHkgY29uZmlndXJpbmcgc3RyZWFtcywgd2lsbCBjaGVjayBkdXJpbmcgc2V0dXAKLSAgICAgICAgY2FzZSBTVEFUVVNfQ09ORklHVVJFRDoKLSAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgotICAgICAgICAgICAgLy8gT0sKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmV4cGVjdGVkIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBlcnJvciBsb2dnZWQgYnkgcHJldmlvdXMgY2FsbAorICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBuZXdSZXBlYXRpbmdSZXF1ZXN0ID0gc2V0VXBSZXF1ZXN0TG9ja2VkKHJlcXVlc3QpOwotICAgIGlmIChuZXdSZXBlYXRpbmdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgQ0xPR0UoIkNhbid0IGNyZWF0ZSByZXBlYXRpbmcgcmVxdWVzdCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIFJlcXVlc3RMaXN0IHJlcXVlc3RMaXN0OworCisgICAgcmVzID0gY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQocmVxdWVzdHMsIC8qb3V0Ki8mcmVxdWVzdExpc3QpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gZXJyb3IgbG9nZ2VkIGJ5IHByZXZpb3VzIGNhbGwKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBSZXF1ZXN0TGlzdCBuZXdSZXBlYXRpbmdSZXF1ZXN0czsKLSAgICBuZXdSZXBlYXRpbmdSZXF1ZXN0cy5wdXNoX2JhY2sobmV3UmVwZWF0aW5nUmVxdWVzdCk7CisgICAgaWYgKHJlcGVhdGluZykgeworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQogCi0gICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnNldFJlcGVhdGluZ1JlcXVlc3RzKG5ld1JlcGVhdGluZ1JlcXVlc3RzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygvKmFjdGl2ZSovIHRydWUsIGtBY3RpdmVUaW1lb3V0KTsKKyAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi90cnVlLCBrQWN0aXZlVGltZW91dCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAogICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFJlcGVhdGluZyByZXF1ZXN0IHNldCIsIG1JZCk7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCAlIiBQUklkMzIgIiBlbnF1ZXVlZCIsIG1JZCwKKyAgICAgICAgICAgICAgKCoocmVxdWVzdExpc3QuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0xPR0UoIkNhbm5vdCBxdWV1ZSByZXF1ZXN0LiBJbXBvc3NpYmxlLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi9mYWxzZSwgbGFzdEZyYW1lTnVtYmVyKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogLypsYXN0RnJhbWVOdW1iZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiByZXF1ZXN0czsKKyAgICByZXF1ZXN0cy5wdXNoX2JhY2socmVxdWVzdCk7CisgICAgcmV0dXJuIHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KHJlcXVlc3RzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIC8qcmVwZWF0aW5nKi90cnVlLCBsYXN0RnJhbWVOdW1iZXIpOworfQogCiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gQ2FtZXJhM0RldmljZTo6c2V0VXBSZXF1ZXN0TG9ja2VkKAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCkgewpAQCAtNDgyLDEwICs2MDIsMTggQEAKIAogICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQgfHwgbU5lZWRDb25maWcpIHsKICAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOworICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQgZHVlIHRvIHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIC8vIERldmljZSBiYWNrIHRvIHVuY29uZmlndXJlZCBzdGF0ZS4gQ2xpZW50IG1pZ2h0IHRyeSBvdGhlciBjb25maWd1cmFpdG9ucworICAgICAgICBpZiAocmVzID09IEJBRF9WQUxVRSAmJiBtU3RhdHVzID09IFNUQVRVU19VTkNPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgIENMT0dFKCJObyBzdHJlYW1zIGNvbmZpZ3VyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCBmb3Igb3RoZXIgcmVhc29uLiBGYXRhbC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBzZXQgdXAgc3RyZWFtczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICAgICAgLy8gU3RyZWFtIGNvbmZpZ3VyYXRpb24gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZSB0byBlbXB0eSBzdHJlYW0gY29uZmlndXJhdGlvbi4KICAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCkgewogICAgICAgICAgICAgQ0xPR0UoIk5vIHN0cmVhbXMgY29uZmlndXJlZCIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00OTYsNyArNjI0LDcgQEAKICAgICByZXR1cm4gbmV3UmVxdWVzdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC01MTgsNyArNjQ2LDggQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgQUxPR1YoIkNhbWVyYSAlZDogQ2xlYXJpbmcgcmVwZWF0aW5nIHJlcXVlc3QiLCBtSWQpOwotICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpOworCisgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KSB7CkBAIC02NTMsNiArNzgyLDggQEAKICAgICB9CiAgICAgbUlucHV0U3RyZWFtID0gbmV3U3RyZWFtOwogCisgICAgbU5lZWRDb25maWcgPSB0cnVlOworCiAgICAgKmlkID0gbU5leHRTdHJlYW1JZCsrOwogICAgICp6c2xTdHJlYW0gPSBuZXdTdHJlYW07CiAKQEAgLTY3MywxMiArODA0LDEyIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgc2l6ZV90IHNpemUsIGludCAqaWQpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgQUxPR1YoIkNhbWVyYSAlZDogQ3JlYXRpbmcgbmV3IHN0cmVhbSAlZDogJWQgeCAlZCwgZm9ybWF0ICVkLCBzaXplICVkIiwKLSAgICAgICAgICAgIG1JZCwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBzaXplKTsKKyAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC03MTEsOCArODQyLDE0IEBACiAKICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBuZXdTdHJlYW07CiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgc3NpemVfdCBqcGVnQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoanBlZ0J1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwganBlZ0J1ZmZlclNpemUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHNpemUsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwganBlZ0J1ZmZlclNpemUsIGZvcm1hdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXIsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKQEAgLTgzNywxNiArOTc0LDIwIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKICAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICB9CisKKyAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCisgICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKICAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CiAgICAgfQogCkBAIC04NzAsNiArMTAxMSwxNSBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29uZmlndXJlU3RyZWFtcygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHJldHVybiBjb25maWd1cmVTdHJlYW1zTG9ja2VkKCk7Cit9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgewpAQCAtOTAyLDYgKzEwNTIsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoIW1SZXF1ZXN0VGVtcGxhdGVDYWNoZVt0ZW1wbGF0ZUlkXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgKnJlcXVlc3QgPSBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF07CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3UmVxdWVzdDsKICAgICBBVFJBQ0VfQkVHSU4oImNhbWVyYTMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MiKTsKICAgICByYXdSZXF1ZXN0ID0gbUhhbDNEZXZpY2UtPm9wcy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncygKQEAgLTkxMyw2ICsxMDY4LDcgQEAKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICAqcmVxdWVzdCA9IHJhd1JlcXVlc3Q7CisgICAgbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW3RlbXBsYXRlSWRdID0gcmF3UmVxdWVzdDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTkyMiw2ICsxMDc4LDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICByZXR1cm4gd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp3YWl0VW50aWxEcmFpbmVkTG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXR1cykgewogICAgICAgICBjYXNlIFNUQVRVU19VTklOSVRJQUxJWkVEOgogICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6CkBAIC05NDAsNiArMTEwMCwxMCBAQAogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdW50aWwgaWRsZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICBzdGF0dXNfdCByZXMgPSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyBmYWxzZSwga1NodXRkb3duVGltZW91dCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSX0woIkVycm9yIHdhaXRpbmcgZm9yIEhBTCB0byBkcmFpbjogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgfQogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTEwMDksNiArMTE3Myw3IEBACiAgICAgICAgIEFMT0dXKCIlczogUmVwbGFjaW5nIG9sZCBjYWxsYmFjayBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXROb3RpZnlDYWxsYmFjayhsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMDI2LDcgKzExOTEsNyBAQAogICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBObyBmcmFtZSBpbiAlbGxkIG5zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBObyBmcmFtZSBpbiAlIiBQUklkNjQgIiBuczogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0aW1lb3V0LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTEwMzQsNyArMTE5OSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXROZXh0UmVzdWx0KENhcHR1cmVSZXN1bHQgKmZyYW1lKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKQEAgLTEwNDIsOCArMTIwNywxNCBAQAogICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhICZyZXN1bHQgPSAqKG1SZXN1bHRRdWV1ZS5iZWdpbigpKTsKLSAgICBmcmFtZS0+YWNxdWlyZShyZXN1bHQpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogYXJndW1lbnQgY2Fubm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIENhcHR1cmVSZXN1bHQgJnJlc3VsdCA9ICoobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOworICAgIGZyYW1lLT5tUmVzdWx0RXh0cmFzID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXM7CisgICAgZnJhbWUtPm1NZXRhZGF0YS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOwogICAgIG1SZXN1bHRRdWV1ZS5lcmFzZShtUmVzdWx0UXVldWUuYmVnaW4oKSk7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMDYzLDcgKzEyMzQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMDg0LDcgKzEyNTUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMTA1LDcgKzEyNzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGlkKQotICAgICAgICB9LAorICAgICAgICB9CiAgICAgfTsKIAogICAgIHJldHVybiBtUmVxdWVzdFRocmVhZC0+cXVldWVUcmlnZ2VyKHRyaWdnZXIsCkBAIC0xMTIxLDE0ICsxMjkyLDM3IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmbHVzaCgpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZsdXNoKGludDY0X3QgKmZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRmx1c2hpbmcgYWxsIHJlcXVlc3RzIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKCk7Ci0gICAgcmV0dXJuIG1IYWwzRGV2aWNlLT5vcHMtPmZsdXNoKG1IYWwzRGV2aWNlKTsKKyAgICBOb3RpZmljYXRpb25MaXN0ZW5lciogbGlzdGVuZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgIGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIobGlzdGVuZXIsIC8qb3V0Ki9mcmFtZU51bWJlcik7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmIChtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzEpIHsKKyAgICAgICAgcmVzID0gbUhhbDNEZXZpY2UtPm9wcy0+Zmx1c2gobUhhbDNEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgcmVzID0gd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IENhbWVyYTNEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIHJldHVybiBtRGV2aWNlVmVyc2lvbjsKIH0KIAogLyoqCkBAIC0xMjUyLDYgKzE0NDYsMTUgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIC8vIFdvcmthcm91bmQgZm9yIGRldmljZSBIQUx2My4yIG9yIG9sZGVyIHNwZWMgYnVnIC0gemVybyBzdHJlYW1zIHJlcXVpcmVzCisgICAgLy8gYWRkaW5nIGEgZHVtbXkgc3RyZWFtIGluc3RlYWQuCisgICAgLy8gVE9ETzogQnVnOiAxNzMyMTQwNCBmb3IgZml4aW5nIHRoZSBIQUwgc3BlYyBhbmQgcmVtb3ZpbmcgdGhpcyB3b3JrYXJvdW5kLgorICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBhZGREdW1teVN0cmVhbUxvY2tlZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyeVJlbW92ZUR1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgfQorCiAgICAgLy8gU3RhcnQgY29uZmlndXJpbmcgdGhlIHN0cmVhbXMKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAKQEAgLTEyOTksNyArMTUwMiw0MiBAQAogICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG1IYWwzRGV2aWNlLCAmY29uZmlnKTsKICAgICBBVFJBQ0VfRU5EKCk7CiAKLSAgICBpZiAocmVzICE9IE9LKSB7CisgICAgaWYgKHJlcyA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgLy8gSEFMIHJlamVjdGVkIHRoaXMgc2V0IG9mIHN0cmVhbXMgYXMgdW5zdXBwb3J0ZWQsIGNsZWFuIHVwIGNvbmZpZworICAgICAgICAvLyBhdHRlbXB0IGFuZCByZXR1cm4gdG8gdW5jb25maWd1cmVkIHN0YXRlCisgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBtSW5wdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgeworICAgICAgICAgICAgcmVzID0gbUlucHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBjYW5jZWwgY29uZmlndXJpbmcgaW5wdXQgc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7CisgICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY2FuY2VsIGNvbmZpZ3VyaW5nIG91dHB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5nZXRJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gc3RhdGUgdG8gdGhhdCBhdCBzdGFydCBvZiBjYWxsLCBzbyB0aGF0IGZ1dHVyZSBjb25maWd1cmVzCisgICAgICAgIC8vIHByb3Blcmx5IGNsZWFuIHRoaW5ncyB1cAorICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOQ09ORklHVVJFRDsKKyAgICAgICAgbU5lZWRDb25maWcgPSB0cnVlOworCisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU29tZSBvdGhlciBraW5kIG9mIGVycm9yIGZyb20gY29uZmlndXJlX3N0cmVhbXMgLSB0aGlzIGlzIG5vdAorICAgICAgICAvLyBleHBlY3RlZAogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtcyB3aXRoIEhBTDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0xMzM5LDcgKzE1NzcsNyBAQAogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIAotICAgIGlmIChjb25maWcubnVtX3N0cmVhbXMgPiAwKSB7CisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgewogICAgICAgICBtU3RhdHVzID0gU1RBVFVTX0NPTkZJR1VSRUQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CkBAIC0xMzQ3LDkgKzE1ODUsNzUgQEAKIAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIAorICAgIC8vIHRlYXIgZG93biB0aGUgZGVsZXRlZCBzdHJlYW1zIGFmdGVyIGNvbmZpZ3VyZSBzdHJlYW1zLgorICAgIG1EZWxldGVkU3RyZWFtcy5jbGVhcigpOworCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjphZGREdW1teVN0cmVhbUxvY2tlZCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtRHVtbXlTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGFkZGluZyBhIHNlY29uZCBkdW1teSBzdHJlYW0gd2hlbiBvbmUgaXMgYWxyZWFkeQorICAgICAgICAvLyBhY3RpdmUKKyAgICAgICAgU0VUX0VSUl9MKCIlczogQ2FtZXJhICVkOiBBIGR1bW15IHN0cmVhbSBhbHJlYWR5IGV4aXN0cyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBZGRpbmcgYSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBkdW1teVN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQ2FtZXJhM0R1bW15U3RyZWFtKG1OZXh0U3RyZWFtSWQpOworCisgICAgcmVzID0gbU91dHB1dFN0cmVhbXMuYWRkKG1OZXh0U3RyZWFtSWQsIGR1bW15U3RyZWFtKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGFkZCBkdW1teSBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUR1bW15U3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOworICAgIG1OZXh0U3RyZWFtSWQrKzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSByZXR1cm4gT0s7CisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSA9PSAxKSByZXR1cm4gT0s7CisKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUmVtb3ZpbmcgdGhlIGR1bW15IHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAorICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKKworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07CisgICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKworICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCisgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBkaXNjb25uZWN0IGRlbGV0ZWQgZHVtbXkgc3RyZWFtICVkIiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICAvLyBmYWxsIHRocm91Z2ggc2luY2Ugd2Ugd2FudCB0byBzdGlsbCBsaXN0IHRoZSBzdHJlYW0gYXMgZGVsZXRlZC4KKyAgICB9CisgICAgbURlbGV0ZWRTdHJlYW1zLmFkZChkZWxldGVkU3RyZWFtKTsKKyAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKKworICAgIHJldHVybiByZXM7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICB2YV9saXN0IGFyZ3M7CkBAIC0xMzgyLDQwICsxNjg2LDQ1IEBACiAgICAgLy8gQnV0IG9ubHkgZG8gZXJyb3Igc3RhdGUgdHJhbnNpdGlvbiBzdGVwcyBmb3IgdGhlIGZpcnN0IGVycm9yCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SIHx8IG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHJldHVybjsKIAotICAgIC8vIFNhdmUgc3RhY2sgdHJhY2UuIFZpZXcgYnkgZHVtcGluZyBpdCBsYXRlci4KLSAgICBDYW1lcmFUcmFjZXM6OnNhdmVUcmFjZSgpOwotICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBlcnJvckNhdXNlIGFuZCBjbGllbnQgcGlkL3Byb2NuYW1lCi0KICAgICBtRXJyb3JDYXVzZSA9IGVycm9yQ2F1c2U7CiAKICAgICBtUmVxdWVzdFRocmVhZC0+c2V0UGF1c2VkKHRydWUpOwogICAgIG1TdGF0dXMgPSBTVEFUVVNfRVJST1I7CisKKyAgICAvLyBOb3RpZnkgdXBzdHJlYW0gYWJvdXQgYSBkZXZpY2UgZXJyb3IKKyAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAorICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CisgICAgfQorCisgICAgLy8gU2F2ZSBzdGFjayB0cmFjZS4gVmlldyBieSBkdW1waW5nIGl0IGxhdGVyLgorICAgIENhbWVyYVRyYWNlczo6c2F2ZVRyYWNlKCk7CisgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIGVycm9yQ2F1c2UgYW5kIGNsaWVudCBwaWQvcHJvY25hbWUKIH0KIAogLyoqCiAgKiBJbi1mbGlnaHQgcmVxdWVzdCBtYW5hZ2VtZW50CiAgKi8KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodChpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBpbnQzMl90IHJlcXVlc3RJZCwgaW50MzJfdCBudW1CdWZmZXJzKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwotICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChyZXF1ZXN0SWQsIG51bUJ1ZmZlcnMpKTsKKyAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCkpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiAvKioKLSAqIFFVSVJLKHBhcnRpYWwgcmVzdWx0cykKICAqIENoZWNrIGlmIGFsbCAzQSBmaWVsZHMgYXJlIHJlYWR5LCBhbmQgc2VuZCBvZmYgYSBwYXJ0aWFsIDNBLW9ubHkgcmVzdWx0CiAgKiB0byB0aGUgb3V0cHV0IGZyYW1lIHF1ZXVlCiAgKi8KLWJvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVF1aXJrKAotICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHJlcXVlc3RJZCwKLSAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc1BhcnRpYWwzQVJlc3VsdCgKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBwYXJ0aWFsLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKIAogICAgIC8vIENoZWNrIGlmIGFsbCAzQSBzdGF0ZXMgYXJlIHByZXNlbnQKICAgICAvLyBUaGUgZnVsbCBsaXN0IG9mIGZpZWxkcyBpcwpAQCAtMTQzNSw4ICsxNzQ0LDYgQEAKICAgICB1aW50OF90IGFlU3RhdGU7CiAgICAgdWludDhfdCBhZlN0YXRlOwogICAgIHVpbnQ4X3QgYXdiU3RhdGU7Ci0gICAgaW50MzJfdCBhZlRyaWdnZXJJZDsKLSAgICBpbnQzMl90IGFlVHJpZ2dlcklkOwogCiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcik7CkBAIC0xNDUzLDg4ICsxNzYwLDkyIEBACiAgICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICZhd2JTdGF0ZSwgZnJhbWVOdW1iZXIpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IGdldDNBUmVzdWx0KHBhcnRpYWwsIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELAotICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKTsKLQotICAgIGdvdEFsbFN0YXRlcyAmPSBnZXQzQVJlc3VsdChwYXJ0aWFsLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgJmFlVHJpZ2dlcklkLCBmcmFtZU51bWJlcik7Ci0KICAgICBpZiAoIWdvdEFsbFN0YXRlcykgcmV0dXJuIGZhbHNlOwogCiAgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmFtZSAlZCwgUmVxdWVzdCBJRCAlZDogQUYgbW9kZSAlZCwgQVdCIG1vZGUgJWQsICIKICAgICAgICAgIkFGIHN0YXRlICVkLCBBRSBzdGF0ZSAlZCwgQVdCIHN0YXRlICVkLCAiCiAgICAgICAgICJBRiB0cmlnZ2VyICVkLCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgJWQiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAogICAgICAgICBhZk1vZGUsIGF3Yk1vZGUsCiAgICAgICAgIGFmU3RhdGUsIGFlU3RhdGUsIGF3YlN0YXRlLAotICAgICAgICBhZlRyaWdnZXJJZCwgYWVUcmlnZ2VySWQpOworICAgICAgICByZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIHJlc3VsdEV4dHJhcy5wcmVjYXB0dXJlVHJpZ2dlcklkKTsKIAogICAgIC8vIEdvdCBhbGwgc3RhdGVzLCBzbyBjb25zdHJ1Y3QgYSBtaW5pbWFsIHJlc3VsdCB0byBzZW5kCiAgICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIGZpZWxkcywgdGhpcyBtZWFucyBhZGRpbmcgaW4KICAgICAvLyAgIGFuZHJvaWQucmVxdWVzdC5mcmFtZUNvdW50CiAgICAgLy8gICBhbmRyb2lkLnJlcXVlc3QucmVxdWVzdElkCi0gICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0CisgICAgLy8gICBhbmRyb2lkLnF1aXJrcy5wYXJ0aWFsUmVzdWx0IChmb3IgSEFMIHZlcnNpb24gYmVsb3cgSEFMMy4yKQogCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzID0gMTA7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSYgbWluM0FSZXN1bHQgPQotICAgICAgICAgICAgKm1SZXN1bHRRdWV1ZS5pbnNlcnQoCi0gICAgICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmVuZCgpLAotICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKGtNaW5pbWFsM0FSZXN1bHRFbnRyaWVzLCAvKmRhdGFDYXBhY2l0eSovIDApKTsKKyAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOworICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gQ2FtZXJhTWV0YWRhdGEoa01pbmltYWwzQVJlc3VsdEVudHJpZXMsIC8qZGF0YUNhcGFjaXR5Ki8gMCk7CisgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc3A8Q2FwdHVyZVJlc3VsdD4uIFRoaXMgd2lsbCBuZWVkIG90aGVyIGNoYW5nZXMsIGluY2x1ZGluZywKKyAgICAvLyBidXQgbm90IGxpbWl0ZWQgdG8gQ2FtZXJhRGV2aWNlQmFzZTo6Z2V0TmV4dFJlc3VsdAorICAgIENhcHR1cmVSZXN1bHQmIG1pbjNBUmVzdWx0ID0KKyAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgY2FwdHVyZVJlc3VsdCk7CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCi0gICAgICAgICAgICAmZnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIHByb2JsZW1hdGljIGNhc3RpbmcuIE5lZWQgdG8gZml4IENhbWVyYU1ldGFkYXRhLgorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oJmZyYW1lTnVtYmVyKSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX1JFUVVFU1RfSUQsCisgICAgaW50MzJfdCByZXF1ZXN0SWQgPSByZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1JFUVVFU1RfSUQsCiAgICAgICAgICAgICAmcmVxdWVzdElkLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhcnRpYWxSZXN1bHQgPSBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMOwotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxULAotICAgICAgICAgICAgJnBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1EZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGFydGlhbFJlc3VsdCA9IEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUX1BBUlRJQUw7CisgICAgICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAmcGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCiAgICAgICAgICAgICAmYWZNb2RlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKKyAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0Lm1NZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJmF3Yk1vZGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsCiAgICAgICAgICAgICAmYWVTdGF0ZSwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIWluc2VydDNBUmVzdWx0KG1pbjNBUmVzdWx0LCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKICAgICAgICAgICAgICZhZlN0YXRlLCBmcmFtZU51bWJlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCisgICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdC5tTWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmYXdiU3RhdGUsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQsCi0gICAgICAgICAgICAmYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMuYWZUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKCFpbnNlcnQzQVJlc3VsdChtaW4zQVJlc3VsdCwgQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQsCi0gICAgICAgICAgICAmYWVUcmlnZ2VySWQsIGZyYW1lTnVtYmVyKSkgeworICAgIGlmICghaW5zZXJ0M0FSZXN1bHQobWluM0FSZXN1bHQubU1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICZyZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZCwgZnJhbWVOdW1iZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBXZSBvbmx5IHNlbmQgdGhlIGFnZ3JlZ2F0ZWQgcGFydGlhbCB3aGVuIGFsbCAzQSByZWxhdGVkIG1ldGFkYXRhIGFyZSBhdmFpbGFibGUKKyAgICAvLyBGb3IgYm90aCBBUEkxIGFuZCBBUEkyLgorICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCBwYXNzIHRocm91Z2ggYWxsIHBhcnRpYWxzIHRvIEFQSTIgdW5jb25kaXRpb25hbGx5LgogICAgIG1SZXN1bHRTaWduYWwuc2lnbmFsKCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1NDIsNyArMTg1Myw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6OmdldDNBUmVzdWx0KGNvbnN0IENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICAodm9pZCkgZnJhbWVOdW1iZXI7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKQEAgLTE1NjcsNyArMTg3OCw3IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIENhbWVyYTNEZXZpY2U6Omluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhJiByZXN1bHQsIGludDMyX3QgdGFnLAotICAgICAgICBjb25zdCBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcikgeworICAgICAgICBjb25zdCBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKICAgICBpZiAocmVzdWx0LnVwZGF0ZSh0YWcsIHZhbHVlLCAxKSAhPSBOT19FUlJPUikgewogICAgICAgICBtUmVzdWx0UXVldWUuZXJhc2UoLS1tUmVzdWx0UXVldWUuZW5kKCksIG1SZXN1bHRRdWV1ZS5lbmQoKSk7CiAgICAgICAgIFNFVF9FUlIoIkZyYW1lICVkOiBGYWlsZWQgdG8gc2V0ICVzIGluIHBhcnRpYWwgbWV0YWRhdGEiLApAQCAtMTU4NywxOCArMTg5OCwzNCBAQAogICAgIHN0YXR1c190IHJlczsKIAogICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyID0gcmVzdWx0LT5mcmFtZV9udW1iZXI7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ID09IE5VTEwgJiYgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMCkgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCA9PSBOVUxMICYmIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzID09IDAgJiYKKyAgICAgICAgICAgIHJlc3VsdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgU0VUX0VSUigiTm8gcmVzdWx0IGRhdGEgcHJvdmlkZWQgYnkgSEFMIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgcGFydGlhbFJlc3VsdFF1aXJrID0gZmFsc2U7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUXVpcmtSZXN1bHQ7CiAKLSAgICAvLyBHZXQgY2FwdHVyZSB0aW1lc3RhbXAgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywgd2hlcmUgaXQgd2FzIGFkZGVkCi0gICAgLy8gYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLiBUaGVuIHVwZGF0ZSB0aGUgaW4tZmxpZ2h0Ci0gICAgLy8gc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZiBhbGwgcmVzdWx0IGRhdGEgaGFzIGJlZW4KLSAgICAvLyByZWNlaXZlZC4KKyAgICAvLyBGb3IgSEFMMy4yIG9yIGFib3ZlLCBJZiBIQUwgZG9lc24ndCBzdXBwb3J0IHBhcnRpYWwsIGl0IG11c3QgYWx3YXlzIHNldAorICAgIC8vIHBhcnRpYWxfcmVzdWx0IHRvIDEgd2hlbiBtZXRhZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGlzIHJlc3VsdC4KKyAgICBpZiAoIW1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMiAmJgorICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJgorICAgICAgICAgICAgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCAhPSAxKSB7CisgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlIDEiCisgICAgICAgICAgICAgICAgIiBpZiBwYXJ0aWFsIHJlc3VsdCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcmVzdWx0LT5wYXJ0aWFsX3Jlc3VsdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOworICAgIENhbWVyYU1ldGFkYXRhIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7CisgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CisgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCA9IGZhbHNlOworCisgICAgLy8gR2V0IGNhcHR1cmUgdGltZXN0YW1wIGFuZCByZXN1bHRFeHRyYXMgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywKKyAgICAvLyB3aGVyZSBpdCB3YXMgYWRkZWQgYnkgdGhlIHNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciB0aGlzIGZyYW1lLgorICAgIC8vIFRoZW4gdXBkYXRlIHRoZSBpbi1mbGlnaHQgc3RhdHVzIGFuZCByZW1vdmUgdGhlIGluLWZsaWdodCBlbnRyeSBpZgorICAgIC8vIGFsbCByZXN1bHQgZGF0YSBoYXMgYmVlbiByZWNlaXZlZC4KICAgICBuc2Vjc190IHRpbWVzdGFtcCA9IDA7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKQEAgLTE2MDksNzEgKzE5MzYsMTA4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgIEFMT0dWVigiJXM6IGdvdCBJbkZsaWdodFJlcXVlc3QgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcXVlc3QucmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgcmVxdWVzdC5yZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMuYnVyc3RJZCk7CisgICAgICAgIC8vIEFsd2F5cyB1cGRhdGUgdGhlIHBhcnRpYWwgY291bnQgdG8gdGhlIGxhdGVzdCBvbmUuIFdoZW4gZnJhbWV3b3JrIGFnZ3JlZ2F0ZXMgYWRqYWNlbnQKKyAgICAgICAgLy8gcGFydGlhbCByZXN1bHRzIGludG8gb25lLCB0aGUgbGF0ZXN0IHBhcnRpYWwgY291bnQgd2lsbCBiZSB1c2VkLgorICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPSByZXN1bHQtPnBhcnRpYWxfcmVzdWx0OwogCiAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVzdWx0IGNhcnJpZXMgb25seSBwYXJ0aWFsIG1ldGFkYXRhCi0gICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdFF1aXJrICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IHBhcnRpYWxSZXN1bHRFbnRyeTsKLSAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAotICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVCwgJnBhcnRpYWxSZXN1bHRFbnRyeSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE5BTUVfTk9UX0ZPVU5EICYmCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgcGFydGlhbFJlc3VsdEVudHJ5LmRhdGEudThbMF0gPT0KLSAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFRfUEFSVElBTCkgewotICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gc2V0IG9mIG1ldGFkYXRhIGludG8gdGhlIGluLWZsaWdodCBlbnRyeS4KLSAgICAgICAgICAgICAgICBwYXJ0aWFsUmVzdWx0UXVpcmsgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQuZXJhc2UoCi0gICAgICAgICAgICAgICAgICAgIEFORFJPSURfUVVJUktTX1BBUlRJQUxfUkVTVUxUKTsKKyAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmIHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0ID4gbU51bVBhcnRpYWxSZXN1bHRzIHx8IHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCAldSBtdXN0IGJlICBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSByYW5nZSBvZiBbMSwgJWRdIHdoZW4gbWV0YWRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHJlc3VsdC0+cGFydGlhbF9yZXN1bHQsIG1OdW1QYXJ0aWFsUmVzdWx0cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdC0+cGFydGlhbF9yZXN1bHQgPCBtTnVtUGFydGlhbFJlc3VsdHMpOworICAgICAgICAgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdC5hcHBlbmQocmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGFydGlhbFJlc3VsdEVudHJ5OworICAgICAgICAgICAgICAgIHJlcyA9IGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHJlc3VsdC0+cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQsICZwYXJ0aWFsUmVzdWx0RW50cnkpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxSZXN1bHRFbnRyeS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1FVSVJLU19QQVJUSUFMX1JFU1VMVF9QQVJUSUFMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcGFydGlhbCByZXN1bHQuIEZsYWcgdGhpcyBhcyBzdWNoLCBhbmQgY29sbGVjdCB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvZiBtZXRhZGF0YSBpbnRvIHRoZSBpbi1mbGlnaHQgZW50cnkuCisgICAgICAgICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmVyYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9RVUlSS1NfUEFSVElBTF9SRVNVTFQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgICAgIC8vIEZpcmUgb2ZmIGEgM0Etb25seSByZXN1bHQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmhhdmVTZW50M0EpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0UXVpcmsuaGF2ZVNlbnQzQSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BhcnRpYWwzQVF1aXJrKGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmhhdmVTZW50M0EgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWFsM0FSZXN1bHQoZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHRpbWVzdGFtcCA9IHJlcXVlc3QuY2FwdHVyZVRpbWVzdGFtcDsKKyAgICAgICAgcmVzdWx0RXh0cmFzID0gcmVxdWVzdC5yZXN1bHRFeHRyYXM7CisgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0ID0gcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcjsKKwogICAgICAgICAvKioKICAgICAgICAgICogT25lIG9mIHRoZSBmb2xsb3dpbmcgbXVzdCBoYXBwZW4gYmVmb3JlIGl0J3MgbGVnYWwgdG8gY2FsbCBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0LAogICAgICAgICAgKiB1bmxlc3MgcGFydGlhbCBtZXRhZGF0YSBpcyBiZWluZyBwcm92aWRlZDoKICAgICAgICAgICogLSBDQU1FUkEzX01TR19TSFVUVEVSIChleHBlY3RlZCBkdXJpbmcgbm9ybWFsIG9wZXJhdGlvbikKICAgICAgICAgICogLSBDQU1FUkEzX01TR19FUlJPUiAoZXhwZWN0ZWQgZHVyaW5nIGZsdXNoKQogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdFN0YXR1cyA9PSBPSyAmJiB0aW1lc3RhbXAgPT0gMCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgPT0gT0sgJiYgdGltZXN0YW1wID09IDAgJiYgIWlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIGJlZm9yZSBzaHV0dGVyIG5vdGlmeSBmb3IgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICAvLyBEaWQgd2UgZ2V0IHRoZSAoZmluYWwpIHJlc3VsdCBtZXRhZGF0YSBmb3IgdGhpcyBjYXB0dXJlPwotICAgICAgICBpZiAocmVzdWx0LT5yZXN1bHQgIT0gTlVMTCAmJiAhcGFydGlhbFJlc3VsdFF1aXJrKSB7CisgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIFNFVF9FUlIoIkNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIG1ldGFkYXRhIGZvciBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0UXVpcmsgJiYKLSAgICAgICAgICAgICAgICAgICAgIXJlcXVlc3QucGFydGlhbFJlc3VsdFF1aXJrLmNvbGxlY3RlZFJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb2xsZWN0ZWRRdWlya1Jlc3VsdC5hY3F1aXJlKAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBhcnRpYWxSZXN1bHRRdWlyay5jb2xsZWN0ZWRSZXN1bHQpOworICAgICAgICAgICAgaWYgKG1Vc2VQYXJ0aWFsUmVzdWx0ICYmCisgICAgICAgICAgICAgICAgICAgICFyZXF1ZXN0LnBhcnRpYWxSZXN1bHQuY29sbGVjdGVkUmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuYWNxdWlyZSgKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5wYXJ0aWFsUmVzdWx0LmNvbGxlY3RlZFJlc3VsdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0IC09IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOwotCisgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXR1cm5lZCA9IHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzOworICAgICAgICBpZiAocmVzdWx0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JldHVybmVkICs9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogSW5wdXQgYnVmZmVyIHNob3VsZCBiZSBOVUxMIGlmIHRoZXJlIGlzIG5vIGlucHV0IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBidWZmZXIgc2VudCBpbiB0aGUgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgLT0gbnVtQnVmZmVyc1JldHVybmVkOwogICAgICAgICBpZiAocmVxdWVzdC5udW1CdWZmZXJzTGVmdCA8IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlRvbyBtYW55IGJ1ZmZlcnMgcmV0dXJuZWQgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgZXZlcnl0aGluZyBoYXMgYXJyaXZlZCBmb3IgdGhpcyByZXN1bHQgKGJ1ZmZlcnMgYW5kIG1ldGFkYXRhKQotICAgICAgICBpZiAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgcmVxdWVzdC5udW1CdWZmZXJzTGVmdCA9PSAwKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGV2ZXJ5dGhpbmcgaGFzIGFycml2ZWQgZm9yIHRoaXMgcmVzdWx0IChidWZmZXJzIGFuZCBtZXRhZGF0YSksIHJlbW92ZSBpdCBmcm9tCisgICAgICAgIC8vIEluRmxpZ2h0TWFwIGlmIGJvdGggYXJyaXZlZCBvciBIQUwgcmVwb3J0cyBlcnJvciBmb3IgdGhpcyByZXF1ZXN0IChpLmUuIGR1cmluZyBmbHVzaCkuCisgICAgICAgIGlmICgocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LKSB8fAorICAgICAgICAgICAgICAgIChyZXF1ZXN0LmhhdmVSZXN1bHRNZXRhZGF0YSAmJiByZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDApKSB7CiAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgbUluRmxpZ2h0TWFwLnJlbW92ZUl0ZW1zQXQoaWR4LCAxKTsKICAgICAgICAgfQpAQCAtMTY4MSwzMSArMjA0NSwzMyBAQAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMsIHNvbWV0aGluZyBoYXMKICAgICAgICAgLy8gbGlrZWx5IGdvbmUgd3JvbmcKICAgICAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPiBrSW5GbGlnaHRXYXJuTGltaXQpIHsKLSAgICAgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICVkIiwgbUluRmxpZ2h0TWFwLnNpemUoKSk7CisgICAgICAgICAgICBDTE9HRSgiSW4tZmxpZ2h0IGxpc3QgdG9vIGxhcmdlOiAlenUiLCBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgfQogCiAgICAgLy8gUHJvY2VzcyB0aGUgcmVzdWx0IG1ldGFkYXRhLCBpZiBwcm92aWRlZAogICAgIGJvb2wgZ290UmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIXBhcnRpYWxSZXN1bHRRdWlyaykgeworICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU91dHB1dExvY2spOwogCiAgICAgICAgIGdvdFJlc3VsdCA9IHRydWU7CiAKLSAgICAgICAgaWYgKGZyYW1lTnVtYmVyICE9IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlcgorICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCiAgICAgICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKys7CisgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2FwdHVyZVJlc3VsdDsKLSAgICAgICAgY2FwdHVyZVJlc3VsdCA9IHJlc3VsdC0+cmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CisgICAgICAgIGNhcHR1cmVSZXN1bHQubVJlc3VsdEV4dHJhcyA9IHJlc3VsdEV4dHJhczsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKIAotICAgICAgICBpZiAoY2FwdHVyZVJlc3VsdC51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0ZSQU1FX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfRlJBTUVfQ09VTlQsCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSZmcmFtZU51bWJlciwgMSkgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBzZXQgZnJhbWUjIGluIG1ldGFkYXRhICglZCkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICBnb3RSZXN1bHQgPSBmYWxzZTsKQEAgLTE3MTUsMzIgKzIwODEsMzYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEFwcGVuZCBhbnkgcHJldmlvdXMgcGFydGlhbHMgdG8gZm9ybSBhIGNvbXBsZXRlIHJlc3VsdAotICAgICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHRRdWlyayAmJiAhY29sbGVjdGVkUXVpcmtSZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjYXB0dXJlUmVzdWx0LmFwcGVuZChjb2xsZWN0ZWRRdWlya1Jlc3VsdCk7CisgICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJiAhY29sbGVjdGVkUGFydGlhbFJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmFwcGVuZChjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0KTsKICAgICAgICAgfQogCi0gICAgICAgIGNhcHR1cmVSZXN1bHQuc29ydCgpOworICAgICAgICBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YS5zb3J0KCk7CiAKICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSdzIGEgdGltZXN0YW1wIGluIHRoZSByZXN1bHQgbWV0YWRhdGEKIAogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPQotICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDApIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk5vIHRpbWVzdGFtcCBwcm92aWRlZCBieSBIQUwgZm9yIGZyYW1lICVkISIsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGdvdFJlc3VsdCA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcCAhPSBlbnRyeS5kYXRhLmk2NFswXSkgewogICAgICAgICAgICAgU0VUX0VSUigiVGltZXN0YW1wIG1pc21hdGNoIGJldHdlZW4gc2h1dHRlciBub3RpZnkgYW5kIHJlc3VsdCIKLSAgICAgICAgICAgICAgICAgICAgIiBtZXRhZGF0YSBmb3IgZnJhbWUgJWQgKCVsbGQgdnMgJWxsZCByZXNwZWN0aXZlbHkpIiwKKyAgICAgICAgICAgICAgICAgICAgIiBtZXRhZGF0YSBmb3IgZnJhbWUgJWQgKCUiIFBSSWQ2NCAiIHZzICUiIFBSSWQ2NCAiIHJlc3BlY3RpdmVseSkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeS5kYXRhLmk2NFswXSk7CiAgICAgICAgICAgICBnb3RSZXN1bHQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnb3RSZXN1bHQpIHsKICAgICAgICAgICAgIC8vIFZhbGlkIHJlc3VsdCwgaW5zZXJ0IGludG8gcXVldWUKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhJiBxdWV1ZWRSZXN1bHQgPQotICAgICAgICAgICAgICAgICptUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgQ2FtZXJhTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBxdWV1ZWRSZXN1bHQuc3dhcChjYXB0dXJlUmVzdWx0KTsKKyAgICAgICAgICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD46Oml0ZXJhdG9yIHF1ZXVlZFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRRdWV1ZS5pbnNlcnQobVJlc3VsdFF1ZXVlLmVuZCgpLCBDYXB0dXJlUmVzdWx0KGNhcHR1cmVSZXN1bHQpKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXM6IHJlc3VsdCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICBxdWV1ZWRSZXN1bHQtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgcXVldWVkUmVzdWx0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgICAgICB9CiAgICAgfSAvLyBzY29wZSBmb3IgbU91dHB1dExvY2sKIApAQCAtMTc1MywxMSArMjEyMywzMCBAQAogICAgICAgICAvLyBOb3RlOiBzdHJlYW0gbWF5IGJlIGRlYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQsIGlmIHRoaXMgYnVmZmVyIHdhcyB0aGUKICAgICAgICAgLy8gbGFzdCByZWZlcmVuY2UgdG8gaXQuCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyICVkIGZvciBmcmFtZSAlZCB0byBpdHMgc3RyZWFtOiAiCisgICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciAlenUgZm9yIGZyYW1lICVkIHRvIGl0cyBzdHJlYW06ICIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgaSwgZnJhbWVOdW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHJlc3VsdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KSB7CisgICAgICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQorICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QocmVzdWx0LT5pbnB1dF9idWZmZXItPnN0cmVhbSk7CisgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybklucHV0QnVmZmVyKCoocmVzdWx0LT5pbnB1dF9idWZmZXIpKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQorICAgICAgICAgICAgLy8gbGFzdCByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0VGhyZWFkOiBDYW4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKKyAgICAgICAgICAgICAgICAgICAgICAiICBpdHMgc3RyZWFtOiVzICglZCkiLCAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogSW5wdXQgYnVmZmVyIHNob3VsZCBiZSBOVUxMIGlmIHRoZXJlIGlzIG5vIGlucHV0IgorICAgICAgICAgICAgICAgICAgICAiIGJ1ZmZlciBzZW50IGluIHRoZSByZXF1ZXN0LCBza2lwcGluZyBpbnB1dCBidWZmZXIgcmV0dXJuLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBGaW5hbGx5LCBzaWduYWwgYW55IHdhaXRlcnMgZm9yIG5ldyBmcmFtZXMKIAogICAgIGlmIChnb3RSZXN1bHQpIHsKQEAgLTE3NjYsOCArMjE1NSw2IEBACiAKIH0KIAotCi0KIHZvaWQgQ2FtZXJhM0RldmljZTo6bm90aWZ5KGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZyAqbXNnKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXI7CkBAIC0xNzgzLDcyICsyMTcwLDExIEBACiAKICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkgewogICAgICAgICBjYXNlIENBTUVSQTNfTVNHX0VSUk9SOiB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSAwOwotICAgICAgICAgICAgaWYgKG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmEzU3RyZWFtOjpjYXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0pOwotICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlZDogJXM6IEhBTCBlcnJvciwgZnJhbWUgJWQsIHN0cmVhbSAlZDogJWQiLAotICAgICAgICAgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLT5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlKTsKLQotICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3QgZXJyb3Igc3RhdHVzIGZvciB0aGUgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHRyYWNraW5nCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCkucmVxdWVzdFN0YXR1cyA9IG1zZy0+bWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IobXNnLT5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2ctPm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlFcnJvcihtc2ctPm1lc3NhZ2UuZXJyb3IsIGxpc3RlbmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfU0hVVFRFUjogewotICAgICAgICAgICAgc3NpemVfdCBpZHg7Ci0gICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciA9IG1zZy0+bWVzc2FnZS5zaHV0dGVyLmZyYW1lX251bWJlcjsKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wID0gbXNnLT5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wOwotICAgICAgICAgICAgLy8gVmVyaWZ5IG9yZGVyaW5nIG9mIHNodXR0ZXIgbm90aWZpY2F0aW9ucwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIsIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdElkID0gLTE7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKLSAgICAgICAgICAgIC8vIGFuZCBnZXQgdGhlIHJlcXVlc3QgSUQgdG8gc2VuZCB1cHN0cmVhbQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOwotICAgICAgICAgICAgICAgIGlkeCA9IG1JbkZsaWdodE1hcC5pbmRleE9mS2V5KGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgICAgIHIuY2FwdHVyZVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkID0gci5yZXF1ZXN0SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3Igbm9uLWV4aXN0ZW50IGZyYW1lIG51bWJlciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVlYoIkNhbWVyYSAlZDogJXM6IFNodXR0ZXIgZmlyZWQgZm9yIGZyYW1lICVkIChpZCAlZCkgYXQgJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgcmVxdWVzdElkLCB0aW1lc3RhbXApOwotICAgICAgICAgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlTaHV0dGVyKHJlcXVlc3RJZCwgdGltZXN0YW1wKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeVNodXR0ZXIobXNnLT5tZXNzYWdlLnNodXR0ZXIsIGxpc3RlbmVyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODU3LDYgKzIxODMsMTIxIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeUVycm9yKGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZywKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CisKKyAgICAvLyBNYXAgY2FtZXJhIEhBTCBlcnJvciBjb2RlcyB0byBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgZXJyb3IgY29kZXMKKyAgICAvLyBJbmRleCBpbnRvIHRoaXMgd2l0aCB0aGUgSEFMIGVycm9yIGNvZGUKKyAgICBzdGF0aWMgY29uc3QgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlCisgICAgICAgICAgICBoYWxFcnJvck1hcFtDQU1FUkEzX01TR19OVU1fRVJST1JTXSA9IHsKKyAgICAgICAgLy8gMCA9IFVudXNlZCBlcnJvciBjb2RlCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SLAorICAgICAgICAvLyAxID0gQ0FNRVJBM19NU0dfRVJST1JfREVWSUNFCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UsCisgICAgICAgIC8vIDIgPSBDQU1FUkEzX01TR19FUlJPUl9SRVFVRVNUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAvLyAzID0gQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUCisgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQsCisgICAgICAgIC8vIDQgPSBDQU1FUkEzX01TR19FUlJPUl9CVUZGRVIKKyAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUgorICAgIH07CisKKyAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlID0KKyAgICAgICAgICAgICgobXNnLmVycm9yX2NvZGUgPj0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1zZy5lcnJvcl9jb2RlIDwgQ0FNRVJBM19NU0dfTlVNX0VSUk9SUykpID8KKyAgICAgICAgICAgIGhhbEVycm9yTWFwW21zZy5lcnJvcl9jb2RlXSA6CisgICAgICAgICAgICBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjsKKworICAgIGludCBzdHJlYW1JZCA9IDA7CisgICAgaWYgKG1zZy5lcnJvcl9zdHJlYW0gIT0gTlVMTCkgeworICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQorICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW06OmNhc3QobXNnLmVycm9yX3N0cmVhbSk7CisgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtLT5nZXRJZCgpOworICAgIH0KKyAgICBBTE9HVigiQ2FtZXJhICVkOiAlczogSEFMIGVycm9yLCBmcmFtZSAlZCwgc3RyZWFtICVkOiAlZCIsCisgICAgICAgICAgICBtSWQsIF9fRlVOQ1RJT05fXywgbXNnLmZyYW1lX251bWJlciwKKyAgICAgICAgICAgIHN0cmVhbUlkLCBtc2cuZXJyb3JfY29kZSk7CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJDYW1lcmEgSEFMIHJlcG9ydGVkIHNlcmlvdXMgZGV2aWNlIGVycm9yIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CisgICAgICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0ICZyID0gbUluRmxpZ2h0TWFwLmVkaXRWYWx1ZUF0KGlkeCk7CisgICAgICAgICAgICAgICAgICAgIHIucmVxdWVzdFN0YXR1cyA9IG1zZy5lcnJvcl9jb2RlOworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IHJlcXVlc3Qgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZSAlIiBQUklkNjQgIiBlcnJvciIsIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVkOiAlczogbm8gbGlzdGVuZXIgYXZhaWxhYmxlIiwgbUlkLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBTRVRfRVJSIGNhbGxzIG5vdGlmeUVycm9yCisgICAgICAgICAgICBTRVRfRVJSKCJVbmtub3duIGVycm9yIG1lc3NhZ2UgZnJvbSBIQUw6ICVkIiwgbXNnLmVycm9yX2NvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeVNodXR0ZXIoY29uc3QgY2FtZXJhM19zaHV0dGVyX21zZ190ICZtc2csCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIHNzaXplX3QgaWR4OworICAgIC8vIFZlcmlmeSBvcmRlcmluZyBvZiBzaHV0dGVyIG5vdGlmaWNhdGlvbnMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlci4KKyAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlciwgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyICsgMTsKKyAgICB9CisKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKKworICAgIC8vIFNldCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgdHJhY2tpbmcKKyAgICAvLyBhbmQgZ2V0IHRoZSByZXF1ZXN0IElEIHRvIHNlbmQgdXBzdHJlYW0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbkZsaWdodExvY2spOworICAgICAgICBpZHggPSBtSW5GbGlnaHRNYXAuaW5kZXhPZktleShtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaWYgKGlkeCA+PSAwKSB7CisgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKKyAgICAgICAgICAgIHIuY2FwdHVyZVRpbWVzdGFtcCA9IG1zZy50aW1lc3RhbXA7CisgICAgICAgICAgICByZXN1bHRFeHRyYXMgPSByLnJlc3VsdEV4dHJhczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3Igbm9uLWV4aXN0ZW50IGZyYW1lIG51bWJlciAlZCIsCisgICAgICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1ZWKCJDYW1lcmEgJWQ6ICVzOiBTaHV0dGVyIGZpcmVkIGZvciBmcmFtZSAlZCAoaWQgJWQpIGF0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgIG1JZCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbXNnLmZyYW1lX251bWJlciwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbXNnLnRpbWVzdGFtcCk7CisgICAgLy8gQ2FsbCBsaXN0ZW5lciwgaWYgYW55CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCBtc2cudGltZXN0YW1wKTsKKyAgICB9Cit9CisKKwogQ2FtZXJhTWV0YWRhdGEgQ2FtZXJhM0RldmljZTo6Z2V0TGF0ZXN0UmVxdWVzdExvY2tlZCgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogCkBAIC0xODY5LDYgKzIzMTAsNyBAQAogICAgIHJldHVybiByZXRWYWw7CiB9CiAKKwogLyoqCiAgKiBSZXF1ZXN0VGhyZWFkIGlubmVyIGNsYXNzIG1ldGhvZHMKICAqLwpAQCAtMTg4NSwxOSArMjMyNyw0MCBAQAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKLSAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCkgeworICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKKyAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKKyAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAorICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Tm90aWZ5Q2FsbGJhY2soCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y29uZmlndXJhdGlvbkNvbXBsZXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdCgKLSAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVJlcXVlc3RMaXN0KAorICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwotICAgIG1SZXF1ZXN0UXVldWUucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKKyAgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2soKml0KTsKKyAgICB9CisKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlciArIG1SZXF1ZXN0UXVldWUuc2l6ZSgpIC0gMTsKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgJWQsIG1GcmFtZU51bWJlciAlIiBQUklkMzIgIiwgbGFzdEZyYW1lTnVtYmVyICUiIFBSSWQ2NCAiLiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKCoocmVxdWVzdHMuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAqbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKIApAQCAtMTk2MSwyOCArMjQyNCw3MiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRSZXBlYXRpbmdSZXF1ZXN0cygKLSAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzKSB7CisgICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmluc2VydChtUmVwZWF0aW5nUmVxdWVzdHMuYmVnaW4oKSwKICAgICAgICAgICAgIHJlcXVlc3RzLmJlZ2luKCksIHJlcXVlc3RzLmVuZCgpKTsKIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpIHsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0SW4pIHsKKyAgICBpZiAobVJlcGVhdGluZ1JlcXVlc3RzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IHJlcXVlc3RJbi0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcGVhdFJlcXVlc3RzID0gbVJlcGVhdGluZ1JlcXVlc3RzOworICAgIC8vIEFsbCByZXBlYXRpbmcgcmVxdWVzdHMgYXJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBzYW1lIGlkIHNvIG9ubHkgY2hlY2sgZmlyc3QgcXVlc3QKKyAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gZmlyc3RSZXF1ZXN0ID0gKnJlcGVhdFJlcXVlc3RzLmJlZ2luKCk7CisgICAgcmV0dXJuIChmaXJzdFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkID09IHJlcXVlc3RJZCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKAorICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIsCisgICAgICAgIC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOjolczoiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICAvLyBTZW5kIGVycm9ycyBmb3IgYWxsIHJlcXVlc3RzIHBlbmRpbmcgaW4gdGhlIHJlcXVlc3QgcXVldWUsIGluY2x1ZGluZworICAgIC8vIHBlbmRpbmcgcmVwZWF0aW5nIHJlcXVlc3RzCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChSZXF1ZXN0TGlzdDo6aXRlcmF0b3IgaXQgPSBtUmVxdWVzdFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1SZXF1ZXN0UXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIC8vIFNldCB0aGUgZnJhbWUgbnVtYmVyIHRoaXMgcmVxdWVzdCB3b3VsZCBoYXZlIGhhZCwgaWYgaXQKKyAgICAgICAgICAgIC8vIGhhZCBiZWVuIHN1Ym1pdHRlZDsgdGhpcyBmcmFtZSBudW1iZXIgd2lsbCBub3QgYmUgcmV1c2VkLgorICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RJZCBhbmQgYnVyc3RJZCBmaWVsZHMgd2VyZSBzZXQgd2hlbiB0aGUgcmVxdWVzdCB3YXMKKyAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCBvcmlnaW5hbGx5IChpbiBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCkKKyAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5tUmVzdWx0RXh0cmFzKTsKKyAgICAgICAgfQorICAgIH0KICAgICBtUmVxdWVzdFF1ZXVlLmNsZWFyKCk7CiAgICAgbVRyaWdnZXJNYXAuY2xlYXIoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIwMzQsNiArMjU0MSw3IEBACiAKICAgICAvLyBDcmVhdGUgcmVxdWVzdCB0byBIQUwKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IHJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAKICAgICAvLyBHZXQgdGhlIHJlcXVlc3QgSUQsIGlmIGFueQpAQCAtMjA1NCw3ICsyNTYyLDcgQEAKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgKG1GcmFtZU51bWJlcisxKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMDcyLDcgKzI1ODAsNyBAQAogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IGR1bW15IHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMDk2LDcgKzI2MDQsNyBAQAogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0IChmcmFtZSBudW0gJWQpIGhhZCBBRiB0cmlnZ2VyIDB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVOdW1iZXIrMSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudThbMF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTA3LDYgKzI2MTUsNyBAQAogICAgIH0KIAogICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOworICAgIHVpbnQzMl90IHRvdGFsTnVtQnVmZmVycyA9IDA7CiAKICAgICAvLyBGaWxsIGluIGJ1ZmZlcnMKIApAQCAtMjExNCwxMSArMjYyMywyMSBAQAogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9ICZpbnB1dEJ1ZmZlcjsKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXIoJmlucHV0QnVmZmVyKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IGlucHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIHF1ZXVlIG9yIG90aGVyIHByb2R1Y2VyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgLy8gZXJyb3IKICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOwogICAgIH0KQEAgLTIxMzAsMjYgKzI2NDksNDEgQEAKICAgICAgICAgcmVzID0gbmV4dFJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPgogICAgICAgICAgICAgICAgIGdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgIC8vIGVycm9yCiAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycysrOwogICAgIH0KLQotICAgIHJlcXVlc3QuZnJhbWVfbnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgdG90YWxOdW1CdWZmZXJzICs9IHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzOwogCiAgICAgLy8gTG9nIHJlcXVlc3QgaW4gdGhlIGluLWZsaWdodCBxdWV1ZQogICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYW5kIG5vd2hlcmUgdG8gc2VuZCBlcnJvcnMgdG8sIHNvIGp1c3QgbG9nIGl0CiAgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgIHJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzKTsKKyAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgLypoYXNJbnB1dCovcmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCk7CisgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CisgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkLCBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldyBpbi1mbGlnaHQgcmVxdWVzdDoiCiAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yMTcyLDYgKzI3MDYsOSBAQAogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU2hvdWxkIG9ubHkgZ2V0IGEgZmFpbHVyZSBoZXJlIGZvciBtYWxmb3JtZWQgcmVxdWVzdHMgb3IgZGV2aWNlLWxldmVsCisgICAgICAgIC8vIGVycm9ycywgc28gY29uc2lkZXIgYWxsIGVycm9ycyBmYXRhbC4gIEJhZCBtZXRhZGF0YSBmYWlsdXJlcyBzaG91bGQKKyAgICAgICAgLy8gY29tZSB0aHJvdWdoIG5vdGlmeS4KICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgJWQgdG8gSEFMIgogICAgICAgICAgICAgICAgICIgZGV2aWNlOiAlcyAoJWQpIiwgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CkBAIC0yMjAwLDIxICsyNzM3LDYgQEAKICAgICB9CiAgICAgbVByZXZUcmlnZ2VycyA9IHRyaWdnZXJDb3VudDsKIAotICAgIC8vIFJldHVybiBpbnB1dCBidWZmZXIgYmFjayB0byBmcmFtZXdvcmsKLSAgICBpZiAocmVxdWVzdC5pbnB1dF9idWZmZXIgIT0gTlVMTCkgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPQotICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChyZXF1ZXN0LmlucHV0X2J1ZmZlci0+c3RyZWFtKTsKLSAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcigqKHJlcXVlc3QuaW5wdXRfYnVmZmVyKSk7Ci0gICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzIHRoZQotICAgICAgICAvLyBsYXN0IHJlZmVyZW5jZSB0byBpdC4KLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXF1ZXN0VGhyZWFkOiBDYW4ndCByZXR1cm4gaW5wdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKLSAgICAgICAgICAgICAgICAgICAgIiAgaXRzIHN0cmVhbTolcyAoJWQpIiwgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgLy8gVE9ETzogUmVwb3J0IGVycm9yIHVwc3RyZWFtCi0gICAgICAgIH0KLSAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjIyNiw2ICsyNzQ4LDcgQEAKICAgICByZXR1cm4gbUxhdGVzdFJlcXVlc3Q7CiB9CiAKKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhblVwRmFpbGVkUmVxdWVzdCgKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAmcmVxdWVzdCwKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZuZXh0UmVxdWVzdCwKQEAgLTIyNjcsNiArMjc5MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICsrZmlyc3RSZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy5lbmQoKSk7CiAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHdhaXQgYW55IGxvbmdlcgorCisgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyICsgcmVxdWVzdHMuc2l6ZSgpIC0gMTsKKwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjMxOCw2ICsyODQ0LDExIEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBpZiAobmV4dFJlcXVlc3QgIT0gTlVMTCkgeworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1GcmFtZU51bWJlcisrOworICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCA9IG1DdXJyZW50QWZUcmlnZ2VySWQ7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisgICAgfQogICAgIHJldHVybiBuZXh0UmVxdWVzdDsKIH0KIApAQCAtMjM4MCwxMyArMjkxMSwzNCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1UcmlnZ2VyTXV0ZXgpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzOwogICAgIHNpemVfdCBjb3VudCA9IG1UcmlnZ2VyTWFwLnNpemUoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICBSZXF1ZXN0VHJpZ2dlciB0cmlnZ2VyID0gbVRyaWdnZXJNYXAudmFsdWVBdChpKTsKLQogICAgICAgICB1aW50MzJfdCB0YWcgPSB0cmlnZ2VyLm1ldGFkYXRhVGFnOworCisgICAgICAgIGlmICh0YWcgPT0gQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQgfHwgdGFnID09IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lEKSB7CisgICAgICAgICAgICBib29sIGlzQWVUcmlnZ2VyID0gKHRyaWdnZXIubWV0YWRhdGFUYWcgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQpOworICAgICAgICAgICAgdWludDMyX3QgdHJpZ2dlcklkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRyaWdnZXIuZW50cnlWYWx1ZSk7CisgICAgICAgICAgICBpZiAoaXNBZVRyaWdnZXIpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkID0gdHJpZ2dlcklkOworICAgICAgICAgICAgICAgIG1DdXJyZW50QWZUcmlnZ2VySWQgPSB0cmlnZ2VySWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyZW50LT5tRGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUcmlnZ2VyIElEIHRhZyBpcyBkZXByZWNhdGVkIHNpbmNlIGRldmljZSBIQUwgMy4yCisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKHRhZyk7CiAKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCA0NjhmNjQxLi5lYzZiYmExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC01NCw3ICs1Niw3IEBACiB9CiAKIC8qKgotICogQ2FtZXJhRGV2aWNlIGZvciBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzAKKyAqIENhbWVyYURldmljZSBmb3IgSEFMIGRldmljZXMgd2l0aCB2ZXJzaW9uIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIG9yIGhpZ2hlci4KICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKQEAgLTc4LDkgKzgwLDE0IEBACiAKICAgICAvLyBDYXB0dXJlIGFuZCBzZXRTdHJlYW1pbmdSZXF1ZXN0IHdpbGwgY29uZmlndXJlIHN0cmVhbXMgaWYgY3VycmVudGx5IGluCiAgICAgLy8gaWRsZSBzdGF0ZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZShDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhclN0cmVhbWluZ1JlcXVlc3QoaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKIApAQCAtODgsOCArOTUsNyBAQAogICAgIC8vIElmIGFkZGluZyBzdHJlYW1zIHdoaWxlIGFjdGl2ZWx5IGNhcHR1cmluZywgd2lsbCBwYXVzZSBkZXZpY2UgYmVmb3JlIGFkZGluZwogICAgIC8vIHN0cmVhbSwgcmVjb25maWd1cmluZyBkZXZpY2UsIGFuZCB1bnBhdXNpbmcuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCAqaWQpOworICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgKmlkKTsKQEAgLTEwOCw2ICsxMTQsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVSZXByb2Nlc3NTdHJlYW0oaW50IGlkKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpOwogCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gdGhlIGlkbGUgc3RhdGUgb24gc3VjY2VzcwpAQCAtMTE2LDcgKzEyNCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgd2lsbE5vdGlmeTNBKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0Rm9yTmV4dEZyYW1lKG5zZWNzX3QgdGltZW91dCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0RnJhbWUoQ2FtZXJhTWV0YWRhdGEgKmZyYW1lKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRSZXN1bHQoQ2FwdHVyZVJlc3VsdCAqZnJhbWUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB0cmlnZ2VyQXV0b2ZvY3VzKHVpbnQzMl90IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHRyaWdnZXJDYW5jZWxBdXRvZm9jdXModWludDMyX3QgaWQpOwpAQCAtMTI1LDcgKzEzMywxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHVzaFJlcHJvY2Vzc0J1ZmZlcihpbnQgcmVwcm9jZXNzU3RyZWFtSWQsCiAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgd3A8QnVmZmVyUmVsZWFzZWRMaXN0ZW5lcj4gbGlzdGVuZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKTsKKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdDsKIAogICAgIC8vIE1ldGhvZHMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMKICAgICB2b2lkICAgICAgICAgICAgIG5vdGlmeVN0YXR1cyhib29sIGlkbGUpOyAvLyB1cGRhdGVzIGZyb20gU3RhdHVzVHJhY2tlcgpAQCAtMTM3LDYgKzE0OSwxMCBAQAogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtTaHV0ZG93blRpbWVvdXQgICA9IDUwMDAwMDAwMDA7IC8vIDUgc2VjCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0FjdGl2ZVRpbWVvdXQgICAgID0gNTAwMDAwMDAwOyAgLy8gNTAwIG1zCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CisgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCisgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgLy8gQ29uc3RhbnQgdG8gdXNlIGZvciBzdHJlYW0gSUQgd2hlbiBvbmUgZG9lc24ndCBleGlzdAorICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX1NUUkVBTSA9IC0xOwogCiAgICAgLy8gQSBsb2NrIHRvIGVuZm9yY2Ugc2VyaWFsaXphdGlvbiBvbiB0aGUgaW5wdXQvY29uZmlndXJlIHNpZGUKICAgICAvLyBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KQEAgLTE1Nyw3ICsxNzMsMTAgQEAKICAgICBjYW1lcmEzX2RldmljZV90ICAgICAgICAgICptSGFsM0RldmljZTsKIAogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgIG1EZXZpY2VJbmZvOwotICAgIHZlbmRvcl90YWdfcXVlcnlfb3BzX3QgICAgIG1WZW5kb3JUYWdPcHM7CisKKyAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbQ0FNRVJBM19URU1QTEFURV9DT1VOVF07CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGV2aWNlVmVyc2lvbjsKIAogICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgU1RBVFVTX0VSUk9SLApAQCAtMTgxLDYgKzIwMCw4IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRTdHJlYW1JZDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtTmVlZENvbmZpZzsKIAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1teVN0cmVhbUlkOworCiAgICAgLy8gV2hldGhlciB0byBzZW5kIHN0YXRlIHVwZGF0ZXMgdXBzdHJlYW0KICAgICAvLyBQYXVzZSB3aGVuIGRvaW5nIHRyYW5zcGFyZW50IHJlY29uZmlndXJhdGlvbgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZVN0YXRlTm90aWZ5OwpAQCAtMTg4LDggKzIwOSwxMSBAQAogICAgIC8vIE5lZWQgdG8gaG9sZCBvbiB0byBzdHJlYW0gcmVmZXJlbmNlcyB1bnRpbCBjb25maWd1cmUgY29tcGxldGVzLgogICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiA+IG1EZWxldGVkU3RyZWFtczsKIAotICAgIC8vIFdoZXRoZXIgcXVpcmsgQU5EUk9JRF9RVUlSS1NfVVNFX1BBUlRJQUxfUkVTVUxUIGlzIGVuYWJsZWQKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdFF1aXJrOworICAgIC8vIFdoZXRoZXIgdGhlIEhBTCB3aWxsIHNlbmQgcGFydGlhbCByZXN1bHQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtVXNlUGFydGlhbFJlc3VsdDsKKworICAgIC8vIE51bWJlciBvZiBwYXJ0aWFsIHJlc3VsdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgSEFMLgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0czsKIAogICAgIC8qKioqIEVuZCBzY29wZSBmb3IgbUxvY2sgKioqKi8KIApAQCAtMTk5LDkgKzIyMywyMCBAQAogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07CiAgICAgICAgIFZlY3RvcjxzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zOworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICAgICAgICAgICAgICAgICBtUmVzdWx0RXh0cmFzOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCisgICAgc3RhdHVzX3QgY2hlY2tTdGF0dXNPa1RvQ2FwdHVyZUxvY2tlZCgpOworCisgICAgc3RhdHVzX3QgY29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKKworICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxhc3QgcmVxdWVzdCBzdWJtaXR0ZWQgdG8gdGhlIGhhbCBieSB0aGUgcmVxdWVzdCB0aHJlYWQuCiAgICAgICoKQEAgLTIzNyw2ICsyNzIsMTMgQEAKICAgICBzdGF0dXNfdCB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsIG5zZWNzX3QgdGltZW91dCk7CiAKICAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB3YWl0VW50aWxEcmFpbmVkLiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZS4KKyAgICAgKgorICAgICAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggbUxvY2sgYW5kIG1JbnRlcmZhY2VMb2NrIGhlbGQuCisgICAgICovCisgICAgc3RhdHVzX3Qgd2FpdFVudGlsRHJhaW5lZExvY2tlZCgpOworCisgICAgLyoqCiAgICAgICogRG8gY29tbW9uIHdvcmsgZm9yIHNldHRpbmcgdXAgYSBzdHJlYW1pbmcgb3Igc2luZ2xlIGNhcHR1cmUgcmVxdWVzdC4KICAgICAgKiBPbiBzdWNjZXNzLCB3aWxsIHRyYW5zaXRpb24gdG8gQUNUSVZFIGlmIGluIElETEUuCiAgICAgICovCkBAIC0yNTUsNiArMjk3LDE3IEBACiAgICAgc3RhdHVzX3QgICAgICAgICAgIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEFkZCBhIGR1bW15IHN0cmVhbSB0byB0aGUgY3VycmVudCBzdHJlYW0gc2V0IGFzIGEgd29ya2Fyb3VuZCBmb3IKKyAgICAgKiBub3QgYWxsb3dpbmcgMCBzdHJlYW1zIGluIHRoZSBjYW1lcmEgSEFMIHNwZWMuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBkdW1teSBzdHJlYW0gaWYgdGhlIGN1cnJlbnQgY29uZmlnIGluY2x1ZGVzIHJlYWwgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKworICAgIC8qKgogICAgICAqIFNldCBkZXZpY2UgaW50byBhbiBlcnJvciBzdGF0ZSBkdWUgdG8gc29tZSBmYXRhbCBmYWlsdXJlLCBhbmQgc2V0IGFuCiAgICAgICogZXJyb3IgbWVzc2FnZSB0byBpbmRpY2F0ZSB3aHkuIE9ubHkgdGhlIGZpcnN0IGNhbGwncyBtZXNzYWdlIHdpbGwgYmUKICAgICAgKiB1c2VkLiBUaGUgbWVzc2FnZSBpcyBhbHNvIHNlbnQgdG8gdGhlIGxvZy4KQEAgLTI3MCw2ICszMjMsMTggQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgICAgdHJ5TG9ja1NwaW5SaWdodFJvdW5kKE11dGV4JiBsb2NrKTsKIAorICAgIHN0cnVjdCBTaXplIHsKKyAgICAgICAgaW50IHdpZHRoOworICAgICAgICBpbnQgaGVpZ2h0OworICAgICAgICBTaXplKGludCB3LCBpbnQgaCkgOiB3aWR0aCh3KSwgaGVpZ2h0KGgpe30KKyAgICB9OworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGFyZ2VzdCBKcGVnIHJlc29sdXRpb24gKGluIGFyZWEpCisgICAgICogUmV0dXJuIFNpemUoMCwgMCkgaWYgc3RhdGljIG1ldGF0ZGF0YSBpcyBpbnZhbGlkCisgICAgICovCisgICAgU2l6ZSBnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0OworCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTI5OCw2ICszNjMsOCBAQAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCiAgICAgICAgICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqaGFsM0RldmljZSk7CiAKKyAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZ5Q2FsbGJhY2soTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKTsKKwogICAgICAgICAvKioKICAgICAgICAgICogQ2FsbCBhZnRlciBzdHJlYW0gKHJlKS1jb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZC4KICAgICAgICAgICovCkBAIC0zMDgsMTUgKzM3NSwyMiBAQAogICAgICAgICAgKiBvbiBlaXRoZXIuIFVzZSB3YWl0VW50aWxQYXVzZWQgdG8gd2FpdCB1bnRpbCByZXF1ZXN0IHF1ZXVlCiAgICAgICAgICAqIGhhcyBlbXB0aWVkIG91dC4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzKGNvbnN0IFJlcXVlc3RMaXN0JiByZXF1ZXN0cyk7Ci0gICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCBjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpOworICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmVtb3ZlIGFsbCBxdWV1ZWQgYW5kIHJlcGVhdGluZyByZXF1ZXN0cywgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IGNsZWFyKCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUXVldWUgYSB0cmlnZ2VyIHRvIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgbmV4dCBvdXRnb2luZwpAQCAtMzkxLDEwICs0NjUsMTUgQEAKICAgICAgICAgLy8gUmVsYXkgZXJyb3IgdG8gcGFyZW50IGRldmljZSBvYmplY3Qgc2V0RXJyb3JTdGF0ZQogICAgICAgICB2b2lkICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0ZShjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IHJlcXVlc3QgaXMgaW4gbVJlcGVhdGluZ1JlcXVlc3RzLiBNdXN0IGJlIGNhbGxlZCB3aXRoIG1SZXF1ZXN0TG9jayBob2xkCisgICAgICAgIGJvb2wgaXNSZXBlYXRpbmdSZXF1ZXN0TG9ja2VkKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0Pik7CisKICAgICAgICAgd3A8Q2FtZXJhM0RldmljZT4gIG1QYXJlbnQ7CiAgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+ICBtU3RhdHVzVHJhY2tlcjsKICAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAgKm1IYWwzRGV2aWNlOwogCisgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICptTGlzdGVuZXI7CisKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgIG1JZDsgICAgICAgLy8gVGhlIGNhbWVyYSBJRAogICAgICAgICBpbnQgICAgICAgICAgICAgICAgbVN0YXR1c0lkOyAvLyBUaGUgUmVxdWVzdFRocmVhZCdzIGNvbXBvbmVudCBJRCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHVzIHRyYWNraW5nCkBAIC00MjksNiArNTA4LDEwIEBACiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlck1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVtb3ZlZE1hcDsKICAgICAgICAgVHJpZ2dlck1hcCAgICAgICAgIG1UcmlnZ2VyUmVwbGFjZWRNYXA7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOworCisgICAgICAgIGludDY0X3QgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTQzNyw3MSArNTIwLDkwIEBACiAgICAgICovCiAKICAgICBzdHJ1Y3QgSW5GbGlnaHRSZXF1ZXN0IHsKLSAgICAgICAgLy8gYW5kcm9pZC5yZXF1ZXN0LmlkIGZvciB0aGUgcmVxdWVzdAotICAgICAgICBpbnQgICAgIHJlcXVlc3RJZDsKICAgICAgICAgLy8gU2V0IGJ5IG5vdGlmeSgpIFNIVVRURVIgY2FsbC4KICAgICAgICAgbnNlY3NfdCBjYXB0dXJlVGltZXN0YW1wOwogICAgICAgICBpbnQgICAgIHJlcXVlc3RTdGF0dXM7CiAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IGNhbGwgd2l0aCB2YWxpZCBtZXRhZGF0YQogICAgICAgICBib29sICAgIGhhdmVSZXN1bHRNZXRhZGF0YTsKICAgICAgICAgLy8gRGVjcmVtZW50ZWQgYnkgY2FsbHMgdG8gcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCB3aXRoIHZhbGlkIG91dHB1dAotICAgICAgICAvLyBidWZmZXJzCisgICAgICAgIC8vIGFuZCBpbnB1dCBidWZmZXJzCiAgICAgICAgIGludCAgICAgbnVtQnVmZmVyc0xlZnQ7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOworICAgICAgICAvLyBJZiB0aGlzIHJlcXVlc3QgaGFzIGFueSBpbnB1dCBidWZmZXIKKyAgICAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlcjsKIAotICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgcXVpcmsgb25seQotICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdFF1aXJrSW5GbGlnaHQgeworICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgb25seQorICAgICAgICBzdHJ1Y3QgUGFydGlhbFJlc3VsdEluRmxpZ2h0IHsKICAgICAgICAgICAgIC8vIFNldCBieSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0IG9uY2UgM0EgaGFzIGJlZW4gc2VudCB0byBjbGllbnRzCiAgICAgICAgICAgICBib29sICAgIGhhdmVTZW50M0E7CiAgICAgICAgICAgICAvLyBSZXN1bHQgbWV0YWRhdGEgY29sbGVjdGVkIHNvIGZhciwgd2hlbiBwYXJ0aWFsIHJlc3VsdHMgYXJlIGluIHVzZQogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY29sbGVjdGVkUmVzdWx0OwogCi0gICAgICAgICAgICBQYXJ0aWFsUmVzdWx0UXVpcmtJbkZsaWdodCgpOgorICAgICAgICAgICAgUGFydGlhbFJlc3VsdEluRmxpZ2h0KCk6CiAgICAgICAgICAgICAgICAgICAgIGhhdmVTZW50M0EoZmFsc2UpIHsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBwYXJ0aWFsUmVzdWx0UXVpcms7CisgICAgICAgIH0gcGFydGlhbFJlc3VsdDsKIAogICAgICAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBieSBLZXllZFZlY3RvcgogICAgICAgICBJbkZsaWdodFJlcXVlc3QoKSA6Ci0gICAgICAgICAgICAgICAgcmVxdWVzdElkKDApLAogICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCiAgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdCgwKSB7CisgICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQoMCksCisgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpewogICAgICAgICB9CiAKLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBpZCwgaW50IG51bUJ1ZmZlcnMpIDoKLSAgICAgICAgICAgICAgICByZXF1ZXN0SWQoaWQpLAorICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMpIDoKICAgICAgICAgICAgICAgICBjYXB0dXJlVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMoT0spLAogICAgICAgICAgICAgICAgIGhhdmVSZXN1bHRNZXRhZGF0YShmYWxzZSksCi0gICAgICAgICAgICAgICAgbnVtQnVmZmVyc0xlZnQobnVtQnVmZmVycykgeworICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKICAgICAgICAgfQotICAgIH07CisKKyAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcykgOgorICAgICAgICAgICAgICAgIGNhcHR1cmVUaW1lc3RhbXAoMCksCisgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCisgICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKKyAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7CisgICAgICAgIH0KKworICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0KSA6CisgICAgICAgICAgICAgICAgY2FwdHVyZVRpbWVzdGFtcCgwKSwKKyAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKKyAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAorICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGhhc0lucHV0KXsKKyAgICAgICAgfQorfTsKICAgICAvLyBNYXAgZnJvbSBmcmFtZSBudW1iZXIgdG8gdGhlIGluLWZsaWdodCByZXF1ZXN0IHN0YXRlCiAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW5GbGlnaHRSZXF1ZXN0PiBJbkZsaWdodE1hcDsKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TG9jazsgLy8gUHJvdGVjdHMgbUluRmxpZ2h0TWFwCiAgICAgSW5GbGlnaHRNYXAgICAgICAgICAgICBtSW5GbGlnaHRNYXA7CiAKLSAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3QgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzKTsKKyAgICBzdGF0dXNfdCByZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCk7CiAKICAgICAvKioKLSAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0IHF1aXJrLCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKKyAgICAgKiBGb3IgdGhlIHBhcnRpYWwgcmVzdWx0LCBjaGVjayBpZiBhbGwgM0Egc3RhdGUgZmllbGRzIGFyZSBhdmFpbGFibGUKICAgICAgKiBhbmQgaWYgc28sIHF1ZXVlIHVwIDNBLW9ubHkgcmVzdWx0IHRvIHRoZSBjbGllbnQuIFJldHVybnMgdHJ1ZSBpZiAzQQogICAgICAqIGlzIHNlbnQuCiAgICAgICovCi0gICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUXVpcmsoaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcGFydGlhbCk7CisgICAgYm9vbCBwcm9jZXNzUGFydGlhbDNBUmVzdWx0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHBhcnRpYWwsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAKICAgICAvLyBIZWxwZXJzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIDNBIG1ldGFkYXRhIGludG8gdG8vZnJvbSBwYXJ0aWFsIHJlc3VsdHMKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgZ2V0M0FSZXN1bHQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdCwgaW50MzJfdCB0YWcsCi0gICAgICAgICAgICBUKiB2YWx1ZSwgaW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICBUKiB2YWx1ZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICBib29sIGluc2VydDNBUmVzdWx0KENhbWVyYU1ldGFkYXRhICZyZXN1bHQsIGludDMyX3QgdGFnLCBjb25zdCBUKiB2YWx1ZSwKLSAgICAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpOwogICAgIC8qKgogICAgICAqIFRyYWNraW5nIGZvciBpZGxlIGRldGVjdGlvbgogICAgICAqLwpAQCAtNTE4LDcgKzYyMCw3IEBACiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcjsKLSAgICBMaXN0PENhbWVyYU1ldGFkYXRhPiAgIG1SZXN1bHRRdWV1ZTsKKyAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAgKm1MaXN0ZW5lcjsKIApAQCAtNTMxLDYgKzYzMywxMiBAQAogCiAgICAgdm9pZCBub3RpZnkoY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpOwogCisgICAgLy8gU3BlY2lmaWMgbm90aWZ5IGhhbmRsZXJzCisgICAgdm9pZCBub3RpZnlFcnJvcihjb25zdCBjYW1lcmEzX2Vycm9yX21zZ190ICZtc2csCisgICAgICAgICAgICBOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworICAgIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZywKKyAgICAgICAgICAgIE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisKICAgICAvKioKICAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1NmIwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUR1bW15U3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkNhbWVyYTNEdW1teVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6CisgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCkgeworCit9CisKK0NhbWVyYTNEdW1teVN0cmVhbTo6fkNhbWVyYTNEdW1teVN0cmVhbSgpIHsKKworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcHJvZHVjZSBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAorICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIG1JZCk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIENhbWVyYTNEdW1teVN0cmVhbTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICAodm9pZCkgYXJnczsKKyAgICBTdHJpbmc4IGxpbmVzOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IER1bW15XG4iLCBtSWQpOworICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKKworICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvLyBEbyBub3RoaW5nCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgeworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKKyAgICBtU3RhdGUgPSAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSA/IFNUQVRFX0lOX0NPTkZJRworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CisgICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7CisgICAgcmV0dXJuIE9LOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MjYyMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRFVNTVlfU1RSRUFNX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorCisjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgIkNhbWVyYTNJT1N0cmVhbUJhc2UuaCIKKyNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoqCisgKiBBIGR1bW15IG91dHB1dCBzdHJlYW0gY2xhc3MsIHRvIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciB3aGVuIG5vIHZhbGlkCisgKiBzdHJlYW1zIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBjbGllbnQuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbWVyYSBIQUwgdjMuMiBvciBvbGRlciBkaXNhbGxvdyBjb25maWd1cmluZworICogMCBvdXRwdXQgc3RyZWFtcywgd2hpbGUgdGhlIHB1YmxpYyBjYW1lcmEyIEFQSSBhbGxvd3MgZm9yIGl0LgorICovCitjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0gOgorICAgICAgICBwdWJsaWMgQ2FtZXJhM0lPU3RyZWFtQmFzZSwKKyAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UgeworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgYSBkdW1teSBzdHJlYW07IGRvZXNuJ3QgYWN0dWFsbHkgY29ubmVjdCB0byBhbnl0aGluZywgYW5kIHVzZXMKKyAgICAgKiBhIGRlZmF1bHQgZHVtbXkgZm9ybWF0IGFuZCBzaXplLgorICAgICAqLworICAgIENhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpOworCisgICAgdmlydHVhbCB+Q2FtZXJhM0R1bW15U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQorICAgICAqLworCisgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldFRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKworICBwcml2YXRlOgorCisgICAgLy8gRGVmYXVsdCBkdW1teSBwYXJhbWV0ZXJzOyAzMjB4MjQwIGlzIGEgcmVxdWlyZWQgc2l6ZSBmb3IgYWxsIGRldmljZXMsCisgICAgLy8gb3RoZXJ3aXNlIGFjdCBsaWtlIGEgU3VyZmFjZVZpZXcgd291bGQuCisgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9XSURUSCA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0hFSUdIVCA9IDI0MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworCit9OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggZGE1MTIyOC4uY2M2NjQ1OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0xOCw4ICsxOCw3IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHN0ZGludC5oIHRvIGRlZmluZSBJTlQ2NF9NQVggaW4gQysrCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KQEAgLTM1LDcgKzM0LDggQEAKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQpLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKLSAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQoMCksCisgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUZyYW1lQ291bnQoMCksCiAgICAgICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIApAQCAtNTQsMTAgKzU0LDEwIEBACiAKIGJvb2wgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6aGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkgY29uc3QgewogICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IG1Db21iaW5lZEZlbmNlLT5nZXRTaWduYWxUaW1lKCk7Ci0gICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEhhcyAlZCBvdXRzdGFuZGluZyBidWZmZXJzLCIKLSAgICAgICAgICAgICIgYnVmZmVyIHNpZ25hbCB0aW1lIGlzICVsbGQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1EZXF1ZXVlZEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CisgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVycywiCisgICAgICAgICAgICAiIGJ1ZmZlciBzaWduYWwgdGltZSBpcyAlIiBQUklkNjQsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LCBzaWduYWxUaW1lKTsKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID4gMCB8fCBzaWduYWxUaW1lID09IElOVDY0X01BWCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzAsMTMgKzcwLDEzIEBACiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEaW1zOiAlZCB4ICVkLCBmb3JtYXQgMHgleFxuIiwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICVkXG4iLCBtTWF4U2l6ZSk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBVc2FnZTogJWQsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZXMgcHJvZHVjZWQ6ICVkLCBsYXN0IHRpbWVzdGFtcDogJWxsZCBuc1xuIiwKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlZCwgY3VycmVudGx5IGRlcXVldWVkOiAlZFxuIiwKLSAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50LCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLAorICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQsIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCk7CiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQogCkBAIC0xMDUsNiArMTA1LDE0IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OworfQorCitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgLSBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX0lOX1JFQ09ORklHOgpAQCAtMTE4LDkgKzEyNiw5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVOT1RDT05OOwogICAgIH0KIAotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBkaXNjb25uZWN0IHdpdGggJWQgYnVmZmVycyBzdGlsbCBkZXF1ZXVlZCEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURlcXVldWVkQnVmZmVyQ291bnQpOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZGlzY29ubmVjdCB3aXRoICV6dSBidWZmZXJzIHN0aWxsIGRlcXVldWVkISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xMzEsNyArMTM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlRmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0KSB7CiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IGFsbCBmZW5jZXMgYXJlIG5vdyBvd25lZCBieSBIQUwuCiAgICAgICovCkBAIC0xNDUsMTQgKzE1NCwyNSBAQAogICAgIGJ1ZmZlci5zdGF0dXMgPSBzdGF0dXM7CiAKICAgICAvLyBJbmZvcm0gdHJhY2tlciBhYm91dCBiZWNvbWluZyBidXN5Ci0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgorICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCiAgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF2b2lkIGEgc3B1cmlvdXMgSURMRS0+QUNUSVZFLT5JRExFIHRyYW5zaXRpb24gd2hlbiB1c2luZyBidWZmZXJzCisgICAgICAgICAqIGJlZm9yZS9hZnRlciByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBkdXJpbmcgaW5pdGlhbCBjb25maWd1cmF0aW9uCisgICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgY2hlY2tzIG9ubHkgbWFrZSBzZW5zZSBmb3IgPEhBTDMuMgorICAgICAgICAgKi8KICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtU3RhdHVzSWQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50Kys7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50Kys7CisKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3QgewpAQCAtMTY0LDE1ICsxODQsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgLy8gT25seSBsaW1pdCBkZXF1ZXVlIGFtb3VudCB3aGVuIGZ1bGx5IGNvbmZpZ3VyZWQKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQgJiYKLSAgICAgICAgICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID09IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycykgewotICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQWxyZWFkeSBkZXF1ZXVlZCBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMiCi0gICAgICAgICAgICAgICAgIiBidWZmZXJzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xODQsNyArMTk1LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCkgeworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogTm8gYnVmZmVycyBvdXRzdGFuZGluZyB0byByZXR1cm4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjIyLDkgKzIzMywyMCBAQAogICAgICAgICBtQ29tYmluZWRGZW5jZSA9IEZlbmNlOjptZXJnZShtTmFtZSwgbUNvbWJpbmVkRmVuY2UsIHJlbGVhc2VGZW5jZSk7CiAgICAgfQogCi0gICAgbURlcXVldWVkQnVmZmVyQ291bnQtLTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG91dHB1dCkgeworICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50LS07CisgICAgfQorCisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LS07CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAvKioKKyAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKKyAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqLwogICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogQWxsIGJ1ZmZlcnMgcmV0dXJuZWQ7IG5vdyBpZGxlIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIG1JZCk7CiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IGZjYjlkMDQuLmEzNWMyOTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC00OCw3ICs0OCwxMCBAQAogICBwcm90ZWN0ZWQ6CiAgICAgc2l6ZV90ICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQ7CiAgICAgLy8gc3VtIG9mIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyB0aGF0IGFyZSBjdXJyZW50bHkgYWNxdWlyZWQgYnkgSEFMCi0gICAgc2l6ZV90ICAgICAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50OworICAgIC8vIG51bWJlciBvZiBvdXRwdXQgYnVmZmVycyB0aGF0IGFyZSBjdXJyZW50bHkgYWNxdWlyZWQgYnkgSEFMLiBUaGlzIHdpbGwgYmUKKyAgICAvLyBSZWR1bmRhbnQgd2hlbiBjYW1lcmEzIHN0cmVhbXMgYXJlIG5vIGxvbmdlciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMuCisgICAgc2l6ZV90ICAgICAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKICAgICBDb25kaXRpb24gICAgICAgICBtQnVmZmVyUmV0dXJuZWRTaWduYWw7CiAgICAgdWludDMyX3QgICAgICAgICAgbUZyYW1lQ291bnQ7CiAgICAgLy8gTGFzdCByZWNlaXZlZCBvdXRwdXQgYnVmZmVyJ3MgdGltZXN0YW1wCkBAIC03Niw2ICs3OSwxMCBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKIAogICAgIHN0YXR1c190IGdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3Q7CkBAIC05Miw3ICs5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZV9mZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbGVhc2VfZmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdXRwdXQpOwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzSU9TdHJlYW1CYXNlCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCA1YWE5YTNlLi4zMTliZTFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL2ZhbHNlKTsKICAgICBtQnVmZmVyc0luRmxpZ2h0LnB1c2hfYmFjayhidWZmZXJJdGVtKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE5OSwxNCArMTk5LDM2IEBACiAgICAgYXNzZXJ0KG1NYXhTaXplID09IDApOwogICAgIGFzc2VydChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7CiAKLSAgICBtVG90YWxCdWZmZXJDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9IDA7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAKICAgICBpZiAobUNvbnN1bWVyLmdldCgpID09IDApIHsKLSAgICAgICAgc3A8QnVmZmVyUXVldWU+IGJxID0gbmV3IEJ1ZmZlclF1ZXVlKCk7Ci0gICAgICAgIG1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoYnEsIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSwKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworCisgICAgICAgIGludCBtaW5VbmRlcXVldWVkQnVmZmVycyA9IDA7CisgICAgICAgIHJlcyA9IHByb2R1Y2VyLT5xdWVyeShOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ291bGQgbm90IHF1ZXJ5IG1pbiB1bmRlcXVldWVkIGJ1ZmZlcnMgKGVycm9yICVkLCBidWZDb3VudCAlZCkiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHJlcywgbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgbWluQnVmcyA9IHN0YXRpY19jYXN0PHNpemVfdD4obWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgICAgICAvKgorICAgICAgICAgKiBXZSBwcm9taXNlIG5ldmVyIHRvICdhY3F1aXJlJyBtb3JlIHRoYW4gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzCisgICAgICAgICAqIGF0IGFueSBvbmUgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQm9vc3QgdGhlIG51bWJlciB1cCB0byBtZWV0IHRoZSBtaW5pbXVtIHJlcXVpcmVkIGJ1ZmZlciBjb3VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogKE5vdGUgdGhhdCB0aGlzIHNldHMgY29uc3VtZXItc2lkZSBidWZmZXIgY291bnQgb25seSwKKyAgICAgICAgICogYW5kIG5vdCB0aGUgc3VtIG9mIHByb2R1Y2VyK2NvbnN1bWVyIHNpZGUgYXMgaW4gb3RoZXIgY2FtZXJhIHN0cmVhbXMpLgorICAgICAgICAgKi8KKyAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPiBtaW5CdWZzID8KKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA6IG1pbkJ1ZnM7CisgICAgICAgIC8vIFRPRE86IHNvbWVob3cgc2V0IHRoZSB0b3RhbCBidWZmZXIgY291bnQgd2hlbiBwcm9kdWNlciBjb25uZWN0cz8KKworICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLCBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICBtQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEzLUlucHV0U3RyZWFtLSVkIiwgbUlkKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggNjgxZDY4NC4uYWU0OTQ2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC00NCw2ICs0NCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAorICAgIC8vIFRPRE86IGV4cG9zZSBhbiBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisKICAgcHJpdmF0ZToKIAogICAgIHR5cGVkZWYgQnVmZmVySXRlbUNvbnN1bWVyOjpCdWZmZXJJdGVtIEJ1ZmZlckl0ZW07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCA2ODI3NTVkLi43N2FkNTAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTM3LDcgKzM3LDggQEAKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0KSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKLSAgICAgICAgbVRyYW5zZm9ybSgwKSB7CisgICAgICAgIG1UcmFuc2Zvcm0oMCksCisgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpIHsKIAogICAgIGlmIChtQ29uc3VtZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENvbnN1bWVyIGlzIE5VTEwhIiwgX19GVU5DVElPTl9fKTsKQEAgLTUxLDcgKzUyLDggQEAKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCksCiAgICAgICAgIG1Db25zdW1lcihjb25zdW1lciksCi0gICAgICAgIG1UcmFuc2Zvcm0oMCkgeworICAgICAgICBtVHJhbnNmb3JtKDApLAorICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSB7CiAKICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBBTE9HRSgiJXM6IEJhZCBmb3JtYXQgZm9yIHNpemUtb25seSBzdHJlYW06ICVkIiwgX19GVU5DVElPTl9fLApAQCAtMTE5LDcgKzEyMSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjAyLDYgKzIwNCwxNSBAQAogICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1UcmFjZUZpcnN0QnVmZmVyICYmIChzdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQpKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciB0cmFjZUxvZ1s0OF07CisgICAgICAgICAgICAgICAgc25wcmludGYodHJhY2VMb2csIHNpemVvZih0cmFjZUxvZyksICJTdHJlYW0gJWQ6IGZpcnN0IGZ1bGwgYnVmZmVyXG4iLCBtSWQpOworICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKHRyYWNlTG9nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPnF1ZXVlQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLmJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwKICAgICAgICAgICAgICAgICBhbndSZWxlYXNlRmVuY2UpOwpAQCAtMjU3LDYgKzI2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjb25maWd1cmVRdWV1ZUxvY2tlZCgpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKKyAgICBtVHJhY2VGaXJzdEJ1ZmZlciA9IHRydWU7CiAgICAgaWYgKChyZXMgPSBDYW1lcmEzSU9TdHJlYW1CYXNlOjpjb25maWd1cmVRdWV1ZUxvY2tlZCgpKSAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTI4OSwyMCArMzAxLDI1IEBACiAKICAgICBpZiAobU1heFNpemUgPT0gMCkgewogICAgICAgICAvLyBGb3IgYnVmZmVycyBvZiBrbm93biBzaXplCi0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1Db25zdW1lci5nZXQoKSwKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZvciBidWZmZXJzIHdpdGggYm91bmRlZCBzaXplCi0gICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgICAgIG1NYXhTaXplLCAxLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgICAgIG1NYXhTaXplLCAxKTsKICAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBnZW9tZXRyeSIKLSAgICAgICAgICAgICAgICAiICVkIHggJWQsIGZvcm1hdCAleCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAiICVkIHggJWQgKG1heFNpemUgJXp1KSBmb3Igc3RyZWFtICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBtSWQpOworICAgICAgICAgICAgICAgIG1NYXhTaXplLCBtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXIuZ2V0KCksCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCAlI3ggZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCBtSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIApAQCAtMzI0LDcgKzM0MSw3IEBACiAgICAgfQogCiAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQgPSAwOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogICAgIG1MYXN0VGltZXN0YW1wID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2Y2JiOWY0Li5iZTI3OGM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtNzYsMTIgKzc2LDE2IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKKwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1Db25zdW1lcjsKICAgcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtVHJhbnNmb3JtOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgc2V0VHJhbnNmb3JtTG9ja2VkKGludCB0cmFuc2Zvcm0pOwogCisgICAgYm9vbCBtVHJhY2VGaXJzdEJ1ZmZlcjsKKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCkBAIC05MSw3ICs5NSw2IEBACiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggNmQyY2Y5NC4uM2MwZTkwOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTEzNyw2ICsxMzksNyBAQAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09OU1RSVUNURUQpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fQ09ORklHOwogICAgIH0gZWxzZSB7IC8vIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVECisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQsICJJbnZhbGlkIHN0YXRlOiAweCV4IiwgbVN0YXRlKTsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5fUkVDT05GSUc7CiAgICAgfQogCkBAIC0yMDYsMTEgKzIwOSw2MSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmNhbmNlbENvbmZpZ3VyYXRpb24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW4gZXJyb3Igc3RhdGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFNUQVRFX0lOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKKyAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9DT05TVFJVQ1RFRDoKKyAgICAgICAgY2FzZSBTVEFURV9DT05GSUdVUkVEOgorICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgY2FuY2VsIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXNuJ3QgYmVlbiBzdGFydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlID0gb2xkVXNhZ2U7CisgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gb2xkTWF4QnVmZmVyczsKKworICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfQ09ORklHVVJFRCA6IFNUQVRFX0NPTlNUUlVDVEVEOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgY29uZmlndXJlZCBhbHJlYWR5LgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICBpZiAoZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggb3V0cHV0IGJ1ZmZlcnMgKCVkKSwgd2FpdCBmb3IgbmV4dCByZXR1cm5lZCBvbmUuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgIHJlcyA9IG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3Igb3V0cHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgqYnVmZmVyLCAvKmFjcXVpcmVkKi90cnVlLCAvKm91dHB1dCovdHJ1ZSk7CiAgICAgfQpAQCAtMjIzLDkgKzI3NiwxOCBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCisgICAgLyoqCisgICAgICogVE9ETzogQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaXMgdmFsaWQgZmlyc3QuCisgICAgICoKKyAgICAgKiA8SEFMMy4yIElOX0NPTkZJRyBhbmQgSU5fUkVDT05GSUcgaW4gYWRkaXRpb24gdG8gQ09ORklHVVJFRC4KKyAgICAgKiA+PSBIQUwzLjIgQ09ORklHVVJFRCBvbmx5CisgICAgICoKKyAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KKyAgICAgKi8KICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMjM0LDggKzI5NiwzMCBAQAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0SW5wdXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCisgICAgaWYgKGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggaW5wdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXQgZm9yIGlucHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki9mYWxzZSk7CiAgICAgfQpAQCAtMjUwLDYgKzMzNCw3IEBACiAgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL2ZhbHNlKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwuc2lnbmFsKCk7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0zMTQsMTIgKzM5OSwzNSBAQAogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZWdpc3RlckJ1ZmZlcnNMb2NrZWQoY2FtZXJhM19kZXZpY2UgKmhhbDNEZXZpY2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgLyoqCisgICAgICogPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICoKKyAgICAgKiBjYW1lcmEzX2RldmljZV90LT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzKCkgaXMgbm90IGNhbGxlZCBhbmQgbXVzdAorICAgICAqIGJlIE5VTEwuCisgICAgICovCisgICAgaWYgKGhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIEFMT0dWKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgdW51c2VkIGFzIG9mIEhBTDMuMiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgaWYgKGhhbDNEZXZpY2UtPm9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBpcyBkZXByZWNhdGVkIGluIEhBTDMuMjsgIgorICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzZXQgdG8gTlVMTCBpbiBjYW1lcmEzX2RldmljZTo6b3BzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogU2tpcHBpbmcgTlVMTCBjaGVjayBmb3IgZGVwcmVjYXRlZCByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyB1c2luZyBkZXByZWNhdGVkIGNvZGUgcGF0aCIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAogICAgIFZlY3RvcjxidWZmZXJfaGFuZGxlX3QqPiBidWZmZXJzOwotICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoTlVMTCwgMCwgYnVmZmVyQ291bnQpOworICAgIGJ1ZmZlcnMuaW5zZXJ0QXQoLypwcm90b3R5cGVfaXRlbSovTlVMTCwgLyppbmRleCovMCwgYnVmZmVyQ291bnQpOwogCiAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3NldCBidWZmZXJTZXQgPSBjYW1lcmEzX3N0cmVhbV9idWZmZXJfc2V0KCk7CiAgICAgYnVmZmVyU2V0LnN0cmVhbSA9IHRoaXM7CkBAIC0zMjcsNyArNDM1LDcgQEAKICAgICBidWZmZXJTZXQuYnVmZmVycyA9IGJ1ZmZlcnMuZWRpdEFycmF5KCk7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnM7Ci0gICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAwLCBidWZmZXJDb3VudCk7CisgICAgc3RyZWFtQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CiAKICAgICAvLyBSZWdpc3RlciBhbGwgYnVmZmVycyB3aXRoIHRoZSBIQUwuIFRoaXMgbWVhbnMgZ2V0dGluZyBhbGwgdGhlIGJ1ZmZlcnMKICAgICAvLyBmcm9tIHRoZSBzdHJlYW0sIHByb3ZpZGluZyB0aGVtIHRvIHRoZSBIQUwgd2l0aCB0aGUKQEAgLTM1Myw3ICs0NjEsNyBAQAogICAgIH0KICAgICBpZiAoYnVmZmVySWR4ID09IGJ1ZmZlckNvdW50KSB7CiAgICAgICAgIC8vIEdvdCBhbGwgYnVmZmVycywgcmVnaXN0ZXIgd2l0aCBIQUwKLSAgICAgICAgQUxPR1YoIiVzOiBSZWdpc3RlcmluZyAlZCBidWZmZXJzIHdpdGggY2FtZXJhIEhBTCIsCisgICAgICAgIEFMT0dWKCIlczogUmVnaXN0ZXJpbmcgJXp1IGJ1ZmZlcnMgd2l0aCBjYW1lcmEgSEFMIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlckNvdW50KTsKICAgICAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5yZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyIpOwogICAgICAgICByZXMgPSBoYWwzRGV2aWNlLT5vcHMtPnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzKGhhbDNEZXZpY2UsCkBAIC0zOTQsNiArNTAyLDE4IEBACiB2b2lkIENhbWVyYTNTdHJlYW06OmFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuYmVnaW4oKSwgZW5kID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5lbmQoKTsKKyAgICAgICAgIGl0ICE9IGVuZDsKKyAgICAgICAgICkgeworICAgICAgICBpZiAoKml0ID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeSB0byBhZGQgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UsIGlnbm9yaW5nLi4uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKwogICAgIG1CdWZmZXJMaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCA2ZWViNzIxLi5kMGUxMzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtODIsNiArODIsMjMgQEAKICAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX0NPTlNUUlVDVEVEOgogICogICAgICAgIFdoZW4gZGlzY29ubmVjdCgpIGlzIGNhbGxlZCBhZnRlciBtYWtpbmcgc3VyZSBzdHJlYW0gaXMgaWRsZSB3aXRoCiAgKiAgICAgICAgd2FpdFVudGlsSWRsZSgpLgorICoKKyAqIFN0YXR1cyBUcmFja2luZzoKKyAqICAgIEVhY2ggc3RyZWFtIGlzIHRyYWNrZWQgYnkgU3RhdHVzVHJhY2tlciBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCwKKyAqICAgIGRlcGVuZGluZyBvbiB0aGUgaGFuZGVkIG91dCBidWZmZXIgY291bnQuIFRoZSBzdGF0ZSBtdXN0IGJlIFNUQVRFX0NPTkZJR1VSRUQKKyAqICAgIGluIG9yZGVyIGZvciB0aGUgY29tcG9uZW50IHRvIGJlIG1hcmtlZC4KKyAqCisgKiAgICBJdCdzIG1hcmtlZCBpbiBvbmUgb2YgdHdvIHdheXM6CisgKgorICogICAgLSBBQ1RJVkU6IE9uZSBvciBtb3JlIGJ1ZmZlcnMgaGF2ZSBiZWVuIGhhbmRlZCBvdXQgKHdpdGggI2dldEJ1ZmZlcikuCisgKiAgICAtIElETEU6IEFsbCBidWZmZXJzIGhhdmUgYmVlbiByZXR1cm5lZCAod2l0aCAjcmV0dXJuQnVmZmVyKSwgYW5kIHRoZWlyCisgKiAgICAgICAgICByZXNwZWN0aXZlIHJlbGVhc2VfZmVuY2UocykgaGF2ZSBiZWVuIHNpZ25hbGVkLgorICoKKyAqICAgIEEgdHlwaWNhbCB1c2UgY2FzZSBpcyBvdXRwdXQgc3RyZWFtcy4gV2hlbiB0aGUgSEFMIGhhcyBhbnkgYnVmZmVycworICogICAgZGVxdWV1ZWQsIHRoZSBzdHJlYW0gaXMgbWFya2VkIEFDVElWRS4gV2hlbiB0aGUgSEFMIHJldHVybnMgYWxsIGJ1ZmZlcnMKKyAqICAgIChlLmcuIGlmIG5vIGNhcHR1cmUgcmVxdWVzdHMgYXJlIGFjdGl2ZSksIHRoZSBzdHJlYW0gaXMgbWFya2VkIElETEUuCisgKiAgICBJbiB0aGlzIHVzZSBjYXNlLCB0aGUgYXBwIGNvbnN1bWVyIGRvZXMgbm90IGFmZmVjdCB0aGUgY29tcG9uZW50IHN0YXR1cy4KKyAqCiAgKi8KIGNsYXNzIENhbWVyYTNTdHJlYW0gOgogICAgICAgICBwcm90ZWN0ZWQgY2FtZXJhM19zdHJlYW0sCkBAIC0xNDIsNiArMTU5LDEzIEBACiAgICAgc3RhdHVzX3QgICAgICAgICBmaW5pc2hDb25maWd1cmF0aW9uKGNhbWVyYTNfZGV2aWNlICpoYWwzRGV2aWNlKTsKIAogICAgIC8qKgorICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFRoaXMgcmV0dXJucyB0aGUgc3RyZWFtIHRvIHRoZQorICAgICAqIGluaXRpYWwgc3RhdGUsIGFsbG93aW5nIGl0IHRvIGJlIGNvbmZpZ3VyZWQgYWdhaW4gbGF0ZXIuCisgICAgICogVGhpcyBpcyBkb25lIGlmIHRoZSBIQUwgcmVqZWN0cyB0aGUgcHJvcG9zZWQgY29tYmluZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIGNhbmNlbENvbmZpZ3VyYXRpb24oKTsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKQEAgLTIwOSw4ICsyMzMsMTcgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCA9IDA7CiAKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gQWRkaW5nIHRoZSBzYW1lIGxpc3RlbmVyIHR3aWNlIGhhcworICAgICAqIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIGFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgd3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBjYW1lcmEzIGJ1ZmZlciBsaXN0ZW5lci4gUmVtb3ZpbmcgdGhlIHNhbWUgbGlzdGVuZXIgdHdpY2UKKyAgICAgKiBvciB0aGUgbGlzdGVuZXIgdGhhdCB3YXMgbmV2ZXIgYWRkZWQgaGFzIG5vIGVmZmVjdC4KKyAgICAgKi8KICAgICB2b2lkICAgICAgICAgICAgIHJlbW92ZUJ1ZmZlckxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiYgbGlzdGVuZXIpOwogCkBAIC0yNjIsNiArMjk1LDEyIEBACiAgICAgLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcXVldWUKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCisgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKworICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CkBAIC0yNzQsNiArMzEzLDkgQEAKICAgcHJpdmF0ZToKICAgICB1aW50MzJfdCBvbGRVc2FnZTsKICAgICB1aW50MzJfdCBvbGRNYXhCdWZmZXJzOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIC8vIEdldHMgYWxsIGJ1ZmZlcnMgZnJvbSBlbmRwb2ludCBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgSEFMLgogICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGM5M2FlMTUuLmRhOTg5Y2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC04Miw2ICs4MiwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluaXNoQ29uZmlndXJhdGlvbihjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogQ2FuY2VscyB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gVGhpcyByZXR1cm5zIHRoZSBzdHJlYW0gdG8gdGhlCisgICAgICogaW5pdGlhbCBzdGF0ZSwgYWxsb3dpbmcgaXQgdG8gYmUgY29uZmlndXJlZCBhZ2FpbiBsYXRlci4KKyAgICAgKiBUaGlzIGlzIGRvbmUgaWYgdGhlIEhBTCByZWplY3RzIHRoZSBwcm9wb3NlZCBjb21iaW5lZCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsQ29uZmlndXJhdGlvbigpID0gMDsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCmluZGV4IDA0ZjVkYzUuLjgxMzMwZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcApAQCAtMTgsNiArMTgsOCBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlICJDYW1lcmEzWnNsU3RyZWFtLmgiCkBAIC0xMDksMTUgKzExMSwxNyBAQAogfSAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCiAKIENhbWVyYTNac2xTdHJlYW06OkNhbWVyYTNac2xTdHJlYW0oaW50IGlkLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICBpbnQgZGVwdGgpIDoKKyAgICAgICAgaW50IGJ1ZmZlckNvdW50KSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpLAotICAgICAgICBtRGVwdGgoZGVwdGgpIHsKKyAgICAgICAgbURlcHRoKGJ1ZmZlckNvdW50KSB7CiAKLSAgICBzcDxCdWZmZXJRdWV1ZT4gYnEgPSBuZXcgQnVmZmVyUXVldWUoKTsKLSAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGJxLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGRlcHRoKTsKLSAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShicSk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtUHJvZHVjZXIgPSBuZXcgUmluZ0J1ZmZlckNvbnN1bWVyKGNvbnN1bWVyLCBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wsIGJ1ZmZlckNvdW50KTsKKyAgICBtQ29uc3VtZXIgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiB9CiAKIENhbWVyYTNac2xTdHJlYW06On5DYW1lcmEzWnNsU3RyZWFtKCkgewpAQCAtMTcyLDcgKzE3Niw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spOworICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogCiAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soYnVmZmVySXRlbSk7CiAKQEAgLTI3MSw3ICsyNzUsNyBAQAogICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOwogCiAgICAgbGluZXMgPSBTdHJpbmc4KCk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBJbnB1dCBidWZmZXJzIHBlbmRpbmc6ICVkLCBpbiBmbGlnaHQgJWRcbiIsCisgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBJbnB1dCBidWZmZXJzIHBlbmRpbmc6ICV6dSwgaW4gZmxpZ2h0ICV6dVxuIiwKICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLnNpemUoKSwgbUJ1ZmZlcnNJbkZsaWdodC5zaXplKCkpOwogICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKIH0KQEAgLTI5Niw4ICszMDAsOSBAQAogICAgIG5zZWNzX3QgYWN0dWFsID0gcGlubmVkQnVmZmVyLT5nZXRCdWZmZXJJdGVtKCkubVRpbWVzdGFtcDsKIAogICAgIGlmIChhY3R1YWwgIT0gdGltZXN0YW1wKSB7CisgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgcHJvYmxlbWF0aWMsIHdlJ2xsIGVuZCB1cCB3aXRoIHVzaW5nIHdyb25nIHJlc3VsdCBmb3IgdGhpcyBwaW5uZWQgYnVmZmVyLgogICAgICAgICBBTE9HVygiJXM6IFpTTCBidWZmZXIgY2FuZGlkYXRlIHNlYXJjaCBkaWRuJ3QgZmluZCBhbiBleGFjdCBtYXRjaCAtLSIKLSAgICAgICAgICAgICAgIiByZXF1ZXN0ZWQgdGltZXN0YW1wID0gJWxsZCwgYWN0dWFsIHRpbWVzdGFtcCA9ICVsbGQiLAorICAgICAgICAgICAgICAiIHJlcXVlc3RlZCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgYWN0dWFsIHRpbWVzdGFtcCA9ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aW1lc3RhbXAsIGFjdHVhbCk7CiAgICAgfQogCkBAIC0zMTAsMTQgKzMxNSwyOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6Y2xlYXJJbnB1dFJpbmdCdWZmZXIoKSB7CitzdGF0dXNfdCBDYW1lcmEzWnNsU3RyZWFtOjpjbGVhcklucHV0UmluZ0J1ZmZlcihuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKKyAgICByZXR1cm4gY2xlYXJJbnB1dFJpbmdCdWZmZXJMb2NrZWQobGF0ZXN0VGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6Y2xlYXJJbnB1dFJpbmdCdWZmZXJMb2NrZWQobnNlY3NfdCogbGF0ZXN0VGltZXN0YW1wKSB7CisKKyAgICBpZiAobGF0ZXN0VGltZXN0YW1wKSB7CisgICAgICAgICpsYXRlc3RUaW1lc3RhbXAgPSBtUHJvZHVjZXItPmdldExhdGVzdFRpbWVzdGFtcCgpOworICAgIH0KICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5jbGVhcigpOwogCiAgICAgcmV0dXJuIG1Qcm9kdWNlci0+Y2xlYXIoKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1pzbFN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKKyAgICBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChOVUxMKTsKKworICAgIHJldHVybiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCk7Cit9CisKIHN0YXR1c190IENhbWVyYTNac2xTdHJlYW06OnNldFRyYW5zZm9ybShpbnQgLyp0cmFuc2Zvcm0qLykgewogICAgIEFMT0dWKCIlczogTm90IGltcGxlbWVudGVkIiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCmluZGV4IGM3ZjQ0OTAuLjUzMjNhNDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5oCkBAIC0zNywxMCArMzcsMTAgQEAKICAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW0gewogICBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogU2V0IHVwIGEgWlNMIHN0cmVhbSBvZiBhIGdpdmVuIHJlc29sdXRpb24uIERlcHRoIGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycworICAgICAqIFNldCB1cCBhIFpTTCBzdHJlYW0gb2YgYSBnaXZlbiByZXNvbHV0aW9uLiBidWZmZXJDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMKICAgICAgKiBjYWNoZWQgd2l0aGluIHRoZSBzdHJlYW0gdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZvciBpbnB1dC4KICAgICAgKi8KLSAgICBDYW1lcmEzWnNsU3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGRlcHRoKTsKKyAgICBDYW1lcmEzWnNsU3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGJ1ZmZlckNvdW50KTsKICAgICB+Q2FtZXJhM1pzbFN0cmVhbSgpOwogCiAgICAgdmlydHVhbCB2b2lkICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CkBAIC01OSw4ICs1OSwxMCBAQAogCiAgICAgLyoqCiAgICAgICogQ2xlYXJzIHRoZSBidWZmZXJzIHRoYXQgY2FuIGJlIHVzZWQgYnkgZW5xdWV1ZUlucHV0QnVmZmVyQnlUaW1lc3RhbXAKKyAgICAgKiBsYXRlc3RUaW1lc3RhbXAgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbGFyZ2VzdCB0aW1lc3RhbXAgb2YgYnVmZmVycworICAgICAqIGJlaW5nIGNsZWFyZWQsIDAgaWYgdGhlcmUgaXMgbm8gYnVmZmVyIGJlaW5nIGNsZWFyLgogICAgICAqLwotICAgIHN0YXR1c190IGNsZWFySW5wdXRSaW5nQnVmZmVyKCk7CisgICAgc3RhdHVzX3QgY2xlYXJJbnB1dFJpbmdCdWZmZXIobnNlY3NfdCogbGF0ZXN0VGltZXN0YW1wKTsKIAogICBwcm90ZWN0ZWQ6CiAKQEAgLTk2LDYgKzk4LDEyIEBACiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKKworICAgIC8vIERpc2Nvbm5ldCB0aGUgQ2FtZXJhM1pzbFN0cmVhbSBzcGVjaWZpYyBidWZmZXJRdWV1ZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisKKyAgICBzdGF0dXNfdCBjbGVhcklucHV0UmluZ0J1ZmZlckxvY2tlZChuc2Vjc190KiBsYXRlc3RUaW1lc3RhbXApOworCiB9OyAvLyBjbGFzcyBDYW1lcmEzWnNsU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcAppbmRleCBhYjU0MTlmLi43MjNiNWMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKQEAgLTE4LDkgKzE4LDYgQEAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0vLyBUaGlzIGlzIG5lZWRlZCBmb3Igc3RkaW50LmggdG8gZGVmaW5lIElOVDY0X01BWCBpbiBDKysKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDx1aS9GZW5jZS5oPgpAQCAtNTIsNyArNDksNyBAQAogICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgY29tcG9uZW50ICVkIiwgX19GVU5DVElPTl9fLCBpZCk7CiAKICAgICAgICAgZXJyID0gbVN0YXRlcy5hZGQoaWQsIElETEUpOwotICAgICAgICBBTE9HRV9JRihlcnIgPCAwLCAiJXM6IENhbid0IGFkZCBuZXcgY29tcG9uZW50ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgQUxPR0VfSUYoZXJyIDwgMCwgIiVzOiBDYW4ndCBhZGQgbmV3IGNvbXBvbmVudCAlZDogJXMgKCV6ZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQsIHN0cmVycm9yKC1lcnIpLCBlcnIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCA5YTZkYzI4Li5mODU2MmVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMTcsNiArMTcsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJSaW5nQnVmZmVyQ29uc3VtZXIiCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Z3VpL1JpbmdCdWZmZXJDb25zdW1lci5oPgpAQCAtMzgsNyArNDEsOCBAQAogICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLAogICAgICAgICBpbnQgYnVmZmVyQ291bnQpIDoKICAgICBDb25zdW1lckJhc2UoY29uc3VtZXIpLAotICAgIG1CdWZmZXJDb3VudChidWZmZXJDb3VudCkKKyAgICBtQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpLAorICAgIG1MYXRlc3RUaW1lc3RhbXAoMCkKIHsKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwogICAgIG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CkBAIC0xNDksNiArMTUzLDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCituc2Vjc190IFJpbmdCdWZmZXJDb25zdW1lcjo6Z2V0TGF0ZXN0VGltZXN0YW1wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIGlmIChtQnVmZmVySXRlbUxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtTGF0ZXN0VGltZXN0YW1wOworfQorCiB2b2lkIFJpbmdCdWZmZXJDb25zdW1lcjo6cGluQnVmZmVyTG9ja2VkKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKICAgICBMaXN0PFJpbmdCdWZmZXJJdGVtPjo6aXRlcmF0b3IgaXQsIGVuZDsKIApAQCAtMTY0LDEwICsxNzYsMTAgQEAKICAgICB9CiAKICAgICBpZiAoaXQgPT0gZW5kKSB7Ci0gICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byBwaW4gYnVmZmVyICh0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCkiLAorICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gcGluIGJ1ZmZlciAodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQgIikiLAogICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBCSV9MT0dWKCJQaW5uZWQgYnVmZmVyIChmcmFtZSAlbGxkLCB0aW1lc3RhbXAgJWxsZCkiLAorICAgICAgICBCSV9MT0dWKCJQaW5uZWQgYnVmZmVyIChmcmFtZSAlIiBQUkl1NjQgIiwgdGltZXN0YW1wICUiIFBSSWQ2NCAiKSIsCiAgICAgICAgICAgICAgICAgaXRlbS5tRnJhbWVOdW1iZXIsIGl0ZW0ubVRpbWVzdGFtcCk7CiAgICAgfQogfQpAQCAtMjIyLDEyICsyMzQsMTIgQEAKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBCSV9MT0dFKCJGYWlsZWQgdG8gYWRkIHJlbGVhc2UgZmVuY2UgdG8gYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgIih0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBidWZmZXIgdGltZXN0YW1wICVsbGQsIGZyYW1lICVsbGQiLAorICAgICAgICBCSV9MT0dWKCJBdHRlbXB0aW5nIHRvIHJlbGVhc2UgYnVmZmVyIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWUgJSIgUFJJdTY0LAogICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwgaXRlbS5tRnJhbWVOdW1iZXIpOwogCiAgICAgICAgIC8vIGl0ZW0ubUdyYXBoaWNCdWZmZXIgd2FzIHBvcHVsYXRlZCB3aXRoIHRoZSBwcm9wZXIgZ3JhcGhpYy1idWZmZXIKQEAgLTI0MSw3ICsyNTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIEJJX0xPR1YoIkJ1ZmZlciB0aW1lc3RhbXAgJWxsZCwgZnJhbWUgJWxsZCBldmljdGVkIiwKKyAgICAgICAgQklfTE9HVigiQnVmZmVyIHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWUgJSIgUFJJdTY0ICIgZXZpY3RlZCIsCiAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAKICAgICAgICAgc2l6ZV90IGN1cnJlbnRTaXplID0gbUJ1ZmZlckl0ZW1MaXN0LnNpemUoKTsKQEAgLTI5NCwxMSArMzA2LDE4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCSV9MT0dWKCJOZXcgYnVmZmVyIGFjcXVpcmVkICh0aW1lc3RhbXAgJWxsZCksICIKLSAgICAgICAgICAgICAgICAiYnVmZmVyIGl0ZW1zICV1IG91dCBvZiAlZCIsCisgICAgICAgIEJJX0xPR1YoIk5ldyBidWZmZXIgYWNxdWlyZWQgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiksICIKKyAgICAgICAgICAgICAgICAiYnVmZmVyIGl0ZW1zICV6dSBvdXQgb2YgJWQiLAogICAgICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICBtQnVmZmVySXRlbUxpc3Quc2l6ZSgpLCBtQnVmZmVyQ291bnQpOwogCisgICAgICAgIGlmIChpdGVtLm1UaW1lc3RhbXAgPCBtTGF0ZXN0VGltZXN0YW1wKSB7CisgICAgICAgICAgICBCSV9MT0dFKCJUaW1lc3RhbXAgIGRlY3JlYXNlcyBmcm9tICUiIFBSSWQ2NCAiIHRvICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFRpbWVzdGFtcCwgaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXRlc3RUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXA7CisKICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1TbG90c1tpdGVtLm1CdWZdLm1HcmFwaGljQnVmZmVyOwogICAgIH0gLy8gZW5kIG9mIG1NdXRleCBsb2NrCiAKQEAgLTMyMSw3ICszNDAsNyBAQAogCiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQklfTE9HRSgiRmFpbGVkIHRvIGFkZCByZWxlYXNlIGZlbmNlIHRvIGJ1ZmZlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIodGltZXN0YW1wICUiIFBSSWQ2NCAiLCBmcmFtZW51bWJlciAlIiBQUkl1NjQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXAsIGl0ZW0ubUZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0zMzMsMTAgKzM1MiwxMCBAQAogCiAgICAgaWYgKGl0ID09IGVuZCkgewogICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIElmIGl0IGhhcHBlbnMsIHdlIGhhdmUgYSBidWcuCi0gICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byB1bnBpbiBidWZmZXIgKHRpbWVzdGFtcCAlbGxkLCBmcmFtZW51bWJlciAlbGxkKSIsCisgICAgICAgIEJJX0xPR0UoIkZhaWxlZCB0byB1bnBpbiBidWZmZXIgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWVudW1iZXIgJSIgUFJJdTY0ICIpIiwKICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQklfTE9HVigiVW5waW5uZWQgYnVmZmVyICh0aW1lc3RhbXAgJWxsZCwgZnJhbWVudW1iZXIgJWxsZCkiLAorICAgICAgICBCSV9MT0dWKCJVbnBpbm5lZCBidWZmZXIgKHRpbWVzdGFtcCAlIiBQUklkNjQgIiwgZnJhbWVudW1iZXIgJSIgUFJJdTY0ICIpIiwKICAgICAgICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wLCBpdGVtLm1GcmFtZU51bWJlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5oCmluZGV4IGI0YWQ4MjQuLmRhOTdhMTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2d1aS9SaW5nQnVmZmVyQ29uc3VtZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9ndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmgKQEAgLTY0LDcgKzY0LDcgQEAKICAgICAvLyBidWZmZXJDb3VudCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtYW55IGJ1ZmZlcnMgY2FuIGJlIHBpbm5lZCBmb3IgdXNlcgogICAgIC8vIGFjY2VzcyBhdCB0aGUgc2FtZSB0aW1lLgogICAgIFJpbmdCdWZmZXJDb25zdW1lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgY29uc3VtZXIsIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UsCi0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQgPSBCdWZmZXJRdWV1ZTo6TUlOX1VOREVRVUVVRURfQlVGRkVSUyk7CisgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQpOwogCiAgICAgdmlydHVhbCB+UmluZ0J1ZmZlckNvbnN1bWVyKCk7CiAKQEAgLTE1OSw2ICsxNTksOSBAQAogICAgIC8vIFJlbGVhc2UgYWxsIHRoZSBub24tcGlubmVkIGJ1ZmZlcnMgaW4gdGhlIHJpbmcgYnVmZmVyCiAgICAgc3RhdHVzX3QgY2xlYXIoKTsKIAorICAgIC8vIFJldHVybiAwIGlmIFJpbmdCdWZmZXIgaXMgZW1wdHksIG90aGVyd2lzZSByZXR1cm4gdGltZXN0YW1wIG9mIGxhdGVzdCBidWZmZXIuCisgICAgbnNlY3NfdCBnZXRMYXRlc3RUaW1lc3RhbXAoKTsKKwogICBwcml2YXRlOgogCiAgICAgLy8gT3ZlcnJpZGUgQ29uc3VtZXJCYXNlOjpvbkZyYW1lQXZhaWxhYmxlCkBAIC0xODAsNiArMTgzLDkgQEAKICAgICAvLyBMaXN0IG9mIGFjcXVpcmVkIGJ1ZmZlcnMgaW4gb3VyIHJpbmcgYnVmZmVyCiAgICAgTGlzdDxSaW5nQnVmZmVySXRlbT4gICAgICAgbUJ1ZmZlckl0ZW1MaXN0OwogICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudDsKKworICAgIC8vIFRpbWVzdGFtcCBvZiBsYXRlc3QgYnVmZmVyCisgICAgbnNlY3NfdCBtTGF0ZXN0VGltZXN0YW1wOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRyYWNlcy5jcHAKaW5kZXggMzQ2ZTE1Zi4uMzc0ZGM1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUcmFjZXMuY3BwCkBAIC03NCwxMCArNzQsMTAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBmZHByaW50ZihmZCwgIkNhbWVyYSB0cmFjZXMgKCV6dSk6XG4iLCBwY3NMaXN0LnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIkNhbWVyYSB0cmFjZXMgKCV6dSk6XG4iLCBwY3NMaXN0LnNpemUoKSk7CiAKICAgICBpZiAocGNzTGlzdC5lbXB0eSgpKSB7Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiICBObyBjYW1lcmEgdHJhY2VzIGNvbGxlY3RlZC5cbiIpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBjYW1lcmEgdHJhY2VzIGNvbGxlY3RlZC5cbiIpOwogICAgIH0KIAogICAgIC8vIFByaW50IG5ld2VzdCBpdGVtcyBmaXJzdApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKaW5kZXggMDgwMDZjOC4uOTVmMmZlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCkBAIC04LDQgKzgsNiBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJtZWRpYWxvZ3NlcnZpY2UKIAorTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCA2ODNmZGYzLi40MWRhYjFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTU0LDEzICs1NCwxMyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3N0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIGNvZGUgYXQgc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwogICAgIGlmICghKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUEgfHwKICAgICAgICAgICAgIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpKSB7Ci0gICAgICAgIGZkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBtZWRpYS5sb2cgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNzQsNyArNzQsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZWRSZWFkZXJzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IE5hbWVkUmVhZGVyJiBuYW1lZFJlYWRlciA9IG5hbWVkUmVhZGVyc1tpXTsKICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgIGZkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzJhZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKworaWZlcSAoJChTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRSksIDEpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKK2VuZGlmCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKKyAgICBsaWJ1aSBcCisgICAgbGlibG9nIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyIFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYmhhcmR3YXJlIFwKKyAgICBsaWJzb3VuZHRyaWdnZXIgXAorICAgIGxpYm1lZGlhCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYnNlcnZpY2V1dGlsaXR5CisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCisKK0xPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTZiMjNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTAsMCArMSw4NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvc291bmRfdHJpZ2dlci5oPgorI2luY2x1ZGUgPFNlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKKyNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAic3R1YiIKKyNlbHNlCisjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInByaW1hcnkiCisjZW5kaWYKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQorICAgIDogQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKSwKKyAgICAgIG1OZXh0VW5pcXVlSWQoMSksCisgICAgICBtTWVtb3J5RGVhbGVyKG5ldyBNZW1vcnlEZWFsZXIoMTAyNCAqIDEwMjQsICJTb3VuZFRyaWdnZXJId1NlcnZpY2UiKSksCisgICAgICBtQ2FwdHVyZVN0YXRlKGZhbHNlKQoreworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2UgKmRldjsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgSFdfTU9EVUxFX1BSRUZJWCwgJm1vZCk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgc291bmQgdHJpZ2dlciBtb2R1bGUgJXMuJXMgKCVzKSIsCisgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJjID0gc291bmRfdHJpZ2dlcl9od19kZXZpY2Vfb3Blbihtb2QsICZkZXYpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIGluICVzLiVzICglcykiLAorICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgInByaW1hcnkiLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGV2LT5jb21tb24udmVyc2lvbiAhPSBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7CisgICAgICAgIEFMT0dFKCJ3cm9uZyBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBkZXYtPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICByYyA9IGRldi0+Z2V0X3Byb3BlcnRpZXMoZGV2LCAmZGVzY3JpcHRvci5wcm9wZXJ0aWVzKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgaW1wbGVtZW50YXRpb24gcHJvcGVydGllcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRlc2NyaXB0b3IuaGFuZGxlID0KKyAgICAgICAgICAgIChzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworICAgIEFMT0dJKCJsb2FkZWQgZGVmYXVsdCBtb2R1bGUgJXMsIGhhbmRsZSAlZCIsIGRlc2NyaXB0b3IucHJvcGVydGllcy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmhhbmRsZSk7CisKKyAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBuZXcgTW9kdWxlKHRoaXMsIGRldiwgZGVzY3JpcHRvciwgY2xpZW50KTsKKyAgICBtTW9kdWxlcy5hZGQoZGVzY3JpcHRvci5oYW5kbGUsIG1vZHVsZSk7CisgICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMpOworfQorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6On5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKQoreworICAgIGlmIChtQ2FsbGJhY2tUaHJlYWQgIT0gMCkgeworICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPmV4aXQoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShtTW9kdWxlcy52YWx1ZUF0KGkpLT5od0RldmljZSgpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBtb2R1bGVzID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNpemVfdCBtYXhNb2R1bGVzID0gKm51bU1vZHVsZXM7CisgICAgKm51bU1vZHVsZXMgPSBtTW9kdWxlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCkgJiYgaSA8IG1heE1vZHVsZXM7IGkrKykgeworICAgICAgICBtb2R1bGVzW2ldID0gbU1vZHVsZXMudmFsdWVBdChpKS0+ZGVzY3JpcHRvcigpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6YXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlSW50ZXJmYWNlKQoreworICAgIEFMT0dWKCJhdHRhY2ggbW9kdWxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIG1vZHVsZUludGVyZmFjZS5jbGVhcigpOworICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZHVsZXMuaW5kZXhPZktleShoYW5kbGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGluZGV4KTsKKworICAgIG1vZHVsZS0+c2V0Q2xpZW50KGNsaWVudCk7CisgICAgY2xpZW50LT5hc0JpbmRlcigpLT5saW5rVG9EZWF0aChtb2R1bGUpOworICAgIG1vZHVsZUludGVyZmFjZSA9IG1vZHVsZTsKKworICAgIG1vZHVsZS0+c2V0Q2FwdHVyZVN0YXRlX2wobUNhcHR1cmVTdGF0ZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2V0Q2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKQoreworICAgIEFMT0dWKCJzZXRDYXB0dXJlU3RhdGUgJWQiLCBhY3RpdmUpOworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgbUNhcHR1cmVTdGF0ZSA9IGFjdGl2ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Nb2R1bGVzLnZhbHVlQXQoaSktPnNldENhcHR1cmVTdGF0ZV9sKGFjdGl2ZSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6ZGV0YWNoTW9kdWxlKHNwPE1vZHVsZT4gbW9kdWxlKQoreworICAgIEFMT0dWKCJkZXRhY2hNb2R1bGUiKTsKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIG1vZHVsZS0+Y2xlYXJDbGllbnQoKTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKKworc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCit7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2tlZDsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBTb3VuZFRyaWdnZXJId1NlcnZpY2UiKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gU291bmRUcmlnZ2VySHdTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICAgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlNvdW5kVHJpZ2dlckh3U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NrZWQpIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIHJldHVybiBCblNvdW5kVHJpZ2dlckh3U2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworfQorCisKKy8vIHN0YXRpYwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnJlY29nbml0aW9uQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQoreworICAgIE1vZHVsZSAqbW9kdWxlID0gKE1vZHVsZSAqKWNvb2tpZTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBtb2R1bGUtPnNlcnZpY2UoKS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VydmljZS0+c2VuZFJlY29nbml0aW9uRXZlbnQoZXZlbnQsIG1vZHVsZSk7Cit9CisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICAvL3Nhbml0aXplIGV2ZW50CisgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0U6CisgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCksCisgICAgICAgICAgICAgICAgICAgICJwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCk6IGludmFsaWQgZGF0YSBvZmZzZXQgJXUgZm9yIGtleXBocmFzZSBldmVudCB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9VTktOT1dOOgorICAgICAgICBBTE9HV19JRihldmVudC0+ZGF0YV9zaXplICE9IDAgJiYgZXZlbnQtPmRhdGFfb2Zmc2V0ICE9CisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCksCisgICAgICAgICAgICAgICAgICAgICJwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCk6IGludmFsaWQgZGF0YSBvZmZzZXQgJXUgZm9yIHVua25vd24gZXZlbnQgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCk7CisgICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBldmVudE1lbW9yeTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICBtZW1jcHkoZXZlbnRNZW1vcnktPnBvaW50ZXIoKSwgZXZlbnQsIHNpemUpOworCisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQorIHsKKyAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKGV2ZW50KTsKKyAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorICAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKKyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIHNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzb3VuZE1vZGVsQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCit7CisgICAgTW9kdWxlICptb2R1bGUgPSAoTW9kdWxlICopY29va2llOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSA9IG1vZHVsZS0+c2VydmljZSgpLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXJ2aWNlLT5zZW5kU291bmRNb2RlbEV2ZW50KGV2ZW50LCBtb2R1bGUpOworfQorCitzcDxJTWVtb3J5PiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICBtZW1jcHkoZXZlbnRNZW1vcnktPnBvaW50ZXIoKSwgZXZlbnQsIHNpemUpOworCisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFNvdW5kTW9kZWxFdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGUgKm1vZHVsZSkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtU2VydmljZUxvY2spOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKGV2ZW50KTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7CisgICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2VuZENhbGxiYWNrRXZlbnRfbChuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NPVU5ETU9ERUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnksIHN0cm9uZ01vZHVsZSkpOworfQorCisKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCk7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICAqKChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpID0gc3RhdGU7CisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCisvLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzdGF0ZSk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZSkgeworICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJvbmdNb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNlbmRDYWxsYmFja0V2ZW50X2wobmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5LCBzdHJvbmdNb2R1bGUpKTsKK30KKworLy8gY2FsbCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZENhbGxiYWNrRXZlbnRfbChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCit7CisgICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kQ2FsbGJhY2tFdmVudChldmVudCk7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQiKTsKKyAgICBzcDxNb2R1bGU+IG1vZHVsZTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIG1vZHVsZSA9IGV2ZW50LT5tTW9kdWxlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbW9kdWxlLT5vbkNhbGxiYWNrRXZlbnQoZXZlbnQpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgLy8gY2xlYXIgbm93IHRvIGV4ZWN1dGUgd2l0aCBtU2VydmljZUxvY2sgbG9ja2VkCisgICAgICAgIGV2ZW50LT5tTWVtb3J5LmNsZWFyKCk7CisgICAgfQorfQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkIgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpDYWxsYmFja1RocmVhZChjb25zdCB3cDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6fkNhbGxiYWNrVGhyZWFkKCkKK3sKKyAgICB3aGlsZSAoIW1FdmVudFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBtRXZlbnRRdWV1ZVswXS0+bU1lbW9yeS5jbGVhcigpOworICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6b25GaXJzdFJlZigpCit7CisgICAgcnVuKCJzb3VuZFRyaWdnZXIgY2JrIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOworfQorCitib29sIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkgeworICAgICAgICBzcDxDYWxsYmFja0V2ZW50PiBldmVudDsKKyAgICAgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobUV2ZW50UXVldWUuaXNFbXB0eSgpICYmICFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgc2xlZXAiKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kLndhaXQobUNhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNhbGxiYWNrVGhyZWFkOjp0aHJlYWRMb29wKCkgd2FrZSB1cCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV2ZW50ID0gbUV2ZW50UXVldWVbMF07CisgICAgICAgICAgICBtRXZlbnRRdWV1ZS5yZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcnZpY2UgIT0gMCkgeworICAgICAgICAgICAgc2VydmljZS0+b25DYWxsYmFja0V2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6ZXhpdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbUNhbGxiYWNrQ29uZC5icm9hZGNhc3QoKTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpzZW5kQ2FsbGJhY2tFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEF1dG9NdXRleCBsb2NrKG1DYWxsYmFja0xvY2spOworICAgIG1FdmVudFF1ZXVlLmFkZChldmVudCk7CisgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpDYWxsYmFja0V2ZW50OjpDYWxsYmFja0V2ZW50KGV2ZW50X3R5cGUgdHlwZSwgc3A8SU1lbW9yeT4gbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKQorICAgIDogbVR5cGUodHlwZSksIG1NZW1vcnkobWVtb3J5KSwgbU1vZHVsZShtb2R1bGUpCit7Cit9CisKK1NvdW5kVHJpZ2dlckh3U2VydmljZTo6Q2FsbGJhY2tFdmVudDo6fkNhbGxiYWNrRXZlbnQoKQoreworfQorCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlIgorCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKGNvbnN0IHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiBod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KQorIDogbVNlcnZpY2Uoc2VydmljZSksIG1Id0RldmljZShod0RldmljZSksIG1EZXNjcmlwdG9yKGRlc2NyaXB0b3IpLAorICAgbUNsaWVudChjbGllbnQpLCBtU2VydmljZVN0YXRlKFNPVU5EX1RSSUdHRVJfU1RBVEVfTk9fSU5JVCkKK3sKK30KKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6On5Nb2R1bGUoKSB7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmRldGFjaCgpIHsKKyAgICBBTE9HVigiZGV0YWNoKCkiKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZGVscy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gbU1vZGVscy52YWx1ZUF0KGkpOworICAgICAgICAgICAgQUxPR1YoImRldGFjaCgpIHVubG9hZGluZyBtb2RlbCAlZCIsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIG1vZGVsLT5tSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtTW9kZWxzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgbUNsaWVudC0+YXNCaW5kZXIoKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXJ2aWNlLT5kZXRhY2hNb2R1bGUodGhpcyk7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpsb2FkU291bmRNb2RlbChjb25zdCBzcDxJTWVtb3J5PiYgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgQUxPR1YoImxvYWRTb3VuZE1vZGVsKCkgaGFuZGxlIik7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCA9CisgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKiltb2RlbE1lbW9yeS0+cG9pbnRlcigpOworCisgICAgc2l6ZV90IHN0cnVjdFNpemU7CisgICAgaWYgKHNvdW5kX21vZGVsLT50eXBlID09IFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFKSB7CisgICAgICAgIHN0cnVjdFNpemUgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3RTaXplID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsKTsKKyAgICB9CisKKyAgICBpZiAoc291bmRfbW9kZWwtPmRhdGFfb2Zmc2V0IDwgc3RydWN0U2l6ZSB8fAorICAgICAgICAgICBzb3VuZF9tb2RlbC0+ZGF0YV9zaXplID4gKFVJTlRfTUFYIC0gc291bmRfbW9kZWwtPmRhdGFfb2Zmc2V0KSB8fAorICAgICAgICAgICBtb2RlbE1lbW9yeS0+c2l6ZSgpIDwgc291bmRfbW9kZWwtPmRhdGFfb2Zmc2V0IHx8CisgICAgICAgICAgIHNvdW5kX21vZGVsLT5kYXRhX3NpemUgPiAobW9kZWxNZW1vcnktPnNpemUoKSAtIHNvdW5kX21vZGVsLT5kYXRhX29mZnNldCkpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMDE0ODU0NiIpOworICAgICAgICBBTE9HRSgibG9hZFNvdW5kTW9kZWwoKSBkYXRhX3NpemUgaXMgdG9vIGJpZyIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSHdEZXZpY2UtPmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzb3VuZE1vZGVsQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOworCisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZzZXNzaW9uLCAmaW9IYW5kbGUsICZkZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBuZXcgTW9kZWwoKmhhbmRsZSwgc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSwgc291bmRfbW9kZWwtPnR5cGUpOworICAgIG1Nb2RlbHMucmVwbGFjZVZhbHVlRm9yKCpoYW5kbGUsIG1vZGVsKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigidW5sb2FkU291bmRNb2RlbCgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtTW9kZWxzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpbmRleCk7CisgICAgbU1vZGVscy5yZW1vdmVJdGVtKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgfQorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihtb2RlbC0+bUNhcHR1cmVTZXNzaW9uKTsKKyAgICByZXR1cm4gbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKK3sKKyAgICBBTE9HVigic3RhcnRSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgaWYgKGRhdGFNZW1vcnkgPT0gMCB8fCBkYXRhTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIH0KKworICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKilkYXRhTWVtb3J5LT5wb2ludGVyKCk7CisKKyAgICBpZiAoY29uZmlnLT5kYXRhX29mZnNldCA8IHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcpIHx8CisgICAgICAgICAgICBjb25maWctPmRhdGFfc2l6ZSA+IChVSU5UX01BWCAtIGNvbmZpZy0+ZGF0YV9vZmZzZXQpIHx8CisgICAgICAgICAgICBkYXRhTWVtb3J5LT5zaXplKCkgPCBjb25maWctPmRhdGFfb2Zmc2V0IHx8CisgICAgICAgICAgICBjb25maWctPmRhdGFfc2l6ZSA+IChkYXRhTWVtb3J5LT5zaXplKCkgLSBjb25maWctPmRhdGFfb2Zmc2V0KSkgeworICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFfc2l6ZSBpcyB0b28gYmlnIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VydmljZVN0YXRlID09IFNPVU5EX1RSSUdHRVJfU1RBVEVfRElTQUJMRUQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgPT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisKKyAgICAvL1RPRE86IGdldCBjYXB0dXJlIGhhbmRsZSBhbmQgZGV2aWNlIGZyb20gYXVkaW8gcG9saWN5IHNlcnZpY2UKKyAgICBjb25maWctPmNhcHR1cmVfaGFuZGxlID0gbW9kZWwtPm1DYXB0dXJlSU9IYW5kbGU7CisgICAgY29uZmlnLT5jYXB0dXJlX2RldmljZSA9IG1vZGVsLT5tQ2FwdHVyZURldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSHdEZXZpY2UtPnN0YXJ0X3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlLCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpyZWNvZ25pdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0FDVElWRTsKKyAgICAgICAgbW9kZWwtPm1Db25maWcgPSAqY29uZmlnOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJzdG9wUmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSk7CisgICAgbW9kZWwtPm1TdGF0ZSA9IE1vZGVsOjpTVEFURV9JRExFOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQoreworICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CisKKyAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGV2ZW50LT5tTWVtb3J5OworCisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1DbGllbnQgPT0gMCkgeworICAgICAgICBBTE9HSSgiJXMgbUNsaWVudCA9PSAwIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKKyAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT046IHsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKnJlY29nbml0aW9uRXZlbnQgPQorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwocmVjb2duaXRpb25FdmVudC0+bW9kZWwpOworICAgICAgICAgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgbW9kZWwgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9uQ2FsbGJhY2tFdmVudCBtb2RlbC0+bVN0YXRlICVkICE9IE1vZGVsOjpTVEFURV9BQ1RJVkUiLCBtb2RlbC0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY29nbml0aW9uRXZlbnQtPmNhcHR1cmVfc2Vzc2lvbiA9IG1vZGVsLT5tQ2FwdHVyZVNlc3Npb247CisgICAgICAgICAgICBtb2RlbC0+bVN0YXRlID0gTW9kZWw6OlNUQVRFX0lETEU7CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTDogeworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqc291bmRtb2RlbEV2ZW50ID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKHNvdW5kbW9kZWxFdmVudC0+bW9kZWwpOworICAgICAgICAgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgbW9kZWwgPT0gMCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQgIT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+b25TZXJ2aWNlU3RhdGVDaGFuZ2UoZXZlbnRNZW1vcnkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvbkNhbGxiYWNrRXZlbnQgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKKyAgICB9Cit9CisKK3NwPFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kZWw+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbCgKKyAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNwPE1vZGVsPiBtb2RlbDsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU1vZGVscy5pbmRleE9mS2V5KGhhbmRsZSk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgbW9kZWwgPSBtTW9kZWxzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gbW9kZWw7Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmJpbmRlckRpZWQoCisgICAgY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgeworICAgIEFMT0dXKCJjbGllbnQgYmluZGVyIGRpZWQgZm9yIG1vZHVsZSAlZCIsIG1EZXNjcmlwdG9yLmhhbmRsZSk7CisgICAgZGV0YWNoKCk7Cit9CisKKy8vIENhbGxlZCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCit2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKK3sKKyAgICBBTE9HVigiTW9kdWxlOjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CisgICAgc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlOworICAgIHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlOworCisgICAgVmVjdG9yPCBzcDxJTWVtb3J5PiA+IGV2ZW50czsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdGUgPSAoYWN0aXZlICYmICFtRGVzY3JpcHRvci5wcm9wZXJ0aWVzLmNvbmN1cnJlbnRfY2FwdHVyZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfU1RBVEVfRElTQUJMRUQgOiBTT1VORF9UUklHR0VSX1NUQVRFX0VOQUJMRUQ7CisKKyAgICAgICAgaWYgKHN0YXRlID09IG1TZXJ2aWNlU3RhdGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2aWNlU3RhdGUgPSBzdGF0ZTsKKworICAgICAgICBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGUgPT0gU09VTkRfVFJJR0dFUl9TVEFURV9FTkFCTEVEKSB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2RlbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPE1vZGVsPiBtb2RlbCA9IG1Nb2RlbHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChtb2RlbC0+bVN0YXRlID09IE1vZGVsOjpTVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBtb2RlbC0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8ga2VlcCBtb2RlbCBpbiBBQ1RJVkUgc3RhdGUgc28gdGhhdCBldmVudCBpcyBwcm9jZXNzZWQgYnkgb25DYWxsYmFja0V2ZW50KCkKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgcGhyYXNlRXZlbnQ7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlbC0+bVR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFOgorICAgICAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5udW1fcGhyYXNlcyA9IG1vZGVsLT5tQ29uZmlnLm51bV9waHJhc2VzOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBocmFzZUV2ZW50Lm51bV9waHJhc2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LnBocmFzZV9leHRyYXNbaV0gPSBtb2RlbC0+bUNvbmZpZy5waHJhc2VzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaHJhc2VFdmVudC5jb21tb24uc3RhdHVzID0gUkVDT0dOSVRJT05fU1RBVFVTX0FCT1JUOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi50eXBlID0gbW9kZWwtPm1UeXBlOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50LmNvbW1vbi5kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgmcGhyYXNlRXZlbnQuY29tbW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRNZW1vcnkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzZXJ2aWNlLT5zZW5kQ2FsbGJhY2tFdmVudF9sKG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT04sIGV2ZW50c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcykpOworICAgIH0KKworZXhpdDoKKyAgICBzZXJ2aWNlLT5zZW5kU2VydmljZVN0YXRlRXZlbnRfbChzdGF0ZSwgdGhpcyk7Cit9CisKKworU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2RlbDo6TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgdHlwZSkgOgorICAgIG1IYW5kbGUoaGFuZGxlKSwgbVN0YXRlKFNUQVRFX0lETEUpLCBtQ2FwdHVyZVNlc3Npb24oc2Vzc2lvbiksCisgICAgbUNhcHR1cmVJT0hhbmRsZShpb0hhbmRsZSksIG1DYXB0dXJlRGV2aWNlKGRldmljZSksIG1UeXBlKHR5cGUpCit7CisKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmR1bXAoaW50IGZkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeworICAgIFN0cmluZzggcmVzdWx0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDVkYWNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9TRVJWSUNFX0gKKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorLy8jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9zb3VuZF90cmlnZ2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5SGVhcEJhc2U7CisKK2NsYXNzIFNvdW5kVHJpZ2dlckh3U2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5Tb3VuZFRyaWdnZXJId1NlcnZpY2UKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxTb3VuZFRyaWdnZXJId1NlcnZpY2U+OworcHVibGljOgorICAgIGNsYXNzIE1vZHVsZTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5zb3VuZF90cmlnZ2VyX2h3IjsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKworICAgIC8vIElTb3VuZFRyaWdnZXJId1NlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIGNsYXNzIE1vZGVsIDogcHVibGljIFJlZkJhc2UgeworICAgICBwdWJsaWM6CisKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBTVEFURV9JRExFLAorICAgICAgICAgICAgU1RBVEVfQUNUSVZFCisgICAgICAgIH07CisKKyAgICAgICAgTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWxfdHlwZV90IHR5cGUpOworICAgICAgICB+TW9kZWwoKSB7fQorCisgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICAgIG1IYW5kbGU7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbUNhcHR1cmVTZXNzaW9uOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtQ2FwdHVyZUlPSGFuZGxlOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtQ2FwdHVyZURldmljZTsKKyAgICAgICAgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbF90eXBlX3QgbVR5cGU7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyBtQ29uZmlnOworICAgIH07CisKKyAgICBjbGFzcyBDYWxsYmFja0V2ZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgICAgIFRZUEVfUkVDT0dOSVRJT04sCisgICAgICAgICAgICBUWVBFX1NPVU5ETU9ERUwsCisgICAgICAgICAgICBUWVBFX1NFUlZJQ0VfU1RBVEUsCisgICAgICAgIH0gZXZlbnRfdHlwZTsKKyAgICAgICAgQ2FsbGJhY2tFdmVudChldmVudF90eXBlIHR5cGUsIHNwPElNZW1vcnk+IG1lbW9yeSwgd3A8TW9kdWxlPiBtb2R1bGUpOworCisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfkNhbGxiYWNrRXZlbnQoKTsKKworICAgICAgICBldmVudF90eXBlIG1UeXBlOworICAgICAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgICAgICB3cDxNb2R1bGU+IG1Nb2R1bGU7CisgICAgfTsKKworICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsCisgICAgICAgICAgICAgICAgICAgcHVibGljIEJuU291bmRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCAgICAgeworICAgIHB1YmxpYzoKKworICAgICAgIE1vZHVsZShjb25zdCBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U+JiBzZXJ2aWNlLAorICAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogaHdEZXZpY2UsCisgICAgICAgICAgICAgIHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCk7CisKKyAgICAgICB2aXJ0dWFsIH5Nb2R1bGUoKTsKKworICAgICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKworICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQorICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQorICAgICAgIHZvaWQgc2V0Q2xpZW50KHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudCkgeyBtQ2xpZW50ID0gY2xpZW50OyB9CisgICAgICAgdm9pZCBjbGVhckNsaWVudCgpIHsgbUNsaWVudC5jbGVhcigpOyB9CisgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNsaWVudDsgfQorICAgICAgIHdwPFNvdW5kVHJpZ2dlckh3U2VydmljZT4gc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2aWNlOyB9CisKKyAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCisgICAgICAgc3A8TW9kZWw+IGdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICB2b2lkIHNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKTsKKworICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgcHJpdmF0ZToKKworICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiAgICAgICAgICAgICAgbVNlcnZpY2U7CisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogICAgICAgIG1Id0RldmljZTsKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgbURlc2NyaXB0b3I7CisgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+ICAgICAgICAgICAgICAgIG1DbGllbnQ7CisgICAgICAgIERlZmF1bHRLZXllZFZlY3Rvcjwgc291bmRfbW9kZWxfaGFuZGxlX3QsIHNwPE1vZGVsPiA+ICAgICBtTW9kZWxzOworICAgICAgICBzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAgICAgICAgICBtU2VydmljZVN0YXRlOworICAgIH07IC8vIGNsYXNzIE1vZHVsZQorCisgICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiYgc2VydmljZSk7CisKKyAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Q2FsbGJhY2tUaHJlYWQoKTsKKworICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgLy8gUmVmQmFzZQorICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlPiAgIG1TZXJ2aWNlOworICAgICAgICBDb25kaXRpb24gICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZDsKKyAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7CisgICAgICAgIFZlY3Rvcjwgc3A8Q2FsbGJhY2tFdmVudD4gPiBtRXZlbnRRdWV1ZTsKKyAgICB9OworCisgICAgICAgICAgIHZvaWQgZGV0YWNoTW9kdWxlKHNwPE1vZHVsZT4gbW9kdWxlKTsKKworICAgIHN0YXRpYyB2b2lkIHJlY29nbml0aW9uQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LCB2b2lkICpjb29raWUpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCk7CisgICAgICAgICAgIHZvaWQgc2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LCBNb2R1bGUgKm1vZHVsZSk7CisKKyAgICBzdGF0aWMgdm9pZCBzb3VuZE1vZGVsQ2FsbGJhY2soc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LCB2b2lkICpjb29raWUpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOworCisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwgTW9kdWxlICptb2R1bGUpOworCisgICAgICAgICAgIHZvaWQgc2VuZENhbGxiYWNrRXZlbnRfbChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOworCitwcml2YXRlOgorCisgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKKworICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOworICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU5leHRVbmlxdWVJZDsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90LCBzcDxNb2R1bGU+ID4gICAgIG1Nb2R1bGVzOworICAgIHNwPENhbGxiYWNrVGhyZWFkPiAgbUNhbGxiYWNrVGhyZWFkOworICAgIHNwPE1lbW9yeURlYWxlcj4gICAgbU1lbW9yeURlYWxlcjsKKyAgICBib29sICAgICAgICAgICAgICAgIG1DYXB0dXJlU3RhdGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCVNvdW5kVHJpZ2dlci5jcHAgXAorCUlTb3VuZFRyaWdnZXIuY3BwIFwKKwlJU291bmRUcmlnZ2VyQ2xpZW50LmNwcCBcCisJSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKwlsaWJ1dGlscyBcCisJbGlibG9nIFwKKwlsaWJiaW5kZXIgXAorCWxpYmhhcmR3YXJlCisKKyNMT0NBTF9DX0lOQ0xVREVTICs9IFwKKwlzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorCXN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyODBkMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJJU291bmRUcmlnZ2VyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBERVRBQ0ggPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIExPQURfU09VTkRfTU9ERUwsCisgICAgVU5MT0FEX1NPVU5EX01PREVMLAorICAgIFNUQVJUX1JFQ09HTklUSU9OLAorICAgIFNUT1BfUkVDT0dOSVRJT04sCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+Cit7CitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdm9pZCBkZXRhY2goKQorICAgIHsKKyAgICAgICAgQUxPR1YoImRldGFjaCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVUQUNILCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHN0YXR1c190IGxvYWRTb3VuZE1vZGVsKGNvbnN0IHNwPElNZW1vcnk+JiAgbW9kZWxNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihtb2RlbE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMT0FEX1NPVU5EX01PREVMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVwbHkucmVhZChoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5MT0FEX1NPVU5EX01PREVMLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIGlmIChkYXRhTWVtb3J5ID09IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkYXRhTWVtb3J5LT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZGF0YU1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9SRUNPR05JVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfUkVDT0dOSVRJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VyOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBERVRBQ0g6IHsKKyAgICAgICAgICAgIEFMT0dWKCJERVRBQ0giKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBkZXRhY2goKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX1NPVU5EX01PREVMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbW9kZWxNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsb2FkU291bmRNb2RlbChtb2RlbE1lbW9yeSwgJmhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFVOTE9BRF9TT1VORF9NT0RFTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVubG9hZFNvdW5kTW9kZWwoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTVEFSVF9SRUNPR05JVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGRhdGFNZW1vcnk7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YU1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0UmVjb2duaXRpb24oaGFuZGxlLCBkYXRhTWVtb3J5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTVE9QX1JFQ09HTklUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjQ0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckNsaWVudC5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBPTl9SRUNPR05JVElPTl9FVkVOVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgT05fU09VTkRNT0RFTF9FVkVOVCwKKyAgICBPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRQorfTsKKworY2xhc3MgQnBTb3VuZFRyaWdnZXJDbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyQ2xpZW50PgoreworCitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXJDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckNsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGV2ZW50TWVtb3J5LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1JFQ09HTklUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoZXZlbnRNZW1vcnktPmFzQmluZGVyKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fU09VTkRNT0RFTF9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgb25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihldmVudE1lbW9yeS0+YXNCaW5kZXIoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9TRVJWSUNFX1NUQVRFX0NIQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlckNsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VyQ2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBPTl9SRUNPR05JVElPTl9FVkVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4oCisgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgb25SZWNvZ25pdGlvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBPTl9TT1VORE1PREVMX0VWRU5UOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckNsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgT05fU0VSVklDRV9TVEFURV9DSEFOR0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KAorICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIG9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3MjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJCcFNvdW5kVHJpZ2dlckh3U2VydmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgTElTVF9NT0RVTEVTID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBBVFRBQ0gsCisgICAgU0VUX0NBUFRVUkVfU1RBVEUsCit9OworCitjbGFzcyBCcFNvdW5kVHJpZ2dlckh3U2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBTb3VuZFRyaWdnZXJId1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQorICAgIHsKKyAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBtb2R1bGVzID09IE5VTEwpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gKG1vZHVsZXMgPT0gTlVMTCkgPyAwIDogKm51bU1vZHVsZXM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Nb2R1bGVzUmVxKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTU9EVUxFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bU1vZHVsZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQobW9kdWxlcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChyZXBseS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICBtb2R1bGUgPSBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYWN0aXZlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DQVBUVVJFX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlckh3U2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlckh3U2VydmljZSIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IG51bU1vZHVsZXNSZXE7CisgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqKWNhbGxvYyhudW1Nb2R1bGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhtb2R1bGVzLCAmbnVtTW9kdWxlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7CisgICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IG51bU1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IG51bU1vZHVsZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShtb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxICogc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBVFRBQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiBtb2R1bGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIG1vZHVsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKG1vZHVsZS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgU0VUX0NBUFRVUkVfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRDYXB0dXJlU3RhdGUoKGJvb2wpZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlkZGJjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTAsMCArMSwyODggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IChDKSAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8c291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyQ2FsbGJhY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IGdTb3VuZFRyaWdnZXJId1NlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAga1NvdW5kVHJpZ2dlckh3U2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgIGtTb3VuZFRyaWdnZXJId1NlcnZpY2VOYW1lICAgICAgPSAibWVkaWEuc291bmRfdHJpZ2dlcl9odyI7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgZ0xvY2s7CisKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVhdGhOb3RpZmllcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJiaW5kZXJEaWVkIik7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICAgICAgZ1NvdW5kVHJpZ2dlckh3U2VydmljZS5jbGVhcigpOworICAgICAgICAgICAgQUxPR1coIlNvdW5kIHRyaWdnZXIgc2VydmljZSBkaWVkISIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgICAgZ0RlYXRoTm90aWZpZXI7Cit9OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCisKK2NvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IFNvdW5kVHJpZ2dlcjo6Z2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGlmIChnU291bmRUcmlnZ2VySHdTZXJ2aWNlLmdldCgpID09IDApIHsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KGtTb3VuZFRyaWdnZXJId1NlcnZpY2VOYW1lKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJTb3VuZFRyaWdnZXJId1NlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOworICAgICAgICAgICAgdXNsZWVwKGtTb3VuZFRyaWdnZXJId1NlcnZpY2VQb2xsRGVsYXkpOworICAgICAgICB9IHdoaWxlKHRydWUpOworICAgICAgICBpZiAoZ0RlYXRoTm90aWZpZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZ0RlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOworICAgICAgICB9CisgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZ0RlYXRoTm90aWZpZXIpOworICAgICAgICBnU291bmRUcmlnZ2VySHdTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SVNvdW5kVHJpZ2dlckh3U2VydmljZT4oYmluZGVyKTsKKyAgICB9CisgICAgQUxPR0VfSUYoZ1NvdW5kVHJpZ2dlckh3U2VydmljZSA9PSAwLCAibm8gU291bmRUcmlnZ2VySHdTZXJ2aWNlIT8iKTsKKyAgICByZXR1cm4gZ1NvdW5kVHJpZ2dlckh3U2VydmljZTsKK30KKworLy8gU3RhdGljIG1ldGhvZHMKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKK3sKKyAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMobW9kdWxlcywgbnVtTW9kdWxlcyk7Cit9CisKK3NwPFNvdW5kVHJpZ2dlcj4gU291bmRUcmlnZ2VyOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIEFMT0dWKCJhdHRhY2goKSIpOworICAgIHNwPFNvdW5kVHJpZ2dlcj4gc291bmRUcmlnZ2VyOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBzb3VuZFRyaWdnZXI7CisgICAgfQorICAgIHNvdW5kVHJpZ2dlciA9IG5ldyBTb3VuZFRyaWdnZXIobW9kdWxlLCBjYWxsYmFjayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKG1vZHVsZSwgc291bmRUcmlnZ2VyLCBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKHNvdW5kVHJpZ2dlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coIkVycm9yICVkIGNvbm5lY3RpbmcgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIiwgc3RhdHVzKTsKKyAgICAgICAgc291bmRUcmlnZ2VyLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBzb3VuZFRyaWdnZXI7Cit9CisKKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpCit7CisgICAgQUxPR1YoInNldENhcHR1cmVTdGF0ZSglZCkiLCBhY3RpdmUpOworICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKKyAgICBpZiAoc2VydmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+c2V0Q2FwdHVyZVN0YXRlKGFjdGl2ZSk7Cit9CisKKy8vIFNvdW5kVHJpZ2dlcgorU291bmRUcmlnZ2VyOjpTb3VuZFRyaWdnZXIoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICA6IG1Nb2R1bGUobW9kdWxlKSwgbUNhbGxiYWNrKGNhbGxiYWNrKQoreworfQorCitTb3VuZFRyaWdnZXI6On5Tb3VuZFRyaWdnZXIoKQoreworICAgIGlmIChtSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIG1JU291bmRUcmlnZ2VyLT5kZXRhY2goKTsKKyAgICB9Cit9CisKKwordm9pZCBTb3VuZFRyaWdnZXI6OmRldGFjaCgpIHsKKyAgICBBTE9HVigiZGV0YWNoKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciAhPSAwKSB7CisgICAgICAgIG1JU291bmRUcmlnZ2VyLT5kZXRhY2goKTsKKyAgICAgICAgbUlTb3VuZFRyaWdnZXItPmFzQmluZGVyKCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIG1JU291bmRUcmlnZ2VyID0gMDsKKyAgICB9Cit9CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6bG9hZFNvdW5kTW9kZWwoY29uc3Qgc3A8SU1lbW9yeT4mIG1vZGVsTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5sb2FkU291bmRNb2RlbChtb2RlbE1lbW9yeSwgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnVubG9hZFNvdW5kTW9kZWwoaGFuZGxlKTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVNvdW5kVHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24oaGFuZGxlLCBkYXRhTWVtb3J5KTsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7Cit9CisKKy8vIEJwU291bmRUcmlnZ2VyQ2xpZW50Cit2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWNvZ25pdGlvbkV2ZW50KAorICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpOworICAgIH0KK30KKwordm9pZCBTb3VuZFRyaWdnZXI6Om9uU291bmRNb2RlbEV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwIHx8IGV2ZW50TWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25Tb3VuZE1vZGVsRXZlbnQoCisgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgfQorfQorCit2b2lkIFNvdW5kVHJpZ2dlcjo6b25TZXJ2aWNlU3RhdGVDaGFuZ2UoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNlcnZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgICAgICAqKChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCkpKTsKKyAgICB9Cit9CisKKy8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3ZvaWQgU291bmRUcmlnZ2VyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dXKCJTb3VuZFRyaWdnZXIgc2VydmVyIGJpbmRlciBEaWVkICIpOworICAgIG1JU291bmRUcmlnZ2VyID0gMDsKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vblNlcnZpY2VEaWVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIHNvdW5kX3RyaWdnZXJfdXVpZF90ICpndWlkKQoreworICAgIGlmIChzdHIgPT0gTlVMTCB8fCBndWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgdG1wWzEwXTsKKworICAgIGlmIChzc2NhbmYoc3RyLCAiJTA4eC0lMDR4LSUwNHgtJTA0eC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgdG1wLCB0bXArMSwgdG1wKzIsIHRtcCszLCB0bXArNCwgdG1wKzUsIHRtcCs2LCB0bXArNywgdG1wKzgsIHRtcCs5KSA8IDEwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGd1aWQtPnRpbWVMb3cgPSAodWludDMyX3QpdG1wWzBdOworICAgIGd1aWQtPnRpbWVNaWQgPSAodWludDE2X3QpdG1wWzFdOworICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24gPSAodWludDE2X3QpdG1wWzJdOworICAgIGd1aWQtPmNsb2NrU2VxID0gKHVpbnQxNl90KXRtcFszXTsKKyAgICBndWlkLT5ub2RlWzBdID0gKHVpbnQ4X3QpdG1wWzRdOworICAgIGd1aWQtPm5vZGVbMV0gPSAodWludDhfdCl0bXBbNV07CisgICAgZ3VpZC0+bm9kZVsyXSA9ICh1aW50OF90KXRtcFs2XTsKKyAgICBndWlkLT5ub2RlWzNdID0gKHVpbnQ4X3QpdG1wWzddOworICAgIGd1aWQtPm5vZGVbNF0gPSAodWludDhfdCl0bXBbOF07CisgICAgZ3VpZC0+bm9kZVs1XSA9ICh1aW50OF90KXRtcFs5XTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU291bmRUcmlnZ2VyOjpndWlkVG9TdHJpbmcoY29uc3Qgc291bmRfdHJpZ2dlcl91dWlkX3QgKmd1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKyAgICBpZiAoZ3VpZCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICBndWlkLT50aW1lTG93LAorICAgICAgICAgICAgZ3VpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICBndWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbM10sCisgICAgICAgICAgICBndWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcCBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCmluZGV4IGNjM2Q1MDkuLjYyZWRkY2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCisrKyBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCkBAIC0yMCwxNSArMjAsMjUgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotc3RhdGljIGRvdWJsZSBzaW5jKGRvdWJsZSB4KSB7CitzdGF0aWMgaW5saW5lIGRvdWJsZSBzaW5jKGRvdWJsZSB4KSB7CiAgICAgaWYgKGZhYnMoeCkgPT0gMC4wZikgcmV0dXJuIDEuMGY7CiAgICAgcmV0dXJuIHNpbih4KSAvIHg7CiB9CiAKLXN0YXRpYyBkb3VibGUgc3FyKGRvdWJsZSB4KSB7CitzdGF0aWMgaW5saW5lIGRvdWJsZSBzcXIoZG91YmxlIHgpIHsKICAgICByZXR1cm4geCp4OwogfQogCitzdGF0aWMgaW5saW5lIGludDY0X3QgdG9pbnQoZG91YmxlIHgsIGludDY0X3QgbWF4dmFsKSB7CisgICAgaW50NjRfdCB2OworCisgICAgdiA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGZsb29yKHggKiBtYXh2YWwgKyAwLjUpKTsKKyAgICBpZiAodiA+PSBtYXh2YWwpIHsKKyAgICAgICAgcmV0dXJuIG1heHZhbCAtIDE7IC8vIGVycm9yIQorICAgIH0KKyAgICByZXR1cm4gdjsKK30KKwogc3RhdGljIGRvdWJsZSBJMChkb3VibGUgeCkgewogICAgIC8vIGZyb20gdGhlIE51bWVyaWNhbCBSZWNpcGVzIGluIEMgcC4gMjM3CiAgICAgZG91YmxlIGF4LGFucyx5OwpAQCAtNTQsMTEgKzY0LDEyIEBACiAgICAgcmV0dXJuIEkwKGJldGEgKiBzcXJ0KDEuMCAtIHNxcigoMi4wKmspL04gLSAxLjApKSkgLyBJMChiZXRhKTsKIH0KIAotCiBzdGF0aWMgdm9pZCB1c2FnZShjaGFyKiBuYW1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAidXNhZ2U6ICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIFstZiB7ZmxvYXR8Zml4ZWR9XSBbLWIgYmV0YV0gWy12IGRCRlNdIFstbCBsZXJwXVxuIgotICAgICAgICAgICAgIiAgICAgICAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSBbLWYge2Zsb2F0fGZpeGVkfV0gWy1iIGJldGFdIFstdiBkQkZTXSAtcCBNL05cbiIKKyAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gWy1sIGxlcnBdXG4iCisgICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLXMgc2FtcGxlX3JhdGVdIFstYyBjdXQtb2ZmX2ZyZXF1ZW5jeV0gWy1uIGhhbGZfemVyb19jcm9zc2luZ3NdIgorICAgICAgICAgICAgIiBbLWYge2Zsb2F0fGZpeGVkfGZpeGVkMTZ9XSBbLWIgYmV0YV0gWy12IGRCRlNdIC1wIE0vTlxuIgogICAgICAgICAgICAgIiAgICAtaCAgICB0aGlzIGhlbHAgbWVzc2FnZVxuIgogICAgICAgICAgICAgIiAgICAtZCAgICBkZWJ1ZywgcHJpbnQgY29tbWEtc2VwYXJhdGVkIGNvZWZmaWNpZW50IHRhYmxlXG4iCiAgICAgICAgICAgICAiICAgIC1wICAgIGdlbmVyYXRlIHBvbHktcGhhc2UgZmlsdGVyIGNvZWZmaWNpZW50cywgd2l0aCBzYW1wbGUgaW5jcmVtZW50IE0vTlxuIgpAQCAtNjYsNiArNzcsNyBAQAogICAgICAgICAgICAgIiAgICAtYyAgICBjdXQtb2ZmIGZyZXF1ZW5jeSAoMjA0NzgpXG4iCiAgICAgICAgICAgICAiICAgIC1uICAgIG51bWJlciBvZiB6ZXJvLWNyb3NzaW5ncyBvbiBvbmUgc2lkZSAoOClcbiIKICAgICAgICAgICAgICIgICAgLWwgICAgbnVtYmVyIG9mIGxlcnBpbmcgYml0cyAoNClcbiIKKyAgICAgICAgICAgICIgICAgLW0gICAgbnVtYmVyIG9mIHBvbHlwaGFzZXMgKHJlbGF0ZWQgdG8gLWwsIGRlZmF1bHQgMTYpXG4iCiAgICAgICAgICAgICAiICAgIC1mICAgIG91dHB1dCBmb3JtYXQsIGNhbiBiZSBmaXhlZC1wb2ludCBvciBmbG9hdGluZy1wb2ludCAoZml4ZWQpXG4iCiAgICAgICAgICAgICAiICAgIC1iICAgIGthaXNlciB3aW5kb3cgcGFyYW1ldGVyIGJldGEgKDcuODY1IFstODBkQl0pXG4iCiAgICAgICAgICAgICAiICAgIC12ICAgIGF0dGVudWF0aW9uIGluIGRCRlMgKDApXG4iLApAQCAtNzcsOCArODksNyBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQogewogICAgIC8vIG5jIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0byBzdG9yZSB0aGUgY29lZmZpY2llbnRzCi0gICAgY29uc3QgaW50IG5jID0gMzI7Ci0KKyAgICBpbnQgbmMgPSAzMjsKICAgICBib29sIHBvbHlwaGFzZSA9IGZhbHNlOwogICAgIHVuc2lnbmVkIGludCBwb2x5TSA9IDE2MDsKICAgICB1bnNpZ25lZCBpbnQgcG9seU4gPSAxNDc7CkBAIC04OCw3ICs5OSw2IEBACiAgICAgZG91YmxlIGF0dGVuID0gMTsKICAgICBpbnQgZm9ybWF0ID0gMDsKIAotCiAgICAgLy8gaW4gb3JkZXIgdG8ga2VlcCB0aGUgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZWFyCiAgICAgLy8gaW50ZXJwb2xhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIGJlbG93IHRoZSBxdWFudGl6YXRpb24gZXJyb3IKICAgICAvLyB3ZSBtdXN0IHNhdGlzZnk6CkBAIC0xMDQsNyArMTE0LDYgQEAKICAgICAvLyBTbWl0aCwgSi5PLiBEaWdpdGFsIEF1ZGlvIFJlc2FtcGxpbmcgSG9tZSBQYWdlCiAgICAgLy8gaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9yZXNhbXBsZS8sIDIwMTEtMDMtMjkKICAgICAvLwotICAgIGludCBueiA9IDQ7CiAKICAgICAvLyAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKICAgICAvLyAgYmV0YSA9IHwgMC41ODQyKihBIC0gMjEpXjAuNCArIDAuMDc4ODYqKEEgLSAyMSkgICAyMSA8PSBBIDw9IDUwCkBAIC0xMjMsMzMgKzEzMiwzMyBAQAogICAgIC8vICAgMTAwIGRCICAgMTAuMDU2CiAgICAgZG91YmxlIGJldGEgPSA3Ljg2NTsKIAotCiAgICAgLy8gMipuemMgPSAoQSAtIDgpIC8gKDIuMjg1ICogZHcpCiAgICAgLy8gICAgICB3aXRoIGR3IHRoZSB0cmFuc2l0aW9uIHdpZHRoID0gMipwaSpkRi9GcwogICAgIC8vCiAgICAgaW50IG56YyA9IDg7CiAKLSAgICAvLwotICAgIC8vIEV4YW1wbGU6Ci0gICAgLy8gNDQuMSBLSHogdG8gNDggS0h6IHJlc2FtcGxpbmcKLSAgICAvLyAxMDAgZEIgcmVqZWN0aW9uIGFib3ZlIDI4IEtIegotICAgIC8vICAgKHRoZSBzcGVjdHJ1bSB3aWxsIGZvbGQgYXJvdW5kIDI0IEtIeiBhbmQgd2Ugd2FudCAxMDAgZEIgcmVqZWN0aW9uCi0gICAgLy8gICAgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBmb2xkaW5nIHJlYWNoZXMgMjAgS0h6KQotICAgIC8vICAuLi5fX198X19fX18KLSAgICAvLyAgICAgICAgfCAgICAgXHwKLSAgICAvLyAgICAgICAgfCBfX19fL3xcX19fXwotICAgIC8vICAgICAgICB8L2FsaWFzfCAgICAgXAotICAgIC8vICAtLS0tLS0vLS0tLS0tKy0tLS0tLVwtLS0tLS0tLS0+IEtIegotICAgIC8vICAgICAgIDIwICAgICAyNCAgICAgMjgKKyAgICAvKgorICAgICAqIEV4YW1wbGU6CisgICAgICogNDQuMSBLSHogdG8gNDggS0h6IHJlc2FtcGxpbmcKKyAgICAgKiAxMDAgZEIgcmVqZWN0aW9uIGFib3ZlIDI4IEtIegorICAgICAqICAgKHRoZSBzcGVjdHJ1bSB3aWxsIGZvbGQgYXJvdW5kIDI0IEtIeiBhbmQgd2Ugd2FudCAxMDAgZEIgcmVqZWN0aW9uCisgICAgICogICAgYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBmb2xkaW5nIHJlYWNoZXMgMjAgS0h6KQorICAgICAqICAuLi5fX198X19fX18KKyAgICAgKiAgICAgICAgfCAgICAgXHwKKyAgICAgKiAgICAgICAgfCBfX19fL3xcX19fXworICAgICAqICAgICAgICB8L2FsaWFzfCAgICAgXAorICAgICAqICAtLS0tLS0vLS0tLS0tKy0tLS0tLVwtLS0tLS0tLS0+IEtIegorICAgICAqICAgICAgIDIwICAgICAyNCAgICAgMjgKKyAgICAgKgorICAgICAqIFRyYW5zaXRpb24gYmFuZCA4IEtIeiwgb3IgZHcgPSAxLjA0NzIKKyAgICAgKgorICAgICAqIGJldGEgPSAxMC4wNTYKKyAgICAgKiBuemMgID0gMjAKKyAgICAgKi8KIAotICAgIC8vIFRyYW5zaXRpb24gYmFuZCA4IEtIeiwgb3IgZHcgPSAxLjA0NzIKLSAgICAvLwotICAgIC8vIGJldGEgPSAxMC4wNTYKLSAgICAvLyBuemMgID0gMjAKLSAgICAvLwotCisgICAgaW50IE0gPSAxIDw8IDQ7IC8vIG51bWJlciBvZiBwaGFzZXMgZm9yIGludGVycG9sYXRpb24KICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOmI6cDp2OiIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgIjpoZHM6YzpuOmY6bDptOmI6cDp2Ono6IikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKQEAgLTE2OSwxMyArMTc4LDI2IEBACiAgICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgICBuemMgPSBhdG9pKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICBNID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgbnogPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgTSA9IDEgPDwgYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCJmaXhlZCIpKSBmb3JtYXQgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCJmbG9hdCIpKSBmb3JtYXQgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAiZml4ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImZpeGVkMTYiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwOworICAgICAgICAgICAgICAgICAgICBuYyA9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKG9wdGFyZywgImZsb2F0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICAgICAgIGJldGEgPSBhdG9mKG9wdGFyZyk7CkBAIC0xOTMsMTEgKzIxNSwxNCBAQAogICAgIC8vIGN1dCBvZmYgZnJlcXVlbmN5IHJhdGlvIEZjL0ZzCiAgICAgZG91YmxlIEZjciA9IEZjIC8gRnM7CiAKLQogICAgIC8vIHRvdGFsIG51bWJlciBvZiBjb2VmZmljaWVudHMgKG9uZSBzaWRlKQotICAgIGNvbnN0IGludCBNID0gKDEgPDwgbnopOworCiAgICAgY29uc3QgaW50IE4gPSBNICogbnpjOwogCisgICAgLy8gbGVycCAod2hpY2ggaXMgbW9zdCB1c2VmdWwgaWYgTSBpcyBhIHBvd2VyIG9mIDIpCisKKyAgICBpbnQgbnogPSAwOyAvLyByZWNhbGN1bGF0ZSBueiBhcyB0aGUgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IE0KKyAgICBmb3IgKGludCBpID0gTS0xIDsgaTsgaT4+PTEsIG56KyspOwogICAgIC8vIGdlbmVyYXRlIHRoZSByaWdodCBoYWxmIG9mIHRoZSBmaWx0ZXIKICAgICBpZiAoIWRlYnVnKSB7CiAgICAgICAgIHByaW50ZigiLy8gY21kLWxpbmU6ICIpOwpAQCAtMjA3LDcgKzIzMiw3IEBACiAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgaWYgKCFwb2x5cGhhc2UpIHsKICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfU0laRSAgICAgICAgICAgPSAlZDtcbiIsIE4pOwotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9MRVJQX0lOVF9CSVRTICA9ICVkO1xuIiwgbnopOworICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9JTlRfUEhBU0VTICAgICA9ICVkO1xuIiwgTSk7CiAgICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCBuemMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgMipuemMqcG9seU4pOwpAQCAtMjI0LDcgKzI0OSw3IEBACiAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8PU0gOyBpKyspIHsgLy8gYW4gZXh0cmEgc2V0IG9mIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICBmb3IgKGludCBqPTAgOyBqPG56YyA7IGorKykgewogICAgICAgICAgICAgICAgIGludCBpeCA9IGoqTSArIGk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHggPSAoMi4wICogTV9QSSAqIGl4ICogRmNyKSAvICgxIDw8IG56KTsKKyAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICgyLjAgKiBNX1BJICogaXggKiBGY3IpIC8gTTsKICAgICAgICAgICAgICAgICBkb3VibGUgeSA9IGthaXNlcihpeCtOLCAyKk4sIGJldGEpICogc2luYyh4KSAqIDIuMCAqIEZjcjsKICAgICAgICAgICAgICAgICB5ICo9IGF0dGVuOwogCkBAIC0yMzIsMTggKzI1NywyMCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHlpID0gZmxvb3IoeSAqICgoMVVMTDw8KG5jLTEpKSkgKyAwLjUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeWkgPj0gKDFMTDw8KG5jLTEpKSkgeWkgPSAoMUxMPDwobmMtMSkpLTE7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCAiLCBpbnQzMl90KHlpKSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLjlnJXMgIiwgeSwgZGVidWcgPyAiLCIgOiAiZiwiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBqPTAgOyBqPHBvbHlOIDsgaisrKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGo9MCA7IGo8cG9seU4gOyBqKyspIHsKICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcGhhc2UKICAgICAgICAgICAgIGRvdWJsZSBwID0gKChwb2x5TSpqKSAlIHBvbHlOKSAvIGRvdWJsZShwb2x5Tik7CiAgICAgICAgICAgICBpZiAoIWRlYnVnKSBwcmludGYoIlxuICAgICIpOwpAQCAtMjU0LDkgKzI4MSwxMiBAQAogICAgICAgICAgICAgICAgIGRvdWJsZSB5ID0ga2Fpc2VyKGkrTiwgMipOLCBiZXRhKSAqIHNpbmMoeCkgKiAyLjAgKiBGY3I7OwogICAgICAgICAgICAgICAgIHkgKj0gYXR0ZW47CiAgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IGZsb29yKHkgKiAoKDFVTEw8PChuYy0xKSkpICsgMC41KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHlpID49ICgxTEw8PChuYy0xKSkpIHlpID0gKDFMTDw8KG5jLTEpKS0xOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB5aSA9IHRvaW50KHksIDFVTEw8PChuYy0xKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYyA+IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCwgIiwgaW50MzJfdCh5aSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsICIsIGludDMyX3QoeWkpJjB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUuOWclcyIsIHksIGRlYnVnID8gIiIgOiAiZiIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI3Nyw1ICszMDcsMyBAQAogfQogCiAvLyBodHRwOi8vd3d3LmNzZWUudW1iYy5lZHUvaGVscC9zb3VuZC9BRnNwLVYyUjEvaHRtbC9hdWRpby9SZXNhbXBBdWRpby5odG1sCi0KLQo=